diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c index fc7ba082505b..cc6875af69e9 100644 --- a/os_if/linux/scan/src/wlan_cfg80211_scan.c +++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c @@ -650,6 +650,7 @@ QDF_STATUS wlan_abort_scan(struct wlan_objmgr_pdev *pdev, osif_ctx = wlan_pdev_get_ospriv(pdev); if (!osif_ctx) { cfg80211_err("Failed to retrieve osif context"); + qdf_mem_free(req); return QDF_STATUS_E_FAILURE; } if (vdev_id == INVAL_VDEV_ID) @@ -659,6 +660,11 @@ QDF_STATUS wlan_abort_scan(struct wlan_objmgr_pdev *pdev, vdev = wlan_objmgr_get_vdev_by_id_from_pdev(pdev, vdev_id, WLAN_OSIF_ID); + if (!vdev) { + cfg80211_err("Failed get vdev"); + qdf_mem_free(req); + return QDF_STATUS_E_INVAL; + } scan_priv = osif_ctx->osif_scan; req->cancel_req.requester = scan_priv->req_id; req->vdev = vdev; @@ -674,6 +680,7 @@ QDF_STATUS wlan_abort_scan(struct wlan_objmgr_pdev *pdev, status = ucfg_scan_cancel(req); if (QDF_IS_STATUS_ERROR(status)) cfg80211_err("Cancel scan request failed"); + wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID); return status; @@ -684,7 +691,11 @@ int wlan_cfg80211_abort_scan(struct wlan_objmgr_pdev *pdev) uint8_t pdev_id; pdev_id = wlan_objmgr_pdev_get_pdev_id(pdev); - wlan_abort_scan(pdev, pdev_id, INVAL_VDEV_ID, INVAL_SCAN_ID); + + if (ucfg_scan_get_pdev_status(pdev) != + SCAN_NOT_IN_PROGRESS) + wlan_abort_scan(pdev, pdev_id, + INVAL_VDEV_ID, INVAL_SCAN_ID); return 0; } @@ -711,7 +722,10 @@ int wlan_vendor_abort_scan(struct wlan_objmgr_pdev *pdev, ret = wlan_get_scanid(pdev, &scan_id, cookie); if (ret != 0) return ret; - wlan_abort_scan(pdev, pdev_id, INVAL_VDEV_ID, scan_id); + if (ucfg_scan_get_pdev_status(pdev) != + SCAN_NOT_IN_PROGRESS) + wlan_abort_scan(pdev, pdev_id, + INVAL_VDEV_ID, scan_id); } return 0; }