On 05/10/15(Mon) 23:03, Stefan Sperling wrote:
> I find this approach easier to follow and it doesn't mess with
> ic->ic_scan_lock which is supposed to be managed by the net80211 layer.
>
> Seems to work just as well as the old code.
>
> OK?
Mostly. I'd argue that iwm_stop() should still reset ic_scan_lock to
IEEE80211_SCAN_UNLOCKED and not call ieee80211_end_scan(). This is
was other wireless driver currently do and I'd suggest that releasing
the scan lock could be move to the stack. So I wouldn't introduce
a difference here.
>
> Index: if_iwm.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/if_iwm.c,v
> retrieving revision 1.52
> diff -u -p -r1.52 if_iwm.c
> --- if_iwm.c 5 Oct 2015 13:05:08 -0000 1.52
> +++ if_iwm.c 5 Oct 2015 20:36:46 -0000
> @@ -4611,7 +4611,6 @@ iwm_mvm_scan_request(struct iwm_softc *s
> * to allocate the time events. Warn on it, but maybe we
> * should try to send the command again with different params.
> */
> - sc->sc_scanband = 0;
> ret = EIO;
> }
> return ret;
> @@ -5316,6 +5315,8 @@ iwm_newstate_task(void *psc)
> ic->ic_des_esslen != 0,
> ic->ic_des_essid, ic->ic_des_esslen)) != 0) {
> printf("%s: could not initiate scan\n", DEVNAME(sc));
> + sc->sc_scanband = 0;
> + sc->sc_newstate(ic, IEEE80211_S_INIT, arg);
> return;
> }
> ic->ic_state = nstate;
> @@ -5408,11 +5409,7 @@ iwm_endscan_cb(void *arg)
> }
>
> if (done) {
> - if (!sc->sc_scanband) {
> - ic->ic_scan_lock = IEEE80211_SCAN_UNLOCKED;
> - } else {
> - ieee80211_end_scan(&ic->ic_if);
> - }
> + ieee80211_end_scan(&ic->ic_if);
> sc->sc_scanband = 0;
> }
> }
> @@ -5639,9 +5636,10 @@ iwm_stop(struct ifnet *ifp, int disable)
> sc->sc_flags &= ~IWM_FLAG_HW_INITED;
> sc->sc_flags |= IWM_FLAG_STOPPED;
> sc->sc_generation++;
> + if (sc->sc_scanband)
> + ieee80211_end_scan(&ic->ic_if);
> sc->sc_scanband = 0;
> sc->sc_auth_prot = 0;
> - ic->ic_scan_lock = IEEE80211_SCAN_UNLOCKED;
> ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
>
> task_del(systq, &sc->init_task);
>