Browse Source

qcacld-3.0: cdp: Converge cdp_cmn_ops

Currently cdp ops are given pdev/vdev/peer
handle as its arguments which is directly
accessed in those APIs. This can cause a
race-condition in access of the respective
handles if it has been deleted in parallel.

Hence as a part of cdp convergence, pass only
the pdev_id or vdev_id or peer mac address,
which will be used to get the respective handles,
and hence avoiding the unwanted access of the
handles if it has been deleted.

- txrx_data_tx_cb_set
- txrx_mgmt_tx_cb_set
- txrx_mgmt_send_ext
- txrx_pdev_attach_target
- txrx_pdev_detach
- txrx_vdev_attach
- txrx_vdev_register
- txrx_vdev_detach
- txrx_peer_create
- txrx_peer_delete
- txrx_peer_delete_sync
- txrx_fw_stats_get
- txrx_get_vdev_from_vdev_id
- txrx_pdev_set_ctrl_pdev
- txrx_pdev_attach
- txrx_get_vdev_mac_addr
- txrx_pdev_post_attach
- txrx_pdev_pre_detach
- txrx_get_ctrl_pdev_from_vdev
- txrx_get_mon_vdev_from_pdev

Change-Id: Ib8b0b1edd63e7c3f8813b11ca26b50ec121fe255
CRs-Fixed: 2541459
Vevek Venkatesan 5 years ago
parent
commit
0ac759fc1c

+ 0 - 7
components/ocb/core/src/wlan_ocb_main.c

@@ -74,7 +74,6 @@ static QDF_STATUS ocb_set_chan_info(void *dp_soc,
 				    uint32_t vdev_id,
 				    struct ocb_config *config)
 {
-	struct cdp_vdev *dp_vdev;
 	struct ol_txrx_ocb_set_chan ocb_set_chan;
 	struct ol_txrx_ocb_chan_info *ocb_channel_info;
 
@@ -83,12 +82,6 @@ static QDF_STATUS ocb_set_chan_info(void *dp_soc,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	dp_vdev = cdp_get_vdev_from_vdev_id(dp_soc, dp_pdev, vdev_id);
-	if (!dp_vdev) {
-		ocb_err("DP vdev handle is NULL");
-		return QDF_STATUS_E_FAILURE;
-	}
-
 	ocb_set_chan.ocb_channel_count = config->channel_count;
 
 	/* release old settings */

+ 0 - 31
components/pmo/dispatcher/inc/wlan_pmo_obj_mgmt_api.h

@@ -250,24 +250,6 @@ pmo_register_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc,
 QDF_STATUS
 pmo_unregister_get_beacon_interval_callback(struct wlan_objmgr_psoc *psoc);
 
-/**
- * pmo_register_get_vdev_dp_handle(): API to register get vdev datapath handle
- * @psoc: objmgr psoc handle
- * @handler: get vdev datapath handle callback
- *
- * Return QDF_STATUS status - in case of success else return error
- */
-QDF_STATUS pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
-					   pmo_get_vdev_dp_handle handler);
-
-/**
- * pmo_unregister_get_vdev_dp_handle(): API to unregister get vdev dp handle
- * @psoc: objmgr psoc handle
- *
- * Return QDF_STATUS status - in case of success else return error
- */
-QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc);
-
 /**
  * pmo_register_is_device_in_low_pwr_mode(): API to get register device  power
  * save check notifier.
@@ -401,19 +383,6 @@ pmo_unregister_get_pause_bitmap(struct wlan_objmgr_psoc *psoc)
 	return QDF_STATUS_SUCCESS;
 }
 
-static inline QDF_STATUS
-pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
-				pmo_get_vdev_dp_handle handler)
-{
-	return QDF_STATUS_SUCCESS;
-}
-
-static inline QDF_STATUS
-QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc)
-{
-	return QDF_STATUS_SUCCESS;
-}
-
 static inline QDF_STATUS
 pmo_register_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc,
 				       pmo_is_device_in_low_pwr_mode handler)

+ 0 - 41
components/pmo/dispatcher/src/wlan_pmo_obj_mgmt_api.c

@@ -740,47 +740,6 @@ pmo_unregister_is_device_in_low_pwr_mode(struct wlan_objmgr_psoc *psoc)
 	return QDF_STATUS_SUCCESS;
 }
 
-QDF_STATUS pmo_register_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc,
-					   pmo_get_vdev_dp_handle handler)
-{
-	struct pmo_psoc_priv_obj *psoc_ctx;
-
-	if (!psoc) {
-		QDF_BUG(psoc);
-		pmo_err("psoc is null");
-		return QDF_STATUS_E_NULL_VALUE;
-	}
-
-	if (!handler) {
-		QDF_BUG(handler);
-		pmo_err("pmo_get_vdev_dp_handle is null");
-		return QDF_STATUS_E_NULL_VALUE;
-	}
-
-	pmo_psoc_with_ctx(psoc, psoc_ctx) {
-		psoc_ctx->get_vdev_dp_handle = handler;
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
-QDF_STATUS pmo_unregister_get_vdev_dp_handle(struct wlan_objmgr_psoc *psoc)
-{
-	struct pmo_psoc_priv_obj *psoc_ctx;
-
-	if (!psoc) {
-		QDF_BUG(psoc);
-		pmo_err("psoc is null");
-		return QDF_STATUS_E_NULL_VALUE;
-	}
-
-	pmo_psoc_with_ctx(psoc, psoc_ctx) {
-		psoc_ctx->get_vdev_dp_handle = NULL;
-	}
-
-	return QDF_STATUS_SUCCESS;
-}
-
 QDF_STATUS pmo_register_get_dtim_period_callback(struct wlan_objmgr_psoc *psoc,
 						 pmo_get_dtim_period handler)
 {

+ 0 - 2
core/cds/inc/cds_api.h

@@ -327,8 +327,6 @@ QDF_STATUS cds_dp_close(struct wlan_objmgr_psoc *psoc);
 
 void *cds_get_context(QDF_MODULE_ID module_id);
 
-uint8_t cds_get_datapath_handles(void **soc, struct cdp_pdev **pdev,
-			 struct cdp_vdev **vdev, uint8_t sessionId);
 void *cds_get_global_context(void);
 
 QDF_STATUS cds_alloc_context(QDF_MODULE_ID module_id, void **module_context,

+ 7 - 48
core/cds/src/cds_api.c

@@ -146,39 +146,6 @@ static void cds_recovery_work_deinit(void)
 	}
 }
 
-/** cds_get_datapath_handles - Initialize pdev, vdev and soc
- * @soc - soc handle
- * @vdev - virtual handle
- * @pdev - physical handle
- */
-uint8_t cds_get_datapath_handles(void **soc, struct cdp_pdev **pdev,
-		struct cdp_vdev **vdev, uint8_t sessionId)
-{
-
-	(*soc) = cds_get_context(QDF_MODULE_ID_SOC);
-
-	if (!(*soc)) {
-		cds_err("soc handle is invalid");
-		return -EINVAL;
-	}
-
-	(*pdev) = cds_get_context(QDF_MODULE_ID_TXRX);
-
-	if (!(*pdev)) {
-		cds_err("pdev handle is invalid");
-		return -EINVAL;
-	}
-
-	(*vdev) = cdp_get_vdev_from_vdev_id((*soc), (*pdev),
-					sessionId);
-
-	if (!(*vdev)) {
-		cds_err("vdev handle is invalid");
-		return -EINVAL;
-	}
-	return 0;
-}
-
 static bool cds_is_drv_connected(void)
 {
 	int ret;
@@ -705,12 +672,12 @@ QDF_STATUS cds_open(struct wlan_objmgr_psoc *psoc)
 	    TARGET_TYPE_QCA6390 == hdd_ctx->target_type ||
 	    TARGET_TYPE_QCA6490 == hdd_ctx->target_type)
 		gp_cds_context->dp_soc = cdp_soc_attach(LITHIUM_DP,
-			gp_cds_context->hif_context, psoc,
+			gp_cds_context->hif_context, htcInfo.target_psoc,
 			gp_cds_context->htc_ctx, gp_cds_context->qdf_ctx,
 			&dp_ol_if_ops);
 	else
 		gp_cds_context->dp_soc = cdp_soc_attach(MOB_DRV_LEGACY_DP,
-			gp_cds_context->hif_context, psoc,
+			gp_cds_context->hif_context, htcInfo.target_psoc,
 			gp_cds_context->htc_ctx, gp_cds_context->qdf_ctx,
 			&dp_ol_if_ops);
 
@@ -849,7 +816,7 @@ intr_close:
 
 pdev_detach:
 	cdp_pdev_detach(gp_cds_context->dp_soc,
-			cds_get_context(QDF_MODULE_ID_TXRX), false);
+			OL_TXRX_PDEV_ID, false);
 
 close:
 	return QDF_STATUS_E_FAILURE;
@@ -917,7 +884,7 @@ QDF_STATUS cds_pre_enable(void)
 		goto stop_wmi;
 	}
 
-	errno = cdp_pdev_post_attach(soc, gp_cds_context->pdev_txrx_ctx);
+	errno = cdp_pdev_post_attach(soc, OL_TXRX_PDEV_ID);
 	if (errno) {
 		cds_err("Failed to attach pdev");
 		status = qdf_status_from_os_return(errno);
@@ -998,7 +965,7 @@ QDF_STATUS cds_enable(struct wlan_objmgr_psoc *psoc)
 	}
 
 	errno = cdp_pdev_attach_target(cds_get_context(QDF_MODULE_ID_SOC),
-				       cds_get_context(QDF_MODULE_ID_TXRX));
+				       OL_TXRX_PDEV_ID);
 	if (errno) {
 		cds_err("Failed to attach pdev target; errno:%d", errno);
 		goto err_soc_target_detach;
@@ -1121,7 +1088,6 @@ QDF_STATUS cds_post_disable(void)
 {
 	tp_wma_handle wma_handle;
 	struct hif_opaque_softc *hif_ctx;
-	struct cdp_pdev *txrx_pdev;
 	struct scheduler_ctx *sched_ctx;
 	QDF_STATUS qdf_status;
 
@@ -1137,12 +1103,6 @@ QDF_STATUS cds_post_disable(void)
 		return QDF_STATUS_E_INVAL;
 	}
 
-	txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	if (!txrx_pdev) {
-		cds_err("Failed to get txrx pdev!");
-		return QDF_STATUS_E_INVAL;
-	}
-
 	/* flush any unprocessed scheduler messages */
 	sched_ctx = scheduler_get_context();
 	if (sched_ctx)
@@ -1175,7 +1135,7 @@ QDF_STATUS cds_post_disable(void)
 	}
 
 	cdp_pdev_pre_detach(cds_get_context(QDF_MODULE_ID_SOC),
-		       (struct cdp_pdev *)txrx_pdev, 1);
+			    OL_TXRX_PDEV_ID, 1);
 
 	return QDF_STATUS_SUCCESS;
 }
@@ -1278,8 +1238,7 @@ QDF_STATUS cds_dp_close(struct wlan_objmgr_psoc *psoc)
 
 	dp_txrx_deinit(cds_get_context(QDF_MODULE_ID_SOC));
 
-	cdp_pdev_detach(cds_get_context(QDF_MODULE_ID_SOC),
-		       (struct cdp_pdev *)ctx, 1);
+	cdp_pdev_detach(cds_get_context(QDF_MODULE_ID_SOC), OL_TXRX_PDEV_ID, 1);
 
 	cds_set_context(QDF_MODULE_ID_TXRX, NULL);
 	ucfg_pmo_psoc_set_txrx_pdev_id(psoc, OL_TXRX_INVALID_PDEV_ID);

+ 6 - 4
core/dp/ol/inc/ol_txrx_ctrl_api.h

@@ -54,11 +54,12 @@
  *  to the target has to be done in the separate pdev_attach_target call
  *  that is invoked after HTC setup is complete.
  *
- * @param pdev - txrx_pdev handle
+ * @param soc - datapath soc handle
+ * @param pdev_id - physical device instance id
  * @return 0 for success or error code
  */
 int
-ol_txrx_pdev_post_attach(struct cdp_pdev *pdev);
+ol_txrx_pdev_post_attach(struct cdp_soc_t *soc, uint8_t pdev_id);
 
 /**
  * @brief Parameter type to be input to ol_txrx_peer_update
@@ -280,14 +281,15 @@ void ol_txrx_tx_sync(ol_txrx_pdev_handle data_pdev, uint8_t sync_cnt);
  *  when transmission completes.  Rather, these specially-marked frames
  *  are provided to the callback registered with this function.
  *
- * @param data_vdev - which vdev the callback is being registered with
+ * @param soc - datapath soc handle
+ * @param vdev_id - id of which vdev the callback is being registered with
  *      (Currently the callback is stored in the pdev rather than the vdev.)
  * @param callback - the function to call when tx frames marked as "no free"
  *      are done being transmitted
  * @param ctxt - the context argument provided to the callback function
  */
 void
