Search Linux Wireless

Re: [PATCH ath-next v3] wifi: ath12k: read country code from SMBIOS for WCN7850

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 





On 3/21/2025 7:06 PM, Zong-Zhe Yang wrote:
Kang Yang <quic_kangyang@xxxxxxxxxxx> wrote:

Read the country code from SMBIOS and send it to the firmware. The firmware will then
indicate the regulatory domain information for the country code, which ath12k will use.

[...]

static void ath12k_core_check_bdfext(const struct dmi_header *hdr, void *data)
                 return;
         }

+       spin_lock_bh(&ab->base_lock);
+
+       switch (smbios->country_code_flag) {
+       case ATH12K_SMBIOS_CC_ISO:
+               ab->new_alpha2[0] = u16_get_bits(smbios->cc_code, 0xff);
+               ab->new_alpha2[1] = u16_get_bits(smbios->cc_code, 0xff);

It seems that one of the masks is wrong.


Oh, yes.

+               ath12k_dbg(ab, ATH12K_DBG_BOOT, "boot smbios cc_code %c%c\n",
+                          ab->new_alpha2[0], ab->new_alpha2[1]);
+               break;
+       case ATH12K_SMBIOS_CC_WW:
+               ab->new_alpha2[0] = '0';
+               ab->new_alpha2[1] = '0';
+               ath12k_dbg(ab, ATH12K_DBG_BOOT, "boot smbios worldwide
regdomain\n");
+               break;
+       default:
+               ath12k_dbg(ab, ATH12K_DBG_BOOT, "boot ignore smbios country code
setting %d\n",
+                          smbios->country_code_flag);
+               break;
+       }
+
+       spin_unlock_bh(&ab->base_lock);
+
         if (!smbios->bdf_enabled) {
                 ath12k_dbg(ab, ATH12K_DBG_BOOT, "bdf variant name not found.\n");
                 return;
@@ -690,7 +712,7 @@ static void ath12k_core_check_bdfext(const struct dmi_header *hdr,
void *data)  int ath12k_core_check_smbios(struct ath12k_base *ab)  {
         ab->qmi.target.bdf_ext[0] = '\0';
-       dmi_walk(ath12k_core_check_bdfext, ab);
+       dmi_walk(ath12k_core_check_cc_code_bdfext, ab);

         if (ab->qmi.target.bdf_ext[0] == '\0')
                 return -ENODATA;
diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h
index 116cf530621f..e2d300bd5972 100644
--- a/drivers/net/wireless/ath/ath12k/core.h
+++ b/drivers/net/wireless/ath/ath12k/core.h
@@ -172,9 +172,34 @@ struct ath12k_ext_irq_grp {
         struct net_device *napi_ndev;
  };

+enum ath12k_smbios_cc_type {
+       /* disable country code setting from SMBIOS */
+       ATH12K_SMBIOS_CC_DISABLE = 0,
+
+       /* set country code by ANSI country name, based on ISO3166-1 alpha2 */
+       ATH12K_SMBIOS_CC_ISO = 1,
+
+       /* worldwide regdomain */
+       ATH12K_SMBIOS_CC_WW = 2,
+};
+
  struct ath12k_smbios_bdf {
         struct dmi_header hdr;
-       u32 padding;
+       u8 features_disabled;
+
+       /* enum ath12k_smbios_cc_type */
+       u8 country_code_flag;
+
+       /* To set specific country, you need to set country code
+        * flag=ATH12K_SMBIOS_CC_ISO first, then if country is United
+        * States, then country code value = 0x5553 ("US",'U' = 0x55, 'S'=
+        * 0x53). To set country to INDONESIA, then country code value =
+        * 0x4944 ("IN", 'I'=0x49, 'D'=0x44). If country code flag =
+        * ATH12K_SMBIOS_CC_WW, then you can use worldwide regulatory
+        * setting.
+        */
+       u16 cc_code;
+
         u8 bdf_enabled;
         u8 bdf_ext[];
  } __packed;

[...]







[Index of Archives]     [Linux Host AP]     [ATH6KL]     [Linux Wireless Personal Area Network]     [Linux Bluetooth]     [Wireless Regulations]     [Linux Netdev]     [Kernel Newbies]     [Linux Kernel]     [IDE]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]

  Powered by Linux