[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