Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Feb 2008 11:56:46 GMT
From:      Sepherosa Ziehau <sephe@FreeBSD.org>
To:        Perforce Change Reviews <perforce@FreeBSD.org>
Subject:   PERFORCE change 136160 for review
Message-ID:  <200802251156.m1PBukfS062377@repoman.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=136160

Change 136160 by sephe@sephe_zealot:sam_wifi on 2008/02/25 11:56:15

	Silent witness warning about sleeping with non-sleepable lock
	(recursive driver lock) held

Affected files ...

.. //depot/projects/wifi/sys/dev/bwi/bwimac.c#9 edit
.. //depot/projects/wifi/sys/dev/bwi/if_bwi.c#24 edit

Differences ...

==== //depot/projects/wifi/sys/dev/bwi/bwimac.c#9 (text+ko) ====

@@ -882,6 +882,8 @@
 	char fwname[64];
 	int idx;
 
+	BWI_ASSERT_LOCKED(sc);
+
 	/*
 	 * Try getting the firmware stub so firmware
 	 * module would be loaded automatically
@@ -889,7 +891,9 @@
 	if (mac->mac_stub == NULL) {
 		snprintf(fwname, sizeof(fwname), BWI_FW_STUB_PATH,
 			 sc->sc_fw_version);
+		BWI_UNLOCK(sc);
 		mac->mac_stub = firmware_get(fwname);
+		BWI_LOCK(sc);
 		if (mac->mac_stub == NULL) {
 			if_printf(ifp, "request firmware %s failed\n", fwname);
 			return ENOMEM;
@@ -901,7 +905,9 @@
 			  sc->sc_fw_version,
 			  mac->mac_rev >= 5 ? 5 : mac->mac_rev);
 
+		BWI_UNLOCK(sc);
 		mac->mac_ucode = firmware_get(fwname);
+		BWI_LOCK(sc);
 		if (mac->mac_ucode == NULL) {
 			if_printf(ifp, "request firmware %s failed\n", fwname);
 			return ENOMEM;
@@ -916,7 +922,9 @@
 			  sc->sc_fw_version,
 			  mac->mac_rev < 5 ? 4 : 5);
 
+		BWI_UNLOCK(sc);
 		mac->mac_pcm = firmware_get(fwname);
+		BWI_LOCK(sc);
 		if (mac->mac_pcm == NULL) {
 			if_printf(ifp, "request firmware %s failed\n", fwname);
 			return ENOMEM;
@@ -941,7 +949,9 @@
 		snprintf(fwname, sizeof(fwname), BWI_FW_IV_PATH,
 			  sc->sc_fw_version, idx);
 
+		BWI_UNLOCK(sc);
 		mac->mac_iv = firmware_get(fwname);
+		BWI_LOCK(sc);
 		if (mac->mac_iv == NULL) {
 			if_printf(ifp, "request firmware %s failed\n", fwname);
 			return ENOMEM;
@@ -967,7 +977,9 @@
 		snprintf(fwname, sizeof(fwname), BWI_FW_IV_EXT_PATH,
 			  sc->sc_fw_version, idx);
 
+		BWI_UNLOCK(sc);
 		mac->mac_iv_ext = firmware_get(fwname);
+		BWI_LOCK(sc);
 		if (mac->mac_iv_ext == NULL) {
 			if_printf(ifp, "request firmware %s failed\n", fwname);
 			return ENOMEM;

==== //depot/projects/wifi/sys/dev/bwi/if_bwi.c#24 (text+ko) ====

@@ -94,6 +94,7 @@
 } __packed;
 
 static void	bwi_init(void *);
+static void	bwi_init_locked(struct bwi_softc *);
 static int	bwi_ioctl(struct ifnet *, u_long, caddr_t);
 static void	bwi_start(struct ifnet *);
 static void	bwi_start_locked(struct ifnet *);
@@ -1186,7 +1187,18 @@
 static void
 bwi_init(void *xsc)
 {
-	bwi_init_statechg(xsc, 1);
+	struct bwi_softc *sc = xsc;
+
+	BWI_LOCK(sc);
+	bwi_init_locked(sc);
+	BWI_UNLOCK(sc);
+}
+
+static void
+bwi_init_locked(struct bwi_softc *sc)
+{
+	BWI_ASSERT_LOCKED(sc);
+	bwi_init_statechg(sc, 1);
 }
 
 static void
@@ -1197,7 +1209,7 @@
 	struct bwi_mac *mac;
 	int error;
 
-	BWI_LOCK(sc);
+	BWI_ASSERT_LOCKED(sc);
 
 	bwi_stop(sc, statechg);
 
@@ -1276,7 +1288,6 @@
 		bwi_stop(sc, 1);
 	else
 		bwi_start_locked(ifp);
-	BWI_UNLOCK(sc);
 }
 
 static int
@@ -1316,7 +1327,7 @@
 
 		if (ifp->if_flags & IFF_UP) {
 			if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
-				bwi_init(sc);
+				bwi_init_locked(sc);
 		} else {
 			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
 				bwi_stop(sc, 1);
@@ -1329,7 +1340,7 @@
 
 	if (error == ENETRESET) {
 		if (IS_RUNNING(ifp))
-			bwi_init(sc);
+			bwi_init_locked(sc);
 		error = 0;
 	}
 	BWI_UNLOCK(sc);
@@ -1866,7 +1877,7 @@
 
 	BWI_LOCK(sc);
 	if (ieee80211_media_change(ifp) == ENETRESET && IS_RUNNING(ifp))
-		bwi_init(ifp->if_softc);
+		bwi_init_locked(ifp->if_softc);
 	BWI_UNLOCK(sc);
 
 	return 0;
@@ -4324,6 +4335,8 @@
 {
 	struct bwi_softc *sc = xsc;
 
+	BWI_LOCK(sc);
 	if_printf(sc->sc_ifp, "%s begin\n", __func__);
 	bwi_init_statechg(xsc, 0);
+	BWI_UNLOCK(sc);
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200802251156.m1PBukfS062377>