PERFORCE change 121244 for review

Andrew Thompson thompsa at FreeBSD.org
Sat Jun 9 02:57:24 UTC 2007


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

Change 121244 by thompsa at thompsa_heff on 2007/06/09 02:56:50

	Use a proper mtx_assert instead of a debug printf and improve the locking.

Affected files ...

.. //depot/projects/wifi/sys/dev/iwi/if_iwi.c#42 edit
.. //depot/projects/wifi/sys/dev/iwi/if_iwivar.h#17 edit

Differences ...

==== //depot/projects/wifi/sys/dev/iwi/if_iwi.c#42 (text+ko) ====

@@ -452,9 +452,12 @@
 	struct iwi_softc *sc = device_get_softc(dev);
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct ifnet *ifp = ic->ic_ifp;
+	IWI_LOCK_DECL;
 
 	if (ifp != NULL) {
+		IWI_LOCK(sc);
 		iwi_stop(sc);
+		IWI_UNLOCK(sc);
 		bpfdetach(ifp);
 		ieee80211_ifdetach(ic);
 	}
@@ -794,8 +797,11 @@
 iwi_shutdown(device_t dev)
 {
 	struct iwi_softc *sc = device_get_softc(dev);
+	IWI_LOCK_DECL;
 
+	IWI_LOCK(sc);
 	iwi_stop(sc);
+	IWI_UNLOCK(sc);
 	iwi_put_firmware(sc);		/* ??? XXX */
 
 	return 0;
@@ -805,8 +811,11 @@
 iwi_suspend(device_t dev)
 {
 	struct iwi_softc *sc = device_get_softc(dev);
+	IWI_LOCK_DECL;
 
+	IWI_LOCK(sc);
 	iwi_stop(sc);
+	IWI_UNLOCK(sc);
 
 	return 0;
 }
@@ -938,7 +947,7 @@
 	struct iwi_softc *sc = ifp->if_softc;
 	int error = 0;
 
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 	DPRINTF(("%s: %s -> %s flags 0x%x\n", __func__,
 		ieee80211_state_name[ic->ic_state],
 		ieee80211_state_name[nstate], sc->flags));
@@ -1661,7 +1670,7 @@
 {
 	struct iwi_cmd_desc *desc;
 
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 
 	if (sc->flags & IWI_FLAG_BUSY) {
 		device_printf(sc->sc_dev, "%s: cmd %d not sent, busy\n",
@@ -1725,7 +1734,7 @@
 	int error, nsegs, hdrlen, i;
 	int ismcast, flags, xflags, staid;
 
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 	wh = mtod(m0, const struct ieee80211_frame *);
 	/* NB: only data frames use this path */
 	hdrlen = ieee80211_hdrsize(wh);
@@ -1967,7 +1976,7 @@
 	struct iwi_softc *sc = arg;
 	struct ifnet *ifp = sc->sc_ifp;
 
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 
 	if (sc->sc_tx_timer > 0) {
 		if (--sc->sc_tx_timer == 0) {
@@ -2062,8 +2071,6 @@
 	uint32_t tmp;
 	int ntries;
 
-	IWI_LOCK_CHECK(sc);
-
 	/* disable interrupts */
 	CSR_WRITE_4(sc, IWI_CSR_INTR_MASK, 0);
 
@@ -2330,7 +2337,7 @@
 	size_t size = fw->size;
 	int i, ntries, error;
 
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 	error = 0;
 	CSR_WRITE_4(sc, IWI_CSR_RST, CSR_READ_4(sc, IWI_CSR_RST) |
 	    IWI_RST_STOP_MASTER);
@@ -2403,7 +2410,7 @@
 	uint32_t sentinel, ctl, src, dst, sum, len, mlen, tmp;
 	int ntries, error;
 
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 	/* copy firmware image to DMA memory */
 	memcpy(sc->fw_virtaddr, fw->data, fw->size);
 
@@ -2545,7 +2552,7 @@
 	struct iwi_txpower power;
 	uint32_t data;
 	int error, i;
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 
 	IEEE80211_ADDR_COPY(ic->ic_myaddr, IF_LLADDR(ifp));
 	DPRINTF(("Setting MAC address to %6D\n", ic->ic_myaddr, ":"));
@@ -2694,7 +2701,7 @@
 	struct iwi_scan_ext scan;
 	int error = 0;
 
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 	if (sc->flags & IWI_FLAG_SCANNING) {
 		/*
 		 * This should not happen as we only trigger scan_next after
@@ -2828,10 +2835,9 @@
 	int error;
 	IWI_LOCK_DECL;
  
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 	
 	error = 0;
-	IWI_LOCK(sc);
 	if (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan)) {
 		memset(&config, 0, sizeof config);
 		config.bluetooth_coexistence = sc->bluetooth;
@@ -3079,7 +3085,7 @@
 	int i;
 	IWI_LOCK_DECL;
 
-	IWI_LOCK_CHECK(sc);
+	IWI_LOCK_ASSERT(sc);
 	if (sc->flags & IWI_FLAG_FW_LOADING) {
 		device_printf(sc->sc_dev, "%s: already loading\n", __func__);
 		return;		/* XXX: condvar? */
@@ -3198,7 +3204,7 @@
 	struct ieee80211com *ic = &sc->sc_ic;
 	struct ifnet *ifp = ic->ic_ifp;
 
-	IWI_LOCK_CHECK(sc);	/* XXX: pretty sure this triggers */
+	IWI_LOCK_ASSERT(sc);
 	if (sc->sc_softled) {
 		callout_stop(&sc->sc_ledtimer);
 		sc->sc_blinking = 0;
@@ -3261,10 +3267,13 @@
 iwi_radio_off(void *arg, int pending)
 {
 	struct iwi_softc *sc = arg;
+	IWI_LOCK_DECL;
 
 	device_printf(sc->sc_dev, "radio turned off\n");
+	IWI_LOCK(sc);
 	iwi_stop(sc);
 	sc->sc_rfkill_timer = 2;
+	IWI_UNLOCK(sc);
 }
 
 static int

==== //depot/projects/wifi/sys/dev/iwi/if_iwivar.h#17 (text+ko) ====

@@ -246,10 +246,7 @@
 	    MTX_NETWORK_LOCK, MTX_DEF)
 #define	IWI_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->sc_mtx)
 #define	IWI_LOCK_DECL	int	__waslocked = 0
-#define IWI_LOCK_CHECK(sc)	do {				\
-	if (!mtx_owned(&(sc)->sc_mtx))	\
-		DPRINTF(("%s iwi_lock not held\n", __func__));		\
-} while (0)
+#define IWI_LOCK_ASSERT(sc)	mtx_assert(&(sc)->sc_mtx, MA_OWNED)
 #define IWI_LOCK(sc)	do {				\
 	if (!(__waslocked = mtx_owned(&(sc)->sc_mtx)))	\
 		mtx_lock(&(sc)->sc_mtx);		\


More information about the p4-projects mailing list