Преглед на файлове

qcacmn: create the vdev response timers in psoc_mlme

Move the vdev response timer from the vdev object manager structure
to the psoc mlme structure.

Change-Id: Ieb87ac6549aa23e0beb61441fea459d3db78c2f3
CRs-Fixed: 2563410
Arun Kumar Khandavalli преди 5 години
родител
ревизия
614d1e4476

+ 94 - 0
target_if/mlme/psoc/inc/target_if_psoc_timer_tx_ops.h

@@ -0,0 +1,94 @@
+
+/*
+ * Copyright (c) 2019 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: target_if_psoc_timer_tx_ops.h
+ *
+ * This file provide declaration for APIs registered through lmac Tx Ops
+ */
+
+#ifndef __TARGET_IF_PSOC_TIMER_TX_OPS_H__
+#define __TARGET_IF_PSOC_TIMER_TX_OPS_H__
+
+/**
+ * target_if_psoc_vdev_rsp_timer_inuse() - API to check if the response timer
+ * for vdev is inuse
+ * @psoc: Psoc object
+ * @vdev_id: Vdev object id
+ *
+ * Return: QDF_STATUS_E_ALREADY in case the timer is inuse or QDF_STATUS_SUCCESS
+ */
+QDF_STATUS target_if_psoc_vdev_rsp_timer_inuse(struct wlan_objmgr_psoc *psoc,
+					       uint8_t vdev_id);
+
+/**
+ * target_if_flush_psoc_vdev_timers() - API to flush target_if response timers
+ * for vdev
+ * @psoc: pointer to psoc object
+ *
+ * This API is used to flush target_if response timer. This API used while
+ * wlan driver shutdown.
+ *
+ * Return: none
+ */
+void target_if_flush_psoc_vdev_timers(struct wlan_objmgr_psoc *psoc);
+
+/**
+ * target_if_psoc_vdev_rsp_timer_init() - API to initialize response timers for
+ * vdev from psoc
+ * @psoc: pointer to psoc object
+ * @vdev_id: vdev id for which response timer to be retrieved
+ *
+ * This API is used to initialize vdev response timer for vdev-id.
+ *
+ * Return: QDF_STATUS
+ */
+QDF_STATUS target_if_psoc_vdev_rsp_timer_init(struct wlan_objmgr_psoc *psoc,
+					      uint8_t vdev_id);
+
+/**
+ * target_if_psoc_vdev_rsp_timer_deinit() - API to de-initialize response timers
+ * for vdev from psoc
+ * @psoc: pointer to psoc object
+ * @vdev_id: vdev id for which response timer to be retrieved
+ *
+ * This API is used to de-initialize vdev response timer from vdev-id.
+ *
+ * Return: none
+ */
+void target_if_psoc_vdev_rsp_timer_deinit(struct wlan_objmgr_psoc *psoc,
+					  uint8_t vdev_id);
+
+/**
+ * target_if_vdev_mgr_rsp_timer_mod() - API to modify time of response timers
+ * for vdev from psoc
+ * @psoc: pointer to psoc object
+ * @vdev_id: vdev id for which response timer to be retrieved
+ * @mseconds:  milli seconds
+ *
+ * This API is used to modify vdev response timer for vdev-id.
+ *
+ * Return: none
+ */
+QDF_STATUS target_if_vdev_mgr_rsp_timer_mod(
+					struct wlan_objmgr_psoc *psoc,
+					uint8_t vdev_id,
+					int mseconds);
+
+#endif

+ 177 - 0
target_if/mlme/psoc/src/target_if_psoc_timer_tx_ops.c

@@ -0,0 +1,177 @@
+/*
+ * Copyright (c) 2019 The Linux Foundation. All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software for
+ * any purpose with or without fee is hereby granted, provided that the
+ * above copyright notice and this permission notice appear in all
+ * copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
+ * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
+ * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
+ * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/**
+ * DOC: target_if_psoc_timer_tx_ops.c
+ *
+ * This file provide definition for APIs registered through lmac Tx Ops
+ */
+
+#include <wlan_objmgr_psoc_obj.h>
+#include <wlan_mlme_dbg.h>
+#include <target_if_psoc_timer_tx_ops.h>
+#include <wlan_vdev_mgr_tgt_if_rx_defs.h>
+#include <target_if_vdev_mgr_tx_ops.h>
+#include <target_if_vdev_mgr_rx_ops.h>
+
+QDF_STATUS target_if_psoc_vdev_rsp_timer_inuse(struct wlan_objmgr_psoc *psoc,
+					       uint8_t vdev_id)
+{
+	struct vdev_response_timer *vdev_rsp;
+	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
+
+	if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) {
+		mlme_err("Invalid vdev id passed VDEV_%d", vdev_id);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
+	if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
+	if (!vdev_rsp) {
+		mlme_err("vdev response is NULL for VDEV_%d PSOC_%d",
+			 vdev_id, wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	if (qdf_atomic_read(&vdev_rsp->rsp_timer_inuse)) {
+		mlme_err("vdev response timer still inuse VDEV_%d PSOC_%d",
+			 vdev_id, wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_ALREADY;
+	}
+
+	return QDF_STATUS_SUCCESS;
+}
+
+QDF_STATUS target_if_psoc_vdev_rsp_timer_init(struct wlan_objmgr_psoc *psoc,
+					      uint8_t vdev_id)
+{
+	struct vdev_response_timer *vdev_rsp;
+	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
+
+	if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) {
+		mlme_err("Invalid vdev id passed VDEV_%d PSOC_%d", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
+	if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
+	if (!vdev_rsp) {
+		mlme_err("vdev response is NULL for VDEV_%d PSOC_%d",
+			 vdev_id, wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	vdev_rsp->psoc = psoc;
+	vdev_rsp->vdev_id = vdev_id;
+	qdf_timer_init(NULL, &vdev_rsp->rsp_timer,
+		       target_if_vdev_mgr_rsp_timer_mgmt_cb,
+		       vdev_rsp, QDF_TIMER_TYPE_WAKE_APPS);
+	qdf_atomic_init(&vdev_rsp->rsp_timer_inuse);
+
+	return QDF_STATUS_SUCCESS;
+}
+
+void target_if_psoc_vdev_rsp_timer_deinit(struct wlan_objmgr_psoc *psoc,
+					  uint8_t vdev_id)
+{
+	struct vdev_response_timer *vdev_rsp;
+	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
+
+	if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) {
+		mlme_err("Invalid vdev id passed VDEV_%d PSOC_%d", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return;
+	}
+
+	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
+	if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return;
+	}
+
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
+	if (!vdev_rsp) {
+		mlme_err("vdev response is NULL for VDEV_%d PSOC_%d",
+			 vdev_id, wlan_psoc_get_id(psoc));
+		return;
+	}
+
+	qdf_timer_free(&vdev_rsp->rsp_timer);
+	qdf_atomic_set(&vdev_rsp->rsp_timer_inuse, 0);
+	vdev_rsp->psoc = NULL;
+}
+
+void target_if_flush_psoc_vdev_timers(struct wlan_objmgr_psoc *psoc)
+{
+	struct vdev_response_timer *vdev_rsp;
+	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
+	int i;
+
+	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
+	if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("PSOC_%d No Rx Ops", wlan_psoc_get_id(psoc));
+		return;
+	}
+
+	for (i = 0; i < WLAN_UMAC_PSOC_MAX_VDEVS; i++) {
+		vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
+								     i);
+		if (vdev_rsp && qdf_timer_sync_cancel(&vdev_rsp->rsp_timer))
+			target_if_vdev_mgr_rsp_timer_cb(vdev_rsp);
+	}
+}
+
+QDF_STATUS target_if_vdev_mgr_rsp_timer_mod(
+					struct wlan_objmgr_psoc *psoc,
+					uint8_t vdev_id,
+					int mseconds)
+{
+	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
+	struct vdev_response_timer *vdev_rsp;
+
+	if (!psoc) {
+		mlme_err("Invalid input");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
+	if (!rx_ops && !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
+	qdf_timer_mod(&vdev_rsp->rsp_timer, mseconds);
+	return QDF_STATUS_SUCCESS;
+}
+

+ 8 - 27
target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_rx_ops.h

@@ -51,33 +51,6 @@ static inline bool target_if_vdev_mgr_is_panic_allowed(void)
 }
 #endif
 
-/**
- * target_if_timer_flush_handler() - API to handle target_if timer flush
- * request
- * @pdev: pointer to pdev object
- * @object: pointer to vdev object
- * @arg: pointer to arguments passed
- *
- * This is a target_if timer flush handler used to flush target_if response
- * timer. This API used while wlan driver shut down.
- *
- * Return: none
- */
-void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev,
-				   void *object,
-				   void *arg);
-
-/**
- * target_if_flush_vdev_timers() - API to flush target_if response timers
- * for vdev
- * @pdev: pointer to pdev object
- *
- * This API is used to flush target_if response timer. This API used while
- * wlan driver shut down.
- *
- * Return: none
- */
-void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev);
 
 /**
  * target_if_vdev_mgr_offload_bcn_tx_status_handler() - API to handle beacon
@@ -175,4 +148,12 @@ QDF_STATUS target_if_vdev_mgr_wmi_event_register(
 QDF_STATUS target_if_vdev_mgr_wmi_event_unregister(
 					struct wlan_objmgr_psoc *psoc);
 
+/**
+ * target_if_vdev_mgr_rsp_timer_cb() - function to handle vdev related timeouts
+ * @vdev_rsp: pointer to vdev response timer
+ *
+ * Return: NONE
+ */
+void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp);
+
 #endif /* __TARGET_IF_VDEV_MGR_RX_OPS_H__ */

+ 14 - 15
target_if/mlme/vdev_mgr/inc/target_if_vdev_mgr_tx_ops.h

@@ -63,24 +63,22 @@ target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops);
 
 /**
  * target_if_vdev_mgr_assert_mgmt() - vdev assert mgmt api
- * @vdev: pointer to objmgr vdev
- * @vdev_rsp: pointer to vdev mlme response timer
- * @set_bit: bit to be set
+ * @PSOC: pointer to objmgr psoc
+ * @vdev_id: vdev id
  *
  * Return: NA
  */
 #ifdef VDEV_ASSERT_MANAGEMENT
 static inline void target_if_vdev_mgr_assert_mgmt(
-					struct wlan_objmgr_vdev *vdev,
-					struct vdev_response_timer *vdev_rsp,
-					uint8_t set_bit)
+					struct wlan_objmgr_psoc *psoc,
+					uint8_t vdev_id)
 {
 }
 #else
 static inline void target_if_vdev_mgr_assert_mgmt(
-					struct wlan_objmgr_vdev *vdev,
-					struct vdev_response_timer *vdev_rsp,
-					uint8_t set_bit)
+					struct wlan_objmgr_psoc *psoc,
+					uint8_t vdev_id)
+
 {
 	QDF_ASSERT(0);
 }
