]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
wifi: ath12k: disable pdev for non supported country
authorKarthik M <quic_karm@quicinc.com>
Tue, 6 May 2025 21:49:30 +0000 (14:49 -0700)
committerJeff Johnson <jeff.johnson@oss.qualcomm.com>
Mon, 23 Jun 2025 14:28:32 +0000 (07:28 -0700)
In MLO configuration, ath12k_mac_radio_start() iterates through all
the radios and makes the ar state 'ON'. Even though some bands are
not supported in certain countries, ath12k_reg_update_chan_list()
tries to update the channel list for all the active pdevs and ends
up in the warn_on for non-supported band.

To prevent this, disable the pdev when the number of channels across
all bands supported by the pdev is zero for a particular country.

Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.3.1-00173-QCAHKSWPL_SILICONZ-1

Signed-off-by: Karthik M <quic_karm@quicinc.com>
Signed-off-by: Muna Sinada <muna.sinada@oss.qualcomm.com>
Reviewed-by: Vasanthakumar Thiagarajan <vasanthakumar.thiagarajan@oss.qualcomm.com>
Link: https://patch.msgid.link/20250506214930.3561348-1-muna.sinada@oss.qualcomm.com
Signed-off-by: Jeff Johnson <jeff.johnson@oss.qualcomm.com>
drivers/net/wireless/ath/ath12k/mac.c
drivers/net/wireless/ath/ath12k/reg.c

index 5be7b79db341011f62a668b56a99a4eba0129598..1077b19a89c9cbaca8ea3c7152dfe630342d2aff 100644 (file)
@@ -8117,7 +8117,17 @@ static int ath12k_mac_start(struct ath12k *ar)
 
        /* TODO: Do we need to enable ANI? */
 
-       ath12k_reg_update_chan_list(ar, false);
+       ret = ath12k_reg_update_chan_list(ar, false);
+
+       /* The ar state alone can be turned off for non supported country
+        * without returning the error value. As we need to update the channel
+        * for the next ar.
+        */
+       if (ret) {
+               if (ret == -EINVAL)
+                       ret = 0;
+               goto err;
+       }
 
        ar->num_started_vdevs = 0;
        ar->num_created_vdevs = 0;
index 2598b39d5d7ee9b24ad8ed5d6de1bc5bbc6554e0..28bb26d2dd82ade4e2d9b9d218657f114eb5c6c0 100644 (file)
@@ -65,7 +65,7 @@ ath12k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
 
                for_each_ar(ah, ar, i) {
                        ret = ath12k_reg_update_chan_list(ar, true);
-                       if (ret) {
+                       if (ret && ret != -EINVAL) {
                                ath12k_warn(ar->ab,
                                            "failed to update chan list for pdev %u, ret %d\n",
                                            i, ret);
@@ -181,8 +181,11 @@ int ath12k_reg_update_chan_list(struct ath12k *ar, bool wait)
                }
        }
 
-       if (WARN_ON(!num_channels))
+       if (!num_channels) {
+               ath12k_dbg(ar->ab, ATH12K_DBG_REG,
+                          "pdev is not supported for this country\n");
                return -EINVAL;
+       }
 
        arg = kzalloc(struct_size(arg, channel, num_channels), GFP_KERNEL);