Sfoglia il codice sorgente

qcacmn: cmn_ops changes in datapath for umac-dp decoupling

Change cmn_ops APIs to replace pdev, vdev and peer
dp handles with pdev_id, vdev_id and peer mac address
along with dp soc handle

Change-Id: I5716a87cad56b1dfe8dd56f193bbb6ff923a6af1
Pavankumar Nandeshwar 5 anni fa
parent
commit
a234716d1d

File diff suppressed because it is too large
+ 200 - 237
dp/inc/cdp_txrx_cmn.h


+ 4 - 2
dp/inc/cdp_txrx_cmn_reg.h

@@ -71,7 +71,8 @@ dp_soc_attach_wifi3(struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
 		    struct hif_opaque_softc *hif_handle,
 		    HTC_HANDLE htc_handle, qdf_device_t qdf_osdev,
 		    struct ol_if_ops *ol_ops, uint16_t device_id);
-void *dp_soc_init_wifi3(void *soc, struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
+void *dp_soc_init_wifi3(struct cdp_soc_t *soc,
+			struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
 			struct hif_opaque_softc *hif_handle,
 			HTC_HANDLE htc_handle, qdf_device_t qdf_osdev,
 			struct ol_if_ops *ol_ops, uint16_t device_id);
@@ -88,7 +89,8 @@ struct cdp_soc_t *dp_soc_attach_wifi3(struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
 }
 
 static inline
-void *dp_soc_init_wifi3(void *soc, struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
+void *dp_soc_init_wifi3(struct cdp_soc_t *soc,
+			struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
 			struct hif_opaque_softc *hif_handle,
 			HTC_HANDLE htc_handle, qdf_device_t qdf_osdev,
 			struct ol_if_ops *ol_ops, uint16_t device_id)

+ 7 - 5
dp/inc/cdp_txrx_cmn_struct.h

@@ -676,10 +676,11 @@ typedef void
 
 /**
  * ol_txrx_tx_fp - top-level transmit function
- * @data_vdev - handle to the virtual device object
+ * @soc - dp soc handle
+ * @vdev_id - handle to the virtual device object
  * @msdu_list - list of network buffers
  */
-typedef qdf_nbuf_t (*ol_txrx_tx_fp)(struct cdp_vdev *data_vdev,
+typedef qdf_nbuf_t (*ol_txrx_tx_fp)(struct cdp_soc_t *soc, uint8_t vdev_id,
 				    qdf_nbuf_t msdu_list);
 
 /**
@@ -2026,17 +2027,18 @@ enum cdp_dp_cfg {
 
 /**
  * struct cdp_peer_cookie - cookie used when creating peer
+ * @ctx: context passed to be used by consumer
+ * @mac_addr: MAC address of peer
  * @peer_id: peer id
  * @pdev_id: pdev_id
- * @mac_addr: MAC address of peer
  * @cookie: cookie to be used by consumer
- * @ctx: context passed to be used by consumer
  */
 struct cdp_peer_cookie {
+	struct cdp_stats_cookie *ctx;
 	uint8_t mac_addr[QDF_MAC_ADDR_SIZE];
 	uint8_t peer_id;
+	uint8_t pdev_id;
 	uint8_t cookie;
-	struct cdp_stats_cookie *ctx;
 };
 
 /**

+ 3 - 3
dp/inc/cdp_txrx_ctrl_def.h

@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011-2016,2018 The Linux Foundation. All rights reserved.
+ * Copyright (c) 2011-2016,2018-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
@@ -73,9 +73,9 @@ void ol_ll_pdev_tx_unlock(void *);
 
 #else
 #define OSIF_VAP_TX_LOCK(_y, _x)  cdp_vdev_tx_lock( \
-			_y, wlan_vdev_get_dp_handle((_x)->ctrl_vdev))
+			_y, wlan_vdev_get_id((_x)->ctrl_vdev))
 #define OSIF_VAP_TX_UNLOCK(_y, _x) cdp_vdev_tx_unlock( \
-			_y, wlan_vdev_get_dp_handle((_x)->ctrl_vdev))
+			_y, wlan_vdev_get_id((_x)->ctrl_vdev))
 
 #define OL_TX_FLOW_CTRL_LOCK(_x)
 #define OL_TX_FLOW_CTRL_UNLOCK(_x)

+ 170 - 118
dp/inc/cdp_txrx_ops.h

@@ -67,16 +67,17 @@ struct cdp_cmn_ops {
 
 	QDF_STATUS (*txrx_soc_attach_target)(ol_txrx_soc_handle soc);
 
-	int (*txrx_pdev_attach_target)(struct cdp_pdev *pdev);
+	int (*txrx_pdev_attach_target)(ol_txrx_soc_handle soc, uint8_t pdev_id);
 
 	struct cdp_vdev *(*txrx_vdev_attach)
-		(struct cdp_pdev *pdev, uint8_t *vdev_mac_addr,
+		(struct cdp_soc_t *soc, uint8_t pdev_id, uint8_t *mac,
 		 uint8_t vdev_id, enum wlan_op_mode op_mode,
 		 enum wlan_op_subtype subtype);
 
-	void (*txrx_vdev_detach)
-		(struct cdp_vdev *vdev, ol_txrx_vdev_delete_cb callback,
-		 void *cb_context);
+	QDF_STATUS
+	(*txrx_vdev_detach)(struct cdp_soc_t *cdp_soc, uint8_t vdev_id,
+			    ol_txrx_vdev_delete_cb callback,
+			    void *cb_context);
 
 	struct cdp_pdev *(*txrx_pdev_attach)
 		(ol_txrx_soc_handle soc, HTC_HANDLE htc_pdev,
@@ -84,39 +85,49 @@ struct cdp_cmn_ops {
 
 	int (*txrx_pdev_post_attach)(struct cdp_pdev *pdev);
 
-	void (*txrx_pdev_pre_detach)(struct cdp_pdev *pdev, int force);
+	void
+	(*txrx_pdev_pre_detach)(struct cdp_pdev *pdev, int force);
 
-	void (*txrx_pdev_detach)(struct cdp_pdev *pdev, int force);
+	QDF_STATUS
+	(*txrx_pdev_detach)(struct cdp_soc_t *psoc, uint8_t pdev_id,
+			    int force);
 
 	/**
 	 * txrx_pdev_deinit() - Deinitialize pdev and dp ring memory
-	 * @pdev: Dp pdev handle
+	 * @soc: soc dp handle
+	 * @pdev_id: id of Dp pdev handle
 	 * @force: Force deinit or not
 	 *
-	 * Return: None
+	 * Return: QDF_STATUS
 	 */
-	void (*txrx_pdev_deinit)(struct cdp_pdev *pdev, int force);
+	QDF_STATUS
+	(*txrx_pdev_deinit)(struct cdp_soc_t *soc, uint8_t pdev_id,
+			    int force);
 
 	void *(*txrx_peer_create)
-		(struct cdp_vdev *vdev, uint8_t *peer_mac_addr);
+		(ol_txrx_soc_handle soc, uint8_t vdev_id,
+		uint8_t *peer_mac_addr);
 
-	void (*txrx_peer_setup)
-		(struct cdp_vdev *vdev_hdl, void *peer_hdl);
+	QDF_STATUS
+	(*txrx_peer_setup)(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
+			   uint8_t *peer_mac);
 
-	void (*txrx_cp_peer_del_response)
-		(ol_txrx_soc_handle soc, struct cdp_vdev *vdev_hdl,
+	QDF_STATUS
+	(*txrx_cp_peer_del_response)
+		(ol_txrx_soc_handle soc, uint8_t vdev_id,
 		 uint8_t *peer_mac_addr);
 
-	void (*txrx_peer_teardown)
-		(struct cdp_vdev *vdev_hdl, void *peer_hdl);
+	QDF_STATUS
+	(*txrx_peer_teardown)
+		(struct cdp_soc_t *soc, uint8_t vdev_id, uint8_t *peer_mac);
 
 	int (*txrx_peer_add_ast)
-		(ol_txrx_soc_handle soc, struct cdp_peer *peer_hdl,
+		(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac,
 		uint8_t *mac_addr, enum  cdp_txrx_ast_entry_type type,
 		uint32_t flags);
 
 	int (*txrx_peer_update_ast)
-		(ol_txrx_soc_handle soc, struct cdp_peer *peer_hdl,
+		(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *peer_mac,
 		uint8_t *mac_addr, uint32_t flags);
 
 	bool (*txrx_peer_get_ast_info_by_soc)
@@ -139,11 +150,12 @@ struct cdp_cmn_ops {
 		txrx_ast_free_cb callback,
 		void *cookie);
 
-	void (*txrx_peer_delete)(void *peer, uint32_t bitmap);
-
-	void (*txrx_vdev_flush_peers)(struct cdp_vdev *vdev, bool unmap_only);
+	QDF_STATUS
+	(*txrx_peer_delete)(struct cdp_soc_t *soc, uint8_t vdev_id,
+			    uint8_t *peer_mac, uint32_t bitmap);
 
-	QDF_STATUS (*txrx_set_monitor_mode)(struct cdp_vdev *vdev,
+	QDF_STATUS (*txrx_set_monitor_mode)(struct cdp_soc_t *soc,
+					    uint8_t vdev_id,
 					    uint8_t smart_monitor);
 	void (*txrx_peer_delete_sync)(void *peer,
 				      QDF_STATUS(*delete_cb)(
@@ -164,7 +176,9 @@ struct cdp_cmn_ops {
 	void (*txrx_pdev_set_chan_noise_floor)(struct cdp_pdev *pdev,
 					       int16_t chan_noise_floor);
 
-	void (*txrx_set_nac)(struct cdp_peer *peer);
+	void
+	(*txrx_set_nac)(ol_txrx_soc_handle soc, uint8_t vdev_id,
+			uint8_t *peer_mac);
 
 	/**
 	 * txrx_set_pdev_tx_capture() - callback to set pdev tx_capture
@@ -176,55 +190,71 @@ struct cdp_cmn_ops {
 	 */
 	QDF_STATUS (*txrx_set_pdev_tx_capture)(struct cdp_pdev *pdev, int val);
 
-	void (*txrx_get_peer_mac_from_peer_id)
-		(struct cdp_pdev *pdev_handle,
+	QDF_STATUS
+	(*txrx_get_peer_mac_from_peer_id)
+		(struct cdp_soc_t *cdp_soc,
 		 uint32_t peer_id, uint8_t *peer_mac);
 
-	void (*txrx_vdev_tx_lock)(struct cdp_vdev *vdev);
+	void
+	(*txrx_vdev_tx_lock)(struct cdp_soc_t *soc, uint8_t vdev_id);
 
-	void (*txrx_vdev_tx_unlock)(struct cdp_vdev *vdev);
+	void
+	(*txrx_vdev_tx_unlock)(struct cdp_soc_t *soc, uint8_t vdev_id);
 
-	void (*txrx_ath_getstats)(void *pdev,
-			struct cdp_dev_stats *stats, uint8_t type);
+	QDF_STATUS
+	(*txrx_ath_getstats)(struct cdp_soc_t *soc, uint8_t id,
+			     struct cdp_dev_stats *stats, uint8_t type);
 
-	void (*txrx_set_gid_flag)(struct cdp_pdev *pdev, u_int8_t *mem_status,
-			u_int8_t *user_position);
+	QDF_STATUS
+	(*txrx_set_gid_flag)(struct cdp_soc_t *soc, uint8_t pdev_id,
+			     u_int8_t *mem_status,
+			     u_int8_t *user_position);
 
-	uint32_t (*txrx_fw_supported_enh_stats_version)(struct cdp_pdev *pdev);
+	uint32_t (*txrx_fw_supported_enh_stats_version)(struct cdp_soc_t *soc,
+							uint8_t pdev_id);
 
-	void (*txrx_if_mgmt_drain)(void *ni, int force);
+	QDF_STATUS
+	(*txrx_if_mgmt_drain)(struct cdp_soc_t *soc, uint8_t pdev_id,
+			      int force);
 
-	void (*txrx_set_curchan)(struct cdp_pdev *pdev, uint32_t chan_mhz);
+	QDF_STATUS
+	(*txrx_set_curchan)(struct cdp_soc_t *soc, uint8_t pdev_id,
+			    uint32_t chan_mhz);
 
-	void (*txrx_set_privacy_filters)
-		(struct cdp_vdev *vdev, void *filter, uint32_t num);
+	QDF_STATUS
+	(*txrx_set_privacy_filters)
+		(struct cdp_soc_t *soc, uint8_t vdev_id, void *filter,
+		 uint32_t num);
 
-	uint32_t (*txrx_get_cfg)(void *soc, enum cdp_dp_cfg cfg);
+	uint32_t (*txrx_get_cfg)(struct cdp_soc_t *soc, enum cdp_dp_cfg cfg);
 
 	/********************************************************************
 	 * Data Interface (B Interface)
 	 ********************************************************************/
 
-	void (*txrx_vdev_register)(struct cdp_vdev *vdev,
-			void *osif_vdev,
-			struct ol_txrx_ops *txrx_ops);
+	QDF_STATUS
+	(*txrx_vdev_register)(struct cdp_soc_t *soc, uint8_t vdev_id,
+			      ol_osif_vdev_handle osif_vdev,
+			      struct ol_txrx_ops *txrx_ops);
 
-	int (*txrx_mgmt_send)(struct cdp_vdev *vdev,
-			qdf_nbuf_t tx_mgmt_frm, uint8_t type);
+	int (*txrx_mgmt_send)(struct cdp_soc_t *soc, uint8_t vdev_id,
+			      qdf_nbuf_t tx_mgmt_frm, uint8_t type);
 
-	int (*txrx_mgmt_send_ext)(struct cdp_vdev *vdev,
-			qdf_nbuf_t tx_mgmt_frm,	uint8_t type, uint8_t use_6mbps,
-			uint16_t chanfreq);
+	int (*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);
 
 	/**
 	 * ol_txrx_mgmt_tx_cb - tx management delivery notification
 	 * callback function
 	 */
 
-	void (*txrx_mgmt_tx_cb_set)(struct cdp_pdev *pdev, uint8_t type,
-				    ol_txrx_mgmt_tx_cb download_cb,
-				    ol_txrx_mgmt_tx_cb ota_ack_cb,
-				    void *ctxt);
+	QDF_STATUS
+	(*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);
 
 	int (*txrx_get_tx_pending)(struct cdp_pdev *pdev);
 
@@ -241,17 +271,21 @@ struct cdp_cmn_ops {
 	 * Statistics and Debugging Interface (C Interface)
 	 ********************************************************************/
 
-	int (*txrx_aggr_cfg)(struct cdp_vdev *vdev, int max_subfrms_ampdu,
-			int max_subfrms_amsdu);
+	int (*txrx_aggr_cfg)(struct cdp_soc_t *soc, uint8_t vdev_id,
+			     int max_subfrms_ampdu,
+			     int max_subfrms_amsdu);
 
-	A_STATUS (*txrx_fw_stats_get)(struct cdp_vdev *vdev,
-			struct ol_txrx_stats_req *req,
-			bool per_vdev, bool response_expected);
+	A_STATUS
+	(*txrx_fw_stats_get)(struct cdp_soc_t *soc, uint8_t vdev_id,
+			     struct ol_txrx_stats_req *req,
+			     bool per_vdev, bool response_expected);
 
-	int (*txrx_debug)(struct cdp_vdev *vdev, int debug_specs);
+	int (*txrx_debug)(struct cdp_soc_t *soc, uint8_t vdev_id,
+			  int debug_specs);
 
-	void (*txrx_fw_stats_cfg)(struct cdp_vdev *vdev,
-			uint8_t cfg_stats_type, uint32_t cfg_val);
+	QDF_STATUS
+	(*txrx_fw_stats_cfg)(struct cdp_soc_t *soc, uint8_t vdev_id,
+			     uint8_t cfg_stats_type, uint32_t cfg_val);
 
 	void (*txrx_print_level_set)(unsigned level);
 
@@ -300,29 +334,26 @@ struct cdp_cmn_ops {
 	struct cdp_vdev *
 		(*txrx_get_mon_vdev_from_pdev)(struct cdp_pdev *pdev);
 
-	struct cdp_vdev *
-		(*txrx_get_vdev_from_vdev_id)(struct cdp_pdev *pdev,
-				uint8_t vdev_id);
-
-	void (*txrx_soc_detach)(void *soc);
+	void (*txrx_soc_detach)(struct cdp_soc_t *soc);
 
 	/**
 	 * txrx_soc_deinit() - Deinitialize dp soc and dp ring memory
 	 * @soc: Opaque Dp handle
 	 *
-	 * Return: None
+	 * Return None
 	 */
-	void (*txrx_soc_deinit)(void *soc);
+	void (*txrx_soc_deinit)(struct cdp_soc_t *soc);
 
 	/**
 	 * txrx_soc_init() - Initialize dp soc and dp ring memory
 	 * @soc: Opaque Dp handle
+	 * @ctrl_psoc: Opaque Cp handle
 	 * @htchdl: Opaque htc handle
 	 * @hifhdl: Opaque hif handle
 	 *
 	 * Return: None
 	 */
-	void *(*txrx_soc_init)(void *soc,
+	void *(*txrx_soc_init)(struct cdp_soc_t *soc,
 			       struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
 			       struct hif_opaque_softc *hif_handle,
 			       HTC_HANDLE htc_handle, qdf_device_t qdf_osdev,
@@ -335,7 +366,7 @@ struct cdp_cmn_ops {
 	 *
 	 * Return: QDF status
 	 */
-	QDF_STATUS (*txrx_tso_soc_attach)(void *soc);
+	QDF_STATUS (*txrx_tso_soc_attach)(struct cdp_soc_t *soc);
 
 	/**
 	 * txrx_tso_soc_detach() - TSO detach handler triggered during
@@ -344,85 +375,103 @@ struct cdp_cmn_ops {
 	 *
 	 * Return: QDF status
 	 */
-	QDF_STATUS (*txrx_tso_soc_detach)(void *soc);
-	int (*addba_resp_tx_completion)(void *peer_handle, uint8_t tid,
+	QDF_STATUS (*txrx_tso_soc_detach)(struct cdp_soc_t *soc);
+	int (*addba_resp_tx_completion)(struct cdp_soc_t *cdp_soc,
+					uint8_t *peer_mac,
+					uint16_t vdev_id, uint8_t tid,
 					int status);
 
-	int (*addba_requestprocess)(void *peer_handle, uint8_t dialogtoken,
-				   uint16_t tid, uint16_t batimeout,
-				   uint16_t buffersize,
-				   uint16_t startseqnum);
+	int (*addba_requestprocess)(struct cdp_soc_t *cdp_soc,
+				    uint8_t *peer_mac,
+				    uint16_t vdev_id,
+				    uint8_t dialogtoken,
+				    uint16_t tid, uint16_t batimeout,
+				    uint16_t buffersize,
+				    uint16_t startseqnum);
 
-	void (*addba_responsesetup)(void *peer_handle, uint8_t tid,
-		uint8_t *dialogtoken, uint16_t *statuscode,
-		uint16_t *buffersize, uint16_t *batimeout);
+	QDF_STATUS
+	(*addba_responsesetup)(struct cdp_soc_t *cdp_soc,
+			       uint8_t *peer_mac,
+			       uint16_t vdev_id, uint8_t tid,
+			       uint8_t *dialogtoken, uint16_t *statuscode,
+			       uint16_t *buffersize, uint16_t *batimeout);
 
-	int (*delba_process)(void *peer_handle,
-		int tid, uint16_t reasoncode);
+	int (*delba_process)(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+			     uint16_t vdev_id, int tid, uint16_t reasoncode);
 
 	/**
 	 * delba_tx_completion() - Indicate delba tx status
-	 * @peer_handle: Peer handle
+	 * @cdp_soc: soc handle
+	 * @peer_mac: Peer mac address
+	 * @vdev_id: vdev id
 	 * @tid: Tid number
 	 * @status: Tx completion status
 	 *
 	 * Return: 0 on Success, 1 on failure
 	 */
-	int (*delba_tx_completion)(void *peer_handle,
+	int (*delba_tx_completion)(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+				   uint16_t vdev_id,
 				   uint8_t tid, int status);
 
-	void (*set_addba_response)(void *peer_handle,
-		uint8_t tid, uint16_t statuscode);
-
-	uint8_t (*get_peer_mac_addr_frm_id)(struct cdp_soc_t *soc_handle,
-			uint16_t peer_id, uint8_t *mac_addr);
+	QDF_STATUS
+	(*set_addba_response)(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+			      uint16_t vdev_id, uint8_t tid,
+			      uint16_t statuscode);
 
-	void (*set_vdev_dscp_tid_map)(struct cdp_vdev *vdev_handle,
-			uint8_t map_id);
-	int (*txrx_get_total_per)(struct cdp_pdev *pdev_handle);
+	QDF_STATUS
+	(*set_vdev_dscp_tid_map)(struct cdp_soc_t *soc_handle,
+				 uint8_t vdev_id, uint8_t map_id);
+	int (*txrx_get_total_per)(struct cdp_soc_t *soc, uint8_t pdev_id);
 
 	void (*flush_cache_rx_queue)(void);
-	void (*set_pdev_dscp_tid_map)(struct cdp_pdev *pdev, uint8_t map_id,
-			uint8_t tos, uint8_t tid);
+
+	QDF_STATUS (*set_pdev_dscp_tid_map)(struct cdp_soc_t *soc_handle,
+					    uint8_t pdev_id,
+					    uint8_t map_id,
+					    uint8_t tos, uint8_t tid);
+
 	void (*hmmc_tid_override_en)(struct cdp_pdev *pdev, bool val);
 	void (*set_hmmc_tid_val)(struct cdp_pdev *pdev, uint8_t tid);
 
-	QDF_STATUS(*txrx_stats_request)(struct cdp_soc_t *soc_handle,
-					uint8_t vdev_id,
-					struct cdp_txrx_stats_req *req);
+	QDF_STATUS (*txrx_stats_request)(struct cdp_soc_t *soc_handle,
+					 uint8_t vdev_id,
+					 struct cdp_txrx_stats_req *req);
 
-	QDF_STATUS (*display_stats)(void *psoc, uint16_t value,
+	QDF_STATUS (*display_stats)(struct cdp_soc_t *psoc, uint16_t value,
 				    enum qdf_stats_verbosity_level level);
 	void (*txrx_soc_set_nss_cfg)(ol_txrx_soc_handle soc, int config);
 
 	int(*txrx_soc_get_nss_cfg)(ol_txrx_soc_handle soc);
-	QDF_STATUS (*txrx_intr_attach)(void *soc);
-	void (*txrx_intr_detach)(void *soc);
-	void  (*set_pn_check)(struct cdp_vdev *vdev,
-		struct cdp_peer *peer_handle, enum cdp_sec_type sec_type,
-		 uint32_t *rx_pn);
+
+	QDF_STATUS (*txrx_intr_attach)(struct cdp_soc_t *soc_handle);
+	void (*txrx_intr_detach)(struct cdp_soc_t *soc_handle);
+	QDF_STATUS  (*set_pn_check)(struct cdp_soc_t *soc_handle,
+				    uint8_t vdev_id, uint8_t *peermac,
+				    enum cdp_sec_type sec_type,
+				    uint32_t *rx_pn);
 	QDF_STATUS (*update_config_parameters)(struct cdp_soc *psoc,
 			struct cdp_config_params *params);
 
-	void *(*get_dp_txrx_handle)(struct cdp_pdev *pdev_hdl);
-	void (*set_dp_txrx_handle)(struct cdp_pdev *pdev_hdl,
-			void *dp_txrx_hdl);
+	void *(*get_dp_txrx_handle)(ol_txrx_soc_handle soc, uint8_t pdev_id);
+	void (*set_dp_txrx_handle)(ol_txrx_soc_handle soc, uint8_t pdev_id,
+				   void *dp_hdl);
 
 	void *(*get_soc_dp_txrx_handle)(struct cdp_soc *soc_handle);
 	void (*set_soc_dp_txrx_handle)(struct cdp_soc *soc_handle,
 			void *dp_txrx_handle);
 
-	void (*map_pdev_to_lmac)(struct cdp_pdev *pdev_hdl,
-				 uint32_t lmac_id);
+	QDF_STATUS (*map_pdev_to_lmac)(ol_txrx_soc_handle soc, uint8_t pdev_id,
+				       uint32_t lmac_id);
 
-	void (*set_pdev_status_down)(struct cdp_pdev *pdev_hdl, bool is_pdev_down);
+	QDF_STATUS (*set_pdev_status_down)(struct cdp_soc_t *soc_handle,
+					   uint8_t pdev_id, bool is_pdev_down);
 
-	void (*txrx_peer_reset_ast)
+	QDF_STATUS (*txrx_peer_reset_ast)
 		(ol_txrx_soc_handle soc, uint8_t *ast_macaddr,
-		 uint8_t *peer_macaddr, void *vdev_hdl);
+		 uint8_t *peer_macaddr, uint8_t vdev_id);
 
-	void (*txrx_peer_reset_ast_table)(ol_txrx_soc_handle soc,
-					  void *vdev_hdl);
+	QDF_STATUS (*txrx_peer_reset_ast_table)(ol_txrx_soc_handle soc,
+						uint8_t vdev_id);
 
 	void (*txrx_peer_flush_ast_table)(ol_txrx_soc_handle soc);
 	void (*txrx_set_ba_aging_timeout)(struct cdp_soc_t *soc_handle,
@@ -448,28 +497,31 @@ struct cdp_cmn_ops {
 					 ol_txrx_rx_fp *stack_fn,
 					 ol_osif_vdev_handle *osif_vdev);
 	int (*txrx_classify_update)
-		(struct cdp_vdev *vdev, qdf_nbuf_t skb,
+		(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t skb,
 		 enum txrx_direction, struct ol_txrx_nbuf_classify *nbuf_class);
 
 	bool (*get_dp_capabilities)(struct cdp_soc_t *soc,
 				    enum cdp_capabilities dp_caps);
 	void (*set_rate_stats_ctx)(struct cdp_soc_t *soc, void *ctx);
 	void* (*get_rate_stats_ctx)(struct cdp_soc_t *soc);
-	void (*txrx_peer_flush_rate_stats)(struct cdp_soc_t *soc,
-					   struct cdp_pdev *pdev,
-					   void *buf);
-	void (*txrx_flush_rate_stats_request)(struct cdp_soc_t *soc,
-					      struct cdp_pdev *pdev);
-	QDF_STATUS (*set_pdev_pcp_tid_map)(struct cdp_pdev *pdev,
+	QDF_STATUS (*txrx_peer_flush_rate_stats)(struct cdp_soc_t *soc,
+						 uint8_t pdev_id,
+						 void *buf);
+
+	QDF_STATUS (*txrx_flush_rate_stats_request)(struct cdp_soc_t *soc,
+						    uint8_t pdev_id);
+	QDF_STATUS (*set_pdev_pcp_tid_map)(struct cdp_soc_t *soc,
+					   uint8_t pdev_id,
 					   uint8_t pcp, uint8_t tid);
 	QDF_STATUS (*set_pdev_tidmap_prty)(struct cdp_pdev *pdev, uint8_t prty);
-	QDF_STATUS (*set_vdev_pcp_tid_map)(struct cdp_vdev *vdev,
+	QDF_STATUS (*set_vdev_pcp_tid_map)(struct cdp_soc_t *soc,
+					   uint8_t vdev_id,
 					   uint8_t pcp, uint8_t tid);
 	QDF_STATUS (*set_vdev_tidmap_prty)(struct cdp_vdev *vdev, uint8_t prty);
 	QDF_STATUS (*set_vdev_tidmap_tbl_id)(struct cdp_vdev *vdev,
 					     uint8_t mapid);
 #ifdef QCA_MULTIPASS_SUPPORT
-	QDF_STATUS (*set_vlan_groupkey)(struct cdp_vdev *vdev_handle,
+	QDF_STATUS (*set_vlan_groupkey)(struct cdp_soc_t *soc, uint8_t vdev_id,
 					uint16_t vlan_id, uint16_t group_key);
 #endif
 };

+ 4 - 2
dp/wifi3.0/dp_htt.c

@@ -3957,8 +3957,10 @@ static void dp_htt_t2h_msg_handler(void *context, HTC_PACKET *pkt)
 			 * using just 8 bits
 			 */
 			if (peer) {
-				status = dp_addba_requestprocess_wifi3(peer,
-						0, tid, 0, win_sz + 1, 0xffff);
+				status = dp_addba_requestprocess_wifi3(
+					(struct cdp_soc_t *)soc->dp_soc,
+					peer->mac_addr.raw, peer->vdev->vdev_id,
+					0, tid, 0, win_sz + 1, 0xffff);
 
 				/*
 				 * If PEER_LOCK_REF_PROTECT enbled dec ref

+ 33 - 18
dp/wifi3.0/dp_internal.h

@@ -944,30 +944,44 @@ void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer)
 {
 }
 #endif
-int dp_addba_resp_tx_completion_wifi3(void *peer_handle, uint8_t tid,
-	int status);
-extern int dp_addba_requestprocess_wifi3(void *peer_handle,
-	uint8_t dialogtoken, uint16_t tid, uint16_t batimeout,
-	uint16_t buffersize, uint16_t startseqnum);
-extern void dp_addba_responsesetup_wifi3(void *peer_handle, uint8_t tid,
-	uint8_t *dialogtoken, uint16_t *statuscode,
-	uint16_t *buffersize, uint16_t *batimeout);
-extern void dp_set_addba_response(void *peer_handle, uint8_t tid,
-	uint16_t statuscode);
-extern int dp_delba_process_wifi3(void *peer_handle,
-	int tid, uint16_t reasoncode);
+int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc,
+				      uint8_t *peer_mac, uint16_t vdev_id,
+				      uint8_t tid,
+				      int status);
+int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc,
+				  uint8_t *peer_mac, uint16_t vdev_id,
+				  uint8_t dialogtoken, uint16_t tid,
+				  uint16_t batimeout,
+				  uint16_t buffersize,
+				  uint16_t startseqnum);
+QDF_STATUS dp_addba_responsesetup_wifi3(struct cdp_soc_t *cdp_soc,
+					uint8_t *peer_mac, uint16_t vdev_id,
+					uint8_t tid, uint8_t *dialogtoken,
+					uint16_t *statuscode,
+					uint16_t *buffersize,
+					uint16_t *batimeout);
+QDF_STATUS dp_set_addba_response(struct cdp_soc_t *cdp_soc,
+				 uint8_t *peer_mac,
+				 uint16_t vdev_id, uint8_t tid,
+				 uint16_t statuscode);
+int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+			   uint16_t vdev_id, int tid,
+			   uint16_t reasoncode);
 /*
  * dp_delba_tx_completion_wifi3() -  Handle delba tx completion
  *
- * @peer_handle: Peer handle
+ * @cdp_soc: soc handle
+ * @vdev_id: id of the vdev handle
+ * @peer_mac: peer mac address
  * @tid: Tid number
  * @status: Tx completion status
  * Indicate status of delba Tx to DP for stats update and retry
  * delba if tx failed.
  *
  */
-int dp_delba_tx_completion_wifi3(void *peer_handle, uint8_t tid,
-				  int status);
+int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+				 uint16_t vdev_id, uint8_t tid,
+				 int status);
 extern QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
 					uint32_t ba_window_size,
 					uint32_t start_seq);
@@ -1003,9 +1017,10 @@ void dp_htt_stats_print_tag(struct dp_pdev *pdev,
 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf);
 void dp_peer_rxtid_stats(struct dp_peer *peer, void (*callback_fn),
 		void *cb_ctxt);
-void dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle,
-	struct cdp_peer *peer_handle, enum cdp_sec_type sec_type,
-	 uint32_t *rx_pn);
+QDF_STATUS
+dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
+		      uint8_t *peer_mac, enum cdp_sec_type sec_type,
+		      uint32_t *rx_pn);
 
 void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id);
 void dp_set_michael_key(struct cdp_peer *peer_handle,

+ 10 - 10
dp/wifi3.0/dp_ipa.c

@@ -770,22 +770,22 @@ QDF_STATUS dp_ipa_get_stat(struct cdp_soc_t *soc_hdl, uint8_t pdev_id)
 	return QDF_STATUS_SUCCESS;
 }
 
+/**
+ * dp_tx_send_ipa_data_frame() - send IPA data frame
+ * @soc_hdl: datapath soc handle
+ * @vdev_id: id of the virtual device
+ * @skb: skb to transmit
+ *
+ * Return: skb/ NULL is for success
+ */
 qdf_nbuf_t dp_tx_send_ipa_data_frame(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 				     qdf_nbuf_t skb)
 {
-	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
-	struct dp_vdev *vdev =
-		dp_get_vdev_from_soc_vdev_id_wifi3(soc, vdev_id);
 	qdf_nbuf_t ret;
 
-	if (!vdev) {
-		dp_err("%s invalid instance", __func__);
-		return skb;
-	}
-
 	/* Terminate the (single-element) list of tx frames */
 	qdf_nbuf_set_next(skb, NULL);
-	ret = dp_tx_send(dp_vdev_to_cdp_vdev(vdev), skb);
+	ret = dp_tx_send(soc_hdl, vdev_id, skb);
 	if (ret) {
 		QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_ERROR,
 			  "%s: Failed to tx", __func__);
@@ -1699,7 +1699,7 @@ static qdf_nbuf_t dp_ipa_intrabss_send(struct dp_pdev *pdev,
 	qdf_mem_zero(nbuf->cb, sizeof(nbuf->cb));
 	len = qdf_nbuf_len(nbuf);
 
-	if (dp_tx_send(dp_vdev_to_cdp_vdev(vdev), nbuf)) {
+	if (dp_tx_send((struct cdp_soc_t *)pdev->soc, vdev->vdev_id, nbuf)) {
 		DP_STATS_INC_PKT(vdev_peer, rx.intra_bss.fail, 1, len);
 		return nbuf;
 	}

File diff suppressed because it is too large
+ 322 - 178
dp/wifi3.0/dp_main.c


+ 153 - 54
dp/wifi3.0/dp_peer.c

@@ -2518,21 +2518,26 @@ static void dp_teardown_256_ba_sessions(struct dp_peer *peer)
 /*
 * dp_rx_addba_resp_tx_completion_wifi3() – Update Rx Tid State
 *
-* @peer: Datapath peer handle
+* @soc: Datapath soc handle
+* @peer_mac: Datapath peer mac address
+* @vdev_id: id of atapath vdev
 * @tid: TID number
 * @status: tx completion status
 * Return: 0 on success, error code on failure
 */
-int dp_addba_resp_tx_completion_wifi3(void *peer_handle,
+int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc,
+				      uint8_t *peer_mac,
+				      uint16_t vdev_id,
 				      uint8_t tid, int status)
 {
-	struct dp_peer *peer = (struct dp_peer *)peer_handle;
+	struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc,
+						       peer_mac, 0, vdev_id);
 	struct dp_rx_tid *rx_tid = NULL;
 
 	if (!peer || peer->delete_in_progress) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 			  "%s: Peer is NULL!\n", __func__);
-		return QDF_STATUS_E_FAILURE;
+		goto fail;
 	}
 	rx_tid = &peer->rx_tid[tid];
 	qdf_spin_lock_bh(&rx_tid->tid_lock);
@@ -2543,7 +2548,8 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle,
 		rx_tid->ba_status = DP_RX_BA_INACTIVE;
 		qdf_spin_unlock_bh(&rx_tid->tid_lock);
 		dp_err("RxTid- %d addba rsp tx completion failed", tid);
-		return QDF_STATUS_SUCCESS;
+
+		goto success;
 	}
 
 	rx_tid->num_addba_rsp_success++;
@@ -2552,7 +2558,7 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle,
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
 			  "%s: Rx Tid- %d hw qdesc is not in IN_PROGRESS",
 			__func__, tid);
-		return QDF_STATUS_E_FAILURE;
+		goto fail;
 	}
 
 	if (!qdf_atomic_read(&peer->is_default_route_set)) {
@@ -2560,7 +2566,7 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle,
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 			  "%s: default route is not set for peer: %pM",
 			  __func__, peer->mac_addr.raw);
-		return QDF_STATUS_E_FAILURE;
+		goto fail;
 	}
 
 	/* First Session */
@@ -2585,30 +2591,46 @@ int dp_addba_resp_tx_completion_wifi3(void *peer_handle,
 		dp_teardown_256_ba_sessions(peer);
 		peer->kill_256_sessions = 0;
 	}
+
+success:
+	dp_peer_unref_delete(peer);
 	return QDF_STATUS_SUCCESS;
+
+fail:
+	if (peer)
+		dp_peer_unref_delete(peer);
+
+	return QDF_STATUS_E_FAILURE;
 }
 
 /*
 * dp_rx_addba_responsesetup_wifi3() – Process ADDBA request from peer
 *
-* @peer: Datapath peer handle
+* @soc: Datapath soc handle
+* @peer_mac: Datapath peer mac address
+* @vdev_id: id of atapath vdev
 * @tid: TID number
 * @dialogtoken: output dialogtoken
 * @statuscode: output dialogtoken
 * @buffersize: Output BA window size
 * @batimeout: Output BA timeout
 */
-void dp_addba_responsesetup_wifi3(void *peer_handle, uint8_t tid,
-	uint8_t *dialogtoken, uint16_t *statuscode,
-	uint16_t *buffersize, uint16_t *batimeout)
+QDF_STATUS
+dp_addba_responsesetup_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+			     uint16_t vdev_id, uint8_t tid,
+			     uint8_t *dialogtoken, uint16_t *statuscode,
+			     uint16_t *buffersize, uint16_t *batimeout)
 {
-	struct dp_peer *peer = (struct dp_peer *)peer_handle;
 	struct dp_rx_tid *rx_tid = NULL;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc,
+						       peer_mac, 0, vdev_id);
 
 	if (!peer || peer->delete_in_progress) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 			  "%s: Peer is NULL!\n", __func__);
-		return;
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
 	}
 	rx_tid = &peer->rx_tid[tid];
 	qdf_spin_lock_bh(&rx_tid->tid_lock);
@@ -2619,6 +2641,12 @@ void dp_addba_responsesetup_wifi3(void *peer_handle, uint8_t tid,
 	*buffersize = rx_tid->ba_win_size;
 	*batimeout  = 0;
 	qdf_spin_unlock_bh(&rx_tid->tid_lock);
+
+fail:
+	if (peer)
+		dp_peer_unref_delete(peer);
+
+	return status;
 }
 
 /* dp_check_ba_buffersize() - Check buffer size in request
@@ -2666,7 +2694,9 @@ static void dp_check_ba_buffersize(struct dp_peer *peer,
 /*
  * dp_addba_requestprocess_wifi3() - Process ADDBA request from peer
  *
- * @peer: Datapath peer handle
+ * @soc: Datapath soc handle
+ * @peer_mac: Datapath peer mac address
+ * @vdev_id: id of atapath vdev
  * @dialogtoken: dialogtoken from ADDBA frame
  * @tid: TID number
  * @batimeout: BA timeout
@@ -2675,19 +2705,24 @@ static void dp_check_ba_buffersize(struct dp_peer *peer,
  *
  * Return: 0 on success, error code on failure
  */
-int dp_addba_requestprocess_wifi3(void *peer_handle,
+int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc,
+				  uint8_t *peer_mac,
+				  uint16_t vdev_id,
 				  uint8_t dialogtoken,
 				  uint16_t tid, uint16_t batimeout,
 				  uint16_t buffersize,
 				  uint16_t startseqnum)
 {
-	struct dp_peer *peer = (struct dp_peer *)peer_handle;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
 	struct dp_rx_tid *rx_tid = NULL;
+	struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc,
+						       peer_mac, 0, vdev_id);
 
 	if (!peer || peer->delete_in_progress) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 			  "%s: Peer is NULL!\n", __func__);
-		return QDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
 	}
 	rx_tid = &peer->rx_tid[tid];
 	qdf_spin_lock_bh(&rx_tid->tid_lock);
@@ -2698,13 +2733,14 @@ int dp_addba_requestprocess_wifi3(void *peer_handle,
 		rx_tid->ba_status = DP_RX_BA_INACTIVE;
 		peer->active_ba_session_cnt--;
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
-			  "%s: Addba recvd for Rx Tid-%d hw qdesc is already setup",
-			  __func__, tid);
+			  "%s: Rx Tid- %d hw qdesc is already setup",
+			__func__, tid);
 	}
 
 	if (rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) {
 		qdf_spin_unlock_bh(&rx_tid->tid_lock);
-		return QDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
 	}
 	dp_check_ba_buffersize(peer, tid, buffersize);
 
@@ -2712,7 +2748,8 @@ int dp_addba_requestprocess_wifi3(void *peer_handle,
 	    rx_tid->ba_win_size, startseqnum)) {
 		rx_tid->ba_status = DP_RX_BA_INACTIVE;
 		qdf_spin_unlock_bh(&rx_tid->tid_lock);
-		return QDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
 	}
 	rx_tid->ba_status = DP_RX_BA_IN_PROGRESS;
 
@@ -2726,46 +2763,80 @@ int dp_addba_requestprocess_wifi3(void *peer_handle,
 
 	qdf_spin_unlock_bh(&rx_tid->tid_lock);
 
-	return QDF_STATUS_SUCCESS;
+fail:
+	if (peer)
+		dp_peer_unref_delete(peer);
+
+	return status;
 }
 
 /*
 * dp_set_addba_response() – Set a user defined ADDBA response status code
 *
-* @peer: Datapath peer handle
+* @soc: Datapath soc handle
+* @peer_mac: Datapath peer mac address
+* @vdev_id: id of atapath vdev
 * @tid: TID number
 * @statuscode: response status code to be set
 */
-void dp_set_addba_response(void *peer_handle, uint8_t tid,
-	uint16_t statuscode)
+QDF_STATUS
+dp_set_addba_response(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+		      uint16_t vdev_id, uint8_t tid, uint16_t statuscode)
 {
-	struct dp_peer *peer = (struct dp_peer *)peer_handle;
-	struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
+	struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc,
+						       peer_mac, 0, vdev_id);
+	struct dp_rx_tid *rx_tid;
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+
+	if (!peer || peer->delete_in_progress) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Peer is NULL!\n", __func__);
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
+	}
 
+	rx_tid = &peer->rx_tid[tid];
 	qdf_spin_lock_bh(&rx_tid->tid_lock);
 	rx_tid->userstatuscode = statuscode;
 	qdf_spin_unlock_bh(&rx_tid->tid_lock);
+fail:
+	if (peer)
+		dp_peer_unref_delete(peer);
+
+	return status;
 }
 
 /*
 * dp_rx_delba_process_wifi3() – Process DELBA from peer
-* @peer: Datapath peer handle
+* @soc: Datapath soc handle
+* @peer_mac: Datapath peer mac address
+* @vdev_id: id of atapath vdev
 * @tid: TID number
 * @reasoncode: Reason code received in DELBA frame
 *
 * Return: 0 on success, error code on failure
 */
-int dp_delba_process_wifi3(void *peer_handle,
-	int tid, uint16_t reasoncode)
+int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+			   uint16_t vdev_id, int tid, uint16_t reasoncode)
 {
-	struct dp_peer *peer = (struct dp_peer *)peer_handle;
-	struct dp_rx_tid *rx_tid = &peer->rx_tid[tid];
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct dp_rx_tid *rx_tid;
+	struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc,
+						      peer_mac, 0, vdev_id);
 
+	if (!peer || peer->delete_in_progress) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Peer is NULL!\n", __func__);
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
+	}
+	rx_tid = &peer->rx_tid[tid];
 	qdf_spin_lock_bh(&rx_tid->tid_lock);
 	if (rx_tid->ba_status == DP_RX_BA_INACTIVE ||
 	    rx_tid->ba_status == DP_RX_BA_IN_PROGRESS) {
 		qdf_spin_unlock_bh(&rx_tid->tid_lock);
-		return QDF_STATUS_E_FAILURE;
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
 	}
 	/* TODO: See if we can delete the existing REO queue descriptor and
 	 * replace with a new one without queue extenstion descript to save
@@ -2778,28 +2849,38 @@ int dp_delba_process_wifi3(void *peer_handle,
 	rx_tid->ba_status = DP_RX_BA_INACTIVE;
 	peer->active_ba_session_cnt--;
 	qdf_spin_unlock_bh(&rx_tid->tid_lock);
-	return 0;
+fail:
+	if (peer)
+		dp_peer_unref_delete(peer);
+
+	return status;
 }
 
 /*
  * dp_rx_delba_tx_completion_wifi3() – Send Delba Request
  *
- * @peer: Datapath peer handle
+ * @soc: Datapath soc handle
+ * @peer_mac: Datapath peer mac address
+ * @vdev_id: id of atapath vdev
  * @tid: TID number
  * @status: tx completion status
  * Return: 0 on success, error code on failure
  */
 
-int dp_delba_tx_completion_wifi3(void *peer_handle,
+int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
+				 uint16_t vdev_id,
 				 uint8_t tid, int status)
 {
-	struct dp_peer *peer = (struct dp_peer *)peer_handle;
+	QDF_STATUS ret = QDF_STATUS_SUCCESS;
 	struct dp_rx_tid *rx_tid = NULL;
+	struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)cdp_soc,
+						      peer_mac, 0, vdev_id);
 
 	if (!peer || peer->delete_in_progress) {
 		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
 			  "%s: Peer is NULL!", __func__);
-		return QDF_STATUS_E_FAILURE;
+		ret = QDF_STATUS_E_FAILURE;
+		goto end;
 	}
 	rx_tid = &peer->rx_tid[tid];
 	qdf_spin_lock_bh(&rx_tid->tid_lock);
