wifi: ath12k: use correct WMI command to set country code for WCN7850
authorWen Gong <quic_wgong@quicinc.com>
Tue, 1 Apr 2025 02:08:38 +0000 (10:08 +0800)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Wed, 2 Apr 2025 15:04:31 +0000 (08:04 -0700)
When userspace tries to set country code by NL80211_REGDOM_SET_BY_USER
hint(like iw reg set XX), it will pass new country code to ath12k.
Then ath12k will set this new country code to firmware by
WMI_SET_INIT_COUNTRY_CMDID.

For AP based chips(QCN92xx), WMI_SET_INIT_COUNTRY_CMDID is the correct
command. However, for STATION based chips(WCN7850), it need to use
WMI_SET_CURRENT_COUNTRY_CMDID.

Add flag current_cc_support in hardware parameters. It is used to
distinguish AP/STA platform. After that, the firmware will work
normally and the regulatory feature works well for WCN7850.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0.c5-00481-QCAHMTSWPL_V1.0_V2.0_SILICONZ-3

Signed-off-by: Wen Gong <quic_wgong@quicinc.com>
Signed-off-by: Kang Yang <quic_kangyang@quicinc.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250401020840.357-3-quic_kangyang@quicinc.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/hw.c
drivers/net/wireless/ath/ath12k/hw.h
drivers/net/wireless/ath/ath12k/reg.c

index 0ba6aedc8405364f7311871b2f32c2fb35c469ad..a041697f6b1a2caa63a61d82cafd192d474f1ae0 100644 (file)
@@ -1323,6 +1323,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
                .ce_ie_addr = NULL,
                .ce_remap = NULL,
                .bdf_addr_offset = 0,
+
+               .current_cc_support = false,
        },
        {
                .name = "wcn7850 hw2.0",
@@ -1408,6 +1410,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
                .ce_ie_addr = NULL,
                .ce_remap = NULL,
                .bdf_addr_offset = 0,
+
+               .current_cc_support = true,
        },
        {
                .name = "qcn9274 hw2.0",
@@ -1489,6 +1493,8 @@ static const struct ath12k_hw_params ath12k_hw_params[] = {
                .ce_ie_addr = NULL,
                .ce_remap = NULL,
                .bdf_addr_offset = 0,
+
+               .current_cc_support = false,
        },
        {
                .name = "ipq5332 hw1.0",
index d4a2e47169d97436a2c7ca88e0204085258df61e..774679f3340606b74bcda9747961269360183d76 100644 (file)
@@ -198,6 +198,7 @@ struct ath12k_hw_params {
        bool reoq_lut_support:1;
        bool supports_shadow_regs:1;
        bool supports_aspm:1;
+       bool current_cc_support:1;
 
        u32 num_tcl_banks;
        u32 max_tx_ring;
index 439d61f284d89222e79c05d6cff8e85d0d315aad..1904f7b44ee87df92660f678c5ed2290d26aea6c 100644 (file)
@@ -48,6 +48,7 @@ ath12k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
 {
        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
        struct ath12k_wmi_init_country_arg arg;
+       struct wmi_set_current_country_arg current_arg = {};
        struct ath12k_hw *ah = ath12k_hw_to_ah(hw);
        struct ath12k *ar = ath12k_ah_to_ar(ah, 0);
        int ret, i;
@@ -77,23 +78,27 @@ ath12k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
                return;
        }
 
-       /* Set the country code to the firmware and wait for
-        * the WMI_REG_CHAN_LIST_CC EVENT for updating the
-        * reg info
-        */
-       arg.flags = ALPHA_IS_SET;
-       memcpy(&arg.cc_info.alpha2, request->alpha2, 2);
-       arg.cc_info.alpha2[2] = 0;
-
        /* Allow fresh updates to wiphy regd */
        ah->regd_updated = false;
 
        /* Send the reg change request to all the radios */
        for_each_ar(ah, ar, i) {
-               ret = ath12k_wmi_send_init_country_cmd(ar, &arg);
-               if (ret)
-                       ath12k_warn(ar->ab,
-                                   "INIT Country code set to fw failed : %d\n", ret);
+               if (ar->ab->hw_params->current_cc_support) {
+                       memcpy(&current_arg.alpha2, request->alpha2, 2);
+                       ret = ath12k_wmi_send_set_current_country_cmd(ar, &current_arg);
+                       if (ret)
+                               ath12k_warn(ar->ab,
+                                           "failed set current country code: %d\n", ret);
+               } else {
+                       arg.flags = ALPHA_IS_SET;
+                       memcpy(&arg.cc_info.alpha2, request->alpha2, 2);
+                       arg.cc_info.alpha2[2] = 0;
+
+                       ret = ath12k_wmi_send_init_country_cmd(ar, &arg);
+                       if (ret)
+                               ath12k_warn(ar->ab,
+                                           "failed set INIT Country code: %d\n", ret);
+               }
        }
 }