qcacmn: Add changes in scan req to support P2P search scan

Add changes to support P2P search using new scan module.
To support p2p search added vdev id and Broadcast mac address
in scan req also enable flags depending on scan req type.

Change-Id: I597f9f353da1b8b129f0ee16cd8eb7b7bbad2625
CRs-Fixed: 1095299
diff --git a/os_if/linux/scan/src/wlan_cfg80211_scan.c b/os_if/linux/scan/src/wlan_cfg80211_scan.c
index df60768..fc7ba08 100644
--- a/os_if/linux/scan/src/wlan_cfg80211_scan.c
+++ b/os_if/linux/scan/src/wlan_cfg80211_scan.c
@@ -392,6 +392,7 @@
 	struct pdev_osif_priv *osif_priv;
 	struct wlan_objmgr_psoc *psoc;
 	wlan_scan_id scan_id;
+	bool is_p2p_scan = false;
 
 	/* Get the vdev object */
 	vdev = wlan_objmgr_get_vdev_by_macaddr_from_pdev(pdev, dev->dev_addr,
@@ -427,6 +428,7 @@
 	}
 	/* fill the scan request structure */
 	req->vdev = vdev;
+	req->scan_req.vdev_id = wlan_vdev_get_id(vdev);
 	req->scan_req.scan_id = scan_id;
 	req->scan_req.scan_req_id = req_id;
 	/*
@@ -460,17 +462,58 @@
 	   (wlan_vdev_mlme_get_opmode(vdev) == QDF_P2P_GO_MODE))
 		req->scan_req.scan_f_passive = false;
 
-	if (!request->no_cck) {
+	if ((request->n_ssids == 1) && request->ssids &&
+	   !qdf_mem_cmp(&request->ssids[0], "DIRECT-", 7))
+		is_p2p_scan = true;
+
+	if (is_p2p_scan && request->no_cck) {
+		req->scan_req.adaptive_dwell_time_mode =
+			SCAN_DWELL_MODE_STATIC;
+		req->scan_req.dwell_time_active +=
+			P2P_SEARCH_DWELL_TIME_INC;
+		req->scan_req.repeat_probe_time =
+			req->scan_req.dwell_time_active / 5;
+		req->scan_req.burst_duration =
+			BURST_SCAN_MAX_NUM_OFFCHANNELS *
+			req->scan_req.dwell_time_active;
+		if (req->scan_req.burst_duration >
+		    P2P_SCAN_MAX_BURST_DURATION) {
+			uint8_t channels =
+				P2P_SCAN_MAX_BURST_DURATION /
+				req->scan_req.dwell_time_active;
+			if (channels)
+				req->scan_req.burst_duration =
+					channels *
+					req->scan_req.dwell_time_active;
+			else
+				req->scan_req.burst_duration =
+					P2P_SCAN_MAX_BURST_DURATION;
+		}
+		req->scan_req.scan_ev_bss_chan = false;
+	} else {
 		req->scan_req.scan_f_cck_rates = true;
 		if (!req->scan_req.num_ssids)
 			req->scan_req.scan_f_bcast_probe = true;
 		req->scan_req.scan_f_add_tpc_ie_in_probe = true;
-		req->scan_req.scan_f_filter_prb_req = true;
 	}
 	req->scan_req.scan_f_add_ds_ie_in_probe = true;
+	req->scan_req.scan_f_filter_prb_req = true;
 
+	req->scan_req.n_probes = (req->scan_req.repeat_probe_time > 0) ?
+		(req->scan_req.dwell_time_active /
+		req->scan_req.repeat_probe_time) : 0;
+
+	/*
+	 * FW require at least 1 MAC to send probe request.
+	 * If MAC is all 0 set it to BC addr as this is the address on
+	 * which fw will send probe req.
+	 */
+	req->scan_req.num_bssid = 1;
 	qdf_mem_copy(&req->scan_req.bssid_list[0].bytes, request->bssid,
 			QDF_MAC_ADDR_SIZE);
+	if (qdf_is_macaddr_zero(&req->scan_req.bssid_list[0]))
+		qdf_set_macaddr_broadcast(&req->scan_req.bssid_list[0]);
+
 	if (request->n_channels) {
 		char chl[(request->n_channels * 5) + 1];
 		int len = 0;
@@ -494,9 +537,7 @@
 	req->scan_req.num_chan = num_chan;
 
 	/* P2P increase the scan priority */
-	if ((request->n_ssids == 1) &&
-		(request->ssids != NULL) &&
-		qdf_mem_cmp(&request->ssids[0], "DIRECT-", 7))
+	if (is_p2p_scan)
 		req->scan_req.scan_priority = SCAN_PRIORITY_HIGH;
 	if (request->ie_len) {
 		req->scan_req.extraie.ptr = qdf_mem_malloc(request->ie_len);
@@ -510,6 +551,10 @@
 		qdf_mem_copy(req->scan_req.extraie.ptr, request->ie,
 				request->ie_len);
 	}
+
+	if (request->flags & NL80211_SCAN_FLAG_FLUSH)
+		ucfg_scan_flush_results(pdev, NULL);
+
 	/* Enqueue the scan request */
 	wlan_scan_request_enqueue(pdev, request, source, req->scan_req.scan_id);
 
@@ -524,8 +569,6 @@
 		}
 	}
 
