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. > + 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; > > [...] >