PERFORCE change 112526 for review
Kip Macy
kmacy at FreeBSD.org
Thu Jan 4 20:49:08 PST 2007
http://perforce.freebsd.org/chv.cgi?CH=112526
Change 112526 by kmacy at kmacy_serendipity:sam_wifi on 2007/01/05 04:48:57
- move locking soft lock acquisition into rt2560_stop
- fixing hangs when the card was removed
- only call newstate to transition to INIT if the
driver is currently running
- fixing a panic in ieee80211_cancel_scan with mtx_lock
of destroyed mutex
Affected files ...
.. //depot/projects/wifi/sys/dev/ral/rt2560.c#10 edit
Differences ...
==== //depot/projects/wifi/sys/dev/ral/rt2560.c#10 (text) ====
@@ -350,9 +350,7 @@
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = ic->ic_ifp;
- RAL_LOCK(sc);
rt2560_stop(sc);
- RAL_UNLOCK(sc);
callout_stop(&sc->watchdog_ch);
callout_stop(&sc->rssadapt_ch);
@@ -2080,17 +2078,18 @@
switch (cmd) {
case SIOCSIFFLAGS:
- RAL_LOCK(sc);
if (ifp->if_flags & IFF_UP) {
+ RAL_LOCK(sc);
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
rt2560_update_promisc(sc);
else
rt2560_init(sc);
+ RAL_UNLOCK(sc);
} else {
if (ifp->if_drv_flags & IFF_DRV_RUNNING)
rt2560_stop(sc);
}
- RAL_UNLOCK(sc);
+
break;
default:
@@ -2652,10 +2651,11 @@
uint32_t tmp;
int i;
- RAL_LOCK(sc);
+
rt2560_stop(sc);
+ RAL_LOCK(sc);
/* setup tx rings */
tmp = RT2560_PRIO_RING_COUNT << 24 |
RT2560_ATIM_RING_COUNT << 16 |
@@ -2738,41 +2738,44 @@
}
void
-rt2560_stop(void *priv)
+rt2560_stop(void *arg)
{
- struct rt2560_softc *sc = priv;
+ struct rt2560_softc *sc = arg;
struct ieee80211com *ic = &sc->sc_ic;
struct ifnet *ifp = ic->ic_ifp;
volatile int *flags = &sc->sc_flags;
while (*flags & RAL_INPUT_RUNNING) {
- msleep(sc, &sc->sc_mtx, 0, "ralrunning", hz/10);
+ tsleep(sc, 0, "ralrunning", hz/10);
}
-
- sc->sc_tx_timer = 0;
- ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
- ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
+ RAL_LOCK(sc);
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+ ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
+ sc->sc_tx_timer = 0;
+ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
- /* abort Tx */
- RAL_WRITE(sc, RT2560_TXCSR0, RT2560_ABORT_TX);
+ /* abort Tx */
+ RAL_WRITE(sc, RT2560_TXCSR0, RT2560_ABORT_TX);
+
+ /* disable Rx */
+ RAL_WRITE(sc, RT2560_RXCSR0, RT2560_DISABLE_RX);
- /* disable Rx */
- RAL_WRITE(sc, RT2560_RXCSR0, RT2560_DISABLE_RX);
+ /* reset ASIC (imply reset BBP) */
+ RAL_WRITE(sc, RT2560_CSR1, RT2560_RESET_ASIC);
+ RAL_WRITE(sc, RT2560_CSR1, 0);
- /* reset ASIC (imply reset BBP) */
- RAL_WRITE(sc, RT2560_CSR1, RT2560_RESET_ASIC);
- RAL_WRITE(sc, RT2560_CSR1, 0);
-
- /* disable interrupts */
- RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
-
- /* reset Tx and Rx rings */
- rt2560_reset_tx_ring(sc, &sc->txq);
- rt2560_reset_tx_ring(sc, &sc->atimq);
- rt2560_reset_tx_ring(sc, &sc->prioq);
- rt2560_reset_tx_ring(sc, &sc->bcnq);
- rt2560_reset_rx_ring(sc, &sc->rxq);
+ /* disable interrupts */
+ RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
+
+ /* reset Tx and Rx rings */
+ rt2560_reset_tx_ring(sc, &sc->txq);
+ rt2560_reset_tx_ring(sc, &sc->atimq);
+ rt2560_reset_tx_ring(sc, &sc->prioq);
+ rt2560_reset_tx_ring(sc, &sc->bcnq);
+ rt2560_reset_rx_ring(sc, &sc->rxq);
+ }
+ RAL_UNLOCK(sc);
}
static int
@@ -2828,3 +2831,4 @@
RAL_UNLOCK(sc);
return EIO; /* XXX */
}
+
More information about the p4-projects
mailing list