mac80211: save transmit power envelope element and power constraint
authorWen Gong <wgong@codeaurora.org>
Fri, 24 Sep 2021 10:00:52 +0000 (06:00 -0400)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 27 Sep 2021 11:20:42 +0000 (13:20 +0200)
This is to save the transmit power envelope element and power
constraint in struct ieee80211_bss_conf for 6 GHz. Lower driver
will use this info to calculate the power limit.

Signed-off-by: Wen Gong <wgong@codeaurora.org>
Link: https://lore.kernel.org/r/20210924100052.32029-7-wgong@codeaurora.org
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
include/net/mac80211.h
net/mac80211/mlme.c

index 8923a9fc41269b37fab5a3303b535d788957051b..16a965262a4f90b931c996c030a34c19616d2801 100644 (file)
@@ -633,6 +633,9 @@ struct ieee80211_fils_discovery {
  * @beacon_tx_rate: The configured beacon transmit rate that needs to be passed
  *     to driver when rate control is offloaded to firmware.
  * @power_type: power type of BSS for 6 GHz
+ * @tx_pwr_env: transmit power envelope array of BSS.
+ * @tx_pwr_env_num: number of @tx_pwr_env.
+ * @pwr_reduction: power constraint of BSS.
  */
 struct ieee80211_bss_conf {
        const u8 *bssid;
@@ -704,6 +707,9 @@ struct ieee80211_bss_conf {
        bool s1g;
        struct cfg80211_bitrate_mask beacon_tx_rate;
        enum ieee80211_ap_reg_power power_type;
+       struct ieee80211_tx_pwr_env tx_pwr_env[IEEE80211_TPE_MAX_IE_COUNT];
+       u8 tx_pwr_env_num;
+       u8 pwr_reduction;
 };
 
 /**
index 29388204889f218976121ad0df696ac8c03b089c..0ec183a92a017c3bf39148ec29d0f72864751f77 100644 (file)
@@ -2258,6 +2258,7 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
 {
        struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
        struct ieee80211_local *local = sdata->local;
+       struct ieee80211_bss_conf *bss_conf = &sdata->vif.bss_conf;
        u32 changed = 0;
        struct ieee80211_prep_tx_info info = {
                .subtype = stype,
@@ -2407,6 +2408,10 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
        cancel_delayed_work_sync(&ifmgd->tx_tspec_wk);
 
        sdata->encrypt_headroom = IEEE80211_ENCRYPT_HEADROOM;
+
+       bss_conf->pwr_reduction = 0;
+       bss_conf->tx_pwr_env_num = 0;
+       memset(bss_conf->tx_pwr_env, 0, sizeof(bss_conf->tx_pwr_env));
 }
 
 static void ieee80211_reset_ap_probe(struct ieee80211_sub_if_data *sdata)
@@ -5066,6 +5071,30 @@ static int ieee80211_prep_channel(struct ieee80211_sub_if_data *sdata,
        if (!(ifmgd->flags & IEEE80211_STA_DISABLE_HE)) {
                he_oper = elems->he_operation;
 
+               if (is_6ghz) {
+                       struct ieee80211_bss_conf *bss_conf;
+                       u8 i, j = 0;
+
+                       bss_conf = &sdata->vif.bss_conf;
+
+                       if (elems->pwr_constr_elem)
+                               bss_conf->pwr_reduction = *elems->pwr_constr_elem;
+
+                       BUILD_BUG_ON(ARRAY_SIZE(bss_conf->tx_pwr_env) !=
+                                    ARRAY_SIZE(elems->tx_pwr_env));
+
+                       for (i = 0; i < elems->tx_pwr_env_num; i++) {
+                               if (elems->tx_pwr_env_len[i] >
+                                   sizeof(bss_conf->tx_pwr_env[j]))
+                                       continue;
+
+                               bss_conf->tx_pwr_env_num++;
+                               memcpy(&bss_conf->tx_pwr_env[j], elems->tx_pwr_env[i],
+                                      elems->tx_pwr_env_len[i]);
+                               j++;
+                       }
+               }
+
                if (!ieee80211_verify_sta_he_mcs_support(sdata, sband, he_oper))
                        ifmgd->flags |= IEEE80211_STA_DISABLE_HE;
        }