Explorar el Código

qcacmn: Drop scan events if scan req not in active queue

Host driver forece fully frees scan requests in below cases:
1. vdev being deleted
2. command timed out
In above cases scan request is freed and scan module
posts scan cancelled event internally to registered handlers.
Drop any event received after scan is cancelled.

Change-Id: Id66b6cc6a400916af9bfaf0c09dbb92d7f27db4e
CRs-Fixed: 2123090
Om Prakash Tripathi hace 7 años
padre
commit
cc9b3a4856
Se han modificado 1 ficheros con 30 adiciones y 5 borrados
  1. 30 5
      umac/scan/core/src/wlan_scan_manager.c

+ 30 - 5
umac/scan/core/src/wlan_scan_manager.c

@@ -562,6 +562,7 @@ scm_scan_event_handler(struct scheduler_msg *msg)
 	struct wlan_objmgr_vdev *vdev;
 	struct scan_event *event;
 	struct scan_event_info *event_info;
+	struct wlan_serialization_command cmd = {0,};
 
 	if (!msg || !msg->bodyptr) {
 		scm_err("msg: %pK, bodyptr: %pK", msg, msg->bodyptr);
@@ -571,9 +572,37 @@ scm_scan_event_handler(struct scheduler_msg *msg)
 	vdev = event_info->vdev;
 	event = &(event_info->event);
 
-	scm_info("vdev: %d, type: %d, reason: %d, freq: %d, req: %d, scanid: %d",
+	scm_info("vdevid:%d, type:%d, reason:%d, freq:%d, reqstr:%d, scanid:%d",
 		event->vdev_id, event->type, event->reason, event->chan_freq,
 		event->requester, event->scan_id);
+	/*
+	 * NLO requests are never queued, so post NLO events
+	 * without checking for their presence in active queue.
+	 */
+	switch (event->type) {
+	case SCAN_EVENT_TYPE_NLO_COMPLETE:
+	case SCAN_EVENT_TYPE_NLO_MATCH:
+		scm_pno_event_handler(vdev, event);
+		goto exit;
+	default:
+		break;
+	}
+
+	cmd.cmd_type = WLAN_SER_CMD_SCAN;
+	cmd.cmd_id = event->scan_id;
+	cmd.cmd_cb = NULL;
+	cmd.umac_cmd = NULL;
+	cmd.source = WLAN_UMAC_COMP_SCAN;
+	cmd.is_high_priority = false;
+	cmd.vdev = vdev;
+	if (!wlan_serialization_is_cmd_present_in_active_queue(NULL, &cmd)) {
+		/*
+		 * We received scan event for an already completed/cancelled
+		 * scan request. Drop this event.
+		 */
+		scm_warn("Received scan event while request not in active queue");
+		goto exit;
+	}
 
 	switch (event->type) {
 	case SCAN_EVENT_TYPE_COMPLETED:
@@ -581,10 +610,6 @@ scm_scan_event_handler(struct scheduler_msg *msg)
 	case SCAN_EVENT_TYPE_DEQUEUED:
 		scm_release_serialization_command(vdev, event->scan_id);
 		break;
-	case SCAN_EVENT_TYPE_NLO_COMPLETE:
-	case SCAN_EVENT_TYPE_NLO_MATCH:
-		scm_pno_event_handler(vdev, event);
-		goto exit;
 	default:
 		break;
 	}