@@ -89,14 +87,15 @@ static inline void target_if_vdev_mgr_assert_mgmt(
 /**
  * target_if_vdev_mgr_rsp_timer_stop() - API to stop response timer for
  * vdev manager operations
- * @vdev: pointer to vdev object
- * @vdev_rsp: pointer to response timer
- * @clear_bit: acton bit
+ * @psoc: pointer to psoc object
+ * @vdev_rsp: vdev response timer
+ * @clear_bit: enum of wlan_vdev_mgr_tgt_if_rsp_bit
  *
  * Return: QDF_STATUS_SUCCESS on success, QDF_STATUS_E_** on error
  */
 QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
-					struct wlan_objmgr_vdev *vdev,
-					struct vdev_response_timer *vdev_rsp,
-					uint8_t clear_bit);
+				struct wlan_objmgr_psoc *psoc,
+				struct vdev_response_timer *vdev_rsp,
+				enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit);
+
 #endif /* __TARGET_IF_VDEV_MGR_TX_OPS_H__ */

+ 89 - 136
target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_rx_ops.c

@@ -32,12 +32,10 @@
 #include <wlan_vdev_mlme_main.h>
 #include <wmi_unified_vdev_api.h>
 
-static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
+void target_if_vdev_mgr_rsp_timer_cb(struct vdev_response_timer *vdev_rsp)
 {
-	struct wlan_objmgr_vdev *vdev = arg;
 	struct wlan_objmgr_psoc *psoc;
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
-	struct vdev_response_timer *vdev_rsp;
 	struct crash_inject param;
 	struct wmi_unified *wmi_handle;
 	struct vdev_start_response start_rsp = {0};
@@ -47,22 +45,23 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 	uint8_t vdev_id;
 	uint16_t rsp_pos = RESPONSE_BIT_MAX;
 
-	vdev_id = wlan_vdev_get_id(vdev);
-	mlme_debug("Response timer expired for VDEV %d", vdev_id);
+	if (!vdev_rsp) {
+		mlme_err("Vdev response timer is NULL");
+		return;
+	}
 
-	psoc = wlan_vdev_get_psoc(vdev);
+	psoc = vdev_rsp->psoc;
 	if (!psoc) {
 		mlme_err("PSOC is NULL");
 		return;
 	}
 
 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
-	if (!rx_ops || !rx_ops->vdev_mgr_get_response_timer_info) {
+	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
 		mlme_err("No Rx Ops");
 		return;
 	}
 
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
 	if (!qdf_atomic_test_bit(START_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
 	    !qdf_atomic_test_bit(RESTART_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
 	    !qdf_atomic_test_bit(STOP_RESPONSE_BIT, &vdev_rsp->rsp_status) &&
@@ -70,7 +69,15 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 	    !qdf_atomic_test_bit(
 			PEER_DELETE_ALL_RESPONSE_BIT,
 			&vdev_rsp->rsp_status)) {
-		mlme_debug("No response bit is set, ignoring actions");
+		mlme_debug("No response bit is set, ignoring actions :%d",
+			   vdev_rsp->vdev_id);
+		return;
+	}
+
+	vdev_id = vdev_rsp->vdev_id;
+	if (vdev_id >= WLAN_UMAC_PSOC_MAX_VDEVS) {
+		mlme_err("Invalid VDEV_%d PSOC_%d", vdev_id,
+			 wlan_psoc_get_id(psoc));
 		return;
 	}
 
@@ -79,7 +86,7 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 				&vdev_rsp->rsp_status) ||
 	    qdf_atomic_test_bit(RESTART_RESPONSE_BIT,
 				&vdev_rsp->rsp_status)) {
-		start_rsp.vdev_id = wlan_vdev_get_id(vdev);
+		start_rsp.vdev_id = vdev_id;
 		start_rsp.status = WLAN_MLME_HOST_VDEV_START_TIMEOUT;
 		if (qdf_atomic_test_bit(START_RESPONSE_BIT,
 					&vdev_rsp->rsp_status)) {
@@ -92,31 +99,28 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 			rsp_pos = RESTART_RESPONSE_BIT;
 		}
 
-		target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos);
+		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
 
 		rx_ops->vdev_mgr_start_response(psoc, &start_rsp);
 	} else if (qdf_atomic_test_bit(STOP_RESPONSE_BIT,
 				       &vdev_rsp->rsp_status)) {
 		rsp_pos = STOP_RESPONSE_BIT;
-		stop_rsp.vdev_id = wlan_vdev_get_id(vdev);
-
-		target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos);
+		stop_rsp.vdev_id = vdev_id;
+		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
 
 		rx_ops->vdev_mgr_stop_response(psoc, &stop_rsp);
 	} else if (qdf_atomic_test_bit(DELETE_RESPONSE_BIT,
 				       &vdev_rsp->rsp_status)) {
-		del_rsp.vdev_id = wlan_vdev_get_id(vdev);
+		del_rsp.vdev_id = vdev_id;
 		rsp_pos = DELETE_RESPONSE_BIT;
-
-		target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos);
+		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
 
 		rx_ops->vdev_mgr_delete_response(psoc, &del_rsp);
 	} else if (qdf_atomic_test_bit(PEER_DELETE_ALL_RESPONSE_BIT,
 				&vdev_rsp->rsp_status)) {
-		peer_del_all_rsp.vdev_id = wlan_vdev_get_id(vdev);
+		peer_del_all_rsp.vdev_id = vdev_id;
 		rsp_pos = PEER_DELETE_ALL_RESPONSE_BIT;
-
-		target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, rsp_pos);
+		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, rsp_pos);
 
 		rx_ops->vdev_mgr_peer_delete_all_response(
 				psoc,
@@ -134,7 +138,7 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 	}
 
 	/* Trigger fw recovery to collect fw dump */
-	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
+	wmi_handle = GET_WMI_HDL_FROM_PSOC(psoc);
 	if (wmi_handle) {
 		mlme_err("PSOC_%d VDEV_%d: Self recovery, %s rsp timeout",
 			 wlan_psoc_get_id(psoc), vdev_id,
@@ -150,46 +154,31 @@ static void target_if_vdev_mgr_rsp_timer_cb(void *arg)
 	}
 }
 
