On Tue, Oct 06, 2015 at 10:09:00AM +0200, Martin Pieuchot wrote: > 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.
What annoys me about this is that nothing will wake processes sleeping on the scan lock. They will eventually time out, of course. Still ugly. > > > > 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); > >