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

Reply via email to