@@ -2820,7 +2901,7 @@ int dp_delba_tx_completion_wifi3(void *peer_handle,
 					peer->mac_addr.raw, tid,
 					rx_tid->delba_rcode);
 		}
-		return QDF_STATUS_SUCCESS;
+		goto end;
 	} else {
 		rx_tid->delba_tx_success_cnt++;
 		rx_tid->delba_tx_retry = 0;
@@ -2837,12 +2918,18 @@ int dp_delba_tx_completion_wifi3(void *peer_handle,
 	}
 	qdf_spin_unlock_bh(&rx_tid->tid_lock);
 
-	return QDF_STATUS_SUCCESS;
+end:
+	if (peer)
+		dp_peer_unref_delete(peer);
+
+	return ret;
 }
 
 /**
  * dp_set_pn_check_wifi3() - enable PN check in REO for security
- * @peer: Datapath peer handle
+ * @soc: Datapath soc handle
+ * @peer_mac: Datapath peer mac address
+ * @vdev_id: id of atapath vdev
  * @vdev: Datapath vdev
  * @pdev - data path device instance
  * @sec_type - security type
@@ -2850,24 +2937,30 @@ int dp_delba_tx_completion_wifi3(void *peer_handle,
  *
  */
 
-void
-dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle, struct cdp_peer *peer_handle, enum cdp_sec_type sec_type,  uint32_t *rx_pn)
+QDF_STATUS
+dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
+		      uint8_t *peer_mac, enum cdp_sec_type sec_type,
+		      uint32_t *rx_pn)
 {
-	struct dp_peer *peer =  (struct dp_peer *)peer_handle;
-	struct dp_vdev *vdev = (struct dp_vdev *)vdev_handle;
 	struct dp_pdev *pdev;
-	struct dp_soc *soc;
 	int i;
 	uint8_t pn_size;
 	struct hal_reo_cmd_params params;
-
-	/* preconditions */
-	qdf_assert(vdev);
+	QDF_STATUS status = QDF_STATUS_SUCCESS;
+	struct dp_peer *peer = dp_peer_find_hash_find((struct dp_soc *)soc,
+				peer_mac, 0, vdev_id);
+	struct dp_vdev *vdev =
+		dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
+						   vdev_id);
+
+	if (!vdev || !peer || peer->delete_in_progress) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
+			  "%s: Peer is NULL!\n", __func__);
+		status = QDF_STATUS_E_FAILURE;
+		goto fail;
+	}
 
 	pdev = vdev->pdev;
