Date: Fri, 18 Apr 2008 22:06:09 GMT From: Sam Leffler <sam@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 140229 for review Message-ID: <200804182206.m3IM69RW008285@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=140229 Change 140229 by sam@sam_ebb on 2008/04/18 22:05:30 Make drivers consistent in handling ieee80211_start_all, ioctls, resume, other stuff related to calling the if_init method. Affected files ... .. //depot/projects/vap/sys/dev/bwi/if_bwi.c#7 edit .. //depot/projects/vap/sys/dev/ipw/if_ipw.c#13 edit .. //depot/projects/vap/sys/dev/iwi/if_iwi.c#26 edit .. //depot/projects/vap/sys/dev/iwn/if_iwn.c#10 edit .. //depot/projects/vap/sys/dev/malo/if_malo.c#5 edit .. //depot/projects/vap/sys/dev/mwl/if_mwl.c#6 edit .. //depot/projects/vap/sys/dev/ral/rt2560.c#28 edit .. //depot/projects/vap/sys/dev/ral/rt2661.c#26 edit .. //depot/projects/vap/sys/dev/usb/if_rum.c#16 edit .. //depot/projects/vap/sys/dev/usb/if_ural.c#18 edit .. //depot/projects/vap/sys/dev/usb/if_zyd.c#16 edit .. //depot/projects/vap/sys/dev/wi/if_wi.c#26 edit .. //depot/projects/vap/sys/dev/wpi/if_wpi.c#18 edit Differences ... ==== //depot/projects/vap/sys/dev/bwi/if_bwi.c#7 (text+ko) ==== @@ -655,11 +655,8 @@ { struct ifnet *ifp = sc->sc_ifp; - if (ifp->if_flags & IFF_UP) { + if (ifp->if_flags & IFF_UP) bwi_init(sc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - bwi_start(ifp); - } } int @@ -1303,8 +1300,9 @@ /* Enable intrs */ bwi_enable_intrs(sc, BWI_INIT_INTRS); + BWI_UNLOCK(sc); + ieee80211_start_all(ic); /* start all vap's */ - BWI_UNLOCK(sc); return; bad: bwi_stop(sc, 1); ==== //depot/projects/vap/sys/dev/ipw/if_ipw.c#13 (text+ko) ==== @@ -847,19 +847,11 @@ { struct ipw_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; - IPW_LOCK_DECL; - - IPW_LOCK(sc); pci_write_config(dev, 0x41, 0, 1); - if (ifp->if_flags & IFF_UP) { - ipw_init_locked(sc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - ipw_start_locked(ifp); - } - - IPW_UNLOCK(sc); + if (ifp->if_flags & IFF_UP) + ipw_init(sc); return 0; } @@ -1852,20 +1844,21 @@ struct ipw_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *) data; - int error = 0; + int error = 0, startall = 0; IPW_LOCK_DECL; + IPW_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: - IPW_LOCK(sc); if (ifp->if_flags & IFF_UP) { - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { ipw_init_locked(sc); + startall = 1; + } } else { if (ifp->if_drv_flags & IFF_DRV_RUNNING) ipw_stop_locked(sc); } - IPW_UNLOCK(sc); break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: @@ -1874,6 +1867,10 @@ default: error = ether_ioctl(ifp, cmd, data); } + IPW_UNLOCK(sc); + + if (startall) + ieee80211_start_all(ic); return error; } @@ -2397,11 +2394,15 @@ ipw_init(void *priv) { struct ipw_softc *sc = priv; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; IPW_LOCK_DECL; IPW_LOCK(sc); ipw_init_locked(sc); IPW_UNLOCK(sc); + + ieee80211_start_all(ic); } static void @@ -2495,8 +2496,6 @@ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; - ieee80211_start_all(ic); /* start all vap's */ - sc->flags &=~ IPW_FLAG_INIT_LOCKED; return; ==== //depot/projects/vap/sys/dev/iwi/if_iwi.c#26 (text+ko) ==== @@ -196,6 +196,7 @@ static int iwi_queue_cmd(struct iwi_softc *, int, unsigned long); static int iwi_auth_and_assoc(struct iwi_softc *, struct ieee80211vap *); static int iwi_disassociate(struct iwi_softc *, int quiet); +static void iwi_init_locked(struct iwi_softc *); static void iwi_init(void *); static int iwi_init_fw_dma(struct iwi_softc *, int); static void iwi_stop_locked(void *); @@ -891,20 +892,12 @@ { struct iwi_softc *sc = device_get_softc(dev); struct ifnet *ifp = sc->sc_ifp; - IWI_LOCK_DECL; - - IWI_LOCK(sc); pci_write_config(dev, 0x41, 0, 1); - if (ifp->if_flags & IFF_UP) { - ifp->if_init(ifp->if_softc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - ifp->if_start(ifp); - } + if (ifp->if_flags & IFF_UP) + iwi_init(sc); - IWI_UNLOCK(sc); - return 0; } @@ -2056,16 +2049,20 @@ struct iwi_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *) data; - int error = 0; + int error = 0, startall = 0; + IWI_LOCK_DECL; + IWI_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) - iwi_init(sc); + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + iwi_init_locked(sc); + startall = 1; + } } else { if (ifp->if_drv_flags & IFF_DRV_RUNNING) - iwi_stop(sc); + iwi_stop_locked(sc); } break; case SIOCGIFMEDIA: @@ -2076,6 +2073,10 @@ error = ether_ioctl(ifp, cmd, data); break; } + IWI_UNLOCK(sc); + + if (startall) + ieee80211_start_all(ic); return error; } @@ -3072,19 +3073,15 @@ } static void -iwi_init(void *priv) +iwi_init_locked(struct iwi_softc *sc) { - struct iwi_softc *sc = priv; struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; struct iwi_rx_data *data; int i; - IWI_LOCK_DECL; - IWI_LOCK(sc); + IWI_LOCK_ASSERT(sc); if (sc->fw_state == IWI_FW_LOADING) { - IWI_UNLOCK(sc); device_printf(sc->sc_dev, "%s: already loading\n", __func__); return; /* XXX: condvar? */ } @@ -3157,16 +3154,27 @@ callout_reset(&sc->sc_wdtimer, hz, iwi_watchdog, sc); ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; - - IWI_UNLOCK(sc); - - ieee80211_start_all(ic); /* start all vap's */ return; fail: IWI_STATE_END(sc, IWI_FW_LOADING); fail2: iwi_stop_locked(sc); +} + +static void +iwi_init(void *priv) +{ + struct iwi_softc *sc = priv; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + IWI_LOCK_DECL; + + IWI_LOCK(sc); + iwi_init_locked(sc); IWI_UNLOCK(sc); + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); } static void @@ -3224,9 +3232,7 @@ { struct iwi_softc *sc = arg; - /* XXX not right */ - if (sc->sc_ifp->if_drv_flags & IFF_DRV_RUNNING) - iwi_init(sc); + iwi_init(sc); } /* ==== //depot/projects/vap/sys/dev/iwn/if_iwn.c#10 (text+kox) ==== @@ -562,11 +562,8 @@ pci_write_config(dev, 0x41, 0, 1); - if (ifp->if_flags & IFF_UP) { - iwn_init(ifp->if_softc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - iwn_start(ifp); - } + if (ifp->if_flags & IFF_UP) + iwn_init(sc); return 0; } @@ -2362,31 +2359,21 @@ struct iwn_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *) data; - int error = 0; + int error = 0, startall = 0; + IWN_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { - if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) - iwn_init(sc); + if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) { + iwn_init_locked(sc); + startall = 1; + } } else { if (ifp->if_drv_flags & IFF_DRV_RUNNING) - iwn_stop(sc); + iwn_stop_locked(sc); } break; -#if 0 -XXX Do we support mulitcast - case SIOCADDMULTI: - case SIOCDELMULTI: - ifr = (struct ifreq *)data; - error = (cmd == SIOCADDMULTI) ? - ether_addmulti(ifr, &ic->ic_ac) : - ether_delmulti(ifr, &ic->ic_ac); - - if (error == ENETRESET) - error = 0; - break; -#endif case SIOCGIFMEDIA: case SIOCSIFMEDIA: error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd); @@ -2395,6 +2382,10 @@ error = ether_ioctl(ifp, cmd, data); break; } + IWN_UNLOCK(sc); + + if (startall) + ieee80211_start_all(ic); return error; } @@ -4119,28 +4110,27 @@ } void -iwn_init(void *arg) +iwn_init_locked(struct iwn_softc *sc) { - struct iwn_softc *sc = arg; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; uint32_t tmp; int error, qid; - IWN_LOCK(sc); + IWN_LOCK_ASSERT(sc); /* load the firmware */ if (sc->fw_fp == NULL && (error = iwn_load_firmware(sc)) != 0) { device_printf(sc->sc_dev, "%s: could not load firmware, error %d\n", __func__, error); - goto fail; + return; } error = iwn_reset(sc); if (error != 0) { device_printf(sc->sc_dev, "%s: could not reset adapter, error %d\n", __func__, error); - goto fail; + return; } iwn_mem_lock(sc); @@ -4208,14 +4198,14 @@ if (!(IWN_READ(sc, IWN_GPIO_CTL) & IWN_GPIO_RF_ENABLED)) { device_printf(sc->sc_dev, "radio is disabled by hardware switch\n"); - goto fail; + return; } error = iwn_transfer_firmware(sc); if (error != 0) { device_printf(sc->sc_dev, "%s: could not load firmware, error %d\n", __func__, error); - goto fail; + return; } /* firmware has notified us that it is alive.. */ @@ -4231,18 +4221,26 @@ device_printf(sc->sc_dev, "%s: could not configure device, error %d\n", __func__, error); - goto fail; + return; } ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; +} + +void +iwn_init(void *arg) +{ + struct iwn_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + IWN_LOCK(sc); + iwn_init_locked(sc); IWN_UNLOCK(sc); - ieee80211_start_all(ic); - return; -fail: - IWN_UNLOCK(sc); + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); } static void @@ -4452,16 +4450,17 @@ } break; case IWN_REINIT: - //XXX DEBUG - break; - iwn_stop_locked(sc); + IWN_UNLOCK(sc); iwn_init(sc); + IWN_LOCK(sc); ieee80211_notify_radio(ic, 1); break; case IWN_RADIO_ENABLE: KASSERT(sc->fw_fp != NULL, ("Fware Not Loaded, can't load from tq")); + IWN_UNLOCK(sc); iwn_init(sc); + IWN_LOCK(sc); break; case IWN_RADIO_DISABLE: ieee80211_notify_radio(ic, 0); ==== //depot/projects/vap/sys/dev/malo/if_malo.c#5 (text+ko) ==== @@ -1494,9 +1494,8 @@ } static void -malo_init(void *arg) +malo_init_locked(struct malo_softc *sc) { - struct malo_softc *sc = (struct malo_softc *) arg; struct ifnet *ifp = sc->malo_ifp; struct ieee80211com *ic = ifp->if_l2com; struct malo_hal *mh = sc->malo_mh; @@ -1505,7 +1504,7 @@ DPRINTF(sc, MALO_DEBUG_ANY, "%s: if_flags 0x%x\n", __func__, ifp->if_flags); - MALO_LOCK(sc); + MALO_LOCK_ASSERT(sc); /* * Stop anything previously setup. This is safe whether this is @@ -1518,7 +1517,7 @@ */ if (!malo_hal_reset(sc)) { if_printf(ifp, "%s: unable to reset hardware\n", __func__); - goto done; + return; } /* @@ -1528,7 +1527,7 @@ if (error != 0) { if_printf(ifp, "%s: unable to start recv logic, error %d\n", __func__, error); - goto done; + return; } /* @@ -1545,10 +1544,25 @@ ifp->if_drv_flags |= IFF_DRV_RUNNING; malo_hal_intrset(mh, sc->malo_imask); +} + +static void +malo_init(void *arg) +{ + struct malo_softc *sc = (struct malo_softc *) arg; + struct ifnet *ifp = sc->malo_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + DPRINTF(sc, MALO_DEBUG_ANY, "%s: if_flags 0x%x\n", + __func__, ifp->if_flags); + + MALO_LOCK(sc); + malo_init_locked(sc); - ieee80211_start_all(ic); /* start all vap's */ -done: MALO_UNLOCK(sc); + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); /* start all vap's */ } /* @@ -1720,11 +1734,11 @@ struct malo_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *) data; - int error = 0; + int error = 0, startall = 0; + MALO_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: - MALO_LOCK(sc); if (MALO_IS_RUNNING(ifp)) { /* * To avoid rescanning another access point, @@ -1742,11 +1756,12 @@ * torn down much of our state. There's * probably a better way to deal with this. */ - if (!sc->malo_invalid) - malo_init(sc); + if (!sc->malo_invalid) { + malo_init_locked(sc); + startall = 1; + } } else malo_stop_locked(ifp, 1); - MALO_UNLOCK(sc); break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: @@ -1756,6 +1771,10 @@ error = ether_ioctl(ifp, cmd, data); break; } + MALO_UNLOCK(sc); + + if (startall) + ieee80211_start_all(ic); return error; #undef MALO_IS_RUNNING } @@ -2304,9 +2323,6 @@ DPRINTF(sc, MALO_DEBUG_ANY, "%s: if_flags %x\n", __func__, ifp->if_flags); - if (ifp->if_flags & IFF_UP) { + if (ifp->if_flags & IFF_UP) malo_init(sc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - malo_start(ifp); - } } ==== //depot/projects/vap/sys/dev/mwl/if_mwl.c#6 (text+ko) ==== @@ -96,10 +96,10 @@ int flags, const uint8_t bssid[IEEE80211_ADDR_LEN], const uint8_t mac[IEEE80211_ADDR_LEN]); static void mwl_vap_delete(struct ieee80211vap *); -static void mwl_ifinit(void *); static int mwl_setupdma(struct mwl_softc *); static int mwl_hal_reset(struct mwl_softc *sc); -static int mwl_init(struct mwl_softc *); +static int mwl_init_locked(struct mwl_softc *); +static void mwl_init(void *); static void mwl_stop_locked(struct ifnet *, int); static int mwl_reset(struct ieee80211vap *, u_long); static void mwl_stop(struct ifnet *, int); @@ -417,7 +417,7 @@ ifp->if_start = mwl_start; ifp->if_watchdog = mwl_watchdog; ifp->if_ioctl = mwl_ioctl; - ifp->if_init = mwl_ifinit; + ifp->if_init = mwl_init; IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN); ifp->if_snd.ifq_drv_maxlen = IFQ_MAXLEN; IFQ_SET_READY(&ifp->if_snd); @@ -819,11 +819,8 @@ DPRINTF(sc, MWL_DEBUG_ANY, "%s: if_flags %x\n", __func__, ifp->if_flags); - if (ifp->if_flags & IFF_UP) { + if (ifp->if_flags & IFF_UP) mwl_init(sc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - mwl_start(ifp); - } } void @@ -1004,14 +1001,6 @@ /* XXX 10MHz channels */ } -static void -mwl_ifinit(void *arg) -{ - struct mwl_softc *sc = arg; - - (void) mwl_init(sc); -} - /* * Inform firmware of our tx/rx dma setup. The BAR 0 * writes below are for compatibility with older firmware. @@ -1193,17 +1182,16 @@ } static int -mwl_init(struct mwl_softc *sc) +mwl_init_locked(struct mwl_softc *sc) { struct ifnet *ifp = sc->sc_ifp; - struct ieee80211com *ic = ifp->if_l2com; struct mwl_hal *mh = sc->sc_mh; int error = 0; DPRINTF(sc, MWL_DEBUG_ANY, "%s: if_flags 0x%x\n", __func__, ifp->if_flags); - MWL_LOCK(sc); + MWL_LOCK_ASSERT(sc); /* * Stop anything previously setup. This is safe @@ -1216,8 +1204,7 @@ */ if (!mwl_hal_reset(sc)) { if_printf(ifp, "unable to reset hardware\n"); - error = EIO; - goto done; + return EIO; } /* @@ -1226,7 +1213,7 @@ error = mwl_startrecv(sc); if (error != 0) { if_printf(ifp, "unable to start recv logic\n"); - goto done; + return error; } /* @@ -1250,10 +1237,26 @@ ifp->if_drv_flags |= IFF_DRV_RUNNING; mwl_hal_intrset(mh, sc->sc_imask); - ieee80211_start_all(ic); /* start all vap's */ -done: + return 0; +} + +static void +mwl_init(void *arg) +{ + struct mwl_softc *sc = arg; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + int error = 0; + + DPRINTF(sc, MWL_DEBUG_ANY, "%s: if_flags 0x%x\n", + __func__, ifp->if_flags); + + MWL_LOCK(sc); + error = mwl_init_locked(sc); MWL_UNLOCK(sc); - return error; + + if (error == 0) + ieee80211_start_all(ic); /* start all vap's */ } static void @@ -5191,11 +5194,12 @@ struct mwl_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *)data; - int error = 0; + int error = 0, startall; - MWL_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: + MWL_LOCK(sc); + startall = 0; if (IS_RUNNING(ifp)) { /* * To avoid rescanning another access point, @@ -5213,20 +5217,15 @@ * torn down much of our state. There's * probably a better way to deal with this. */ - if (!sc->sc_invalid) - mwl_init(sc); /* XXX lose error */ + if (!sc->sc_invalid) { + mwl_init_locked(sc); /* XXX lose error */ + startall = 1; + } } else mwl_stop_locked(ifp, 1); - break; - case SIOCADDMULTI: - case SIOCDELMULTI: - /* - * The upper layer has already installed/removed - * the multicast address(es), just recalculate the - * multicast filter for the card. - */ - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - mwl_mode_init(sc); + MWL_UNLOCK(sc); + if (startall) + ieee80211_start_all(ic); break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: @@ -5237,7 +5236,6 @@ /* NB: embed these numbers to get a consistent view */ sc->sc_stats.mst_tx_packets = ifp->if_opackets; sc->sc_stats.mst_rx_packets = ifp->if_ipackets; - MWL_UNLOCK(sc); /* * NB: Drop the softc lock in case of a page fault; * we'll accept any potential inconsisentcy in the @@ -5249,18 +5247,18 @@ #ifdef MWL_DIAGAPI case SIOCGMVDIAG: /* XXX check privs */ - MWL_UNLOCK(sc); /* XXX copyout */ return mwl_ioctl_diag(sc, (struct mwl_diag *) ifr); case SIOCGMVRESET: /* XXX check privs */ + MWL_LOCK(sc); error = mwl_ioctl_reset(sc,(struct mwl_diag *) ifr); + MWL_UNLOCK(sc); break; #endif /* MWL_DIAGAPI */ default: error = ether_ioctl(ifp, cmd, data); break; } - MWL_UNLOCK(sc); return error; #undef IS_RUNNING } ==== //depot/projects/vap/sys/dev/ral/rt2560.c#28 (text) ==== @@ -459,11 +459,8 @@ struct rt2560_softc *sc = xsc; struct ifnet *ifp = sc->sc_ifp; - if (ifp->if_flags & IFF_UP) { - ifp->if_init(ifp->if_softc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - ifp->if_start(ifp); - } + if (ifp->if_flags & IFF_UP) + rt2560_init(sc); } static void @@ -2006,12 +2003,11 @@ struct rt2560_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *) data; - int error = 0, startall; + int error = 0, startall = 0; + RAL_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: - RAL_LOCK(sc); - startall = 0; if (ifp->if_flags & IFF_UP) { if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { rt2560_init_locked(sc); @@ -2022,9 +2018,6 @@ if (ifp->if_drv_flags & IFF_DRV_RUNNING) rt2560_stop_locked(sc); } - RAL_UNLOCK(sc); - if (startall) /* NB: need to drop lock */ - ieee80211_start_all(ic); break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: @@ -2034,6 +2027,10 @@ error = ether_ioctl(ifp, cmd, data); break; } + RAL_UNLOCK(sc); + + if (startall) + ieee80211_start_all(ic); return error; } ==== //depot/projects/vap/sys/dev/ral/rt2661.c#26 (text) ==== @@ -475,11 +475,8 @@ struct rt2661_softc *sc = xsc; struct ifnet *ifp = sc->sc_ifp; - if (ifp->if_flags & IFF_UP) { - ifp->if_init(ifp->if_softc); - if (ifp->if_drv_flags & IFF_DRV_RUNNING) - ifp->if_start(ifp); - } + if (ifp->if_flags & IFF_UP) + rt2661_init(sc); } static void @@ -1748,12 +1745,11 @@ struct rt2661_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *) data; - int error = 0, startall; + int error = 0, startall = 0; + RAL_LOCK(sc); switch (cmd) { case SIOCSIFFLAGS: - RAL_LOCK(sc); - startall = 0; if (ifp->if_flags & IFF_UP) { if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { rt2661_init_locked(sc); @@ -1764,9 +1760,6 @@ if (ifp->if_drv_flags & IFF_DRV_RUNNING) rt2661_stop_locked(sc); } - RAL_UNLOCK(sc); - if (startall) /* NB: need to drop lock */ - ieee80211_start_all(ic); break; case SIOCGIFMEDIA: case SIOCSIFMEDIA: @@ -1776,6 +1769,10 @@ error = ether_ioctl(ifp, cmd, data); break; } + RAL_UNLOCK(sc); + + if (startall) + ieee80211_start_all(ic); return error; } ==== //depot/projects/vap/sys/dev/usb/if_rum.c#16 (text+ko) ==== @@ -186,6 +186,7 @@ static const char *rum_get_rf(int); static void rum_read_eeprom(struct rum_softc *); static int rum_bbp_init(struct rum_softc *); +static void rum_init_locked(struct rum_softc *); static void rum_init(void *); static void rum_stop(void *); static int rum_load_microcode(struct rum_softc *, const u_char *, @@ -1423,17 +1424,17 @@ struct rum_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *) data; - int error = 0; + int error = 0, startall = 0; RUM_LOCK(sc); - switch (cmd) { case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + rum_init(sc); + startall = 1; + } else rum_update_promisc(sc); - else - rum_init(sc); } else { if (ifp->if_drv_flags & IFF_DRV_RUNNING) rum_stop(sc); @@ -1446,9 +1447,10 @@ default: error = ether_ioctl(ifp, cmd, data); } - RUM_UNLOCK(sc); + if (startall) + ieee80211_start_all(ic); return error; } @@ -2020,10 +2022,9 @@ } static void -rum_init(void *priv) +rum_init_locked(struct rum_softc *sc) { #define N(a) (sizeof (a) / sizeof ((a)[0])) - struct rum_softc *sc = priv; struct ifnet *ifp = sc->sc_ifp; struct ieee80211com *ic = ifp->if_l2com; struct rum_rx_data *data; @@ -2139,9 +2140,6 @@ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE; ifp->if_drv_flags |= IFF_DRV_RUNNING; - - ieee80211_start_all(ic); /* start all vap's */ - return; fail: rum_stop(sc); @@ -2149,6 +2147,21 @@ } static void +rum_init(void *priv) +{ + struct rum_softc *sc = priv; + struct ifnet *ifp = sc->sc_ifp; + struct ieee80211com *ic = ifp->if_l2com; + + RUM_LOCK(sc); + rum_init_locked(sc); + RUM_UNLOCK(sc); + + if (ifp->if_drv_flags & IFF_DRV_RUNNING) + ieee80211_start_all(ic); /* start all vap's */ +} + +static void rum_stop(void *priv) { struct rum_softc *sc = priv; ==== //depot/projects/vap/sys/dev/usb/if_ural.c#18 (text+ko) ==== @@ -177,6 +177,7 @@ static int ural_bbp_init(struct ural_softc *); static void ural_set_txantenna(struct ural_softc *, int); static void ural_set_rxantenna(struct ural_softc *, int); +static void ural_init_locked(struct ural_softc *); static void ural_init(void *); static void ural_stop(void *); static int ural_raw_xmit(struct ieee80211_node *, struct mbuf *, @@ -1517,17 +1518,17 @@ struct ural_softc *sc = ifp->if_softc; struct ieee80211com *ic = ifp->if_l2com; struct ifreq *ifr = (struct ifreq *) data; - int error = 0; + int error = 0, startall = 1; RAL_LOCK(sc); - switch (cmd) { case SIOCSIFFLAGS: if (ifp->if_flags & IFF_UP) { - if (ifp->if_drv_flags & IFF_DRV_RUNNING) + if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) { + ural_init_locked(sc); + startall = 1; + } else ural_update_promisc(sc); - else - ural_init(sc); } else { if (ifp->if_drv_flags & IFF_DRV_RUNNING) ural_stop(sc); @@ -1541,9 +1542,10 @@ error = ether_ioctl(ifp, cmd, data); break; } - RAL_UNLOCK(sc); + if (startall) + ieee80211_start_all(ic); return error; } @@ -2184,10 +2186,9 @@ } >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200804182206.m3IM69RW008285>