Преглед изворни кода

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
Abhishek Singh пре 8 година
родитељ
комит
f9297e523b

+ 50 - 7
os_if/linux/scan/src/wlan_cfg80211_scan.c

@@ -392,6 +392,7 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev,
 	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 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev,
 	}
 	/* 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 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev,
 	   (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 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev,
 	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 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev,
 		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 @@ int wlan_cfg80211_scan(struct wlan_objmgr_pdev *pdev,
 		}
 	}
 
-	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;

+ 4 - 3
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 @@ struct scan_default_params {
 	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,

+ 21 - 0
umac/scan/dispatcher/inc/wlan_scan_public_structs.h

@@ -46,6 +46,11 @@ typedef uint32_t wlan_scan_id;
 #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 @@ struct scan_extra_params_legacy {
 	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 @@ struct scan_req_params {
 		};
 		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;

+ 3 - 0
umac/scan/dispatcher/src/wlan_scan_ucfg_api.c

@@ -360,6 +360,7 @@ wlan_scan_global_init(struct wlan_scan_obj *scan_obj)
 	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 @@ ucfg_scan_init_default_params(struct wlan_objmgr_vdev *vdev,
 	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;