-	soc = pdev->soc;
-
-
 	qdf_mem_zero(&params, sizeof(params));
 
 	params.std.need_status = 1;
@@ -2931,14 +3024,20 @@ dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle, struct cdp_peer *peer_handle
 				params.u.upd_queue_params.pn_127_96 = rx_pn[3];
 			}
 			rx_tid->pn_size = pn_size;
-			dp_reo_send_cmd(soc, CMD_UPDATE_RX_REO_QUEUE, &params,
-				dp_rx_tid_update_cb, rx_tid);
+			dp_reo_send_cmd((struct dp_soc *)soc,
+					CMD_UPDATE_RX_REO_QUEUE, &params,
+					dp_rx_tid_update_cb, rx_tid);
 		} else {
 			QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,
 				  "PN Check not setup for TID :%d ", i);
 		}
 		qdf_spin_unlock_bh(&rx_tid->tid_lock);
 	}
+fail:
+	if (peer)
+		dp_peer_unref_delete(peer);
+
+	return status;
 }
 
 

+ 5 - 4
dp/wifi3.0/dp_peer.h

@@ -193,14 +193,15 @@ void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
 
 /**
  * dp_set_vlan_groupkey: set vlan map for vdev
- * @vdev_handle: pointer to vdev
- * @vlan_id: vlan_id
+ * @cdp_soc: soc handle
+ * @vdev_id: vdev_id
+ * @vlan_id: vlan_id of peer
  * @group_key: group key for vlan
  *
  * return: set success/failure
  */
 static inline