-void target_if_timer_flush_handler(struct wlan_objmgr_pdev *pdev,
-				   void *object,
-				   void *arg)
+#ifdef SERIALIZE_VDEV_RESP
+static QDF_STATUS target_if_vdev_mgr_rsp_flush_cb(struct scheduler_msg *msg)
 {
 	struct vdev_response_timer *vdev_rsp;
-	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
 	struct wlan_objmgr_psoc *psoc;
-	struct wlan_objmgr_vdev *vdev = object;
 
-	psoc = wlan_pdev_get_psoc(pdev);
-	if (!psoc) {
-		mlme_err("PSOC is NULL");
-		return;
+	if (!msg->bodyptr) {
+		mlme_err("Message bodyptr is NULL");
+		return QDF_STATUS_E_INVAL;
 	}
 
-	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
-	if (!rx_ops || !rx_ops->vdev_mgr_get_response_timer_info) {
-		mlme_err("No Rx Ops");
-		return;
+	vdev_rsp = msg->bodyptr;
+	if (!vdev_rsp) {
+		mlme_err("vdev response timer is NULL");
+		return QDF_STATUS_E_INVAL;
 	}
 
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
-	if (qdf_timer_sync_cancel(&vdev_rsp->rsp_timer))
-		target_if_vdev_mgr_rsp_timer_cb(vdev);
-}
-
-void target_if_flush_vdev_timers(struct wlan_objmgr_pdev *pdev)
-{
-	wlan_objmgr_pdev_iterate_obj_list(pdev, WLAN_VDEV_OP,
-					  target_if_timer_flush_handler,
-					  NULL, true, WLAN_VDEV_TARGET_IF_ID);
-}
-
-#ifdef SERIALIZE_VDEV_RESP
-static QDF_STATUS target_if_vdev_mgr_rsp_flush_cb(struct scheduler_msg *msg)
-{
-	struct wlan_objmgr_vdev *vdev = msg->bodyptr;
+	psoc = vdev_rsp->psoc;
+	if (!psoc) {
+		mlme_err("PSOC is NULL");
+		return QDF_STATUS_E_INVAL;
+	}
 
-	if (vdev)
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
+	if (vdev_rsp->rsp_status)
+		wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -198,12 +187,19 @@ static void
 target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg)
 {
 	struct scheduler_msg msg = {0};
-	struct wlan_objmgr_vdev *vdev = arg;
+	struct vdev_response_timer *vdev_rsp = arg;
+	struct wlan_objmgr_psoc *psoc;
+
+	psoc = vdev_rsp->psoc;
+	if (!psoc) {
+		mlme_err("PSOC is NULL");
+		return;
+	}
 
 	msg.type = SYS_MSG_ID_MC_TIMER;
 	msg.reserved = SYS_MSG_COOKIE;
 	msg.callback = target_if_vdev_mgr_rsp_timer_cb;
-	msg.bodyptr = arg;
+	msg.bodyptr = vdev_rsp;
 	msg.bodyval = 0;
 	msg.flush_callback = target_if_vdev_mgr_rsp_flush_cb;
 
@@ -214,8 +210,8 @@ target_if_vdev_mgr_rsp_cb_mc_ctx(void *arg)
 		return;
 
 	mlme_err("Could not enqueue timer to timer queue");
-	if (vdev)
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
+	if (psoc)
+		wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
 }
 
 void target_if_vdev_mgr_rsp_timer_mgmt_cb(void *arg)
@@ -243,8 +239,8 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn,
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
 	struct vdev_start_response rsp = {0};
 	wmi_host_vdev_start_resp vdev_start_resp;
+	uint8_t vdev_id;
 	struct vdev_response_timer *vdev_rsp;
-	struct wlan_objmgr_vdev *vdev;
 
 	if (!scn || !data) {
 		mlme_err("Invalid input");
@@ -274,35 +270,26 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn,
 		return -EINVAL;
 	}
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
-						psoc,
-						vdev_start_resp.vdev_id,
-						WLAN_VDEV_TARGET_IF_ID);
-	if (!vdev) {
-		mlme_err("PSOC_%d :VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
-			 vdev_start_resp.vdev_id);
-		return -EINVAL;
-	}
-
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	vdev_id = vdev_start_resp.vdev_id;
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
 	if (!vdev_rsp) {
-		mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
-			 psoc->soc_objmgr.psoc_id, vdev_start_resp.vdev_id);
-		goto release_vdev_target_if_ref;
+		mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
+			 vdev_id, wlan_psoc_get_id(psoc));
+		return -EINVAL;
 	}
 
 	if (vdev_start_resp.resp_type == WMI_HOST_VDEV_RESTART_RESP_EVENT)
 		status = target_if_vdev_mgr_rsp_timer_stop(
-							vdev, vdev_rsp,
+							psoc, vdev_rsp,
 							RESTART_RESPONSE_BIT);
 	else
-		status = target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
+		status = target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
 							   START_RESPONSE_BIT);
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
-			 psoc->soc_objmgr.psoc_id, vdev_start_resp.vdev_id);
-		goto release_vdev_target_if_ref;
+			 psoc->soc_objmgr.psoc_id, vdev_id);
+		goto err;
 	}
 
 	rsp.vdev_id = vdev_start_resp.vdev_id;
@@ -317,8 +304,7 @@ static int target_if_vdev_mgr_start_response_handler(ol_scn_t scn,
 
 	status = rx_ops->vdev_mgr_start_response(psoc, &rsp);
 
-release_vdev_target_if_ref:
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
+err:
 	return qdf_status_to_os_return(status);
 }
 
@@ -333,7 +319,6 @@ static int target_if_vdev_mgr_stop_response_handler(ol_scn_t scn,
 	struct vdev_stop_response rsp = {0};
 	uint32_t vdev_id;
 	struct vdev_response_timer *vdev_rsp;
-	struct wlan_objmgr_vdev *vdev;
 
 	if (!scn || !data) {
 		mlme_err("Invalid input");
@@ -363,37 +348,26 @@ static int target_if_vdev_mgr_stop_response_handler(ol_scn_t scn,
 		return -EINVAL;
 	}
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
-						psoc,
-						vdev_id,
-						WLAN_VDEV_TARGET_IF_ID);
-	if (!vdev) {
-		mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
-			 vdev_id);
-		return -EINVAL;
-	}
-
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
 	if (!vdev_rsp) {
-		mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
-			 psoc->soc_objmgr.psoc_id, vdev_id);
-		goto release_vdev_target_if_ref;
+		mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
+			 vdev_id, wlan_psoc_get_id(psoc));
+		return -EINVAL;
 	}
 
-	status = target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
+	status = target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
 						   STOP_RESPONSE_BIT);
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
 			 psoc->soc_objmgr.psoc_id, vdev_id);
-		goto release_vdev_target_if_ref;
+		goto err;
 	}
 
 	rsp.vdev_id = vdev_id;
 	status = rx_ops->vdev_mgr_stop_response(psoc, &rsp);
 
-release_vdev_target_if_ref:
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
+err:
 	return qdf_status_to_os_return(status);
 }
 
@@ -408,7 +382,6 @@ static int target_if_vdev_mgr_delete_response_handler(ol_scn_t scn,
 	struct vdev_delete_response rsp = {0};
 	struct wmi_host_vdev_delete_resp vdev_del_resp;
 	struct vdev_response_timer *vdev_rsp;
-	struct wlan_objmgr_vdev *vdev;
 
 	if (!scn || !data) {
 		mlme_err("Invalid input");
@@ -438,38 +411,28 @@ static int target_if_vdev_mgr_delete_response_handler(ol_scn_t scn,
 		return -EINVAL;
 	}
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
-						psoc,
-						vdev_del_resp.vdev_id,
-						WLAN_VDEV_TARGET_IF_ID);
-	if (!vdev) {
-		mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
-			 vdev_del_resp.vdev_id);
-		return -EINVAL;
-	}
-
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
+							 vdev_del_resp.vdev_id);
 	if (!vdev_rsp) {
-		mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
-			 psoc->soc_objmgr.psoc_id, vdev_del_resp.vdev_id);
-		goto release_vdev_target_if_ref;
+		mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
+			 vdev_del_resp.vdev_id, wlan_psoc_get_id(psoc));
+		return -EINVAL;
 	}
 
 	status = target_if_vdev_mgr_rsp_timer_stop(
-						vdev, vdev_rsp,
+						psoc, vdev_rsp,
 						DELETE_RESPONSE_BIT);
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
-			 psoc->soc_objmgr.psoc_id, vdev_del_resp.vdev_id);
-		goto release_vdev_target_if_ref;
+			 wlan_psoc_get_id(psoc), vdev_del_resp.vdev_id);
+		goto err;
 	}
 
 	rsp.vdev_id = vdev_del_resp.vdev_id;
 	status = rx_ops->vdev_mgr_delete_response(psoc, &rsp);
 
-release_vdev_target_if_ref:
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
+err:
 	return qdf_status_to_os_return(status);
 }
 
