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

Reply via email to