-QDF_STATUS dp_set_vlan_groupkey(struct cdp_vdev *vdev_handle,
+QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id,
 				uint16_t vlan_id, uint16_t group_key)
 {
 	return QDF_STATUS_SUCCESS;
@@ -231,7 +232,7 @@ void dp_peer_multipass_list_remove(struct dp_peer *peer)
 void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
 			 struct cdp_vdev *vdev_handle, uint8_t *peer_mac,
 			 uint16_t vlan_id);
-QDF_STATUS dp_set_vlan_groupkey(struct cdp_vdev *vdev_handle,
+QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id,
 				uint16_t vlan_id, uint16_t group_key);
 void dp_peer_multipass_list_init(struct dp_vdev *vdev);
 void dp_peer_multipass_list_remove(struct dp_peer *peer);

+ 5 - 4
dp/wifi3.0/dp_rx.c

@@ -342,7 +342,7 @@ dp_get_vdev_from_peer(struct dp_soc *soc,
 				FL("PeerID %d not found use vdevID %d"),
 				peer_id, vdev_id);
 			vdev = dp_get_vdev_from_soc_vdev_id_wifi3(soc,
-							vdev_id);
+								  vdev_id);
 		} else {
 			QDF_TRACE(QDF_MODULE_ID_DP,
 				QDF_TRACE_LEVEL_DEBUG,
@@ -466,8 +466,8 @@ dp_rx_intrabss_fwd(struct dp_soc *soc,
 				}
 			}
 
-			if (!dp_tx_send(dp_vdev_to_cdp_vdev(ta_peer->vdev),
-					nbuf)) {
+			if (!dp_tx_send((struct cdp_soc_t *)soc,
+					ta_peer->vdev->vdev_id, nbuf)) {
 				DP_STATS_INC_PKT(ta_peer, rx.intra_bss.pkts, 1,
 						 len);
 				return true;
@@ -501,7 +501,8 @@ dp_rx_intrabss_fwd(struct dp_soc *soc,
 
 		/* Set cb->ftype to intrabss FWD */
 		qdf_nbuf_set_tx_ftype(nbuf_copy, CB_FTYPE_INTRABSS_FWD);
-		if (dp_tx_send(dp_vdev_to_cdp_vdev(ta_peer->vdev), nbuf_copy)) {
+		if (dp_tx_send((struct cdp_soc_t *)soc,
+			       ta_peer->vdev->vdev_id, nbuf_copy)) {
 			DP_STATS_INC_PKT(ta_peer, rx.intra_bss.fail, 1, len);
 			tid_stats->fail_cnt[INTRABSS_DROP]++;
 			qdf_nbuf_free(nbuf_copy);

+ 31 - 13
dp/wifi3.0/dp_tx.c

@@ -2158,7 +2158,8 @@ fail:
 
 /**
  * dp_tx_send_mesh() - Transmit mesh frame on a given VAP
- * @vap_dev: DP vdev handle
+ * @soc: DP soc handle
+ * @vdev_id: DP vdev handle
  * @nbuf: skb
  *
  * Entry point for Core Tx layer (DP_TX) invoked from
@@ -2168,12 +2169,13 @@ fail:
  *         nbuf when it fails to send
  */
 #ifdef MESH_MODE_SUPPORT
-qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf)
+qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc, uint8_t vdev_id,
+			   qdf_nbuf_t nbuf)
 {
 	struct meta_hdr_s *mhdr;
 	qdf_nbuf_t nbuf_mesh = NULL;
 	qdf_nbuf_t nbuf_clone = NULL;
-	struct dp_vdev *vdev = (struct dp_vdev *) vap_dev;
+	struct dp_vdev *vdev;
 	uint8_t no_enc_frame = 0;
 
 	nbuf_mesh = qdf_nbuf_unshare(nbuf);
@@ -2182,6 +2184,15 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf)
 				"qdf_nbuf_unshare failed");
 		return nbuf;
 	}
+
+	vdev = dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
+						  vdev_id);
+	if (!vdev) {
+		QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
+				"vdev is NULL for vdev_id %d", vdev_id);
+		return nbuf;
+	}
+
 	nbuf = nbuf_mesh;
 
 	mhdr = (struct meta_hdr_s *)qdf_nbuf_data(nbuf);
