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

Kang Yang kang.yang at oss.qualcomm.com
Sun Apr 20 23:26:10 PDT 2025


On 4/18/2025 11:18 AM, Jeff Johnson wrote:
> On 4/16/2025 7:42 PM, Kang Yang wrote:
>> From: Wen Gong <quic_wgong at quicinc.com>
>>
>> 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.
>>
>> dmesg:
>> [ 1242.637253] ath12k_pci 0000:02:00.0: worldwide regdomain setting from SMBIOS
>> [ 1242.637259] ath12k_pci 0000:02:00.0: bdf variant name not found.
>> [ 1242.637261] ath12k_pci 0000:02:00.0: SMBIOS bdf variant name not set.
>> [ 1242.927543] ath12k_pci 0000:02:00.0: set current country pdev id 0 alpha2 00
>>
>> Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-02582-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1
>>
>> Signed-off-by: Wen Gong <quic_wgong at quicinc.com>
>> Signed-off-by: Kang Yang <kang.yang at oss.qualcomm.com>
>> ---
>>
>> Note: This patch is an old patch in public review written by
>> Wen Gong. Just resend it for him.
>> Link: https://lore.kernel.org/linux-wireless/20230913105156.17618-1-quic_wgong@quicinc.com/
>>
>> v5:
>>      1. fix "From" header.
>>      2. rebase on tag: ath/main(ath-202504141512).
>>      3. change quic email to oss email.
>> v4:
>>      1. fix assignment error for case ATH12K_SMBIOS_CC_ISO.
>>      2. rebase on tag: ath/main(ath-202503251458).
>> v3:
>>      1. rebase on tag: ath-202503172347.
>>      2. add branch tag.
>>      3. add descripition for Wen Gong.
>> v2:
>>      1. rebase on tag: ath/main(ath-202502181756).
>>      2. rewrite commit message.
>>
>> ---
>>   drivers/net/wireless/ath/ath12k/core.c | 26 +++++++++++++++++++++++--
>>   drivers/net/wireless/ath/ath12k/core.h | 27 +++++++++++++++++++++++++-
>>   drivers/net/wireless/ath/ath12k/mac.c  | 11 +++++++++++
>>   3 files changed, 61 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c
>> index 9b23329f1bf2..b5ade9c7530d 100644
>> --- a/drivers/net/wireless/ath/ath12k/core.c
>> +++ b/drivers/net/wireless/ath/ath12k/core.c
>> @@ -697,7 +697,7 @@ static void ath12k_core_stop(struct ath12k_base *ab)
>>   	/* De-Init of components as needed */
>>   }
>>   
>> -static void ath12k_core_check_bdfext(const struct dmi_header *hdr, void *data)
>> +static void ath12k_core_check_cc_code_bdfext(const struct dmi_header *hdr, void *data)
>>   {
>>   	struct ath12k_base *ab = data;
>>   	const char *magic = ATH12K_SMBIOS_BDF_EXT_MAGIC;
>> @@ -719,6 +719,28 @@ 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 >> 8, 0xff);
>> +		ab->new_alpha2[1] = u16_get_bits(smbios->cc_code, 0xff);
>> +		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;
>> @@ -758,7 +780,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 44e02ebb1071..3f9fcd4d6f20 100644
>> --- a/drivers/net/wireless/ath/ath12k/core.h
>> +++ b/drivers/net/wireless/ath/ath12k/core.h
>> @@ -175,9 +175,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;
>> diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
>> index 7af12733a1ff..aee3080a934c 100644
>> --- a/drivers/net/wireless/ath/ath12k/mac.c
>> +++ b/drivers/net/wireless/ath/ath12k/mac.c
>> @@ -11550,6 +11550,17 @@ static int ath12k_mac_hw_register(struct ath12k_hw *ah)
>>   			goto err_unregister_hw;
>>   		}
>>   
>> +		if (ar->ab->hw_params->current_cc_support && ab->new_alpha2[0]) {
>> +			struct wmi_set_current_country_arg current_cc = {};
>> +
>> +			memcpy(&current_cc.alpha2, ab->new_alpha2, 2);
>> +			memcpy(&ar->alpha2, ab->new_alpha2, 2);
>> +			ret = ath12k_wmi_send_set_current_country_cmd(ar, &current_cc);
>> +			if (ret)
>> +				ath12k_warn(ar->ab,
>> +					    "failed set cc code for mac register: %d\n", ret);
> FYI I split this line in pending to fix the ath12k-check:
> drivers/net/wireless/ath/ath12k/mac.c:11648: line length of 94 exceeds 90 columns
>
> https://git.kernel.org/pub/scm/linux/kernel/git/ath/ath.git/commit/?h=pending&id=2d2ccff4c0efa4cb55d0a21c75c6e7162788f9db

Oh, thanks


>
>> +		}
>> +
>>   		ath12k_fw_stats_init(ar);
>>   		ath12k_debugfs_register(ar);
>>   	}
>>
>> base-commit: b80c52642c1159c2596776b39b06eb1c2e36baff



More information about the ath12k mailing list