Read and update scan_processing under nxpwifi_cmd_lock so cancellation cannot race with scan state changes. Skip scan completion when no scan was active. Signed-off-by: Vishal Gupta --- drivers/net/wireless/nxp/nxpwifi/scan.c | 34 +++++++++++++++---------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/drivers/net/wireless/nxp/nxpwifi/scan.c b/drivers/net/wireless/nxp/nxpwifi/scan.c index 67d7ff2f10c59..57ab10908c152 100644 --- a/drivers/net/wireless/nxp/nxpwifi/scan.c +++ b/drivers/net/wireless/nxp/nxpwifi/scan.c @@ -1855,26 +1855,32 @@ void nxpwifi_cancel_scan(struct nxpwifi_adapter *adapter) { struct nxpwifi_private *priv; int i; + bool cancel = false; nxpwifi_cancel_pending_scan_cmd(adapter); + spin_lock_bh(&adapter->nxpwifi_cmd_lock); if (adapter->scan_processing) { - spin_lock_bh(&adapter->nxpwifi_cmd_lock); adapter->scan_processing = false; - spin_unlock_bh(&adapter->nxpwifi_cmd_lock); - for (i = 0; i < adapter->priv_num; i++) { - priv = adapter->priv[i]; - if (priv->scan_request) { - struct cfg80211_scan_info info = { - .aborted = true, - }; + cancel = true; + } + spin_unlock_bh(&adapter->nxpwifi_cmd_lock); - nxpwifi_dbg(adapter, INFO, - "info: aborting scan\n"); - cfg80211_scan_done(priv->scan_request, &info); - priv->scan_request = NULL; - priv->scan_aborting = false; - } + if (!cancel) + return; + + for (i = 0; i < adapter->priv_num; i++) { + priv = adapter->priv[i]; + if (priv->scan_request) { + struct cfg80211_scan_info info = { + .aborted = true, + }; + + nxpwifi_dbg(adapter, INFO, + "info: aborting scan\n"); + cfg80211_scan_done(priv->scan_request, &info); + priv->scan_request = NULL; + priv->scan_aborting = false; } } } -- 2.43.0