From cc9b3a48563c8720a8ed71d727e7055f50b7e9da Mon Sep 17 00:00:00 2001 From: Om Prakash Tripathi Date: Mon, 9 Oct 2017 12:26:56 +0530 Subject: [PATCH] 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 --- umac/scan/core/src/wlan_scan_manager.c | 35 ++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/umac/scan/core/src/wlan_scan_manager.c b/umac/scan/core/src/wlan_scan_manager.c index 16ab6dcfbe69..e1e9ca229a49 100644 --- a/umac/scan/core/src/wlan_scan_manager.c +++ b/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; }