mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-10 16:21:45 -04:00
wifi: ath12k: use correct WMI command to set country code for WCN7850
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>
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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(¤t_arg.alpha2, request->alpha2, 2);
|
||||
ret = ath12k_wmi_send_set_current_country_cmd(ar, ¤t_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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user