> > From: Johannes Berg <johannes.berg@xxxxxxxxx> > > 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 <johannes.berg@xxxxxxxxx> > --- > 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html