-ol_txrx_data_tx_cb_set(struct cdp_vdev *data_vdev,
+ol_txrx_data_tx_cb_set(struct cdp_soc_t *soc, uint8_t vdev_id,
 		       ol_txrx_data_tx_cb callback, void *ctxt);
 
 /**

+ 30 - 12
core/dp/txrx/ol_tx.c

@@ -129,41 +129,59 @@ qdf_nbuf_t ol_tx_send_ipa_data_frame(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 #endif
 
 void
-ol_txrx_data_tx_cb_set(struct cdp_vdev *pvdev,
+ol_txrx_data_tx_cb_set(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		       ol_txrx_data_tx_cb callback, void *ctxt)
 {
-	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
-	struct ol_txrx_pdev_t *pdev = vdev->pdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
+	struct ol_txrx_pdev_t *pdev;
 
+	if (!vdev || !vdev->pdev)
+		return;
+
+	pdev = vdev->pdev;
 	pdev->tx_data_callback.func = callback;
 	pdev->tx_data_callback.ctxt = ctxt;
 }
 
-void
-ol_txrx_mgmt_tx_cb_set(struct cdp_pdev *ppdev, uint8_t type,
+QDF_STATUS
+ol_txrx_mgmt_tx_cb_set(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, uint8_t type,
 		       ol_txrx_mgmt_tx_cb download_cb,
 		       ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt)
 {
-	struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
+								    pdev_id);
+
+	if (!pdev)
+		return QDF_STATUS_E_FAILURE;
 
 	TXRX_ASSERT1(type < OL_TXRX_MGMT_NUM_TYPES);
 	pdev->tx_mgmt_cb.download_cb = download_cb;
 	pdev->tx_mgmt_cb.ota_ack_cb = ota_ack_cb;
 	pdev->tx_mgmt_cb.ctxt = ctxt;
+
+	return QDF_STATUS_SUCCESS;
 }
 
 int
-ol_txrx_mgmt_send_ext(struct cdp_vdev *pvdev,
-		  qdf_nbuf_t tx_mgmt_frm,
-		  uint8_t type, uint8_t use_6mbps, uint16_t chanfreq)
+ol_txrx_mgmt_send_ext(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+		      qdf_nbuf_t tx_mgmt_frm, uint8_t type,
+		      uint8_t use_6mbps, uint16_t chanfreq)
 {
-	struct ol_txrx_vdev_t *vdev =
-				(struct ol_txrx_vdev_t *)pvdev;
-	struct ol_txrx_pdev_t *pdev = vdev->pdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
+	struct ol_txrx_pdev_t *pdev;
 	struct ol_tx_desc_t *tx_desc;
 	struct ol_txrx_msdu_info_t tx_msdu_info;
 	int result = 0;
 
+	if (!vdev || !vdev->pdev)
+		return QDF_STATUS_E_FAULT;
+
+	pdev = vdev->pdev;
 	tx_msdu_info.tso_info.is_tso = 0;
 
 	tx_msdu_info.htt.action.use_6mbps = use_6mbps;

+ 7 - 5
core/dp/txrx/ol_tx.h

@@ -208,7 +208,8 @@ void ol_txrx_mgmt_tx_complete(void *ctxt, qdf_nbuf_t netbuf, int err);
 /**
  * ol_txrx_mgmt_tx_cb_set() - Store a callback for delivery
  *	notifications for management frames.
- * @ppdev: the data physical device object
+ * @soc: Datapath soc handle
+ * @pdev_id: Physical device instance id
  * @type: the type of mgmt frame the callback is used for
  * @download_cb: the callback for notification of delivery to the target
  * @ota_ack_cb: the callback for notification of delivery to the peer
@@ -224,14 +225,15 @@ void ol_txrx_mgmt_tx_complete(void *ctxt, qdf_nbuf_t netbuf, int err);
  * This function is used by the control SW to store a callback pointer
  * for a given type of management frame.
  */
-void
-ol_txrx_mgmt_tx_cb_set(struct cdp_pdev *ppdev, uint8_t type,
+QDF_STATUS
+ol_txrx_mgmt_tx_cb_set(struct cdp_soc_t *soc, uint8_t pdev_id, uint8_t type,
 		       ol_txrx_mgmt_tx_cb download_cb,
 		       ol_txrx_mgmt_tx_cb ota_ack_cb, void *ctxt);
 
 /**
  * ol_txrx_mgmt_send_ext() - Transmit a management frame
- * @pvdev: virtual device transmitting the frame
+ * @soc: Datapath soc handle
+ * @vdev_id: virtual interface id
  * @tx_mgmt_frm: management frame to transmit
  * @type: the type of management frame (determines what callback to use)
  * @use_6mbps: specify whether management frame to transmit should
@@ -247,7 +249,7 @@ ol_txrx_mgmt_tx_cb_set(struct cdp_pdev *ppdev, uint8_t type,
  *         1 - the frame was not accepted
  */
 int
-ol_txrx_mgmt_send_ext(struct cdp_vdev *pvdev,
+ol_txrx_mgmt_send_ext(struct cdp_soc_t *soc, uint8_t vdev_id,
 		      qdf_nbuf_t tx_mgmt_frm,
 		      uint8_t type, uint8_t use_6mbps, uint16_t chanfreq);
 

+ 3 - 0
core/dp/txrx/ol_tx_queue.c

@@ -673,6 +673,9 @@ void ol_txrx_vdev_flush(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 		return;
 	}
 
+	if (!vdev)
+		return;
+
 	ol_tx_queue_vdev_flush(vdev->pdev, vdev);
 }
 

+ 211 - 106
core/dp/txrx/ol_txrx.c

@@ -76,6 +76,7 @@
 #include "epping_main.h"
 #include <a_types.h>
 #include <cdp_txrx_handle.h>
+#include <cdp_txrx_cmn_reg.h>
 #include "wlan_qct_sys.h"
 
 #include <htt_internal.h>
@@ -107,8 +108,8 @@ enum dpt_set_param_debugfs {
 QDF_STATUS ol_txrx_peer_state_update(struct cdp_pdev *pdev,
 				     uint8_t *peer_mac,
 				     enum ol_txrx_peer_state state);
-static void ol_vdev_rx_set_intrabss_fwd(struct cdp_vdev *vdev,
-		bool val);
+static void ol_vdev_rx_set_intrabss_fwd(struct cdp_soc_t *soc_hdl,
+					uint8_t vdev_id, bool val);
 int ol_txrx_get_tx_pending(struct cdp_pdev *pdev_handle);
 extern void
 ol_txrx_set_wmm_param(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
@@ -673,7 +674,7 @@ static inline void ol_txrx_debugfs_exit(ol_txrx_pdev_handle pdev)
 
 /**
  * ol_txrx_pdev_attach() - allocate txrx pdev
- * @soc: datapath soc handle
+ * @soc_hdl: datapath soc handle
  * @htc_pdev: HTC pdev
  * @osdev: os dev
  * @pdev_id: pdev identifier for pdev attach
@@ -898,26 +899,28 @@ static inline void ol_txrx_pdev_set_threshold(struct ol_txrx_pdev_t *pdev)
 
 /**
  * ol_txrx_pdev_post_attach() - attach txrx pdev
- * @pdev: txrx pdev
+ * @soc_hdl: datapath soc handle
+ * @pdev_id: physical device instance id
  *
  * Return: 0 for success
  */
 int
-ol_txrx_pdev_post_attach(struct cdp_pdev *ppdev)
+ol_txrx_pdev_post_attach(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
 {
-	struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
 	uint16_t i;
 	uint16_t fail_idx = 0;
 	int ret = 0;
 	uint16_t desc_pool_size;
 	struct hif_opaque_softc *osc =  cds_get_context(QDF_MODULE_ID_HIF);
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(soc, pdev_id);
 
 	uint16_t desc_element_size = sizeof(union ol_tx_desc_list_elem_t);
 	union ol_tx_desc_list_elem_t *c_element;
 	unsigned int sig_bit;
 	uint16_t desc_per_page;
 
-	if (!osc) {
+	if (!osc || !pdev) {
 		ret = -EINVAL;
 		goto ol_attach_fail;
 	}
@@ -1382,7 +1385,8 @@ ol_attach_fail:
 /**
  * ol_txrx_pdev_attach_target() - send target configuration
  *
- * @pdev - the physical device being initialized
+ * @soc_hdl - data path soc handle
+ * @pdev_id - device instance id
  *
  * The majority of the data SW setup are done by the pdev_attach
  * functions, but this function completes the data SW setup by
@@ -1390,9 +1394,14 @@ ol_attach_fail:
  *
  * Return: 0 - success 1 - failure
  */
-static int ol_txrx_pdev_attach_target(struct cdp_pdev *ppdev)
+static int ol_txrx_pdev_attach_target(struct cdp_soc_t *soc_hdl,
+				      uint8_t pdev_id)
 {
-	struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(soc, pdev_id);
+
+	if (!pdev)
+		return QDF_STATUS_E_FAULT;
 
 	return htt_attach_target(pdev->htt_pdev) == QDF_STATUS_SUCCESS ? 0:1;
 }
@@ -1443,7 +1452,8 @@ static void ol_tx_free_descs_inuse(ol_txrx_pdev_handle pdev)
 
 /**
  * ol_txrx_pdev_pre_detach() - detach the data SW state
- * @pdev - the data physical device object being removed
+ * @soc_hdl - datapath soc handle
+ * @pdev_id - the data physical device id being removed
  * @force - delete the pdev (and its vdevs and peers) even if
  * there are outstanding references by the target to the vdevs
  * and peers within the pdev
@@ -1451,11 +1461,14 @@ static void ol_tx_free_descs_inuse(ol_txrx_pdev_handle pdev)
  * This function is used when the WLAN driver is being removed to
  * detach the host data component within the driver.
  *
- * Return: None
+ * Return: none
  */
-static void ol_txrx_pdev_pre_detach(struct cdp_pdev *ppdev, int force)
+static void ol_txrx_pdev_pre_detach(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
+					  int force)
 {
-	struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
+								    pdev_id);
 
 	/* preconditions */
 	TXRX_ASSERT2(pdev);
@@ -1547,11 +1560,14 @@ static void ol_txrx_pdev_pre_detach(struct cdp_pdev *ppdev, int force)
 #ifdef QCA_COMPUTE_TX_DELAY
 	qdf_spinlock_destroy(&pdev->tx_delay.mutex);
 #endif
+
+	return;
 }
 
 /**
  * ol_txrx_pdev_detach() - delete the data SW state
- * @ppdev - the data physical device object being removed
+ * @soc_hdl - data path soc handle
+ * @pdev_id - device instance id
  * @force - delete the pdev (and its vdevs and peers) even if
  * there are outstanding references by the target to the vdevs
  * and peers within the pdev
@@ -1561,24 +1577,26 @@ static void ol_txrx_pdev_pre_detach(struct cdp_pdev *ppdev, int force)
  * All virtual devices within the physical device need to be deleted
  * (ol_txrx_vdev_detach) before the physical device itself is deleted.
  *
- * Return: None
+ * Return: Success or Failure
  */
-static void ol_txrx_pdev_detach(struct cdp_pdev *ppdev, int force)
+static QDF_STATUS ol_txrx_pdev_detach(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
+				      int force)
 {
-	struct ol_txrx_soc_t *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
+								    pdev_id);
 	struct ol_txrx_stats_req_internal *req, *temp_req;
 	int i = 0;
 
 	if (!soc) {
 		ol_txrx_err("soc is NULL");
-		return;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	/*checking to ensure txrx pdev structure is not NULL */
 	if (!pdev) {
 		ol_txrx_err("pdev is NULL");
-		return;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	qdf_spin_lock_bh(&pdev->req_list_spinlock);
@@ -1625,6 +1643,8 @@ static void ol_txrx_pdev_detach(struct cdp_pdev *ppdev, int force)
 
 	soc->pdev_list[pdev->id] = NULL;
 	qdf_mem_free(pdev);
+
+	return QDF_STATUS_SUCCESS;
 }
 
 #if defined(QCA_HL_NETDEV_FLOW_CONTROL)
@@ -1657,7 +1677,8 @@ ol_txrx_vdev_per_vdev_tx_desc_init(struct ol_txrx_vdev_t *vdev)
  * ol_txrx_vdev_attach - Allocate and initialize the data object
  * for a new virtual device.
  *
- * @data_pdev - the physical device the virtual device belongs to
+ * @@soc_hdl - data path soc handle
+ * @pdev_id - physical device instance id
  * @vdev_mac_addr - the MAC address of the virtual device
  * @vdev_id - the ID used to identify the virtual device to the target
  * @op_mode - whether this virtual device is operating as an AP,
@@ -1667,13 +1688,15 @@ ol_txrx_vdev_per_vdev_tx_desc_init(struct ol_txrx_vdev_t *vdev)
  * Return: success: handle to new data vdev object, failure: NULL
  */
 static struct cdp_vdev *
-ol_txrx_vdev_attach(struct cdp_pdev *ppdev,
+ol_txrx_vdev_attach(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
 		    uint8_t *vdev_mac_addr,
 		    uint8_t vdev_id, enum wlan_op_mode op_mode,
 		    enum wlan_op_subtype subtype)
 {
-	struct ol_txrx_soc_t *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	struct ol_txrx_pdev_t  *pdev = (struct ol_txrx_pdev_t *)ppdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
+								    pdev_id);
+
 	struct ol_txrx_vdev_t *vdev;
 	QDF_STATUS qdf_status;
 
@@ -1711,8 +1734,7 @@ ol_txrx_vdev_attach(struct cdp_pdev *ppdev,
 	TAILQ_INIT(&vdev->peer_list);
 	vdev->last_real_peer = NULL;
 
-	ol_txrx_hl_tdls_flag_reset(ol_txrx_soc_t_to_cdp_soc_t(soc),
-				   vdev_id, false);
+	ol_txrx_hl_tdls_flag_reset(soc_hdl, vdev_id, false);
 
 #ifdef QCA_IBSS_SUPPORT
 	vdev->ibss_peer_num = 0;
@@ -1787,7 +1809,8 @@ ol_txrx_vdev_attach(struct cdp_pdev *ppdev,
  * ol_txrx_vdev_register - Link a vdev's data object with the
  * matching OS shim vdev object.
  *
- * @pvdev: the virtual device's data object
+ * @soc_hdl: datapath soc handle
+ * @vdev_id: the virtual device's id
  * @osif_vdev: the virtual device's OS shim object
  * @txrx_ops: (pointers to)functions used for tx and rx data xfer
  *
@@ -1802,15 +1825,19 @@ ol_txrx_vdev_attach(struct cdp_pdev *ppdev,
  *  vdev objects, so the data SW can use the OS shim vdev handle
  *  when passing rx data received by a vdev up to the OS shim.
  */
-static void ol_txrx_vdev_register(struct cdp_vdev *pvdev, void *osif_vdev,
-				  struct ol_txrx_ops *txrx_ops)
+static QDF_STATUS ol_txrx_vdev_register(struct cdp_soc_t *soc_hdl,
+					uint8_t vdev_id,
+					ol_osif_vdev_handle osif_vdev,
+					struct ol_txrx_ops *txrx_ops)
 {
-	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
 
 	if (qdf_unlikely(!vdev) || qdf_unlikely(!txrx_ops)) {
 		qdf_print("vdev/txrx_ops is NULL!");
 		qdf_assert(0);
-		return;
+		return QDF_STATUS_E_FAILURE;
 	}
 
 	vdev->osif_dev = osif_vdev;
@@ -1818,6 +1845,8 @@ static void ol_txrx_vdev_register(struct cdp_vdev *pvdev, void *osif_vdev,
 	vdev->stats_rx = txrx_ops->rx.stats_rx;
 	vdev->tx_comp = txrx_ops->tx.tx_comp;
 	txrx_ops->tx.tx = ol_tx_data;
+
+	return QDF_STATUS_SUCCESS;
 }
 
 void ol_txrx_set_safemode(ol_txrx_vdev_handle vdev, uint32_t val)
@@ -1903,7 +1932,8 @@ ol_txrx_tx_desc_reset_vdev(ol_txrx_vdev_handle vdev)
 /**
  * ol_txrx_vdev_detach - Deallocate the specified data virtual
  * device object.
- * @data_vdev: data object for the virtual device in question
+ * @soc_hdl - data path soc handle
+ * @vdev_id: vdev id
  * @callback: function to call (if non-NULL) once the vdev has
  * been wholly deleted
  * @callback_context: context to provide in the callback
@@ -1923,13 +1953,18 @@ ol_txrx_tx_desc_reset_vdev(ol_txrx_vdev_handle vdev)
  * vdev_detach call, or if it's deferred until all in-progress peer
  * deletions have completed.
  */
-static void
-ol_txrx_vdev_detach(struct cdp_vdev *pvdev,
+static QDF_STATUS
+ol_txrx_vdev_detach(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 		    ol_txrx_vdev_delete_cb callback, void *context)
 {
-	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
 	struct ol_txrx_pdev_t *pdev;
 
+	if (qdf_unlikely(!vdev))
+		return QDF_STATUS_E_FAILURE;
+
 	/* preconditions */
 	TXRX_ASSERT2(vdev);
 	pdev = vdev->pdev;
@@ -1988,7 +2023,7 @@ ol_txrx_vdev_detach(struct cdp_vdev *pvdev,
 		vdev->delete.callback = callback;
 		vdev->delete.context = context;
 		qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
-		return;
+		return QDF_STATUS_E_FAILURE;
 	}
 	qdf_spin_unlock_bh(&pdev->peer_ref_mutex);
 	qdf_event_destroy(&vdev->wait_delete_comp);
@@ -2020,6 +2055,8 @@ ol_txrx_vdev_detach(struct cdp_vdev *pvdev,
 	qdf_mem_free(vdev);
 	if (callback)
 		callback(context);
+
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -2128,8 +2165,8 @@ static void ol_txrx_dump_peer_access_list(ol_txrx_peer_handle peer)
 /**
  * ol_txrx_peer_attach - Allocate and set up references for a
  * data peer object.
- * @pvdev - data virtual device object that will directly
- * own the data_peer object
+ * @soc_hdl - data path soc handle
+ * @vdev_id - virtual device instance id
  * @peer_mac_addr - MAC address of the new peer
  *
  * When an association with a peer starts, the host's control SW
@@ -2143,13 +2180,15 @@ static void ol_txrx_dump_peer_access_list(ol_txrx_peer_handle peer)
  * so a reference within the control peer object can be set to the
  * data peer object.
  *
- * Return: handle to new data peer object, or NULL if the attach
- * fails
+ * Return: 0 on success, -1 on failure
  */
 static void *
-ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
+ol_txrx_peer_attach(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+		    uint8_t *peer_mac_addr)
 {
-	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
 	struct ol_txrx_peer_t *peer;
 	struct ol_txrx_peer_t *temp_peer;
 	uint8_t i;
@@ -2237,7 +2276,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
 
 	peer = qdf_mem_malloc(sizeof(*peer));
 	if (!peer)
-		return NULL;    /* failure */
+		return NULL;
 
 	/* store provided params */
 	peer->vdev = vdev;
@@ -2323,7 +2362,7 @@ ol_txrx_peer_attach(struct cdp_vdev *pvdev, uint8_t *peer_mac_addr)
 		 * No Tx in monitor mode, otherwise results in target assert.
 		 * Setting disable_intrabss_fwd to true
 		 */
-		ol_vdev_rx_set_intrabss_fwd((struct cdp_vdev *)vdev, true);
+		ol_vdev_rx_set_intrabss_fwd(soc_hdl, vdev_id, true);
 	}
 
 	ol_txrx_local_peer_id_alloc(pdev, peer);
@@ -2475,14 +2514,17 @@ static struct cdp_vdev *ol_txrx_get_vdev_for_peer(void *ppeer)
 
 /**
  * ol_txrx_get_vdev_mac_addr() - Return mac addr of vdev
- * @vdev: vdev handle
+ * @soc_hdl: datapath soc handle
+ x @vdev_id: virtual interface id
  *
  * Return: vdev mac address
  */
 static uint8_t *
-ol_txrx_get_vdev_mac_addr(struct cdp_vdev *pvdev)
+ol_txrx_get_vdev_mac_addr(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 {
-	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
 
 	if (!vdev)
 		return NULL;
@@ -2520,14 +2562,20 @@ ol_txrx_pdev_handle ol_txrx_get_pdev_from_vdev(ol_txrx_vdev_handle vdev)
 
 /**
  * ol_txrx_get_ctrl_pdev_from_vdev() - Return control pdev of vdev
- * @vdev: vdev handle
+ * @soc_hdl: datapath soc handle
+ * @vdev_id: virtual interface id
  *
  * Return: Handle to control pdev
  */
 static struct cdp_cfg *
-ol_txrx_get_ctrl_pdev_from_vdev(struct cdp_vdev *pvdev)
+ol_txrx_get_ctrl_pdev_from_vdev(struct cdp_soc_t *soc_hdl, uint8_t vdev_id)
 {
-	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
+
+	if (!vdev)
+		return NULL;
 
 	return vdev->pdev->ctrl_pdev;
 }
@@ -3274,20 +3322,36 @@ void peer_unmap_timer_handler(void *data)
 
 /**
  * ol_txrx_peer_detach() - Delete a peer's data object.
- * @peer - the object to detach
+
+ * @soc_hdl: datapath soc handle
+ * @vdev_id: virtual interface id
+ * @peer_mac: peer MAC address
  * @bitmap - bitmap indicating special handling of request.
- *
  * When the host's control SW disassociates a peer, it calls
  * this function to detach and delete the peer. The reference
  * stored in the control peer object to the data peer
  * object (set up by a call to ol_peer_store()) is provided.
  *
- * Return: None
+ * Return: SUCCESS or Failure
  */
-static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap)
+static QDF_STATUS ol_txrx_peer_detach(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+				      uint8_t *peer_mac, uint32_t bitmap)
 {
-	ol_txrx_peer_handle peer = ppeer;
-	struct ol_txrx_vdev_t *vdev = peer->vdev;
+	ol_txrx_peer_handle peer;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
+
+	if (!vdev)
+		return QDF_STATUS_E_FAILURE;
+
+	peer = ol_txrx_find_peer_by_addr((struct cdp_pdev *)vdev->pdev,
+					 peer_mac);
+	if (!peer)
+		return QDF_STATUS_E_FAILURE;
+
+	ol_txrx_info_high("%s peer %pK, peer->ref_cnt %d", __func__,
+			  peer, qdf_atomic_read(&peer->ref_cnt));
 
 	/* redirect peer's rx delivery function to point to a discard func */
 	peer->rx_opt_proc = ol_rx_discard;
@@ -3342,6 +3406,8 @@ static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap)
 	 * reference, added by the PEER_MAP message.
 	 */
 	ol_txrx_peer_release_ref(peer, PEER_DEBUG_ID_OL_PEER_ATTACH);
+
+	return QDF_STATUS_SUCCESS;
 }
 
 /**
@@ -3357,6 +3423,7 @@ static void ol_txrx_peer_detach(void *ppeer, uint32_t bitmap)
  */
 static void ol_txrx_peer_detach_force_delete(void *ppeer)
 {
+	struct ol_txrx_soc_t *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	ol_txrx_peer_handle peer = ppeer;
 	ol_txrx_pdev_handle pdev = peer->vdev->pdev;
 
@@ -3365,7 +3432,9 @@ static void ol_txrx_peer_detach_force_delete(void *ppeer)
 
 	/* Clear the peer_id_to_obj map entries */
 	ol_txrx_peer_remove_obj_map_entries(pdev, peer);
-	ol_txrx_peer_detach(peer, 1 << CDP_PEER_DELETE_NO_SPECIAL);
+	ol_txrx_peer_detach((struct cdp_soc_t *)soc, peer->vdev->vdev_id,
+			    peer->mac_addr.raw,
+			    1 << CDP_PEER_DELETE_NO_SPECIAL);
 }
 
 /**
@@ -3376,34 +3445,45 @@ static void ol_txrx_peer_detach_force_delete(void *ppeer)
  *
  * Return: None
  */
-static void ol_txrx_peer_detach_sync(void *ppeer,
+static void ol_txrx_peer_detach_sync(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+				     uint8_t *peer_mac,
 				     ol_txrx_peer_unmap_sync_cb peer_unmap_sync,
 				     uint32_t bitmap)
 {
-	ol_txrx_peer_handle peer = ppeer;
-	ol_txrx_pdev_handle pdev = peer->vdev->pdev;
+	struct ol_txrx_pdev_t *pdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
 
-	ol_txrx_info_high("%s peer %pK, peer->ref_cnt %d", __func__,
-			  peer, qdf_atomic_read(&peer->ref_cnt));
+	if (!vdev || !vdev->pdev)
+		return;
 
+	pdev = vdev->pdev;
 	if (!pdev->peer_unmap_sync_cb)
 		pdev->peer_unmap_sync_cb = peer_unmap_sync;
 
-	ol_txrx_peer_detach(peer, bitmap);
+	ol_txrx_peer_detach(soc_hdl, vdev_id, peer_mac, bitmap);
 }
 
 /**
  * ol_txrx_peer_unmap_sync_cb_set() - set peer unmap sync callback
- * @ppdev - TXRX pdev context
+ * @soc_hdl - datapath soc handle
+ * pdev_id - physical device instance id
  * @peer_unmap_sync - peer unmap sync callback
  *
  * Return: None
  */
 static void ol_txrx_peer_unmap_sync_cb_set(
-				struct cdp_pdev *ppdev,
+				struct cdp_soc_t *soc_hdl,
+				uint8_t pdev_id,
 				ol_txrx_peer_unmap_sync_cb peer_unmap_sync)
 {
-	struct ol_txrx_pdev_t *pdev = (struct ol_txrx_pdev_t *)ppdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	struct ol_txrx_pdev_t *pdev = ol_txrx_get_pdev_from_pdev_id(soc,
+								    pdev_id);
+
+	if (!pdev)
+		return;
 
 	if (!pdev->peer_unmap_sync_cb)
 		pdev->peer_unmap_sync_cb = peer_unmap_sync;
@@ -3750,21 +3830,39 @@ struct ol_txrx_stats_req_internal
 	return req;
 }
 
+/**
+ * ol_txrx_fw_stats_get() - Get fw stats
+ *
+ * @soc_hdl: datapath soc handle
+ * @vdev_id: virtual interface id
+ * @req: specifications of stats request
+ * @per_vdev: bool input whether stats requested per vdev or not
+ * @response_expected: bool input whether expecting response or not
+ *
+ * Return: success or failure
+ */
 static A_STATUS
-ol_txrx_fw_stats_get(struct cdp_vdev *pvdev, struct ol_txrx_stats_req *req,
-			bool per_vdev, bool response_expected)
+ol_txrx_fw_stats_get(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+		     struct ol_txrx_stats_req *req, bool per_vdev,
+		     bool response_expected)
 {
-	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
-	struct ol_txrx_pdev_t *pdev = vdev->pdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
+	struct ol_txrx_pdev_t *pdev;
 	uint8_t cookie = FW_STATS_DESC_POOL_SIZE;
 	struct ol_txrx_stats_req_internal *non_volatile_req;
 	struct ol_txrx_fw_stats_desc_t *desc = NULL;
 	struct ol_txrx_fw_stats_desc_elem_t *elem = NULL;
 
+	if (!vdev)
+		return A_EINVAL;
+
+	pdev = vdev->pdev;
 	if (!pdev ||
 	    req->stats_type_upload_mask >= 1 << HTT_DBG_NUM_STATS ||
 	    req->stats_type_reset_mask >= 1 << HTT_DBG_NUM_STATS) {
-		return A_ERROR;
+		return A_EINVAL;
 	}
 
 	/*
@@ -3783,7 +3881,7 @@ ol_txrx_fw_stats_get(struct cdp_vdev *pvdev, struct ol_txrx_stats_req *req,
 		desc = ol_txrx_fw_stats_desc_alloc(pdev);
 		if (!desc) {
 			qdf_mem_free(non_volatile_req);
-			return A_ERROR;
+			return A_NO_MEMORY;
 		}
 
 		/* use the desc id as the cookie */
@@ -4423,9 +4521,21 @@ ol_txrx_peer_stats_copy(ol_txrx_pdev_handle pdev,
 }
 #endif /* QCA_ENABLE_OL_TXRX_PEER_STATS */
 
-static void ol_vdev_rx_set_intrabss_fwd(struct cdp_vdev *pvdev, bool val)
+/**
+ * ol_vdev_rx_set_intrabss_fwd() - Get fw stats
+ *
+ * @soc_hdl: datapath soc handle
+ * @vdev_id: virtual interface id
+ * @val: enable or disable
+ *
+ * Return: void
+ */
+static void ol_vdev_rx_set_intrabss_fwd(struct cdp_soc_t *soc_hdl,
+					uint8_t vdev_id, bool val)
 {
-	struct ol_txrx_vdev_t *vdev = (struct ol_txrx_vdev_t *)pvdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_vdev_handle vdev = ol_txrx_get_vdev_from_soc_vdev_id(soc,
+								     vdev_id);
 
 	if (!vdev)
 		return;
@@ -4480,18 +4590,22 @@ static uint32_t ol_txrx_get_tx_ack_stats(struct cdp_soc_t *soc_hdl,
 
 /**
  * ol_txrx_display_stats() - Display OL TXRX display stats
+ * @soc_hdl: Datapath soc handle
  * @value: Module id for which stats needs to be displayed
+ * @verb_level: verbose level of stats to be displayed
  *
  * Return: status
  */
 static QDF_STATUS
-ol_txrx_display_stats(void *soc, uint16_t value,
+ol_txrx_display_stats(struct cdp_soc_t *soc_hdl, uint16_t value,
 		      enum qdf_stats_verbosity_level verb_level)
 {
-	ol_txrx_pdev_handle pdev;
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(
+							soc,
+							OL_TXRX_PDEV_ID);
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 
-	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 	if (!pdev) {
 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
 			  "%s: pdev is NULL", __func__);
@@ -4509,7 +4623,7 @@ ol_txrx_display_stats(void *soc, uint16_t value,
 		if (verb_level == QDF_STATS_VERBOSITY_LEVEL_LOW)
 			ol_tx_dump_flow_pool_info_compact((void *)pdev);
 		else
-			ol_tx_dump_flow_pool_info(soc);
+			ol_tx_dump_flow_pool_info(soc_hdl);
 		break;
 	case CDP_TXRX_DESC_STATS:
 		qdf_nbuf_tx_desc_count_display();
@@ -5353,19 +5467,22 @@ struct ol_txrx_vdev_t *ol_txrx_get_vdev_from_soc_vdev_id(
 
 /**
  * ol_txrx_get_mon_vdev_from_pdev() - get monitor mode vdev from pdev
- * @ppdev: the physical device the virtual device belongs to
+ * @soc_hdl: datapath soc handle
+ * @pdev_id: the physical device id the virtual device belongs to
  *
- * Return: vdev handle
- *            NULL if not found.
+ * Return: vdev id
+ *            error if not found.
  */
-struct cdp_vdev *ol_txrx_get_mon_vdev_from_pdev(struct cdp_pdev *ppdev)
+uint8_t ol_txrx_get_mon_vdev_from_pdev(struct cdp_soc_t *soc_hdl,
+				       uint8_t pdev_id)
 {
-	struct ol_txrx_pdev_t  *pdev = (struct ol_txrx_pdev_t *)ppdev;
+	struct ol_txrx_soc_t *soc = (struct ol_txrx_soc_t *)soc_hdl;
+	ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(soc, pdev_id);
 
 	if (qdf_unlikely(!pdev))
-		return NULL;
+		return -EINVAL;
 
-	return (struct cdp_vdev *)pdev->monitor_vdev;
+	return pdev->monitor_vdev->vdev_id;
 }
 
 /**
@@ -5422,9 +5539,9 @@ static QDF_STATUS ol_txrx_soc_attach_target(ol_txrx_soc_handle soc)
  *
  * MCL legacy OL do nothing here
  *
- * Return: noe
+ * Return: none
  */
-static void ol_txrx_soc_detach(void *soc)
+static void ol_txrx_soc_detach(struct cdp_soc_t *soc)
 {
 	qdf_mem_free(soc);
 }
@@ -5484,20 +5601,6 @@ static void ol_txrx_wrapper_flush_rx_frames(struct cdp_soc_t *soc_hdl,
 	ol_txrx_flush_rx_frames(peer, drop);
 }
 
-/**
- * ol_txrx_wrapper_get_vdev_from_vdev_id() - get vdev instance from vdev id
- * @ppdev: pdev handle
- * @vdev_id: interface id
- *
- * Return: virtual interface instance
- */
-static
-struct cdp_vdev *ol_txrx_wrapper_get_vdev_from_vdev_id(struct cdp_pdev *ppdev,
-		uint8_t vdev_id)
-{
-	return ol_txrx_get_vdev_from_vdev_id(vdev_id);
-}
-
 /**
  * ol_txrx_wrapper_register_peer() - register peer
  * @pdev: pdev handle
@@ -5609,15 +5712,18 @@ ol_txrx_wrapper_set_flow_control_parameters(struct cdp_cfg *cfg_pdev,
 
 /**
  * ol_txrx_get_cfg() - get ini/cgf values in legacy dp
- * @soc: soc context
+ * @soc_hdl: soc context
  * @cfg_param: cfg parameters
  *
  * Return: none
  */
-static uint32_t ol_txrx_get_cfg(void *soc, enum cdp_dp_cfg cfg)
+static uint32_t ol_txrx_get_cfg(struct cdp_soc_t *soc_hdl, enum cdp_dp_cfg cfg)
 {
 	struct txrx_pdev_cfg_t *cfg_ctx;
-	ol_txrx_pdev_handle pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	struct ol_txrx_soc_t *soc = cdp_soc_t_to_ol_txrx_soc_t(soc_hdl);
+	ol_txrx_pdev_handle pdev = ol_txrx_get_pdev_from_pdev_id(
+							soc,
+							OL_TXRX_PDEV_ID);
 	uint32_t value = 0;
 
 	if (!pdev) {
@@ -5770,7 +5876,6 @@ static struct cdp_cmn_ops ol_ops_cmn = {
 	.txrx_vdev_register = ol_txrx_vdev_register,
 	.txrx_soc_detach = ol_txrx_soc_detach,
 	.txrx_get_vdev_mac_addr = ol_txrx_get_vdev_mac_addr,
-	.txrx_get_vdev_from_vdev_id = ol_txrx_wrapper_get_vdev_from_vdev_id,
 	.txrx_get_ctrl_pdev_from_vdev = ol_txrx_get_ctrl_pdev_from_vdev,
 	.txrx_get_mon_vdev_from_pdev = ol_txrx_get_mon_vdev_from_pdev,
 	.txrx_mgmt_send_ext = ol_txrx_mgmt_send_ext,

+ 6 - 4
core/dp/txrx/ol_txrx.h

@@ -195,12 +195,14 @@ struct ol_txrx_vdev_t *ol_txrx_get_vdev_from_soc_vdev_id(
 
 /**
  * ol_txrx_get_mon_vdev_from_pdev() - get monitor mode vdev from pdev
- * @ppdev: the physical device the virtual device belongs to
+ * @soc: datapath soc handle
+ * @pdev_id: the physical device id the virtual device belongs to
  *
- * Return: vdev handle
- *         NULL if not found.
+ * Return: vdev id
+ *         error if not found.
  */
-struct cdp_vdev *ol_txrx_get_mon_vdev_from_pdev(struct cdp_pdev *ppdev);
+uint8_t ol_txrx_get_mon_vdev_from_pdev(struct cdp_soc_t *soc,
+				       uint8_t pdev_id);
 
 /**
  * ol_txrx_get_vdev_by_peer_addr() - Get vdev handle by peer mac address

+ 3 - 0
core/dp/txrx/ol_txrx_legacy_flow_control.c

@@ -133,6 +133,9 @@ static void ol_tx_vdev_ll_pause_queue_send_base(struct ol_txrx_vdev_t *vdev)
 {
 	int max_to_accept;
 
+	if (!vdev)
+		return;
+
 	qdf_spin_lock_bh(&vdev->ll_pause.mutex);
 	if (vdev->ll_pause.paused_reason) {
 		qdf_spin_unlock_bh(&vdev->ll_pause.mutex);

+ 7 - 48
core/dp/txrx3.0/dp_rx_thread.c

@@ -17,6 +17,8 @@
  */
 
 #include <dp_txrx.h>
+#include "dp_peer.h"
+#include "dp_internal.h"
 #include <cdp_txrx_cmn_struct.h>
 #include <cdp_txrx_peer_ops.h>
 #include <cds_sched.h>
@@ -275,41 +277,6 @@ static qdf_nbuf_t dp_rx_tm_thread_dequeue(struct dp_rx_thread *rx_thread)
 	return head;
 }
 
-/**
- * dp_rx_thread_get_nbuf_vdev_handle() - get vdev handle from nbuf
- *			                 dequeued from rx thread
- * @soc: soc handle
- * @pdev: pdev handle
- * @rx_thread: rx_thread whose nbuf was dequeued
- * @nbuf_list: nbuf list dequeued from rx_thread
- *
- * Returns: vdev handle on Success, NULL on failure
- */
-static struct cdp_vdev *
-dp_rx_thread_get_nbuf_vdev_handle(ol_txrx_soc_handle soc,
-				  struct cdp_pdev *pdev,
-				  struct dp_rx_thread *rx_thread,
-				  qdf_nbuf_t nbuf_list)
-{
-	uint32_t num_list_elements = 0;
-	struct cdp_vdev *vdev;
-	uint8_t vdev_id;
-
-	vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf_list);
-	vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
-	if (!vdev) {
-		num_list_elements =
-			QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(nbuf_list);
-		rx_thread->stats.dropped_invalid_vdev +=
-						num_list_elements;
-		dp_err("vdev not found for vdev_id %u!, pkt dropped",
-		       vdev_id);
-		return NULL;
-	}
-
-	return vdev;
-}
-
 /**
  * dp_rx_thread_process_nbufq() - process nbuf queue of a thread
  * @rx_thread - rx_thread whose nbuf queue needs to be processed
@@ -319,12 +286,11 @@ dp_rx_thread_get_nbuf_vdev_handle(ol_txrx_soc_handle soc,
 static int dp_rx_thread_process_nbufq(struct dp_rx_thread *rx_thread)
 {
 	qdf_nbuf_t nbuf_list;
-	struct cdp_vdev *vdev;
+	uint8_t vdev_id;
 	ol_txrx_rx_fp stack_fn;
 	ol_osif_vdev_handle osif_vdev;
 	ol_txrx_soc_handle soc;
 	uint32_t num_list_elements = 0;
-	struct cdp_pdev *pdev;
 
 	struct dp_txrx_handle_cmn *txrx_handle_cmn;
 
@@ -332,10 +298,8 @@ static int dp_rx_thread_process_nbufq(struct dp_rx_thread *rx_thread)
 		dp_rx_thread_get_txrx_handle(rx_thread->rtm_handle_cmn);
 
 	soc = dp_txrx_get_soc_from_ext_handle(txrx_handle_cmn);
-	pdev = dp_txrx_get_pdev_from_ext_handle(txrx_handle_cmn);
-
-	if (!soc || !pdev) {
-		dp_err("invalid soc or pdev!");
+	if (!soc) {
+		dp_err("invalid soc!");
 		QDF_BUG(0);
 		return -EFAULT;
 	}
@@ -349,13 +313,8 @@ static int dp_rx_thread_process_nbufq(struct dp_rx_thread *rx_thread)
 			QDF_NBUF_CB_RX_NUM_ELEMENTS_IN_LIST(nbuf_list);
 		rx_thread->stats.nbuf_dequeued += num_list_elements;
 
-		vdev = dp_rx_thread_get_nbuf_vdev_handle(soc, pdev, rx_thread,
-							 nbuf_list);
-		if (!vdev) {
-			qdf_nbuf_list_free(nbuf_list);
-			goto dequeue_rx_thread;
-		}
-		cdp_get_os_rx_handles_from_vdev(soc, vdev, &stack_fn,
+		vdev_id = QDF_NBUF_CB_RX_VDEV_ID(nbuf_list);
+		cdp_get_os_rx_handles_from_vdev(soc, vdev_id, &stack_fn,
 						&osif_vdev);
 		if (!stack_fn || !osif_vdev) {
 			rx_thread->stats.dropped_invalid_os_rx_handles +=

+ 3 - 10
core/hdd/src/wlan_hdd_assoc.c

@@ -2152,7 +2152,8 @@ QDF_STATUS hdd_roam_register_sta(struct hdd_adapter *adapter,
 	}
 
 	txrx_ops.tx.tx = NULL;
-	cdp_vdev_register(soc, adapter->txrx_vdev, adapter, &txrx_ops);
+	cdp_vdev_register(soc, adapter->vdev_id, (ol_osif_vdev_handle)adapter,
+			  &txrx_ops);
 	if (!txrx_ops.tx.tx) {
 		hdd_err("%s vdev register fail", __func__);
 		return QDF_STATUS_E_FAILURE;
@@ -4079,7 +4080,6 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
 	struct ol_txrx_ops txrx_ops;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	struct cdp_vdev *txrx_vdev;
 
 	/*
 	 * TDLS sta in BSS should be set as STA type TDLS and STA MAC should
@@ -4102,14 +4102,7 @@ QDF_STATUS hdd_roam_register_tdlssta(struct hdd_adapter *adapter,
 		txrx_ops.rx.rx_stack = NULL;
 		txrx_ops.rx.rx_flush = NULL;
 	}
-	txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
-					      (struct cdp_pdev *)pdev,
-					      adapter->vdev_id);
-	if (!txrx_vdev)
-		return QDF_STATUS_E_FAILURE;
-
-	cdp_vdev_register(soc, txrx_vdev,
-			  adapter,
+	cdp_vdev_register(soc, adapter->vdev_id, (ol_osif_vdev_handle)adapter,
 			  &txrx_ops);
 	adapter->tx_fn = txrx_ops.tx.tx;
 	txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;

+ 1 - 8
core/hdd/src/wlan_hdd_main.c

@@ -2348,7 +2348,7 @@ bool hdd_dfs_indicate_radar(struct hdd_context *hdd_ctx)
 				true;
 			hdd_info("tx blocked for vdev: %d",
 				adapter->vdev_id);
-			if (adapter->txrx_vdev)
+			if (adapter->vdev_id != WLAN_UMAC_VDEV_ID_MAX)
 				cdp_fc_vdev_flush(
 					cds_get_context(QDF_MODULE_ID_SOC),
 					adapter->vdev_id);
@@ -8078,7 +8078,6 @@ static void hdd_display_periodic_stats(struct hdd_context *hdd_ctx,
 {
 	static uint32_t counter;
 	static bool data_in_time_period;
-	ol_txrx_pdev_handle pdev;
 	ol_txrx_soc_handle soc;
 	uint32_t periodic_stats_disp_time = 0;
 
@@ -8093,12 +8092,6 @@ static void hdd_display_periodic_stats(struct hdd_context *hdd_ctx,
 		return;
 	}
 
-	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	if (!pdev) {
-		hdd_err("pdev is NULL");
-		return;
-	}
-
 	counter++;
 	if (data_in_interval)
 		data_in_time_period = data_in_interval;

+ 1 - 8
core/hdd/src/wlan_hdd_ocb.c

@@ -220,8 +220,6 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
 	struct hdd_station_ctx *sta_ctx = WLAN_HDD_GET_STATION_CTX_PTR(adapter);
 	struct ol_txrx_ops txrx_ops;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	struct cdp_vdev *vdev;
 
 	qdf_status = cdp_peer_register_ocb_peer(soc,
 				adapter->mac_addr.bytes);
@@ -236,13 +234,8 @@ static int hdd_ocb_register_sta(struct hdd_adapter *adapter)
 	/* Register the vdev transmit and receive functions */
 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
 	txrx_ops.rx.rx = hdd_rx_packet_cbk;
-	vdev = cdp_get_vdev_from_vdev_id(soc,
-					 (struct cdp_pdev *)pdev,
-					 adapter->vdev_id);
-	if (!vdev)
-		return -EINVAL;
 
-	cdp_vdev_register(soc, vdev, adapter,
+	cdp_vdev_register(soc, adapter->vdev_id, (ol_osif_vdev_handle)adapter,
 			  &txrx_ops);
 	txrx_ops.rx.stats_rx = hdd_tx_rx_collect_connectivity_stats_info;
 	adapter->tx_fn = txrx_ops.tx.tx;

+ 7 - 4
core/hdd/src/wlan_hdd_rx_monitor.c

@@ -24,6 +24,7 @@
 #include <cds_sched.h>
 #include <cds_utils.h>
 #include "wlan_hdd_rx_monitor.h"
+#include "ol_txrx.h"
 
 /**
  * hdd_rx_monitor_callback(): Callback function for receive monitor mode
@@ -120,11 +121,13 @@ void hdd_monitor_set_rx_monitor_cb(struct ol_txrx_ops *txrx,
 int hdd_enable_monitor_mode(struct net_device *dev)
 {
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
+	uint8_t vdev_id;
 
 	hdd_enter_dev(dev);
 
-	return cdp_set_monitor_mode(soc,
-			(struct cdp_vdev *)cdp_get_mon_vdev_from_pdev(soc,
-			(struct cdp_pdev *)pdev), false);
+	vdev_id = cdp_get_mon_vdev_from_pdev(soc, OL_TXRX_PDEV_ID);
+	if (vdev_id < 0)
+		return -EINVAL;
+
+	return cdp_set_monitor_mode(soc, vdev_id, false);
 }

+ 2 - 9
core/hdd/src/wlan_hdd_softap_tx_rx.c

@@ -1020,7 +1020,6 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
 	struct ol_txrx_ops txrx_ops;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	struct cdp_vdev *txrx_vdev = NULL;
 	struct hdd_ap_ctx *ap_ctx;
 	struct hdd_station_info *sta_info;
 
@@ -1076,15 +1075,9 @@ QDF_STATUS hdd_softap_register_sta(struct hdd_adapter *adapter,
 		txrx_ops.rx.rx_flush = NULL;
 	}
 
-	txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
-					      (struct cdp_pdev *)pdev,
-					      adapter->vdev_id);
-	if (!txrx_vdev)
-		return QDF_STATUS_E_FAILURE;
-
 	cdp_vdev_register(soc,
-			  txrx_vdev,
-			  adapter,
+			  adapter->vdev_id,
+			  (ol_osif_vdev_handle)adapter,
 			  &txrx_ops);
 	adapter->txrx_vdev = cdp_get_vdev_from_vdev_id(soc,
 					(struct cdp_pdev *)pdev,

+ 3 - 3
core/hdd/src/wlan_hdd_tx_rx.c

@@ -2733,9 +2733,9 @@ int hdd_set_mon_rx_cb(struct net_device *dev)
 	qdf_mem_zero(&txrx_ops, sizeof(txrx_ops));
 	txrx_ops.rx.rx = hdd_mon_rx_packet_cbk;
 	hdd_monitor_set_rx_monitor_cb(&txrx_ops, hdd_rx_monitor_callback);
-	cdp_vdev_register(soc,
-			  cdp_get_mon_vdev_from_pdev(soc, pdev),
-			  adapter, &txrx_ops);
+	cdp_vdev_register(soc, adapter->vdev_id,
+			  (ol_osif_vdev_handle)adapter,
+			  &txrx_ops);
 	/* peer is created wma_vdev_attach->wma_create_peer */
 	qdf_status = cdp_peer_register(soc,
 			(struct cdp_pdev *)pdev, &sta_desc);

+ 13 - 42
core/mac/src/pe/lim/lim_process_action_frame.c

@@ -1636,13 +1636,6 @@ static void lim_process_addba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
 	uint32_t frame_len, status;
 	QDF_STATUS qdf_status;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	void *peer, *pdev;
-
-	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	if (!pdev) {
-		pe_err("pdev is NULL");
-		return;
-	}
 
 	mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
 	body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
@@ -1668,19 +1661,14 @@ static void lim_process_addba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
 			status, frame_len);
 	}
 
-	peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_hdr->sa,
-					PEER_DEBUG_ID_WMA_ADDBA_REQ);
-	if (!peer) {
-		pe_err("PEER [%pM] not found", mac_hdr->sa);
-		goto error;
-	}
-
-	qdf_status = cdp_addba_requestprocess(soc, peer,
-			addba_req->DialogToken.token,
-			addba_req->addba_param_set.tid,
-			addba_req->ba_timeout.timeout,
-			addba_req->addba_param_set.buff_size,
-			addba_req->ba_start_seq_ctrl.ssn);
+	qdf_status = cdp_addba_requestprocess(
+					soc, mac_hdr->sa,
+					session->vdev_id,
+					addba_req->DialogToken.token,
+					addba_req->addba_param_set.tid,
+					addba_req->ba_timeout.timeout,
+					addba_req->addba_param_set.buff_size,
+					addba_req->ba_start_seq_ctrl.ssn);
 
 	if (QDF_STATUS_SUCCESS == qdf_status) {
 		qdf_status = lim_send_addba_response_frame(mac_ctx,
@@ -1691,16 +1679,15 @@ static void lim_process_addba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
 			addba_req->addba_param_set.amsdu_supp);
 		if (qdf_status != QDF_STATUS_SUCCESS) {
 			pe_err("Failed to send addba response frame");
-			cdp_addba_resp_tx_completion(soc, peer,
-				addba_req->addba_param_set.tid,
-				WMI_MGMT_TX_COMP_TYPE_DISCARD);
+			cdp_addba_resp_tx_completion(
+					soc, mac_hdr->sa, session->vdev_id,
+					addba_req->addba_param_set.tid,
+					WMI_MGMT_TX_COMP_TYPE_DISCARD);
 		}
 	} else {
 		pe_err_rl("Failed to process addba request");
 	}
 
-	cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_ADDBA_REQ);
-
 error:
 	qdf_mem_free(addba_req);
 	return;
@@ -1725,13 +1712,6 @@ static void lim_process_delba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
 	uint32_t frame_len, status;
 	QDF_STATUS qdf_status;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	void *peer, *pdev;
-
-	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	if (!pdev) {
-		pe_err("pdev is NULL");
-		return;
-	}
 
 	mac_hdr = WMA_GET_RX_MAC_HEADER(rx_pkt_info);
 	body_ptr = WMA_GET_RX_MPDU_DATA(rx_pkt_info);
@@ -1757,18 +1737,9 @@ static void lim_process_delba_req(struct mac_context *mac_ctx, uint8_t *rx_pkt_i
 			status, frame_len);
 	}
 
-	peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_hdr->sa,
-					PEER_DEBUG_ID_WMA_DELBA_REQ);
-	if (!peer) {
-		pe_err("PEER [%pM] not found", mac_hdr->sa);
-		goto error;
-	}
-
-	qdf_status = cdp_delba_process(soc, peer,
+	qdf_status = cdp_delba_process(soc, mac_hdr->sa, session->vdev_id,
 			delba_req->delba_param_set.tid, delba_req->Reason.code);
 
-	cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_DELBA_REQ);
-
 	if (QDF_STATUS_SUCCESS != qdf_status)
 		pe_err("Failed to process delba request");
 

+ 6 - 28
core/mac/src/pe/lim/lim_send_management_frames.c

@@ -2482,11 +2482,10 @@ static QDF_STATUS lim_addba_rsp_tx_complete_cnf(void *context,
 	tSirMacMgmtHdr *mac_hdr;
 	tDot11faddba_rsp rsp;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	void *peer;
 	uint32_t frame_len;
 	QDF_STATUS status;
 	uint8_t *data;
+	struct wmi_mgmt_params *mgmt_params = (struct wmi_mgmt_params *)params;
 
 	if (tx_complete == WMI_MGMT_TX_COMP_TYPE_COMPLETE_OK)
 		pe_debug("Add ba response successfully sent");
@@ -2518,15 +2517,8 @@ static QDF_STATUS lim_addba_rsp_tx_complete_cnf(void *context,
 		goto error;
 	}
 
-	peer = cdp_peer_get_ref_by_addr(soc, pdev, mac_hdr->da,
-					PEER_DEBUG_ID_WMA_ADDBA_REQ);
-	if (!peer) {
-		pe_debug("no PEER found for mac_addr:%pM", mac_hdr->da);
-		goto error;
-	}
-	cdp_addba_resp_tx_completion(soc, peer, rsp.addba_param_set.tid,
-				     tx_complete);
-	cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_WMA_ADDBA_REQ);
+	cdp_addba_resp_tx_completion(soc, mac_hdr->da, mgmt_params->vdev_id,
+				     rsp.addba_param_set.tid, tx_complete);
 error:
 	if (buf)
 		qdf_nbuf_free(buf);
@@ -4996,7 +4988,6 @@ QDF_STATUS lim_send_addba_response_frame(struct mac_context *mac_ctx,
 	uint16_t buff_size, status_code, batimeout;
 	uint8_t dialog_token;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	void *peer, *pdev;
 	uint8_t he_frag = 0;
 	tpDphHashNode sta_ds;
 	uint16_t aid;
@@ -5004,23 +4995,10 @@ QDF_STATUS lim_send_addba_response_frame(struct mac_context *mac_ctx,
 
 	vdev_id = session->vdev_id;
 
-	pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	if (!pdev) {
-		pe_err("pdev is NULL");
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	peer = cdp_peer_get_ref_by_addr(soc, pdev, peer_mac,
-					PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP);
-	if (!peer) {
-		pe_err("PEER [%pM] not found", peer_mac);
-		return QDF_STATUS_E_FAILURE;
-	}
-
-	cdp_addba_responsesetup(soc, peer, tid, &dialog_token,
-		&status_code, &buff_size, &batimeout);
+	cdp_addba_responsesetup(soc, peer_mac, vdev_id, tid,
+				&dialog_token, &status_code, &buff_size,
+				&batimeout);
 
-	cdp_peer_release_ref(soc, peer, PEER_DEBUG_ID_LIM_SEND_ADDBA_RESP);
 	qdf_mem_zero((uint8_t *) &frm, sizeof(frm));
 	frm.Category.category = ACTION_CATEGORY_BACK;
 	frm.Action.action = ADDBA_RESPONSE;

+ 0 - 30
core/wma/inc/wma.h

@@ -1952,36 +1952,6 @@ uint16_t wma_vdev_get_pause_bitmap(uint8_t vdev_id)
 	return iface->pause_bitmap;
 }
 
-/**
- * wma_vdev_get_dp_handle() - Get vdev datapth handle
- * @vdev_id: the Id of the vdev to configure
- *
- * Return: Vdev datapath handle else NULL on error
- */
-static inline
-struct cdp_vdev *wma_vdev_get_vdev_dp_handle(uint8_t vdev_id)
-{
-	tp_wma_handle wma = (tp_wma_handle)cds_get_context(QDF_MODULE_ID_WMA);
-	struct wma_txrx_node *iface;
-
-	if (!wma) {
-		WMA_LOGE("%s: WMA context is invald!", __func__);
-		return NULL;
-	}
-
-	if (vdev_id >= wma->max_bssid)
-		return NULL;
-
-	iface = &wma->interfaces[vdev_id];
-
-	if (!iface || !iface->vdev) {
-		WMA_LOGE("%s: Vdev is NULL", __func__);
-		return NULL;
-	}
-
-	return wlan_vdev_get_dp_handle(iface->vdev);
-}
-
 /**
  * wma_vdev_is_device_in_low_pwr_mode - is device in power save mode
  * @vdev_id: the Id of the vdev to configure

+ 18 - 44
core/wma/src/wma_data.c

@@ -1031,8 +1031,9 @@ int wma_peer_state_change_event_handler(void *handle,
 {
 	WMI_PEER_STATE_EVENTID_param_tlvs *param_buf;
 	wmi_peer_state_event_fixed_param *event;
-	struct cdp_vdev *vdev;
+#ifdef QCA_LL_LEGACY_TX_FLOW_CONTROL
 	tp_wma_handle wma_handle = (tp_wma_handle) handle;
+#endif
 
 	if (!event_buff) {
 		WMA_LOGE("%s: Received NULL event ptr from FW", __func__);
@@ -1045,12 +1046,6 @@ int wma_peer_state_change_event_handler(void *handle,
 	}
 
 	event = param_buf->fixed_param;
-	vdev = wma_find_vdev_by_id(wma_handle, event->vdev_id);
-	if (!vdev) {
-		WMA_LOGD("%s: Couldn't find vdev for vdev_id: %d",
-			 __func__, event->vdev_id);
-		return -EINVAL;
-	}
 
 	if ((cdp_get_opmode(cds_get_context(QDF_MODULE_ID_SOC),
 			    event->vdev_id) == wlan_op_mode_sta) &&
@@ -1335,11 +1330,15 @@ wma_mgmt_tx_ack_comp_hdlr(void *wma_context, qdf_nbuf_t netbuf, int32_t status)
 	tp_wma_handle wma_handle = (tp_wma_handle) wma_context;
 	struct wlan_objmgr_pdev *pdev = (struct wlan_objmgr_pdev *)
 					wma_handle->pdev;
+	struct wmi_mgmt_params mgmt_params = {};
 	uint16_t desc_id;
+	uint8_t vdev_id;
 
 	desc_id = QDF_NBUF_CB_MGMT_TXRX_DESC_ID(netbuf);
+	vdev_id = mgmt_txrx_get_vdev_id(pdev, desc_id);
 
-	mgmt_txrx_tx_completion_handler(pdev, desc_id, status, NULL);
+	mgmt_params.vdev_id = vdev_id;
+	mgmt_txrx_tx_completion_handler(pdev, desc_id, status, &mgmt_params);
 }
 
 /**
@@ -1394,18 +1393,18 @@ QDF_STATUS wma_tx_attach(tp_wma_handle wma_handle)
 	struct cds_context *cds_handle =
 		(struct cds_context *) (wma_handle->cds_context);
 
-	/* Get the txRx Pdev handle */
-	struct cdp_pdev *txrx_pdev = cds_handle->pdev_txrx_ctx;
+	/* Get the txRx Pdev ID */
+	uint8_t pdev_id = WMI_PDEV_ID_SOC;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
 	/* Register for Tx Management Frames */
-	cdp_mgmt_tx_cb_set(soc, txrx_pdev, 0,
-			wma_mgmt_tx_dload_comp_hldr,
-			wma_mgmt_tx_ack_comp_hdlr, wma_handle);
+	cdp_mgmt_tx_cb_set(soc, pdev_id, 0,
+			   wma_mgmt_tx_dload_comp_hldr,
+			   wma_mgmt_tx_ack_comp_hdlr, wma_handle);
 
 	/* Register callback to send PEER_UNMAP_RESPONSE cmd*/
 	if (cdp_cfg_get_peer_unmap_conf_support(soc))
-		cdp_peer_unmap_sync_cb_set(soc, txrx_pdev,
+		cdp_peer_unmap_sync_cb_set(soc, pdev_id,
 					   wma_peer_unmap_conf_cb);
 
 	/* Store the Mac Context */
@@ -1426,21 +1425,17 @@ QDF_STATUS wma_tx_detach(tp_wma_handle wma_handle)
 {
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
-	/* Get the Vos Context */
-	struct cds_context *cds_handle =
-		(struct cds_context *) (wma_handle->cds_context);
-
-	/* Get the txRx Pdev handle */
-	struct cdp_pdev *txrx_pdev = cds_handle->pdev_txrx_ctx;
+	/* Get the txRx Pdev ID */
+	uint8_t pdev_id = WMI_PDEV_ID_SOC;
 
 	if (!soc) {
 		WMA_LOGE("%s:SOC context is NULL", __func__);
 		return QDF_STATUS_E_FAILURE;
 	}
 
-	if (txrx_pdev) {
+	if (pdev_id != OL_TXRX_INVALID_PDEV_ID) {
 		/* Deregister with TxRx for Tx Mgmt completion call back */
-		cdp_mgmt_tx_cb_set(soc, txrx_pdev, 0, NULL, NULL, txrx_pdev);
+		cdp_mgmt_tx_cb_set(soc, pdev_id, 0, NULL, NULL, NULL);
 	}
 
 	/* Reset Tx Frm Callbacks */
@@ -2415,7 +2410,6 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 	int32_t is_high_latency;
 	bool is_wmi_mgmt_tx = false;
-	struct cdp_vdev *txrx_vdev;
 	enum frame_index tx_frm_index = GENERIC_NODOWNLD_NOACK_COMP_INDEX;
 	tpSirMacFrameCtl pFc = (tpSirMacFrameCtl) (qdf_nbuf_data(tx_frame));
 	uint8_t use_6mbps = 0;
@@ -2447,19 +2441,6 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 		return QDF_STATUS_E_FAILURE;
 	}
 	iface = &wma_handle->interfaces[vdev_id];
-	if (!iface->vdev) {
-		WMA_LOGE("iface->vdev is NULL");
-		cds_packet_free((void *)tx_frame);
-		return QDF_STATUS_E_FAILURE;
-	}
-	/* Get the vdev handle from vdev id */
-	txrx_vdev = wlan_vdev_get_dp_handle(iface->vdev);
-
-	if (!txrx_vdev) {
-		WMA_LOGE("TxRx Vdev Handle is NULL");
-		cds_packet_free((void *)tx_frame);
-		return QDF_STATUS_E_FAILURE;
-	}
 
 	if (!soc) {
 		WMA_LOGE("%s:SOC context is NULL", __func__);
@@ -2622,18 +2603,12 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 	if (frmType == TXRX_FRM_802_11_DATA) {
 		qdf_nbuf_t ret;
 		qdf_nbuf_t skb = (qdf_nbuf_t) tx_frame;
-		void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 
 		struct wma_decap_info_t decap_info;
 		struct ieee80211_frame *wh =
 			(struct ieee80211_frame *)qdf_nbuf_data(skb);
 		unsigned long curr_timestamp = qdf_mc_timer_get_system_ticks();
 
-		if (!pdev) {
-			cds_packet_free((void *)tx_frame);
-			return QDF_STATUS_E_FAULT;
-		}
-
 		/*
 		 * 1) TxRx Module expects data input to be 802.3 format
 		 * So Decapsulation has to be done.
@@ -2721,8 +2696,7 @@ QDF_STATUS wma_tx_packet(void *wma_context, void *tx_frame, uint16_t frmLen,
 		return QDF_STATUS_SUCCESS;
 	}
 
-	ctrl_pdev = cdp_get_ctrl_pdev_from_vdev(soc,
-				txrx_vdev);
+	ctrl_pdev = cdp_get_ctrl_pdev_from_vdev(soc, vdev_id);
 	if (!ctrl_pdev) {
 		WMA_LOGE("ol_pdev_handle is NULL\n");
 		cds_packet_free((void *)tx_frame);

+ 24 - 43
core/wma/src/wma_dev_if.c

@@ -495,17 +495,15 @@ wma_cdp_vdev_detach(ol_txrx_soc_handle soc, tp_wma_handle wma_handle,
 {
 	struct wma_txrx_node *iface = &wma_handle->interfaces[vdev_id];
 	struct wlan_objmgr_vdev *vdev = iface->vdev;
-	struct cdp_vdev *cdp_vdev;
 
 	if (!vdev) {
 		WMA_LOGE(FL("vdev is NULL"));
 		return;
 	}
 
-	cdp_vdev = wlan_vdev_get_dp_handle(vdev);
-	if (soc && cdp_vdev) {
+	if (soc && wlan_vdev_get_id(vdev) != WLAN_INVALID_VDEV_ID) {
 		wlan_vdev_set_dp_handle(vdev, NULL);
-		cdp_vdev_detach(soc, cdp_vdev, NULL, NULL);
+		cdp_vdev_detach(soc, vdev_id, NULL, NULL);
 	}
 }
 
@@ -525,6 +523,7 @@ wma_release_vdev_ref(struct wma_txrx_node *iface)
 
 	vdev = iface->vdev;
 
+	iface->vdev_active = false;
 	iface->vdev = NULL;
 	if (vdev)
 		wlan_objmgr_vdev_release_ref(vdev, WLAN_LEGACY_WMA_ID);
@@ -1496,8 +1495,6 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 	struct peer_flush_params param = {0};
 	uint8_t *peer_mac_addr;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	void *pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	void *vdev;
 	QDF_STATUS qdf_status = QDF_STATUS_SUCCESS;
 	uint32_t bitmap = 1 << CDP_PEER_DELETE_NO_SPECIAL;
 	bool peer_unmap_conf_support_enabled;
@@ -1532,18 +1529,8 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 		QDF_BUG(0);
 		return QDF_STATUS_E_INVAL;
 	}
-	if (cds_get_conparam() == QDF_GLOBAL_MONITOR_MODE)
-		vdev = cdp_get_mon_vdev_from_pdev(soc, pdev);
-	else
-		vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
-	if (!vdev) {
-		WMA_LOGE("%s vdev is null for peer peer->mac_addr %pM",
-			 __func__, peer_mac_addr);
-		QDF_BUG(0);
-		return QDF_STATUS_E_INVAL;
-	}
 
-	cdp_peer_teardown(soc, vdev, peer);
+	cdp_peer_teardown(soc, vdev_id, peer);
 
 	if (roam_synch_in_progress)
 		goto peer_detach;
@@ -1575,8 +1562,8 @@ QDF_STATUS wma_remove_peer(tp_wma_handle wma, uint8_t *bssid,
 	}
 
 peer_detach:
-	WMA_LOGD("%s: vdev %pK is detaching %pK with peer_addr %pM vdevid %d peer_count %d",
-		__func__, vdev, peer, peer_mac_addr, vdev_id,
+	WMA_LOGD("%s: vdevid %d is detaching with peer_addr %pM peer_count %d",
+		__func__, vdev_id, peer_mac_addr,
 		wma->interfaces[vdev_id].peer_count);
 	/* Copy peer mac to find and delete objmgr peer */
 	qdf_mem_copy(peer_mac, peer_mac_addr, QDF_MAC_ADDR_SIZE);
@@ -1587,7 +1574,7 @@ peer_detach:
 				 __func__, peer_mac_addr);
 			cdp_peer_detach_force_delete(soc, peer);
 		} else {
-			cdp_peer_delete_sync(soc, peer,
+			cdp_peer_delete_sync(soc, vdev_id, peer_mac_addr,
 					     wma_peer_unmap_conf_cb,
 					     bitmap);
 		}
@@ -1597,11 +1584,11 @@ peer_detach:
 				 __func__, peer_mac_addr);
 		}
 		if (peer_unmap_conf_support_enabled)
-			cdp_peer_delete_sync(soc, peer,
+			cdp_peer_delete_sync(soc, vdev_id, peer_mac_addr,
 					     wma_peer_unmap_conf_cb,
 					     bitmap);
 		else
-			cdp_peer_delete(soc, peer, bitmap);
+			cdp_peer_delete(soc, vdev_id, peer_mac_addr, bitmap);
 	}
 
 	wma_remove_objmgr_peer(wma, vdev_id, peer_mac);
@@ -1830,7 +1817,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 	 * where the HTT peer map event is received before the peer object
 	 * is created in the data path
 	 */
-	peer = cdp_peer_create(dp_soc, vdev, peer_addr);
+	peer = cdp_peer_create(dp_soc, vdev_id, peer_addr);
 	if (!peer) {
 		WMA_LOGE("%s : Unable to attach peer %pM", __func__, peer_addr);
 		wlan_objmgr_peer_obj_delete(obj_peer);
@@ -1848,7 +1835,7 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 		WMA_LOGD("%s: LFR3: Created peer %pK with peer_addr %pM vdev_id %d, peer_count - %d",
 			 __func__, peer, peer_addr, vdev_id,
 			 wma->interfaces[vdev_id].peer_count);
-		cdp_peer_setup(dp_soc, vdev, peer);
+		cdp_peer_setup(dp_soc, vdev_id, peer_addr);
 		return QDF_STATUS_SUCCESS;
 	}
 	param.peer_addr = peer_addr;
@@ -1859,12 +1846,12 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 		WMA_LOGE("%s : Unable to create peer in Target", __func__);
 		if (cdp_cfg_get_peer_unmap_conf_support(dp_soc))
 			cdp_peer_delete_sync(
-				dp_soc, peer,
+				dp_soc, vdev_id, peer_addr,
 				wma_peer_unmap_conf_cb,
 				1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
 		else
 			cdp_peer_delete(
-				dp_soc, peer,
+				dp_soc, vdev_id, peer_addr,
 				1 << CDP_PEER_DO_NOT_START_UNMAP_TIMER);
 		wlan_objmgr_peer_obj_delete(obj_peer);
 		goto err;
@@ -1876,12 +1863,12 @@ QDF_STATUS wma_create_peer(tp_wma_handle wma, struct cdp_pdev *pdev,
 
 	wlan_roam_debug_log(vdev_id, DEBUG_PEER_CREATE_SEND,
 			    DEBUG_INVALID_PEER_ID, peer_addr, peer, 0, 0);
-	cdp_peer_setup(dp_soc, vdev, peer);
+	cdp_peer_setup(dp_soc, vdev_id, peer_addr);
 
 	WMA_LOGD("%s: Initialized peer with peer_addr %pM vdev_id %d",
 		__func__, peer_addr, vdev_id);
 
-	mac_addr_raw = cdp_get_vdev_mac_addr(dp_soc, vdev);
+	mac_addr_raw = cdp_get_vdev_mac_addr(dp_soc, vdev_id);
 	if (!mac_addr_raw) {
 		WMA_LOGE("%s: peer mac addr is NULL", __func__);
 		return QDF_STATUS_E_FAULT;
@@ -1931,7 +1918,7 @@ static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev, uint32_t vdev_id,
 			       struct del_bss_resp *vdev_stop_resp,
 			       uint8_t type)
 {
-	void *peer, *vdev;
+	void *peer;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	uint8_t *mac_addr = NULL;
 	struct wma_target_req *del_req;
@@ -1939,15 +1926,9 @@ static int wma_remove_bss_peer(tp_wma_handle wma, void *pdev, uint32_t vdev_id,
 	QDF_STATUS qdf_status;
 	struct qdf_mac_addr bssid;
 
-	vdev = cdp_get_vdev_from_vdev_id(soc, pdev, vdev_id);
-	if (!vdev) {
-		WMA_LOGE(FL("vdev is NULL for vdev_id = %d"), vdev_id);
-		return -EINVAL;
-	}
-
 	if (wma_is_vdev_in_ibss_mode(wma, vdev_id) ||
 	    WMA_IS_VDEV_IN_NDI_MODE(wma->interfaces, vdev_id)) {
-		mac_addr = cdp_get_vdev_mac_addr(soc, vdev);
+		mac_addr = cdp_get_vdev_mac_addr(soc, vdev_id);
 		if (!mac_addr) {
 			WMA_LOGE(FL("mac_addr is NULL for vdev_id = %d"),
 				 vdev_id);
@@ -2293,11 +2274,13 @@ __wma_handle_vdev_stop_rsp(struct vdev_stop_response *resp_event)
 				 __func__, peer, bssid.bytes,
 				 resp_event->vdev_id, iface->peer_count);
 			if (cdp_cfg_get_peer_unmap_conf_support(soc))
-				cdp_peer_delete_sync(soc, peer,
+				cdp_peer_delete_sync(soc, resp_event->vdev_id,
+						     bssid.bytes,
 						     wma_peer_unmap_conf_cb,
 						     1 << CDP_PEER_DELETE_NO_SPECIAL);
 			else
-				cdp_peer_delete(soc, peer,
+				cdp_peer_delete(soc, resp_event->vdev_id,
+						bssid.bytes,
 						1 << CDP_PEER_DELETE_NO_SPECIAL);
 			wma_remove_objmgr_peer(wma, resp_event->vdev_id,
 					       bssid.bytes);
@@ -2765,7 +2748,7 @@ QDF_STATUS wma_post_vdev_create_setup(struct wlan_objmgr_vdev *vdev)
 			WMA_LOGE("Failed to configure active APF mode");
 	}
 
-	cdp_data_tx_cb_set(soc, txrx_vdev_handle,
+	cdp_data_tx_cb_set(soc, vdev_id,
 			   wma_data_tx_ack_comp_hdlr,
 			   wma_handle);
 
@@ -5204,7 +5187,6 @@ int32_t wma_find_vdev_by_type(tp_wma_handle wma, int32_t type)
 void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
 				      tpDisableIntraBssFwd pdis_intra_fwd)
 {
-	struct cdp_vdev *txrx_vdev;
 	struct wlan_objmgr_vdev *vdev;
 
 	WMA_LOGD("%s:intra_fwd:vdev(%d) intrabss_dis=%s",
@@ -5212,10 +5194,9 @@ void wma_set_vdev_intrabss_fwd(tp_wma_handle wma_handle,
 		 (pdis_intra_fwd->disableintrabssfwd ? "true" : "false"));
 
 	vdev = wma_handle->interfaces[pdis_intra_fwd->sessionId].vdev;
-	txrx_vdev = wlan_vdev_get_dp_handle(vdev);
 	cdp_cfg_vdev_rx_set_intrabss_fwd(cds_get_context(QDF_MODULE_ID_SOC),
-				    txrx_vdev,
-				    pdis_intra_fwd->disableintrabssfwd);
+					 pdis_intra_fwd->sessionId,
+					 pdis_intra_fwd->disableintrabssfwd);
 }
 
 void wma_store_pdev(void *wma_ctx, struct wlan_objmgr_pdev *pdev)

+ 5 - 12
core/wma/src/wma_main.c

@@ -915,17 +915,10 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
 		break;
 	case GEN_CMD:
 	{
-		struct cdp_vdev *vdev = NULL;
 		struct wma_txrx_node *intr = wma->interfaces;
 		wmi_vdev_custom_aggr_type_t aggr_type =
 			WMI_VDEV_CUSTOM_AGGR_TYPE_AMSDU;
 
-		vdev = wma_find_vdev_by_id(wma, privcmd->param_vdev_id);
-		if (!vdev) {
-			WMA_LOGE("%s:Invalid vdev handle", __func__);
-			return;
-		}
-
 		WMA_LOGD("gen pid %d pval %d", privcmd->param_id,
 			 privcmd->param_value);
 
@@ -938,8 +931,8 @@ static void wma_process_cli_set_cmd(tp_wma_handle wma,
 			}
 
 			if (privcmd->param_id == GEN_VDEV_PARAM_AMPDU) {
-				ret = cdp_aggr_cfg(soc, vdev,
-						privcmd->param_value, 0);
+				ret = cdp_aggr_cfg(soc, privcmd->param_vdev_id,
+						   privcmd->param_value, 0);
 				if (ret)
 					WMA_LOGE("cdp_aggr_cfg set ampdu failed ret %d",
 						ret);
@@ -2608,6 +2601,9 @@ void wma_vdev_deinit(struct wma_txrx_node *vdev)
 		vdev->beacon = NULL;
 	}
 
+	if (vdev->vdev_active == true)
+		vdev->vdev_active = false;
+
 	if (vdev->addBssStaContext) {
 		qdf_mem_free(vdev->addBssStaContext);
 		vdev->addBssStaContext = NULL;
@@ -3320,8 +3316,6 @@ QDF_STATUS wma_open(struct wlan_objmgr_psoc *psoc,
 		wma_vdev_update_pause_bitmap);
 	pmo_register_get_pause_bitmap(wma_handle->psoc,
 		wma_vdev_get_pause_bitmap);
-	pmo_register_get_vdev_dp_handle(wma_handle->psoc,
-					wma_vdev_get_vdev_dp_handle);
 	pmo_register_is_device_in_low_pwr_mode(wma_handle->psoc,
 		wma_vdev_is_device_in_low_pwr_mode);
 	pmo_register_get_dtim_period_callback(wma_handle->psoc,
@@ -4467,7 +4461,6 @@ QDF_STATUS wma_close(void)
 	pmo_unregister_is_device_in_low_pwr_mode(wma_handle->psoc);
 	pmo_unregister_get_pause_bitmap(wma_handle->psoc);
 	pmo_unregister_pause_bitmap_notifier(wma_handle->psoc);
-	pmo_unregister_get_vdev_dp_handle(wma_handle->psoc);
 
 	tgt_psoc_info = wlan_psoc_get_tgt_if_handle(wma_handle->psoc);
 	init_deinit_free_num_units(wma_handle->psoc, tgt_psoc_info);

+ 10 - 43
core/wma/src/wma_mgmt.c

@@ -2093,8 +2093,7 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
 	struct wma_txrx_node *iface = NULL;
 	enum cdp_sec_type sec_type = cdp_sec_type_none;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	struct cdp_pdev *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
-	struct cdp_vdev *txrx_vdev;
+	void *txrx_pdev = cds_get_context(QDF_MODULE_ID_TXRX);
 	uint32_t pn[4] = {0, 0, 0, 0};
 	struct cdp_peer *peer;
 	bool skip_set_key;
@@ -2118,7 +2117,6 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	txrx_vdev = wma_find_vdev_by_id(wma_handle, key_params->vdev_id);
 	peer = cdp_peer_find_by_addr(soc, txrx_pdev, key_params->peer_mac);
 	iface = &wma_handle->interfaces[key_params->vdev_id];
 
@@ -2282,7 +2280,8 @@ static QDF_STATUS wma_setup_install_key_cmd(tp_wma_handle wma_handle,
 		  (key_params->unicast) ? "unicast" : "group",
 		  key_params->key_rsc[3], key_params->key_rsc[2],
 		  key_params->key_rsc[1], key_params->key_rsc[0]);
-	cdp_set_pn_check(soc, txrx_vdev, peer, sec_type, pn);
+	cdp_set_pn_check(soc, key_params->vdev_id, key_params->peer_mac,
+			 sec_type, pn);
 	cdp_set_key(soc, peer, key_params->unicast,
 		    (uint32_t *)(key_params->key_data +
 				WMA_IV_KEY_LEN +
@@ -2423,18 +2422,11 @@ static void wma_set_ibsskey_helper(tp_wma_handle wma_handle,
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	uint32_t i;
 	uint32_t def_key_idx = 0;
-	struct cdp_vdev *txrx_vdev;
 	int opmode;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	struct wlan_objmgr_vdev *vdev;
 
 	WMA_LOGD("BSS key setup for peer");
-	txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->vdev_id);
-	if (!txrx_vdev) {
-		WMA_LOGE("%s:Invalid vdev handle", __func__);
-		key_info->status = QDF_STATUS_E_FAILURE;
-		return;
-	}
 
 	qdf_mem_zero(&key_params, sizeof(key_params));
 	opmode = cdp_get_opmode(soc, key_info->vdev_id);
@@ -2514,18 +2506,11 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info)
 	uint32_t i;
 	uint32_t def_key_idx = 0;
 	uint32_t wlan_opmode;
-	struct cdp_vdev *txrx_vdev;
 	uint8_t *mac_addr, *bssid;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	struct wlan_objmgr_vdev *vdev;
 
 	WMA_LOGD("BSS key setup");
-	txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->vdev_id);
-	if (!txrx_vdev) {
-		WMA_LOGE("%s:Invalid vdev handle", __func__);
-		key_info->status = QDF_STATUS_E_FAILURE;
-		goto out;
-	}
 	wlan_opmode = cdp_get_opmode(soc, key_info->vdev_id);
 
 	/*
@@ -2558,7 +2543,7 @@ void wma_set_bsskey(tp_wma_handle wma_handle, tpSetBssKeyParams key_info)
 		}
 		qdf_mem_copy(key_params.peer_mac, bssid, QDF_MAC_ADDR_SIZE);
 	} else {
-		mac_addr = cdp_get_vdev_mac_addr(soc, txrx_vdev);
+		mac_addr = cdp_get_vdev_mac_addr(soc, key_params.vdev_id);
 		if (!mac_addr) {
 			WMA_LOGE("%s: mac_addr is NULL for vdev with id %d",
 				 __func__, key_info->vdev_id);
@@ -2649,7 +2634,6 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
 	int32_t i;
 	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct cdp_pdev *txrx_pdev;
-	struct cdp_vdev *txrx_vdev;
 	void *peer;
 	uint8_t num_keys = 0;
 	struct wma_set_key_params key_params;
@@ -2676,12 +2660,6 @@ void wma_set_stakey(tp_wma_handle wma_handle, tpSetStaKeyParams key_info)
 		goto out;
 	}
 
-	txrx_vdev = wma_find_vdev_by_id(wma_handle, key_info->vdev_id);
-	if (!txrx_vdev) {
-		WMA_LOGE("%s:TxRx Vdev Handle is NULL", __func__);
-		key_info->status = QDF_STATUS_E_FAILURE;
-		goto out;
-	}
 	opmode = cdp_get_opmode(soc, key_info->vdev_id);
 
 	if (key_info->defWEPIdx == WMA_INVALID_KEY_IDX &&
@@ -3396,11 +3374,11 @@ static int wma_process_mgmt_tx_completion(tp_wma_handle wma_handle,
 	QDF_STATUS ret;
 #if !defined(REMOVE_PKT_LOG)
 	uint8_t vdev_id = 0;
-	struct cdp_vdev *txrx_vdev;
 	ol_txrx_pktdump_cb packetdump_cb;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 	enum tx_status pktdump_status;
 #endif
+	struct wmi_mgmt_params mgmt_params = {};
 
 	if (!wma_handle) {
 		WMA_LOGE("%s: wma handle is NULL", __func__);
@@ -3424,7 +3402,7 @@ static int wma_process_mgmt_tx_completion(tp_wma_handle wma_handle,
 
 #if !defined(REMOVE_PKT_LOG)
 	vdev_id = mgmt_txrx_get_vdev_id(pdev, desc_id);
-	txrx_vdev = wma_find_vdev_by_id(wma_handle, vdev_id);
+	mgmt_params.vdev_id = vdev_id;
 	packetdump_cb = wma_handle->wma_mgmt_tx_packetdump_cb;
 	pktdump_status = wma_mgmt_pktdump_status_map(status);
 	if (packetdump_cb)
@@ -3432,7 +3410,8 @@ static int wma_process_mgmt_tx_completion(tp_wma_handle wma_handle,
 			      buf, pktdump_status, TX_MGMT_PKT);
 #endif
 
-	ret = mgmt_txrx_tx_completion_handler(pdev, desc_id, status, NULL);
+	ret = mgmt_txrx_tx_completion_handler(pdev, desc_id, status,
+					      &mgmt_params);
 
 	if (ret != QDF_STATUS_SUCCESS) {
 		WMA_LOGE("%s: Failed to process mgmt tx completion", __func__);
@@ -4198,7 +4177,6 @@ int wma_form_rx_packet(qdf_nbuf_t buf,
 #if !defined(REMOVE_PKT_LOG)
 	ol_txrx_pktdump_cb packetdump_cb;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	struct cdp_vdev *txrx_vdev;
 #endif
 	static uint8_t limit_prints_invalid_len = RATE_LIMIT - 1;
 	static uint8_t limit_prints_load_unload = RATE_LIMIT - 1;
@@ -4366,8 +4344,6 @@ int wma_form_rx_packet(qdf_nbuf_t buf,
 
 #if !defined(REMOVE_PKT_LOG)
 	packetdump_cb = wma_handle->wma_mgmt_rx_packetdump_cb;
-	txrx_vdev = wma_find_vdev_by_id(wma_handle,
-					rx_pkt->pkt_meta.session_id);
 	if ((mgt_type == IEEE80211_FC0_TYPE_MGT &&
 		mgt_subtype != MGMT_SUBTYPE_BEACON) &&
 		packetdump_cb)
@@ -4701,7 +4677,6 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev,
 	struct wmi_mgmt_params *mgmt_params =
 			(struct wmi_mgmt_params *)mgmt_tx_params;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
-	struct cdp_vdev *txrx_vdev;
 
 	if (!mgmt_params) {
 		WMA_LOGE("%s: mgmt_params ptr passed is NULL", __func__);
@@ -4720,23 +4695,15 @@ QDF_STATUS wma_mgmt_unified_cmd_send(struct wlan_objmgr_vdev *vdev,
 		return QDF_STATUS_E_INVAL;
 	}
 
-	if (!wma_handle->interfaces[mgmt_params->vdev_id].vdev) {
-		WMA_LOGE("%s: vdev is NULL for vdev_%d",
-			 __func__, mgmt_params->vdev_id);
-		return QDF_STATUS_E_INVAL;
-	}
-	txrx_vdev = wlan_vdev_get_dp_handle
-			(wma_handle->interfaces[mgmt_params->vdev_id].vdev);
-
 	if (wmi_service_enabled(wma_handle->wmi_handle,
 				   wmi_service_mgmt_tx_wmi)) {
 		status = wmi_mgmt_unified_cmd_send(wma_handle->wmi_handle,
 						   mgmt_params);
-	} else if (txrx_vdev) {
+	} else {
 		QDF_NBUF_CB_MGMT_TXRX_DESC_ID(buf)
 						= mgmt_params->desc_id;
 
-		ret = cdp_mgmt_send_ext(soc, txrx_vdev, buf,
+		ret = cdp_mgmt_send_ext(soc, mgmt_params->vdev_id, buf,
 					mgmt_params->tx_type,
 					mgmt_params->use_6mbps,
 					mgmt_params->chanfreq);

+ 2 - 15
core/wma/src/wma_utils.c

@@ -3273,7 +3273,6 @@ int32_t wma_txrx_fw_stats_reset(tp_wma_handle wma_handle,
 				uint8_t vdev_id, uint32_t value)
 {
 	struct ol_txrx_stats_req req;
-	struct cdp_vdev *vdev;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
 	if (!soc) {
@@ -3281,14 +3280,9 @@ int32_t wma_txrx_fw_stats_reset(tp_wma_handle wma_handle,
 		return -EINVAL;
 	}
 
-	vdev = wma_find_vdev_by_id(wma_handle, vdev_id);
-	if (!vdev) {
-		WMA_LOGE("%s:Invalid vdev handle", __func__);
-		return -EINVAL;
-	}
 	qdf_mem_zero(&req, sizeof(req));
 	req.stats_type_reset_mask = value;
-	cdp_fw_stats_get(soc, vdev, &req, false, false);
+	cdp_fw_stats_get(soc, vdev_id, &req, false, false);
 
 	return 0;
 }
@@ -3339,7 +3333,6 @@ int32_t wma_set_txrx_fw_stats_level(tp_wma_handle wma_handle,
 				    uint8_t vdev_id, uint32_t value)
 {
 	struct ol_txrx_stats_req req;
-	struct cdp_vdev *vdev;
 	uint32_t l_up_mask;
 	void *soc = cds_get_context(QDF_MODULE_ID_SOC);
 
@@ -3348,12 +3341,6 @@ int32_t wma_set_txrx_fw_stats_level(tp_wma_handle wma_handle,
 		return -EINVAL;
 	}
 
-	vdev = wma_find_vdev_by_id(wma_handle, vdev_id);
-	if (!vdev) {
-		WMA_LOGE("%s:Invalid vdev handle", __func__);
-		return -EINVAL;
-	}
-
 	if (wma_is_valid_fw_stats_cmd(value) == false)
 		return -EINVAL;
 
@@ -3364,7 +3351,7 @@ int32_t wma_set_txrx_fw_stats_level(tp_wma_handle wma_handle,
 	l_up_mask = 1 << (value - 1);
 	req.stats_type_upload_mask = l_up_mask;
 
-	cdp_fw_stats_get(soc, vdev, &req, false, true);
+	cdp_fw_stats_get(soc, vdev_id, &req, false, true);
 
 	return 0;
 }