[PATCH] wifi: ath12k: indicate scan complete for scan canceled when scan running

Jeff Johnson quic_jjohnson at quicinc.com
Fri Sep 8 08:23:48 PDT 2023


On 9/6/2023 1:57 AM, Wen Gong wrote:
> ath12k prints "Received scan event for unknown vdev" when doing the
> following test:
> 1. trigger scan
> 2. wait 0.2 second
> 3. iw reg set is issued or 11d scan complete event is sent from firmware
> 
> Reason is:
> When iw reg set is issues or the 11d scan complete event is received, the
> new country code will be set to the firmware, and the new regdomain info
> indicated to ath12k, then the new channel list will be sent to the firmware.
> The firmware will cancel the current scan after receiving WMI_SCAN_CHAN_LIST_CMDID
> which is used for the new channel list, and the state of ath12k is
> ATH12K_SCAN_RUNNING, then ath12k_get_ar_on_scan_abort() returns NULL and
> ath12k_scan_event() returns at this point and does not indicate scan
> completion to mac80211.
> 
> Indicate scan completion to mac80211 and get rid of the "Received scan
> event for unknown vdev" print for the above case.
> 
> 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>

Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>

> ---
>   drivers/net/wireless/ath/ath12k/wmi.c | 18 ++++++++++++------
>   1 file changed, 12 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/wireless/ath/ath12k/wmi.c b/drivers/net/wireless/ath/ath12k/wmi.c
> index 9ed33e2d6da0..d30de487f43f 100644
> --- a/drivers/net/wireless/ath/ath12k/wmi.c
> +++ b/drivers/net/wireless/ath/ath12k/wmi.c
> @@ -5862,8 +5862,9 @@ static void ath12k_mgmt_tx_compl_event(struct ath12k_base *ab, struct sk_buff *s
>   	rcu_read_unlock();
>   }
>   
> -static struct ath12k *ath12k_get_ar_on_scan_abort(struct ath12k_base *ab,
> -						  u32 vdev_id)
> +static struct ath12k *ath12k_get_ar_on_scan_state(struct ath12k_base *ab,
> +						  u32 vdev_id,
> +						  enum ath12k_scan_state state)
>   {
>   	int i;
>   	struct ath12k_pdev *pdev;
> @@ -5875,7 +5876,7 @@ static struct ath12k *ath12k_get_ar_on_scan_abort(struct ath12k_base *ab,
>   			ar = pdev->ar;
>   
>   			spin_lock_bh(&ar->data_lock);
> -			if (ar->scan.state == ATH12K_SCAN_ABORTING &&
> +			if (ar->scan.state == state &&
>   			    ar->scan.vdev_id == vdev_id) {
>   				spin_unlock_bh(&ar->data_lock);
>   				return ar;
> @@ -5905,10 +5906,15 @@ static void ath12k_scan_event(struct ath12k_base *ab, struct sk_buff *skb)
>   	 * aborting scan's vdev id matches this event info.
>   	 */
>   	if (le32_to_cpu(scan_ev.event_type) == WMI_SCAN_EVENT_COMPLETED &&
> -	    le32_to_cpu(scan_ev.reason) == WMI_SCAN_REASON_CANCELLED)
> -		ar = ath12k_get_ar_on_scan_abort(ab, le32_to_cpu(scan_ev.vdev_id));
> -	else
> +	    le32_to_cpu(scan_ev.reason) == WMI_SCAN_REASON_CANCELLED) {
> +		ar = ath12k_get_ar_on_scan_state(ab, le32_to_cpu(scan_ev.vdev_id),
> +						 ATH12K_SCAN_ABORTING);
> +		if (!ar)
> +			ar = ath12k_get_ar_on_scan_state(ab, le32_to_cpu(scan_ev.vdev_id),
> +							 ATH12K_SCAN_RUNNING);
> +	} else {
>   		ar = ath12k_mac_get_ar_by_vdev_id(ab, le32_to_cpu(scan_ev.vdev_id));
> +	}
>   
>   	if (!ar) {
>   		ath12k_warn(ab, "Received scan event for unknown vdev");
> 
> base-commit: 3f257461ab0ab19806bae2bfde4c3cd88dbf050e




More information about the ath12k mailing list