@@ -486,7 +449,6 @@ static int target_if_vdev_mgr_peer_delete_all_response_handler(
 	struct wmi_host_vdev_peer_delete_all_response_event
 						vdev_peer_del_all_resp;
 	struct vdev_response_timer *vdev_rsp;
-	struct wlan_objmgr_vdev *vdev;
 
 	if (!scn || !data) {
 		mlme_err("Invalid input");
@@ -518,41 +480,32 @@ static int target_if_vdev_mgr_peer_delete_all_response_handler(
 		return -EINVAL;
 	}
 
-	vdev = wlan_objmgr_get_vdev_by_id_from_psoc(
-						psoc,
-						vdev_peer_del_all_resp.vdev_id,
-						WLAN_VDEV_TARGET_IF_ID);
-	if (!vdev) {
-		mlme_err("PSOC_%d: VDEV_%d is NULL", psoc->soc_objmgr.psoc_id,
-			 vdev_peer_del_all_resp.vdev_id);
-		return -EINVAL;
-	}
-
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
+						vdev_peer_del_all_resp.vdev_id);
 	if (!vdev_rsp) {
-		mlme_err("PSOC_%d VDEV_%d: VDEV RSP is NULL",
-			 psoc->soc_objmgr.psoc_id,
-			 vdev_peer_del_all_resp.vdev_id);
-		goto release_vdev_target_if_ref;
+		mlme_err("vdev response timer is null VDEV_%d PSOC_%d",
+			 vdev_peer_del_all_resp.vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return -EINVAL;
 	}
 
 	status = target_if_vdev_mgr_rsp_timer_stop(
-						vdev, vdev_rsp,
+						psoc,
+						vdev_rsp,
 						PEER_DELETE_ALL_RESPONSE_BIT);
 
 	if (QDF_IS_STATUS_ERROR(status)) {
 		mlme_err("PSOC_%d VDEV_%d: VDE MGR RSP Timer stop failed",
 			 psoc->soc_objmgr.psoc_id,
 			 vdev_peer_del_all_resp.vdev_id);
-		goto release_vdev_target_if_ref;
+		goto err;
 	}
 
 	rsp.vdev_id = vdev_peer_del_all_resp.vdev_id;
 	rsp.status = vdev_peer_del_all_resp.status;
 	status = rx_ops->vdev_mgr_peer_delete_all_response(psoc, &rsp);
 
-release_vdev_target_if_ref:
-	wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
+err:
 	return qdf_status_to_os_return(status);
 }
 

+ 132 - 113
target_if/mlme/vdev_mgr/src/target_if_vdev_mgr_tx_ops.c

@@ -37,6 +37,7 @@
 #include <wlan_cmn.h>
 #include <wmi_unified_vdev_api.h>
 #include <cdp_txrx_ctrl.h>
+#include <target_if_psoc_timer_tx_ops.h>
 
 static QDF_STATUS target_if_vdev_mgr_register_event_handler(
 					struct wlan_objmgr_psoc *psoc)
@@ -50,25 +51,20 @@ static QDF_STATUS target_if_vdev_mgr_unregister_event_handler(
 	return target_if_vdev_mgr_wmi_event_unregister(psoc);
 }
 
-static QDF_STATUS target_if_vdev_mgr_rsp_timer_mod(
-					struct wlan_objmgr_vdev *vdev,
-					struct vdev_response_timer *vdev_rsp,
-					int mseconds)
+QDF_STATUS
+target_if_vdev_mgr_rsp_timer_stop(struct wlan_objmgr_psoc *psoc,
+				  struct vdev_response_timer *vdev_rsp,
+				  enum wlan_vdev_mgr_tgt_if_rsp_bit clear_bit)
 {
-	if (!vdev || !vdev_rsp) {
-		mlme_err("Invalid input");
+	struct wlan_lmac_if_mlme_tx_ops *txops;
+
+	txops = target_if_vdev_mgr_get_tx_ops(psoc);
+	if (!txops || !txops->psoc_vdev_rsp_timer_deinit) {
+		mlme_err("Failed to get mlme txrx_ops VDEV_%d PSOC_%d",
+			 vdev_rsp->vdev_id, wlan_psoc_get_id(psoc));
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	qdf_timer_mod(&vdev_rsp->rsp_timer, mseconds);
-	return QDF_STATUS_SUCCESS;
-}
-
-QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
-					struct wlan_objmgr_vdev *vdev,
-					struct vdev_response_timer *vdev_rsp,
-					uint8_t clear_bit)
-{
 	if (qdf_atomic_test_and_clear_bit(clear_bit, &vdev_rsp->rsp_status)) {
 		/*
 		 * This is triggered from timer expiry case only for
@@ -78,46 +74,43 @@ QDF_STATUS target_if_vdev_mgr_rsp_timer_stop(
 			qdf_timer_stop(&vdev_rsp->rsp_timer);
 
 		vdev_rsp->timer_status = QDF_STATUS_SUCCESS;
+		if (clear_bit == DELETE_RESPONSE_BIT)
+			txops->psoc_vdev_rsp_timer_deinit(psoc,
+							  vdev_rsp->vdev_id);
+
 		/*
 		 * Releasing reference taken at the time of
 		 * starting response timer
 		 */
-		wlan_objmgr_vdev_release_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
+		wlan_objmgr_psoc_release_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
 		return QDF_STATUS_SUCCESS;
 	}
-
 	return QDF_STATUS_E_FAILURE;
 }
 
 static QDF_STATUS target_if_vdev_mgr_rsp_timer_start(
-					struct wlan_objmgr_vdev *vdev,
-					struct vdev_response_timer *vdev_rsp,
-					uint8_t set_bit)
+				struct wlan_objmgr_psoc *psoc,
+				struct vdev_response_timer *vdev_rsp,
+				enum wlan_vdev_mgr_tgt_if_rsp_bit set_bit)
 {
-	uint8_t vdev_id;
 	uint8_t rsp_pos;
-	struct wlan_objmgr_psoc *psoc;
-
-	psoc = wlan_vdev_get_psoc(vdev);
-	if (!psoc) {
-		mlme_err("PSOC is NULL");
-		return QDF_STATUS_E_INVAL;
-	}
+	uint8_t vdev_id;
 
-	vdev_id = wlan_vdev_get_id(vdev);
 	/* it is expected to be only one command with FW at a time */
 	for (rsp_pos = START_RESPONSE_BIT; rsp_pos <= RESPONSE_BIT_MAX;
 	     rsp_pos++) {
 		if (rsp_pos != set_bit) {
 			if (qdf_atomic_test_bit(rsp_pos,
 						&vdev_rsp->rsp_status)) {
+				vdev_id = vdev_rsp->vdev_id;
 				mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response",
 					 wlan_psoc_get_id(psoc),
-					 vdev_id, string_from_rsp_bit(set_bit),
+					 vdev_id,
+					 string_from_rsp_bit(set_bit),
 					 string_from_rsp_bit(rsp_pos));
-				target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp,
-							       rsp_pos);
-				target_if_vdev_mgr_rsp_timer_stop(vdev,
+				target_if_vdev_mgr_assert_mgmt(psoc,
+							       vdev_id);
+				target_if_vdev_mgr_rsp_timer_stop(psoc,
 								  vdev_rsp,
 								  rsp_pos);
 			}
@@ -127,39 +120,21 @@ static QDF_STATUS target_if_vdev_mgr_rsp_timer_start(
 	if (qdf_atomic_test_and_set_bit(set_bit, &vdev_rsp->rsp_status)) {
 		mlme_err("PSOC_%d VDEV_%d: %s requested, waiting for %s response",
 			 wlan_psoc_get_id(psoc),
-			 vdev_id, string_from_rsp_bit(set_bit),
+			 vdev_rsp->vdev_id, string_from_rsp_bit(set_bit),
 			 string_from_rsp_bit(set_bit));
-		target_if_vdev_mgr_assert_mgmt(vdev, vdev_rsp,
-					       set_bit);
-		target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp, set_bit);
+		target_if_vdev_mgr_assert_mgmt(psoc, vdev_rsp->vdev_id);
+		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp, set_bit);
 
 		qdf_atomic_set_bit(set_bit, &vdev_rsp->rsp_status);
 	}
 
 	/* reference taken for timer start, will be released with stop */
-	wlan_objmgr_vdev_get_ref(vdev, WLAN_VDEV_TARGET_IF_ID);
+	wlan_objmgr_psoc_get_ref(psoc, WLAN_PSOC_TARGET_IF_ID);
 	qdf_timer_start(&vdev_rsp->rsp_timer, vdev_rsp->expire_time);
 
 	return QDF_STATUS_SUCCESS;
 }
 
-static QDF_STATUS target_if_vdev_mgr_rsp_timer_init(
-					struct wlan_objmgr_vdev *vdev,
-					qdf_timer_t *rsp_timer)
-{
-	if (!vdev || !rsp_timer) {
-		mlme_err("Invalid input");
-		return QDF_STATUS_E_INVAL;
-	}
-
-	qdf_timer_init(NULL, rsp_timer,
-		       target_if_vdev_mgr_rsp_timer_mgmt_cb,
-		       (void *)vdev, QDF_TIMER_TYPE_WAKE_APPS);
-	mlme_debug("VDEV_%d: Response timer initialized",
-		   wlan_vdev_get_id(vdev));
-
-	return QDF_STATUS_SUCCESS;
-}
 
 struct wmi_unified
 *target_if_vdev_mgr_wmi_handle_get(struct wlan_objmgr_vdev *vdev)
@@ -390,12 +365,29 @@ static QDF_STATUS target_if_vdev_mgr_create_send(
 	QDF_STATUS status;
 	struct wmi_unified *wmi_handle;
 	uint8_t vap_addr[QDF_MAC_ADDR_SIZE] = {0};
+	struct wlan_lmac_if_mlme_tx_ops *txops;
+	struct wlan_objmgr_psoc *psoc;
+	uint8_t vdev_id;
 
 	if (!vdev || !param) {
 		mlme_err("Invalid input");
 		return QDF_STATUS_E_INVAL;
 	}
 
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc) {
+		mlme_err("Failed to get psoc for VDEV_%d",
+			 wlan_vdev_get_id(vdev));
+		return QDF_STATUS_E_INVAL;
+	}
+
+	txops = wlan_mlme_get_lmac_tx_ops(psoc);
+	if (!txops || !txops->psoc_vdev_rsp_timer_init) {
+		mlme_err("Failed to get mlme txrx_ops for VDEV_%d PSOC_%d",
+			 wlan_vdev_get_id(vdev), wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
+	}
+
 	wmi_handle = target_if_vdev_mgr_wmi_handle_get(vdev);
 	if (!wmi_handle) {
 		mlme_err("Failed to get WMI handle!");
@@ -406,6 +398,10 @@ static QDF_STATUS target_if_vdev_mgr_create_send(
 	status = wmi_unified_vdev_create_send(wmi_handle, vap_addr,
 					      param);
 
+	vdev_id = wlan_vdev_get_id(vdev);
+	if (QDF_IS_STATUS_SUCCESS(status))
+		status = txops->psoc_vdev_rsp_timer_init(psoc, vdev_id);
+
 	return status;
 }
 
@@ -417,8 +413,8 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
 	struct wmi_unified *wmi_handle;
 	struct wlan_objmgr_psoc *psoc;
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
-	struct vdev_response_timer *vdev_rsp;
 	uint8_t vdev_id;
+	struct vdev_response_timer *vdev_rsp;
 
 	if (!vdev || !param) {
 		mlme_err("Invalid input");
@@ -434,24 +430,27 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
 	vdev_id = wlan_vdev_get_id(vdev);
 	psoc = wlan_vdev_get_psoc(vdev);
 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
-	if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
-		mlme_err("VDEV_%d: No Rx Ops", vdev_id);
+	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VEV_%d: PSOC_%d No Rx Ops", vdev_id,
+			 wlan_psoc_get_id(psoc));
 		return QDF_STATUS_E_INVAL;
 	}
 
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
 	if (!vdev_rsp) {
-		mlme_err("VDEV_%d: Invalid response structure", vdev_id);
-		return QDF_STATUS_E_FAILURE;
+		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
 	}
-	target_if_wake_lock_timeout_acquire(vdev, START_WAKELOCK);
 
 	vdev_rsp->expire_time = START_RESPONSE_TIMER;
+	target_if_wake_lock_timeout_acquire(vdev, START_WAKELOCK);
+
 	if (param->is_restart)
-		target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
+		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
 						   RESTART_RESPONSE_BIT);
 	else
-		target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
+		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
 						   START_RESPONSE_BIT);
 
 	status = wmi_unified_vdev_start_send(wmi_handle, param);
