Module Name: src Committed By: christos Date: Fri Jul 2 14:47:25 UTC 2010
Modified Files: src/sys/dev/pci: if_iwn.c if_iwnvar.h Log Message: - Fix the recursive iwn_init() call problem properly. - Don't print the scan request while scanning all the time. Perhaps I will remove this completely. To generate a diff of this commit: cvs rdiff -u -r1.46 -r1.47 src/sys/dev/pci/if_iwn.c cvs rdiff -u -r1.11 -r1.12 src/sys/dev/pci/if_iwnvar.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/dev/pci/if_iwn.c diff -u src/sys/dev/pci/if_iwn.c:1.46 src/sys/dev/pci/if_iwn.c:1.47 --- src/sys/dev/pci/if_iwn.c:1.46 Fri Jun 18 17:10:23 2010 +++ src/sys/dev/pci/if_iwn.c Fri Jul 2 10:47:25 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwn.c,v 1.46 2010/06/18 21:10:23 christos Exp $ */ +/* $NetBSD: if_iwn.c,v 1.47 2010/07/02 14:47:25 christos Exp $ */ /* $OpenBSD: if_iwn.c,v 1.96 2010/05/13 09:25:03 damien Exp $ */ /*- @@ -22,7 +22,7 @@ * adapters. */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.46 2010/06/18 21:10:23 christos Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if_iwn.c,v 1.47 2010/07/02 14:47:25 christos Exp $"); #define IWN_USE_RBUF /* Use local storage for RX */ #undef IWN_HWCRYPTO /* XXX does not even compile yet */ @@ -416,6 +416,7 @@ sc->sc_pct = pa->pa_pc; sc->sc_pcitag = pa->pa_tag; sc->sc_dmat = pa->pa_dmat; + mutex_init(&sc->sc_mtx, MUTEX_DEFAULT, IPL_NONE); callout_init(&sc->calib_to, 0); callout_setfunc(&sc->calib_to, iwn_calib_timeout, sc); @@ -1836,8 +1837,10 @@ case IEEE80211_S_SCAN: /* XXX Do not abort a running scan. */ if (sc->sc_flags & IWN_FLAG_SCANNING) { - aprint_error_dev(sc->sc_dev, - "scan request while scanning ignored\n"); + if (ic->ic_state != nstate) + aprint_error_dev(sc->sc_dev, "scan request(%d) " + "while scanning(%d) ignored\n", nstate, + ic->ic_state); break; } @@ -3161,22 +3164,6 @@ int s, error = 0; s = splnet(); - /* - * Prevent processes from entering this function while another - * process is tsleep'ing in it. - */ - if (sc->sc_flags & IWN_FLAG_BUSY) { - switch (cmd) { - case SIOCSIFADDR: - /* FALLTHROUGH */ - case SIOCSIFFLAGS: - splx(s); - aprint_normal_dev(sc->sc_dev, - "ioctl while busy cmd = 0x%lx\n", cmd); - return EBUSY; - } - } - sc->sc_flags |= IWN_FLAG_BUSY; switch (cmd) { case SIOCSIFADDR: @@ -3224,7 +3211,6 @@ } } - sc->sc_flags &= ~IWN_FLAG_BUSY; splx(s); return error; } @@ -5856,6 +5842,9 @@ struct ieee80211com *ic = &sc->sc_ic; int error; + mutex_spin_enter(&sc->sc_mtx); + if (sc->sc_flags & IWN_FLAG_HW_INITED) + return 0; if ((error = iwn_hw_prepare(sc)) != 0) { aprint_error_dev(sc->sc_dev, "hardware not ready\n"); @@ -5908,9 +5897,12 @@ else ieee80211_new_state(ic, IEEE80211_S_RUN, -1); + sc->sc_flags |= IWN_FLAG_HW_INITED; + mutex_spin_exit(&sc->sc_mtx); return 0; -fail: iwn_stop(ifp, 1); +fail: mutex_spin_exit(&sc->sc_mtx); + iwn_stop(ifp, 1); return error; } @@ -5920,6 +5912,8 @@ struct iwn_softc *sc = ifp->if_softc; struct ieee80211com *ic = &sc->sc_ic; + mutex_spin_enter(&sc->sc_mtx); + sc->sc_flags &= ~IWN_FLAG_HW_INITED; ifp->if_timer = sc->sc_tx_timer = 0; ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE); @@ -5933,6 +5927,7 @@ sc->sc_sensor.value_cur = 0; sc->sc_sensor.state = ENVSYS_SINVALID; #endif + mutex_spin_exit(&sc->sc_mtx); } /* Index: src/sys/dev/pci/if_iwnvar.h diff -u src/sys/dev/pci/if_iwnvar.h:1.11 src/sys/dev/pci/if_iwnvar.h:1.12 --- src/sys/dev/pci/if_iwnvar.h:1.11 Fri Jun 18 17:10:23 2010 +++ src/sys/dev/pci/if_iwnvar.h Fri Jul 2 10:47:25 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: if_iwnvar.h,v 1.11 2010/06/18 21:10:23 christos Exp $ */ +/* $NetBSD: if_iwnvar.h,v 1.12 2010/07/02 14:47:25 christos Exp $ */ /* $OpenBSD: if_iwnvar.h,v 1.19 2010/05/05 19:47:43 damien Exp $ */ /*- @@ -226,9 +226,9 @@ #define IWN_FLAG_CALIB_DONE (1 << 2) #define IWN_FLAG_USE_ICT (1 << 3) #define IWN_FLAG_INTERNAL_PA (1 << 4) -#define IWN_FLAG_BUSY (1 << 5) /* Added for NetBSD */ #define IWN_FLAG_SCANNING (1 << 8) +#define IWN_FLAG_HW_INITED (1 << 9) uint8_t hw_type; const struct iwn_hal *sc_hal; @@ -321,5 +321,8 @@ } sc_txtapu; #define sc_txtap sc_txtapu.th int sc_txtap_len; + + kmutex_t sc_mtx; /* mutex for init/stop */ + };