From owner-p4-projects@FreeBSD.ORG Wed Feb 11 10:47:15 2009 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 7F5861065729; Wed, 11 Feb 2009 10:47:15 +0000 (UTC) Delivered-To: perforce@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1CADE1065728 for ; Wed, 11 Feb 2009 10:47:15 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 080B48FC17 for ; Wed, 11 Feb 2009 10:47:15 +0000 (UTC) (envelope-from hselasky@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id n1BAlEpI003351 for ; Wed, 11 Feb 2009 10:47:14 GMT (envelope-from hselasky@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.3/8.14.3/Submit) id n1BAlERw003349 for perforce@freebsd.org; Wed, 11 Feb 2009 10:47:14 GMT (envelope-from hselasky@FreeBSD.org) Date: Wed, 11 Feb 2009 10:47:14 GMT Message-Id: <200902111047.n1BAlERw003349@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to hselasky@FreeBSD.org using -f From: Hans Petter Selasky To: Perforce Change Reviews Cc: Subject: PERFORCE change 157533 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 11 Feb 2009 10:47:17 -0000 http://perforce.freebsd.org/chv.cgi?CH=157533 Change 157533 by hselasky@hselasky_laptop001 on 2009/02/11 10:46:55 USB WLAN patches: - adjust timeouts back to the "HPS" values and add detach detection to the pause mechanism. - fix an extra unlock in RUM driver. Affected files ... .. //depot/projects/usb/src/sys/dev/usb2/wlan/if_rum2.c#34 edit .. //depot/projects/usb/src/sys/dev/usb2/wlan/if_ural2.c#33 edit .. //depot/projects/usb/src/sys/dev/usb2/wlan/if_zyd2.c#35 edit Differences ... ==== //depot/projects/usb/src/sys/dev/usb2/wlan/if_rum2.c#34 (text+ko) ==== @@ -177,7 +177,7 @@ static void rum_read_eeprom(struct rum_softc *); static int rum_bbp_init(struct rum_softc *); static void rum_init(void *); -static int rum_load_microcode(struct rum_softc *, const u_char *, +static int rum_load_microcode(struct rum_softc *, const uint8_t *, size_t); static int rum_prepare_beacon(struct rum_softc *, struct ieee80211vap *); @@ -193,6 +193,7 @@ static void rum_amrr_start(struct rum_softc *, struct ieee80211_node *); static void rum_amrr_timeout(void *); +static uint8_t rum_pause(struct rum_softc *, unsigned int); static void rum_queue_command(struct rum_softc *, usb2_proc_callback_t *, struct usb2_proc_msg *, struct usb2_proc_msg *); @@ -447,12 +448,13 @@ uint8_t bands; /* retrieve RT2573 rev. no */ - for (ntries = 0; ntries != 1000; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { if ((tmp = rum_read(sc, RT2573_MAC_CSR0)) != 0) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (rum_pause(sc, hz / 100)) + break; } - if (ntries == 1000) { + if (ntries == 100) { device_printf(sc->sc_dev, "timeout waiting for chip to settle\n"); return; } @@ -465,7 +467,6 @@ error = rum_load_microcode(sc, rt2573_ucode, sizeof(rt2573_ucode)); if (error != 0) { - RUM_UNLOCK(sc); device_printf(sc->sc_dev, "could not load 8051 microcode\n"); return; } @@ -1481,12 +1482,13 @@ uint32_t tmp; int ntries; - for (ntries = 0; ntries != 5; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { if (!(rum_read(sc, RT2573_PHY_CSR3) & RT2573_BBP_BUSY)) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (rum_pause(sc, hz / 100)) + break; } - if (ntries == 5) { + if (ntries == 100) { device_printf(sc->sc_dev, "could not write to BBP\n"); return; } @@ -1501,12 +1503,13 @@ uint32_t val; int ntries; - for (ntries = 0; ntries != 5; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { if (!(rum_read(sc, RT2573_PHY_CSR3) & RT2573_BBP_BUSY)) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (rum_pause(sc, hz / 100)) + break; } - if (ntries == 5) { + if (ntries == 100) { device_printf(sc->sc_dev, "could not read BBP\n"); return 0; } @@ -1514,11 +1517,12 @@ val = RT2573_BBP_BUSY | RT2573_BBP_READ | reg << 8; rum_write(sc, RT2573_PHY_CSR3, val); - for (ntries = 0; ntries != 10; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { val = rum_read(sc, RT2573_PHY_CSR3); if (!(val & RT2573_BBP_BUSY)) return val & 0xff; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (rum_pause(sc, hz / 100)) + break; } device_printf(sc->sc_dev, "could not read BBP\n"); @@ -1531,12 +1535,13 @@ uint32_t tmp; int ntries; - for (ntries = 0; ntries != 5; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { if (!(rum_read(sc, RT2573_PHY_CSR4) & RT2573_RF_BUSY)) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (rum_pause(sc, hz / 100)) + break; } - if (ntries == 5) { + if (ntries == 100) { device_printf(sc->sc_dev, "could not write to RF\n"); return; } @@ -1683,7 +1688,8 @@ const struct rfprog *rfprog; uint8_t bbp3, bbp94 = RT2573_BBPR94_DEFAULT; int8_t power; - u_int i, chan; + unsigned int i; + unsigned int chan; chan = ieee80211_chan2ieee(ic, c); if (chan == 0 || chan == IEEE80211_CHAN_ANY) @@ -1730,7 +1736,7 @@ rum_rf_write(sc, RT2573_RF3, rfprog[i].r3 | power << 7); rum_rf_write(sc, RT2573_RF4, rfprog[i].r4 | sc->rffreq << 10); - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + (void)rum_pause(sc, hz / 100); /* enable smart mode for MIMO-capable RFs */ bbp3 = rum_bbp_read(sc, 3); @@ -1743,6 +1749,9 @@ if (bbp94 != RT2573_BBPR94_DEFAULT) rum_bbp_write(sc, 94, bbp94); + + /* give the chip some extra time to do the switchover */ + (void)rum_pause(sc, hz / 100); } /* @@ -1946,7 +1955,8 @@ const uint8_t val = rum_bbp_read(sc, 0); if (val != 0 && val != 0xff) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (rum_pause(sc, hz / 100)) + break; } if (ntries == 100) { device_printf(sc->sc_dev, "timeout waiting for BBP\n"); @@ -1993,13 +2003,14 @@ rum_write(sc, RT2573_MAC_CSR1, 0); /* wait for BBP/RF to wakeup */ - for (ntries = 0; ntries != 1000; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { if (rum_read(sc, RT2573_MAC_CSR12) & 8) break; rum_write(sc, RT2573_MAC_CSR12, 4); /* force wakeup */ - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (rum_pause(sc, hz / 100)) + break; } - if (ntries == 1000) { + if (ntries == 100) { device_printf(sc->sc_dev, "timeout waiting for BBP/RF to wakeup\n"); goto fail; @@ -2101,12 +2112,17 @@ } static int -rum_load_microcode(struct rum_softc *sc, const u_char *ucode, size_t size) +rum_load_microcode(struct rum_softc *sc, const uint8_t *ucode, size_t size) { struct usb2_device_request req; uint16_t reg = RT2573_MCU_CODE_BASE; usb2_error_t error; + /* + * TODO: If the firmware is already loaded, + * then we need to return from here! + */ + /* copy firmware image into NIC */ for (; size >= 4; reg += 4, ucode += 4, size -= 4) rum_write(sc, reg, UGETDW(ucode)); @@ -2405,6 +2421,16 @@ return rssi; } +static uint8_t +rum_pause(struct rum_softc *sc, unsigned int timeout) +{ + if (usb2_proc_is_gone(&sc->sc_tq)) + return (1); + + usb2_pause_mtx(&sc->sc_mtx, timeout); + return (0); +} + static void rum_queue_command(struct rum_softc *sc, usb2_proc_callback_t *fn, struct usb2_proc_msg *t0, struct usb2_proc_msg *t1) @@ -2413,10 +2439,6 @@ RUM_LOCK_ASSERT(sc, MA_OWNED); - if (usb2_proc_is_gone(&sc->sc_tq)) { - DPRINTF("proc is gone\n"); - return; /* nothing to do */ - } /* * NOTE: The task cannot get executed before we drop the * "sc_mtx" mutex. It is safe to update fields in the message ==== //depot/projects/usb/src/sys/dev/usb2/wlan/if_ural2.c#33 (text+ko) ==== @@ -166,6 +166,7 @@ static void ural_amrr_start(struct ural_softc *, struct ieee80211_node *); static void ural_amrr_timeout(void *); +static uint8_t ural_pause(struct ural_softc *sc, unsigned int timeout); static void ural_queue_command(struct ural_softc *, usb2_proc_callback_t *, struct usb2_proc_msg *, struct usb2_proc_msg *); @@ -1595,12 +1596,13 @@ uint16_t tmp; int ntries; - for (ntries = 0; ntries != 5; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { if (!(ural_read(sc, RAL_PHY_CSR8) & RAL_BBP_BUSY)) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (ural_pause(sc, hz / 100)) + break; } - if (ntries == 5) { + if (ntries == 100) { device_printf(sc->sc_dev, "could not write to BBP\n"); return; } @@ -1618,12 +1620,13 @@ val = RAL_BBP_WRITE | reg << 8; ural_write(sc, RAL_PHY_CSR7, val); - for (ntries = 0; ntries != 5; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { if (!(ural_read(sc, RAL_PHY_CSR8) & RAL_BBP_BUSY)) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (ural_pause(sc, hz / 100)) + break; } - if (ntries == 5) { + if (ntries == 100) { device_printf(sc->sc_dev, "could not read BBP\n"); return 0; } @@ -1637,12 +1640,13 @@ uint32_t tmp; int ntries; - for (ntries = 0; ntries != 5; ntries++) { + for (ntries = 0; ntries != 100; ntries++) { if (!(ural_read(sc, RAL_PHY_CSR10) & RAL_RF_LOBUSY)) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (ural_pause(sc, hz / 100)) + break; } - if (ntries == 5) { + if (ntries == 100) { device_printf(sc->sc_dev, "could not write to RF\n"); return; } @@ -1816,7 +1820,7 @@ /* clear CRC errors */ ural_read(sc, RAL_STA_CSR0); - usb2_pause_mtx(&sc->sc_mtx, hz / 100); + (void)ural_pause(sc, hz / 100); ural_disable_rf_tune(sc); } @@ -1824,6 +1828,9 @@ /* XXX doesn't belong here */ /* update basic rate set */ ural_set_basicrates(sc, c); + + /* give the hardware some time to do the switchover */ + (void)ural_pause(sc, hz / 100); } /* @@ -2042,7 +2049,8 @@ for (ntries = 0; ntries != 100; ntries++) { if (ural_bbp_read(sc, RAL_BBP_VERSION) != 0) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (ural_pause(sc, hz / 100)) + break; } if (ntries == 100) { device_printf(sc->sc_dev, "timeout waiting for BBP\n"); @@ -2143,7 +2151,8 @@ if ((tmp & (RAL_BBP_AWAKE | RAL_RF_AWAKE)) == (RAL_BBP_AWAKE | RAL_RF_AWAKE)) break; - usb2_pause_mtx(&sc->sc_mtx, hz / 1000); + if (ural_pause(sc, hz / 100)) + break; } if (ntries == 100) { device_printf(sc->sc_dev, @@ -2238,7 +2247,11 @@ ural_write(sc, RAL_TXRX_CSR2, RAL_DISABLE_RX); /* reset ASIC and BBP (but won't reset MAC registers!) */ ural_write(sc, RAL_MAC_CSR1, RAL_RESET_ASIC | RAL_RESET_BBP); + /* wait a little */ + (void)ural_pause(sc, hz / 10); ural_write(sc, RAL_MAC_CSR1, 0); + /* wait a little */ + (void)ural_pause(sc, hz / 10); } static int @@ -2353,6 +2366,16 @@ ifp->if_oerrors += fail; /* count TX retry-fail as Tx errors */ } +static uint8_t +ural_pause(struct ural_softc *sc, unsigned int timeout) +{ + if (usb2_proc_is_gone(&sc->sc_tq)) + return (1); + + usb2_pause_mtx(&sc->sc_mtx, timeout); + return (0); +} + static void ural_queue_command(struct ural_softc *sc, usb2_proc_callback_t *fn, struct usb2_proc_msg *t0, struct usb2_proc_msg *t1) @@ -2361,10 +2384,6 @@ RAL_LOCK_ASSERT(sc, MA_OWNED); - if (usb2_proc_is_gone(&sc->sc_tq)) { - DPRINTF("proc is gone\n"); - return; /* nothing to do */ - } /* * NOTE: The task cannot get executed before we drop the * "sc_mtx" mutex. It is safe to update fields in the message ==== //depot/projects/usb/src/sys/dev/usb2/wlan/if_zyd2.c#35 (text+ko) ==== @@ -3091,10 +3091,6 @@ ZYD_LOCK_ASSERT(sc, MA_OWNED); - if (usb2_proc_is_gone(&sc->sc_tq)) { - DPRINTF(sc, ZYD_DEBUG_STATE, "proc is gone\n"); - return; /* nothing to do */ - } /* * NOTE: The task cannot get executed before we drop the * "sc_mtx" mutex. It is safe to update fields in the message