xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/dp_tx.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name #ifndef __DP_TX_H
20*5113495bSYour Name #define __DP_TX_H
21*5113495bSYour Name 
22*5113495bSYour Name #include <qdf_types.h>
23*5113495bSYour Name #include <qdf_nbuf.h>
24*5113495bSYour Name #include "dp_types.h"
25*5113495bSYour Name #ifdef FEATURE_PERPKT_INFO
26*5113495bSYour Name #if defined(QCA_SUPPORT_LATENCY_CAPTURE) || \
27*5113495bSYour Name 	defined(QCA_TX_CAPTURE_SUPPORT) || \
28*5113495bSYour Name 	defined(QCA_MCOPY_SUPPORT)
29*5113495bSYour Name #include "if_meta_hdr.h"
30*5113495bSYour Name #endif
31*5113495bSYour Name #endif
32*5113495bSYour Name #include "dp_internal.h"
33*5113495bSYour Name #include "hal_tx.h"
34*5113495bSYour Name #include <qdf_tracepoint.h>
35*5113495bSYour Name #ifdef CONFIG_SAWF
36*5113495bSYour Name #include "dp_sawf.h"
37*5113495bSYour Name #endif
38*5113495bSYour Name #include <qdf_pkt_add_timestamp.h>
39*5113495bSYour Name #include "dp_ipa.h"
40*5113495bSYour Name #ifdef IPA_OFFLOAD
41*5113495bSYour Name #include <wlan_ipa_obj_mgmt_api.h>
42*5113495bSYour Name #endif
43*5113495bSYour Name 
44*5113495bSYour Name #define DP_INVALID_VDEV_ID 0xFF
45*5113495bSYour Name 
46*5113495bSYour Name #define DP_TX_MAX_NUM_FRAGS 6
47*5113495bSYour Name 
48*5113495bSYour Name /* invalid peer id for reinject*/
49*5113495bSYour Name #define DP_INVALID_PEER 0XFFFE
50*5113495bSYour Name 
51*5113495bSYour Name void dp_tx_nawds_handler(struct dp_soc *soc, struct dp_vdev *vdev,
52*5113495bSYour Name 			 struct dp_tx_msdu_info_s *msdu_info,
53*5113495bSYour Name 			 qdf_nbuf_t nbuf, uint16_t sa_peer_id);
54*5113495bSYour Name int dp_tx_proxy_arp(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
55*5113495bSYour Name /*
56*5113495bSYour Name  * DP_TX_DESC_FLAG_FRAG flags should always be defined to 0x1
57*5113495bSYour Name  * please do not change this flag's definition
58*5113495bSYour Name  */
59*5113495bSYour Name #define DP_TX_DESC_FLAG_FRAG		0x1
60*5113495bSYour Name #define DP_TX_DESC_FLAG_TO_FW		0x2
61*5113495bSYour Name #define DP_TX_DESC_FLAG_SIMPLE		0x4
62*5113495bSYour Name #define DP_TX_DESC_FLAG_RAW		0x8
63*5113495bSYour Name #define DP_TX_DESC_FLAG_MESH		0x10
64*5113495bSYour Name #define DP_TX_DESC_FLAG_QUEUED_TX	0x20
65*5113495bSYour Name #define DP_TX_DESC_FLAG_COMPLETED_TX	0x40
66*5113495bSYour Name #define DP_TX_DESC_FLAG_ME		0x80
67*5113495bSYour Name #define DP_TX_DESC_FLAG_TDLS_FRAME	0x100
68*5113495bSYour Name #define DP_TX_DESC_FLAG_ALLOCATED	0x200
69*5113495bSYour Name #define DP_TX_DESC_FLAG_MESH_MODE	0x400
70*5113495bSYour Name #define DP_TX_DESC_FLAG_UNMAP_DONE	0x800
71*5113495bSYour Name #define DP_TX_DESC_FLAG_TX_COMP_ERR	0x1000
72*5113495bSYour Name #define DP_TX_DESC_FLAG_FLUSH		0x2000
73*5113495bSYour Name #define DP_TX_DESC_FLAG_TRAFFIC_END_IND	0x4000
74*5113495bSYour Name #define DP_TX_DESC_FLAG_RMNET		0x8000
75*5113495bSYour Name #define DP_TX_DESC_FLAG_FASTPATH_SIMPLE 0x10000
76*5113495bSYour Name #define DP_TX_DESC_FLAG_PPEDS		0x20000
77*5113495bSYour Name #define DP_TX_DESC_FLAG_FAST		0x40000
78*5113495bSYour Name #define DP_TX_DESC_FLAG_SPECIAL         0x80000
79*5113495bSYour Name 
80*5113495bSYour Name #define DP_TX_EXT_DESC_FLAG_METADATA_VALID 0x1
81*5113495bSYour Name 
82*5113495bSYour Name #define DP_TX_FREE_SINGLE_BUF(soc, buf)                  \
83*5113495bSYour Name do {                                                           \
84*5113495bSYour Name 	qdf_nbuf_unmap(soc->osdev, buf, QDF_DMA_TO_DEVICE);  \
85*5113495bSYour Name 	qdf_nbuf_free(buf);                                    \
86*5113495bSYour Name } while (0)
87*5113495bSYour Name 
88*5113495bSYour Name #define OCB_HEADER_VERSION	 1
89*5113495bSYour Name 
90*5113495bSYour Name #ifdef TX_PER_PDEV_DESC_POOL
91*5113495bSYour Name #ifdef QCA_LL_TX_FLOW_CONTROL_V2
92*5113495bSYour Name #define DP_TX_GET_DESC_POOL_ID(vdev) (vdev->vdev_id)
93*5113495bSYour Name #else /* QCA_LL_TX_FLOW_CONTROL_V2 */
94*5113495bSYour Name #define DP_TX_GET_DESC_POOL_ID(vdev) (vdev->pdev->pdev_id)
95*5113495bSYour Name #endif /* QCA_LL_TX_FLOW_CONTROL_V2 */
96*5113495bSYour Name 	#define DP_TX_GET_RING_ID(vdev) (vdev->pdev->pdev_id)
97*5113495bSYour Name #else
98*5113495bSYour Name 	#ifdef TX_PER_VDEV_DESC_POOL
99*5113495bSYour Name 		#define DP_TX_GET_DESC_POOL_ID(vdev) (vdev->vdev_id)
100*5113495bSYour Name 		#define DP_TX_GET_RING_ID(vdev) (vdev->pdev->pdev_id)
101*5113495bSYour Name 	#endif /* TX_PER_VDEV_DESC_POOL */
102*5113495bSYour Name #endif /* TX_PER_PDEV_DESC_POOL */
103*5113495bSYour Name #define DP_TX_QUEUE_MASK 0x3
104*5113495bSYour Name 
105*5113495bSYour Name #define MAX_CDP_SEC_TYPE 12
106*5113495bSYour Name 
107*5113495bSYour Name /* number of dwords for htt_tx_msdu_desc_ext2_t */
108*5113495bSYour Name #define DP_TX_MSDU_INFO_META_DATA_DWORDS 9
109*5113495bSYour Name 
110*5113495bSYour Name #define dp_tx_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_TX, params)
111*5113495bSYour Name #define dp_tx_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_TX, params)
112*5113495bSYour Name #define dp_tx_err_rl(params...) QDF_TRACE_ERROR_RL(QDF_MODULE_ID_DP_TX, params)
113*5113495bSYour Name #define dp_tx_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_TX, params)
114*5113495bSYour Name #define dp_tx_info(params...) \
115*5113495bSYour Name 	__QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_TX, ## params)
116*5113495bSYour Name #define dp_tx_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_TX, params)
117*5113495bSYour Name 
118*5113495bSYour Name #define dp_tx_comp_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_TX_COMP, params)
119*5113495bSYour Name #define dp_tx_comp_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_TX_COMP, params)
120*5113495bSYour Name #define dp_tx_comp_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_TX_COMP, params)
121*5113495bSYour Name #define dp_tx_comp_info(params...) \
122*5113495bSYour Name 	__QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_TX_COMP, ## params)
123*5113495bSYour Name #define dp_tx_comp_info_rl(params...) \
124*5113495bSYour Name 	__QDF_TRACE_RL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_TX_COMP, ## params)
125*5113495bSYour Name #define dp_tx_comp_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_TX_COMP, params)
126*5113495bSYour Name 
127*5113495bSYour Name #ifndef QCA_HOST_MODE_WIFI_DISABLED
128*5113495bSYour Name 
129*5113495bSYour Name /**
130*5113495bSYour Name  * struct dp_tx_frag_info_s
131*5113495bSYour Name  * @vaddr: hlos virtual address for buffer
132*5113495bSYour Name  * @paddr_lo: physical address lower 32bits
133*5113495bSYour Name  * @paddr_hi: physical address higher bits
134*5113495bSYour Name  * @len: length of the buffer
135*5113495bSYour Name  */
136*5113495bSYour Name struct dp_tx_frag_info_s {
137*5113495bSYour Name 	uint8_t  *vaddr;
138*5113495bSYour Name 	uint32_t paddr_lo;
139*5113495bSYour Name 	uint16_t paddr_hi;
140*5113495bSYour Name 	uint16_t len;
141*5113495bSYour Name };
142*5113495bSYour Name 
143*5113495bSYour Name /**
144*5113495bSYour Name  * struct dp_tx_seg_info_s - Segmentation Descriptor
145*5113495bSYour Name  * @nbuf: NBUF pointer if segment corresponds to separate nbuf
146*5113495bSYour Name  * @frag_cnt: Fragment count in this segment
147*5113495bSYour Name  * @total_len: Total length of segment
148*5113495bSYour Name  * @frags: per-Fragment information
149*5113495bSYour Name  * @next: pointer to next MSDU segment
150*5113495bSYour Name  */
151*5113495bSYour Name struct dp_tx_seg_info_s  {
152*5113495bSYour Name 	qdf_nbuf_t nbuf;
153*5113495bSYour Name 	uint16_t frag_cnt;
154*5113495bSYour Name 	uint16_t total_len;
155*5113495bSYour Name 	struct dp_tx_frag_info_s frags[DP_TX_MAX_NUM_FRAGS];
156*5113495bSYour Name 	struct dp_tx_seg_info_s *next;
157*5113495bSYour Name };
158*5113495bSYour Name 
159*5113495bSYour Name #endif /* QCA_HOST_MODE_WIFI_DISABLED */
160*5113495bSYour Name 
161*5113495bSYour Name /**
162*5113495bSYour Name  * struct dp_tx_sg_info_s - Scatter Gather Descriptor
163*5113495bSYour Name  * @num_segs: Number of segments (TSO/ME) in the frame
164*5113495bSYour Name  * @total_len: Total length of the frame
165*5113495bSYour Name  * @curr_seg: Points to current segment descriptor to be processed. Chain of
166*5113495bSYour Name  * 	      descriptors for SG frames/multicast-unicast converted packets.
167*5113495bSYour Name  *
168*5113495bSYour Name  * Used for SG (802.3 or Raw) frames and Multicast-Unicast converted frames to
169*5113495bSYour Name  * carry fragmentation information
170*5113495bSYour Name  * Raw Frames will be handed over to driver as an SKB chain with MPDU boundaries
171*5113495bSYour Name  * indicated through flags in SKB CB (first_msdu and last_msdu). This will be
172*5113495bSYour Name  * converted into set of skb sg (nr_frags) structures.
173*5113495bSYour Name  */
174*5113495bSYour Name struct dp_tx_sg_info_s {
175*5113495bSYour Name 	uint32_t num_segs;
176*5113495bSYour Name 	uint32_t total_len;
177*5113495bSYour Name 	struct dp_tx_seg_info_s *curr_seg;
178*5113495bSYour Name };
179*5113495bSYour Name 
180*5113495bSYour Name /**
181*5113495bSYour Name  * struct dp_tx_queue - Tx queue
182*5113495bSYour Name  * @desc_pool_id: Descriptor Pool to be used for the tx queue
183*5113495bSYour Name  * @ring_id: TCL descriptor ring ID corresponding to the tx queue
184*5113495bSYour Name  *
185*5113495bSYour Name  * Tx queue contains information of the software (Descriptor pool)
186*5113495bSYour Name  * and hardware resources (TCL ring id) to be used for a particular
187*5113495bSYour Name  * transmit queue (obtained from skb_queue_mapping in case of linux)
188*5113495bSYour Name  */
189*5113495bSYour Name struct dp_tx_queue {
190*5113495bSYour Name 	uint8_t desc_pool_id;
191*5113495bSYour Name 	uint8_t ring_id;
192*5113495bSYour Name };
193*5113495bSYour Name 
194*5113495bSYour Name /**
195*5113495bSYour Name  * struct dp_tx_msdu_info_s - MSDU Descriptor
196*5113495bSYour Name  * @frm_type: Frame type - Regular/TSO/SG/Multicast enhancement
197*5113495bSYour Name  * @tx_queue: Tx queue on which this MSDU should be transmitted
198*5113495bSYour Name  * @num_seg: Number of segments (TSO)
199*5113495bSYour Name  * @tid: TID (override) that is sent from HLOS
200*5113495bSYour Name  * @exception_fw: Duplicate frame to be sent to firmware
201*5113495bSYour Name  * @is_tx_sniffer: Indicates if the packet has to be sniffed
202*5113495bSYour Name  * @u: union of frame information structs
203*5113495bSYour Name  * @u.tso_info: TSO information for TSO frame types
204*5113495bSYour Name  * 	     (chain of the TSO segments, number of segments)
205*5113495bSYour Name  * @u.sg_info: Scatter Gather information for non-TSO SG frames
206*5113495bSYour Name  * @meta_data: Mesh meta header information
207*5113495bSYour Name  * @ppdu_cookie: 16-bit ppdu_cookie that has to be replayed back in completions
208*5113495bSYour Name  * @xmit_type: xmit type of packet Link (0)/MLD (1)
209*5113495bSYour Name  * @gsn: global sequence for reinjected mcast packets
210*5113495bSYour Name  * @vdev_id : vdev_id for reinjected mcast packets
211*5113495bSYour Name  * @skip_hp_update : Skip HP update for TSO segments and update in last segment
212*5113495bSYour Name  * @buf_len:
213*5113495bSYour Name  * @payload_addr:
214*5113495bSYour Name  * @driver_ingress_ts: driver ingress timestamp
215*5113495bSYour Name  *
216*5113495bSYour Name  * This structure holds the complete MSDU information needed to program the
217*5113495bSYour Name  * Hardware TCL and MSDU extension descriptors for different frame types
218*5113495bSYour Name  *
219*5113495bSYour Name  */
220*5113495bSYour Name struct dp_tx_msdu_info_s {
221*5113495bSYour Name 	enum dp_tx_frm_type frm_type;
222*5113495bSYour Name 	struct dp_tx_queue tx_queue;
223*5113495bSYour Name 	uint32_t num_seg;
224*5113495bSYour Name 	uint8_t tid;
225*5113495bSYour Name 	uint8_t exception_fw;
226*5113495bSYour Name 	uint8_t is_tx_sniffer;
227*5113495bSYour Name 	union {
228*5113495bSYour Name 		struct qdf_tso_info_t tso_info;
229*5113495bSYour Name 		struct dp_tx_sg_info_s sg_info;
230*5113495bSYour Name 	} u;
231*5113495bSYour Name 	uint32_t meta_data[DP_TX_MSDU_INFO_META_DATA_DWORDS];
232*5113495bSYour Name 	uint16_t ppdu_cookie;
233*5113495bSYour Name 	uint8_t xmit_type;
234*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
235*5113495bSYour Name #ifdef WLAN_MCAST_MLO
236*5113495bSYour Name 	uint16_t gsn;
237*5113495bSYour Name 	uint8_t vdev_id;
238*5113495bSYour Name #endif
239*5113495bSYour Name #endif
240*5113495bSYour Name #ifdef WLAN_DP_FEATURE_SW_LATENCY_MGR
241*5113495bSYour Name 	uint8_t skip_hp_update;
242*5113495bSYour Name #endif
243*5113495bSYour Name #ifdef QCA_DP_TX_RMNET_OPTIMIZATION
244*5113495bSYour Name 	uint16_t buf_len;
245*5113495bSYour Name 	uint8_t *payload_addr;
246*5113495bSYour Name #endif
247*5113495bSYour Name #ifdef WLAN_FEATURE_TX_LATENCY_STATS
248*5113495bSYour Name 	qdf_ktime_t driver_ingress_ts;
249*5113495bSYour Name #endif
250*5113495bSYour Name };
251*5113495bSYour Name 
252*5113495bSYour Name #ifndef QCA_HOST_MODE_WIFI_DISABLED
253*5113495bSYour Name /**
254*5113495bSYour Name  * dp_tx_deinit_pair_by_index() - Deinit TX rings based on index
255*5113495bSYour Name  * @soc: core txrx context
256*5113495bSYour Name  * @index: index of ring to deinit
257*5113495bSYour Name  *
258*5113495bSYour Name  * Deinit 1 TCL and 1 WBM2SW release ring on as needed basis using
259*5113495bSYour Name  * index of the respective TCL/WBM2SW release in soc structure.
260*5113495bSYour Name  * For example, if the index is 2 then &soc->tcl_data_ring[2]
261*5113495bSYour Name  * and &soc->tx_comp_ring[2] will be deinitialized.
262*5113495bSYour Name  *
263*5113495bSYour Name  * Return: none
264*5113495bSYour Name  */
265*5113495bSYour Name void dp_tx_deinit_pair_by_index(struct dp_soc *soc, int index);
266*5113495bSYour Name #endif /* QCA_HOST_MODE_WIFI_DISABLED */
267*5113495bSYour Name 
268*5113495bSYour Name /**
269*5113495bSYour Name  * dp_tx_comp_process_desc_list() - Tx complete software descriptor handler
270*5113495bSYour Name  * @soc: core txrx main context
271*5113495bSYour Name  * @comp_head: software descriptor head pointer
272*5113495bSYour Name  * @ring_id: ring number
273*5113495bSYour Name  *
274*5113495bSYour Name  * This function will process batch of descriptors reaped by dp_tx_comp_handler
275*5113495bSYour Name  * and release the software descriptors after processing is complete
276*5113495bSYour Name  *
277*5113495bSYour Name  * Return: none
278*5113495bSYour Name  */
279*5113495bSYour Name void
280*5113495bSYour Name dp_tx_comp_process_desc_list(struct dp_soc *soc,
281*5113495bSYour Name 			     struct dp_tx_desc_s *comp_head, uint8_t ring_id);
282*5113495bSYour Name 
283*5113495bSYour Name /**
284*5113495bSYour Name  * dp_tx_comp_process_desc_list_fast() - Tx complete fast sw descriptor handler
285*5113495bSYour Name  * @soc: core txrx main context
286*5113495bSYour Name  * @head_desc: software descriptor head pointer
287*5113495bSYour Name  * @tail_desc: software descriptor tail pointer
288*5113495bSYour Name  * @ring_id: ring number
289*5113495bSYour Name  * @fast_desc_count: Total descriptor count in the list
290*5113495bSYour Name  *
291*5113495bSYour Name  * This function will process batch of descriptors reaped by dp_tx_comp_handler
292*5113495bSYour Name  * and append the list of descriptors to the freelist
293*5113495bSYour Name  *
294*5113495bSYour Name  * Return: none
295*5113495bSYour Name  */
296*5113495bSYour Name void
297*5113495bSYour Name dp_tx_comp_process_desc_list_fast(struct dp_soc *soc,
298*5113495bSYour Name 				  struct dp_tx_desc_s *head_desc,
299*5113495bSYour Name 				  struct dp_tx_desc_s *tail_desc,
300*5113495bSYour Name 				  uint8_t ring_id,
301*5113495bSYour Name 				  uint32_t fast_desc_count);
302*5113495bSYour Name 
303*5113495bSYour Name /**
304*5113495bSYour Name  * dp_tx_comp_free_buf() - Free nbuf associated with the Tx Descriptor
305*5113495bSYour Name  * @soc: Soc handle
306*5113495bSYour Name  * @desc: software Tx descriptor to be processed
307*5113495bSYour Name  * @delayed_free: defer freeing of nbuf
308*5113495bSYour Name  *
309*5113495bSYour Name  * Return: nbuf to be freed later
310*5113495bSYour Name  */
311*5113495bSYour Name qdf_nbuf_t dp_tx_comp_free_buf(struct dp_soc *soc, struct dp_tx_desc_s *desc,
312*5113495bSYour Name 			       bool delayed_free);
313*5113495bSYour Name 
314*5113495bSYour Name /**
315*5113495bSYour Name  * dp_tx_desc_release() - Release Tx Descriptor
316*5113495bSYour Name  * @soc: Soc handle
317*5113495bSYour Name  * @tx_desc: Tx Descriptor
318*5113495bSYour Name  * @desc_pool_id: Descriptor Pool ID
319*5113495bSYour Name  *
320*5113495bSYour Name  * Deallocate all resources attached to Tx descriptor and free the Tx
321*5113495bSYour Name  * descriptor.
322*5113495bSYour Name  *
323*5113495bSYour Name  * Return:
324*5113495bSYour Name  */
325*5113495bSYour Name void dp_tx_desc_release(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc,
326*5113495bSYour Name 			uint8_t desc_pool_id);
327*5113495bSYour Name 
328*5113495bSYour Name /**
329*5113495bSYour Name  * dp_tx_compute_delay() - Compute and fill in all timestamps
330*5113495bSYour Name  *				to pass in correct fields
331*5113495bSYour Name  * @vdev: pdev handle
332*5113495bSYour Name  * @tx_desc: tx descriptor
333*5113495bSYour Name  * @tid: tid value
334*5113495bSYour Name  * @ring_id: TCL or WBM ring number for transmit path
335*5113495bSYour Name  *
336*5113495bSYour Name  * Return: none
337*5113495bSYour Name  */
338*5113495bSYour Name void dp_tx_compute_delay(struct dp_vdev *vdev, struct dp_tx_desc_s *tx_desc,
339*5113495bSYour Name 			 uint8_t tid, uint8_t ring_id);
340*5113495bSYour Name 
341*5113495bSYour Name /**
342*5113495bSYour Name  * dp_tx_comp_process_tx_status() - Parse and Dump Tx completion status info
343*5113495bSYour Name  * @soc: DP soc handle
344*5113495bSYour Name  * @tx_desc: software descriptor head pointer
345*5113495bSYour Name  * @ts: Tx completion status
346*5113495bSYour Name  * @txrx_peer: txrx peer handle
347*5113495bSYour Name  * @ring_id: ring number
348*5113495bSYour Name  *
349*5113495bSYour Name  * Return: none
350*5113495bSYour Name  */
351*5113495bSYour Name void dp_tx_comp_process_tx_status(struct dp_soc *soc,
352*5113495bSYour Name 				  struct dp_tx_desc_s *tx_desc,
353*5113495bSYour Name 				  struct hal_tx_completion_status *ts,
354*5113495bSYour Name 				  struct dp_txrx_peer *txrx_peer,
355*5113495bSYour Name 				  uint8_t ring_id);
356*5113495bSYour Name 
357*5113495bSYour Name /**
358*5113495bSYour Name  * dp_tx_comp_process_desc() - Process tx descriptor and free associated nbuf
359*5113495bSYour Name  * @soc: DP Soc handle
360*5113495bSYour Name  * @desc: software Tx descriptor
361*5113495bSYour Name  * @ts: Tx completion status from HAL/HTT descriptor
362*5113495bSYour Name  * @txrx_peer: DP peer context
363*5113495bSYour Name  *
364*5113495bSYour Name  * Return: none
365*5113495bSYour Name  */
366*5113495bSYour Name void dp_tx_comp_process_desc(struct dp_soc *soc,
367*5113495bSYour Name 			     struct dp_tx_desc_s *desc,
368*5113495bSYour Name 			     struct hal_tx_completion_status *ts,
369*5113495bSYour Name 			     struct dp_txrx_peer *txrx_peer);
370*5113495bSYour Name 
371*5113495bSYour Name /**
372*5113495bSYour Name  * dp_tx_reinject_handler() - Tx Reinject Handler
373*5113495bSYour Name  * @soc: datapath soc handle
374*5113495bSYour Name  * @vdev: datapath vdev handle
375*5113495bSYour Name  * @tx_desc: software descriptor head pointer
376*5113495bSYour Name  * @status: Tx completion status from HTT descriptor
377*5113495bSYour Name  * @reinject_reason: reinject reason from HTT descriptor
378*5113495bSYour Name  *
379*5113495bSYour Name  * This function reinjects frames back to Target.
380*5113495bSYour Name  * Todo - Host queue needs to be added
381*5113495bSYour Name  *
382*5113495bSYour Name  * Return: none
383*5113495bSYour Name  */
384*5113495bSYour Name void dp_tx_reinject_handler(struct dp_soc *soc,
385*5113495bSYour Name 			    struct dp_vdev *vdev,
386*5113495bSYour Name 			    struct dp_tx_desc_s *tx_desc,
387*5113495bSYour Name 			    uint8_t *status,
388*5113495bSYour Name 			    uint8_t reinject_reason);
389*5113495bSYour Name 
390*5113495bSYour Name /**
391*5113495bSYour Name  * dp_tx_inspect_handler() - Tx Inspect Handler
392*5113495bSYour Name  * @soc: datapath soc handle
393*5113495bSYour Name  * @vdev: datapath vdev handle
394*5113495bSYour Name  * @tx_desc: software descriptor head pointer
395*5113495bSYour Name  * @status: Tx completion status from HTT descriptor
396*5113495bSYour Name  *
397*5113495bSYour Name  * Handles Tx frames sent back to Host for inspection
398*5113495bSYour Name  * (ProxyARP)
399*5113495bSYour Name  *
400*5113495bSYour Name  * Return: none
401*5113495bSYour Name  */
402*5113495bSYour Name void dp_tx_inspect_handler(struct dp_soc *soc,
403*5113495bSYour Name 			   struct dp_vdev *vdev,
404*5113495bSYour Name 			   struct dp_tx_desc_s *tx_desc,
405*5113495bSYour Name 			   uint8_t *status);
406*5113495bSYour Name 
407*5113495bSYour Name /**
408*5113495bSYour Name  * dp_tx_update_peer_basic_stats() - Update peer basic stats
409*5113495bSYour Name  * @txrx_peer: Datapath txrx_peer handle
410*5113495bSYour Name  * @length: Length of the packet
411*5113495bSYour Name  * @tx_status: Tx status from TQM/FW
412*5113495bSYour Name  * @update: enhanced flag value present in dp_pdev
413*5113495bSYour Name  *
414*5113495bSYour Name  * Return: none
415*5113495bSYour Name  */
416*5113495bSYour Name void dp_tx_update_peer_basic_stats(struct dp_txrx_peer *txrx_peer,
417*5113495bSYour Name 				   uint32_t length, uint8_t tx_status,
418*5113495bSYour Name 				   bool update);
419*5113495bSYour Name 
420*5113495bSYour Name #ifdef DP_UMAC_HW_RESET_SUPPORT
421*5113495bSYour Name /**
422*5113495bSYour Name  * dp_tx_drop() - Drop the frame on a given VAP
423*5113495bSYour Name  * @soc: DP soc handle
424*5113495bSYour Name  * @vdev_id: id of DP vdev handle
425*5113495bSYour Name  * @nbuf: skb
426*5113495bSYour Name  *
427*5113495bSYour Name  * Drop all the incoming packets
428*5113495bSYour Name  *
429*5113495bSYour Name  * Return: nbuf
430*5113495bSYour Name  */
431*5113495bSYour Name qdf_nbuf_t dp_tx_drop(struct cdp_soc_t *soc, uint8_t vdev_id, qdf_nbuf_t nbuf);
432*5113495bSYour Name 
433*5113495bSYour Name /**
434*5113495bSYour Name  * dp_tx_exc_drop() - Drop the frame on a given VAP
435*5113495bSYour Name  * @soc_hdl: DP soc handle
436*5113495bSYour Name  * @vdev_id: id of DP vdev handle
437*5113495bSYour Name  * @nbuf: skb
438*5113495bSYour Name  * @tx_exc_metadata: Handle that holds exception path meta data
439*5113495bSYour Name  *
440*5113495bSYour Name  * Drop all the incoming packets
441*5113495bSYour Name  *
442*5113495bSYour Name  * Return: nbuf
443*5113495bSYour Name  */
444*5113495bSYour Name qdf_nbuf_t dp_tx_exc_drop(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
445*5113495bSYour Name 			  qdf_nbuf_t nbuf,
446*5113495bSYour Name 			  struct cdp_tx_exception_metadata *tx_exc_metadata);
447*5113495bSYour Name #endif
448*5113495bSYour Name #ifdef WLAN_SUPPORT_PPEDS
449*5113495bSYour Name qdf_nbuf_t
450*5113495bSYour Name dp_ppeds_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc);
451*5113495bSYour Name #else
452*5113495bSYour Name static inline qdf_nbuf_t
dp_ppeds_tx_desc_free(struct dp_soc * soc,struct dp_tx_desc_s * tx_desc)453*5113495bSYour Name dp_ppeds_tx_desc_free(struct dp_soc *soc, struct dp_tx_desc_s *tx_desc)
454*5113495bSYour Name {
455*5113495bSYour Name 	return NULL;
456*5113495bSYour Name }
457*5113495bSYour Name #endif
458*5113495bSYour Name 
459*5113495bSYour Name /**
460*5113495bSYour Name  * dp_get_updated_tx_desc() - get updated tx_desc value
461*5113495bSYour Name  * @psoc: psoc object
462*5113495bSYour Name  * @pool_num: Tx desc pool Id
463*5113495bSYour Name  * @current_desc: Current Tx Desc value
464*5113495bSYour Name  *
465*5113495bSYour Name  * In Lowmem profiles the number of Tx desc in 4th pool is reduced to quarter
466*5113495bSYour Name  * for memory optimizations via this flag DP_TX_DESC_POOL_OPTIMIZE
467*5113495bSYour Name  *
468*5113495bSYour Name  * Return: Updated Tx Desc value
469*5113495bSYour Name  */
470*5113495bSYour Name #ifdef DP_TX_DESC_POOL_OPTIMIZE
dp_get_updated_tx_desc(struct cdp_ctrl_objmgr_psoc * psoc,uint8_t pool_num,uint32_t current_desc)471*5113495bSYour Name static inline uint32_t dp_get_updated_tx_desc(struct cdp_ctrl_objmgr_psoc *psoc,
472*5113495bSYour Name 					      uint8_t pool_num,
473*5113495bSYour Name 					      uint32_t current_desc)
474*5113495bSYour Name {
475*5113495bSYour Name 	if (pool_num == 3)
476*5113495bSYour Name 		return cfg_get(psoc, CFG_DP_TX_DESC_POOL_3);
477*5113495bSYour Name 	else
478*5113495bSYour Name 		return current_desc;
479*5113495bSYour Name }
480*5113495bSYour Name #else
dp_get_updated_tx_desc(struct cdp_ctrl_objmgr_psoc * psoc,uint8_t pool_num,uint32_t current_desc)481*5113495bSYour Name static inline uint32_t dp_get_updated_tx_desc(struct cdp_ctrl_objmgr_psoc *psoc,
482*5113495bSYour Name 					      uint8_t pool_num,
483*5113495bSYour Name 					      uint32_t current_desc)
484*5113495bSYour Name {
485*5113495bSYour Name 	return current_desc;
486*5113495bSYour Name }
487*5113495bSYour Name #endif
488*5113495bSYour Name 
489*5113495bSYour Name #ifdef DP_TX_EXT_DESC_POOL_OPTIMIZE
490*5113495bSYour Name /**
491*5113495bSYour Name  * dp_tx_ext_desc_pool_override() - Override tx ext desc pool Id
492*5113495bSYour Name  * @desc_pool_id: Desc pool Id
493*5113495bSYour Name  *
494*5113495bSYour Name  * For low mem profiles the number of ext_tx_desc_pool is reduced to 1.
495*5113495bSYour Name  * Since in Tx path the desc_pool_id is filled based on CPU core,
496*5113495bSYour Name  * dp_tx_ext_desc_pool_override will return the desc_pool_id as 0 for lowmem
497*5113495bSYour Name  * profiles.
498*5113495bSYour Name  *
499*5113495bSYour Name  * Return: updated tx_ext_desc_pool Id
500*5113495bSYour Name  */
dp_tx_ext_desc_pool_override(uint8_t desc_pool_id)501*5113495bSYour Name static inline uint8_t dp_tx_ext_desc_pool_override(uint8_t desc_pool_id)
502*5113495bSYour Name {
503*5113495bSYour Name 	return 0;
504*5113495bSYour Name }
505*5113495bSYour Name 
506*5113495bSYour Name /**
507*5113495bSYour Name  * dp_get_ext_tx_desc_pool_num() - get the number of ext_tx_desc pool
508*5113495bSYour Name  * @soc: core txrx main context
509*5113495bSYour Name  *
510*5113495bSYour Name  * For lowmem profiles the number of ext_tx_desc pool is reduced to 1 for
511*5113495bSYour Name  * memory optimizations.
512*5113495bSYour Name  * Based on this flag DP_TX_EXT_DESC_POOL_OPTIMIZE dp_get_ext_tx_desc_pool_num
513*5113495bSYour Name  * will return reduced desc_pool value 1 for low mem profile and for the other
514*5113495bSYour Name  * profiles it will return the same value as tx_desc pool.
515*5113495bSYour Name  *
516*5113495bSYour Name  * Return: number of ext_tx_desc pool
517*5113495bSYour Name  */
518*5113495bSYour Name 
dp_get_ext_tx_desc_pool_num(struct dp_soc * soc)519*5113495bSYour Name static inline uint8_t dp_get_ext_tx_desc_pool_num(struct dp_soc *soc)
520*5113495bSYour Name {
521*5113495bSYour Name 	return 1;
522*5113495bSYour Name }
523*5113495bSYour Name 
524*5113495bSYour Name #else
dp_tx_ext_desc_pool_override(uint8_t desc_pool_id)525*5113495bSYour Name static inline uint8_t dp_tx_ext_desc_pool_override(uint8_t desc_pool_id)
526*5113495bSYour Name {
527*5113495bSYour Name 	return desc_pool_id;
528*5113495bSYour Name }
529*5113495bSYour Name 
dp_get_ext_tx_desc_pool_num(struct dp_soc * soc)530*5113495bSYour Name static inline uint8_t dp_get_ext_tx_desc_pool_num(struct dp_soc *soc)
531*5113495bSYour Name {
532*5113495bSYour Name 	return wlan_cfg_get_num_tx_desc_pool(soc->wlan_cfg_ctx);
533*5113495bSYour Name }
534*5113495bSYour Name #endif
535*5113495bSYour Name 
536*5113495bSYour Name #ifndef QCA_HOST_MODE_WIFI_DISABLED
537*5113495bSYour Name /**
538*5113495bSYour Name  * dp_tso_soc_attach() - TSO Attach handler
539*5113495bSYour Name  * @txrx_soc: Opaque Dp handle
540*5113495bSYour Name  *
541*5113495bSYour Name  * Reserve TSO descriptor buffers
542*5113495bSYour Name  *
543*5113495bSYour Name  * Return: QDF_STATUS_E_FAILURE on failure or
544*5113495bSYour Name  * QDF_STATUS_SUCCESS on success
545*5113495bSYour Name  */
546*5113495bSYour Name QDF_STATUS dp_tso_soc_attach(struct cdp_soc_t *txrx_soc);
547*5113495bSYour Name 
548*5113495bSYour Name /**
549*5113495bSYour Name  * dp_tso_soc_detach() - TSO Detach handler
550*5113495bSYour Name  * @txrx_soc: Opaque Dp handle
551*5113495bSYour Name  *
552*5113495bSYour Name  * Deallocate TSO descriptor buffers
553*5113495bSYour Name  *
554*5113495bSYour Name  * Return: QDF_STATUS_E_FAILURE on failure or
555*5113495bSYour Name  * QDF_STATUS_SUCCESS on success
556*5113495bSYour Name  */
557*5113495bSYour Name QDF_STATUS dp_tso_soc_detach(struct cdp_soc_t *txrx_soc);
558*5113495bSYour Name 
559*5113495bSYour Name /**
560*5113495bSYour Name  * dp_tx_send() - Transmit a frame on a given VAP
561*5113495bSYour Name  * @soc_hdl: DP soc handle
562*5113495bSYour Name  * @vdev_id: id of DP vdev handle
563*5113495bSYour Name  * @nbuf: skb
564*5113495bSYour Name  *
565*5113495bSYour Name  * Entry point for Core Tx layer (DP_TX) invoked from
566*5113495bSYour Name  * hard_start_xmit in OSIF/HDD or from dp_rx_process for intravap forwarding
567*5113495bSYour Name  * cases
568*5113495bSYour Name  *
569*5113495bSYour Name  * Return: NULL on success,
570*5113495bSYour Name  *         nbuf when it fails to send
571*5113495bSYour Name  */
572*5113495bSYour Name qdf_nbuf_t dp_tx_send(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
573*5113495bSYour Name 		      qdf_nbuf_t nbuf);
574*5113495bSYour Name 
575*5113495bSYour Name /**
576*5113495bSYour Name  * dp_tx_send_vdev_id_check() - Transmit a frame on a given VAP in special
577*5113495bSYour Name  *      case to avoid check in per-packet path.
578*5113495bSYour Name  * @soc_hdl: DP soc handle
579*5113495bSYour Name  * @vdev_id: id of DP vdev handle
580*5113495bSYour Name  * @nbuf: skb
581*5113495bSYour Name  *
582*5113495bSYour Name  * Entry point for Core Tx layer (DP_TX) invoked from
583*5113495bSYour Name  * hard_start_xmit in OSIF/HDD to transmit packet through dp_tx_send
584*5113495bSYour Name  * with special condition to avoid per pkt check in dp_tx_send
585*5113495bSYour Name  *
586*5113495bSYour Name  * Return: NULL on success,
587*5113495bSYour Name  *         nbuf when it fails to send
588*5113495bSYour Name  */
589*5113495bSYour Name qdf_nbuf_t dp_tx_send_vdev_id_check(struct cdp_soc_t *soc_hdl,
590*5113495bSYour Name 				    uint8_t vdev_id, qdf_nbuf_t nbuf);
591*5113495bSYour Name 
592*5113495bSYour Name /**
593*5113495bSYour Name  * dp_tx_send_exception() - Transmit a frame on a given VAP in exception path
594*5113495bSYour Name  * @soc_hdl: DP soc handle
595*5113495bSYour Name  * @vdev_id: id of DP vdev handle
596*5113495bSYour Name  * @nbuf: skb
597*5113495bSYour Name  * @tx_exc_metadata: Handle that holds exception path meta data
598*5113495bSYour Name  *
599*5113495bSYour Name  * Entry point for Core Tx layer (DP_TX) invoked from
600*5113495bSYour Name  * hard_start_xmit in OSIF/HDD to transmit frames through fw
601*5113495bSYour Name  *
602*5113495bSYour Name  * Return: NULL on success,
603*5113495bSYour Name  *         nbuf when it fails to send
604*5113495bSYour Name  */
605*5113495bSYour Name qdf_nbuf_t
606*5113495bSYour Name dp_tx_send_exception(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
607*5113495bSYour Name 		     qdf_nbuf_t nbuf,
608*5113495bSYour Name 		     struct cdp_tx_exception_metadata *tx_exc_metadata);
609*5113495bSYour Name 
610*5113495bSYour Name /**
611*5113495bSYour Name  * dp_tx_send_exception_vdev_id_check() - Transmit a frame on a given VAP
612*5113495bSYour Name  *      in exception path in special case to avoid regular exception path chk.
613*5113495bSYour Name  * @soc_hdl: DP soc handle
614*5113495bSYour Name  * @vdev_id: id of DP vdev handle
615*5113495bSYour Name  * @nbuf: skb
616*5113495bSYour Name  * @tx_exc_metadata: Handle that holds exception path meta data
617*5113495bSYour Name  *
618*5113495bSYour Name  * Entry point for Core Tx layer (DP_TX) invoked from
619*5113495bSYour Name  * hard_start_xmit in OSIF/HDD to transmit frames through fw
620*5113495bSYour Name  *
621*5113495bSYour Name  * Return: NULL on success,
622*5113495bSYour Name  *         nbuf when it fails to send
623*5113495bSYour Name  */
624*5113495bSYour Name qdf_nbuf_t
625*5113495bSYour Name dp_tx_send_exception_vdev_id_check(struct cdp_soc_t *soc_hdl,
626*5113495bSYour Name 				   uint8_t vdev_id, qdf_nbuf_t nbuf,
627*5113495bSYour Name 				   struct cdp_tx_exception_metadata *tx_exc_metadata);
628*5113495bSYour Name 
629*5113495bSYour Name /**
630*5113495bSYour Name  * dp_tx_send_mesh() - Transmit mesh frame on a given VAP
631*5113495bSYour Name  * @soc_hdl: DP soc handle
632*5113495bSYour Name  * @vdev_id: DP vdev handle
633*5113495bSYour Name  * @nbuf: skb
634*5113495bSYour Name  *
635*5113495bSYour Name  * Entry point for Core Tx layer (DP_TX) invoked from
636*5113495bSYour Name  * hard_start_xmit in OSIF/HDD
637*5113495bSYour Name  *
638*5113495bSYour Name  * Return: NULL on success,
639*5113495bSYour Name  *         nbuf when it fails to send
640*5113495bSYour Name  */
641*5113495bSYour Name qdf_nbuf_t dp_tx_send_mesh(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
642*5113495bSYour Name 			   qdf_nbuf_t nbuf);
643*5113495bSYour Name 
644*5113495bSYour Name /**
645*5113495bSYour Name  * dp_tx_send_msdu_single() - Setup descriptor and enqueue single MSDU to TCL
646*5113495bSYour Name  * @vdev: DP vdev handle
647*5113495bSYour Name  * @nbuf: skb
648*5113495bSYour Name  * @msdu_info: MSDU information
649*5113495bSYour Name  * @peer_id: peer_id of the peer in case of NAWDS frames
650*5113495bSYour Name  * @tx_exc_metadata: Handle that holds exception path metadata
651*5113495bSYour Name  *
652*5113495bSYour Name  * Return: NULL on success,
653*5113495bSYour Name  *         nbuf when it fails to send
654*5113495bSYour Name  */
655*5113495bSYour Name qdf_nbuf_t
656*5113495bSYour Name dp_tx_send_msdu_single(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
657*5113495bSYour Name 		       struct dp_tx_msdu_info_s *msdu_info, uint16_t peer_id,
658*5113495bSYour Name 		       struct cdp_tx_exception_metadata *tx_exc_metadata);
659*5113495bSYour Name 
660*5113495bSYour Name /**
661*5113495bSYour Name  * dp_tx_mcast_enhance() - Multicast enhancement on TX
662*5113495bSYour Name  * @vdev: DP vdev handle
663*5113495bSYour Name  * @nbuf: network buffer to be transmitted
664*5113495bSYour Name  *
665*5113495bSYour Name  * Return: true on success
666*5113495bSYour Name  *         false on failure
667*5113495bSYour Name  */
668*5113495bSYour Name bool dp_tx_mcast_enhance(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
669*5113495bSYour Name 
670*5113495bSYour Name /**
671*5113495bSYour Name  * dp_tx_send_msdu_multiple() - Enqueue multiple MSDUs
672*5113495bSYour Name  * @vdev: DP vdev handle
673*5113495bSYour Name  * @nbuf: skb
674*5113495bSYour Name  * @msdu_info: MSDU info to be setup in MSDU extension descriptor
675*5113495bSYour Name  *
676*5113495bSYour Name  * Prepare descriptors for multiple MSDUs (TSO segments) and enqueue to TCL
677*5113495bSYour Name  *
678*5113495bSYour Name  * Return: NULL on success,
679*5113495bSYour Name  *         nbuf when it fails to send
680*5113495bSYour Name  */
681*5113495bSYour Name #if QDF_LOCK_STATS
682*5113495bSYour Name noinline qdf_nbuf_t
683*5113495bSYour Name dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
684*5113495bSYour Name 			 struct dp_tx_msdu_info_s *msdu_info);
685*5113495bSYour Name #else
686*5113495bSYour Name qdf_nbuf_t dp_tx_send_msdu_multiple(struct dp_vdev *vdev, qdf_nbuf_t nbuf,
687*5113495bSYour Name 				    struct dp_tx_msdu_info_s *msdu_info);
688*5113495bSYour Name #endif
689*5113495bSYour Name #ifdef FEATURE_WLAN_TDLS
690*5113495bSYour Name /**
691*5113495bSYour Name  * dp_tx_non_std() - Allow the control-path SW to send data frames
692*5113495bSYour Name  * @soc_hdl: Datapath soc handle
693*5113495bSYour Name  * @vdev_id: id of vdev
694*5113495bSYour Name  * @tx_spec: what non-standard handling to apply to the tx data frames
695*5113495bSYour Name  * @msdu_list: NULL-terminated list of tx MSDUs
696*5113495bSYour Name  *
697*5113495bSYour Name  * Return: NULL on success,
698*5113495bSYour Name  *         nbuf when it fails to send
699*5113495bSYour Name  */
700*5113495bSYour Name qdf_nbuf_t dp_tx_non_std(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
701*5113495bSYour Name 			 enum ol_tx_spec tx_spec, qdf_nbuf_t msdu_list);
702*5113495bSYour Name #endif
703*5113495bSYour Name 
704*5113495bSYour Name /**
705*5113495bSYour Name  * dp_tx_frame_is_drop() - checks if the packet is loopback
706*5113495bSYour Name  * @vdev: DP vdev handle
707*5113495bSYour Name  * @srcmac: source MAC address
708*5113495bSYour Name  * @dstmac: destination MAC address
709*5113495bSYour Name  *
710*5113495bSYour Name  * Return: 1 if frame needs to be dropped else 0
711*5113495bSYour Name  */
712*5113495bSYour Name int dp_tx_frame_is_drop(struct dp_vdev *vdev, uint8_t *srcmac, uint8_t *dstmac);
713*5113495bSYour Name 
714*5113495bSYour Name #ifndef WLAN_SOFTUMAC_SUPPORT
715*5113495bSYour Name /**
716*5113495bSYour Name  * dp_tx_comp_handler() - Tx completion handler
717*5113495bSYour Name  * @int_ctx: pointer to DP interrupt context
718*5113495bSYour Name  * @soc: core txrx main context
719*5113495bSYour Name  * @hal_srng: Opaque HAL SRNG pointer
720*5113495bSYour Name  * @ring_id: completion ring id
721*5113495bSYour Name  * @quota: No. of packets/descriptors that can be serviced in one loop
722*5113495bSYour Name  *
723*5113495bSYour Name  * This function will collect hardware release ring element contents and
724*5113495bSYour Name  * handle descriptor contents. Based on contents, free packet or handle error
725*5113495bSYour Name  * conditions
726*5113495bSYour Name  *
727*5113495bSYour Name  * Return: Number of TX completions processed
728*5113495bSYour Name  */
729*5113495bSYour Name uint32_t dp_tx_comp_handler(struct dp_intr *int_ctx, struct dp_soc *soc,
730*5113495bSYour Name 			    hal_ring_handle_t hal_srng, uint8_t ring_id,
731*5113495bSYour Name 			    uint32_t quota);
732*5113495bSYour Name #endif
733*5113495bSYour Name 
734*5113495bSYour Name void
735*5113495bSYour Name dp_tx_comp_process_desc_list(struct dp_soc *soc,
736*5113495bSYour Name 			     struct dp_tx_desc_s *comp_head, uint8_t ring_id);
737*5113495bSYour Name 
738*5113495bSYour Name QDF_STATUS
739*5113495bSYour Name dp_tx_prepare_send_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
740*5113495bSYour Name 
741*5113495bSYour Name QDF_STATUS
742*5113495bSYour Name dp_tx_prepare_send_igmp_me(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
743*5113495bSYour Name 
744*5113495bSYour Name #endif /* QCA_HOST_MODE_WIFI_DISABLED */
745*5113495bSYour Name 
746*5113495bSYour Name #if defined(QCA_HOST_MODE_WIFI_DISABLED) || !defined(ATH_SUPPORT_IQUE)
dp_tx_me_exit(struct dp_pdev * pdev)747*5113495bSYour Name static inline void dp_tx_me_exit(struct dp_pdev *pdev)
748*5113495bSYour Name {
749*5113495bSYour Name 	return;
750*5113495bSYour Name }
751*5113495bSYour Name #endif
752*5113495bSYour Name 
753*5113495bSYour Name /**
754*5113495bSYour Name  * dp_tx_pdev_init() - dp tx pdev init
755*5113495bSYour Name  * @pdev: physical device instance
756*5113495bSYour Name  *
757*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: success
758*5113495bSYour Name  *         QDF_STATUS_E_RESOURCES: Error return
759*5113495bSYour Name  */
dp_tx_pdev_init(struct dp_pdev * pdev)760*5113495bSYour Name static inline QDF_STATUS dp_tx_pdev_init(struct dp_pdev *pdev)
761*5113495bSYour Name {
762*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
763*5113495bSYour Name 
764*5113495bSYour Name 	/* Initialize Flow control counters */
765*5113495bSYour Name 	qdf_atomic_init(&pdev->num_tx_outstanding);
766*5113495bSYour Name 	pdev->tx_descs_max = 0;
767*5113495bSYour Name 	if (wlan_cfg_per_pdev_tx_ring(soc->wlan_cfg_ctx)) {
768*5113495bSYour Name 		/* Initialize descriptors in TCL Ring */
769*5113495bSYour Name 		hal_tx_init_data_ring(soc->hal_soc,
770*5113495bSYour Name 				soc->tcl_data_ring[pdev->pdev_id].hal_srng);
771*5113495bSYour Name 	}
772*5113495bSYour Name 
773*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
774*5113495bSYour Name }
775*5113495bSYour Name 
776*5113495bSYour Name /**
777*5113495bSYour Name  * dp_tx_prefetch_hw_sw_nbuf_desc() - function to prefetch HW and SW desc
778*5113495bSYour Name  * @soc: Handle to HAL Soc structure
779*5113495bSYour Name  * @hal_soc: HAL SOC handle
780*5113495bSYour Name  * @num_avail_for_reap: descriptors available for reap
781*5113495bSYour Name  * @hal_ring_hdl: ring pointer
782*5113495bSYour Name  * @last_prefetched_hw_desc: pointer to the last prefetched HW descriptor
783*5113495bSYour Name  * @last_prefetched_sw_desc: pointer to last prefetch SW desc
784*5113495bSYour Name  * @last_hw_desc: pointer to last HW desc
785*5113495bSYour Name  *
786*5113495bSYour Name  * Return: None
787*5113495bSYour Name  */
788*5113495bSYour Name #ifdef QCA_DP_TX_HW_SW_NBUF_DESC_PREFETCH
789*5113495bSYour Name static inline
dp_tx_prefetch_hw_sw_nbuf_desc(struct dp_soc * soc,hal_soc_handle_t hal_soc,uint32_t num_avail_for_reap,hal_ring_handle_t hal_ring_hdl,void ** last_prefetched_hw_desc,struct dp_tx_desc_s ** last_prefetched_sw_desc,void * last_hw_desc)790*5113495bSYour Name void dp_tx_prefetch_hw_sw_nbuf_desc(struct dp_soc *soc,
791*5113495bSYour Name 				    hal_soc_handle_t hal_soc,
792*5113495bSYour Name 				    uint32_t num_avail_for_reap,
793*5113495bSYour Name 				    hal_ring_handle_t hal_ring_hdl,
794*5113495bSYour Name 				    void **last_prefetched_hw_desc,
795*5113495bSYour Name 				    struct dp_tx_desc_s
796*5113495bSYour Name 				    **last_prefetched_sw_desc,
797*5113495bSYour Name 				    void *last_hw_desc)
798*5113495bSYour Name {
799*5113495bSYour Name 	if (*last_prefetched_sw_desc) {
800*5113495bSYour Name 		qdf_prefetch((uint8_t *)(*last_prefetched_sw_desc)->nbuf);
801*5113495bSYour Name 		qdf_prefetch((uint8_t *)(*last_prefetched_sw_desc)->nbuf + 64);
802*5113495bSYour Name 	}
803*5113495bSYour Name 
804*5113495bSYour Name 	if (qdf_unlikely(last_hw_desc &&
805*5113495bSYour Name 			 (*last_prefetched_hw_desc == last_hw_desc)))
806*5113495bSYour Name 		return;
807*5113495bSYour Name 
808*5113495bSYour Name 	if (num_avail_for_reap && *last_prefetched_hw_desc) {
809*5113495bSYour Name 		soc->arch_ops.tx_comp_get_params_from_hal_desc(soc,
810*5113495bSYour Name 						       *last_prefetched_hw_desc,
811*5113495bSYour Name 						       last_prefetched_sw_desc);
812*5113495bSYour Name 
813*5113495bSYour Name 		if ((uintptr_t)*last_prefetched_hw_desc & 0x3f)
814*5113495bSYour Name 			*last_prefetched_hw_desc =
815*5113495bSYour Name 				hal_srng_dst_prefetch_next_cached_desc(
816*5113495bSYour Name 					hal_soc,
817*5113495bSYour Name 					hal_ring_hdl,
818*5113495bSYour Name 					(uint8_t *)*last_prefetched_hw_desc);
819*5113495bSYour Name 		else
820*5113495bSYour Name 			*last_prefetched_hw_desc =
821*5113495bSYour Name 				hal_srng_dst_get_next_32_byte_desc(hal_soc,
822*5113495bSYour Name 					hal_ring_hdl,
823*5113495bSYour Name 					(uint8_t *)*last_prefetched_hw_desc);
824*5113495bSYour Name 	}
825*5113495bSYour Name }
826*5113495bSYour Name #else
827*5113495bSYour Name static inline
dp_tx_prefetch_hw_sw_nbuf_desc(struct dp_soc * soc,hal_soc_handle_t hal_soc,uint32_t num_avail_for_reap,hal_ring_handle_t hal_ring_hdl,void ** last_prefetched_hw_desc,struct dp_tx_desc_s ** last_prefetched_sw_desc,void * last_hw_desc)828*5113495bSYour Name void dp_tx_prefetch_hw_sw_nbuf_desc(struct dp_soc *soc,
829*5113495bSYour Name 				    hal_soc_handle_t hal_soc,
830*5113495bSYour Name 				    uint32_t num_avail_for_reap,
831*5113495bSYour Name 				    hal_ring_handle_t hal_ring_hdl,
832*5113495bSYour Name 				    void **last_prefetched_hw_desc,
833*5113495bSYour Name 				    struct dp_tx_desc_s
834*5113495bSYour Name 				    **last_prefetched_sw_desc,
835*5113495bSYour Name 				    void *last_hw_desc)
836*5113495bSYour Name {
837*5113495bSYour Name }
838*5113495bSYour Name #endif
839*5113495bSYour Name 
840*5113495bSYour Name #ifndef FEATURE_WDS
dp_tx_mec_handler(struct dp_vdev * vdev,uint8_t * status)841*5113495bSYour Name static inline void dp_tx_mec_handler(struct dp_vdev *vdev, uint8_t *status)
842*5113495bSYour Name {
843*5113495bSYour Name 	return;
844*5113495bSYour Name }
845*5113495bSYour Name #endif
846*5113495bSYour Name 
847*5113495bSYour Name #ifndef QCA_MULTIPASS_SUPPORT
848*5113495bSYour Name static inline
dp_tx_multipass_process(struct dp_soc * soc,struct dp_vdev * vdev,qdf_nbuf_t nbuf,struct dp_tx_msdu_info_s * msdu_info)849*5113495bSYour Name bool dp_tx_multipass_process(struct dp_soc *soc, struct dp_vdev *vdev,
850*5113495bSYour Name 			     qdf_nbuf_t nbuf,
851*5113495bSYour Name 			     struct dp_tx_msdu_info_s *msdu_info)
852*5113495bSYour Name {
853*5113495bSYour Name 	return true;
854*5113495bSYour Name }
855*5113495bSYour Name 
856*5113495bSYour Name static inline
dp_tx_vdev_multipass_deinit(struct dp_vdev * vdev)857*5113495bSYour Name void dp_tx_vdev_multipass_deinit(struct dp_vdev *vdev)
858*5113495bSYour Name {
859*5113495bSYour Name }
860*5113495bSYour Name 
861*5113495bSYour Name #else
862*5113495bSYour Name /**
863*5113495bSYour Name  * dp_tx_multipass_process() - Process vlan frames in tx path
864*5113495bSYour Name  * @soc: dp soc handle
865*5113495bSYour Name  * @vdev: DP vdev handle
866*5113495bSYour Name  * @nbuf: skb
867*5113495bSYour Name  * @msdu_info: msdu descriptor
868*5113495bSYour Name  *
869*5113495bSYour Name  * Return: status whether frame needs to be dropped or transmitted
870*5113495bSYour Name  */
871*5113495bSYour Name bool dp_tx_multipass_process(struct dp_soc *soc, struct dp_vdev *vdev,
872*5113495bSYour Name 			     qdf_nbuf_t nbuf,
873*5113495bSYour Name 			     struct dp_tx_msdu_info_s *msdu_info);
874*5113495bSYour Name 
875*5113495bSYour Name /**
876*5113495bSYour Name  * dp_tx_vdev_multipass_deinit() - set vlan map for vdev
877*5113495bSYour Name  * @vdev: pointer to vdev
878*5113495bSYour Name  *
879*5113495bSYour Name  * return: void
880*5113495bSYour Name  */
881*5113495bSYour Name void dp_tx_vdev_multipass_deinit(struct dp_vdev *vdev);
882*5113495bSYour Name 
883*5113495bSYour Name /**
884*5113495bSYour Name  * dp_tx_add_groupkey_metadata() - Add group key in metadata
885*5113495bSYour Name  * @vdev: DP vdev handle
886*5113495bSYour Name  * @msdu_info: MSDU info to be setup in MSDU descriptor
887*5113495bSYour Name  * @group_key: Group key index programmed in metadata
888*5113495bSYour Name  *
889*5113495bSYour Name  * Return: void
890*5113495bSYour Name  */
891*5113495bSYour Name void dp_tx_add_groupkey_metadata(struct dp_vdev *vdev,
892*5113495bSYour Name 				 struct dp_tx_msdu_info_s *msdu_info,
893*5113495bSYour Name 				 uint16_t group_key);
894*5113495bSYour Name #endif
895*5113495bSYour Name 
896*5113495bSYour Name /**
897*5113495bSYour Name  * dp_tx_hw_to_qdf()- convert hw status to qdf status
898*5113495bSYour Name  * @status: hw status
899*5113495bSYour Name  *
900*5113495bSYour Name  * Return: qdf tx rx status
901*5113495bSYour Name  */
dp_tx_hw_to_qdf(uint16_t status)902*5113495bSYour Name static inline enum qdf_dp_tx_rx_status dp_tx_hw_to_qdf(uint16_t status)
903*5113495bSYour Name {
904*5113495bSYour Name 	switch (status) {
905*5113495bSYour Name 	case HAL_TX_TQM_RR_FRAME_ACKED:
906*5113495bSYour Name 		return QDF_TX_RX_STATUS_OK;
907*5113495bSYour Name 	case HAL_TX_TQM_RR_REM_CMD_TX:
908*5113495bSYour Name 		return QDF_TX_RX_STATUS_NO_ACK;
909*5113495bSYour Name 	case HAL_TX_TQM_RR_REM_CMD_REM:
910*5113495bSYour Name 	case HAL_TX_TQM_RR_REM_CMD_NOTX:
911*5113495bSYour Name 	case HAL_TX_TQM_RR_REM_CMD_AGED:
912*5113495bSYour Name 		return QDF_TX_RX_STATUS_FW_DISCARD;
913*5113495bSYour Name 	default:
914*5113495bSYour Name 		return QDF_TX_RX_STATUS_DEFAULT;
915*5113495bSYour Name 	}
916*5113495bSYour Name }
917*5113495bSYour Name 
918*5113495bSYour Name #ifndef QCA_HOST_MODE_WIFI_DISABLED
919*5113495bSYour Name /**
920*5113495bSYour Name  * dp_tx_get_queue() - Returns Tx queue IDs to be used for this Tx frame
921*5113495bSYour Name  * @vdev: DP Virtual device handle
922*5113495bSYour Name  * @nbuf: Buffer pointer
923*5113495bSYour Name  * @queue: queue ids container for nbuf
924*5113495bSYour Name  *
925*5113495bSYour Name  * TX packet queue has 2 instances, software descriptors id and dma ring id
926*5113495bSYour Name  * Based on tx feature and hardware configuration queue id combination could be
927*5113495bSYour Name  * different.
928*5113495bSYour Name  * For example -
929*5113495bSYour Name  * With XPS enabled,all TX descriptor pools and dma ring are assigned per cpu id
930*5113495bSYour Name  * With no XPS,lock based resource protection, Descriptor pool ids are different
931*5113495bSYour Name  * for each vdev, dma ring id will be same as single pdev id
932*5113495bSYour Name  *
933*5113495bSYour Name  * Return: None
934*5113495bSYour Name  */
935*5113495bSYour Name #ifdef QCA_OL_TX_MULTIQ_SUPPORT
936*5113495bSYour Name #if defined(IPA_OFFLOAD) && defined(QCA_IPA_LL_TX_FLOW_CONTROL)
937*5113495bSYour Name #ifdef IPA_WDI3_TX_TWO_PIPES
dp_tx_get_queue(struct dp_vdev * vdev,qdf_nbuf_t nbuf,struct dp_tx_queue * queue)938*5113495bSYour Name static inline void dp_tx_get_queue(struct dp_vdev *vdev,
939*5113495bSYour Name 				   qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
940*5113495bSYour Name {
941*5113495bSYour Name 	queue->ring_id = qdf_get_cpu();
942*5113495bSYour Name 	if (vdev->pdev->soc->wlan_cfg_ctx->ipa_enabled)
943*5113495bSYour Name 		if ((queue->ring_id == IPA_TCL_DATA_RING_IDX) ||
944*5113495bSYour Name 		    (queue->ring_id == IPA_TX_ALT_RING_IDX))
945*5113495bSYour Name 			queue->ring_id = 0;
946*5113495bSYour Name 
947*5113495bSYour Name 	queue->desc_pool_id = queue->ring_id;
948*5113495bSYour Name }
949*5113495bSYour Name #else
dp_tx_get_queue(struct dp_vdev * vdev,qdf_nbuf_t nbuf,struct dp_tx_queue * queue)950*5113495bSYour Name static inline void dp_tx_get_queue(struct dp_vdev *vdev,
951*5113495bSYour Name 				   qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
952*5113495bSYour Name {
953*5113495bSYour Name 	queue->ring_id = qdf_get_cpu();
954*5113495bSYour Name 	if (vdev->pdev->soc->wlan_cfg_ctx->ipa_enabled)
955*5113495bSYour Name 		if (queue->ring_id == IPA_TCL_DATA_RING_IDX)
956*5113495bSYour Name 			queue->ring_id = 0;
957*5113495bSYour Name 
958*5113495bSYour Name 	queue->desc_pool_id = queue->ring_id;
959*5113495bSYour Name }
960*5113495bSYour Name #endif
961*5113495bSYour Name #else
962*5113495bSYour Name #ifdef WLAN_TX_PKT_CAPTURE_ENH
dp_tx_get_queue(struct dp_vdev * vdev,qdf_nbuf_t nbuf,struct dp_tx_queue * queue)963*5113495bSYour Name static inline void dp_tx_get_queue(struct dp_vdev *vdev,
964*5113495bSYour Name 				   qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
965*5113495bSYour Name {
966*5113495bSYour Name 	if (qdf_unlikely(vdev->is_override_rbm_id))
967*5113495bSYour Name 		queue->ring_id = vdev->rbm_id;
968*5113495bSYour Name 	else
969*5113495bSYour Name 		queue->ring_id = qdf_get_cpu();
970*5113495bSYour Name 
971*5113495bSYour Name 	queue->desc_pool_id = queue->ring_id;
972*5113495bSYour Name }
973*5113495bSYour Name #else
dp_tx_get_queue(struct dp_vdev * vdev,qdf_nbuf_t nbuf,struct dp_tx_queue * queue)974*5113495bSYour Name static inline void dp_tx_get_queue(struct dp_vdev *vdev,
975*5113495bSYour Name 				   qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
976*5113495bSYour Name {
977*5113495bSYour Name 	queue->ring_id = qdf_get_cpu();
978*5113495bSYour Name 	queue->desc_pool_id = queue->ring_id;
979*5113495bSYour Name }
980*5113495bSYour Name 
981*5113495bSYour Name #endif
982*5113495bSYour Name #endif
983*5113495bSYour Name 
984*5113495bSYour Name /**
985*5113495bSYour Name  * dp_tx_get_hal_ring_hdl() - Get the hal_tx_ring_hdl for data transmission
986*5113495bSYour Name  * @soc: DP soc structure pointer
987*5113495bSYour Name  * @ring_id: Transmit Queue/ring_id to be used when XPS is enabled
988*5113495bSYour Name  *
989*5113495bSYour Name  * Return: HAL ring handle
990*5113495bSYour Name  */
dp_tx_get_hal_ring_hdl(struct dp_soc * soc,uint8_t ring_id)991*5113495bSYour Name static inline hal_ring_handle_t dp_tx_get_hal_ring_hdl(struct dp_soc *soc,
992*5113495bSYour Name 						       uint8_t ring_id)
993*5113495bSYour Name {
994*5113495bSYour Name 	if (ring_id == soc->num_tcl_data_rings)
995*5113495bSYour Name 		return soc->tcl_cmd_credit_ring.hal_srng;
996*5113495bSYour Name 
997*5113495bSYour Name 	return soc->tcl_data_ring[ring_id].hal_srng;
998*5113495bSYour Name }
999*5113495bSYour Name 
1000*5113495bSYour Name #else /* QCA_OL_TX_MULTIQ_SUPPORT */
1001*5113495bSYour Name 
1002*5113495bSYour Name #ifdef TX_MULTI_TCL
1003*5113495bSYour Name #ifdef IPA_OFFLOAD
dp_tx_get_queue(struct dp_vdev * vdev,qdf_nbuf_t nbuf,struct dp_tx_queue * queue)1004*5113495bSYour Name static inline void dp_tx_get_queue(struct dp_vdev *vdev,
1005*5113495bSYour Name 				   qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
1006*5113495bSYour Name {
1007*5113495bSYour Name 	/* get flow id */
1008*5113495bSYour Name 	queue->desc_pool_id = DP_TX_GET_DESC_POOL_ID(vdev);
1009*5113495bSYour Name 	if (vdev->pdev->soc->wlan_cfg_ctx->ipa_enabled &&
1010*5113495bSYour Name 	    !ipa_config_is_opt_wifi_dp_enabled())
1011*5113495bSYour Name 		queue->ring_id = DP_TX_GET_RING_ID(vdev);
1012*5113495bSYour Name 	else
1013*5113495bSYour Name 		queue->ring_id = (qdf_nbuf_get_queue_mapping(nbuf) %
1014*5113495bSYour Name 					vdev->pdev->soc->num_tcl_data_rings);
1015*5113495bSYour Name }
1016*5113495bSYour Name #else
dp_tx_get_queue(struct dp_vdev * vdev,qdf_nbuf_t nbuf,struct dp_tx_queue * queue)1017*5113495bSYour Name static inline void dp_tx_get_queue(struct dp_vdev *vdev,
1018*5113495bSYour Name 				   qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
1019*5113495bSYour Name {
1020*5113495bSYour Name 	/* get flow id */
1021*5113495bSYour Name 	queue->desc_pool_id = DP_TX_GET_DESC_POOL_ID(vdev);
1022*5113495bSYour Name 	queue->ring_id = (qdf_nbuf_get_queue_mapping(nbuf) %
1023*5113495bSYour Name 				vdev->pdev->soc->num_tcl_data_rings);
1024*5113495bSYour Name }
1025*5113495bSYour Name #endif
1026*5113495bSYour Name #else
dp_tx_get_queue(struct dp_vdev * vdev,qdf_nbuf_t nbuf,struct dp_tx_queue * queue)1027*5113495bSYour Name static inline void dp_tx_get_queue(struct dp_vdev *vdev,
1028*5113495bSYour Name 				   qdf_nbuf_t nbuf, struct dp_tx_queue *queue)
1029*5113495bSYour Name {
1030*5113495bSYour Name 	/* get flow id */
1031*5113495bSYour Name 	queue->desc_pool_id = DP_TX_GET_DESC_POOL_ID(vdev);
1032*5113495bSYour Name 	queue->ring_id = DP_TX_GET_RING_ID(vdev);
1033*5113495bSYour Name }
1034*5113495bSYour Name #endif
1035*5113495bSYour Name 
dp_tx_get_hal_ring_hdl(struct dp_soc * soc,uint8_t ring_id)1036*5113495bSYour Name static inline hal_ring_handle_t dp_tx_get_hal_ring_hdl(struct dp_soc *soc,
1037*5113495bSYour Name 						       uint8_t ring_id)
1038*5113495bSYour Name {
1039*5113495bSYour Name 	return soc->tcl_data_ring[ring_id].hal_srng;
1040*5113495bSYour Name }
1041*5113495bSYour Name #endif
1042*5113495bSYour Name 
1043*5113495bSYour Name #ifdef QCA_OL_TX_LOCK_LESS_ACCESS
1044*5113495bSYour Name /**
1045*5113495bSYour Name  * dp_tx_hal_ring_access_start() - hal_tx_ring access for data transmission
1046*5113495bSYour Name  * @soc: DP soc structure pointer
1047*5113495bSYour Name  * @hal_ring_hdl: HAL ring handle
1048*5113495bSYour Name  *
1049*5113495bSYour Name  * Return: None
1050*5113495bSYour Name  */
dp_tx_hal_ring_access_start(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl)1051*5113495bSYour Name static inline int dp_tx_hal_ring_access_start(struct dp_soc *soc,
1052*5113495bSYour Name 					      hal_ring_handle_t hal_ring_hdl)
1053*5113495bSYour Name {
1054*5113495bSYour Name 	return hal_srng_access_start_unlocked(soc->hal_soc, hal_ring_hdl);
1055*5113495bSYour Name }
1056*5113495bSYour Name 
1057*5113495bSYour Name /**
1058*5113495bSYour Name  * dp_tx_hal_ring_access_end() - hal_tx_ring access for data transmission
1059*5113495bSYour Name  * @soc: DP soc structure pointer
1060*5113495bSYour Name  * @hal_ring_hdl: HAL ring handle
1061*5113495bSYour Name  *
1062*5113495bSYour Name  * Return: None
1063*5113495bSYour Name  */
dp_tx_hal_ring_access_end(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl)1064*5113495bSYour Name static inline void dp_tx_hal_ring_access_end(struct dp_soc *soc,
1065*5113495bSYour Name 					     hal_ring_handle_t hal_ring_hdl)
1066*5113495bSYour Name {
1067*5113495bSYour Name 	hal_srng_access_end_unlocked(soc->hal_soc, hal_ring_hdl);
1068*5113495bSYour Name }
1069*5113495bSYour Name 
1070*5113495bSYour Name /**
1071*5113495bSYour Name  * dp_tx_hal_ring_access_end_reap() - hal_tx_ring access for data transmission
1072*5113495bSYour Name  * @soc: DP soc structure pointer
1073*5113495bSYour Name  * @hal_ring_hdl: HAL ring handle
1074*5113495bSYour Name  *
1075*5113495bSYour Name  * Return: None
1076*5113495bSYour Name  */
dp_tx_hal_ring_access_end_reap(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl)1077*5113495bSYour Name static inline void dp_tx_hal_ring_access_end_reap(struct dp_soc *soc,
1078*5113495bSYour Name 						  hal_ring_handle_t
1079*5113495bSYour Name 						  hal_ring_hdl)
1080*5113495bSYour Name {
1081*5113495bSYour Name }
1082*5113495bSYour Name 
1083*5113495bSYour Name #else
dp_tx_hal_ring_access_start(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl)1084*5113495bSYour Name static inline int dp_tx_hal_ring_access_start(struct dp_soc *soc,
1085*5113495bSYour Name 					      hal_ring_handle_t hal_ring_hdl)
1086*5113495bSYour Name {
1087*5113495bSYour Name 	return hal_srng_access_start(soc->hal_soc, hal_ring_hdl);
1088*5113495bSYour Name }
1089*5113495bSYour Name 
dp_tx_hal_ring_access_end(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl)1090*5113495bSYour Name static inline void dp_tx_hal_ring_access_end(struct dp_soc *soc,
1091*5113495bSYour Name 					     hal_ring_handle_t hal_ring_hdl)
1092*5113495bSYour Name {
1093*5113495bSYour Name 	hal_srng_access_end(soc->hal_soc, hal_ring_hdl);
1094*5113495bSYour Name }
1095*5113495bSYour Name 
dp_tx_hal_ring_access_end_reap(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl)1096*5113495bSYour Name static inline void dp_tx_hal_ring_access_end_reap(struct dp_soc *soc,
1097*5113495bSYour Name 						  hal_ring_handle_t
1098*5113495bSYour Name 						  hal_ring_hdl)
1099*5113495bSYour Name {
1100*5113495bSYour Name 	hal_srng_access_end_reap(soc->hal_soc, hal_ring_hdl);
1101*5113495bSYour Name }
1102*5113495bSYour Name #endif
1103*5113495bSYour Name 
1104*5113495bSYour Name #ifdef ATH_TX_PRI_OVERRIDE
1105*5113495bSYour Name #define DP_TX_TID_OVERRIDE(_msdu_info, _nbuf) \
1106*5113495bSYour Name 	((_msdu_info)->tid = qdf_nbuf_get_priority(_nbuf))
1107*5113495bSYour Name #else
1108*5113495bSYour Name #define DP_TX_TID_OVERRIDE(_msdu_info, _nbuf)
1109*5113495bSYour Name #endif
1110*5113495bSYour Name 
1111*5113495bSYour Name /* TODO TX_FEATURE_NOT_YET */
dp_tx_comp_process_exception(struct dp_tx_desc_s * tx_desc)1112*5113495bSYour Name static inline void dp_tx_comp_process_exception(struct dp_tx_desc_s *tx_desc)
1113*5113495bSYour Name {
1114*5113495bSYour Name 	return;
1115*5113495bSYour Name }
1116*5113495bSYour Name /* TODO TX_FEATURE_NOT_YET */
1117*5113495bSYour Name 
1118*5113495bSYour Name /**
1119*5113495bSYour Name  * dp_tx_desc_flush() - release resources associated
1120*5113495bSYour Name  *                      to TX Desc
1121*5113495bSYour Name  *
1122*5113495bSYour Name  * @pdev: Handle to DP pdev structure
1123*5113495bSYour Name  * @vdev: virtual device instance
1124*5113495bSYour Name  * NULL: no specific Vdev is required and check all allcated TX desc
1125*5113495bSYour Name  * on this pdev.
1126*5113495bSYour Name  * Non-NULL: only check the allocated TX Desc associated to this Vdev.
1127*5113495bSYour Name  *
1128*5113495bSYour Name  * @force_free:
1129*5113495bSYour Name  * true: flush the TX desc.
1130*5113495bSYour Name  * false: only reset the Vdev in each allocated TX desc
1131*5113495bSYour Name  * that associated to current Vdev.
1132*5113495bSYour Name  *
1133*5113495bSYour Name  * This function will go through the TX desc pool to flush
1134*5113495bSYour Name  * the outstanding TX data or reset Vdev to NULL in associated TX
1135*5113495bSYour Name  * Desc.
1136*5113495bSYour Name  */
1137*5113495bSYour Name void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
1138*5113495bSYour Name 		      bool force_free);
1139*5113495bSYour Name 
1140*5113495bSYour Name /**
1141*5113495bSYour Name  * dp_tx_vdev_attach() - attach vdev to dp tx
1142*5113495bSYour Name  * @vdev: virtual device instance
1143*5113495bSYour Name  *
1144*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: success
1145*5113495bSYour Name  *         QDF_STATUS_E_RESOURCES: Error return
1146*5113495bSYour Name  */
1147*5113495bSYour Name QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev);
1148*5113495bSYour Name 
1149*5113495bSYour Name /**
1150*5113495bSYour Name  * dp_tx_vdev_detach() - detach vdev from dp tx
1151*5113495bSYour Name  * @vdev: virtual device instance
1152*5113495bSYour Name  *
1153*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: success
1154*5113495bSYour Name  *         QDF_STATUS_E_RESOURCES: Error return
1155*5113495bSYour Name  */
1156*5113495bSYour Name QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev);
1157*5113495bSYour Name 
1158*5113495bSYour Name /**
1159*5113495bSYour Name  * dp_tx_vdev_update_search_flags() - Update vdev flags as per opmode
1160*5113495bSYour Name  * @vdev: virtual device instance
1161*5113495bSYour Name  *
1162*5113495bSYour Name  * Return: void
1163*5113495bSYour Name  *
1164*5113495bSYour Name  */
1165*5113495bSYour Name void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev);
1166*5113495bSYour Name 
1167*5113495bSYour Name /**
1168*5113495bSYour Name  * dp_soc_tx_desc_sw_pools_alloc() - Allocate tx descriptor pool memory
1169*5113495bSYour Name  * @soc: core txrx main context
1170*5113495bSYour Name  *
1171*5113495bSYour Name  * This function allocates memory for following descriptor pools
1172*5113495bSYour Name  * 1. regular sw tx descriptor pools (static pools)
1173*5113495bSYour Name  * 2. TX extension descriptor pools (ME, RAW, TSO etc...)
1174*5113495bSYour Name  * 3. TSO descriptor pools
1175*5113495bSYour Name  *
1176*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: success
1177*5113495bSYour Name  *         QDF_STATUS_E_RESOURCES: Error return
1178*5113495bSYour Name  */
1179*5113495bSYour Name QDF_STATUS dp_soc_tx_desc_sw_pools_alloc(struct dp_soc *soc);
1180*5113495bSYour Name 
1181*5113495bSYour Name /**
1182*5113495bSYour Name  * dp_soc_tx_desc_sw_pools_init() - Initialise TX descriptor pools
1183*5113495bSYour Name  * @soc: core txrx main context
1184*5113495bSYour Name  *
1185*5113495bSYour Name  * This function initializes the following TX descriptor pools
1186*5113495bSYour Name  * 1. regular sw tx descriptor pools (static pools)
1187*5113495bSYour Name  * 2. TX extension descriptor pools (ME, RAW, TSO etc...)
1188*5113495bSYour Name  * 3. TSO descriptor pools
1189*5113495bSYour Name  *
1190*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: success
1191*5113495bSYour Name  *	   QDF_STATUS_E_RESOURCES: Error return
1192*5113495bSYour Name  */
1193*5113495bSYour Name QDF_STATUS dp_soc_tx_desc_sw_pools_init(struct dp_soc *soc);
1194*5113495bSYour Name 
1195*5113495bSYour Name /**
1196*5113495bSYour Name  * dp_soc_tx_desc_sw_pools_free() - free all TX descriptors
1197*5113495bSYour Name  * @soc: core txrx main context
1198*5113495bSYour Name  *
1199*5113495bSYour Name  * This function frees all tx related descriptors as below
1200*5113495bSYour Name  * 1. Regular TX descriptors (static pools)
1201*5113495bSYour Name  * 2. extension TX descriptors (used for ME, RAW, TSO etc...)
1202*5113495bSYour Name  * 3. TSO descriptors
1203*5113495bSYour Name  *
1204*5113495bSYour Name  */
1205*5113495bSYour Name void dp_soc_tx_desc_sw_pools_free(struct dp_soc *soc);
1206*5113495bSYour Name 
1207*5113495bSYour Name /**
1208*5113495bSYour Name  * dp_soc_tx_desc_sw_pools_deinit() - de-initialize all TX descriptors
1209*5113495bSYour Name  * @soc: core txrx main context
1210*5113495bSYour Name  *
1211*5113495bSYour Name  * This function de-initializes all tx related descriptors as below
1212*5113495bSYour Name  * 1. Regular TX descriptors (static pools)
1213*5113495bSYour Name  * 2. extension TX descriptors (used for ME, RAW, TSO etc...)
1214*5113495bSYour Name  * 3. TSO descriptors
1215*5113495bSYour Name  *
1216*5113495bSYour Name  */
1217*5113495bSYour Name void dp_soc_tx_desc_sw_pools_deinit(struct dp_soc *soc);
1218*5113495bSYour Name 
1219*5113495bSYour Name #ifndef WLAN_SOFTUMAC_SUPPORT
1220*5113495bSYour Name /**
1221*5113495bSYour Name  * dp_handle_wbm_internal_error() - handles wbm_internal_error case
1222*5113495bSYour Name  * @soc: core DP main context
1223*5113495bSYour Name  * @hal_desc: hal descriptor
1224*5113495bSYour Name  * @buf_type: indicates if the buffer is of type link disc or msdu
1225*5113495bSYour Name  *
1226*5113495bSYour Name  * wbm_internal_error is seen in following scenarios :
1227*5113495bSYour Name  *
1228*5113495bSYour Name  * 1.  Null pointers detected in WBM_RELEASE_RING descriptors
1229*5113495bSYour Name  * 2.  Null pointers detected during delinking process
1230*5113495bSYour Name  *
1231*5113495bSYour Name  * Some null pointer cases:
1232*5113495bSYour Name  *
1233*5113495bSYour Name  * a. MSDU buffer pointer is NULL
1234*5113495bSYour Name  * b. Next_MSDU_Link_Desc pointer is NULL, with no last msdu flag
1235*5113495bSYour Name  * c. MSDU buffer pointer is NULL or Next_Link_Desc pointer is NULL
1236*5113495bSYour Name  *
1237*5113495bSYour Name  * Return: None
1238*5113495bSYour Name  */
1239*5113495bSYour Name void
1240*5113495bSYour Name dp_handle_wbm_internal_error(struct dp_soc *soc, void *hal_desc,
1241*5113495bSYour Name 			     uint32_t buf_type);
1242*5113495bSYour Name #endif
1243*5113495bSYour Name #else /* QCA_HOST_MODE_WIFI_DISABLED */
1244*5113495bSYour Name 
1245*5113495bSYour Name static inline
dp_soc_tx_desc_sw_pools_alloc(struct dp_soc * soc)1246*5113495bSYour Name QDF_STATUS dp_soc_tx_desc_sw_pools_alloc(struct dp_soc *soc)
1247*5113495bSYour Name {
1248*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1249*5113495bSYour Name }
1250*5113495bSYour Name 
1251*5113495bSYour Name static inline
dp_soc_tx_desc_sw_pools_init(struct dp_soc * soc)1252*5113495bSYour Name QDF_STATUS dp_soc_tx_desc_sw_pools_init(struct dp_soc *soc)
1253*5113495bSYour Name {
1254*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1255*5113495bSYour Name }
1256*5113495bSYour Name 
dp_soc_tx_desc_sw_pools_free(struct dp_soc * soc)1257*5113495bSYour Name static inline void dp_soc_tx_desc_sw_pools_free(struct dp_soc *soc)
1258*5113495bSYour Name {
1259*5113495bSYour Name }
1260*5113495bSYour Name 
dp_soc_tx_desc_sw_pools_deinit(struct dp_soc * soc)1261*5113495bSYour Name static inline void dp_soc_tx_desc_sw_pools_deinit(struct dp_soc *soc)
1262*5113495bSYour Name {
1263*5113495bSYour Name }
1264*5113495bSYour Name 
1265*5113495bSYour Name static inline
dp_tx_desc_flush(struct dp_pdev * pdev,struct dp_vdev * vdev,bool force_free)1266*5113495bSYour Name void dp_tx_desc_flush(struct dp_pdev *pdev, struct dp_vdev *vdev,
1267*5113495bSYour Name 		      bool force_free)
1268*5113495bSYour Name {
1269*5113495bSYour Name }
1270*5113495bSYour Name 
dp_tx_vdev_attach(struct dp_vdev * vdev)1271*5113495bSYour Name static inline QDF_STATUS dp_tx_vdev_attach(struct dp_vdev *vdev)
1272*5113495bSYour Name {
1273*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1274*5113495bSYour Name }
1275*5113495bSYour Name 
dp_tx_vdev_detach(struct dp_vdev * vdev)1276*5113495bSYour Name static inline QDF_STATUS dp_tx_vdev_detach(struct dp_vdev *vdev)
1277*5113495bSYour Name {
1278*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1279*5113495bSYour Name }
1280*5113495bSYour Name 
dp_tx_vdev_update_search_flags(struct dp_vdev * vdev)1281*5113495bSYour Name static inline void dp_tx_vdev_update_search_flags(struct dp_vdev *vdev)
1282*5113495bSYour Name {
1283*5113495bSYour Name }
1284*5113495bSYour Name 
1285*5113495bSYour Name #endif /* QCA_HOST_MODE_WIFI_DISABLED */
1286*5113495bSYour Name 
1287*5113495bSYour Name #if defined(QCA_SUPPORT_LATENCY_CAPTURE) || \
1288*5113495bSYour Name 	defined(QCA_TX_CAPTURE_SUPPORT) || \
1289*5113495bSYour Name 	defined(QCA_MCOPY_SUPPORT)
1290*5113495bSYour Name #ifdef FEATURE_PERPKT_INFO
1291*5113495bSYour Name 
1292*5113495bSYour Name /**
1293*5113495bSYour Name  * dp_get_completion_indication_for_stack() - send completion to stack
1294*5113495bSYour Name  * @soc : dp_soc handle
1295*5113495bSYour Name  * @pdev: dp_pdev handle
1296*5113495bSYour Name  * @txrx_peer: dp peer handle
1297*5113495bSYour Name  * @ts: transmit completion status structure
1298*5113495bSYour Name  * @netbuf: Buffer pointer for free
1299*5113495bSYour Name  * @time_latency:
1300*5113495bSYour Name  *
1301*5113495bSYour Name  * This function is used for indication whether buffer needs to be
1302*5113495bSYour Name  * sent to stack for freeing or not
1303*5113495bSYour Name  *
1304*5113495bSYour Name  * Return: QDF_STATUS
1305*5113495bSYour Name  */
1306*5113495bSYour Name QDF_STATUS
1307*5113495bSYour Name dp_get_completion_indication_for_stack(struct dp_soc *soc,
1308*5113495bSYour Name 				       struct dp_pdev *pdev,
1309*5113495bSYour Name 				       struct dp_txrx_peer *txrx_peer,
1310*5113495bSYour Name 				       struct hal_tx_completion_status *ts,
1311*5113495bSYour Name 				       qdf_nbuf_t netbuf,
1312*5113495bSYour Name 				       uint64_t time_latency);
1313*5113495bSYour Name 
1314*5113495bSYour Name /**
1315*5113495bSYour Name  * dp_send_completion_to_stack() - send completion to stack
1316*5113495bSYour Name  * @soc :  dp_soc handle
1317*5113495bSYour Name  * @pdev:  dp_pdev handle
1318*5113495bSYour Name  * @peer_id: peer_id of the peer for which completion came
1319*5113495bSYour Name  * @ppdu_id: ppdu_id
1320*5113495bSYour Name  * @netbuf: Buffer pointer for free
1321*5113495bSYour Name  *
1322*5113495bSYour Name  * This function is used to send completion to stack
1323*5113495bSYour Name  * to free buffer
1324*5113495bSYour Name  *
1325*5113495bSYour Name  * Return: QDF_STATUS
1326*5113495bSYour Name  */
1327*5113495bSYour Name void dp_send_completion_to_stack(struct dp_soc *soc,  struct dp_pdev *pdev,
1328*5113495bSYour Name 			    uint16_t peer_id, uint32_t ppdu_id,
1329*5113495bSYour Name 			    qdf_nbuf_t netbuf);
1330*5113495bSYour Name #endif
1331*5113495bSYour Name #else
1332*5113495bSYour Name static inline
dp_get_completion_indication_for_stack(struct dp_soc * soc,struct dp_pdev * pdev,struct dp_txrx_peer * peer,struct hal_tx_completion_status * ts,qdf_nbuf_t netbuf,uint64_t time_latency)1333*5113495bSYour Name QDF_STATUS dp_get_completion_indication_for_stack(struct dp_soc *soc,
1334*5113495bSYour Name 				       struct dp_pdev *pdev,
1335*5113495bSYour Name 				       struct dp_txrx_peer *peer,
1336*5113495bSYour Name 				       struct hal_tx_completion_status *ts,
1337*5113495bSYour Name 				       qdf_nbuf_t netbuf,
1338*5113495bSYour Name 				       uint64_t time_latency)
1339*5113495bSYour Name {
1340*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
1341*5113495bSYour Name }
1342*5113495bSYour Name 
1343*5113495bSYour Name static inline
dp_send_completion_to_stack(struct dp_soc * soc,struct dp_pdev * pdev,uint16_t peer_id,uint32_t ppdu_id,qdf_nbuf_t netbuf)1344*5113495bSYour Name void dp_send_completion_to_stack(struct dp_soc *soc,  struct dp_pdev *pdev,
1345*5113495bSYour Name 			    uint16_t peer_id, uint32_t ppdu_id,
1346*5113495bSYour Name 			    qdf_nbuf_t netbuf)
1347*5113495bSYour Name {
1348*5113495bSYour Name }
1349*5113495bSYour Name #endif
1350*5113495bSYour Name 
1351*5113495bSYour Name #ifdef WLAN_FEATURE_PKT_CAPTURE_V2
1352*5113495bSYour Name /**
1353*5113495bSYour Name  * dp_send_completion_to_pkt_capture() - send tx completion to packet capture
1354*5113495bSYour Name  * @soc: dp_soc handle
1355*5113495bSYour Name  * @desc: Tx Descriptor
1356*5113495bSYour Name  * @ts: HAL Tx completion descriptor contents
1357*5113495bSYour Name  *
1358*5113495bSYour Name  * This function is used to send tx completion to packet capture
1359*5113495bSYour Name  */
1360*5113495bSYour Name 
1361*5113495bSYour Name void dp_send_completion_to_pkt_capture(struct dp_soc *soc,
1362*5113495bSYour Name 				       struct dp_tx_desc_s *desc,
1363*5113495bSYour Name 				       struct hal_tx_completion_status *ts);
1364*5113495bSYour Name #else
1365*5113495bSYour Name static inline void
dp_send_completion_to_pkt_capture(struct dp_soc * soc,struct dp_tx_desc_s * desc,struct hal_tx_completion_status * ts)1366*5113495bSYour Name dp_send_completion_to_pkt_capture(struct dp_soc *soc,
1367*5113495bSYour Name 				  struct dp_tx_desc_s *desc,
1368*5113495bSYour Name 				  struct hal_tx_completion_status *ts)
1369*5113495bSYour Name {
1370*5113495bSYour Name }
1371*5113495bSYour Name #endif
1372*5113495bSYour Name 
1373*5113495bSYour Name #ifndef QCA_HOST_MODE_WIFI_DISABLED
1374*5113495bSYour Name #ifdef WLAN_DP_FEATURE_SW_LATENCY_MGR
1375*5113495bSYour Name /**
1376*5113495bSYour Name  * dp_tx_update_stats() - Update soc level tx stats
1377*5113495bSYour Name  * @soc: DP soc handle
1378*5113495bSYour Name  * @tx_desc: TX descriptor reference
1379*5113495bSYour Name  * @ring_id: TCL ring id
1380*5113495bSYour Name  *
1381*5113495bSYour Name  * Return: none
1382*5113495bSYour Name  */
1383*5113495bSYour Name void dp_tx_update_stats(struct dp_soc *soc,
1384*5113495bSYour Name 			struct dp_tx_desc_s *tx_desc,
1385*5113495bSYour Name 			uint8_t ring_id);
1386*5113495bSYour Name 
1387*5113495bSYour Name /**
1388*5113495bSYour Name  * dp_tx_attempt_coalescing() - Check and attempt TCL register write coalescing
1389*5113495bSYour Name  * @soc: Datapath soc handle
1390*5113495bSYour Name  * @vdev: DP vdev handle
1391*5113495bSYour Name  * @tx_desc: tx packet descriptor
1392*5113495bSYour Name  * @tid: TID for pkt transmission
1393*5113495bSYour Name  * @msdu_info: MSDU info of tx packet
1394*5113495bSYour Name  * @ring_id: TCL ring id
1395*5113495bSYour Name  *
1396*5113495bSYour Name  * Return: 1, if coalescing is to be done
1397*5113495bSYour Name  *	    0, if coalescing is not to be done
1398*5113495bSYour Name  */
1399*5113495bSYour Name int
1400*5113495bSYour Name dp_tx_attempt_coalescing(struct dp_soc *soc, struct dp_vdev *vdev,
1401*5113495bSYour Name 			 struct dp_tx_desc_s *tx_desc,
1402*5113495bSYour Name 			 uint8_t tid,
1403*5113495bSYour Name 			 struct dp_tx_msdu_info_s *msdu_info,
1404*5113495bSYour Name 			 uint8_t ring_id);
1405*5113495bSYour Name 
1406*5113495bSYour Name /**
1407*5113495bSYour Name  * dp_tx_ring_access_end() - HAL ring access end for data transmission
1408*5113495bSYour Name  * @soc: Datapath soc handle
1409*5113495bSYour Name  * @hal_ring_hdl: HAL ring handle
1410*5113495bSYour Name  * @coalesce: Coalesce the current write or not
1411*5113495bSYour Name  *
1412*5113495bSYour Name  * Return: none
1413*5113495bSYour Name  */
1414*5113495bSYour Name void
1415*5113495bSYour Name dp_tx_ring_access_end(struct dp_soc *soc, hal_ring_handle_t hal_ring_hdl,
1416*5113495bSYour Name 		      int coalesce);
1417*5113495bSYour Name #else
1418*5113495bSYour Name /**
1419*5113495bSYour Name  * dp_tx_update_stats() - Update soc level tx stats
1420*5113495bSYour Name  * @soc: DP soc handle
1421*5113495bSYour Name  * @tx_desc: TX descriptor reference
1422*5113495bSYour Name  * @ring_id: TCL ring id
1423*5113495bSYour Name  *
1424*5113495bSYour Name  * Return: none
1425*5113495bSYour Name  */
dp_tx_update_stats(struct dp_soc * soc,struct dp_tx_desc_s * tx_desc,uint8_t ring_id)1426*5113495bSYour Name static inline void dp_tx_update_stats(struct dp_soc *soc,
1427*5113495bSYour Name 				      struct dp_tx_desc_s *tx_desc,
1428*5113495bSYour Name 				      uint8_t ring_id){ }
1429*5113495bSYour Name 
1430*5113495bSYour Name static inline void
dp_tx_ring_access_end(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl,int coalesce)1431*5113495bSYour Name dp_tx_ring_access_end(struct dp_soc *soc, hal_ring_handle_t hal_ring_hdl,
1432*5113495bSYour Name 		      int coalesce)
1433*5113495bSYour Name {
1434*5113495bSYour Name 	dp_tx_hal_ring_access_end(soc, hal_ring_hdl);
1435*5113495bSYour Name }
1436*5113495bSYour Name 
1437*5113495bSYour Name static inline int
dp_tx_attempt_coalescing(struct dp_soc * soc,struct dp_vdev * vdev,struct dp_tx_desc_s * tx_desc,uint8_t tid,struct dp_tx_msdu_info_s * msdu_info,uint8_t ring_id)1438*5113495bSYour Name dp_tx_attempt_coalescing(struct dp_soc *soc, struct dp_vdev *vdev,
1439*5113495bSYour Name 			 struct dp_tx_desc_s *tx_desc,
1440*5113495bSYour Name 			 uint8_t tid,
1441*5113495bSYour Name 			 struct dp_tx_msdu_info_s *msdu_info,
1442*5113495bSYour Name 			 uint8_t ring_id)
1443*5113495bSYour Name {
1444*5113495bSYour Name 	return 0;
1445*5113495bSYour Name }
1446*5113495bSYour Name 
1447*5113495bSYour Name #endif /* WLAN_DP_FEATURE_SW_LATENCY_MGR */
1448*5113495bSYour Name 
1449*5113495bSYour Name #ifdef FEATURE_RUNTIME_PM
1450*5113495bSYour Name /**
1451*5113495bSYour Name  * dp_set_rtpm_tput_policy_requirement() - Update RTPM throughput policy
1452*5113495bSYour Name  * @soc_hdl: DP soc handle
1453*5113495bSYour Name  * @is_high_tput: flag to indicate whether throughput is high
1454*5113495bSYour Name  *
1455*5113495bSYour Name  * Return: none
1456*5113495bSYour Name  */
1457*5113495bSYour Name static inline
dp_set_rtpm_tput_policy_requirement(struct cdp_soc_t * soc_hdl,bool is_high_tput)1458*5113495bSYour Name void dp_set_rtpm_tput_policy_requirement(struct cdp_soc_t *soc_hdl,
1459*5113495bSYour Name 					 bool is_high_tput)
1460*5113495bSYour Name {
1461*5113495bSYour Name 	struct dp_soc *soc = cdp_soc_t_to_dp_soc(soc_hdl);
1462*5113495bSYour Name 
1463*5113495bSYour Name 	qdf_atomic_set(&soc->rtpm_high_tput_flag, is_high_tput);
1464*5113495bSYour Name }
1465*5113495bSYour Name 
1466*5113495bSYour Name /**
1467*5113495bSYour Name  * dp_tx_ring_access_end_wrapper() - Wrapper for ring access end
1468*5113495bSYour Name  * @soc: Datapath soc handle
1469*5113495bSYour Name  * @hal_ring_hdl: HAL ring handle
1470*5113495bSYour Name  * @coalesce: Coalesce the current write or not
1471*5113495bSYour Name  *
1472*5113495bSYour Name  * Feature-specific wrapper for HAL ring access end for data
1473*5113495bSYour Name  * transmission
1474*5113495bSYour Name  *
1475*5113495bSYour Name  * Return: none
1476*5113495bSYour Name  */
1477*5113495bSYour Name void
1478*5113495bSYour Name dp_tx_ring_access_end_wrapper(struct dp_soc *soc,
1479*5113495bSYour Name 			      hal_ring_handle_t hal_ring_hdl,
1480*5113495bSYour Name 			      int coalesce);
1481*5113495bSYour Name #else
1482*5113495bSYour Name #ifdef DP_POWER_SAVE
1483*5113495bSYour Name void
1484*5113495bSYour Name dp_tx_ring_access_end_wrapper(struct dp_soc *soc,
1485*5113495bSYour Name 			      hal_ring_handle_t hal_ring_hdl,
1486*5113495bSYour Name 			      int coalesce);
1487*5113495bSYour Name #else
1488*5113495bSYour Name static inline void
dp_tx_ring_access_end_wrapper(struct dp_soc * soc,hal_ring_handle_t hal_ring_hdl,int coalesce)1489*5113495bSYour Name dp_tx_ring_access_end_wrapper(struct dp_soc *soc,
1490*5113495bSYour Name 			      hal_ring_handle_t hal_ring_hdl,
1491*5113495bSYour Name 			      int coalesce)
1492*5113495bSYour Name {
1493*5113495bSYour Name 	dp_tx_ring_access_end(soc, hal_ring_hdl, coalesce);
1494*5113495bSYour Name }
1495*5113495bSYour Name #endif
1496*5113495bSYour Name 
1497*5113495bSYour Name static inline void
dp_set_rtpm_tput_policy_requirement(struct cdp_soc_t * soc_hdl,bool is_high_tput)1498*5113495bSYour Name dp_set_rtpm_tput_policy_requirement(struct cdp_soc_t *soc_hdl,
1499*5113495bSYour Name 				    bool is_high_tput)
1500*5113495bSYour Name { }
1501*5113495bSYour Name #endif
1502*5113495bSYour Name #endif /* QCA_HOST_MODE_WIFI_DISABLED */
1503*5113495bSYour Name 
1504*5113495bSYour Name #ifdef DP_TX_HW_DESC_HISTORY
1505*5113495bSYour Name static inline void
dp_tx_hw_desc_update_evt(uint8_t * hal_tx_desc_cached,hal_ring_handle_t hal_ring_hdl,struct dp_soc * soc,uint8_t ring_id)1506*5113495bSYour Name dp_tx_hw_desc_update_evt(uint8_t *hal_tx_desc_cached,
1507*5113495bSYour Name 			 hal_ring_handle_t hal_ring_hdl,
1508*5113495bSYour Name 			 struct dp_soc *soc, uint8_t ring_id)
1509*5113495bSYour Name {
1510*5113495bSYour Name 	struct dp_tx_hw_desc_history *tx_hw_desc_history =
1511*5113495bSYour Name 						&soc->tx_hw_desc_history;
1512*5113495bSYour Name 	struct dp_tx_hw_desc_evt *evt;
1513*5113495bSYour Name 	uint32_t idx = 0;
1514*5113495bSYour Name 	uint16_t slot = 0;
1515*5113495bSYour Name 
1516*5113495bSYour Name 	if (!tx_hw_desc_history->allocated)
1517*5113495bSYour Name 		return;
1518*5113495bSYour Name 
1519*5113495bSYour Name 	dp_get_frag_hist_next_atomic_idx(&tx_hw_desc_history->index, &idx,
1520*5113495bSYour Name 					 &slot,
1521*5113495bSYour Name 					 DP_TX_HW_DESC_HIST_SLOT_SHIFT,
1522*5113495bSYour Name 					 DP_TX_HW_DESC_HIST_PER_SLOT_MAX,
1523*5113495bSYour Name 					 DP_TX_HW_DESC_HIST_MAX);
1524*5113495bSYour Name 
1525*5113495bSYour Name 	evt = &tx_hw_desc_history->entry[slot][idx];
1526*5113495bSYour Name 	qdf_mem_copy(evt->tcl_desc, hal_tx_desc_cached, HAL_TX_DESC_LEN_BYTES);
1527*5113495bSYour Name 	evt->posted = qdf_get_log_timestamp();
1528*5113495bSYour Name 	evt->tcl_ring_id = ring_id;
1529*5113495bSYour Name 	hal_get_sw_hptp(soc->hal_soc, hal_ring_hdl, &evt->tp, &evt->hp);
1530*5113495bSYour Name }
1531*5113495bSYour Name #else
1532*5113495bSYour Name static inline void
dp_tx_hw_desc_update_evt(uint8_t * hal_tx_desc_cached,hal_ring_handle_t hal_ring_hdl,struct dp_soc * soc,uint8_t ring_id)1533*5113495bSYour Name dp_tx_hw_desc_update_evt(uint8_t *hal_tx_desc_cached,
1534*5113495bSYour Name 			 hal_ring_handle_t hal_ring_hdl,
1535*5113495bSYour Name 			 struct dp_soc *soc, uint8_t ring_id)
1536*5113495bSYour Name {
1537*5113495bSYour Name }
1538*5113495bSYour Name #endif
1539*5113495bSYour Name 
1540*5113495bSYour Name #if defined(WLAN_FEATURE_TSF_AUTO_REPORT) || defined(WLAN_CONFIG_TX_DELAY)
1541*5113495bSYour Name /**
1542*5113495bSYour Name  * dp_tx_compute_hw_delay_us() - Compute hardware Tx completion delay
1543*5113495bSYour Name  * @ts: Tx completion status
1544*5113495bSYour Name  * @delta_tsf: Difference between TSF clock and qtimer
1545*5113495bSYour Name  * @delay_us: Delay in microseconds
1546*5113495bSYour Name  *
1547*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS   : Success
1548*5113495bSYour Name  *         QDF_STATUS_E_INVAL   : Tx completion status is invalid or
1549*5113495bSYour Name  *                                delay_us is NULL
1550*5113495bSYour Name  *         QDF_STATUS_E_FAILURE : Error in delay calculation
1551*5113495bSYour Name  */
1552*5113495bSYour Name QDF_STATUS
1553*5113495bSYour Name dp_tx_compute_hw_delay_us(struct hal_tx_completion_status *ts,
1554*5113495bSYour Name 			  uint32_t delta_tsf,
1555*5113495bSYour Name 			  uint32_t *delay_us);
1556*5113495bSYour Name 
1557*5113495bSYour Name /**
1558*5113495bSYour Name  * dp_set_delta_tsf() - Set delta_tsf to dp_soc structure
1559*5113495bSYour Name  * @soc_hdl: cdp soc pointer
1560*5113495bSYour Name  * @vdev_id: vdev id
1561*5113495bSYour Name  * @delta_tsf: difference between TSF clock and qtimer
1562*5113495bSYour Name  *
1563*5113495bSYour Name  * Return: None
1564*5113495bSYour Name  */
1565*5113495bSYour Name void dp_set_delta_tsf(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
1566*5113495bSYour Name 		      uint32_t delta_tsf);
1567*5113495bSYour Name #endif
1568*5113495bSYour Name #ifdef WLAN_FEATURE_TSF_UPLINK_DELAY
1569*5113495bSYour Name /**
1570*5113495bSYour Name  * dp_set_tsf_ul_delay_report() - Enable or disable reporting uplink delay
1571*5113495bSYour Name  * @soc_hdl: cdp soc pointer
1572*5113495bSYour Name  * @vdev_id: vdev id
1573*5113495bSYour Name  * @enable: true to enable and false to disable
1574*5113495bSYour Name  *
1575*5113495bSYour Name  * Return: QDF_STATUS
1576*5113495bSYour Name  */
1577*5113495bSYour Name QDF_STATUS dp_set_tsf_ul_delay_report(struct cdp_soc_t *soc_hdl,
1578*5113495bSYour Name 				      uint8_t vdev_id, bool enable);
1579*5113495bSYour Name 
1580*5113495bSYour Name /**
1581*5113495bSYour Name  * dp_get_uplink_delay() - Get uplink delay value
1582*5113495bSYour Name  * @soc_hdl: cdp soc pointer
1583*5113495bSYour Name  * @vdev_id: vdev id
1584*5113495bSYour Name  * @val: pointer to save uplink delay value
1585*5113495bSYour Name  *
1586*5113495bSYour Name  * Return: QDF_STATUS
1587*5113495bSYour Name  */
1588*5113495bSYour Name QDF_STATUS dp_get_uplink_delay(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
1589*5113495bSYour Name 			       uint32_t *val);
1590*5113495bSYour Name #endif /* WLAN_FEATURE_TSF_UPLINK_TSF */
1591*5113495bSYour Name 
1592*5113495bSYour Name /**
1593*5113495bSYour Name  * dp_tx_pkt_tracepoints_enabled() - Get the state of tx pkt tracepoint
1594*5113495bSYour Name  *
1595*5113495bSYour Name  * Return: True if any tx pkt tracepoint is enabled else false
1596*5113495bSYour Name  */
1597*5113495bSYour Name static inline
dp_tx_pkt_tracepoints_enabled(void)1598*5113495bSYour Name bool dp_tx_pkt_tracepoints_enabled(void)
1599*5113495bSYour Name {
1600*5113495bSYour Name 	return (qdf_trace_dp_tx_comp_tcp_pkt_enabled() ||
1601*5113495bSYour Name 		qdf_trace_dp_tx_comp_udp_pkt_enabled() ||
1602*5113495bSYour Name 		qdf_trace_dp_tx_comp_pkt_enabled());
1603*5113495bSYour Name }
1604*5113495bSYour Name 
1605*5113495bSYour Name #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
1606*5113495bSYour Name static inline
dp_get_tx_desc_pool(struct dp_soc * soc,uint8_t pool_id)1607*5113495bSYour Name struct dp_tx_desc_pool_s *dp_get_tx_desc_pool(struct dp_soc *soc,
1608*5113495bSYour Name 					      uint8_t pool_id)
1609*5113495bSYour Name {
1610*5113495bSYour Name 	struct dp_global_context *dp_global = NULL;
1611*5113495bSYour Name 
1612*5113495bSYour Name 	dp_global = wlan_objmgr_get_global_ctx();
1613*5113495bSYour Name 	return dp_global->tx_desc[soc->arch_id][pool_id];
1614*5113495bSYour Name }
1615*5113495bSYour Name 
1616*5113495bSYour Name static inline
dp_get_spcl_tx_desc_pool(struct dp_soc * soc,uint8_t pool_id)1617*5113495bSYour Name struct dp_tx_desc_pool_s *dp_get_spcl_tx_desc_pool(struct dp_soc *soc,
1618*5113495bSYour Name 						   uint8_t pool_id)
1619*5113495bSYour Name {
1620*5113495bSYour Name 	struct dp_global_context *dp_global = NULL;
1621*5113495bSYour Name 
1622*5113495bSYour Name 	dp_global = wlan_objmgr_get_global_ctx();
1623*5113495bSYour Name 	return dp_global->spcl_tx_desc[soc->arch_id][pool_id];
1624*5113495bSYour Name }
1625*5113495bSYour Name #else
1626*5113495bSYour Name static inline
dp_get_tx_desc_pool(struct dp_soc * soc,uint8_t pool_id)1627*5113495bSYour Name struct dp_tx_desc_pool_s *dp_get_tx_desc_pool(struct dp_soc *soc,
1628*5113495bSYour Name 					      uint8_t pool_id)
1629*5113495bSYour Name {
1630*5113495bSYour Name 	return &soc->tx_desc[pool_id];
1631*5113495bSYour Name }
1632*5113495bSYour Name 
1633*5113495bSYour Name static inline
dp_get_spcl_tx_desc_pool(struct dp_soc * soc,uint8_t pool_id)1634*5113495bSYour Name struct dp_tx_desc_pool_s *dp_get_spcl_tx_desc_pool(struct dp_soc *soc,
1635*5113495bSYour Name 						   uint8_t pool_id)
1636*5113495bSYour Name {
1637*5113495bSYour Name 	return &soc->tx_desc[pool_id];
1638*5113495bSYour Name }
1639*5113495bSYour Name #endif
1640*5113495bSYour Name 
1641*5113495bSYour Name #ifdef DP_TX_TRACKING
1642*5113495bSYour Name /**
1643*5113495bSYour Name  * dp_tx_desc_set_timestamp() - set timestamp in tx descriptor
1644*5113495bSYour Name  * @tx_desc: tx descriptor
1645*5113495bSYour Name  *
1646*5113495bSYour Name  * Return: None
1647*5113495bSYour Name  */
1648*5113495bSYour Name static inline
dp_tx_desc_set_timestamp(struct dp_tx_desc_s * tx_desc)1649*5113495bSYour Name void dp_tx_desc_set_timestamp(struct dp_tx_desc_s *tx_desc)
1650*5113495bSYour Name {
1651*5113495bSYour Name 	tx_desc->timestamp_tick = qdf_system_ticks();
1652*5113495bSYour Name }
1653*5113495bSYour Name 
1654*5113495bSYour Name /**
1655*5113495bSYour Name  * dp_tx_desc_check_corruption() - Verify magic pattern in tx descriptor
1656*5113495bSYour Name  * @tx_desc: tx descriptor
1657*5113495bSYour Name  *
1658*5113495bSYour Name  * Check for corruption in tx descriptor, if magic pattern is not matching
1659*5113495bSYour Name  * trigger self recovery
1660*5113495bSYour Name  *
1661*5113495bSYour Name  * Return: none
1662*5113495bSYour Name  */
1663*5113495bSYour Name void dp_tx_desc_check_corruption(struct dp_tx_desc_s *tx_desc);
1664*5113495bSYour Name #else
1665*5113495bSYour Name static inline
dp_tx_desc_set_timestamp(struct dp_tx_desc_s * tx_desc)1666*5113495bSYour Name void dp_tx_desc_set_timestamp(struct dp_tx_desc_s *tx_desc)
1667*5113495bSYour Name {
1668*5113495bSYour Name }
1669*5113495bSYour Name 
1670*5113495bSYour Name static inline
dp_tx_desc_check_corruption(struct dp_tx_desc_s * tx_desc)1671*5113495bSYour Name void dp_tx_desc_check_corruption(struct dp_tx_desc_s *tx_desc)
1672*5113495bSYour Name {
1673*5113495bSYour Name }
1674*5113495bSYour Name #endif
1675*5113495bSYour Name 
1676*5113495bSYour Name #ifndef CONFIG_SAWF
dp_sawf_tag_valid_get(qdf_nbuf_t nbuf)1677*5113495bSYour Name static inline bool dp_sawf_tag_valid_get(qdf_nbuf_t nbuf)
1678*5113495bSYour Name {
1679*5113495bSYour Name 	return false;
1680*5113495bSYour Name }
1681*5113495bSYour Name #endif
1682*5113495bSYour Name 
1683*5113495bSYour Name #ifdef HW_TX_DELAY_STATS_ENABLE
1684*5113495bSYour Name /**
1685*5113495bSYour Name  * dp_tx_desc_set_ktimestamp() - set kernel timestamp in tx descriptor
1686*5113495bSYour Name  * @vdev: DP vdev handle
1687*5113495bSYour Name  * @tx_desc: tx descriptor
1688*5113495bSYour Name  *
1689*5113495bSYour Name  * Return: true when descriptor is timestamped, false otherwise
1690*5113495bSYour Name  */
1691*5113495bSYour Name static inline
dp_tx_desc_set_ktimestamp(struct dp_vdev * vdev,struct dp_tx_desc_s * tx_desc)1692*5113495bSYour Name bool dp_tx_desc_set_ktimestamp(struct dp_vdev *vdev,
1693*5113495bSYour Name 			       struct dp_tx_desc_s *tx_desc)
1694*5113495bSYour Name {
1695*5113495bSYour Name 	if (qdf_unlikely(vdev->pdev->delay_stats_flag) ||
1696*5113495bSYour Name 	    qdf_unlikely(vdev->pdev->soc->wlan_cfg_ctx->pext_stats_enabled) ||
1697*5113495bSYour Name 	    qdf_unlikely(dp_tx_pkt_tracepoints_enabled()) ||
1698*5113495bSYour Name 	    qdf_unlikely(vdev->pdev->soc->peerstats_enabled) ||
1699*5113495bSYour Name 	    qdf_unlikely(dp_is_vdev_tx_delay_stats_enabled(vdev)) ||
1700*5113495bSYour Name 	    qdf_unlikely(wlan_cfg_is_peer_jitter_stats_enabled(vdev->pdev->soc->wlan_cfg_ctx))) {
1701*5113495bSYour Name 		tx_desc->timestamp = qdf_ktime_real_get();
1702*5113495bSYour Name 		return true;
1703*5113495bSYour Name 	}
1704*5113495bSYour Name 	return false;
1705*5113495bSYour Name }
1706*5113495bSYour Name #else
1707*5113495bSYour Name static inline
dp_tx_desc_set_ktimestamp(struct dp_vdev * vdev,struct dp_tx_desc_s * tx_desc)1708*5113495bSYour Name bool dp_tx_desc_set_ktimestamp(struct dp_vdev *vdev,
1709*5113495bSYour Name 			       struct dp_tx_desc_s *tx_desc)
1710*5113495bSYour Name {
1711*5113495bSYour Name 	if (qdf_unlikely(vdev->pdev->delay_stats_flag) ||
1712*5113495bSYour Name 	    qdf_unlikely(vdev->pdev->soc->wlan_cfg_ctx->pext_stats_enabled) ||
1713*5113495bSYour Name 	    qdf_unlikely(dp_tx_pkt_tracepoints_enabled()) ||
1714*5113495bSYour Name 	    qdf_unlikely(vdev->pdev->soc->peerstats_enabled) ||
1715*5113495bSYour Name 	    qdf_unlikely(wlan_cfg_is_peer_jitter_stats_enabled(vdev->pdev->soc->wlan_cfg_ctx))) {
1716*5113495bSYour Name 		tx_desc->timestamp = qdf_ktime_real_get();
1717*5113495bSYour Name 		return true;
1718*5113495bSYour Name 	}
1719*5113495bSYour Name 	return false;
1720*5113495bSYour Name }
1721*5113495bSYour Name #endif
1722*5113495bSYour Name 
1723*5113495bSYour Name #ifdef CONFIG_DP_PKT_ADD_TIMESTAMP
1724*5113495bSYour Name /**
1725*5113495bSYour Name  * dp_pkt_add_timestamp() - add timestamp in data payload
1726*5113495bSYour Name  *
1727*5113495bSYour Name  * @vdev: dp vdev
1728*5113495bSYour Name  * @index: index to decide offset in payload
1729*5113495bSYour Name  * @time: timestamp to add in data payload
1730*5113495bSYour Name  * @nbuf: network buffer
1731*5113495bSYour Name  *
1732*5113495bSYour Name  * Return: none
1733*5113495bSYour Name  */
1734*5113495bSYour Name void dp_pkt_add_timestamp(struct dp_vdev *vdev,
1735*5113495bSYour Name 			  enum qdf_pkt_timestamp_index index, uint64_t time,
1736*5113495bSYour Name 			  qdf_nbuf_t nbuf);
1737*5113495bSYour Name /**
1738*5113495bSYour Name  * dp_pkt_get_timestamp() - get current system time
1739*5113495bSYour Name  *
1740*5113495bSYour Name  * @time: return current system time
1741*5113495bSYour Name  *
1742*5113495bSYour Name  * Return: none
1743*5113495bSYour Name  */
1744*5113495bSYour Name void dp_pkt_get_timestamp(uint64_t *time);
1745*5113495bSYour Name #else
1746*5113495bSYour Name #define dp_pkt_add_timestamp(vdev, index, time, nbuf)
1747*5113495bSYour Name 
1748*5113495bSYour Name static inline
dp_pkt_get_timestamp(uint64_t * time)1749*5113495bSYour Name void dp_pkt_get_timestamp(uint64_t *time)
1750*5113495bSYour Name {
1751*5113495bSYour Name }
1752*5113495bSYour Name #endif
1753*5113495bSYour Name 
1754*5113495bSYour Name #ifdef CONFIG_WLAN_SYSFS_MEM_STATS
1755*5113495bSYour Name /**
1756*5113495bSYour Name  * dp_update_tx_desc_stats - Update the increase or decrease in
1757*5113495bSYour Name  * outstanding tx desc count
1758*5113495bSYour Name  * values on pdev and soc
1759*5113495bSYour Name  * @pdev: DP pdev handle
1760*5113495bSYour Name  *
1761*5113495bSYour Name  * Return: void
1762*5113495bSYour Name  */
1763*5113495bSYour Name static inline void
dp_update_tx_desc_stats(struct dp_pdev * pdev)1764*5113495bSYour Name dp_update_tx_desc_stats(struct dp_pdev *pdev)
1765*5113495bSYour Name {
1766*5113495bSYour Name 	int32_t tx_descs_cnt =
1767*5113495bSYour Name 		qdf_atomic_read(&pdev->num_tx_outstanding);
1768*5113495bSYour Name 	if (pdev->tx_descs_max < tx_descs_cnt)
1769*5113495bSYour Name 		pdev->tx_descs_max = tx_descs_cnt;
1770*5113495bSYour Name 	qdf_mem_tx_desc_cnt_update(pdev->num_tx_outstanding,
1771*5113495bSYour Name 				   pdev->tx_descs_max);
1772*5113495bSYour Name }
1773*5113495bSYour Name 
1774*5113495bSYour Name #else /* CONFIG_WLAN_SYSFS_MEM_STATS */
1775*5113495bSYour Name 
1776*5113495bSYour Name static inline void
dp_update_tx_desc_stats(struct dp_pdev * pdev)1777*5113495bSYour Name dp_update_tx_desc_stats(struct dp_pdev *pdev)
1778*5113495bSYour Name {
1779*5113495bSYour Name }
1780*5113495bSYour Name #endif /* CONFIG_WLAN_SYSFS_MEM_STATS */
1781*5113495bSYour Name 
1782*5113495bSYour Name #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
1783*5113495bSYour Name /**
1784*5113495bSYour Name  * dp_tx_get_global_desc_in_use() - read global descriptors in usage
1785*5113495bSYour Name  * @dp_global: Datapath global context
1786*5113495bSYour Name  *
1787*5113495bSYour Name  * Return: global descriptors in use
1788*5113495bSYour Name  */
1789*5113495bSYour Name static inline int32_t
dp_tx_get_global_desc_in_use(struct dp_global_context * dp_global)1790*5113495bSYour Name dp_tx_get_global_desc_in_use(struct dp_global_context *dp_global)
1791*5113495bSYour Name {
1792*5113495bSYour Name 	return qdf_atomic_read(&dp_global->global_descriptor_in_use);
1793*5113495bSYour Name }
1794*5113495bSYour Name #endif
1795*5113495bSYour Name 
1796*5113495bSYour Name #ifdef QCA_TX_LIMIT_CHECK
is_spl_packet(qdf_nbuf_t nbuf)1797*5113495bSYour Name static inline bool is_spl_packet(qdf_nbuf_t nbuf)
1798*5113495bSYour Name {
1799*5113495bSYour Name 	if (qdf_nbuf_is_ipv4_eapol_pkt(nbuf))
1800*5113495bSYour Name 		return true;
1801*5113495bSYour Name 	return false;
1802*5113495bSYour Name }
1803*5113495bSYour Name 
1804*5113495bSYour Name #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
1805*5113495bSYour Name /**
1806*5113495bSYour Name  * dp_tx_limit_check - Check if allocated tx descriptors reached
1807*5113495bSYour Name  * global max reg limit and pdev max reg limit for regular packets. Also check
1808*5113495bSYour Name  * if the limit is reached for special packets.
1809*5113495bSYour Name  * @vdev: DP vdev handle
1810*5113495bSYour Name  * @nbuf: network buffer
1811*5113495bSYour Name  *
1812*5113495bSYour Name  * Return: true if allocated tx descriptors reached max limit for regular
1813*5113495bSYour Name  * packets and in case of special packets, if the limit is reached max
1814*5113495bSYour Name  * configured vale for the soc/pdev, else false
1815*5113495bSYour Name  */
1816*5113495bSYour Name static inline bool
dp_tx_limit_check(struct dp_vdev * vdev,qdf_nbuf_t nbuf)1817*5113495bSYour Name dp_tx_limit_check(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
1818*5113495bSYour Name {
1819*5113495bSYour Name 	return false;
1820*5113495bSYour Name }
1821*5113495bSYour Name 
1822*5113495bSYour Name static inline bool
__dp_tx_limit_check(struct dp_soc * soc)1823*5113495bSYour Name __dp_tx_limit_check(struct dp_soc *soc)
1824*5113495bSYour Name {
1825*5113495bSYour Name 	return false;
1826*5113495bSYour Name }
1827*5113495bSYour Name #else
1828*5113495bSYour Name /**
1829*5113495bSYour Name  * is_dp_spl_tx_limit_reached - Check if the packet is a special packet to allow
1830*5113495bSYour Name  * allocation if allocated tx descriptors are within the soc max limit
1831*5113495bSYour Name  * and pdev max limit.
1832*5113495bSYour Name  * @vdev: DP vdev handle
1833*5113495bSYour Name  * @nbuf: network buffer
1834*5113495bSYour Name  *
1835*5113495bSYour Name  * Return: true if allocated tx descriptors reached max configured value, else
1836*5113495bSYour Name  * false
1837*5113495bSYour Name  */
1838*5113495bSYour Name static inline bool
is_dp_spl_tx_limit_reached(struct dp_vdev * vdev,qdf_nbuf_t nbuf)1839*5113495bSYour Name is_dp_spl_tx_limit_reached(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
1840*5113495bSYour Name {
1841*5113495bSYour Name 	struct dp_pdev *pdev = vdev->pdev;
1842*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
1843*5113495bSYour Name 
1844*5113495bSYour Name 	if (is_spl_packet(nbuf)) {
1845*5113495bSYour Name 		if (qdf_atomic_read(&soc->num_tx_outstanding) >=
1846*5113495bSYour Name 				soc->num_tx_allowed)
1847*5113495bSYour Name 			return true;
1848*5113495bSYour Name 
1849*5113495bSYour Name 		if (qdf_atomic_read(&pdev->num_tx_outstanding) >=
1850*5113495bSYour Name 			pdev->num_tx_allowed)
1851*5113495bSYour Name 			return true;
1852*5113495bSYour Name 
1853*5113495bSYour Name 		return false;
1854*5113495bSYour Name 	}
1855*5113495bSYour Name 
1856*5113495bSYour Name 	return true;
1857*5113495bSYour Name }
1858*5113495bSYour Name 
1859*5113495bSYour Name static inline bool
__dp_tx_limit_check(struct dp_soc * soc)1860*5113495bSYour Name __dp_tx_limit_check(struct dp_soc *soc)
1861*5113495bSYour Name {
1862*5113495bSYour Name 	return (qdf_atomic_read(&soc->num_tx_outstanding) >=
1863*5113495bSYour Name 					soc->num_reg_tx_allowed);
1864*5113495bSYour Name }
1865*5113495bSYour Name 
1866*5113495bSYour Name /**
1867*5113495bSYour Name  * dp_tx_limit_check - Check if allocated tx descriptors reached
1868*5113495bSYour Name  * soc max reg limit and pdev max reg limit for regular packets. Also check if
1869*5113495bSYour Name  * the limit is reached for special packets.
1870*5113495bSYour Name  * @vdev: DP vdev handle
1871*5113495bSYour Name  * @nbuf: network buffer
1872*5113495bSYour Name  *
1873*5113495bSYour Name  * Return: true if allocated tx descriptors reached max limit for regular
1874*5113495bSYour Name  * packets and in case of special packets, if the limit is reached max
1875*5113495bSYour Name  * configured vale for the soc/pdev, else false
1876*5113495bSYour Name  */
1877*5113495bSYour Name static inline bool
dp_tx_limit_check(struct dp_vdev * vdev,qdf_nbuf_t nbuf)1878*5113495bSYour Name dp_tx_limit_check(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
1879*5113495bSYour Name {
1880*5113495bSYour Name 	struct dp_pdev *pdev = vdev->pdev;
1881*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
1882*5113495bSYour Name 	uint8_t xmit_type = qdf_nbuf_get_vdev_xmit_type(nbuf);
1883*5113495bSYour Name 
1884*5113495bSYour Name 	if (__dp_tx_limit_check(soc)) {
1885*5113495bSYour Name 		if (is_dp_spl_tx_limit_reached(vdev, nbuf)) {
1886*5113495bSYour Name 			dp_tx_info("queued packets are more than max tx, drop the frame");
1887*5113495bSYour Name 			DP_STATS_INC(vdev,
1888*5113495bSYour Name 				     tx_i[xmit_type].dropped.desc_na.num, 1);
1889*5113495bSYour Name 			return true;
1890*5113495bSYour Name 		}
1891*5113495bSYour Name 	}
1892*5113495bSYour Name 
1893*5113495bSYour Name 	if (qdf_atomic_read(&pdev->num_tx_outstanding) >=
1894*5113495bSYour Name 			pdev->num_reg_tx_allowed) {
1895*5113495bSYour Name 		if (is_dp_spl_tx_limit_reached(vdev, nbuf)) {
1896*5113495bSYour Name 			dp_tx_info("queued packets are more than max tx, drop the frame");
1897*5113495bSYour Name 			DP_STATS_INC(vdev,
1898*5113495bSYour Name 				     tx_i[xmit_type].dropped.desc_na.num, 1);
1899*5113495bSYour Name 			DP_STATS_INC(vdev,
1900*5113495bSYour Name 				     tx_i[xmit_type].dropped.desc_na_exc_outstand.num,
1901*5113495bSYour Name 				     1);
1902*5113495bSYour Name 			return true;
1903*5113495bSYour Name 		}
1904*5113495bSYour Name 	}
1905*5113495bSYour Name 	return false;
1906*5113495bSYour Name }
1907*5113495bSYour Name #endif
1908*5113495bSYour Name 
1909*5113495bSYour Name /**
1910*5113495bSYour Name  * dp_tx_exception_limit_check - Check if allocated tx exception descriptors
1911*5113495bSYour Name  * reached soc max limit
1912*5113495bSYour Name  * @vdev: DP vdev handle
1913*5113495bSYour Name  * @xmit_type: xmit type of packet - MLD/Link
1914*5113495bSYour Name  *
1915*5113495bSYour Name  * Return: true if allocated tx descriptors reached max configured value, else
1916*5113495bSYour Name  * false
1917*5113495bSYour Name  */
1918*5113495bSYour Name static inline bool
dp_tx_exception_limit_check(struct dp_vdev * vdev,uint8_t xmit_type)1919*5113495bSYour Name dp_tx_exception_limit_check(struct dp_vdev *vdev, uint8_t xmit_type)
1920*5113495bSYour Name {
1921*5113495bSYour Name 	struct dp_pdev *pdev = vdev->pdev;
1922*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
1923*5113495bSYour Name 
1924*5113495bSYour Name 	if (qdf_atomic_read(&soc->num_tx_exception) >=
1925*5113495bSYour Name 			soc->num_msdu_exception_desc) {
1926*5113495bSYour Name 		dp_info("exc packets are more than max drop the exc pkt");
1927*5113495bSYour Name 		DP_STATS_INC(vdev, tx_i[xmit_type].dropped.exc_desc_na.num, 1);
1928*5113495bSYour Name 		return true;
1929*5113495bSYour Name 	}
1930*5113495bSYour Name 
1931*5113495bSYour Name 	return false;
1932*5113495bSYour Name }
1933*5113495bSYour Name 
1934*5113495bSYour Name #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
1935*5113495bSYour Name /**
1936*5113495bSYour Name  * dp_tx_outstanding_inc - Inc outstanding tx desc values on global and pdev
1937*5113495bSYour Name  * @pdev: DP pdev handle
1938*5113495bSYour Name  *
1939*5113495bSYour Name  * Return: void
1940*5113495bSYour Name  */
1941*5113495bSYour Name static inline void
dp_tx_outstanding_inc(struct dp_pdev * pdev)1942*5113495bSYour Name dp_tx_outstanding_inc(struct dp_pdev *pdev)
1943*5113495bSYour Name {
1944*5113495bSYour Name }
1945*5113495bSYour Name 
1946*5113495bSYour Name static inline void
__dp_tx_outstanding_inc(struct dp_soc * soc)1947*5113495bSYour Name __dp_tx_outstanding_inc(struct dp_soc *soc)
1948*5113495bSYour Name {
1949*5113495bSYour Name }
1950*5113495bSYour Name 
1951*5113495bSYour Name static inline void
__dp_tx_outstanding_dec(struct dp_soc * soc)1952*5113495bSYour Name __dp_tx_outstanding_dec(struct dp_soc *soc)
1953*5113495bSYour Name {
1954*5113495bSYour Name }
1955*5113495bSYour Name 
1956*5113495bSYour Name /**
1957*5113495bSYour Name  * dp_tx_outstanding_dec - Dec outstanding tx desc values on global and pdev
1958*5113495bSYour Name  * @pdev: DP pdev handle
1959*5113495bSYour Name  *
1960*5113495bSYour Name  * Return: void
1961*5113495bSYour Name  */
1962*5113495bSYour Name static inline void
dp_tx_outstanding_dec(struct dp_pdev * pdev)1963*5113495bSYour Name dp_tx_outstanding_dec(struct dp_pdev *pdev)
1964*5113495bSYour Name {
1965*5113495bSYour Name }
1966*5113495bSYour Name 
1967*5113495bSYour Name /**
1968*5113495bSYour Name  * dp_tx_outstanding_sub - Subtract outstanding tx desc values on pdev
1969*5113495bSYour Name  * @pdev: DP pdev handle
1970*5113495bSYour Name  * @count: count of descs to subtract from outstanding
1971*5113495bSYour Name  *
1972*5113495bSYour Name  * Return: void
1973*5113495bSYour Name  */
1974*5113495bSYour Name static inline void
dp_tx_outstanding_sub(struct dp_pdev * pdev,uint32_t count)1975*5113495bSYour Name dp_tx_outstanding_sub(struct dp_pdev *pdev, uint32_t count)
1976*5113495bSYour Name {
1977*5113495bSYour Name }
1978*5113495bSYour Name #else
1979*5113495bSYour Name 
1980*5113495bSYour Name static inline void
__dp_tx_outstanding_inc(struct dp_soc * soc)1981*5113495bSYour Name __dp_tx_outstanding_inc(struct dp_soc *soc)
1982*5113495bSYour Name {
1983*5113495bSYour Name 	qdf_atomic_inc(&soc->num_tx_outstanding);
1984*5113495bSYour Name }
1985*5113495bSYour Name /**
1986*5113495bSYour Name  * dp_tx_outstanding_inc - Increment outstanding tx desc values on pdev and soc
1987*5113495bSYour Name  * @pdev: DP pdev handle
1988*5113495bSYour Name  *
1989*5113495bSYour Name  * Return: void
1990*5113495bSYour Name  */
1991*5113495bSYour Name static inline void
dp_tx_outstanding_inc(struct dp_pdev * pdev)1992*5113495bSYour Name dp_tx_outstanding_inc(struct dp_pdev *pdev)
1993*5113495bSYour Name {
1994*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
1995*5113495bSYour Name 
1996*5113495bSYour Name 	__dp_tx_outstanding_inc(soc);
1997*5113495bSYour Name 	qdf_atomic_inc(&pdev->num_tx_outstanding);
1998*5113495bSYour Name 	dp_update_tx_desc_stats(pdev);
1999*5113495bSYour Name }
2000*5113495bSYour Name 
2001*5113495bSYour Name static inline void
__dp_tx_outstanding_dec(struct dp_soc * soc)2002*5113495bSYour Name __dp_tx_outstanding_dec(struct dp_soc *soc)
2003*5113495bSYour Name {
2004*5113495bSYour Name 	qdf_atomic_dec(&soc->num_tx_outstanding);
2005*5113495bSYour Name }
2006*5113495bSYour Name 
2007*5113495bSYour Name /**
2008*5113495bSYour Name  * dp_tx_outstanding_dec - Decrement outstanding tx desc values on pdev and soc
2009*5113495bSYour Name  * @pdev: DP pdev handle
2010*5113495bSYour Name  *
2011*5113495bSYour Name  * Return: void
2012*5113495bSYour Name  */
2013*5113495bSYour Name static inline void
dp_tx_outstanding_dec(struct dp_pdev * pdev)2014*5113495bSYour Name dp_tx_outstanding_dec(struct dp_pdev *pdev)
2015*5113495bSYour Name {
2016*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
2017*5113495bSYour Name 
2018*5113495bSYour Name 	__dp_tx_outstanding_dec(soc);
2019*5113495bSYour Name 	qdf_atomic_dec(&pdev->num_tx_outstanding);
2020*5113495bSYour Name 	dp_update_tx_desc_stats(pdev);
2021*5113495bSYour Name }
2022*5113495bSYour Name 
2023*5113495bSYour Name /**
2024*5113495bSYour Name  * __dp_tx_outstanding_sub - Sub outstanding tx desc values from soc
2025*5113495bSYour Name  * @soc: DP soc handle
2026*5113495bSYour Name  * @count: count of descs to subtract from outstanding
2027*5113495bSYour Name  *
2028*5113495bSYour Name  * Return: void
2029*5113495bSYour Name  */
2030*5113495bSYour Name static inline void
__dp_tx_outstanding_sub(struct dp_soc * soc,uint32_t count)2031*5113495bSYour Name __dp_tx_outstanding_sub(struct dp_soc *soc, uint32_t count)
2032*5113495bSYour Name {
2033*5113495bSYour Name 	qdf_atomic_sub(count, &soc->num_tx_outstanding);
2034*5113495bSYour Name }
2035*5113495bSYour Name 
2036*5113495bSYour Name /**
2037*5113495bSYour Name  * dp_tx_outstanding_sub - Subtract outstanding tx desc values on pdev
2038*5113495bSYour Name  * @pdev: DP pdev handle
2039*5113495bSYour Name  * @count: count of descs to subtract from outstanding
2040*5113495bSYour Name  *
2041*5113495bSYour Name  * Return: void
2042*5113495bSYour Name  */
2043*5113495bSYour Name static inline void
dp_tx_outstanding_sub(struct dp_pdev * pdev,uint32_t count)2044*5113495bSYour Name dp_tx_outstanding_sub(struct dp_pdev *pdev, uint32_t count)
2045*5113495bSYour Name {
2046*5113495bSYour Name 	struct dp_soc *soc = pdev->soc;
2047*5113495bSYour Name 
2048*5113495bSYour Name 	__dp_tx_outstanding_sub(soc, count);
2049*5113495bSYour Name 	qdf_atomic_sub(count, &pdev->num_tx_outstanding);
2050*5113495bSYour Name 	dp_update_tx_desc_stats(pdev);
2051*5113495bSYour Name }
2052*5113495bSYour Name #endif /* QCA_SUPPORT_DP_GLOBAL_CTX */
2053*5113495bSYour Name 
2054*5113495bSYour Name #else //QCA_TX_LIMIT_CHECK
2055*5113495bSYour Name static inline bool
__dp_tx_limit_check(struct dp_soc * soc)2056*5113495bSYour Name __dp_tx_limit_check(struct dp_soc *soc)
2057*5113495bSYour Name {
2058*5113495bSYour Name 	return false;
2059*5113495bSYour Name }
2060*5113495bSYour Name 
2061*5113495bSYour Name static inline bool
dp_tx_limit_check(struct dp_vdev * vdev,qdf_nbuf_t nbuf)2062*5113495bSYour Name dp_tx_limit_check(struct dp_vdev *vdev, qdf_nbuf_t nbuf)
2063*5113495bSYour Name {
2064*5113495bSYour Name 	return false;
2065*5113495bSYour Name }
2066*5113495bSYour Name 
2067*5113495bSYour Name static inline bool
dp_tx_exception_limit_check(struct dp_vdev * vdev,uint8_t xmit_type)2068*5113495bSYour Name dp_tx_exception_limit_check(struct dp_vdev *vdev, uint8_t xmit_type)
2069*5113495bSYour Name {
2070*5113495bSYour Name 	return false;
2071*5113495bSYour Name }
2072*5113495bSYour Name 
2073*5113495bSYour Name static inline void
__dp_tx_outstanding_inc(struct dp_soc * soc)2074*5113495bSYour Name __dp_tx_outstanding_inc(struct dp_soc *soc)
2075*5113495bSYour Name {
2076*5113495bSYour Name }
2077*5113495bSYour Name 
2078*5113495bSYour Name static inline void
dp_tx_outstanding_inc(struct dp_pdev * pdev)2079*5113495bSYour Name dp_tx_outstanding_inc(struct dp_pdev *pdev)
2080*5113495bSYour Name {
2081*5113495bSYour Name 	qdf_atomic_inc(&pdev->num_tx_outstanding);
2082*5113495bSYour Name 	dp_update_tx_desc_stats(pdev);
2083*5113495bSYour Name }
2084*5113495bSYour Name 
2085*5113495bSYour Name static inline void
__dp_tx_outstanding_dec(struct dp_soc * soc)2086*5113495bSYour Name __dp_tx_outstanding_dec(struct dp_soc *soc)
2087*5113495bSYour Name {
2088*5113495bSYour Name }
2089*5113495bSYour Name 
2090*5113495bSYour Name static inline void
dp_tx_outstanding_dec(struct dp_pdev * pdev)2091*5113495bSYour Name dp_tx_outstanding_dec(struct dp_pdev *pdev)
2092*5113495bSYour Name {
2093*5113495bSYour Name 	qdf_atomic_dec(&pdev->num_tx_outstanding);
2094*5113495bSYour Name 	dp_update_tx_desc_stats(pdev);
2095*5113495bSYour Name }
2096*5113495bSYour Name 
2097*5113495bSYour Name static inline void
__dp_tx_outstanding_sub(struct dp_soc * soc,uint32_t count)2098*5113495bSYour Name __dp_tx_outstanding_sub(struct dp_soc *soc, uint32_t count)
2099*5113495bSYour Name {
2100*5113495bSYour Name }
2101*5113495bSYour Name 
2102*5113495bSYour Name /**
2103*5113495bSYour Name  * dp_tx_outstanding_sub - Subtract outstanding tx desc values on pdev
2104*5113495bSYour Name  * @pdev: DP pdev handle
2105*5113495bSYour Name  * @count: count of descs to subtract from outstanding
2106*5113495bSYour Name  *
2107*5113495bSYour Name  * Return: void
2108*5113495bSYour Name  */
2109*5113495bSYour Name static inline void
dp_tx_outstanding_sub(struct dp_pdev * pdev,uint32_t count)2110*5113495bSYour Name dp_tx_outstanding_sub(struct dp_pdev *pdev, uint32_t count)
2111*5113495bSYour Name {
2112*5113495bSYour Name 	qdf_atomic_sub(count, &pdev->num_tx_outstanding);
2113*5113495bSYour Name 	dp_update_tx_desc_stats(pdev);
2114*5113495bSYour Name }
2115*5113495bSYour Name #endif //QCA_TX_LIMIT_CHECK
2116*5113495bSYour Name 
2117*5113495bSYour Name /**
2118*5113495bSYour Name  * dp_tx_get_pkt_len() - Get the packet length of a msdu
2119*5113495bSYour Name  * @tx_desc: tx descriptor
2120*5113495bSYour Name  *
2121*5113495bSYour Name  * Return: Packet length of a msdu. If the packet is fragmented,
2122*5113495bSYour Name  * it will return the single fragment length.
2123*5113495bSYour Name  *
2124*5113495bSYour Name  * In TSO mode, the msdu from stack will be fragmented into small
2125*5113495bSYour Name  * fragments and each of these new fragments will be transmitted
2126*5113495bSYour Name  * as an individual msdu.
2127*5113495bSYour Name  *
2128*5113495bSYour Name  * Please note that the length of a msdu from stack may be smaller
2129*5113495bSYour Name  * than the length of the total length of the fragments it has been
2130*5113495bSYour Name  * fragmentted because each of the fragments has a nbuf header.
2131*5113495bSYour Name  */
dp_tx_get_pkt_len(struct dp_tx_desc_s * tx_desc)2132*5113495bSYour Name static inline uint32_t dp_tx_get_pkt_len(struct dp_tx_desc_s *tx_desc)
2133*5113495bSYour Name {
2134*5113495bSYour Name 	return tx_desc->frm_type == dp_tx_frm_tso ?
2135*5113495bSYour Name 		tx_desc->msdu_ext_desc->tso_desc->seg.total_len :
2136*5113495bSYour Name 		tx_desc->length;
2137*5113495bSYour Name }
2138*5113495bSYour Name 
2139*5113495bSYour Name #ifdef FEATURE_RUNTIME_PM
dp_get_rtpm_tput_policy_requirement(struct dp_soc * soc)2140*5113495bSYour Name static inline int dp_get_rtpm_tput_policy_requirement(struct dp_soc *soc)
2141*5113495bSYour Name {
2142*5113495bSYour Name 	return qdf_atomic_read(&soc->rtpm_high_tput_flag) &&
2143*5113495bSYour Name 		(hif_rtpm_get_state() <= HIF_RTPM_STATE_ON);
2144*5113495bSYour Name }
2145*5113495bSYour Name #else
dp_get_rtpm_tput_policy_requirement(struct dp_soc * soc)2146*5113495bSYour Name static inline int dp_get_rtpm_tput_policy_requirement(struct dp_soc *soc)
2147*5113495bSYour Name {
2148*5113495bSYour Name 	return 0;
2149*5113495bSYour Name }
2150*5113495bSYour Name #endif
2151*5113495bSYour Name #if defined WLAN_FEATURE_11BE_MLO && defined DP_MLO_LINK_STATS_SUPPORT
2152*5113495bSYour Name /**
2153*5113495bSYour Name  * dp_tx_set_nbuf_band() - Set band info in nbuf cb
2154*5113495bSYour Name  * @nbuf: nbuf pointer
2155*5113495bSYour Name  * @txrx_peer: txrx_peer pointer
2156*5113495bSYour Name  * @link_id: Peer Link ID
2157*5113495bSYour Name  *
2158*5113495bSYour Name  * Return: None
2159*5113495bSYour Name  */
2160*5113495bSYour Name static inline void
dp_tx_set_nbuf_band(qdf_nbuf_t nbuf,struct dp_txrx_peer * txrx_peer,uint8_t link_id)2161*5113495bSYour Name dp_tx_set_nbuf_band(qdf_nbuf_t nbuf, struct dp_txrx_peer *txrx_peer,
2162*5113495bSYour Name 		    uint8_t link_id)
2163*5113495bSYour Name {
2164*5113495bSYour Name 	qdf_nbuf_tx_set_band(nbuf, txrx_peer->band[link_id]);
2165*5113495bSYour Name }
2166*5113495bSYour Name #else
2167*5113495bSYour Name static inline void
dp_tx_set_nbuf_band(qdf_nbuf_t nbuf,struct dp_txrx_peer * txrx_peer,uint8_t link_id)2168*5113495bSYour Name dp_tx_set_nbuf_band(qdf_nbuf_t nbuf, struct dp_txrx_peer *txrx_peer,
2169*5113495bSYour Name 		    uint8_t link_id)
2170*5113495bSYour Name {
2171*5113495bSYour Name }
2172*5113495bSYour Name #endif
2173*5113495bSYour Name 
2174*5113495bSYour Name #ifdef WLAN_FEATURE_TX_LATENCY_STATS
2175*5113495bSYour Name /**
2176*5113495bSYour Name  * dp_tx_latency_stats_fetch() - fetch transmit latency statistics for
2177*5113495bSYour Name  * specified link mac address
2178*5113495bSYour Name  * @soc_hdl: Handle to struct dp_soc
2179*5113495bSYour Name  * @vdev_id: vdev id
2180*5113495bSYour Name  * @mac: link mac address of remote peer
2181*5113495bSYour Name  * @latency: buffer to hold per-link transmit latency statistics
2182*5113495bSYour Name  *
2183*5113495bSYour Name  * Return: QDF_STATUS
2184*5113495bSYour Name  */
2185*5113495bSYour Name QDF_STATUS
2186*5113495bSYour Name dp_tx_latency_stats_fetch(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
2187*5113495bSYour Name 			  uint8_t *mac, struct cdp_tx_latency *latency);
2188*5113495bSYour Name 
2189*5113495bSYour Name /**
2190*5113495bSYour Name  * dp_tx_latency_stats_config() - config transmit latency statistics for
2191*5113495bSYour Name  * specified vdev
2192*5113495bSYour Name  * @soc_hdl: Handle to struct dp_soc
2193*5113495bSYour Name  * @vdev_id: vdev id
2194*5113495bSYour Name  * @cfg: configuration for transmit latency statistics
2195*5113495bSYour Name  *
2196*5113495bSYour Name  * Return: QDF_STATUS
2197*5113495bSYour Name  */
2198*5113495bSYour Name QDF_STATUS
2199*5113495bSYour Name dp_tx_latency_stats_config(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
2200*5113495bSYour Name 			   struct cdp_tx_latency_config *cfg);
2201*5113495bSYour Name 
2202*5113495bSYour Name /**
2203*5113495bSYour Name  * dp_tx_latency_stats_register_cb() - register transmit latency statistics
2204*5113495bSYour Name  * callback
2205*5113495bSYour Name  * @handle: Handle to struct dp_soc
2206*5113495bSYour Name  * @cb: callback function for transmit latency statistics
2207*5113495bSYour Name  *
2208*5113495bSYour Name  * Return: QDF_STATUS
2209*5113495bSYour Name  */
2210*5113495bSYour Name QDF_STATUS dp_tx_latency_stats_register_cb(struct cdp_soc_t *handle,
2211*5113495bSYour Name 					   cdp_tx_latency_cb cb);
2212*5113495bSYour Name #endif
2213*5113495bSYour Name #endif
2214