Bladeren bron

qcacmn: Add flush callback for scan module

Components are required to provide flush callback to scheduler which
gets invoked for all pending commands in scheduler queue when scheduler
thread is going down.
Added flush callback for scan so that command cleanup can be done.

Change-Id: I990a5e14db1498e13a2eeeaa605b44593b8442f1
CRs-Fixed: 2056542
Om Prakash Tripathi 7 jaren geleden
bovenliggende
commit
62d0380257

+ 72 - 0
umac/scan/core/src/wlan_scan_manager.c

@@ -600,3 +600,75 @@ exit:
 
 	return QDF_STATUS_SUCCESS;
 }
+
+QDF_STATUS scm_scan_event_flush_callback(struct scheduler_msg *msg)
+{
+	struct wlan_objmgr_vdev *vdev;
+	struct scan_event_info *event_info;
+
+	if (!msg || !msg->bodyptr) {
+		scm_err("msg: %p, bodyptr: %p", msg, msg->bodyptr);
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+	event_info = msg->bodyptr;
+	vdev = event_info->vdev;
+
+	/* free event info memory */
+	qdf_mem_free(event_info);
+	wlan_objmgr_vdev_release_ref(vdev, WLAN_SCAN_ID);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS scm_bcn_probe_flush_callback(struct scheduler_msg *msg)
+{
+	struct scan_bcn_probe_event *bcn;
+
+	bcn = msg->bodyptr;
+
+	if (!bcn) {
+		scm_err("bcn is NULL");
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+	if (bcn->psoc)
+		wlan_objmgr_psoc_release_ref(bcn->psoc, WLAN_SCAN_ID);
+	if (bcn->rx_data)
+		qdf_mem_free(bcn->rx_data);
+	if (bcn->buf)
+		qdf_nbuf_free(bcn->buf);
+	qdf_mem_free(bcn);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS scm_scan_start_flush_callback(struct scheduler_msg *msg)
+{
+	struct scan_start_request *req;
+
+	if (!msg || !msg->bodyptr) {
+		scm_err("msg: 0x%p, bodyptr: 0x%p", msg, msg->bodyptr);
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+	req = msg->bodyptr;
+	wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID);
+	scm_scan_free_scan_request_mem(req);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS scm_scan_cancel_flush_callback(struct scheduler_msg *msg)
+{
+	struct scan_cancel_request *req;
+
+	if (!msg || !msg->bodyptr) {
+		scm_err("msg: 0x%p, bodyptr: 0x%p", msg, msg->bodyptr);
+		return QDF_STATUS_E_NULL_VALUE;
+	}
+
+	req = msg->bodyptr;
+	wlan_objmgr_vdev_release_ref(req->vdev, WLAN_SCAN_ID);
+	/* Free cancel request memory */
+	qdf_mem_free(req);
+
+	return QDF_STATUS_SUCCESS;
+}

+ 40 - 0
umac/scan/core/src/wlan_scan_manager.h

@@ -85,4 +85,44 @@ QDF_STATUS scm_scan_event_handler(struct scheduler_msg *msg);
  */
 QDF_STATUS scm_scan_free_scan_request_mem(struct scan_start_request *req);
 
+/**
+ * scm_scan_event_flush_callback() - flush scan event
+ * @msg: scheduler message object containing scan event
+ *
+ * This function call is invoked when scheduler thread is going down
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS scm_scan_event_flush_callback(struct scheduler_msg *msg);
+
+/**
+ * scm_bcn_probe_flush_callback() - flush beacon/probe response
+ * @msg: scheduler message object containing scan event
+ *
+ * This function call is invoked when scheduler thread is going down
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS scm_bcn_probe_flush_callback(struct scheduler_msg *msg);
+
+/**
+ * scm_scan_start_flush_callback() - flush scan start request
+ * @msg: scheduler message object containing scan event
+ *
+ * This function call is invoked when scheduler thread is going down
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS scm_scan_start_flush_callback(struct scheduler_msg *msg);
+
+/**
+ * scm_scan_cancel_flush_callback() - flush scan cancel request
+ * @msg: scheduler message object containing scan event
+ *
+ * This function call is invoked when scheduler thread is going down
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS scm_scan_cancel_flush_callback(struct scheduler_msg *msg);
+
 #endif

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

@@ -209,6 +209,7 @@ tgt_scan_event_handler(struct wlan_objmgr_psoc *psoc,
 	}
 	msg.bodyptr = event_info;
 	msg.callback = scm_scan_event_handler;
+	msg.flush_callback = scm_scan_event_flush_callback;
 
 	status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg);
 	if (QDF_IS_STATUS_ERROR(status)) {
@@ -269,6 +270,7 @@ QDF_STATUS tgt_scan_bcn_probe_rx_callback(struct wlan_objmgr_psoc *psoc,
 
 	msg.bodyptr = bcn;
 	msg.callback = scm_handle_bcn_probe;
+	msg.flush_callback = scm_bcn_probe_flush_callback;
 
 	status = scheduler_post_msg(QDF_MODULE_ID_TARGET_IF, &msg);
 
@@ -279,6 +281,7 @@ QDF_STATUS tgt_scan_bcn_probe_rx_callback(struct wlan_objmgr_psoc *psoc,
 		qdf_mem_free(bcn);
 		qdf_nbuf_free(buf);
 	}
+
 	return status;
 }
 

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

@@ -358,6 +358,7 @@ ucfg_scan_start(struct scan_start_request *req)
 
 	msg.bodyptr = req;
 	msg.callback = scm_scan_start_req;
+	msg.flush_callback = scm_scan_start_flush_callback;
 
 	status = scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg);
 	if (QDF_IS_STATUS_ERROR(status)) {
@@ -393,6 +394,7 @@ ucfg_scan_cancel(struct scan_cancel_request *req)
 
 	msg.bodyptr = req;
 	msg.callback = scm_scan_cancel_req;
+	msg.flush_callback = scm_scan_cancel_flush_callback;
 
 	status = scheduler_post_msg(QDF_MODULE_ID_OS_IF, &msg);
 	if (QDF_IS_STATUS_ERROR(status)) {