-	if (request->flags & NL80211_SCAN_FLAG_FLUSH)
-		ucfg_scan_flush_results(pdev, NULL);
 end:
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_OSIF_ID);
 	return status;
diff --git a/umac/scan/core/src/wlan_scan_main.h b/umac/scan/core/src/wlan_scan_main.h
index 8d519b0..3b14ea7 100644
--- a/umac/scan/core/src/wlan_scan_main.h
+++ b/umac/scan/core/src/wlan_scan_main.h
@@ -57,8 +57,8 @@
 #ifdef CONFIG_MCL
 #define SCAN_ACTIVE_DWELL_TIME 40
 #define SCAN_PASSIVE_DWELL_TIME 110
-#define SCAN_MAX_REST_TIME 100
-#define SCAN_MIN_REST_TIME 50
+#define SCAN_MAX_REST_TIME 0
+#define SCAN_MIN_REST_TIME 0
 #define SCAN_BURST_DURATION 0
 #define SCAN_CONC_ACTIVE_DWELL_TIME 20
 #define SCAN_CONC_PASSIVE_DWELL_TIME 100
@@ -70,7 +70,7 @@
 #define SCAN_PROBE_DELAY 0
 #define SCAN_MAX_SCAN_TIME 30000
 #define SCAN_NUM_PROBES 2
-#define SCAN_NETWORK_IDLE_TIMEOUT 25
+#define SCAN_NETWORK_IDLE_TIMEOUT 0
 #else
 #define SCAN_ACTIVE_DWELL_TIME 105
 #define SCAN_PASSIVE_DWELL_TIME 300
@@ -229,6 +229,7 @@
 	uint16_t max_bss_per_pdev;
 	uint8_t max_num_scan_allowed;
 	enum scan_priority scan_priority;
+	enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode;
 	union {
 		struct {
 			uint32_t scan_f_passive:1,
diff --git a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
index f25a124..e0e383b 100644
--- a/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
+++ b/umac/scan/dispatcher/inc/wlan_scan_public_structs.h
@@ -46,6 +46,11 @@
 #define SCM_BSS_CAP_VALUE_UAPSD 1
 #define SCM_BSS_CAP_VALUE_5GHZ  2
 
+#define BURST_SCAN_MAX_NUM_OFFCHANNELS 3
+#define P2P_SCAN_MAX_BURST_DURATION 180
+/* Increase dwell time for P2P search in ms */
+#define P2P_SEARCH_DWELL_TIME_INC 20
+
 /* forward declaration */
 struct wlan_objmgr_vdev;
 struct wlan_objmgr_pdev;
@@ -444,6 +449,21 @@
 	uint32_t init_rest_time;
 };
 
+/**
+ * enum scan_dwelltime_adaptive_mode: dwelltime_mode
+ * @SCAN_DWELL_MODE_DEFAULT: Use firmware default mode
+ * @SCAN_DWELL_MODE_CONSERVATIVE: Conservative adaptive mode
+ * @SCAN_DWELL_MODE_MODERATE: Moderate adaptive mode
+ * @SCAN_DWELL_MODE_AGGRESSIVE: Aggressive adaptive mode
+ * @SCAN_DWELL_MODE_STATIC: static adaptive mode
+ */
+enum scan_dwelltime_adaptive_mode {
+	SCAN_DWELL_MODE_DEFAULT = 0,
+	SCAN_DWELL_MODE_CONSERVATIVE = 1,
+	SCAN_DWELL_MODE_MODERATE = 2,
+	SCAN_DWELL_MODE_AGGRESSIVE = 3,
+	SCAN_DWELL_MODE_STATIC = 4
+};
 
 /**
  * struct scan_req_params - start scan request parameter
@@ -579,6 +599,7 @@
 		};
 		uint32_t scan_flags;
 	};
+	enum scan_dwelltime_adaptive_mode adaptive_dwell_time_mode;
 	uint32_t burst_duration;
 	uint32_t num_chan;
 	uint32_t num_bssid;
diff --git a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c
index 27ab102..8e3d6b5 100644
--- a/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c
+++ b/umac/scan/dispatcher/src/wlan_scan_ucfg_api.c
@@ -360,6 +360,7 @@
 	scan_obj->scan_def.max_num_scan_allowed = SCAN_MAX_NUM_SCAN_ALLOWED;
 	scan_obj->scan_def.scan_priority = SCAN_PRIORITY;
 	scan_obj->scan_def.idle_time = SCAN_NETWORK_IDLE_TIMEOUT;
+	scan_obj->scan_def.adaptive_dwell_time_mode = SCAN_DWELL_MODE_DEFAULT;
 	/* scan contrl flags */
 	scan_obj->scan_def.scan_f_passive = true;
 	scan_obj->scan_def.scan_f_ofdm_rates = true;
@@ -478,6 +479,8 @@
 	req->scan_req.probe_delay = def->probe_delay;
 	req->scan_req.burst_duration = def->burst_duration;
 	req->scan_req.n_probes = def->num_probes;
+	req->scan_req.adaptive_dwell_time_mode =
+		def->adaptive_dwell_time_mode;
 	req->scan_req.scan_flags = def->scan_flags;
 	req->scan_req.scan_events = def->scan_events;