wifi: ath11k: update regulatory rules when connect to AP on 6 GHz band for station
authorWen Gong <quic_wgong@quicinc.com>
Thu, 11 Jan 2024 13:56:58 +0000 (15:56 +0200)
committerKalle Valo <quic_kvalo@quicinc.com>
Sun, 14 Jan 2024 14:59:09 +0000 (16:59 +0200)
When station connect to AP on 6 GHz band, it needs switch the regulatory
rules according to the regulatory info sub field in HE operation element.
Switch to the power type which AP used for station interface.

Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23

Signed-off-by: Wen Gong <quic_wgong@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://msgid.link/20231218085844.2658-6-quic_bqiang@quicinc.com
drivers/net/wireless/ath/ath11k/mac.c

index 3f52428433d1aa83abcb0b2fda649f3c621c9ae2..0b2b79ca5b1d11907f602120122d3af9f756706f 100644 (file)
@@ -7619,6 +7619,8 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
        struct ath11k_vif *arvif = ath11k_vif_to_arvif(vif);
        int ret;
        struct peer_create_params param;
+       struct cur_regulatory_info *reg_info;
+       enum ieee80211_ap_reg_power power_type;
 
        mutex_lock(&ar->conf_mutex);
 
@@ -7626,6 +7628,22 @@ ath11k_mac_op_assign_vif_chanctx(struct ieee80211_hw *hw,
                   "chanctx assign ptr %p vdev_id %i\n",
                   ctx, arvif->vdev_id);
 
+       if (ath11k_wmi_supports_6ghz_cc_ext(ar) &&
+           ctx->def.chan->band == NL80211_BAND_6GHZ &&
+           arvif->vdev_type == WMI_VDEV_TYPE_STA) {
+               reg_info = &ab->reg_info_store[ar->pdev_idx];
+               power_type = vif->bss_conf.power_type;
+
+               ath11k_dbg(ab, ATH11K_DBG_MAC, "chanctx power type %d\n", power_type);
+
+               if (power_type == IEEE80211_REG_UNSET_AP) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+
+               ath11k_reg_handle_chan_list(ab, reg_info, power_type);
+       }
+
        /* for QCA6390 bss peer must be created before vdev_start */
        if (ab->hw_params.vdev_start_delay &&
            arvif->vdev_type != WMI_VDEV_TYPE_AP &&