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);
> >