xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_internal.h (revision 503663c6daafffe652fa360bde17243568cd6d2a)
1 /*
2  * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for
5  * any purpose with or without fee is hereby granted, provided that the
6  * above copyright notice and this permission notice appear in all
7  * copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16  * PERFORMANCE OF THIS SOFTWARE.
17  */
18 
19 #ifndef _DP_INTERNAL_H_
20 #define _DP_INTERNAL_H_
21 
22 #include "dp_types.h"
23 
24 #define RX_BUFFER_SIZE_PKTLOG_LITE 1024
25 
26 
27 #define DP_RSSI_INVAL 0x80
28 #define DP_RSSI_AVG_WEIGHT 2
29 /*
30  * Formula to derive avg_rssi is taken from wifi2.o firmware
31  */
32 #define DP_GET_AVG_RSSI(avg_rssi, last_rssi) \
33 	(((avg_rssi) - (((uint8_t)(avg_rssi)) >> DP_RSSI_AVG_WEIGHT)) \
34 	+ ((((uint8_t)(last_rssi)) >> DP_RSSI_AVG_WEIGHT)))
35 
36 /* Macro For NYSM value received in VHT TLV */
37 #define VHT_SGI_NYSM 3
38 
39 /* PPDU STATS CFG */
40 #define DP_PPDU_STATS_CFG_ALL 0xFFFF
41 
42 /* PPDU stats mask sent to FW to enable enhanced stats */
43 #define DP_PPDU_STATS_CFG_ENH_STATS 0xE67
44 /* PPDU stats mask sent to FW to support debug sniffer feature */
45 #define DP_PPDU_STATS_CFG_SNIFFER 0x2FFF
46 /* PPDU stats mask sent to FW to support BPR feature*/
47 #define DP_PPDU_STATS_CFG_BPR 0x2000
48 /* PPDU stats mask sent to FW to support BPR and enhanced stats feature */
49 #define DP_PPDU_STATS_CFG_BPR_ENH (DP_PPDU_STATS_CFG_BPR | \
50 				   DP_PPDU_STATS_CFG_ENH_STATS)
51 /* PPDU stats mask sent to FW to support BPR and pcktlog stats feature */
52 #define DP_PPDU_STATS_CFG_BPR_PKTLOG (DP_PPDU_STATS_CFG_BPR | \
53 				      DP_PPDU_TXLITE_STATS_BITMASK_CFG)
54 
55 /**
56  * Bitmap of HTT PPDU TLV types for Default mode
57  */
58 #define HTT_PPDU_DEFAULT_TLV_BITMAP \
59 	(1 << HTT_PPDU_STATS_COMMON_TLV) | \
60 	(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
61 	(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
62 	(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
63 	(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
64 	(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV)
65 
66 /**
67  * Bitmap of HTT PPDU delayed ba TLV types for Default mode
68  */
69 #define HTT_PPDU_DELAYED_BA_TLV_BITMAP \
70 	(1 << HTT_PPDU_STATS_COMMON_TLV) | \
71 	(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
72 	(1 << HTT_PPDU_STATS_USR_RATE_TLV)
73 
74 /**
75  * Bitmap of HTT PPDU TLV types for Delayed BA
76  */
77 #define HTT_PPDU_STATUS_TLV_BITMAP \
78 	(1 << HTT_PPDU_STATS_COMMON_TLV) | \
79 	(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV)
80 
81 /**
82  * Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 64
83  */
84 #define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_64 \
85 	((1 << HTT_PPDU_STATS_COMMON_TLV) | \
86 	(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
87 	(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
88 	(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
89 	(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
90 	(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \
91 	(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV) | \
92 	(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV))
93 
94 /**
95  * Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 256
96  */
97 #define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_256 \
98 	((1 << HTT_PPDU_STATS_COMMON_TLV) | \
99 	(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
100 	(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
101 	(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
102 	(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
103 	(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \
104 	(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \
105 	(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV))
106 
107 #ifdef WLAN_TX_PKT_CAPTURE_ENH
108 extern uint8_t
109 dp_cpu_ring_map[DP_NSS_CPU_RING_MAP_MAX][WLAN_CFG_INT_NUM_CONTEXTS_MAX];
110 #endif
111 
112 #if DP_PRINT_ENABLE
113 #include <stdarg.h>       /* va_list */
114 #include <qdf_types.h> /* qdf_vprint */
115 #include <cdp_txrx_handle.h>
116 
117 enum {
118 	/* FATAL_ERR - print only irrecoverable error messages */
119 	DP_PRINT_LEVEL_FATAL_ERR,
120 
121 	/* ERR - include non-fatal err messages */
122 	DP_PRINT_LEVEL_ERR,
123 
124 	/* WARN - include warnings */
125 	DP_PRINT_LEVEL_WARN,
126 
127 	/* INFO1 - include fundamental, infrequent events */
128 	DP_PRINT_LEVEL_INFO1,
129 
130 	/* INFO2 - include non-fundamental but infrequent events */
131 	DP_PRINT_LEVEL_INFO2,
132 };
133 
134 
135 #define dp_print(level, fmt, ...) do { \
136 	if (level <= g_txrx_print_level) \
137 		qdf_print(fmt, ## __VA_ARGS__); \
138 while (0)
139 #define DP_PRINT(level, fmt, ...) do { \
140 	dp_print(level, "DP: " fmt, ## __VA_ARGS__); \
141 while (0)
142 #else
143 #define DP_PRINT(level, fmt, ...)
144 #endif /* DP_PRINT_ENABLE */
145 
146 #define DP_TRACE(LVL, fmt, args ...)                             \
147 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_##LVL,       \
148 		fmt, ## args)
149 
150 #ifdef DP_PRINT_NO_CONSOLE
151 /* Stat prints should not go to console or kernel logs.*/
152 #define DP_PRINT_STATS(fmt, args ...)\
153 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,       \
154 		  fmt, ## args)
155 #else
156 #define DP_PRINT_STATS(fmt, args ...)\
157 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,\
158 		  fmt, ## args)
159 #endif
160 #define DP_STATS_INIT(_handle) \
161 	qdf_mem_zero(&((_handle)->stats), sizeof((_handle)->stats))
162 
163 #define DP_STATS_CLR(_handle) \
164 	qdf_mem_zero(&((_handle)->stats), sizeof((_handle)->stats))
165 
166 #ifndef DISABLE_DP_STATS
167 #define DP_STATS_INC(_handle, _field, _delta) \
168 { \
169 	if (likely(_handle)) \
170 		_handle->stats._field += _delta; \
171 }
172 
173 #define DP_STATS_INCC(_handle, _field, _delta, _cond) \
174 { \
175 	if (_cond && likely(_handle)) \
176 		_handle->stats._field += _delta; \
177 }
178 
179 #define DP_STATS_DEC(_handle, _field, _delta) \
180 { \
181 	if (likely(_handle)) \
182 		_handle->stats._field -= _delta; \
183 }
184 
185 #define DP_STATS_UPD(_handle, _field, _delta) \
186 { \
187 	if (likely(_handle)) \
188 		_handle->stats._field = _delta; \
189 }
190 
191 #define DP_STATS_INC_PKT(_handle, _field, _count, _bytes) \
192 { \
193 	DP_STATS_INC(_handle, _field.num, _count); \
194 	DP_STATS_INC(_handle, _field.bytes, _bytes) \
195 }
196 
197 #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond) \
198 { \
199 	DP_STATS_INCC(_handle, _field.num, _count, _cond); \
200 	DP_STATS_INCC(_handle, _field.bytes, _bytes, _cond) \
201 }
202 
203 #define DP_STATS_AGGR(_handle_a, _handle_b, _field) \
204 { \
205 	_handle_a->stats._field += _handle_b->stats._field; \
206 }
207 
208 #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field) \
209 { \
210 	DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \
211 	DP_STATS_AGGR(_handle_a, _handle_b, _field.bytes);\
212 }
213 
214 #define DP_STATS_UPD_STRUCT(_handle_a, _handle_b, _field) \
215 { \
216 	_handle_a->stats._field = _handle_b->stats._field; \
217 }
218 
219 #else
220 #define DP_STATS_INC(_handle, _field, _delta)
221 #define DP_STATS_INCC(_handle, _field, _delta, _cond)
222 #define DP_STATS_DEC(_handle, _field, _delta)
223 #define DP_STATS_UPD(_handle, _field, _delta)
224 #define DP_STATS_INC_PKT(_handle, _field, _count, _bytes)
225 #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond)
226 #define DP_STATS_AGGR(_handle_a, _handle_b, _field)
227 #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field)
228 #endif
229 
230 #ifdef ENABLE_DP_HIST_STATS
231 #define DP_HIST_INIT() \
232 	uint32_t num_of_packets[MAX_PDEV_CNT] = {0};
233 
234 #define DP_HIST_PACKET_COUNT_INC(_pdev_id) \
235 { \
236 		++num_of_packets[_pdev_id]; \
237 }
238 
239 #define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
240 	do {                                                              \
241 		if (_p_cntrs == 1) {                                      \
242 			DP_STATS_INC(_pdev,                               \
243 				tx_comp_histogram.pkts_1, 1);             \
244 		} else if (_p_cntrs > 1 && _p_cntrs <= 20) {              \
245 			DP_STATS_INC(_pdev,                               \
246 				tx_comp_histogram.pkts_2_20, 1);          \
247 		} else if (_p_cntrs > 20 && _p_cntrs <= 40) {             \
248 			DP_STATS_INC(_pdev,                               \
249 				tx_comp_histogram.pkts_21_40, 1);         \
250 		} else if (_p_cntrs > 40 && _p_cntrs <= 60) {             \
251 			DP_STATS_INC(_pdev,                               \
252 				tx_comp_histogram.pkts_41_60, 1);         \
253 		} else if (_p_cntrs > 60 && _p_cntrs <= 80) {             \
254 			DP_STATS_INC(_pdev,                               \
255 				tx_comp_histogram.pkts_61_80, 1);         \
256 		} else if (_p_cntrs > 80 && _p_cntrs <= 100) {            \
257 			DP_STATS_INC(_pdev,                               \
258 				tx_comp_histogram.pkts_81_100, 1);        \
259 		} else if (_p_cntrs > 100 && _p_cntrs <= 200) {           \
260 			DP_STATS_INC(_pdev,                               \
261 				tx_comp_histogram.pkts_101_200, 1);       \
262 		} else if (_p_cntrs > 200) {                              \
263 			DP_STATS_INC(_pdev,                               \
264 				tx_comp_histogram.pkts_201_plus, 1);      \
265 		}                                                         \
266 	} while (0)
267 
268 #define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
269 	do {                                                              \
270 		if (_p_cntrs == 1) {                                      \
271 			DP_STATS_INC(_pdev,                               \
272 				rx_ind_histogram.pkts_1, 1);              \
273 		} else if (_p_cntrs > 1 && _p_cntrs <= 20) {              \
274 			DP_STATS_INC(_pdev,                               \
275 				rx_ind_histogram.pkts_2_20, 1);           \
276 		} else if (_p_cntrs > 20 && _p_cntrs <= 40) {             \
277 			DP_STATS_INC(_pdev,                               \
278 				rx_ind_histogram.pkts_21_40, 1);          \
279 		} else if (_p_cntrs > 40 && _p_cntrs <= 60) {             \
280 			DP_STATS_INC(_pdev,                               \
281 				rx_ind_histogram.pkts_41_60, 1);          \
282 		} else if (_p_cntrs > 60 && _p_cntrs <= 80) {             \
283 			DP_STATS_INC(_pdev,                               \
284 				rx_ind_histogram.pkts_61_80, 1);          \
285 		} else if (_p_cntrs > 80 && _p_cntrs <= 100) {            \
286 			DP_STATS_INC(_pdev,                               \
287 				rx_ind_histogram.pkts_81_100, 1);         \
288 		} else if (_p_cntrs > 100 && _p_cntrs <= 200) {           \
289 			DP_STATS_INC(_pdev,                               \
290 				rx_ind_histogram.pkts_101_200, 1);        \
291 		} else if (_p_cntrs > 200) {                              \
292 			DP_STATS_INC(_pdev,                               \
293 				rx_ind_histogram.pkts_201_plus, 1);       \
294 		}                                                         \
295 	} while (0)
296 
297 #define DP_TX_HIST_STATS_PER_PDEV() \
298 	do { \
299 		uint8_t hist_stats = 0; \
300 		for (hist_stats = 0; hist_stats < soc->pdev_count; \
301 				hist_stats++) { \
302 			DP_TX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
303 					num_of_packets[hist_stats]); \
304 		} \
305 	}  while (0)
306 
307 
308 #define DP_RX_HIST_STATS_PER_PDEV() \
309 	do { \
310 		uint8_t hist_stats = 0; \
311 		for (hist_stats = 0; hist_stats < soc->pdev_count; \
312 				hist_stats++) { \
313 			DP_RX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
314 					num_of_packets[hist_stats]); \
315 		} \
316 	}  while (0)
317 
318 #else
319 #define DP_HIST_INIT()
320 #define DP_HIST_PACKET_COUNT_INC(_pdev_id)
321 #define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
322 #define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
323 #define DP_RX_HIST_STATS_PER_PDEV()
324 #define DP_TX_HIST_STATS_PER_PDEV()
325 #endif /* DISABLE_DP_STATS */
326 
327 #ifdef FEATURE_TSO_STATS
328 /**
329  * dp_init_tso_stats() - Clear tso stats
330  * @pdev: pdev handle
331  *
332  * Return: None
333  */
334 static inline
335 void dp_init_tso_stats(struct dp_pdev *pdev)
336 {
337 	if (pdev) {
338 		qdf_mem_zero(&((pdev)->stats.tso_stats),
339 			     sizeof((pdev)->stats.tso_stats));
340 		qdf_atomic_init(&pdev->tso_idx);
341 	}
342 }
343 
344 /**
345  * dp_stats_tso_segment_histogram_update() - TSO Segment Histogram
346  * @pdev: pdev handle
347  * @_p_cntrs: number of tso segments for a tso packet
348  *
349  * Return: None
350  */
351 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
352 					   uint8_t _p_cntrs);
353 
354 /**
355  * dp_tso_segment_update() - Collect tso segment information
356  * @pdev: pdev handle
357  * @stats_idx: tso packet number
358  * @idx: tso segment number
359  * @seg: tso segment
360  *
361  * Return: None
362  */
363 void dp_tso_segment_update(struct dp_pdev *pdev,
364 			   uint32_t stats_idx,
365 			   uint8_t idx,
366 			   struct qdf_tso_seg_t seg);
367 
368 /**
369  * dp_tso_packet_update() - TSO Packet information
370  * @pdev: pdev handle
371  * @stats_idx: tso packet number
372  * @msdu: nbuf handle
373  * @num_segs: tso segments
374  *
375  * Return: None
376  */
377 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
378 			  qdf_nbuf_t msdu, uint16_t num_segs);
379 
380 /**
381  * dp_tso_segment_stats_update() - TSO Segment stats
382  * @pdev: pdev handle
383  * @stats_seg: tso segment list
384  * @stats_idx: tso packet number
385  *
386  * Return: None
387  */
388 void dp_tso_segment_stats_update(struct dp_pdev *pdev,
389 				 struct qdf_tso_seg_elem_t *stats_seg,
390 				 uint32_t stats_idx);
391 
392 /**
393  * dp_print_tso_stats() - dump tso statistics
394  * @soc:soc handle
395  * @level: verbosity level
396  *
397  * Return: None
398  */
399 void dp_print_tso_stats(struct dp_soc *soc,
400 			enum qdf_stats_verbosity_level level);
401 
402 /**
403  * dp_txrx_clear_tso_stats() - clear tso stats
404  * @soc: soc handle
405  *
406  * Return: None
407  */
408 void dp_txrx_clear_tso_stats(struct dp_soc *soc);
409 #else
410 static inline
411 void dp_init_tso_stats(struct dp_pdev *pdev)
412 {
413 }
414 
415 static inline
416 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
417 					   uint8_t _p_cntrs)
418 {
419 }
420 
421 static inline
422 void dp_tso_segment_update(struct dp_pdev *pdev,
423 			   uint32_t stats_idx,
424 			   uint32_t idx,
425 			   struct qdf_tso_seg_t seg)
426 {
427 }
428 
429 static inline
430 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
431 			  qdf_nbuf_t msdu, uint16_t num_segs)
432 {
433 }
434 
435 static inline
436 void dp_tso_segment_stats_update(struct dp_pdev *pdev,
437 				 struct qdf_tso_seg_elem_t *stats_seg,
438 				 uint32_t stats_idx)
439 {
440 }
441 
442 static inline
443 void dp_print_tso_stats(struct dp_soc *soc,
444 			enum qdf_stats_verbosity_level level)
445 {
446 }
447 
448 static inline
449 void dp_txrx_clear_tso_stats(struct dp_soc *soc)
450 {
451 }
452 #endif /* FEATURE_TSO_STATS */
453 
454 #define DP_HTT_T2H_HP_PIPE 5
455 static inline void dp_update_pdev_stats(struct dp_pdev *tgtobj,
456 					struct cdp_vdev_stats *srcobj)
457 {
458 	uint8_t i;
459 	uint8_t pream_type;
460 
461 	for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
462 		for (i = 0; i < MAX_MCS; i++) {
463 			tgtobj->stats.tx.pkt_type[pream_type].
464 				mcs_count[i] +=
465 			srcobj->tx.pkt_type[pream_type].
466 				mcs_count[i];
467 			tgtobj->stats.rx.pkt_type[pream_type].
468 				mcs_count[i] +=
469 			srcobj->rx.pkt_type[pream_type].
470 				mcs_count[i];
471 		}
472 	}
473 
474 	for (i = 0; i < MAX_BW; i++) {
475 		tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i];
476 		tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i];
477 	}
478 
479 	for (i = 0; i < SS_COUNT; i++) {
480 		tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i];
481 		tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i];
482 	}
483 
484 	for (i = 0; i < WME_AC_MAX; i++) {
485 		tgtobj->stats.tx.wme_ac_type[i] +=
486 			srcobj->tx.wme_ac_type[i];
487 		tgtobj->stats.rx.wme_ac_type[i] +=
488 			srcobj->rx.wme_ac_type[i];
489 		tgtobj->stats.tx.excess_retries_per_ac[i] +=
490 			srcobj->tx.excess_retries_per_ac[i];
491 	}
492 
493 	for (i = 0; i < MAX_GI; i++) {
494 		tgtobj->stats.tx.sgi_count[i] +=
495 			srcobj->tx.sgi_count[i];
496 		tgtobj->stats.rx.sgi_count[i] +=
497 			srcobj->rx.sgi_count[i];
498 	}
499 
500 	for (i = 0; i < MAX_RECEPTION_TYPES; i++)
501 		tgtobj->stats.rx.reception_type[i] +=
502 			srcobj->rx.reception_type[i];
503 
504 	tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes;
505 	tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num;
506 	tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num;
507 	tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes;
508 	tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num;
509 	tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes;
510 	tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num;
511 	tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes;
512 	tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num;
513 	tgtobj->stats.tx.tx_success.bytes +=
514 		srcobj->tx.tx_success.bytes;
515 	tgtobj->stats.tx.nawds_mcast.num +=
516 		srcobj->tx.nawds_mcast.num;
517 	tgtobj->stats.tx.nawds_mcast.bytes +=
518 		srcobj->tx.nawds_mcast.bytes;
519 	tgtobj->stats.tx.nawds_mcast_drop +=
520 		srcobj->tx.nawds_mcast_drop;
521 	tgtobj->stats.tx.num_ppdu_cookie_valid +=
522 		srcobj->tx.num_ppdu_cookie_valid;
523 	tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed;
524 	tgtobj->stats.tx.ofdma += srcobj->tx.ofdma;
525 	tgtobj->stats.tx.stbc += srcobj->tx.stbc;
526 	tgtobj->stats.tx.ldpc += srcobj->tx.ldpc;
527 	tgtobj->stats.tx.retries += srcobj->tx.retries;
528 	tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt;
529 	tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt;
530 	tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt;
531 	tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt;
532 	tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num;
533 	tgtobj->stats.tx.dropped.fw_rem.bytes +=
534 			srcobj->tx.dropped.fw_rem.bytes;
535 	tgtobj->stats.tx.dropped.fw_rem_tx +=
536 			srcobj->tx.dropped.fw_rem_tx;
537 	tgtobj->stats.tx.dropped.fw_rem_notx +=
538 			srcobj->tx.dropped.fw_rem_notx;
539 	tgtobj->stats.tx.dropped.fw_reason1 +=
540 			srcobj->tx.dropped.fw_reason1;
541 	tgtobj->stats.tx.dropped.fw_reason2 +=
542 			srcobj->tx.dropped.fw_reason2;
543 	tgtobj->stats.tx.dropped.fw_reason3 +=
544 			srcobj->tx.dropped.fw_reason3;
545 	tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out;
546 	tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err;
547 	if (srcobj->rx.rssi != 0)
548 		tgtobj->stats.rx.rssi = srcobj->rx.rssi;
549 	tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate;
550 	tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err;
551 	tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt;
552 	tgtobj->stats.rx.amsdu_cnt += srcobj->rx.ampdu_cnt;
553 	tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt;
554 	tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt;
555 	tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop;
556 	tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
557 	tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
558 
559 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
560 		tgtobj->stats.rx.rcvd_reo[i].num +=
561 			srcobj->rx.rcvd_reo[i].num;
562 		tgtobj->stats.rx.rcvd_reo[i].bytes +=
563 			srcobj->rx.rcvd_reo[i].bytes;
564 	}
565 
566 	srcobj->rx.unicast.num =
567 		srcobj->rx.to_stack.num -
568 				(srcobj->rx.multicast.num);
569 	srcobj->rx.unicast.bytes =
570 		srcobj->rx.to_stack.bytes -
571 				(srcobj->rx.multicast.bytes);
572 
573 	tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num;
574 	tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes;
575 	tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num;
576 	tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes;
577 	tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num;
578 	tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes;
579 	tgtobj->stats.rx.raw.num += srcobj->rx.raw.num;
580 	tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes;
581 	tgtobj->stats.rx.intra_bss.pkts.num +=
582 			srcobj->rx.intra_bss.pkts.num;
583 	tgtobj->stats.rx.intra_bss.pkts.bytes +=
584 			srcobj->rx.intra_bss.pkts.bytes;
585 	tgtobj->stats.rx.intra_bss.fail.num +=
586 			srcobj->rx.intra_bss.fail.num;
587 	tgtobj->stats.rx.intra_bss.fail.bytes +=
588 			srcobj->rx.intra_bss.fail.bytes;
589 
590 	tgtobj->stats.tx.last_ack_rssi =
591 		srcobj->tx.last_ack_rssi;
592 	tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num;
593 	tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes;
594 }
595 
596 static inline void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
597 						struct dp_vdev *srcobj)
598 {
599 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast);
600 
601 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd);
602 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed);
603 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts);
604 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts);
605 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt);
606 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error);
607 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num);
608 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target);
609 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt);
610 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt);
611 	DP_STATS_AGGR(tgtobj, srcobj,
612 		      tx_i.mcast_en.dropped_map_error);
613 	DP_STATS_AGGR(tgtobj, srcobj,
614 		      tx_i.mcast_en.dropped_self_mac);
615 	DP_STATS_AGGR(tgtobj, srcobj,
616 		      tx_i.mcast_en.dropped_send_fail);
617 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast);
618 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error);
619 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full);
620 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail);
621 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num);
622 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full);
623 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient);
624 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified);
625 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw);
626 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd);
627 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw);
628 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw);
629 
630 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
631 		tgtobj->stats.tx_i.dropped.dma_error +
632 		tgtobj->stats.tx_i.dropped.ring_full +
633 		tgtobj->stats.tx_i.dropped.enqueue_fail +
634 		tgtobj->stats.tx_i.dropped.desc_na.num +
635 		tgtobj->stats.tx_i.dropped.res_full;
636 
637 }
638 
639 static inline void dp_update_vdev_stats(struct cdp_vdev_stats *tgtobj,
640 					struct dp_peer *srcobj)
641 {
642 	uint8_t i;
643 	uint8_t pream_type;
644 
645 	for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
646 		for (i = 0; i < MAX_MCS; i++) {
647 			tgtobj->tx.pkt_type[pream_type].
648 				mcs_count[i] +=
649 			srcobj->stats.tx.pkt_type[pream_type].
650 				mcs_count[i];
651 			tgtobj->rx.pkt_type[pream_type].
652 				mcs_count[i] +=
653 			srcobj->stats.rx.pkt_type[pream_type].
654 				mcs_count[i];
655 		}
656 	}
657 
658 	for (i = 0; i < MAX_BW; i++) {
659 		tgtobj->tx.bw[i] += srcobj->stats.tx.bw[i];
660 		tgtobj->rx.bw[i] += srcobj->stats.rx.bw[i];
661 	}
662 
663 	for (i = 0; i < SS_COUNT; i++) {
664 		tgtobj->tx.nss[i] += srcobj->stats.tx.nss[i];
665 		tgtobj->rx.nss[i] += srcobj->stats.rx.nss[i];
666 	}
667 
668 	for (i = 0; i < WME_AC_MAX; i++) {
669 		tgtobj->tx.wme_ac_type[i] +=
670 			srcobj->stats.tx.wme_ac_type[i];
671 		tgtobj->rx.wme_ac_type[i] +=
672 			srcobj->stats.rx.wme_ac_type[i];
673 		tgtobj->tx.excess_retries_per_ac[i] +=
674 			srcobj->stats.tx.excess_retries_per_ac[i];
675 	}
676 
677 	for (i = 0; i < MAX_GI; i++) {
678 		tgtobj->tx.sgi_count[i] +=
679 			srcobj->stats.tx.sgi_count[i];
680 		tgtobj->rx.sgi_count[i] +=
681 			srcobj->stats.rx.sgi_count[i];
682 	}
683 
684 	for (i = 0; i < MAX_RECEPTION_TYPES; i++)
685 		tgtobj->rx.reception_type[i] +=
686 			srcobj->stats.rx.reception_type[i];
687 
688 	tgtobj->tx.comp_pkt.bytes += srcobj->stats.tx.comp_pkt.bytes;
689 	tgtobj->tx.comp_pkt.num += srcobj->stats.tx.comp_pkt.num;
690 	tgtobj->tx.ucast.num += srcobj->stats.tx.ucast.num;
691 	tgtobj->tx.ucast.bytes += srcobj->stats.tx.ucast.bytes;
692 	tgtobj->tx.mcast.num += srcobj->stats.tx.mcast.num;
693 	tgtobj->tx.mcast.bytes += srcobj->stats.tx.mcast.bytes;
694 	tgtobj->tx.bcast.num += srcobj->stats.tx.bcast.num;
695 	tgtobj->tx.bcast.bytes += srcobj->stats.tx.bcast.bytes;
696 	tgtobj->tx.tx_success.num += srcobj->stats.tx.tx_success.num;
697 	tgtobj->tx.tx_success.bytes +=
698 		srcobj->stats.tx.tx_success.bytes;
699 	tgtobj->tx.nawds_mcast.num +=
700 		srcobj->stats.tx.nawds_mcast.num;
701 	tgtobj->tx.nawds_mcast.bytes +=
702 		srcobj->stats.tx.nawds_mcast.bytes;
703 	tgtobj->tx.nawds_mcast_drop +=
704 		srcobj->stats.tx.nawds_mcast_drop;
705 	tgtobj->tx.num_ppdu_cookie_valid +=
706 		srcobj->stats.tx.num_ppdu_cookie_valid;
707 	tgtobj->tx.tx_failed += srcobj->stats.tx.tx_failed;
708 	tgtobj->tx.ofdma += srcobj->stats.tx.ofdma;
709 	tgtobj->tx.stbc += srcobj->stats.tx.stbc;
710 	tgtobj->tx.ldpc += srcobj->stats.tx.ldpc;
711 	tgtobj->tx.retries += srcobj->stats.tx.retries;
712 	tgtobj->tx.non_amsdu_cnt += srcobj->stats.tx.non_amsdu_cnt;
713 	tgtobj->tx.amsdu_cnt += srcobj->stats.tx.amsdu_cnt;
714 	tgtobj->tx.non_ampdu_cnt += srcobj->stats.tx.non_ampdu_cnt;
715 	tgtobj->tx.ampdu_cnt += srcobj->stats.tx.ampdu_cnt;
716 	tgtobj->tx.dropped.fw_rem.num += srcobj->stats.tx.dropped.fw_rem.num;
717 	tgtobj->tx.dropped.fw_rem.bytes +=
718 			srcobj->stats.tx.dropped.fw_rem.bytes;
719 	tgtobj->tx.dropped.fw_rem_tx +=
720 			srcobj->stats.tx.dropped.fw_rem_tx;
721 	tgtobj->tx.dropped.fw_rem_notx +=
722 			srcobj->stats.tx.dropped.fw_rem_notx;
723 	tgtobj->tx.dropped.fw_reason1 +=
724 			srcobj->stats.tx.dropped.fw_reason1;
725 	tgtobj->tx.dropped.fw_reason2 +=
726 			srcobj->stats.tx.dropped.fw_reason2;
727 	tgtobj->tx.dropped.fw_reason3 +=
728 			srcobj->stats.tx.dropped.fw_reason3;
729 	tgtobj->tx.dropped.age_out += srcobj->stats.tx.dropped.age_out;
730 	tgtobj->rx.err.mic_err += srcobj->stats.rx.err.mic_err;
731 	if (srcobj->stats.rx.rssi != 0)
732 		tgtobj->rx.rssi = srcobj->stats.rx.rssi;
733 	tgtobj->rx.rx_rate = srcobj->stats.rx.rx_rate;
734 	tgtobj->rx.err.decrypt_err += srcobj->stats.rx.err.decrypt_err;
735 	tgtobj->rx.non_ampdu_cnt += srcobj->stats.rx.non_ampdu_cnt;
736 	tgtobj->rx.amsdu_cnt += srcobj->stats.rx.ampdu_cnt;
737 	tgtobj->rx.non_amsdu_cnt += srcobj->stats.rx.non_amsdu_cnt;
738 	tgtobj->rx.amsdu_cnt += srcobj->stats.rx.amsdu_cnt;
739 	tgtobj->rx.nawds_mcast_drop += srcobj->stats.rx.nawds_mcast_drop;
740 	tgtobj->rx.to_stack.num += srcobj->stats.rx.to_stack.num;
741 	tgtobj->rx.to_stack.bytes += srcobj->stats.rx.to_stack.bytes;
742 
743 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
744 		tgtobj->rx.rcvd_reo[i].num +=
745 			srcobj->stats.rx.rcvd_reo[i].num;
746 		tgtobj->rx.rcvd_reo[i].bytes +=
747 			srcobj->stats.rx.rcvd_reo[i].bytes;
748 	}
749 
750 	srcobj->stats.rx.unicast.num =
751 		srcobj->stats.rx.to_stack.num -
752 				srcobj->stats.rx.multicast.num;
753 	srcobj->stats.rx.unicast.bytes =
754 		srcobj->stats.rx.to_stack.bytes -
755 				srcobj->stats.rx.multicast.bytes;
756 
757 	tgtobj->rx.unicast.num += srcobj->stats.rx.unicast.num;
758 	tgtobj->rx.unicast.bytes += srcobj->stats.rx.unicast.bytes;
759 	tgtobj->rx.multicast.num += srcobj->stats.rx.multicast.num;
760 	tgtobj->rx.multicast.bytes += srcobj->stats.rx.multicast.bytes;
761 	tgtobj->rx.bcast.num += srcobj->stats.rx.bcast.num;
762 	tgtobj->rx.bcast.bytes += srcobj->stats.rx.bcast.bytes;
763 	tgtobj->rx.raw.num += srcobj->stats.rx.raw.num;
764 	tgtobj->rx.raw.bytes += srcobj->stats.rx.raw.bytes;
765 	tgtobj->rx.intra_bss.pkts.num +=
766 			srcobj->stats.rx.intra_bss.pkts.num;
767 	tgtobj->rx.intra_bss.pkts.bytes +=
768 			srcobj->stats.rx.intra_bss.pkts.bytes;
769 	tgtobj->rx.intra_bss.fail.num +=
770 			srcobj->stats.rx.intra_bss.fail.num;
771 	tgtobj->rx.intra_bss.fail.bytes +=
772 			srcobj->stats.rx.intra_bss.fail.bytes;
773 	tgtobj->tx.last_ack_rssi =
774 		srcobj->stats.tx.last_ack_rssi;
775 	tgtobj->rx.mec_drop.num += srcobj->stats.rx.mec_drop.num;
776 	tgtobj->rx.mec_drop.bytes += srcobj->stats.rx.mec_drop.bytes;
777 }
778 
779 #define DP_UPDATE_STATS(_tgtobj, _srcobj)	\
780 	do {				\
781 		uint8_t i;		\
782 		uint8_t pream_type;	\
783 		for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \
784 			for (i = 0; i < MAX_MCS; i++) { \
785 				DP_STATS_AGGR(_tgtobj, _srcobj, \
786 					tx.pkt_type[pream_type].mcs_count[i]); \
787 				DP_STATS_AGGR(_tgtobj, _srcobj, \
788 					rx.pkt_type[pream_type].mcs_count[i]); \
789 			} \
790 		} \
791 		  \
792 		for (i = 0; i < MAX_BW; i++) { \
793 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.bw[i]); \
794 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.bw[i]); \
795 		} \
796 		  \
797 		for (i = 0; i < SS_COUNT; i++) { \
798 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.nss[i]); \
799 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.nss[i]); \
800 		} \
801 		for (i = 0; i < WME_AC_MAX; i++) { \
802 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.wme_ac_type[i]); \
803 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.wme_ac_type[i]); \
804 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.excess_retries_per_ac[i]); \
805 		\
806 		} \
807 		\
808 		for (i = 0; i < MAX_GI; i++) { \
809 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.sgi_count[i]); \
810 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.sgi_count[i]); \
811 		} \
812 		\
813 		for (i = 0; i < MAX_RECEPTION_TYPES; i++) \
814 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.reception_type[i]); \
815 		\
816 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.comp_pkt); \
817 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.ucast); \
818 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.mcast); \
819 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.bcast); \
820 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_success); \
821 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.nawds_mcast); \
822 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.nawds_mcast_drop); \
823 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.tx_failed); \
824 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ofdma); \
825 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.stbc); \
826 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ldpc); \
827 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.retries); \
828 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.non_amsdu_cnt); \
829 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.amsdu_cnt); \
830 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.non_ampdu_cnt); \
831 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ampdu_cnt); \
832 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.dropped.fw_rem); \
833 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_tx); \
834 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_notx); \
835 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason1); \
836 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason2); \
837 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason3); \
838 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.age_out); \
839 								\
840 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.mic_err); \
841 		if (_srcobj->stats.rx.rssi != 0) \
842 			DP_STATS_UPD_STRUCT(_tgtobj, _srcobj, rx.rssi); \
843 		DP_STATS_UPD_STRUCT(_tgtobj, _srcobj, rx.rx_rate); \
844 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.decrypt_err); \
845 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.non_ampdu_cnt); \
846 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.ampdu_cnt); \
847 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.non_amsdu_cnt); \
848 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.amsdu_cnt); \
849 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.nawds_mcast_drop); \
850 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.to_stack); \
851 								\
852 		for (i = 0; i <  CDP_MAX_RX_RINGS; i++)	\
853 			DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rcvd_reo[i]); \
854 									\
855 		_srcobj->stats.rx.unicast.num = \
856 			_srcobj->stats.rx.to_stack.num - \
857 					_srcobj->stats.rx.multicast.num; \
858 		_srcobj->stats.rx.unicast.bytes = \
859 			_srcobj->stats.rx.to_stack.bytes - \
860 					_srcobj->stats.rx.multicast.bytes; \
861 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.unicast); \
862 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.multicast); \
863 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.bcast); \
864 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.raw); \
865 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.intra_bss.pkts); \
866 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.intra_bss.fail); \
867 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.mec_drop); \
868 								  \
869 		_tgtobj->stats.tx.last_ack_rssi =	\
870 			_srcobj->stats.tx.last_ack_rssi; \
871 	}  while (0)
872 
873 extern int dp_peer_find_attach(struct dp_soc *soc);
874 extern void dp_peer_find_detach(struct dp_soc *soc);
875 extern void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer);
876 extern void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer);
877 extern void dp_peer_find_hash_erase(struct dp_soc *soc);
878 
879 /*
880  * dp_peer_ppdu_delayed_ba_init() Initialize ppdu in peer
881  * @peer: Datapath peer
882  *
883  * return: void
884  */
885 void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer);
886 
887 /*
888  * dp_peer_ppdu_delayed_ba_cleanup() free ppdu allocated in peer
889  * @peer: Datapath peer
890  *
891  * return: void
892  */
893 void dp_peer_ppdu_delayed_ba_cleanup(struct dp_peer *peer);
894 
895 extern void dp_peer_rx_init(struct dp_pdev *pdev, struct dp_peer *peer);
896 void dp_peer_tx_init(struct dp_pdev *pdev, struct dp_peer *peer);
897 void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer,
898 		     bool reuse);
899 void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer,
900 			bool reuse);
901 void dp_peer_unref_delete(struct dp_peer *peer);
902 extern void *dp_find_peer_by_addr(struct cdp_pdev *dev,
903 	uint8_t *peer_mac_addr);
904 extern struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
905 	uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id);
906 
907 #ifdef DP_PEER_EXTENDED_API
908 QDF_STATUS dp_register_peer(struct cdp_pdev *pdev_handle,
909 		struct ol_txrx_desc_type *sta_desc);
910 QDF_STATUS dp_clear_peer(struct cdp_pdev *pdev_handle,
911 			 struct qdf_mac_addr peer_addr);
912 void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle,
913 		struct cdp_vdev *vdev,
914 		uint8_t *peer_addr);
915 QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac,
916 		enum ol_txrx_peer_state state);
917 QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id);
918 struct cdp_vdev *dp_get_vdev_by_peer_addr(struct cdp_pdev *pdev_handle,
919 		struct qdf_mac_addr peer_addr);
920 struct cdp_vdev *dp_get_vdev_for_peer(void *peer);
921 uint8_t *dp_peer_get_peer_mac_addr(void *peer);
922 int dp_get_peer_state(void *peer_handle);
923 void dp_local_peer_id_pool_init(struct dp_pdev *pdev);
924 void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer);
925 void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer);
926 #else
927 static inline
928 QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id)
929 {
930 	return QDF_STATUS_E_NOSUPPORT;
931 }
932 
933 static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev)
934 {
935 }
936 
937 static inline
938 void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer)
939 {
940 }
941 
942 static inline
943 void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer)
944 {
945 }
946 #endif
947 int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc,
948 				      uint8_t *peer_mac, uint16_t vdev_id,
949 				      uint8_t tid,
950 				      int status);
951 int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc,
952 				  uint8_t *peer_mac, uint16_t vdev_id,
953 				  uint8_t dialogtoken, uint16_t tid,
954 				  uint16_t batimeout,
955 				  uint16_t buffersize,
956 				  uint16_t startseqnum);
957 QDF_STATUS dp_addba_responsesetup_wifi3(struct cdp_soc_t *cdp_soc,
958 					uint8_t *peer_mac, uint16_t vdev_id,
959 					uint8_t tid, uint8_t *dialogtoken,
960 					uint16_t *statuscode,
961 					uint16_t *buffersize,
962 					uint16_t *batimeout);
963 QDF_STATUS dp_set_addba_response(struct cdp_soc_t *cdp_soc,
964 				 uint8_t *peer_mac,
965 				 uint16_t vdev_id, uint8_t tid,
966 				 uint16_t statuscode);
967 int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
968 			   uint16_t vdev_id, int tid,
969 			   uint16_t reasoncode);
970 /*
971  * dp_delba_tx_completion_wifi3() -  Handle delba tx completion
972  *
973  * @cdp_soc: soc handle
974  * @vdev_id: id of the vdev handle
975  * @peer_mac: peer mac address
976  * @tid: Tid number
977  * @status: Tx completion status
978  * Indicate status of delba Tx to DP for stats update and retry
979  * delba if tx failed.
980  *
981  */
982 int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
983 				 uint16_t vdev_id, uint8_t tid,
984 				 int status);
985 extern QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
986 					uint32_t ba_window_size,
987 					uint32_t start_seq);
988 
989 extern QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc,
990 	enum hal_reo_cmd_type type, struct hal_reo_cmd_params *params,
991 	void (*callback_fn), void *data);
992 
993 extern void dp_reo_cmdlist_destroy(struct dp_soc *soc);
994 
995 /**
996  * dp_reo_status_ring_handler - Handler for REO Status ring
997  * @int_ctx: pointer to DP interrupt context
998  * @soc: DP Soc handle
999  *
1000  * Returns: Number of descriptors reaped
1001  */
1002 uint32_t dp_reo_status_ring_handler(struct dp_intr *int_ctx,
1003 				    struct dp_soc *soc);
1004 void dp_aggregate_vdev_stats(struct dp_vdev *vdev,
1005 			     struct cdp_vdev_stats *vdev_stats);
1006 void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt,
1007 	union hal_reo_status *reo_status);
1008 void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt,
1009 		union hal_reo_status *reo_status);
1010 QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev,
1011 		uint32_t stats_type_upload_mask, uint32_t config_param_0,
1012 		uint32_t config_param_1, uint32_t config_param_2,
1013 		uint32_t config_param_3, int cookie, int cookie_msb,
1014 		uint8_t mac_id);
1015 void dp_htt_stats_print_tag(struct dp_pdev *pdev,
1016 			    uint8_t tag_type, uint32_t *tag_buf);
1017 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf);
1018 void dp_peer_rxtid_stats(struct dp_peer *peer, void (*callback_fn),
1019 		void *cb_ctxt);
1020 QDF_STATUS
1021 dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
1022 		      uint8_t *peer_mac, enum cdp_sec_type sec_type,
1023 		      uint32_t *rx_pn);
1024 
1025 void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id);
1026 void dp_set_michael_key(struct cdp_peer *peer_handle,
1027 			bool is_unicast, uint32_t *key);
1028 
1029 /**
1030  * dp_check_pdev_exists() - Validate pdev before use
1031  * @soc - dp soc handle
1032  * @data - pdev handle
1033  *
1034  * Return: 0 - success/invalid - failure
1035  */
1036 bool dp_check_pdev_exists(struct dp_soc *soc, struct dp_pdev *data);
1037 
1038 /**
1039  * dp_update_delay_stats() - Update delay statistics in structure
1040  *                              and fill min, max and avg delay
1041  * @pdev: pdev handle
1042  * @delay: delay in ms
1043  * @tid: tid value
1044  * @mode: type of tx delay mode
1045  * @ring id: ring number
1046  *
1047  * Return: none
1048  */
1049 void dp_update_delay_stats(struct dp_pdev *pdev, uint32_t delay,
1050 			   uint8_t tid, uint8_t mode, uint8_t ring_id);
1051 
1052 /**
1053  * dp_print_ring_stats(): Print tail and head pointer
1054  * @pdev: DP_PDEV handle
1055  *
1056  * Return:void
1057  */
1058 void dp_print_ring_stats(struct dp_pdev *pdev);
1059 
1060 /**
1061  * dp_print_pdev_cfg_params() - Print the pdev cfg parameters
1062  * @pdev_handle: DP pdev handle
1063  *
1064  * Return - void
1065  */
1066 void dp_print_pdev_cfg_params(struct dp_pdev *pdev);
1067 
1068 /**
1069  * dp_print_soc_cfg_params()- Dump soc wlan config parameters
1070  * @soc_handle: Soc handle
1071  *
1072  * Return: void
1073  */
1074 void dp_print_soc_cfg_params(struct dp_soc *soc);
1075 
1076 /**
1077  * dp_srng_get_str_from_ring_type() - Return string name for a ring
1078  * @ring_type: Ring
1079  *
1080  * Return: char const pointer
1081  */
1082 const
1083 char *dp_srng_get_str_from_hal_ring_type(enum hal_ring_type ring_type);
1084 
1085 /*
1086  * dp_txrx_path_stats() - Function to display dump stats
1087  * @soc - soc handle
1088  *
1089  * return: none
1090  */
1091 void dp_txrx_path_stats(struct dp_soc *soc);
1092 
1093 /*
1094  * dp_print_per_ring_stats(): Packet count per ring
1095  * @soc - soc handle
1096  *
1097  * Return - None
1098  */
1099 void dp_print_per_ring_stats(struct dp_soc *soc);
1100 
1101 /**
1102  * dp_aggregate_pdev_stats(): Consolidate stats at PDEV level
1103  * @pdev: DP PDEV handle
1104  *
1105  * return: void
1106  */
1107 void dp_aggregate_pdev_stats(struct dp_pdev *pdev);
1108 
1109 /**
1110  * dp_print_rx_rates(): Print Rx rate stats
1111  * @vdev: DP_VDEV handle
1112  *
1113  * Return:void
1114  */
1115 void dp_print_rx_rates(struct dp_vdev *vdev);
1116 
1117 /**
1118  * dp_print_tx_rates(): Print tx rates
1119  * @vdev: DP_VDEV handle
1120  *
1121  * Return:void
1122  */
1123 void dp_print_tx_rates(struct dp_vdev *vdev);
1124 
1125 /**
1126  * dp_print_peer_stats():print peer stats
1127  * @peer: DP_PEER handle
1128  *
1129  * return void
1130  */
1131 void dp_print_peer_stats(struct dp_peer *peer);
1132 
1133 /**
1134  * dp_print_pdev_tx_stats(): Print Pdev level TX stats
1135  * @pdev: DP_PDEV Handle
1136  *
1137  * Return:void
1138  */
1139 void
1140 dp_print_pdev_tx_stats(struct dp_pdev *pdev);
1141 
1142 /**
1143  * dp_print_pdev_rx_stats(): Print Pdev level RX stats
1144  * @pdev: DP_PDEV Handle
1145  *
1146  * Return: void
1147  */
1148 void
1149 dp_print_pdev_rx_stats(struct dp_pdev *pdev);
1150 
1151 /**
1152  * dp_print_pdev_rx_mon_stats(): Print Pdev level RX monitor stats
1153  * @pdev: DP_PDEV Handle
1154  *
1155  * Return: void
1156  */
1157 void
1158 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev);
1159 
1160 /**
1161  * dp_print_soc_tx_stats(): Print SOC level  stats
1162  * @soc DP_SOC Handle
1163  *
1164  * Return: void
1165  */
1166 void dp_print_soc_tx_stats(struct dp_soc *soc);
1167 
1168 /**
1169  * dp_print_soc_interrupt_stats() - Print interrupt stats for the soc
1170  * @soc: dp_soc handle
1171  *
1172  * Return: None
1173  */
1174 void dp_print_soc_interrupt_stats(struct dp_soc *soc);
1175 
1176 /**
1177  * dp_print_soc_rx_stats: Print SOC level Rx stats
1178  * @soc: DP_SOC Handle
1179  *
1180  * Return:void
1181  */
1182 void dp_print_soc_rx_stats(struct dp_soc *soc);
1183 
1184 /**
1185  * dp_get_mac_id_for_pdev() -  Return mac corresponding to pdev for mac
1186  *
1187  * @mac_id: MAC id
1188  * @pdev_id: pdev_id corresponding to pdev, 0 for MCL
1189  *
1190  * Single pdev using both MACs will operate on both MAC rings,
1191  * which is the case for MCL.
1192  * For WIN each PDEV will operate one ring, so index is zero.
1193  *
1194  */
1195 static inline int dp_get_mac_id_for_pdev(uint32_t mac_id, uint32_t pdev_id)
1196 {
1197 	if (mac_id && pdev_id) {
1198 		qdf_print("Both mac_id and pdev_id cannot be non zero");
1199 		QDF_BUG(0);
1200 		return 0;
1201 	}
1202 	return (mac_id + pdev_id);
1203 }
1204 
1205 /*
1206  * dp_get_mac_id_for_mac() -  Return mac corresponding WIN and MCL mac_ids
1207  *
1208  * @soc: handle to DP soc
1209  * @mac_id: MAC id
1210  *
1211  * Single pdev using both MACs will operate on both MAC rings,
1212  * which is the case for MCL.
1213  * For WIN each PDEV will operate one ring, so index is zero.
1214  *
1215  */
1216 static inline int dp_get_mac_id_for_mac(struct dp_soc *soc, uint32_t mac_id)
1217 {
1218 	/*
1219 	 * Single pdev using both MACs will operate on both MAC rings,
1220 	 * which is the case for MCL.
1221 	 */
1222 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
1223 		return mac_id;
1224 
1225 	/* For WIN each PDEV will operate one ring, so index is zero. */
1226 	return 0;
1227 }
1228 
1229 bool dp_is_soc_reinit(struct dp_soc *soc);
1230 
1231 /*
1232  * dp_is_subtype_data() - check if the frame subtype is data
1233  *
1234  * @frame_ctrl: Frame control field
1235  *
1236  * check the frame control field and verify if the packet
1237  * is a data packet.
1238  *
1239  * Return: true or false
1240  */
1241 static inline bool dp_is_subtype_data(uint16_t frame_ctrl)
1242 {
1243 	if (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_TYPE_MASK) ==
1244 	    QDF_IEEE80211_FC0_TYPE_DATA) &&
1245 	    (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
1246 	    QDF_IEEE80211_FC0_SUBTYPE_DATA) ||
1247 	    ((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
1248 	    QDF_IEEE80211_FC0_SUBTYPE_QOS))) {
1249 		return true;
1250 	}
1251 
1252 	return false;
1253 }
1254 
1255 #ifdef WDI_EVENT_ENABLE
1256 QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
1257 				uint32_t stats_type_upload_mask,
1258 				uint8_t mac_id);
1259 
1260 int dp_wdi_event_unsub(struct cdp_pdev *txrx_pdev_handle,
1261 	void *event_cb_sub_handle,
1262 	uint32_t event);
1263 
1264 int dp_wdi_event_sub(struct cdp_pdev *txrx_pdev_handle,
1265 	void *event_cb_sub_handle,
1266 	uint32_t event);
1267 
1268 void dp_wdi_event_handler(enum WDI_EVENT event, struct dp_soc *soc,
1269 			  void *data, u_int16_t peer_id,
1270 			  int status, u_int8_t pdev_id);
1271 
1272 int dp_wdi_event_attach(struct dp_pdev *txrx_pdev);
1273 int dp_wdi_event_detach(struct dp_pdev *txrx_pdev);
1274 int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
1275 	bool enable);
1276 void *dp_get_pldev(struct cdp_pdev *txrx_pdev);
1277 void dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn);
1278 
1279 static inline void
1280 dp_hif_update_pipe_callback(struct dp_soc *dp_soc,
1281 			    void *cb_context,
1282 			    QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t),
1283 			    uint8_t pipe_id)
1284 {
1285 	struct hif_msg_callbacks hif_pipe_callbacks;
1286 
1287 	/* TODO: Temporary change to bypass HTC connection for this new
1288 	 * HIF pipe, which will be used for packet log and other high-
1289 	 * priority HTT messages. Proper HTC connection to be added
1290 	 * later once required FW changes are available
1291 	 */
1292 	hif_pipe_callbacks.rxCompletionHandler = callback;
1293 	hif_pipe_callbacks.Context = cb_context;
1294 	hif_update_pipe_callback(dp_soc->hif_handle,
1295 		DP_HTT_T2H_HP_PIPE, &hif_pipe_callbacks);
1296 }
1297 
1298 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer);
1299 
1300 #else
1301 static inline int dp_wdi_event_unsub(struct cdp_pdev *txrx_pdev_handle,
1302 	void *event_cb_sub_handle,
1303 	uint32_t event)
1304 {
1305 	return 0;
1306 }
1307 
1308 static inline int dp_wdi_event_sub(struct cdp_pdev *txrx_pdev_handle,
1309 	void *event_cb_sub_handle,
1310 	uint32_t event)
1311 {
1312 	return 0;
1313 }
1314 
1315 static inline
1316 void dp_wdi_event_handler(enum WDI_EVENT event,
1317 			  struct dp_soc *soc,
1318 			  void *data, u_int16_t peer_id,
1319 			  int status, u_int8_t pdev_id)
1320 {
1321 }
1322 
1323 static inline int dp_wdi_event_attach(struct dp_pdev *txrx_pdev)
1324 {
1325 	return 0;
1326 }
1327 
1328 static inline int dp_wdi_event_detach(struct dp_pdev *txrx_pdev)
1329 {
1330 	return 0;
1331 }
1332 
1333 static inline int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
1334 	bool enable)
1335 {
1336 	return 0;
1337 }
1338 static inline QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
1339 		uint32_t stats_type_upload_mask, uint8_t mac_id)
1340 {
1341 	return 0;
1342 }
1343 
1344 static inline void
1345 dp_hif_update_pipe_callback(struct dp_soc *dp_soc, void *cb_context,
1346 			    QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t),
1347 			    uint8_t pipe_id)
1348 {
1349 }
1350 
1351 static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev,
1352 					      struct dp_peer *peer)
1353 {
1354 	return QDF_STATUS_SUCCESS;
1355 }
1356 
1357 #endif /* CONFIG_WIN */
1358 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
1359 void dp_tx_dump_flow_pool_info(struct cdp_soc_t *soc_hdl);
1360 int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool,
1361 	bool force);
1362 #endif /* QCA_LL_TX_FLOW_CONTROL_V2 */
1363 
1364 #ifdef PEER_PROTECTED_ACCESS
1365 /**
1366  * dp_peer_unref_del_find_by_id() - dec ref and del peer if ref count is
1367  *                                  taken by dp_peer_find_by_id
1368  * @peer: peer context
1369  *
1370  * Return: none
1371  */
1372 static inline void dp_peer_unref_del_find_by_id(struct dp_peer *peer)
1373 {
1374 	dp_peer_unref_delete(peer);
1375 }
1376 #else
1377 static inline void dp_peer_unref_del_find_by_id(struct dp_peer *peer)
1378 {
1379 }
1380 #endif
1381 
1382 #ifdef WLAN_FEATURE_DP_EVENT_HISTORY
1383 /**
1384  * dp_srng_access_start() - Wrapper function to log access start of a hal ring
1385  * @int_ctx: pointer to DP interrupt context
1386  * @soc: DP Soc handle
1387  * @hal_ring: opaque pointer to the HAL Rx Error Ring, which will be serviced
1388  *
1389  * Return: 0 on success; error on failure
1390  */
1391 int dp_srng_access_start(struct dp_intr *int_ctx, struct dp_soc *dp_soc,
1392 			 hal_ring_handle_t hal_ring_hdl);
1393 
1394 /**
1395  * dp_srng_access_end() - Wrapper function to log access end of a hal ring
1396  * @int_ctx: pointer to DP interrupt context
1397  * @soc: DP Soc handle
1398  * @hal_ring: opaque pointer to the HAL Rx Error Ring, which will be serviced
1399  *
1400  * Return: void
1401  */
1402 void dp_srng_access_end(struct dp_intr *int_ctx, struct dp_soc *dp_soc,
1403 			hal_ring_handle_t hal_ring_hdl);
1404 
1405 #else
1406 
1407 static inline int dp_srng_access_start(struct dp_intr *int_ctx,
1408 				       struct dp_soc *dp_soc,
1409 				       hal_ring_handle_t hal_ring_hdl)
1410 {
1411 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1412 
1413 	return hal_srng_access_start(hal_soc, hal_ring_hdl);
1414 }
1415 
1416 static inline void dp_srng_access_end(struct dp_intr *int_ctx,
1417 				      struct dp_soc *dp_soc,
1418 				      hal_ring_handle_t hal_ring_hdl)
1419 {
1420 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1421 
1422 	return hal_srng_access_end(hal_soc, hal_ring_hdl);
1423 }
1424 #endif /* WLAN_FEATURE_DP_EVENT_HISTORY */
1425 
1426 #ifdef QCA_ENH_V3_STATS_SUPPORT
1427 /**
1428  * dp_pdev_print_delay_stats(): Print pdev level delay stats
1429  * @pdev: DP_PDEV handle
1430  *
1431  * Return:void
1432  */
1433 void dp_pdev_print_delay_stats(struct dp_pdev *pdev);
1434 
1435 /**
1436  * dp_pdev_print_tid_stats(): Print pdev level tid stats
1437  * @pdev: DP_PDEV handle
1438  *
1439  * Return:void
1440  */
1441 void dp_pdev_print_tid_stats(struct dp_pdev *pdev);
1442 #endif /* CONFIG_WIN */
1443 
1444 void dp_soc_set_txrx_ring_map(struct dp_soc *soc);
1445 
1446 #ifndef WLAN_TX_PKT_CAPTURE_ENH
1447 /**
1448  * dp_tx_ppdu_stats_attach - Initialize Tx PPDU stats and enhanced capture
1449  * @pdev: DP PDEV
1450  *
1451  * Return: none
1452  */
1453 static inline void dp_tx_ppdu_stats_attach(struct dp_pdev *pdev)
1454 {
1455 }
1456 
1457 /**
1458  * dp_tx_ppdu_stats_detach - Cleanup Tx PPDU stats and enhanced capture
1459  * @pdev: DP PDEV
1460  *
1461  * Return: none
1462  */
1463 static inline void dp_tx_ppdu_stats_detach(struct dp_pdev *pdev)
1464 {
1465 }
1466 
1467 /**
1468  * dp_tx_ppdu_stats_process - Deferred PPDU stats handler
1469  * @context: Opaque work context (PDEV)
1470  *
1471  * Return: none
1472  */
1473 static  inline void dp_tx_ppdu_stats_process(void *context)
1474 {
1475 }
1476 
1477 /**
1478  * dp_tx_add_to_comp_queue() - add completion msdu to queue
1479  * @soc: DP Soc handle
1480  * @tx_desc: software Tx descriptor
1481  * @ts : Tx completion status from HAL/HTT descriptor
1482  * @peer: DP peer
1483  *
1484  * Return: none
1485  */
1486 static inline
1487 QDF_STATUS dp_tx_add_to_comp_queue(struct dp_soc *soc,
1488 				   struct dp_tx_desc_s *desc,
1489 				   struct hal_tx_completion_status *ts,
1490 				   struct dp_peer *peer)
1491 {
1492 	return QDF_STATUS_E_FAILURE;
1493 }
1494 
1495 /*
1496  * dp_tx_capture_htt_frame_counter: increment counter for htt_frame_type
1497  * pdev: DP pdev handle
1498  * htt_frame_type: htt frame type received from fw
1499  *
1500  * return: void
1501  */
1502 static inline
1503 void dp_tx_capture_htt_frame_counter(struct dp_pdev *pdev,
1504 				     uint32_t htt_frame_type)
1505 {
1506 }
1507 
1508 /*
1509  * dp_tx_cature_stats: print tx capture stats
1510  * @pdev: DP PDEV handle
1511  *
1512  * return: void
1513  */
1514 static inline
1515 void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
1516 {
1517 }
1518 
1519 #endif
1520 
1521 #ifdef FEATURE_PERPKT_INFO
1522 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf);
1523 #else
1524 static inline
1525 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
1526 {
1527 }
1528 #endif
1529 
1530 /**
1531  * dp_vdev_to_cdp_vdev() - typecast dp vdev to cdp vdev
1532  * @vdev: DP vdev handle
1533  *
1534  * Return: struct cdp_vdev pointer
1535  */
1536 static inline
1537 struct cdp_vdev *dp_vdev_to_cdp_vdev(struct dp_vdev *vdev)
1538 {
1539 	return (struct cdp_vdev *)vdev;
1540 }
1541 
1542 /**
1543  * dp_pdev_to_cdp_pdev() - typecast dp pdev to cdp pdev
1544  * @pdev: DP pdev handle
1545  *
1546  * Return: struct cdp_pdev pointer
1547  */
1548 static inline
1549 struct cdp_pdev *dp_pdev_to_cdp_pdev(struct dp_pdev *pdev)
1550 {
1551 	return (struct cdp_pdev *)pdev;
1552 }
1553 
1554 /**
1555  * dp_soc_to_cdp_soc() - typecast dp psoc to cdp psoc
1556  * @psoc: DP psoc handle
1557  *
1558  * Return: struct cdp_soc pointer
1559  */
1560 static inline
1561 struct cdp_soc *dp_soc_to_cdp_soc(struct dp_soc *psoc)
1562 {
1563 	return (struct cdp_soc *)psoc;
1564 }
1565 
1566 /**
1567  * dp_soc_to_cdp_soc_t() - typecast dp psoc to
1568  * ol txrx soc handle
1569  * @psoc: DP psoc handle
1570  *
1571  * Return: struct cdp_soc_t pointer
1572  */
1573 static inline
1574 struct cdp_soc_t *dp_soc_to_cdp_soc_t(struct dp_soc *psoc)
1575 {
1576 	return (struct cdp_soc_t *)psoc;
1577 }
1578 
1579 /**
1580  * cdp_soc_t_to_dp_soc() - typecast cdp_soc_t to
1581  * dp soc handle
1582  * @psoc: CDP psoc handle
1583  *
1584  * Return: struct dp_soc pointer
1585  */
1586 static inline
1587 struct dp_soc *cdp_soc_t_to_dp_soc(struct cdp_soc_t *psoc)
1588 {
1589 	return (struct dp_soc *)psoc;
1590 }
1591 
1592 #ifdef WLAN_SUPPORT_RX_FLOW_TAG
1593 /**
1594  * dp_rx_flow_update_fse_stats() - Update a flow's statistics
1595  * @pdev: pdev handle
1596  * @flow_id: flow index (truncated hash) in the Rx FST
1597  *
1598  * Return: Success when flow statistcs is updated, error on failure
1599  */
1600 QDF_STATUS dp_rx_flow_get_fse_stats(struct dp_pdev *pdev,
1601 				    struct cdp_rx_flow_info *rx_flow_info,
1602 				    struct cdp_flow_stats *stats);
1603 
1604 /**
1605  * dp_rx_flow_delete_entry() - Delete a flow entry from flow search table
1606  * @pdev: pdev handle
1607  * @rx_flow_info: DP flow parameters
1608  *
1609  * Return: Success when flow is deleted, error on failure
1610  */
1611 QDF_STATUS dp_rx_flow_delete_entry(struct dp_pdev *pdev,
1612 				   struct cdp_rx_flow_info *rx_flow_info);
1613 
1614 /**
1615  * dp_rx_flow_add_entry() - Add a flow entry to flow search table
1616  * @pdev: DP pdev instance
1617  * @rx_flow_info: DP flow paramaters
1618  *
1619  * Return: Success when flow is added, no-memory or already exists on error
1620  */
1621 QDF_STATUS dp_rx_flow_add_entry(struct dp_pdev *pdev,
1622 				struct cdp_rx_flow_info *rx_flow_info);
1623 
1624 /**
1625  * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters
1626  * @soc: SoC handle
1627  * @pdev: Pdev handle
1628  *
1629  * Return: Handle to flow search table entry
1630  */
1631 QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev);
1632 
1633 /**
1634  * dp_rx_fst_detach() - De-initialize Rx FST
1635  * @soc: SoC handle
1636  * @pdev: Pdev handle
1637  *
1638  * Return: None
1639  */
1640 void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev);
1641 
1642 /**
1643  * dp_rx_flow_send_fst_fw_setup() - Program FST parameters in FW/HW post-attach
1644  * @soc: SoC handle
1645  * @pdev: Pdev handle
1646  *
1647  * Return: Success when fst parameters are programmed in FW, error otherwise
1648  */
1649 QDF_STATUS dp_rx_flow_send_fst_fw_setup(struct dp_soc *soc,
1650 					struct dp_pdev *pdev);
1651 #else
1652 /**
1653  * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters
1654  * @soc: SoC handle
1655  * @pdev: Pdev handle
1656  *
1657  * Return: Handle to flow search table entry
1658  */
1659 static inline
1660 QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev)
1661 {
1662 	return QDF_STATUS_SUCCESS;
1663 }
1664 
1665 /**
1666  * dp_rx_fst_detach() - De-initialize Rx FST
1667  * @soc: SoC handle
1668  * @pdev: Pdev handle
1669  *
1670  * Return: None
1671  */
1672 static inline
1673 void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev)
1674 {
1675 }
1676 #endif /* WLAN_SUPPORT_RX_FLOW_TAG */
1677 
1678 /**
1679  * dp_get_vdev_from_soc_vdev_id_wifi3() - Returns vdev object given the vdev id
1680  * @soc: core DP soc context
1681  * @vdev_id: vdev id from vdev object can be retrieved
1682  *
1683  * Return: struct dp_vdev*: Pointer to DP vdev object
1684  */
1685 static inline struct dp_vdev *
1686 dp_get_vdev_from_soc_vdev_id_wifi3(struct dp_soc *soc,
1687 				   uint8_t vdev_id)
1688 {
1689 	if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
1690 		return NULL;
1691 
1692 	return soc->vdev_id_map[vdev_id];
1693 }
1694 
1695 /**
1696  * dp_get_pdev_from_soc_pdev_id_wifi3() - Returns pdev object given the pdev id
1697  * @soc: core DP soc context
1698  * @pdev_id: pdev id from pdev object can be retrieved
1699  *
1700  * Return: struct dp_pdev*: Pointer to DP pdev object
1701  */
1702 static inline struct dp_pdev *
1703 dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc,
1704 				   uint8_t pdev_id)
1705 {
1706 	if (qdf_unlikely(pdev_id >= MAX_PDEV_CNT))
1707 		return NULL;
1708 
1709 	return soc->pdev_list[pdev_id];
1710 }
1711 
1712 /*
1713  * dp_rx_tid_update_wifi3() – Update receive TID state
1714  * @peer: Datapath peer handle
1715  * @tid: TID
1716  * @ba_window_size: BlockAck window size
1717  * @start_seq: Starting sequence number
1718  *
1719  * Return: QDF_STATUS code
1720  */
1721 QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
1722 					 ba_window_size, uint32_t start_seq);
1723 
1724 #endif /* #ifndef _DP_INTERNAL_H_ */
1725