net: wireless: bcmdhd: Send all pno scans' results

Remove ptr clearance so as to allow sched scan results as
long as supplicant doesnt issue stop.
Protect access to the sched_scan_req ptr.

Bug: 25394415

Change-Id: I381d586a2fb0a42462855e7aa80fe0d7ed723ce1
Signed-off-by: Ashwin <ashwin.bhat@broadcom.com>
diff --git a/drivers/net/wireless/bcmdhd/wl_cfg80211.c b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
index ba68d2c..ee13c6d 100644
--- a/drivers/net/wireless/bcmdhd/wl_cfg80211.c
+++ b/drivers/net/wireless/bcmdhd/wl_cfg80211.c
@@ -3212,6 +3212,9 @@
 	}
 #endif
 #ifdef WL_SCHED_SCAN
+	/* Locks are taken in wl_cfg80211_sched_scan_stop()
+	 * A start scan occuring during connect is unlikely
+	 */
 	if (wl->sched_scan_req) {
 		wl_cfg80211_sched_scan_stop(wiphy, wl_to_prmry_ndev(wl));
 	}
@@ -6500,6 +6503,7 @@
 	int ssid_cnt = 0;
 	int i;
 	int ret = 0;
+	unsigned long flags;
 
 	WL_DBG(("Enter \n"));
 	WL_PNO((">>> SCHED SCAN START\n"));
@@ -6542,7 +6546,9 @@
 			WL_ERR(("PNO setup failed!! ret=%d \n", ret));
 			return -EINVAL;
 		}
+		spin_lock_irqsave(&wl->cfgdrv_lock, flags);
 		wl->sched_scan_req = request;
+		spin_unlock_irqrestore(&wl->cfgdrv_lock, flags);
 	} else {
 		return -EINVAL;
 	}
@@ -6554,6 +6560,7 @@
 wl_cfg80211_sched_scan_stop(struct wiphy *wiphy, struct net_device *dev)
 {
 	struct wl_priv *wl = wiphy_priv(wiphy);
+	unsigned long flags;
 
 	WL_DBG(("Enter \n"));
 	WL_PNO((">>> SCHED SCAN STOP\n"));
@@ -6565,10 +6572,10 @@
 		WL_PNO((">>> Sched scan running. Aborting it..\n"));
 		wl_notify_escan_complete(wl, dev, true, true);
 	}
-
-	 wl->sched_scan_req = NULL;
-	 wl->sched_scan_running = FALSE;
-
+	spin_lock_irqsave(&wl->cfgdrv_lock, flags);
+	wl->sched_scan_req = NULL;
+	wl->sched_scan_running = FALSE;
+	spin_unlock_irqrestore(&wl->cfgdrv_lock, flags);
 	return 0;
 }
 #endif /* WL_SCHED_SCAN */
@@ -8997,11 +9004,14 @@
 	spin_lock_irqsave(&wl->cfgdrv_lock, flags);
 #ifdef WL_SCHED_SCAN
 	if (wl->sched_scan_req && !wl->scan_request) {
-		WL_PNO((">>> REPORTING SCHED SCAN RESULTS \n"));
-		if (!aborted)
+		int count;
+
+		count = wl->bss_list ? wl->bss_list->count : 0;
+		if (!aborted) {
 			cfg80211_sched_scan_results(wl->sched_scan_req->wiphy);
+			printk(">> SCHED SCAN RESULT %d\n", count);
+		}
 		wl->sched_scan_running = FALSE;
-		wl->sched_scan_req = NULL;
 	}
 #endif /* WL_SCHED_SCAN */
 	if (likely(wl->scan_request)) {