@@ -2205,7 +2216,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf)
 	}
 
 	if (nbuf_clone) {
-		if (!dp_tx_send(vap_dev, nbuf_clone)) {
+		if (!dp_tx_send(soc, vdev_id, nbuf_clone)) {
 			DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1);
 		} else {
 			qdf_nbuf_free(nbuf_clone);
@@ -2217,7 +2228,7 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf)
 	else
 		qdf_nbuf_set_tx_ftype(nbuf, CB_FTYPE_INVALID);
 
-	nbuf = dp_tx_send(vap_dev, nbuf);
+	nbuf = dp_tx_send(soc, vdev_id, nbuf);
 	if ((!nbuf) && no_enc_frame) {
 		DP_STATS_INC(vdev, tx_i.mesh.exception_fw, 1);
 	}
@@ -2227,16 +2238,18 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf)
 
 #else
 
-qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf)
+qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc, uint8_t vdev_id,
+			   qdf_nbuf_t nbuf)
 {
-	return dp_tx_send(vap_dev, nbuf);
+	return dp_tx_send(soc, vdev_id, nbuf);
 }
 
 #endif
 
 /**
  * dp_tx_send() - Transmit a frame on a given VAP
- * @vap_dev: DP vdev handle
+ * @soc: DP soc handle
+ * @vdev_id: id of DP vdev handle
  * @nbuf: skb
  *
  * Entry point for Core Tx layer (DP_TX) invoked from
@@ -2246,14 +2259,19 @@ qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf)
  * Return: NULL on success,
  *         nbuf when it fails to send
  */
