From owner-p4-projects@FreeBSD.ORG Mon Feb 25 11:56:47 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5FDE416A409; Mon, 25 Feb 2008 11:56:47 +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 2227316A403 for ; Mon, 25 Feb 2008 11:56:47 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 11ED313C45E for ; Mon, 25 Feb 2008 11:56:47 +0000 (UTC) (envelope-from sephe@FreeBSD.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m1PBukRq062380 for ; Mon, 25 Feb 2008 11:56:46 GMT (envelope-from sephe@FreeBSD.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m1PBukfS062377 for perforce@freebsd.org; Mon, 25 Feb 2008 11:56:46 GMT (envelope-from sephe@FreeBSD.org) Date: Mon, 25 Feb 2008 11:56:46 GMT Message-Id: <200802251156.m1PBukfS062377@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to sephe@FreeBSD.org using -f From: Sepherosa Ziehau To: Perforce Change Reviews Cc: Subject: PERFORCE change 136160 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: Mon, 25 Feb 2008 11:56:47 -0000 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); }