Bladeren bron

qcacmn: Register PNO callback only when PNO req is sent

PNO can be initiated from IOCTL with different calback and
thus register the callback while sending the PNO req.

Change-Id: I74109fc88cfbd082ce2ba5ca0a2396ab08b82b42
CRs-Fixed: 2032434
Abhishek Singh 8 jaren geleden
bovenliggende
commit
5468c57437
1 gewijzigde bestanden met toevoegingen van 12 en 15 verwijderingen
  1. 12 15
      os_if/linux/scan/src/wlan_cfg80211_scan.c

+ 12 - 15
os_if/linux/scan/src/wlan_cfg80211_scan.c

@@ -130,13 +130,6 @@ static void wlan_cfg80211_pno_callback(struct wlan_objmgr_vdev *vdev,
 	cfg80211_sched_scan_results(pdev_ospriv->wiphy);
 }
 
-static void
-wlan_cfg80211_register_pno_cb(struct wlan_objmgr_psoc *psoc)
-{
-	ucfg_scan_register_pno_cb(psoc,
-		wlan_cfg80211_pno_callback, NULL);
-}
-
 /**
  * wlan_cfg80211_is_pno_allowed() -  Check if PNO is allowed
  * @vdev: vdev ptr
@@ -179,6 +172,7 @@ int wlan_cfg80211_sched_scan_start(struct wlan_objmgr_pdev *pdev,
 	QDF_STATUS status;
 	uint8_t num_chan = 0, channel;
 	struct wlan_objmgr_vdev *vdev;
+	struct wlan_objmgr_psoc *psoc;
 	uint32_t valid_ch[SCAN_PNO_MAX_NETW_CHANNELS_EX] = {0};
 
 	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(pdev, dev->dev_addr,
@@ -195,6 +189,12 @@ int wlan_cfg80211_sched_scan_start(struct wlan_objmgr_pdev *pdev,
 		return -ENOTSUPP;
 	}
 
+	if (ucfg_scan_get_pno_in_progress(vdev)) {
+		cfg80211_debug("pno is already in progress");
+		wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID);
+		return -EBUSY;
+	}
+
 	ucfg_scan_flush_results(pdev, NULL);
 	if (ucfg_scan_get_pdev_status(pdev) !=
 	   SCAN_NOT_IN_PROGRESS) {
@@ -330,6 +330,11 @@ int wlan_cfg80211_sched_scan_start(struct wlan_objmgr_pdev *pdev,
 		req->fast_scan_period, req->fast_scan_max_cycles,
 		req->slow_scan_period);
 
+	wlan_pdev_obj_lock(pdev);
+	psoc = wlan_pdev_get_psoc(pdev);
+	wlan_pdev_obj_unlock(pdev);
+	ucfg_scan_register_pno_cb(psoc,
+		wlan_cfg80211_pno_callback, NULL);
 	ucfg_scan_get_pno_def_params(vdev, req);
 	status = ucfg_scan_pno_start(vdev, req);
 	if (QDF_IS_STATUS_ERROR(status)) {
@@ -371,13 +376,6 @@ int wlan_cfg80211_sched_scan_stop(struct wlan_objmgr_pdev *pdev,
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID);
 	return ret;
 }
-#else
-static inline void
-wlan_cfg80211_register_pno_cb(struct wlan_objmgr_psoc *psoc)
-{
-	return;
-}
-
 #endif /*FEATURE_WLAN_SCAN_PNO */
 
 /**
@@ -706,7 +704,6 @@ QDF_STATUS wlan_cfg80211_scan_priv_init(struct wlan_objmgr_pdev *pdev)
 	psoc = wlan_pdev_get_psoc(pdev);
 	wlan_pdev_obj_unlock(pdev);
 
-	wlan_cfg80211_register_pno_cb(psoc);
 	req_id = ucfg_scan_register_requester(psoc, "HDD",
 		wlan_cfg80211_scan_done_callback, NULL);