-qdf_nbuf_t dp_tx_send(struct cdp_vdev *vap_dev, qdf_nbuf_t nbuf)
+qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t nbuf)
 {
 	qdf_ether_header_t *eh = NULL;
 	struct dp_tx_msdu_info_s msdu_info;
 	struct dp_tx_seg_info_s seg_info;
-	struct dp_vdev *vdev = (struct dp_vdev *) vap_dev;
 	uint16_t peer_id = HTT_INVALID_PEER;
 	qdf_nbuf_t nbuf_mesh = NULL;
+	struct dp_vdev *vdev =
+		dp_get_vdev_from_soc_vdev_id_wifi3((struct dp_soc *)soc,
+						   vdev_id);
+
+	if (qdf_unlikely(!vdev))
+		return nbuf;
 
 	qdf_mem_zero(&msdu_info, sizeof(msdu_info));
 	qdf_mem_zero(&seg_info, sizeof(seg_info));
@@ -3691,7 +3709,7 @@ qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
 	if (tx_spec & OL_TX_SPEC_NO_FREE)
 		vdev->is_tdls_frame = true;
 
-	return dp_tx_send(dp_vdev_to_cdp_vdev(vdev), msdu_list);
+	return dp_tx_send(soc_hdl, vdev_id, msdu_list);
 }
 #endif
 
