]> www.infradead.org Git - users/hch/configfs.git/commitdiff
wifi: mac80211: optionally pass chandef to ieee80211_sta_cur_vht_bw()
authorJohannes Berg <johannes.berg@intel.com>
Wed, 12 Jun 2024 12:32:04 +0000 (14:32 +0200)
committerJohannes Berg <johannes.berg@intel.com>
Wed, 26 Jun 2024 08:21:54 +0000 (10:21 +0200)
We'll need this as well for channel switching cases, so
add the ability now to pass the chandef to calculate for.

Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://patch.msgid.link/20240612143418.f70e05d9f306.Ifa0ce267de4f0ef3c21d063fb0cbf50e84d7d6ff@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/mac80211/ieee80211_i.h
net/mac80211/vht.c

index e96404f9dc702efa6d6c3ff060a1d87dd6a47da6..33b8efff92c17ae597fd889406261031943da268 100644 (file)
@@ -2166,7 +2166,13 @@ ieee80211_sta_cap_rx_bw(struct link_sta_info *link_sta)
        return _ieee80211_sta_cap_rx_bw(link_sta, NULL);
 }
 enum ieee80211_sta_rx_bandwidth
-ieee80211_sta_cur_vht_bw(struct link_sta_info *link_sta);
+_ieee80211_sta_cur_vht_bw(struct link_sta_info *link_sta,
+                         struct cfg80211_chan_def *chandef);
+static inline enum ieee80211_sta_rx_bandwidth
+ieee80211_sta_cur_vht_bw(struct link_sta_info *link_sta)
+{
+       return _ieee80211_sta_cur_vht_bw(link_sta, NULL);
+}
 void ieee80211_sta_init_nss(struct link_sta_info *link_sta);
 enum ieee80211_sta_rx_bandwidth
 ieee80211_chan_width_to_rx_bw(enum nl80211_chan_width width);
index c280945fc9d6f0f95fd0d8e15bc770423639fb24..bf6ef45af757dce26b965298bab00768dd6c98ed 100644 (file)
@@ -503,22 +503,29 @@ ieee80211_chan_width_to_rx_bw(enum nl80211_chan_width width)
 
 /* FIXME: rename/move - this deals with everything not just VHT */
 enum ieee80211_sta_rx_bandwidth
-ieee80211_sta_cur_vht_bw(struct link_sta_info *link_sta)
+_ieee80211_sta_cur_vht_bw(struct link_sta_info *link_sta,
+                         struct cfg80211_chan_def *chandef)
 {
        struct sta_info *sta = link_sta->sta;
-       struct ieee80211_bss_conf *link_conf;
        enum nl80211_chan_width bss_width;
        enum ieee80211_sta_rx_bandwidth bw;
 
-       rcu_read_lock();
-       link_conf = rcu_dereference(sta->sdata->vif.link_conf[link_sta->link_id]);
-       if (WARN_ON(!link_conf))
-               bss_width = NL80211_CHAN_WIDTH_20_NOHT;
-       else
+       if (chandef) {
+               bss_width = chandef->width;
+       } else {
+               struct ieee80211_bss_conf *link_conf;
+
+               rcu_read_lock();
+               link_conf = rcu_dereference(sta->sdata->vif.link_conf[link_sta->link_id]);
+               if (WARN_ON_ONCE(!link_conf)) {
+                       rcu_read_unlock();
+                       return IEEE80211_STA_RX_BW_20;
+               }
                bss_width = link_conf->chanreq.oper.width;
-       rcu_read_unlock();
+               rcu_read_unlock();
+       }
 
-       bw = ieee80211_sta_cap_rx_bw(link_sta);
+       bw = _ieee80211_sta_cap_rx_bw(link_sta, chandef);
        bw = min(bw, link_sta->cur_max_bandwidth);
 
        /* Don't consider AP's bandwidth for TDLS peers, section 11.23.1 of