> 
> From: Johannes Berg <[email protected]>
> 
> When changing AP SMPS, we need to look up all the stations for this
> interface, so there's no reason to iterate over hash chains rather than doing
> the simpler iteration over the station list.

Yup - thank you for that.
I remember I tried to find a better to do that when I implemented this back 
then, don't why I didn't do what you are doing now...


> 
> Signed-off-by: Johannes Berg <[email protected]>
> ---
>  net/mac80211/cfg.c | 69 ++++++++++++++++++++++++------------------------
> ------
>  1 file changed, 30 insertions(+), 39 deletions(-)
> 
> diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index
> dd4ff36c557a..06557e4f9588 100644
> --- a/net/mac80211/cfg.c
> +++ b/net/mac80211/cfg.c
> @@ -2273,7 +2273,6 @@ int __ieee80211_request_smps_ap(struct
> ieee80211_sub_if_data *sdata,  {
>       struct sta_info *sta;
>       enum ieee80211_smps_mode old_req;
> -     int i;
> 
>       if (WARN_ON_ONCE(sdata->vif.type != NL80211_IFTYPE_AP))
>               return -EINVAL;
> @@ -2301,48 +2300,40 @@ int __ieee80211_request_smps_ap(struct
> ieee80211_sub_if_data *sdata,
>              smps_mode, atomic_read(&sdata->u.ap.num_mcast_sta));
> 
>       mutex_lock(&sdata->local->sta_mtx);
> -     for (i = 0; i < STA_HASH_SIZE; i++) {
> -             for (sta = rcu_dereference_protected(sdata->local-
> >sta_hash[i],
> -                             lockdep_is_held(&sdata->local->sta_mtx));
> -                  sta;
> -                  sta = rcu_dereference_protected(sta->hnext,
> -                             lockdep_is_held(&sdata->local->sta_mtx))) {
> -                     /*
> -                      * Only stations associated to our AP and
> -                      * associated VLANs
> -                      */
> -                     if (sta->sdata->bss != &sdata->u.ap)
> -                             continue;
> +     list_for_each_entry(sta, &sdata->local->sta_list, list) {
> +             /*
> +              * Only stations associated to our AP and
> +              * associated VLANs
> +              */
> +             if (sta->sdata->bss != &sdata->u.ap)
> +                     continue;
> 
> -                     /* This station doesn't support MIMO - skip it */
> -                     if (sta_info_tx_streams(sta) == 1)
> -                             continue;
> +             /* This station doesn't support MIMO - skip it */
> +             if (sta_info_tx_streams(sta) == 1)
> +                     continue;
> 
> -                     /*
> -                      * Don't wake up a STA just to send the action frame
> -                      * unless we are getting more restrictive.
> -                      */
> -                     if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
> -                         !ieee80211_smps_is_restrictive(sta-
> >known_smps_mode,
> -                                                        smps_mode)) {
> -                             ht_dbg(sdata,
> -                                    "Won't send SMPS to sleeping STA
> %pM\n",
> -                                    sta->sta.addr);
> -                             continue;
> -                     }
> +             /*
> +              * Don't wake up a STA just to send the action frame
> +              * unless we are getting more restrictive.
> +              */
> +             if (test_sta_flag(sta, WLAN_STA_PS_STA) &&
> +                 !ieee80211_smps_is_restrictive(sta->known_smps_mode,
> +                                                smps_mode)) {
> +                     ht_dbg(sdata, "Won't send SMPS to sleeping STA
> %pM\n",
> +                            sta->sta.addr);
> +                     continue;
> +             }
> 
> -                     /*
> -                      * If the STA is not authorized, wait until it gets
> -                      * authorized and the action frame will be sent then.
> -                      */
> -                     if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED))
> -                             continue;
> +             /*
> +              * If the STA is not authorized, wait until it gets
> +              * authorized and the action frame will be sent then.
> +              */
> +             if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED))
> +                     continue;
> 
> -                     ht_dbg(sdata, "Sending SMPS to %pM\n", sta-
> >sta.addr);
> -                     ieee80211_send_smps_action(sdata, smps_mode,
> -                                                sta->sta.addr,
> -                                                sdata->vif.bss_conf.bssid);
> -             }
> +             ht_dbg(sdata, "Sending SMPS to %pM\n", sta->sta.addr);
> +             ieee80211_send_smps_action(sdata, smps_mode, sta-
> >sta.addr,
> +                                        sdata->vif.bss_conf.bssid);
>       }
>       mutex_unlock(&sdata->local->sta_mtx);
> 
> --
> 2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-wireless" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to