xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_internal.h (revision 11f5a63a6cbdda84849a730de22f0a71e635d58c)
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, uint8_t *peer_id);
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, uint8_t *local_id);
915 uint16_t dp_local_peer_id(void *peer);
916 void *dp_peer_find_by_local_id(struct cdp_pdev *pdev_handle, uint8_t local_id);
917 QDF_STATUS dp_peer_state_update(struct cdp_pdev *pdev_handle, uint8_t *peer_mac,
918 		enum ol_txrx_peer_state state);
919 QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id);
920 struct cdp_vdev *dp_get_vdev_by_peer_addr(struct cdp_pdev *pdev_handle,
921 		struct qdf_mac_addr peer_addr);
922 struct cdp_vdev *dp_get_vdev_for_peer(void *peer);
923 uint8_t *dp_peer_get_peer_mac_addr(void *peer);
924 int dp_get_peer_state(void *peer_handle);
925 void dp_local_peer_id_pool_init(struct dp_pdev *pdev);
926 void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer);
927 void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer);
928 #else
929 static inline
930 QDF_STATUS dp_get_vdevid(void *peer_handle, uint8_t *vdev_id)
931 {
932 	return QDF_STATUS_E_NOSUPPORT;
933 }
934 
935 static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev)
936 {
937 }
938 
939 static inline
940 void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer)
941 {
942 }
943 
944 static inline
945 void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer)
946 {
947 }
948 #endif
949 int dp_addba_resp_tx_completion_wifi3(void *peer_handle, uint8_t tid,
950 	int status);
951 extern int dp_addba_requestprocess_wifi3(void *peer_handle,
952 	uint8_t dialogtoken, uint16_t tid, uint16_t batimeout,
953 	uint16_t buffersize, uint16_t startseqnum);
954 extern void dp_addba_responsesetup_wifi3(void *peer_handle, uint8_t tid,
955 	uint8_t *dialogtoken, uint16_t *statuscode,
956 	uint16_t *buffersize, uint16_t *batimeout);
957 extern void dp_set_addba_response(void *peer_handle, uint8_t tid,
958 	uint16_t statuscode);
959 extern int dp_delba_process_wifi3(void *peer_handle,
960 	int tid, uint16_t reasoncode);
961 /*
962  * dp_delba_tx_completion_wifi3() -  Handle delba tx completion
963  *
964  * @peer_handle: Peer handle
965  * @tid: Tid number
966  * @status: Tx completion status
967  * Indicate status of delba Tx to DP for stats update and retry
968  * delba if tx failed.
969  *
970  */
971 int dp_delba_tx_completion_wifi3(void *peer_handle, uint8_t tid,
972 				  int status);
973 extern QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
974 					uint32_t ba_window_size,
975 					uint32_t start_seq);
976 
977 extern QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc,
978 	enum hal_reo_cmd_type type, struct hal_reo_cmd_params *params,
979 	void (*callback_fn), void *data);
980 
981 extern void dp_reo_cmdlist_destroy(struct dp_soc *soc);
982 
983 /**
984  * dp_reo_status_ring_handler - Handler for REO Status ring
985  * @int_ctx: pointer to DP interrupt context
986  * @soc: DP Soc handle
987  *
988  * Returns: Number of descriptors reaped
989  */
990 uint32_t dp_reo_status_ring_handler(struct dp_intr *int_ctx,
991 				    struct dp_soc *soc);
992 void dp_aggregate_vdev_stats(struct dp_vdev *vdev,
993 			     struct cdp_vdev_stats *vdev_stats);
994 void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt,
995 	union hal_reo_status *reo_status);
996 void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt,
997 		union hal_reo_status *reo_status);
998 QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev,
999 		uint32_t stats_type_upload_mask, uint32_t config_param_0,
1000 		uint32_t config_param_1, uint32_t config_param_2,
1001 		uint32_t config_param_3, int cookie, int cookie_msb,
1002 		uint8_t mac_id);
1003 void dp_htt_stats_print_tag(struct dp_pdev *pdev,
1004 			    uint8_t tag_type, uint32_t *tag_buf);
1005 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf);
1006 void dp_peer_rxtid_stats(struct dp_peer *peer, void (*callback_fn),
1007 		void *cb_ctxt);
1008 void dp_set_pn_check_wifi3(struct cdp_vdev *vdev_handle,
1009 	struct cdp_peer *peer_handle, enum cdp_sec_type sec_type,
1010 	 uint32_t *rx_pn);
1011 
1012 void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id);
1013 void dp_set_michael_key(struct cdp_peer *peer_handle,
1014 			bool is_unicast, uint32_t *key);
1015 
1016 /**
1017  * dp_check_pdev_exists() - Validate pdev before use
1018  * @soc - dp soc handle
1019  * @data - pdev handle
1020  *
1021  * Return: 0 - success/invalid - failure
1022  */
1023 bool dp_check_pdev_exists(struct dp_soc *soc, struct dp_pdev *data);
1024 
1025 /**
1026  * dp_update_delay_stats() - Update delay statistics in structure
1027  *                              and fill min, max and avg delay
1028  * @pdev: pdev handle
1029  * @delay: delay in ms
1030  * @tid: tid value
1031  * @mode: type of tx delay mode
1032  * @ring id: ring number
1033  *
1034  * Return: none
1035  */
1036 void dp_update_delay_stats(struct dp_pdev *pdev, uint32_t delay,
1037 			   uint8_t tid, uint8_t mode, uint8_t ring_id);
1038 
1039 /**
1040  * dp_print_ring_stats(): Print tail and head pointer
1041  * @pdev: DP_PDEV handle
1042  *
1043  * Return:void
1044  */
1045 void dp_print_ring_stats(struct dp_pdev *pdev);
1046 
1047 /**
1048  * dp_print_pdev_cfg_params() - Print the pdev cfg parameters
1049  * @pdev_handle: DP pdev handle
1050  *
1051  * Return - void
1052  */
1053 void dp_print_pdev_cfg_params(struct dp_pdev *pdev);
1054 
1055 /**
1056  * dp_print_soc_cfg_params()- Dump soc wlan config parameters
1057  * @soc_handle: Soc handle
1058  *
1059  * Return: void
1060  */
1061 void dp_print_soc_cfg_params(struct dp_soc *soc);
1062 
1063 /**
1064  * dp_srng_get_str_from_ring_type() - Return string name for a ring
1065  * @ring_type: Ring
1066  *
1067  * Return: char const pointer
1068  */
1069 const
1070 char *dp_srng_get_str_from_hal_ring_type(enum hal_ring_type ring_type);
1071 
1072 /*
1073  * dp_txrx_path_stats() - Function to display dump stats
1074  * @soc - soc handle
1075  *
1076  * return: none
1077  */
1078 void dp_txrx_path_stats(struct dp_soc *soc);
1079 
1080 /*
1081  * dp_print_per_ring_stats(): Packet count per ring
1082  * @soc - soc handle
1083  *
1084  * Return - None
1085  */
1086 void dp_print_per_ring_stats(struct dp_soc *soc);
1087 
1088 /**
1089  * dp_aggregate_pdev_stats(): Consolidate stats at PDEV level
1090  * @pdev: DP PDEV handle
1091  *
1092  * return: void
1093  */
1094 void dp_aggregate_pdev_stats(struct dp_pdev *pdev);
1095 
1096 /**
1097  * dp_print_rx_rates(): Print Rx rate stats
1098  * @vdev: DP_VDEV handle
1099  *
1100  * Return:void
1101  */
1102 void dp_print_rx_rates(struct dp_vdev *vdev);
1103 
1104 /**
1105  * dp_print_tx_rates(): Print tx rates
1106  * @vdev: DP_VDEV handle
1107  *
1108  * Return:void
1109  */
1110 void dp_print_tx_rates(struct dp_vdev *vdev);
1111 
1112 /**
1113  * dp_print_peer_stats():print peer stats
1114  * @peer: DP_PEER handle
1115  *
1116  * return void
1117  */
1118 void dp_print_peer_stats(struct dp_peer *peer);
1119 
1120 /**
1121  * dp_print_pdev_tx_stats(): Print Pdev level TX stats
1122  * @pdev: DP_PDEV Handle
1123  *
1124  * Return:void
1125  */
1126 void
1127 dp_print_pdev_tx_stats(struct dp_pdev *pdev);
1128 
1129 /**
1130  * dp_print_pdev_rx_stats(): Print Pdev level RX stats
1131  * @pdev: DP_PDEV Handle
1132  *
1133  * Return: void
1134  */
1135 void
1136 dp_print_pdev_rx_stats(struct dp_pdev *pdev);
1137 
1138 /**
1139  * dp_print_pdev_rx_mon_stats(): Print Pdev level RX monitor stats
1140  * @pdev: DP_PDEV Handle
1141  *
1142  * Return: void
1143  */
1144 void
1145 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev);
1146 
1147 /**
1148  * dp_print_soc_tx_stats(): Print SOC level  stats
1149  * @soc DP_SOC Handle
1150  *
1151  * Return: void
1152  */
1153 void dp_print_soc_tx_stats(struct dp_soc *soc);
1154 
1155 /**
1156  * dp_print_soc_interrupt_stats() - Print interrupt stats for the soc
1157  * @soc: dp_soc handle
1158  *
1159  * Return: None
1160  */
1161 void dp_print_soc_interrupt_stats(struct dp_soc *soc);
1162 
1163 /**
1164  * dp_print_soc_rx_stats: Print SOC level Rx stats
1165  * @soc: DP_SOC Handle
1166  *
1167  * Return:void
1168  */
1169 void dp_print_soc_rx_stats(struct dp_soc *soc);
1170 
1171 /**
1172  * dp_get_mac_id_for_pdev() -  Return mac corresponding to pdev for mac
1173  *
1174  * @mac_id: MAC id
1175  * @pdev_id: pdev_id corresponding to pdev, 0 for MCL
1176  *
1177  * Single pdev using both MACs will operate on both MAC rings,
1178  * which is the case for MCL.
1179  * For WIN each PDEV will operate one ring, so index is zero.
1180  *
1181  */
1182 static inline int dp_get_mac_id_for_pdev(uint32_t mac_id, uint32_t pdev_id)
1183 {
1184 	if (mac_id && pdev_id) {
1185 		qdf_print("Both mac_id and pdev_id cannot be non zero");
1186 		QDF_BUG(0);
1187 		return 0;
1188 	}
1189 	return (mac_id + pdev_id);
1190 }
1191 
1192 /*
1193  * dp_get_mac_id_for_mac() -  Return mac corresponding WIN and MCL mac_ids
1194  *
1195  * @soc: handle to DP soc
1196  * @mac_id: MAC id
1197  *
1198  * Single pdev using both MACs will operate on both MAC rings,
1199  * which is the case for MCL.
1200  * For WIN each PDEV will operate one ring, so index is zero.
1201  *
1202  */
1203 static inline int dp_get_mac_id_for_mac(struct dp_soc *soc, uint32_t mac_id)
1204 {
1205 	/*
1206 	 * Single pdev using both MACs will operate on both MAC rings,
1207 	 * which is the case for MCL.
1208 	 */
1209 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
1210 		return mac_id;
1211 
1212 	/* For WIN each PDEV will operate one ring, so index is zero. */
1213 	return 0;
1214 }
1215 
1216 bool dp_is_soc_reinit(struct dp_soc *soc);
1217 
1218 /*
1219  * dp_is_subtype_data() - check if the frame subtype is data
1220  *
1221  * @frame_ctrl: Frame control field
1222  *
1223  * check the frame control field and verify if the packet
1224  * is a data packet.
1225  *
1226  * Return: true or false
1227  */
1228 static inline bool dp_is_subtype_data(uint16_t frame_ctrl)
1229 {
1230 	if (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_TYPE_MASK) ==
1231 	    QDF_IEEE80211_FC0_TYPE_DATA) &&
1232 	    (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
1233 	    QDF_IEEE80211_FC0_SUBTYPE_DATA) ||
1234 	    ((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
1235 	    QDF_IEEE80211_FC0_SUBTYPE_QOS))) {
1236 		return true;
1237 	}
1238 
1239 	return false;
1240 }
1241 
1242 #ifdef WDI_EVENT_ENABLE
1243 QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
1244 				uint32_t stats_type_upload_mask,
1245 				uint8_t mac_id);
1246 
1247 int dp_wdi_event_unsub(struct cdp_pdev *txrx_pdev_handle,
1248 	void *event_cb_sub_handle,
1249 	uint32_t event);
1250 
1251 int dp_wdi_event_sub(struct cdp_pdev *txrx_pdev_handle,
1252 	void *event_cb_sub_handle,
1253 	uint32_t event);
1254 
1255 void dp_wdi_event_handler(enum WDI_EVENT event, struct dp_soc *soc,
1256 			  void *data, u_int16_t peer_id,
1257 			  int status, u_int8_t pdev_id);
1258 
1259 int dp_wdi_event_attach(struct dp_pdev *txrx_pdev);
1260 int dp_wdi_event_detach(struct dp_pdev *txrx_pdev);
1261 int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
1262 	bool enable);
1263 void *dp_get_pldev(struct cdp_pdev *txrx_pdev);
1264 void dp_pkt_log_init(struct cdp_pdev *ppdev, void *scn);
1265 
1266 static inline void
1267 dp_hif_update_pipe_callback(struct dp_soc *dp_soc,
1268 			    void *cb_context,
1269 			    QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t),
1270 			    uint8_t pipe_id)
1271 {
1272 	struct hif_msg_callbacks hif_pipe_callbacks;
1273 
1274 	/* TODO: Temporary change to bypass HTC connection for this new
1275 	 * HIF pipe, which will be used for packet log and other high-
1276 	 * priority HTT messages. Proper HTC connection to be added
1277 	 * later once required FW changes are available
1278 	 */
1279 	hif_pipe_callbacks.rxCompletionHandler = callback;
1280 	hif_pipe_callbacks.Context = cb_context;
1281 	hif_update_pipe_callback(dp_soc->hif_handle,
1282 		DP_HTT_T2H_HP_PIPE, &hif_pipe_callbacks);
1283 }
1284 
1285 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer);
1286 
1287 #else
1288 static inline int dp_wdi_event_unsub(struct cdp_pdev *txrx_pdev_handle,
1289 	void *event_cb_sub_handle,
1290 	uint32_t event)
1291 {
1292 	return 0;
1293 }
1294 
1295 static inline int dp_wdi_event_sub(struct cdp_pdev *txrx_pdev_handle,
1296 	void *event_cb_sub_handle,
1297 	uint32_t event)
1298 {
1299 	return 0;
1300 }
1301 
1302 static inline
1303 void dp_wdi_event_handler(enum WDI_EVENT event,
1304 			  struct dp_soc *soc,
1305 			  void *data, u_int16_t peer_id,
1306 			  int status, u_int8_t pdev_id)
1307 {
1308 }
1309 
1310 static inline int dp_wdi_event_attach(struct dp_pdev *txrx_pdev)
1311 {
1312 	return 0;
1313 }
1314 
1315 static inline int dp_wdi_event_detach(struct dp_pdev *txrx_pdev)
1316 {
1317 	return 0;
1318 }
1319 
1320 static inline int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
1321 	bool enable)
1322 {
1323 	return 0;
1324 }
1325 static inline QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
1326 		uint32_t stats_type_upload_mask, uint8_t mac_id)
1327 {
1328 	return 0;
1329 }
1330 
1331 static inline void
1332 dp_hif_update_pipe_callback(struct dp_soc *dp_soc, void *cb_context,
1333 			    QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t),
1334 			    uint8_t pipe_id)
1335 {
1336 }
1337 
1338 static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev,
1339 					      struct dp_peer *peer)
1340 {
1341 	return QDF_STATUS_SUCCESS;
1342 }
1343 
1344 #endif /* CONFIG_WIN */
1345 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
1346 void dp_tx_dump_flow_pool_info(void *soc);
1347 int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool,
1348 	bool force);
1349 #endif /* QCA_LL_TX_FLOW_CONTROL_V2 */
1350 
1351 #ifdef PEER_PROTECTED_ACCESS
1352 /**
1353  * dp_peer_unref_del_find_by_id() - dec ref and del peer if ref count is
1354  *                                  taken by dp_peer_find_by_id
1355  * @peer: peer context
1356  *
1357  * Return: none
1358  */
1359 static inline void dp_peer_unref_del_find_by_id(struct dp_peer *peer)
1360 {
1361 	dp_peer_unref_delete(peer);
1362 }
1363 #else
1364 static inline void dp_peer_unref_del_find_by_id(struct dp_peer *peer)
1365 {
1366 }
1367 #endif
1368 
1369 #ifdef WLAN_FEATURE_DP_EVENT_HISTORY
1370 /**
1371  * dp_srng_access_start() - Wrapper function to log access start of a hal ring
1372  * @int_ctx: pointer to DP interrupt context
1373  * @soc: DP Soc handle
1374  * @hal_ring: opaque pointer to the HAL Rx Error Ring, which will be serviced
1375  *
1376  * Return: 0 on success; error on failure
1377  */
1378 int dp_srng_access_start(struct dp_intr *int_ctx, struct dp_soc *dp_soc,
1379 			 hal_ring_handle_t hal_ring_hdl);
1380 
1381 /**
1382  * dp_srng_access_end() - Wrapper function to log access end of a hal ring
1383  * @int_ctx: pointer to DP interrupt context
1384  * @soc: DP Soc handle
1385  * @hal_ring: opaque pointer to the HAL Rx Error Ring, which will be serviced
1386  *
1387  * Return: void
1388  */
1389 void dp_srng_access_end(struct dp_intr *int_ctx, struct dp_soc *dp_soc,
1390 			hal_ring_handle_t hal_ring_hdl);
1391 
1392 #else
1393 
1394 static inline int dp_srng_access_start(struct dp_intr *int_ctx,
1395 				       struct dp_soc *dp_soc,
1396 				       hal_ring_handle_t hal_ring_hdl)
1397 {
1398 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1399 
1400 	return hal_srng_access_start(hal_soc, hal_ring_hdl);
1401 }
1402 
1403 static inline void dp_srng_access_end(struct dp_intr *int_ctx,
1404 				      struct dp_soc *dp_soc,
1405 				      hal_ring_handle_t hal_ring_hdl)
1406 {
1407 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1408 
1409 	return hal_srng_access_end(hal_soc, hal_ring_hdl);
1410 }
1411 #endif /* WLAN_FEATURE_DP_EVENT_HISTORY */
1412 
1413 #ifdef QCA_ENH_V3_STATS_SUPPORT
1414 /**
1415  * dp_pdev_print_delay_stats(): Print pdev level delay stats
1416  * @pdev: DP_PDEV handle
1417  *
1418  * Return:void
1419  */
1420 void dp_pdev_print_delay_stats(struct dp_pdev *pdev);
1421 
1422 /**
1423  * dp_pdev_print_tid_stats(): Print pdev level tid stats
1424  * @pdev: DP_PDEV handle
1425  *
1426  * Return:void
1427  */
1428 void dp_pdev_print_tid_stats(struct dp_pdev *pdev);
1429 #endif /* CONFIG_WIN */
1430 
1431 void dp_soc_set_txrx_ring_map(struct dp_soc *soc);
1432 
1433 #ifndef WLAN_TX_PKT_CAPTURE_ENH
1434 /**
1435  * dp_tx_ppdu_stats_attach - Initialize Tx PPDU stats and enhanced capture
1436  * @pdev: DP PDEV
1437  *
1438  * Return: none
1439  */
1440 static inline void dp_tx_ppdu_stats_attach(struct dp_pdev *pdev)
1441 {
1442 }
1443 
1444 /**
1445  * dp_tx_ppdu_stats_detach - Cleanup Tx PPDU stats and enhanced capture
1446  * @pdev: DP PDEV
1447  *
1448  * Return: none
1449  */
1450 static inline void dp_tx_ppdu_stats_detach(struct dp_pdev *pdev)
1451 {
1452 }
1453 
1454 /**
1455  * dp_tx_ppdu_stats_process - Deferred PPDU stats handler
1456  * @context: Opaque work context (PDEV)
1457  *
1458  * Return: none
1459  */
1460 static  inline void dp_tx_ppdu_stats_process(void *context)
1461 {
1462 }
1463 
1464 /**
1465  * dp_tx_add_to_comp_queue() - add completion msdu to queue
1466  * @soc: DP Soc handle
1467  * @tx_desc: software Tx descriptor
1468  * @ts : Tx completion status from HAL/HTT descriptor
1469  * @peer: DP peer
1470  *
1471  * Return: none
1472  */
1473 static inline
1474 QDF_STATUS dp_tx_add_to_comp_queue(struct dp_soc *soc,
1475 				   struct dp_tx_desc_s *desc,
1476 				   struct hal_tx_completion_status *ts,
1477 				   struct dp_peer *peer)
1478 {
1479 	return QDF_STATUS_E_FAILURE;
1480 }
1481 #endif
1482 
1483 #ifdef FEATURE_PERPKT_INFO
1484 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf);
1485 #else
1486 static inline
1487 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
1488 {
1489 }
1490 #endif
1491 
1492 /**
1493  * dp_vdev_to_cdp_vdev() - typecast dp vdev to cdp vdev
1494  * @vdev: DP vdev handle
1495  *
1496  * Return: struct cdp_vdev pointer
1497  */
1498 static inline
1499 struct cdp_vdev *dp_vdev_to_cdp_vdev(struct dp_vdev *vdev)
1500 {
1501 	return (struct cdp_vdev *)vdev;
1502 }
1503 
1504 /**
1505  * dp_pdev_to_cdp_pdev() - typecast dp pdev to cdp pdev
1506  * @pdev: DP pdev handle
1507  *
1508  * Return: struct cdp_pdev pointer
1509  */
1510 static inline
1511 struct cdp_pdev *dp_pdev_to_cdp_pdev(struct dp_pdev *pdev)
1512 {
1513 	return (struct cdp_pdev *)pdev;
1514 }
1515 
1516 /**
1517  * dp_soc_to_cdp_soc() - typecast dp psoc to cdp psoc
1518  * @psoc: DP psoc handle
1519  *
1520  * Return: struct cdp_soc pointer
1521  */
1522 static inline
1523 struct cdp_soc *dp_soc_to_cdp_soc(struct dp_soc *psoc)
1524 {
1525 	return (struct cdp_soc *)psoc;
1526 }
1527 
1528 /**
1529  * dp_soc_to_cdp_soc_t() - typecast dp psoc to
1530  * ol txrx soc handle
1531  * @psoc: DP psoc handle
1532  *
1533  * Return: struct cdp_soc_t pointer
1534  */
1535 static inline
1536 struct cdp_soc_t *dp_soc_to_cdp_soc_t(struct dp_soc *psoc)
1537 {
1538 	return (struct cdp_soc_t *)psoc;
1539 }
1540 
1541 /**
1542  * cdp_soc_t_to_dp_soc() - typecast cdp_soc_t to
1543  * dp soc handle
1544  * @psoc: CDP psoc handle
1545  *
1546  * Return: struct dp_soc pointer
1547  */
1548 static inline
1549 struct dp_soc *cdp_soc_t_to_dp_soc(struct cdp_soc_t *psoc)
1550 {
1551 	return (struct dp_soc *)psoc;
1552 }
1553 
1554 #ifdef WLAN_SUPPORT_RX_FLOW_TAG
1555 /**
1556  * dp_rx_flow_update_fse_stats() - Update a flow's statistics
1557  * @pdev: pdev handle
1558  * @flow_id: flow index (truncated hash) in the Rx FST
1559  *
1560  * Return: Success when flow statistcs is updated, error on failure
1561  */
1562 QDF_STATUS dp_rx_flow_get_fse_stats(struct dp_pdev *pdev,
1563 				    struct cdp_rx_flow_info *rx_flow_info,
1564 				    struct cdp_flow_stats *stats);
1565 
1566 /**
1567  * dp_rx_flow_delete_entry() - Delete a flow entry from flow search table
1568  * @pdev: pdev handle
1569  * @rx_flow_info: DP flow parameters
1570  *
1571  * Return: Success when flow is deleted, error on failure
1572  */
1573 QDF_STATUS dp_rx_flow_delete_entry(struct dp_pdev *pdev,
1574 				   struct cdp_rx_flow_info *rx_flow_info);
1575 
1576 /**
1577  * dp_rx_flow_add_entry() - Add a flow entry to flow search table
1578  * @pdev: DP pdev instance
1579  * @rx_flow_info: DP flow paramaters
1580  *
1581  * Return: Success when flow is added, no-memory or already exists on error
1582  */
1583 QDF_STATUS dp_rx_flow_add_entry(struct dp_pdev *pdev,
1584 				struct cdp_rx_flow_info *rx_flow_info);
1585 
1586 /**
1587  * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters
1588  * @soc: SoC handle
1589  * @pdev: Pdev handle
1590  *
1591  * Return: Handle to flow search table entry
1592  */
1593 QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev);
1594 
1595 /**
1596  * dp_rx_fst_detach() - De-initialize Rx FST
1597  * @soc: SoC handle
1598  * @pdev: Pdev handle
1599  *
1600  * Return: None
1601  */
1602 void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev);
1603 
1604 /**
1605  * dp_rx_flow_send_fst_fw_setup() - Program FST parameters in FW/HW post-attach
1606  * @soc: SoC handle
1607  * @pdev: Pdev handle
1608  *
1609  * Return: Success when fst parameters are programmed in FW, error otherwise
1610  */
1611 QDF_STATUS dp_rx_flow_send_fst_fw_setup(struct dp_soc *soc,
1612 					struct dp_pdev *pdev);
1613 #else
1614 /**
1615  * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters
1616  * @soc: SoC handle
1617  * @pdev: Pdev handle
1618  *
1619  * Return: Handle to flow search table entry
1620  */
1621 static inline
1622 QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev)
1623 {
1624 	return QDF_STATUS_SUCCESS;
1625 }
1626 
1627 /**
1628  * dp_rx_fst_detach() - De-initialize Rx FST
1629  * @soc: SoC handle
1630  * @pdev: Pdev handle
1631  *
1632  * Return: None
1633  */
1634 static inline
1635 void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev)
1636 {
1637 }
1638 #endif /* WLAN_SUPPORT_RX_FLOW_TAG */
1639 
1640 /**
1641  * dp_get_vdev_from_soc_vdev_id_wifi3() - Returns vdev object given the vdev id
1642  * @soc: core DP soc context
1643  * @vdev_id: vdev id from vdev object can be retrieved
1644  *
1645  * Return: struct dp_vdev*: Pointer to DP vdev object
1646  */
1647 static inline struct dp_vdev *
1648 dp_get_vdev_from_soc_vdev_id_wifi3(struct dp_soc *soc,
1649 				   uint8_t vdev_id)
1650 {
1651 	if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
1652 		return NULL;
1653 
1654 	return soc->vdev_id_map[vdev_id];
1655 }
1656 
1657 /**
1658  * dp_get_pdev_from_soc_pdev_id_wifi3() - Returns pdev object given the pdev id
1659  * @soc: core DP soc context
1660  * @pdev_id: pdev id from pdev object can be retrieved
1661  *
1662  * Return: struct dp_pdev*: Pointer to DP pdev object
1663  */
1664 static inline struct dp_pdev *
1665 dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc,
1666 				   uint8_t pdev_id)
1667 {
1668 	if (qdf_unlikely(pdev_id >= MAX_PDEV_CNT))
1669 		return NULL;
1670 
1671 	return soc->pdev_list[pdev_id];
1672 }
1673 
1674 #endif /* #ifndef _DP_INTERNAL_H_ */
1675