PERFORCE change 113226 for review

Kip Macy kmacy at FreeBSD.org
Sat Jan 20 22:02:40 UTC 2007


http://perforce.freebsd.org/chv.cgi?CH=113226

Change 113226 by kmacy at kmacy_serendipity:sam_wifi on 2007/01/20 22:02:25

	fix panic in rt2661 caused by fallthrough from INIT to run in newstate
	add sc_invalid flag for better handling of card removal - add checks for it in rt2661

Affected files ...

.. //depot/projects/wifi/sys/dev/ral/if_ral_pci.c#5 edit
.. //depot/projects/wifi/sys/dev/ral/rt2560var.h#6 edit
.. //depot/projects/wifi/sys/dev/ral/rt2661.c#5 edit
.. //depot/projects/wifi/sys/dev/ral/rt2661var.h#5 edit

Differences ...

==== //depot/projects/wifi/sys/dev/ral/if_ral_pci.c#5 (text+ko) ====

@@ -192,7 +192,8 @@
 
 	sc->sc_st = rman_get_bustag(psc->mem);
 	sc->sc_sh = rman_get_bushandle(psc->mem);
-
+	sc->sc_invalid = 1;
+	
 	psc->irq_rid = 0;
 	psc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &psc->irq_rid,
 	    RF_ACTIVE | RF_SHAREABLE);
@@ -214,7 +215,8 @@
 		device_printf(dev, "could not set up interrupt\n");
 		return error;
 	}
-
+	sc->sc_invalid = 0;
+	
 	return 0;
 }
 
@@ -222,7 +224,11 @@
 ral_pci_detach(device_t dev)
 {
 	struct ral_pci_softc *psc = device_get_softc(dev);
-
+	struct rt2560_softc *sc = &psc->u.sc_rt2560;
+	
+	/* check if device was removed */
+	sc->sc_invalid = !bus_child_present(dev);
+	
 	(*psc->sc_opns->detach)(psc);
 
 	bus_generic_detach(dev);

==== //depot/projects/wifi/sys/dev/ral/rt2560var.h#6 (text) ====

@@ -112,7 +112,11 @@
 	struct callout		rssadapt_ch;
 
 	int			sc_tx_timer;
-
+	int                     sc_invalid;
+/*
+ * The same in both up to here
+ * ------------------------------------------------
+ */
 	uint32_t		asic_rev;
 	uint32_t		eeprom_rev;
 	uint8_t			rf_rev;

==== //depot/projects/wifi/sys/dev/ral/rt2661.c#5 (text) ====

@@ -353,6 +353,7 @@
 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
 	sc->sc_txtap.wt_ihdr.it_present = htole32(RT2661_TX_RADIOTAP_PRESENT);
 
+	
 	/*
 	 * Add a few sysctl knobs.
 	 */
@@ -373,7 +374,6 @@
 fail2:	while (--ac >= 0)
 		rt2661_free_tx_ring(sc, &sc->txq[ac]);
 fail1:	mtx_destroy(&sc->sc_mtx);
-
 	return error;
 }
 
@@ -383,7 +383,7 @@
 	struct rt2661_softc *sc = xsc;
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct ifnet *ifp = ic->ic_ifp;
-
+	
 	rt2661_stop(sc);
 	callout_stop(&sc->watchdog_ch);
 	callout_stop(&sc->rssadapt_ch);
@@ -803,6 +803,7 @@
 			tmp = RAL_READ(sc, RT2661_TXRX_CSR9);
 			RAL_WRITE(sc, RT2661_TXRX_CSR9, tmp & ~0x00ffffff);
 		}
+		break;
 	case IEEE80211_S_RUN:
 		ni = ic->ic_bss;
 
@@ -1726,7 +1727,7 @@
 	RAL_LOCK(sc);
 
 	/* prevent management frames from being sent if we're not ready */
-	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
+	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING) || sc->sc_invalid) {
 		RAL_UNLOCK(sc);
 		return;
 	}
@@ -1819,7 +1820,7 @@
 {
 	struct rt2661_softc *sc = (struct rt2661_softc *)arg;
 
-	if (sc->sc_tx_timer > 0) {
+	if (sc->sc_tx_timer > 0 && !sc->sc_invalid) {
 		if (--sc->sc_tx_timer == 0) {
 			device_printf(sc->sc_dev, "device timeout\n");
 			rt2661_init(sc);

==== //depot/projects/wifi/sys/dev/ral/rt2661var.h#5 (text) ====

@@ -105,7 +105,12 @@
 	struct callout			rssadapt_ch;
 
 	int				sc_tx_timer;
-
+	int                             sc_invalid;
+/*
+ * The same in both up to here
+ * ------------------------------------------------
+ */
+	
 	struct ieee80211_channel	*sc_curchan;
 
 	uint8_t				rf_rev;


More information about the p4-projects mailing list