@@ -460,13 +459,12 @@ static QDF_STATUS target_if_vdev_mgr_start_send(
 		vdev_rsp->expire_time = 0;
 		target_if_wake_lock_timeout_release(vdev, START_WAKELOCK);
 		if (param->is_restart)
-			target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
+			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
 							  RESTART_RESPONSE_BIT);
 		else
-			target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
+			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
 							  START_RESPONSE_BIT);
 	}
-
 	return status;
 }
 
@@ -492,9 +490,9 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
 	QDF_STATUS status;
 	struct wlan_objmgr_psoc *psoc;
 	struct wmi_unified *wmi_handle;
-	struct vdev_response_timer *vdev_rsp;
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
 	uint8_t vdev_id;
+	struct vdev_response_timer *vdev_rsp;
 
 	if (!vdev || !param) {
 		mlme_err("Invalid input");
@@ -510,19 +508,22 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
 	vdev_id = wlan_vdev_get_id(vdev);
 	psoc = wlan_vdev_get_psoc(vdev);
 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
-	if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
-		mlme_err("VDEV_%d: No Rx Ops", vdev_id);
+	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
+			 wlan_psoc_get_id(psoc));
 		return QDF_STATUS_E_INVAL;
 	}
 
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
 	if (!vdev_rsp) {
-		mlme_err("VDEV_%d: Invalid response structure", vdev_id);
-		return QDF_STATUS_E_FAILURE;
+		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
 	}
+
 	target_if_wake_lock_timeout_acquire(vdev, DELETE_WAKELOCK);
 	vdev_rsp->expire_time = DELETE_RESPONSE_TIMER;
-	target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
+	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
 					   DELETE_RESPONSE_BIT);
 
 	status = wmi_unified_vdev_delete_send(wmi_handle, param->vdev_id);
@@ -534,7 +535,7 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
 					 wmi_service_sync_delete_cmds) ||
 		    wlan_psoc_nif_feat_cap_get(psoc,
 					       WLAN_SOC_F_TESTMODE_ENABLE)) {
-			target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
+			target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
 							  DELETE_RESPONSE_BIT);
 			target_if_vdev_mgr_delete_response_send(vdev, rx_ops);
 		}
@@ -542,10 +543,9 @@ static QDF_STATUS target_if_vdev_mgr_delete_send(
 		target_if_wake_lock_timeout_release(vdev, DELETE_WAKELOCK);
 		vdev_rsp->expire_time = 0;
 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
-		target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
+		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
 						  DELETE_RESPONSE_BIT);
 	}
-
 	return status;
 }
 
@@ -557,8 +557,9 @@ static QDF_STATUS target_if_vdev_mgr_stop_send(
 	struct wmi_unified *wmi_handle;
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
 	struct wlan_objmgr_psoc *psoc;
-	struct vdev_response_timer *vdev_rsp;
 	uint8_t vdev_id;
+	struct vdev_response_timer *vdev_rsp;
+
 
 	if (!vdev || !param) {
 		mlme_err("Invalid input");
@@ -574,31 +575,31 @@ static QDF_STATUS target_if_vdev_mgr_stop_send(
 	vdev_id = wlan_vdev_get_id(vdev);
 	psoc = wlan_vdev_get_psoc(vdev);
 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
-
-	if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
-		mlme_err("VDEV_%d: No Rx Ops", vdev_id);
+	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
+			 wlan_psoc_get_id(psoc));
 		return QDF_STATUS_E_INVAL;
 	}
 
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
 	if (!vdev_rsp) {
-		mlme_err("VDEV_%d: Invalid response structure", vdev_id);
-		return QDF_STATUS_E_FAILURE;
+		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
 	}
 
 	target_if_wake_lock_timeout_acquire(vdev, STOP_WAKELOCK);
 	vdev_rsp->expire_time = STOP_RESPONSE_TIMER;
-	target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp, STOP_RESPONSE_BIT);
+	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp, STOP_RESPONSE_BIT);
 
 	status = wmi_unified_vdev_stop_send(wmi_handle, param->vdev_id);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		vdev_rsp->expire_time = 0;
 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
 		target_if_wake_lock_timeout_release(vdev, STOP_WAKELOCK);
-		target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
+		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
 						  STOP_RESPONSE_BIT);
 	}
-
 	return status;
 }
 
@@ -837,15 +838,16 @@ static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref(
 {
 	struct wlan_objmgr_psoc *psoc;
 	struct wlan_objmgr_vdev *tvdev;
-	struct vdev_response_timer *vdev_rsp = NULL;
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
-	uint32_t vdev_idx;
+	int32_t vdev_idx = -1;
 	int32_t last_vdev_idx = -1;
+	struct vdev_response_timer *vdev_rsp;
 
 	psoc = wlan_pdev_get_psoc(pdev);
 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
-	if (!(rx_ops && rx_ops->vdev_mgr_get_response_timer_info)) {
-		mlme_err("No Rx Ops");
+
+	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d: No Rx Ops", vdev_idx);
 		return last_vdev_idx;
 	}
 
@@ -860,15 +862,16 @@ static int32_t target_if_vdev_mgr_multi_vdev_restart_get_ref(
 			return last_vdev_idx;
 		}
 
-		last_vdev_idx = vdev_idx;
-		vdev_rsp =
-			rx_ops->vdev_mgr_get_response_timer_info(tvdev);
+		vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
+								     vdev_idx);
 		if (!vdev_rsp) {
-			mlme_err("VDEV_%d: No Rx Ops", vdev_idx);
+			mlme_err("VDEV_%d PSOC_%d No vdev rsp timer",
+				 vdev_idx, wlan_psoc_get_id(psoc));
 			return last_vdev_idx;
 		}
 
-		target_if_vdev_mgr_rsp_timer_start(tvdev, vdev_rsp,
+		last_vdev_idx = vdev_idx;
+		target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
 						   RESTART_RESPONSE_BIT);
 		vdev_timer_started[vdev_idx] = true;
 	}