@@ -4099,7 +4117,7 @@ QDF_STATUS dp_tso_detach_wifi3(void *txrx_soc)
 }
 #endif
 
-QDF_STATUS dp_tso_soc_detach(void *txrx_soc)
+QDF_STATUS dp_tso_soc_detach(struct cdp_soc_t *txrx_soc)
 {
 	struct dp_soc *soc = (struct dp_soc *)txrx_soc;
 	uint8_t i;
@@ -4133,7 +4151,7 @@ QDF_STATUS dp_tso_soc_detach(void *txrx_soc)
  * Return: QDF_STATUS_E_FAILURE on failure or
  * QDF_STATUS_SUCCESS on success
  */
-QDF_STATUS dp_tso_soc_attach(void *txrx_soc)
+QDF_STATUS dp_tso_soc_attach(struct cdp_soc_t *txrx_soc)
 {
 	struct dp_soc *soc = (struct dp_soc *)txrx_soc;
 	uint8_t i;

+ 5 - 4
dp/wifi3.0/dp_tx.h

@@ -169,7 +169,7 @@ QDF_STATUS dp_tx_soc_detach(struct dp_soc *soc);
  * Return: QDF_STATUS_E_FAILURE on failure or
  * QDF_STATUS_SUCCESS on success
  */
-QDF_STATUS dp_tso_soc_attach(void *txrx_soc);
+QDF_STATUS dp_tso_soc_attach(struct cdp_soc_t *txrx_soc);
 
 /**
  * dp_tso_detach() - TSO Detach handler
@@ -180,15 +180,16 @@ QDF_STATUS dp_tso_soc_attach(void *txrx_soc);
  * Return: QDF_STATUS_E_FAILURE on failure or
  * QDF_STATUS_SUCCESS on success
  */
-QDF_STATUS dp_tso_soc_detach(void *txrx_soc);
+QDF_STATUS dp_tso_soc_detach(struct cdp_soc_t *txrx_soc);
 
 QDF_STATUS dp_tx_pdev_detach(struct dp_pdev *pdev);
 QDF_STATUS dp_tx_pdev_attach(struct dp_pdev *pdev);
 
-qdf_nbuf_t dp_tx_send(struct cdp_vdev *data_vdev, qdf_nbuf_t nbuf);
+qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t nbuf);
 qdf_nbuf_t dp_tx_send_exception(struct cdp_vdev *data_vdev, qdf_nbuf_t nbuf,
 				struct cdp_tx_exception_metadata *tx_exc);
-qdf_nbuf_t dp_tx_send_mesh(struct cdp_vdev *data_vdev, qdf_nbuf_t nbuf);
+qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc, uint8_t vdev_id,
+			   qdf_nbuf_t nbuf);
 qdf_nbuf_t
 dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
 		       struct dp_tx_msdu_info_s *msdu_info, uint16_t peer_id,

Some files were not shown because too many files changed in this diff