[PATCH 4/4] wifi: ath12k: store and send country code to firmware after recovery
Jeff Johnson
quic_jjohnson at quicinc.com
Fri Sep 8 08:07:26 PDT 2023
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 at 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)
More information about the ath12k
mailing list