@@ -886,19 +889,30 @@ static void target_if_vdev_mgr_multi_vdev_restart_rel_ref(
 	struct wlan_objmgr_psoc *psoc;
 	struct wlan_objmgr_vdev *tvdev;
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
-	struct vdev_response_timer *vdev_rsp = NULL;
 	uint32_t vdev_idx;
+	struct vdev_response_timer *vdev_rsp;
 
 	psoc = wlan_pdev_get_psoc(pdev);
 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
+	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d: No Rx Ops", last_vdev_idx);
+		return;
+	}
+
 	for (vdev_idx = 0; vdev_idx <= last_vdev_idx; vdev_idx++) {
 		tvdev = vdev_list[vdev_idx];
+		vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc,
+								     vdev_idx);
+		if (!vdev_rsp) {
+			mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer",
+				 vdev_idx, wlan_psoc_get_id(psoc));
+			return;
+		}
+
 		if (QDF_IS_STATUS_ERROR(status)) {
-			vdev_rsp =
-				rx_ops->vdev_mgr_get_response_timer_info(tvdev);
-			if (vdev_rsp && vdev_timer_started[vdev_idx]) {
+			if (vdev_timer_started[vdev_idx]) {
 				target_if_vdev_mgr_rsp_timer_stop(
-							tvdev, vdev_rsp,
+							psoc, vdev_rsp,
 							RESTART_RESPONSE_BIT);
 				vdev_timer_started[vdev_idx] = false;
 			}
@@ -1018,8 +1032,8 @@ static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send(
 	struct wmi_unified *wmi_handle;
 	struct wlan_lmac_if_mlme_rx_ops *rx_ops;
 	struct wlan_objmgr_psoc *psoc;
-	struct vdev_response_timer *vdev_rsp;
 	uint8_t vdev_id;
+	struct vdev_response_timer *vdev_rsp;
 
 	if (!vdev || !param) {
 		mlme_err("Invalid input");
@@ -1036,29 +1050,30 @@ static QDF_STATUS target_if_vdev_mgr_peer_delete_all_send(
 	psoc = wlan_vdev_get_psoc(vdev);
 	rx_ops = target_if_vdev_mgr_get_rx_ops(psoc);
 
-	if (!rx_ops && !rx_ops->vdev_mgr_get_response_timer_info) {
-		mlme_err("VDEV_%d: No Rx Ops", vdev_id);
+	if (!rx_ops || !rx_ops->psoc_get_vdev_response_timer_info) {
+		mlme_err("VDEV_%d PSOC_%d No Rx Ops", vdev_id,
+			 wlan_psoc_get_id(psoc));
 		return QDF_STATUS_E_INVAL;
 	}
 
-	vdev_rsp = rx_ops->vdev_mgr_get_response_timer_info(vdev);
+	vdev_rsp = rx_ops->psoc_get_vdev_response_timer_info(psoc, vdev_id);
 	if (!vdev_rsp) {
-		mlme_err("VDEV_%d: Invalid response structure", vdev_id);
-		return QDF_STATUS_E_FAILURE;
+		mlme_err("VDEV_%d: PSOC_%d No vdev rsp timer", vdev_id,
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_INVAL;
 	}
 
 	vdev_rsp->expire_time = PEER_DELETE_ALL_RESPONSE_TIMER;
-	target_if_vdev_mgr_rsp_timer_start(vdev, vdev_rsp,
+	target_if_vdev_mgr_rsp_timer_start(psoc, vdev_rsp,
 					   PEER_DELETE_ALL_RESPONSE_BIT);
 
 	status = wmi_unified_peer_delete_all_send(wmi_handle, param);
 	if (QDF_IS_STATUS_ERROR(status)) {
 		vdev_rsp->expire_time = 0;
 		vdev_rsp->timer_status = QDF_STATUS_E_CANCELED;
-		target_if_vdev_mgr_rsp_timer_stop(vdev, vdev_rsp,
+		target_if_vdev_mgr_rsp_timer_stop(psoc, vdev_rsp,
 						  PEER_DELETE_ALL_RESPONSE_BIT);
 	}
-
 	return status;
 }
 
@@ -1147,13 +1162,17 @@ target_if_vdev_mgr_register_tx_ops(struct wlan_lmac_if_tx_ops *tx_ops)
 			target_if_vdev_set_tx_rx_decap_type;
 	mlme_tx_ops->vdev_sta_ps_param_send =
 			target_if_vdev_mgr_sta_ps_param_send;
-	mlme_tx_ops->vdev_mgr_rsp_timer_init =
-			target_if_vdev_mgr_rsp_timer_init;
-	mlme_tx_ops->vdev_mgr_rsp_timer_mod =
+	mlme_tx_ops->psoc_vdev_rsp_timer_mod =
 			target_if_vdev_mgr_rsp_timer_mod;
 	mlme_tx_ops->peer_delete_all_send =
 			target_if_vdev_mgr_peer_delete_all_send;
 	target_if_vdev_register_tx_fils(mlme_tx_ops);
 
+	mlme_tx_ops->psoc_vdev_rsp_timer_init =
+			target_if_psoc_vdev_rsp_timer_init;
+	mlme_tx_ops->psoc_vdev_rsp_timer_deinit =
+			target_if_psoc_vdev_rsp_timer_deinit;
+	mlme_tx_ops->psoc_vdev_rsp_timer_inuse =
+			target_if_psoc_vdev_rsp_timer_inuse;
 	return QDF_STATUS_SUCCESS;
 }

+ 2 - 0
umac/cmn_services/obj_mgr/inc/wlan_objmgr_cmn.h

@@ -256,6 +256,7 @@ typedef void (*wlan_objmgr_peer_status_handler)(
  * @WLAN_MISC_ID:               power manager, PAPI, rate set, etc.
  * @WLAN_FWOL_NB_ID:            fw offload northbound operations
  * @WLAN_FWOL_SB_ID:            fw offload southbound operations
+ * @WLAN_PSOC_TARGET_IF_ID      PSOC related target_if operations
  * @WLAN_REF_ID_MAX:            Max id used to generate ref count tracking array
  */
  /* New value added to the enum must also be reflected in function
@@ -334,6 +335,7 @@ typedef enum {
 	WLAN_MISC_ID          = 69,
 	WLAN_FWOL_NB_ID       = 70,
 	WLAN_FWOL_SB_ID       = 71,
+	WLAN_PSOC_TARGET_IF_ID = 72,
 	WLAN_REF_ID_MAX,
 } wlan_objmgr_ref_dbgid;
 

+ 24 - 12
umac/global_umac_dispatcher/lmac_if/inc/wlan_lmac_if_def.h

@@ -185,8 +185,6 @@ enum wlan_mlme_cfg_id;
  * @get_wifi_iface_id: function to get wifi interface id
  * @vdev_mlme_attach: function to register events
  * @vdev_mlme_detach: function to unregister events
- * @vdev_mgr_rsp_timer_init: function to initialize vdev response timer
- * @vdev_mgr_rsp_timer_mod: function to timer_mod vdev response timer
  * @vdev_create_send: function to send vdev create
  * @vdev_start_send: function to send vdev start
  * @vdev_up_send: function to send vdev up
@@ -207,18 +205,16 @@ enum wlan_mlme_cfg_id;
  * @vdev_bcn_miss_offload_send: function to send beacon miss offload
  * @vdev_sta_ps_param_send: function to sent STA power save config
  * @peer_delete_all_send: function to send vdev delete all peer request
+ * @psoc_vdev_rsp_timer_init: function to initialize psoc vdev response timer
+ * @psoc_vdev_rsp_timer_deinit: function to deinitialize psoc vdev rsp timer
+ * @psoc_vdev_rsp_timer_inuse: function to determine whether the vdev rsp
+ * timer is inuse or not
+ * @psoc_vdev_rsp_timer_mod: function to modify the time of vdev rsp timer
  */
 struct wlan_lmac_if_mlme_tx_ops {
 	uint32_t (*get_wifi_iface_id) (struct wlan_objmgr_pdev *pdev);
 	QDF_STATUS (*vdev_mlme_attach)(struct wlan_objmgr_psoc *psoc);
 	QDF_STATUS (*vdev_mlme_detach)(struct wlan_objmgr_psoc *psoc);
-	QDF_STATUS (*vdev_mgr_rsp_timer_init)(
-					struct wlan_objmgr_vdev *vdev,
-					qdf_timer_t *rsp_timer);
-	QDF_STATUS (*vdev_mgr_rsp_timer_mod)(
-					struct wlan_objmgr_vdev *vdev,
-					struct vdev_response_timer *vdev_rsp,
-					int mseconds);
 	QDF_STATUS (*vdev_create_send)(struct wlan_objmgr_vdev *vdev,
 				       struct vdev_create_params *param);
 	QDF_STATUS (*vdev_start_send)(struct wlan_objmgr_vdev *vdev,
@@ -272,6 +268,20 @@ struct wlan_lmac_if_mlme_tx_ops {
 	QDF_STATUS (*peer_delete_all_send)(
 					struct wlan_objmgr_vdev *vdev,
 					struct peer_delete_all_params *param);
+	QDF_STATUS (*psoc_vdev_rsp_timer_init)(
+				struct wlan_objmgr_psoc *psoc,
+				uint8_t vdev_id);
+	void (*psoc_vdev_rsp_timer_deinit)(
+				struct wlan_objmgr_psoc *psoc,
+				uint8_t vdev_id);
+	QDF_STATUS (*psoc_vdev_rsp_timer_inuse)(
+				struct wlan_objmgr_psoc *psoc,
+				uint8_t vdev_id);
+	QDF_STATUS (*psoc_vdev_rsp_timer_mod)(
+					struct wlan_objmgr_psoc *psoc,
+					uint8_t vdev_id,
+					int mseconds);
+
 };
 
 /**
@@ -1489,7 +1499,6 @@ struct wlan_lmac_if_dfs_rx_ops {
 
 /**
  * struct wlan_lmac_if_mlme_rx_ops: Function pointer to call MLME functions
- * @vdev_mgr_get_response_timer_info: function to get response timer info
  * @vdev_mgr_start_response: function to handle start response
  * @vdev_mgr_stop_response: function to handle stop response
  * @vdev_mgr_delete_response: function to handle delete response
@@ -1499,10 +1508,10 @@ struct wlan_lmac_if_dfs_rx_ops {
  * @vdev_mgr_peer_delete_all_response: function to handle vdev delete all peer
  * event
  * @vdev_mgr_get_wakelock_info: function to get wakelock info
+ * @psoc_get_vdev_response_timer_info: function to get vdev response timer
+ * structure for a specific vdev id
  */
 struct wlan_lmac_if_mlme_rx_ops {
-	struct vdev_response_timer *(*vdev_mgr_get_response_timer_info)(
-					struct wlan_objmgr_vdev *vdev);
 	QDF_STATUS (*vdev_mgr_start_response)(
 					struct wlan_objmgr_psoc *psoc,
 					struct vdev_start_response *rsp);
@@ -1525,6 +1534,9 @@ struct wlan_lmac_if_mlme_rx_ops {
 	struct vdev_mlme_wakelock *(*vdev_mgr_get_wakelock_info)(
 					struct wlan_objmgr_vdev *vdev);
 #endif
+	struct vdev_response_timer *(*psoc_get_vdev_response_timer_info)(
+						struct wlan_objmgr_psoc *psoc,
+						uint8_t vdev_id);
 };
 
 #ifdef WLAN_SUPPORT_GREEN_AP

+ 7 - 3
umac/mlme/include/wlan_psoc_mlme.h

@@ -21,15 +21,19 @@
 #define _WLAN_PSOC_MLME_H_
 
 #include <wlan_ext_mlme_obj_types.h>
+#include <wlan_vdev_mgr_tgt_if_rx_defs.h>
+#include <qdf_timer.h>
 
 /**
- * struct psoc_mlme_obj -  PSOC MLME component object
- * @psoc:                  PSOC object
- * @ext_psoc_ptr:          extended psoc mlme pointer
+ * struct psoc_mlme_obj -  PSoC MLME component object
+ * @psoc:                  PSoC object
+ * @ext_psoc_ptr:        PSoC legacy pointer
+ * @psoc_vdev_rt:       PSoC Vdev response timer
  */
 struct psoc_mlme_obj {
 	struct wlan_objmgr_psoc *psoc;
 	mlme_psoc_ext_t *ext_psoc_ptr;
+	struct vdev_response_timer psoc_vdev_rt[WLAN_UMAC_PSOC_MAX_VDEVS];
 };
 
 #endif

+ 0 - 1
umac/mlme/include/wlan_vdev_mlme.h

@@ -567,7 +567,6 @@ struct vdev_mlme_obj {
 	struct wlan_objmgr_vdev *vdev;
 	struct vdev_mlme_ops *ops;
 	mlme_vdev_ext_t *ext_vdev_ptr;
-	struct vdev_response_timer vdev_rt;
 #ifdef FEATURE_VDEV_RSP_WAKELOCK
 	struct vdev_mlme_wakelock vdev_wakelock;
 #endif

+ 8 - 0
umac/mlme/mlme_objmgr/dispatcher/inc/wlan_psoc_mlme_main.h

@@ -40,4 +40,12 @@ QDF_STATUS wlan_psoc_mlme_init(void);
  */
 QDF_STATUS wlan_psoc_mlme_deinit(void);
 
+/**
+ * mlme_psoc_get_priv: get MLME priv object from psoc object
+ * @psoc: pointer to psoc object
+ *
+ * Return: pointer to MLME psoc private object
+ */
+struct psoc_mlme_obj *mlme_psoc_get_priv(struct wlan_objmgr_psoc *psoc);
+
 #endif

+ 16 - 3
umac/mlme/mlme_objmgr/dispatcher/src/wlan_psoc_mlme_main.c

@@ -26,6 +26,20 @@
 #include <wlan_psoc_mlme_main.h>
 #include <wlan_psoc_mlme_api.h>
 
+struct psoc_mlme_obj *mlme_psoc_get_priv(struct wlan_objmgr_psoc *psoc)
+{
+	struct psoc_mlme_obj *psoc_mlme;
+
+	psoc_mlme = wlan_objmgr_psoc_get_comp_private_obj(psoc,
+							  WLAN_UMAC_COMP_MLME);
+	if (!psoc_mlme) {
+		mlme_err("PSOC MLME component object is NULL");
+		return NULL;
+	}
+
+	return psoc_mlme;
+}
+
 static QDF_STATUS mlme_psoc_obj_create_handler(struct wlan_objmgr_psoc *psoc,
 					       void *arg)
 {
@@ -67,10 +81,9 @@ static QDF_STATUS mlme_psoc_obj_destroy_handler(struct wlan_objmgr_psoc *psoc,
 {
 	struct psoc_mlme_obj *psoc_mlme;
 
-	psoc_mlme = wlan_objmgr_psoc_get_comp_private_obj(psoc,
-							  WLAN_UMAC_COMP_MLME);
+	psoc_mlme = mlme_psoc_get_priv(psoc);
 	if (!psoc_mlme) {
-		mlme_err(" PSOC MLME component object is NULL");
+		mlme_err("PSOC MLME component object is NULL");
 		return QDF_STATUS_E_FAILURE;
 	}
 

+ 39 - 21
umac/mlme/mlme_objmgr/dispatcher/src/wlan_vdev_mlme_main.c

@@ -22,23 +22,28 @@
 #include <wlan_objmgr_global_obj.h>
 #include <wlan_objmgr_vdev_obj.h>
 #include <wlan_mlme_dbg.h>
-#include "include/wlan_mlme_cmn.h"
-#include "include/wlan_vdev_mlme.h"
-#include "include/wlan_pdev_mlme.h"
-#include "vdev_mgr/core/src/vdev_mlme_sm.h"
-#include "wlan_pdev_mlme_api.h"
-#include "wlan_vdev_mlme_api.h"
-#include "wlan_serialization_api.h"
-#include "wlan_utility.h"
+#include <include/wlan_mlme_cmn.h>
+#include <include/wlan_vdev_mlme.h>
+#include <include/wlan_pdev_mlme.h>
+#include <vdev_mgr/core/src/vdev_mlme_sm.h>
+#include <wlan_pdev_mlme_api.h>
+#include <wlan_vdev_mlme_api.h>
+#include <wlan_serialization_api.h>
+#include <wlan_utility.h>
 #include <cdp_txrx_cmn.h>
-#include "target_if_vdev_mgr_wake_lock.h"
+#include <target_if_vdev_mgr_wake_lock.h>
+#include <wlan_lmac_if_def.h>
+#include <target_if_vdev_mgr_tx_ops.h>
 
 static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev,
 					       void *arg)
 {
 	struct vdev_mlme_obj *vdev_mlme;
 	struct wlan_objmgr_pdev *pdev;
+	struct wlan_objmgr_psoc *psoc;
 	struct pdev_mlme_obj *pdev_mlme;
+	struct wlan_lmac_if_mlme_tx_ops *txops;
+	QDF_STATUS status;
 
 	if (!vdev) {
 		mlme_err(" VDEV is NULL");
@@ -51,9 +56,33 @@ static QDF_STATUS mlme_vdev_obj_create_handler(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_FAILURE;
 	}
 
+	/**
+	 * 1st check whether for this vdev any vdev commands are pending for
+	 * response.
+	 */
+	psoc = wlan_pdev_get_psoc(pdev);
+	if (!psoc) {
+		mlme_err("PSOC is NULL");
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	txops = target_if_vdev_mgr_get_tx_ops(psoc);
+	if (!txops || !txops->psoc_vdev_rsp_timer_inuse) {
+		mlme_err("Failed to get mlme txrx_ops PSOC_%d",
+			 wlan_psoc_get_id(psoc));
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	status = txops->psoc_vdev_rsp_timer_inuse(psoc, wlan_vdev_get_id(vdev));
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mlme_err("The vdev response is pending for VDEV_%d status:%d",
+			 wlan_vdev_get_id(vdev), status);
+		return QDF_STATUS_E_FAILURE;
+	}
+
 	pdev_mlme = wlan_pdev_mlme_get_cmpt_obj(pdev);
 	if (!pdev_mlme) {
-		mlme_err(" PDEV MLME is NULL");
+		mlme_err("PDEV MLME is NULL");
 		return QDF_STATUS_E_FAILURE;
 	}
 
@@ -105,15 +134,6 @@ init_failed:
 	return QDF_STATUS_E_FAILURE;
 }
 
-static void mlme_vdev_obj_timer_deinit(
-				struct vdev_mlme_obj *vdev_mlme)
-{
-	struct vdev_response_timer *vdev_rsp;
-
-	vdev_rsp = &vdev_mlme->vdev_rt;
-	qdf_timer_free(&vdev_rsp->rsp_timer);
-}
-
 static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev,
 						void *arg)
 {
@@ -143,8 +163,6 @@ static QDF_STATUS mlme_vdev_obj_destroy_handler(struct wlan_objmgr_vdev *vdev,
 				NULL, NULL);
 	}
 
-	mlme_vdev_obj_timer_deinit(vdev_mlme);
-
 	mlme_vdev_sm_destroy(vdev_mlme);
 
 	mlme_vdev_ops_ext_hdl_destroy(vdev_mlme);

+ 6 - 0
umac/mlme/vdev_mgr/dispatcher/inc/wlan_vdev_mgr_tgt_if_rx_defs.h

@@ -81,16 +81,22 @@ static inline char *string_from_rsp_bit(enum wlan_vdev_mgr_tgt_if_rsp_bit bit)
 
 /**
  * struct vdev_response_timer - vdev mgmt response ops timer
+ * @psoc: Object manager psoc
  * @rsp_timer: VDEV MLME mgmt response timer
  * @rsp_status: variable to check response status
  * @expire_time: time to expire timer
  * @timer_status: status of timer
+ * @rsp_timer_inuse: Status bit to inform whether the rsp timer is inuse
+ * @vdev_id: vdev object id
  */
 struct vdev_response_timer {
+	struct wlan_objmgr_psoc *psoc;
 	qdf_timer_t rsp_timer;
 	unsigned long rsp_status;
 	uint32_t expire_time;
 	QDF_STATUS timer_status;
+	qdf_atomic_t rsp_timer_inuse;
+	uint8_t vdev_id;
 };
 
 /**

+ 19 - 12
umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_rx_api.c

@@ -28,19 +28,23 @@
 #include <wlan_mlme_dbg.h>
 #include <wlan_vdev_mlme_api.h>
 #include <target_if_vdev_mgr_tx_ops.h>
+#include <wlan_psoc_mlme_main.h>
+#include <include/wlan_psoc_mlme.h>
 
 static struct vdev_response_timer *
-tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_vdev *vdev)
+tgt_vdev_mgr_get_response_timer_info(struct wlan_objmgr_psoc *psoc,
+				     uint8_t vdev_id)
 {
-	struct vdev_mlme_obj *vdev_mlme;
+	struct psoc_mlme_obj *psoc_mlme;
 
-	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
-	if (!vdev_mlme) {
-		mlme_err("VDEV_%d: VDEV_MLME is NULL", wlan_vdev_get_id(vdev));
+	psoc_mlme = mlme_psoc_get_priv(psoc);
+	if (!psoc_mlme) {
+		mlme_err("VDEV_%d PSOC_%d PSOC_MLME is NULL", vdev_id,
+			 wlan_psoc_get_id(psoc));
 		return NULL;
 	}
 
-	return &vdev_mlme->vdev_rt;
+	return &psoc_mlme->psoc_vdev_rt[vdev_id];
 }
 
 static QDF_STATUS tgt_vdev_mgr_start_response_handler(
@@ -65,7 +69,8 @@ static QDF_STATUS tgt_vdev_mgr_start_response_handler(
 
 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
 	if (!vdev_mlme) {
-		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
+		mlme_err("VDEV_%d PSOC_%d VDEV_MLME is NULL", rsp->vdev_id,
+			 wlan_psoc_get_id(psoc));
 		goto tgt_vdev_mgr_start_response_handler_end;
 	}
 
@@ -101,7 +106,8 @@ static QDF_STATUS tgt_vdev_mgr_stop_response_handler(
 
 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
 	if (!vdev_mlme) {
-		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
+		mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id,
+			 wlan_psoc_get_id(psoc));
 		goto tgt_vdev_mgr_stop_response_handler_end;
 	}
 
@@ -138,7 +144,8 @@ static QDF_STATUS tgt_vdev_mgr_delete_response_handler(
 
 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
 	if (!vdev_mlme) {
-		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
+		mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id,
+			 wlan_psoc_get_id(psoc));
 		goto tgt_vdev_mgr_delete_response_handler_end;
 	}
 
@@ -176,7 +183,8 @@ static QDF_STATUS tgt_vdev_mgr_peer_delete_all_response_handler(
 
 	vdev_mlme = wlan_vdev_mlme_get_cmpt_obj(vdev);
 	if (!vdev_mlme) {
-		mlme_err("VDEV_%d: VDEV_MLME is NULL", rsp->vdev_id);
+		mlme_err("VDEV_%d: PSOC_%d VDEV_MLME is NULL", rsp->vdev_id,
+			 wlan_psoc_get_id(psoc));
 		goto tgt_vdev_mgr_peer_delete_all_response_handler_end;
 	}
 
@@ -262,8 +270,7 @@ void tgt_vdev_mgr_register_rx_ops(struct wlan_lmac_if_rx_ops *rx_ops)
 		tgt_vdev_mgr_delete_response_handler;
 	mlme_rx_ops->vdev_mgr_peer_delete_all_response =
 		tgt_vdev_mgr_peer_delete_all_response_handler;
-	mlme_rx_ops->vdev_mgr_get_response_timer_info =
+	mlme_rx_ops->psoc_get_vdev_response_timer_info =
 		tgt_vdev_mgr_get_response_timer_info;
-
 	tgt_vdev_mgr_reg_wakelock_info_rx_op(&rx_ops->mops);
 }

+ 11 - 11
umac/mlme/vdev_mgr/dispatcher/src/wlan_vdev_mgr_tgt_if_tx_api.c

@@ -63,7 +63,6 @@ QDF_STATUS tgt_vdev_mgr_create_send(
 	enum wlan_op_subtype cdp_txrx_subtype;
 	uint32_t vdev_id;
 	uint8_t *vdev_addr;
-	struct vdev_response_timer *vdev_rsp;
 
 	if (!param) {
 		mlme_err("Invalid input");
@@ -73,25 +72,27 @@ QDF_STATUS tgt_vdev_mgr_create_send(
 	vdev = mlme_obj->vdev;
 	vdev_id = wlan_vdev_get_id(vdev);
 	txops = wlan_vdev_mlme_get_lmac_txops(vdev);
-	if (!txops || !txops->vdev_create_send ||
-	    !txops->vdev_mgr_rsp_timer_init) {
-		mlme_err("VDEV_%d: No Tx Ops", vdev_id);
+	if (!txops || !txops->vdev_create_send) {
+		mlme_err("VDEV_%d No Tx Ops", vdev_id);
+		return QDF_STATUS_E_INVAL;
+	}
+
+	psoc = wlan_vdev_get_psoc(vdev);
+	if (!psoc) {
+		mlme_err("psoc object is NULL");
 		return QDF_STATUS_E_INVAL;
 	}
 
 	status = txops->vdev_create_send(vdev, param);
-	if (QDF_IS_STATUS_SUCCESS(status)) {
-		vdev_rsp = &mlme_obj->vdev_rt;
-		txops->vdev_mgr_rsp_timer_init(vdev, &vdev_rsp->rsp_timer);
-	} else {
-		mlme_err("VDEV_%d: Tx Ops Error : %d", vdev_id, status);
+	if (QDF_IS_STATUS_ERROR(status)) {
+		mlme_err("VDEV_%d PSOC_%d Tx Ops Error : %d", vdev_id,
+			 wlan_psoc_get_id(psoc), status);
 		return status;
 	}
 
 	cdp_txrx_opmode = wlan_util_vdev_get_cdp_txrx_opmode(vdev);
 	cdp_txrx_subtype = wlan_util_vdev_get_cdp_txrx_subtype(vdev);
 	vdev_addr = wlan_vdev_mlme_get_macaddr(vdev);
-	psoc = wlan_vdev_get_psoc(vdev);
 	pdev = wlan_vdev_get_pdev(vdev);
 	soc_txrx_handle = wlan_psoc_get_dp_handle(psoc);
 	pdev_txrx_handle = wlan_pdev_get_dp_handle(pdev);
@@ -107,7 +108,6 @@ QDF_STATUS tgt_vdev_mgr_create_send(
 		return QDF_STATUS_E_FAILURE;
 
 	wlan_vdev_set_dp_handle(vdev, vdev_txrx_handle);
-
 	return status;
 }