Browse Source

qcacmn: Introduce new api to disable the vdev serialization queue

MCL presently sends the vdev delete to firmware via serialization,
with a new requirement vdev delete cannot be sent via serialization.
So, disable the serialization for the vdev before sending the vdev
delete to firmware.

Change-Id: Ieffccaf815eff7627d39b0191a7be121e85965fd
CRs-Fixed: 2566113
Arun Kumar Khandavalli 5 years ago
parent
commit
5377f457a1

+ 10 - 0
umac/cmn_services/serialization/inc/wlan_serialization_api.h

@@ -701,4 +701,14 @@ void wlan_serialization_purge_all_pending_cmd_by_vdev_id(
 void wlan_serialization_purge_all_scan_cmd_by_vdev_id(
 void wlan_serialization_purge_all_scan_cmd_by_vdev_id(
 					struct wlan_objmgr_pdev *pdev,
 					struct wlan_objmgr_pdev *pdev,
 					uint8_t vdev_id);
 					uint8_t vdev_id);
+
+/**
+ * wlan_ser_vdev_queue_disable -Disable vdev specific serialization queue
+ * @vdev: Vdev Object
+ *
+ * This function disables the serialization for the vdev queue
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS wlan_ser_vdev_queue_disable(struct wlan_objmgr_vdev *vdev);
 #endif
 #endif

+ 44 - 0
umac/cmn_services/serialization/src/wlan_serialization_api.c

@@ -910,3 +910,47 @@ void wlan_serialization_purge_all_scan_cmd_by_vdev_id(
 
 
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_SERIALIZATION_ID);
 	wlan_objmgr_vdev_release_ref(vdev, WLAN_SERIALIZATION_ID);
 }
 }
+
+QDF_STATUS wlan_ser_vdev_queue_disable(struct wlan_objmgr_vdev *vdev)
+{
+	struct wlan_objmgr_pdev *pdev;
+	struct wlan_ser_vdev_obj *ser_vdev_obj;
+	struct wlan_serialization_vdev_queue *vdev_queue;
+	struct wlan_ser_pdev_obj *ser_pdev_obj;
+	struct wlan_serialization_pdev_queue *pdev_q;
+
+	pdev = wlan_vdev_get_pdev(vdev);
+	if (!pdev) {
+		ser_err("invalid PDEV object");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	ser_pdev_obj = wlan_serialization_get_pdev_obj(pdev);
+	if (!ser_pdev_obj) {
+		ser_err("invalid ser_pdev_obj");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	ser_vdev_obj = wlan_serialization_get_vdev_obj(vdev);
+	if (!ser_vdev_obj) {
+		ser_err("invalid ser_vdev_obj");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	pdev_q = &ser_pdev_obj->pdev_q[SER_PDEV_QUEUE_COMP_NON_SCAN];
+
+	vdev_queue = wlan_serialization_get_vdev_queue_obj(
+			ser_vdev_obj, WLAN_SER_CMD_NONSCAN);
+	if (!vdev_queue) {
+		ser_err("invalid vdev_queue object");
+		return QDF_STATUS_E_INVAL;
+	}
+
+	wlan_serialization_acquire_lock(&pdev_q->pdev_queue_lock);
+	vdev_queue->queue_disable = true;
+	wlan_serialization_release_lock(&pdev_q->pdev_queue_lock);
+	ser_info("Disabling the serialization for vdev:%d",
+		 wlan_vdev_get_id(vdev));
+
+	return QDF_STATUS_SUCCESS;
+}