Message ID | 20230906082948.18452-5-quic_wgong@quicinc.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Kalle Valo |
Headers | show |
Series | wifi: ath12k: add 11d scan offload support and handle country code for WCN7850 | expand |
On 9/6/2023 1:29 AM, Wen Gong wrote: > Currently ath12k does not send the country code to firmware after device > recovery. As a result the regdomain info is reported from firmware by > default. Regdomain info is important, so ath12k also need to restore > it to the value which was used before recovery. > > This is only needed for platforms which support the current_cc_support > hardware parameter. > > Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4 > > Signed-off-by: Wen Gong <quic_wgong@quicinc.com> > --- > drivers/net/wireless/ath/ath12k/core.c | 1 + > drivers/net/wireless/ath/ath12k/core.h | 1 + > drivers/net/wireless/ath/ath12k/mac.c | 8 ++++++++ > drivers/net/wireless/ath/ath12k/reg.c | 1 + > 4 files changed, 11 insertions(+) > > diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c > index 71450dc1f48d..4433d7701c67 100644 > --- a/drivers/net/wireless/ath/ath12k/core.c > +++ b/drivers/net/wireless/ath/ath12k/core.c > @@ -696,6 +696,7 @@ static void ath12k_update_11d(struct work_struct *work) > pdev = &ab->pdevs[i]; > ar = pdev->ar; > > + memcpy(&ar->alpha2, &set_current_param.alpha2, 2); > ret = ath12k_wmi_send_set_current_country_cmd(ar, &set_current_param); > if (ret) > ath12k_warn(ar->ab, > diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h > index ba8a4f968a3f..10fa9de15024 100644 > --- a/drivers/net/wireless/ath/ath12k/core.h > +++ b/drivers/net/wireless/ath/ath12k/core.h > @@ -582,6 +582,7 @@ struct ath12k { > struct completion completed_11d_scan; > enum ath12k_11d_state state_11d; > bool regdom_set_by_user; > + u8 alpha2[REG_ALPHA2_LEN + 1]; curious why +1? don't you always just treat this as a 2-octet array rather than as a NUL-terminated string? > }; > > struct ath12k_band_cap { > diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c > index 740e8045a6f1..0df154c34f8f 100644 > --- a/drivers/net/wireless/ath/ath12k/mac.c > +++ b/drivers/net/wireless/ath/ath12k/mac.c > @@ -6908,6 +6908,14 @@ ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw, > ar->state = ATH12K_STATE_ON; > ieee80211_wake_queues(ar->hw); > > + if (ar->ab->hw_params->current_cc_support && > + ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { > + struct wmi_set_current_country_params set_current_param = {}; > + > + memcpy(&set_current_param.alpha2, ar->alpha2, 2); > + ath12k_wmi_send_set_current_country_cmd(ar, &set_current_param); > + } > + > if (ab->is_reset) { > recovery_count = atomic_inc_return(&ab->recovery_count); > ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n", > diff --git a/drivers/net/wireless/ath/ath12k/reg.c b/drivers/net/wireless/ath/ath12k/reg.c > index 97c93a4901e6..eb46bfc2b2b9 100644 > --- a/drivers/net/wireless/ath/ath12k/reg.c > +++ b/drivers/net/wireless/ath/ath12k/reg.c > @@ -82,6 +82,7 @@ ath12k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request) > */ > if (ar->ab->hw_params->current_cc_support) { > memcpy(&set_current_param.alpha2, request->alpha2, 2); > + memcpy(&ar->alpha2, &set_current_param.alpha2, 2); > > ret = ath12k_wmi_send_set_current_country_cmd(ar, &set_current_param); > if (ret)
diff --git a/drivers/net/wireless/ath/ath12k/core.c b/drivers/net/wireless/ath/ath12k/core.c index 71450dc1f48d..4433d7701c67 100644 --- a/drivers/net/wireless/ath/ath12k/core.c +++ b/drivers/net/wireless/ath/ath12k/core.c @@ -696,6 +696,7 @@ static void ath12k_update_11d(struct work_struct *work) pdev = &ab->pdevs[i]; ar = pdev->ar; + memcpy(&ar->alpha2, &set_current_param.alpha2, 2); ret = ath12k_wmi_send_set_current_country_cmd(ar, &set_current_param); if (ret) ath12k_warn(ar->ab, diff --git a/drivers/net/wireless/ath/ath12k/core.h b/drivers/net/wireless/ath/ath12k/core.h index ba8a4f968a3f..10fa9de15024 100644 --- a/drivers/net/wireless/ath/ath12k/core.h +++ b/drivers/net/wireless/ath/ath12k/core.h @@ -582,6 +582,7 @@ struct ath12k { struct completion completed_11d_scan; enum ath12k_11d_state state_11d; bool regdom_set_by_user; + u8 alpha2[REG_ALPHA2_LEN + 1]; }; struct ath12k_band_cap { diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c index 740e8045a6f1..0df154c34f8f 100644 --- a/drivers/net/wireless/ath/ath12k/mac.c +++ b/drivers/net/wireless/ath/ath12k/mac.c @@ -6908,6 +6908,14 @@ ath12k_mac_op_reconfig_complete(struct ieee80211_hw *hw, ar->state = ATH12K_STATE_ON; ieee80211_wake_queues(ar->hw); + if (ar->ab->hw_params->current_cc_support && + ar->alpha2[0] != 0 && ar->alpha2[1] != 0) { + struct wmi_set_current_country_params set_current_param = {}; + + memcpy(&set_current_param.alpha2, ar->alpha2, 2); + ath12k_wmi_send_set_current_country_cmd(ar, &set_current_param); + } + if (ab->is_reset) { recovery_count = atomic_inc_return(&ab->recovery_count); ath12k_dbg(ab, ATH12K_DBG_BOOT, "recovery count %d\n", diff --git a/drivers/net/wireless/ath/ath12k/reg.c b/drivers/net/wireless/ath/ath12k/reg.c index 97c93a4901e6..eb46bfc2b2b9 100644 --- a/drivers/net/wireless/ath/ath12k/reg.c +++ b/drivers/net/wireless/ath/ath12k/reg.c @@ -82,6 +82,7 @@ ath12k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request) */ if (ar->ab->hw_params->current_cc_support) { memcpy(&set_current_param.alpha2, request->alpha2, 2); + memcpy(&ar->alpha2, &set_current_param.alpha2, 2); ret = ath12k_wmi_send_set_current_country_cmd(ar, &set_current_param); if (ret)
Currently ath12k does not send the country code to firmware after device recovery. As a result the regdomain info is reported from firmware by default. Regdomain info is important, so ath12k also need to restore it to the value which was used before recovery. This is only needed for platforms which support the current_cc_support hardware parameter. Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4 Signed-off-by: Wen Gong <quic_wgong@quicinc.com> --- drivers/net/wireless/ath/ath12k/core.c | 1 + drivers/net/wireless/ath/ath12k/core.h | 1 + drivers/net/wireless/ath/ath12k/mac.c | 8 ++++++++ drivers/net/wireless/ath/ath12k/reg.c | 1 + 4 files changed, 11 insertions(+)