xref: /wlan-dirver/qca-wifi-host-cmn/dp/wifi3.0/dp_internal.h (revision 6d768494e5ce14eb1603a695c86739d12ecc6ec2)
1 /*
2  * Copyright (c) 2016-2020 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 #define DP_PEER_WDS_COUNT_INVALID UINT_MAX
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 #define DP_MAX_TIMER_EXEC_TIME_TICKS \
113 		(QDF_LOG_TIMESTAMP_CYCLES_PER_10_US * 100 * 20)
114 
115 /**
116  * enum timer_yield_status - yield status code used in monitor mode timer.
117  * @DP_TIMER_NO_YIELD: do not yield
118  * @DP_TIMER_WORK_DONE: yield because work is done
119  * @DP_TIMER_WORK_EXHAUST: yield because work quota is exhausted
120  * @DP_TIMER_TIME_EXHAUST: yield due to time slot exhausted
121  */
122 enum timer_yield_status {
123 	DP_TIMER_NO_YIELD,
124 	DP_TIMER_WORK_DONE,
125 	DP_TIMER_WORK_EXHAUST,
126 	DP_TIMER_TIME_EXHAUST,
127 };
128 
129 #if DP_PRINT_ENABLE
130 #include <stdarg.h>       /* va_list */
131 #include <qdf_types.h> /* qdf_vprint */
132 #include <cdp_txrx_handle.h>
133 
134 enum {
135 	/* FATAL_ERR - print only irrecoverable error messages */
136 	DP_PRINT_LEVEL_FATAL_ERR,
137 
138 	/* ERR - include non-fatal err messages */
139 	DP_PRINT_LEVEL_ERR,
140 
141 	/* WARN - include warnings */
142 	DP_PRINT_LEVEL_WARN,
143 
144 	/* INFO1 - include fundamental, infrequent events */
145 	DP_PRINT_LEVEL_INFO1,
146 
147 	/* INFO2 - include non-fundamental but infrequent events */
148 	DP_PRINT_LEVEL_INFO2,
149 };
150 
151 #define dp_print(level, fmt, ...) do { \
152 	if (level <= g_txrx_print_level) \
153 		qdf_print(fmt, ## __VA_ARGS__); \
154 while (0)
155 #define DP_PRINT(level, fmt, ...) do { \
156 	dp_print(level, "DP: " fmt, ## __VA_ARGS__); \
157 while (0)
158 #else
159 #define DP_PRINT(level, fmt, ...)
160 #endif /* DP_PRINT_ENABLE */
161 
162 #define DP_TRACE(LVL, fmt, args ...)                             \
163 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_##LVL,       \
164 		fmt, ## args)
165 
166 #ifdef DP_PRINT_NO_CONSOLE
167 /* Stat prints should not go to console or kernel logs.*/
168 #define DP_PRINT_STATS(fmt, args ...)\
169 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,       \
170 		  fmt, ## args)
171 #else
172 #define DP_PRINT_STATS(fmt, args ...)\
173 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,\
174 		  fmt, ## args)
175 #endif
176 #define DP_STATS_INIT(_handle) \
177 	qdf_mem_zero(&((_handle)->stats), sizeof((_handle)->stats))
178 
179 #define DP_STATS_CLR(_handle) \
180 	qdf_mem_zero(&((_handle)->stats), sizeof((_handle)->stats))
181 
182 #ifndef DISABLE_DP_STATS
183 #define DP_STATS_INC(_handle, _field, _delta) \
184 { \
185 	if (likely(_handle)) \
186 		_handle->stats._field += _delta; \
187 }
188 
189 #define DP_STATS_INCC(_handle, _field, _delta, _cond) \
190 { \
191 	if (_cond && likely(_handle)) \
192 		_handle->stats._field += _delta; \
193 }
194 
195 #define DP_STATS_DEC(_handle, _field, _delta) \
196 { \
197 	if (likely(_handle)) \
198 		_handle->stats._field -= _delta; \
199 }
200 
201 #define DP_STATS_UPD(_handle, _field, _delta) \
202 { \
203 	if (likely(_handle)) \
204 		_handle->stats._field = _delta; \
205 }
206 
207 #define DP_STATS_INC_PKT(_handle, _field, _count, _bytes) \
208 { \
209 	DP_STATS_INC(_handle, _field.num, _count); \
210 	DP_STATS_INC(_handle, _field.bytes, _bytes) \
211 }
212 
213 #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond) \
214 { \
215 	DP_STATS_INCC(_handle, _field.num, _count, _cond); \
216 	DP_STATS_INCC(_handle, _field.bytes, _bytes, _cond) \
217 }
218 
219 #define DP_STATS_AGGR(_handle_a, _handle_b, _field) \
220 { \
221 	_handle_a->stats._field += _handle_b->stats._field; \
222 }
223 
224 #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field) \
225 { \
226 	DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \
227 	DP_STATS_AGGR(_handle_a, _handle_b, _field.bytes);\
228 }
229 
230 #define DP_STATS_UPD_STRUCT(_handle_a, _handle_b, _field) \
231 { \
232 	_handle_a->stats._field = _handle_b->stats._field; \
233 }
234 
235 #else
236 #define DP_STATS_INC(_handle, _field, _delta)
237 #define DP_STATS_INCC(_handle, _field, _delta, _cond)
238 #define DP_STATS_DEC(_handle, _field, _delta)
239 #define DP_STATS_UPD(_handle, _field, _delta)
240 #define DP_STATS_INC_PKT(_handle, _field, _count, _bytes)
241 #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond)
242 #define DP_STATS_AGGR(_handle_a, _handle_b, _field)
243 #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field)
244 #endif
245 
246 #ifdef ENABLE_DP_HIST_STATS
247 #define DP_HIST_INIT() \
248 	uint32_t num_of_packets[MAX_PDEV_CNT] = {0};
249 
250 #define DP_HIST_PACKET_COUNT_INC(_pdev_id) \
251 { \
252 		++num_of_packets[_pdev_id]; \
253 }
254 
255 #define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
256 	do {                                                              \
257 		if (_p_cntrs == 1) {                                      \
258 			DP_STATS_INC(_pdev,                               \
259 				tx_comp_histogram.pkts_1, 1);             \
260 		} else if (_p_cntrs > 1 && _p_cntrs <= 20) {              \
261 			DP_STATS_INC(_pdev,                               \
262 				tx_comp_histogram.pkts_2_20, 1);          \
263 		} else if (_p_cntrs > 20 && _p_cntrs <= 40) {             \
264 			DP_STATS_INC(_pdev,                               \
265 				tx_comp_histogram.pkts_21_40, 1);         \
266 		} else if (_p_cntrs > 40 && _p_cntrs <= 60) {             \
267 			DP_STATS_INC(_pdev,                               \
268 				tx_comp_histogram.pkts_41_60, 1);         \
269 		} else if (_p_cntrs > 60 && _p_cntrs <= 80) {             \
270 			DP_STATS_INC(_pdev,                               \
271 				tx_comp_histogram.pkts_61_80, 1);         \
272 		} else if (_p_cntrs > 80 && _p_cntrs <= 100) {            \
273 			DP_STATS_INC(_pdev,                               \
274 				tx_comp_histogram.pkts_81_100, 1);        \
275 		} else if (_p_cntrs > 100 && _p_cntrs <= 200) {           \
276 			DP_STATS_INC(_pdev,                               \
277 				tx_comp_histogram.pkts_101_200, 1);       \
278 		} else if (_p_cntrs > 200) {                              \
279 			DP_STATS_INC(_pdev,                               \
280 				tx_comp_histogram.pkts_201_plus, 1);      \
281 		}                                                         \
282 	} while (0)
283 
284 #define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
285 	do {                                                              \
286 		if (_p_cntrs == 1) {                                      \
287 			DP_STATS_INC(_pdev,                               \
288 				rx_ind_histogram.pkts_1, 1);              \
289 		} else if (_p_cntrs > 1 && _p_cntrs <= 20) {              \
290 			DP_STATS_INC(_pdev,                               \
291 				rx_ind_histogram.pkts_2_20, 1);           \
292 		} else if (_p_cntrs > 20 && _p_cntrs <= 40) {             \
293 			DP_STATS_INC(_pdev,                               \
294 				rx_ind_histogram.pkts_21_40, 1);          \
295 		} else if (_p_cntrs > 40 && _p_cntrs <= 60) {             \
296 			DP_STATS_INC(_pdev,                               \
297 				rx_ind_histogram.pkts_41_60, 1);          \
298 		} else if (_p_cntrs > 60 && _p_cntrs <= 80) {             \
299 			DP_STATS_INC(_pdev,                               \
300 				rx_ind_histogram.pkts_61_80, 1);          \
301 		} else if (_p_cntrs > 80 && _p_cntrs <= 100) {            \
302 			DP_STATS_INC(_pdev,                               \
303 				rx_ind_histogram.pkts_81_100, 1);         \
304 		} else if (_p_cntrs > 100 && _p_cntrs <= 200) {           \
305 			DP_STATS_INC(_pdev,                               \
306 				rx_ind_histogram.pkts_101_200, 1);        \
307 		} else if (_p_cntrs > 200) {                              \
308 			DP_STATS_INC(_pdev,                               \
309 				rx_ind_histogram.pkts_201_plus, 1);       \
310 		}                                                         \
311 	} while (0)
312 
313 #define DP_TX_HIST_STATS_PER_PDEV() \
314 	do { \
315 		uint8_t hist_stats = 0; \
316 		for (hist_stats = 0; hist_stats < soc->pdev_count; \
317 				hist_stats++) { \
318 			DP_TX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
319 					num_of_packets[hist_stats]); \
320 		} \
321 	}  while (0)
322 
323 
324 #define DP_RX_HIST_STATS_PER_PDEV() \
325 	do { \
326 		uint8_t hist_stats = 0; \
327 		for (hist_stats = 0; hist_stats < soc->pdev_count; \
328 				hist_stats++) { \
329 			DP_RX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
330 					num_of_packets[hist_stats]); \
331 		} \
332 	}  while (0)
333 
334 #else
335 #define DP_HIST_INIT()
336 #define DP_HIST_PACKET_COUNT_INC(_pdev_id)
337 #define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
338 #define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
339 #define DP_RX_HIST_STATS_PER_PDEV()
340 #define DP_TX_HIST_STATS_PER_PDEV()
341 #endif /* DISABLE_DP_STATS */
342 
343 #ifdef QCA_SUPPORT_PEER_ISOLATION
344 #define dp_get_peer_isolation(_peer) ((_peer)->isolation)
345 
346 static inline void dp_set_peer_isolation(struct dp_peer *peer, bool val)
347 {
348 	peer->isolation = val;
349 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
350 		  "peer:%pM isolation:%d",
351 		  peer->mac_addr.raw, peer->isolation);
352 }
353 
354 #else
355 #define dp_get_peer_isolation(_peer) (0)
356 
357 static inline void dp_set_peer_isolation(struct dp_peer *peer, bool val)
358 {
359 }
360 #endif /* QCA_SUPPORT_PEER_ISOLATION */
361 
362 #ifdef FEATURE_TSO_STATS
363 /**
364  * dp_init_tso_stats() - Clear tso stats
365  * @pdev: pdev handle
366  *
367  * Return: None
368  */
369 static inline
370 void dp_init_tso_stats(struct dp_pdev *pdev)
371 {
372 	if (pdev) {
373 		qdf_mem_zero(&((pdev)->stats.tso_stats),
374 			     sizeof((pdev)->stats.tso_stats));
375 		qdf_atomic_init(&pdev->tso_idx);
376 	}
377 }
378 
379 /**
380  * dp_stats_tso_segment_histogram_update() - TSO Segment Histogram
381  * @pdev: pdev handle
382  * @_p_cntrs: number of tso segments for a tso packet
383  *
384  * Return: None
385  */
386 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
387 					   uint8_t _p_cntrs);
388 
389 /**
390  * dp_tso_segment_update() - Collect tso segment information
391  * @pdev: pdev handle
392  * @stats_idx: tso packet number
393  * @idx: tso segment number
394  * @seg: tso segment
395  *
396  * Return: None
397  */
398 void dp_tso_segment_update(struct dp_pdev *pdev,
399 			   uint32_t stats_idx,
400 			   uint8_t idx,
401 			   struct qdf_tso_seg_t seg);
402 
403 /**
404  * dp_tso_packet_update() - TSO Packet information
405  * @pdev: pdev handle
406  * @stats_idx: tso packet number
407  * @msdu: nbuf handle
408  * @num_segs: tso segments
409  *
410  * Return: None
411  */
412 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
413 			  qdf_nbuf_t msdu, uint16_t num_segs);
414 
415 /**
416  * dp_tso_segment_stats_update() - TSO Segment stats
417  * @pdev: pdev handle
418  * @stats_seg: tso segment list
419  * @stats_idx: tso packet number
420  *
421  * Return: None
422  */
423 void dp_tso_segment_stats_update(struct dp_pdev *pdev,
424 				 struct qdf_tso_seg_elem_t *stats_seg,
425 				 uint32_t stats_idx);
426 
427 /**
428  * dp_print_tso_stats() - dump tso statistics
429  * @soc:soc handle
430  * @level: verbosity level
431  *
432  * Return: None
433  */
434 void dp_print_tso_stats(struct dp_soc *soc,
435 			enum qdf_stats_verbosity_level level);
436 
437 /**
438  * dp_txrx_clear_tso_stats() - clear tso stats
439  * @soc: soc handle
440  *
441  * Return: None
442  */
443 void dp_txrx_clear_tso_stats(struct dp_soc *soc);
444 #else
445 static inline
446 void dp_init_tso_stats(struct dp_pdev *pdev)
447 {
448 }
449 
450 static inline
451 void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
452 					   uint8_t _p_cntrs)
453 {
454 }
455 
456 static inline
457 void dp_tso_segment_update(struct dp_pdev *pdev,
458 			   uint32_t stats_idx,
459 			   uint32_t idx,
460 			   struct qdf_tso_seg_t seg)
461 {
462 }
463 
464 static inline
465 void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
466 			  qdf_nbuf_t msdu, uint16_t num_segs)
467 {
468 }
469 
470 static inline
471 void dp_tso_segment_stats_update(struct dp_pdev *pdev,
472 				 struct qdf_tso_seg_elem_t *stats_seg,
473 				 uint32_t stats_idx)
474 {
475 }
476 
477 static inline
478 void dp_print_tso_stats(struct dp_soc *soc,
479 			enum qdf_stats_verbosity_level level)
480 {
481 }
482 
483 static inline
484 void dp_txrx_clear_tso_stats(struct dp_soc *soc)
485 {
486 }
487 #endif /* FEATURE_TSO_STATS */
488 
489 #define DP_HTT_T2H_HP_PIPE 5
490 static inline void dp_update_pdev_stats(struct dp_pdev *tgtobj,
491 					struct cdp_vdev_stats *srcobj)
492 {
493 	uint8_t i;
494 	uint8_t pream_type;
495 
496 	for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
497 		for (i = 0; i < MAX_MCS; i++) {
498 			tgtobj->stats.tx.pkt_type[pream_type].
499 				mcs_count[i] +=
500 			srcobj->tx.pkt_type[pream_type].
501 				mcs_count[i];
502 			tgtobj->stats.rx.pkt_type[pream_type].
503 				mcs_count[i] +=
504 			srcobj->rx.pkt_type[pream_type].
505 				mcs_count[i];
506 		}
507 	}
508 
509 	for (i = 0; i < MAX_BW; i++) {
510 		tgtobj->stats.tx.bw[i] += srcobj->tx.bw[i];
511 		tgtobj->stats.rx.bw[i] += srcobj->rx.bw[i];
512 	}
513 
514 	for (i = 0; i < SS_COUNT; i++) {
515 		tgtobj->stats.tx.nss[i] += srcobj->tx.nss[i];
516 		tgtobj->stats.rx.nss[i] += srcobj->rx.nss[i];
517 	}
518 
519 	for (i = 0; i < WME_AC_MAX; i++) {
520 		tgtobj->stats.tx.wme_ac_type[i] +=
521 			srcobj->tx.wme_ac_type[i];
522 		tgtobj->stats.rx.wme_ac_type[i] +=
523 			srcobj->rx.wme_ac_type[i];
524 		tgtobj->stats.tx.excess_retries_per_ac[i] +=
525 			srcobj->tx.excess_retries_per_ac[i];
526 	}
527 
528 	for (i = 0; i < MAX_GI; i++) {
529 		tgtobj->stats.tx.sgi_count[i] +=
530 			srcobj->tx.sgi_count[i];
531 		tgtobj->stats.rx.sgi_count[i] +=
532 			srcobj->rx.sgi_count[i];
533 	}
534 
535 	for (i = 0; i < MAX_RECEPTION_TYPES; i++)
536 		tgtobj->stats.rx.reception_type[i] +=
537 			srcobj->rx.reception_type[i];
538 
539 	tgtobj->stats.tx.comp_pkt.bytes += srcobj->tx.comp_pkt.bytes;
540 	tgtobj->stats.tx.comp_pkt.num += srcobj->tx.comp_pkt.num;
541 	tgtobj->stats.tx.ucast.num += srcobj->tx.ucast.num;
542 	tgtobj->stats.tx.ucast.bytes += srcobj->tx.ucast.bytes;
543 	tgtobj->stats.tx.mcast.num += srcobj->tx.mcast.num;
544 	tgtobj->stats.tx.mcast.bytes += srcobj->tx.mcast.bytes;
545 	tgtobj->stats.tx.bcast.num += srcobj->tx.bcast.num;
546 	tgtobj->stats.tx.bcast.bytes += srcobj->tx.bcast.bytes;
547 	tgtobj->stats.tx.tx_success.num += srcobj->tx.tx_success.num;
548 	tgtobj->stats.tx.tx_success.bytes +=
549 		srcobj->tx.tx_success.bytes;
550 	tgtobj->stats.tx.nawds_mcast.num +=
551 		srcobj->tx.nawds_mcast.num;
552 	tgtobj->stats.tx.nawds_mcast.bytes +=
553 		srcobj->tx.nawds_mcast.bytes;
554 	tgtobj->stats.tx.nawds_mcast_drop +=
555 		srcobj->tx.nawds_mcast_drop;
556 	tgtobj->stats.tx.num_ppdu_cookie_valid +=
557 		srcobj->tx.num_ppdu_cookie_valid;
558 	tgtobj->stats.tx.tx_failed += srcobj->tx.tx_failed;
559 	tgtobj->stats.tx.ofdma += srcobj->tx.ofdma;
560 	tgtobj->stats.tx.stbc += srcobj->tx.stbc;
561 	tgtobj->stats.tx.ldpc += srcobj->tx.ldpc;
562 	tgtobj->stats.tx.retries += srcobj->tx.retries;
563 	tgtobj->stats.tx.non_amsdu_cnt += srcobj->tx.non_amsdu_cnt;
564 	tgtobj->stats.tx.amsdu_cnt += srcobj->tx.amsdu_cnt;
565 	tgtobj->stats.tx.non_ampdu_cnt += srcobj->tx.non_ampdu_cnt;
566 	tgtobj->stats.tx.ampdu_cnt += srcobj->tx.ampdu_cnt;
567 	tgtobj->stats.tx.dropped.fw_rem.num += srcobj->tx.dropped.fw_rem.num;
568 	tgtobj->stats.tx.dropped.fw_rem.bytes +=
569 			srcobj->tx.dropped.fw_rem.bytes;
570 	tgtobj->stats.tx.dropped.fw_rem_tx +=
571 			srcobj->tx.dropped.fw_rem_tx;
572 	tgtobj->stats.tx.dropped.fw_rem_notx +=
573 			srcobj->tx.dropped.fw_rem_notx;
574 	tgtobj->stats.tx.dropped.fw_reason1 +=
575 			srcobj->tx.dropped.fw_reason1;
576 	tgtobj->stats.tx.dropped.fw_reason2 +=
577 			srcobj->tx.dropped.fw_reason2;
578 	tgtobj->stats.tx.dropped.fw_reason3 +=
579 			srcobj->tx.dropped.fw_reason3;
580 	tgtobj->stats.tx.dropped.age_out += srcobj->tx.dropped.age_out;
581 	tgtobj->stats.rx.err.mic_err += srcobj->rx.err.mic_err;
582 	if (srcobj->rx.rssi != 0)
583 		tgtobj->stats.rx.rssi = srcobj->rx.rssi;
584 	tgtobj->stats.rx.rx_rate = srcobj->rx.rx_rate;
585 	tgtobj->stats.rx.err.decrypt_err += srcobj->rx.err.decrypt_err;
586 	tgtobj->stats.rx.non_ampdu_cnt += srcobj->rx.non_ampdu_cnt;
587 	tgtobj->stats.rx.amsdu_cnt += srcobj->rx.ampdu_cnt;
588 	tgtobj->stats.rx.non_amsdu_cnt += srcobj->rx.non_amsdu_cnt;
589 	tgtobj->stats.rx.amsdu_cnt += srcobj->rx.amsdu_cnt;
590 	tgtobj->stats.rx.nawds_mcast_drop += srcobj->rx.nawds_mcast_drop;
591 	tgtobj->stats.rx.to_stack.num += srcobj->rx.to_stack.num;
592 	tgtobj->stats.rx.to_stack.bytes += srcobj->rx.to_stack.bytes;
593 
594 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
595 		tgtobj->stats.rx.rcvd_reo[i].num +=
596 			srcobj->rx.rcvd_reo[i].num;
597 		tgtobj->stats.rx.rcvd_reo[i].bytes +=
598 			srcobj->rx.rcvd_reo[i].bytes;
599 	}
600 
601 	srcobj->rx.unicast.num =
602 		srcobj->rx.to_stack.num -
603 				(srcobj->rx.multicast.num);
604 	srcobj->rx.unicast.bytes =
605 		srcobj->rx.to_stack.bytes -
606 				(srcobj->rx.multicast.bytes);
607 
608 	tgtobj->stats.rx.unicast.num += srcobj->rx.unicast.num;
609 	tgtobj->stats.rx.unicast.bytes += srcobj->rx.unicast.bytes;
610 	tgtobj->stats.rx.multicast.num += srcobj->rx.multicast.num;
611 	tgtobj->stats.rx.multicast.bytes += srcobj->rx.multicast.bytes;
612 	tgtobj->stats.rx.bcast.num += srcobj->rx.bcast.num;
613 	tgtobj->stats.rx.bcast.bytes += srcobj->rx.bcast.bytes;
614 	tgtobj->stats.rx.raw.num += srcobj->rx.raw.num;
615 	tgtobj->stats.rx.raw.bytes += srcobj->rx.raw.bytes;
616 	tgtobj->stats.rx.intra_bss.pkts.num +=
617 			srcobj->rx.intra_bss.pkts.num;
618 	tgtobj->stats.rx.intra_bss.pkts.bytes +=
619 			srcobj->rx.intra_bss.pkts.bytes;
620 	tgtobj->stats.rx.intra_bss.fail.num +=
621 			srcobj->rx.intra_bss.fail.num;
622 	tgtobj->stats.rx.intra_bss.fail.bytes +=
623 			srcobj->rx.intra_bss.fail.bytes;
624 
625 	tgtobj->stats.tx.last_ack_rssi =
626 		srcobj->tx.last_ack_rssi;
627 	tgtobj->stats.rx.mec_drop.num += srcobj->rx.mec_drop.num;
628 	tgtobj->stats.rx.mec_drop.bytes += srcobj->rx.mec_drop.bytes;
629 	tgtobj->stats.rx.multipass_rx_pkt_drop +=
630 		srcobj->rx.multipass_rx_pkt_drop;
631 }
632 
633 static inline void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
634 						struct dp_vdev *srcobj)
635 {
636 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.nawds_mcast);
637 
638 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.rcvd);
639 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.processed);
640 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.reinject_pkts);
641 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.inspect_pkts);
642 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.raw.raw_pkt);
643 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.raw.dma_map_error);
644 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_host.num);
645 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.sg.dropped_target);
646 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sg.sg_pkt);
647 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.mcast_en.mcast_pkt);
648 	DP_STATS_AGGR(tgtobj, srcobj,
649 		      tx_i.mcast_en.dropped_map_error);
650 	DP_STATS_AGGR(tgtobj, srcobj,
651 		      tx_i.mcast_en.dropped_self_mac);
652 	DP_STATS_AGGR(tgtobj, srcobj,
653 		      tx_i.mcast_en.dropped_send_fail);
654 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mcast_en.ucast);
655 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.dma_error);
656 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.ring_full);
657 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.enqueue_fail);
658 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.desc_na.num);
659 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.res_full);
660 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.dropped.headroom_insufficient);
661 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified);
662 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.cce_classified_raw);
663 	DP_STATS_AGGR_PKT(tgtobj, srcobj, tx_i.sniffer_rcvd);
664 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.exception_fw);
665 	DP_STATS_AGGR(tgtobj, srcobj, tx_i.mesh.completion_fw);
666 
667 	tgtobj->stats.tx_i.dropped.dropped_pkt.num =
668 		tgtobj->stats.tx_i.dropped.dma_error +
669 		tgtobj->stats.tx_i.dropped.ring_full +
670 		tgtobj->stats.tx_i.dropped.enqueue_fail +
671 		tgtobj->stats.tx_i.dropped.desc_na.num +
672 		tgtobj->stats.tx_i.dropped.res_full;
673 
674 }
675 
676 static inline void dp_update_vdev_stats(struct cdp_vdev_stats *tgtobj,
677 					struct dp_peer *srcobj)
678 {
679 	uint8_t i;
680 	uint8_t pream_type;
681 
682 	for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) {
683 		for (i = 0; i < MAX_MCS; i++) {
684 			tgtobj->tx.pkt_type[pream_type].
685 				mcs_count[i] +=
686 			srcobj->stats.tx.pkt_type[pream_type].
687 				mcs_count[i];
688 			tgtobj->rx.pkt_type[pream_type].
689 				mcs_count[i] +=
690 			srcobj->stats.rx.pkt_type[pream_type].
691 				mcs_count[i];
692 		}
693 	}
694 
695 	for (i = 0; i < MAX_BW; i++) {
696 		tgtobj->tx.bw[i] += srcobj->stats.tx.bw[i];
697 		tgtobj->rx.bw[i] += srcobj->stats.rx.bw[i];
698 	}
699 
700 	for (i = 0; i < SS_COUNT; i++) {
701 		tgtobj->tx.nss[i] += srcobj->stats.tx.nss[i];
702 		tgtobj->rx.nss[i] += srcobj->stats.rx.nss[i];
703 	}
704 
705 	for (i = 0; i < WME_AC_MAX; i++) {
706 		tgtobj->tx.wme_ac_type[i] +=
707 			srcobj->stats.tx.wme_ac_type[i];
708 		tgtobj->rx.wme_ac_type[i] +=
709 			srcobj->stats.rx.wme_ac_type[i];
710 		tgtobj->tx.excess_retries_per_ac[i] +=
711 			srcobj->stats.tx.excess_retries_per_ac[i];
712 	}
713 
714 	for (i = 0; i < MAX_GI; i++) {
715 		tgtobj->tx.sgi_count[i] +=
716 			srcobj->stats.tx.sgi_count[i];
717 		tgtobj->rx.sgi_count[i] +=
718 			srcobj->stats.rx.sgi_count[i];
719 	}
720 
721 	for (i = 0; i < MAX_RECEPTION_TYPES; i++)
722 		tgtobj->rx.reception_type[i] +=
723 			srcobj->stats.rx.reception_type[i];
724 
725 	tgtobj->tx.comp_pkt.bytes += srcobj->stats.tx.comp_pkt.bytes;
726 	tgtobj->tx.comp_pkt.num += srcobj->stats.tx.comp_pkt.num;
727 	tgtobj->tx.ucast.num += srcobj->stats.tx.ucast.num;
728 	tgtobj->tx.ucast.bytes += srcobj->stats.tx.ucast.bytes;
729 	tgtobj->tx.mcast.num += srcobj->stats.tx.mcast.num;
730 	tgtobj->tx.mcast.bytes += srcobj->stats.tx.mcast.bytes;
731 	tgtobj->tx.bcast.num += srcobj->stats.tx.bcast.num;
732 	tgtobj->tx.bcast.bytes += srcobj->stats.tx.bcast.bytes;
733 	tgtobj->tx.tx_success.num += srcobj->stats.tx.tx_success.num;
734 	tgtobj->tx.tx_success.bytes +=
735 		srcobj->stats.tx.tx_success.bytes;
736 	tgtobj->tx.nawds_mcast.num +=
737 		srcobj->stats.tx.nawds_mcast.num;
738 	tgtobj->tx.nawds_mcast.bytes +=
739 		srcobj->stats.tx.nawds_mcast.bytes;
740 	tgtobj->tx.nawds_mcast_drop +=
741 		srcobj->stats.tx.nawds_mcast_drop;
742 	tgtobj->tx.num_ppdu_cookie_valid +=
743 		srcobj->stats.tx.num_ppdu_cookie_valid;
744 	tgtobj->tx.tx_failed += srcobj->stats.tx.tx_failed;
745 	tgtobj->tx.ofdma += srcobj->stats.tx.ofdma;
746 	tgtobj->tx.stbc += srcobj->stats.tx.stbc;
747 	tgtobj->tx.ldpc += srcobj->stats.tx.ldpc;
748 	tgtobj->tx.retries += srcobj->stats.tx.retries;
749 	tgtobj->tx.non_amsdu_cnt += srcobj->stats.tx.non_amsdu_cnt;
750 	tgtobj->tx.amsdu_cnt += srcobj->stats.tx.amsdu_cnt;
751 	tgtobj->tx.non_ampdu_cnt += srcobj->stats.tx.non_ampdu_cnt;
752 	tgtobj->tx.ampdu_cnt += srcobj->stats.tx.ampdu_cnt;
753 	tgtobj->tx.dropped.fw_rem.num += srcobj->stats.tx.dropped.fw_rem.num;
754 	tgtobj->tx.dropped.fw_rem.bytes +=
755 			srcobj->stats.tx.dropped.fw_rem.bytes;
756 	tgtobj->tx.dropped.fw_rem_tx +=
757 			srcobj->stats.tx.dropped.fw_rem_tx;
758 	tgtobj->tx.dropped.fw_rem_notx +=
759 			srcobj->stats.tx.dropped.fw_rem_notx;
760 	tgtobj->tx.dropped.fw_reason1 +=
761 			srcobj->stats.tx.dropped.fw_reason1;
762 	tgtobj->tx.dropped.fw_reason2 +=
763 			srcobj->stats.tx.dropped.fw_reason2;
764 	tgtobj->tx.dropped.fw_reason3 +=
765 			srcobj->stats.tx.dropped.fw_reason3;
766 	tgtobj->tx.dropped.age_out += srcobj->stats.tx.dropped.age_out;
767 	tgtobj->rx.err.mic_err += srcobj->stats.rx.err.mic_err;
768 	if (srcobj->stats.rx.rssi != 0)
769 		tgtobj->rx.rssi = srcobj->stats.rx.rssi;
770 	tgtobj->rx.rx_rate = srcobj->stats.rx.rx_rate;
771 	tgtobj->rx.err.decrypt_err += srcobj->stats.rx.err.decrypt_err;
772 	tgtobj->rx.non_ampdu_cnt += srcobj->stats.rx.non_ampdu_cnt;
773 	tgtobj->rx.amsdu_cnt += srcobj->stats.rx.ampdu_cnt;
774 	tgtobj->rx.non_amsdu_cnt += srcobj->stats.rx.non_amsdu_cnt;
775 	tgtobj->rx.amsdu_cnt += srcobj->stats.rx.amsdu_cnt;
776 	tgtobj->rx.nawds_mcast_drop += srcobj->stats.rx.nawds_mcast_drop;
777 	tgtobj->rx.to_stack.num += srcobj->stats.rx.to_stack.num;
778 	tgtobj->rx.to_stack.bytes += srcobj->stats.rx.to_stack.bytes;
779 
780 	for (i = 0; i <  CDP_MAX_RX_RINGS; i++) {
781 		tgtobj->rx.rcvd_reo[i].num +=
782 			srcobj->stats.rx.rcvd_reo[i].num;
783 		tgtobj->rx.rcvd_reo[i].bytes +=
784 			srcobj->stats.rx.rcvd_reo[i].bytes;
785 	}
786 
787 	srcobj->stats.rx.unicast.num =
788 		srcobj->stats.rx.to_stack.num -
789 				srcobj->stats.rx.multicast.num;
790 	srcobj->stats.rx.unicast.bytes =
791 		srcobj->stats.rx.to_stack.bytes -
792 				srcobj->stats.rx.multicast.bytes;
793 
794 	tgtobj->rx.unicast.num += srcobj->stats.rx.unicast.num;
795 	tgtobj->rx.unicast.bytes += srcobj->stats.rx.unicast.bytes;
796 	tgtobj->rx.multicast.num += srcobj->stats.rx.multicast.num;
797 	tgtobj->rx.multicast.bytes += srcobj->stats.rx.multicast.bytes;
798 	tgtobj->rx.bcast.num += srcobj->stats.rx.bcast.num;
799 	tgtobj->rx.bcast.bytes += srcobj->stats.rx.bcast.bytes;
800 	tgtobj->rx.raw.num += srcobj->stats.rx.raw.num;
801 	tgtobj->rx.raw.bytes += srcobj->stats.rx.raw.bytes;
802 	tgtobj->rx.intra_bss.pkts.num +=
803 			srcobj->stats.rx.intra_bss.pkts.num;
804 	tgtobj->rx.intra_bss.pkts.bytes +=
805 			srcobj->stats.rx.intra_bss.pkts.bytes;
806 	tgtobj->rx.intra_bss.fail.num +=
807 			srcobj->stats.rx.intra_bss.fail.num;
808 	tgtobj->rx.intra_bss.fail.bytes +=
809 			srcobj->stats.rx.intra_bss.fail.bytes;
810 	tgtobj->tx.last_ack_rssi =
811 		srcobj->stats.tx.last_ack_rssi;
812 	tgtobj->rx.mec_drop.num += srcobj->stats.rx.mec_drop.num;
813 	tgtobj->rx.mec_drop.bytes += srcobj->stats.rx.mec_drop.bytes;
814 	tgtobj->rx.multipass_rx_pkt_drop +=
815 		srcobj->stats.rx.multipass_rx_pkt_drop;
816 }
817 
818 #define DP_UPDATE_STATS(_tgtobj, _srcobj)	\
819 	do {				\
820 		uint8_t i;		\
821 		uint8_t pream_type;	\
822 		for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \
823 			for (i = 0; i < MAX_MCS; i++) { \
824 				DP_STATS_AGGR(_tgtobj, _srcobj, \
825 					tx.pkt_type[pream_type].mcs_count[i]); \
826 				DP_STATS_AGGR(_tgtobj, _srcobj, \
827 					rx.pkt_type[pream_type].mcs_count[i]); \
828 			} \
829 		} \
830 		  \
831 		for (i = 0; i < MAX_BW; i++) { \
832 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.bw[i]); \
833 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.bw[i]); \
834 		} \
835 		  \
836 		for (i = 0; i < SS_COUNT; i++) { \
837 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.nss[i]); \
838 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.nss[i]); \
839 		} \
840 		for (i = 0; i < WME_AC_MAX; i++) { \
841 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.wme_ac_type[i]); \
842 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.wme_ac_type[i]); \
843 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.excess_retries_per_ac[i]); \
844 		\
845 		} \
846 		\
847 		for (i = 0; i < MAX_GI; i++) { \
848 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.sgi_count[i]); \
849 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.sgi_count[i]); \
850 		} \
851 		\
852 		for (i = 0; i < MAX_RECEPTION_TYPES; i++) \
853 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.reception_type[i]); \
854 		\
855 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.comp_pkt); \
856 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.ucast); \
857 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.mcast); \
858 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.bcast); \
859 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_success); \
860 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.nawds_mcast); \
861 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.nawds_mcast_drop); \
862 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.tx_failed); \
863 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ofdma); \
864 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.stbc); \
865 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ldpc); \
866 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.retries); \
867 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.non_amsdu_cnt); \
868 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.amsdu_cnt); \
869 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.non_ampdu_cnt); \
870 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ampdu_cnt); \
871 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.dropped.fw_rem); \
872 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_tx); \
873 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_notx); \
874 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason1); \
875 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason2); \
876 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason3); \
877 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.age_out); \
878 								\
879 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.mic_err); \
880 		if (_srcobj->stats.rx.rssi != 0) \
881 			DP_STATS_UPD_STRUCT(_tgtobj, _srcobj, rx.rssi); \
882 		DP_STATS_UPD_STRUCT(_tgtobj, _srcobj, rx.rx_rate); \
883 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.decrypt_err); \
884 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.non_ampdu_cnt); \
885 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.ampdu_cnt); \
886 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.non_amsdu_cnt); \
887 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.amsdu_cnt); \
888 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.nawds_mcast_drop); \
889 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.to_stack); \
890 								\
891 		for (i = 0; i <  CDP_MAX_RX_RINGS; i++)	\
892 			DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rcvd_reo[i]); \
893 									\
894 		_srcobj->stats.rx.unicast.num = \
895 			_srcobj->stats.rx.to_stack.num - \
896 					_srcobj->stats.rx.multicast.num; \
897 		_srcobj->stats.rx.unicast.bytes = \
898 			_srcobj->stats.rx.to_stack.bytes - \
899 					_srcobj->stats.rx.multicast.bytes; \
900 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.unicast); \
901 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.multicast); \
902 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.bcast); \
903 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.raw); \
904 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.intra_bss.pkts); \
905 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.intra_bss.fail); \
906 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.mec_drop); \
907 								  \
908 		_tgtobj->stats.tx.last_ack_rssi =	\
909 			_srcobj->stats.tx.last_ack_rssi; \
910 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.multipass_rx_pkt_drop); \
911 	}  while (0)
912 
913 extern int dp_peer_find_attach(struct dp_soc *soc);
914 extern void dp_peer_find_detach(struct dp_soc *soc);
915 extern void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer);
916 extern void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer);
917 extern void dp_peer_find_hash_erase(struct dp_soc *soc);
918 
919 /*
920  * dp_peer_ppdu_delayed_ba_init() Initialize ppdu in peer
921  * @peer: Datapath peer
922  *
923  * return: void
924  */
925 void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer);
926 
927 /*
928  * dp_peer_ppdu_delayed_ba_cleanup() free ppdu allocated in peer
929  * @peer: Datapath peer
930  *
931  * return: void
932  */
933 void dp_peer_ppdu_delayed_ba_cleanup(struct dp_peer *peer);
934 
935 extern void dp_peer_rx_init(struct dp_pdev *pdev, struct dp_peer *peer);
936 void dp_peer_tx_init(struct dp_pdev *pdev, struct dp_peer *peer);
937 void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer,
938 		     bool reuse);
939 void dp_peer_rx_cleanup(struct dp_vdev *vdev, struct dp_peer *peer,
940 			bool reuse);
941 void dp_peer_unref_delete(struct dp_peer *peer);
942 extern void *dp_find_peer_by_addr(struct cdp_pdev *dev,
943 	uint8_t *peer_mac_addr);
944 extern struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
945 	uint8_t *peer_mac_addr, int mac_addr_is_aligned, uint8_t vdev_id);
946 
947 #ifdef DP_PEER_EXTENDED_API
948 /**
949  * dp_register_peer() - Register peer into physical device
950  * @soc_hdl - data path soc handle
951  * @pdev_id - device instance id
952  * @sta_desc - peer description
953  *
954  * Register peer into physical device
955  *
956  * Return: QDF_STATUS_SUCCESS registration success
957  *         QDF_STATUS_E_FAULT peer not found
958  */
959 QDF_STATUS dp_register_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
960 			    struct ol_txrx_desc_type *sta_desc);
961 
962 /**
963  * dp_clear_peer() - remove peer from physical device
964  * @soc_hdl - data path soc handle
965  * @pdev_id - device instance id
966  * @peer_addr - peer mac address
967  *
968  * remove peer from physical device
969  *
970  * Return: QDF_STATUS_SUCCESS registration success
971  *         QDF_STATUS_E_FAULT peer not found
972  */
973 QDF_STATUS dp_clear_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
974 			 struct qdf_mac_addr peer_addr);
975 
976 /*
977  * dp_find_peer_exist - find peer if already exists
978  * @soc: datapath soc handle
979  * @pdev_id: physical device instance id
980  * @peer_mac_addr: peer mac address
981  *
982  * Return: true or false
983  */
984 bool dp_find_peer_exist(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
985 			uint8_t *peer_addr);
986 
987 /*
988  * dp_find_peer_exist_on_vdev - find if peer exists on the given vdev
989  * @soc: datapath soc handle
990  * @vdev_id: vdev instance id
991  * @peer_mac_addr: peer mac address
992  *
993  * Return: true or false
994  */
995 bool dp_find_peer_exist_on_vdev(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
996 				uint8_t *peer_addr);
997 
998 /*
999  * dp_find_peer_exist_on_other_vdev - find if peer exists
1000  * on other than the given vdev
1001  * @soc: datapath soc handle
1002  * @vdev_id: vdev instance id
1003  * @peer_mac_addr: peer mac address
1004  * @max_bssid: max number of bssids
1005  *
1006  * Return: true or false
1007  */
1008 bool dp_find_peer_exist_on_other_vdev(struct cdp_soc_t *soc_hdl,
1009 				      uint8_t vdev_id, uint8_t *peer_addr,
1010 				      uint16_t max_bssid);
1011 
1012 void *dp_find_peer_by_addr_and_vdev(struct cdp_pdev *pdev_handle,
1013 		struct cdp_vdev *vdev,
1014 		uint8_t *peer_addr);
1015 
1016 /**
1017  * dp_peer_state_update() - update peer local state
1018  * @pdev - data path device instance
1019  * @peer_addr - peer mac address
1020  * @state - new peer local state
1021  *
1022  * update peer local state
1023  *
1024  * Return: QDF_STATUS_SUCCESS registration success
1025  */
1026 QDF_STATUS dp_peer_state_update(struct cdp_soc_t *soc, uint8_t *peer_mac,
1027 				enum ol_txrx_peer_state state);
1028 
1029 /**
1030  * dp_get_vdevid() - Get virtual interface id which peer registered
1031  * @soc - datapath soc handle
1032  * @peer_mac - peer mac address
1033  * @vdev_id - virtual interface id which peer registered
1034  *
1035  * Get virtual interface id which peer registered
1036  *
1037  * Return: QDF_STATUS_SUCCESS registration success
1038  */
1039 QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
1040 			 uint8_t *vdev_id);
1041 struct cdp_vdev *dp_get_vdev_by_peer_addr(struct cdp_pdev *pdev_handle,
1042 		struct qdf_mac_addr peer_addr);
1043 struct cdp_vdev *dp_get_vdev_for_peer(void *peer);
1044 uint8_t *dp_peer_get_peer_mac_addr(void *peer);
1045 
1046 /**
1047  * dp_get_peer_state() - Get local peer state
1048  * @soc - datapath soc handle
1049  * @vdev_id - vdev id
1050  * @peer_mac - peer mac addr
1051  *
1052  * Get local peer state
1053  *
1054  * Return: peer status
1055  */
1056 int dp_get_peer_state(struct cdp_soc_t *soc, uint8_t vdev_id,
1057 		      uint8_t *peer_mac);
1058 void dp_local_peer_id_pool_init(struct dp_pdev *pdev);
1059 void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer);
1060 void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer);
1061 #else
1062 /**
1063  * dp_get_vdevid() - Get virtual interface id which peer registered
1064  * @soc - datapath soc handle
1065  * @peer_mac - peer mac address
1066  * @vdev_id - virtual interface id which peer registered
1067  *
1068  * Get virtual interface id which peer registered
1069  *
1070  * Return: QDF_STATUS_SUCCESS registration success
1071  */
1072 static inline
1073 QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
1074 			 uint8_t *vdev_id)
1075 {
1076 	return QDF_STATUS_E_NOSUPPORT;
1077 }
1078 
1079 static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev)
1080 {
1081 }
1082 
1083 static inline
1084 void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer)
1085 {
1086 }
1087 
1088 static inline
1089 void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer)
1090 {
1091 }
1092 #endif
1093 int dp_addba_resp_tx_completion_wifi3(struct cdp_soc_t *cdp_soc,
1094 				      uint8_t *peer_mac, uint16_t vdev_id,
1095 				      uint8_t tid,
1096 				      int status);
1097 int dp_addba_requestprocess_wifi3(struct cdp_soc_t *cdp_soc,
1098 				  uint8_t *peer_mac, uint16_t vdev_id,
1099 				  uint8_t dialogtoken, uint16_t tid,
1100 				  uint16_t batimeout,
1101 				  uint16_t buffersize,
1102 				  uint16_t startseqnum);
1103 QDF_STATUS dp_addba_responsesetup_wifi3(struct cdp_soc_t *cdp_soc,
1104 					uint8_t *peer_mac, uint16_t vdev_id,
1105 					uint8_t tid, uint8_t *dialogtoken,
1106 					uint16_t *statuscode,
1107 					uint16_t *buffersize,
1108 					uint16_t *batimeout);
1109 QDF_STATUS dp_set_addba_response(struct cdp_soc_t *cdp_soc,
1110 				 uint8_t *peer_mac,
1111 				 uint16_t vdev_id, uint8_t tid,
1112 				 uint16_t statuscode);
1113 int dp_delba_process_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
1114 			   uint16_t vdev_id, int tid,
1115 			   uint16_t reasoncode);
1116 /*
1117  * dp_delba_tx_completion_wifi3() -  Handle delba tx completion
1118  *
1119  * @cdp_soc: soc handle
1120  * @vdev_id: id of the vdev handle
1121  * @peer_mac: peer mac address
1122  * @tid: Tid number
1123  * @status: Tx completion status
1124  * Indicate status of delba Tx to DP for stats update and retry
1125  * delba if tx failed.
1126  *
1127  */
1128 int dp_delba_tx_completion_wifi3(struct cdp_soc_t *cdp_soc, uint8_t *peer_mac,
1129 				 uint16_t vdev_id, uint8_t tid,
1130 				 int status);
1131 extern QDF_STATUS dp_rx_tid_setup_wifi3(struct dp_peer *peer, int tid,
1132 					uint32_t ba_window_size,
1133 					uint32_t start_seq);
1134 
1135 extern QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc,
1136 	enum hal_reo_cmd_type type, struct hal_reo_cmd_params *params,
1137 	void (*callback_fn), void *data);
1138 
1139 extern void dp_reo_cmdlist_destroy(struct dp_soc *soc);
1140 
1141 /**
1142  * dp_reo_status_ring_handler - Handler for REO Status ring
1143  * @int_ctx: pointer to DP interrupt context
1144  * @soc: DP Soc handle
1145  *
1146  * Returns: Number of descriptors reaped
1147  */
1148 uint32_t dp_reo_status_ring_handler(struct dp_intr *int_ctx,
1149 				    struct dp_soc *soc);
1150 void dp_aggregate_vdev_stats(struct dp_vdev *vdev,
1151 			     struct cdp_vdev_stats *vdev_stats);
1152 void dp_rx_tid_stats_cb(struct dp_soc *soc, void *cb_ctxt,
1153 	union hal_reo_status *reo_status);
1154 void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt,
1155 		union hal_reo_status *reo_status);
1156 uint16_t dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
1157 				     qdf_nbuf_t nbuf,
1158 				     uint8_t newmac[][QDF_MAC_ADDR_SIZE],
1159 				     uint8_t new_mac_cnt);
1160 void dp_tx_me_alloc_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
1161 
1162 void dp_tx_me_free_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
1163 QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev,
1164 		uint32_t stats_type_upload_mask, uint32_t config_param_0,
1165 		uint32_t config_param_1, uint32_t config_param_2,
1166 		uint32_t config_param_3, int cookie, int cookie_msb,
1167 		uint8_t mac_id);
1168 void dp_htt_stats_print_tag(struct dp_pdev *pdev,
1169 			    uint8_t tag_type, uint32_t *tag_buf);
1170 void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf);
1171 QDF_STATUS dp_h2t_3tuple_config_send(struct dp_pdev *pdev, uint32_t tuple_mask,
1172 				     uint8_t mac_id);
1173 /**
1174  * dp_rxtid_stats_cmd_cb - function pointer for peer
1175  *			   rx tid stats cmd call_back
1176  */
1177 typedef void (*dp_rxtid_stats_cmd_cb)(struct dp_soc *soc, void *cb_ctxt,
1178 				      union hal_reo_status *reo_status);
1179 int dp_peer_rxtid_stats(struct dp_peer *peer,
1180 			dp_rxtid_stats_cmd_cb dp_stats_cmd_cb,
1181 			void *cb_ctxt);
1182 QDF_STATUS
1183 dp_set_pn_check_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
1184 		      uint8_t *peer_mac, enum cdp_sec_type sec_type,
1185 		      uint32_t *rx_pn);
1186 
1187 QDF_STATUS
1188 dp_set_key_sec_type_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
1189 			  uint8_t *peer_mac, enum cdp_sec_type sec_type,
1190 			  bool is_unicast);
1191 
1192 void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id);
1193 
1194 QDF_STATUS
1195 dp_set_michael_key(struct cdp_soc_t *soc, uint8_t vdev_id,
1196 		   uint8_t *peer_mac,
1197 		   bool is_unicast, uint32_t *key);
1198 
1199 /**
1200  * dp_check_pdev_exists() - Validate pdev before use
1201  * @soc - dp soc handle
1202  * @data - pdev handle
1203  *
1204  * Return: 0 - success/invalid - failure
1205  */
1206 bool dp_check_pdev_exists(struct dp_soc *soc, struct dp_pdev *data);
1207 
1208 /**
1209  * dp_update_delay_stats() - Update delay statistics in structure
1210  *                              and fill min, max and avg delay
1211  * @pdev: pdev handle
1212  * @delay: delay in ms
1213  * @tid: tid value
1214  * @mode: type of tx delay mode
1215  * @ring id: ring number
1216  *
1217  * Return: none
1218  */
1219 void dp_update_delay_stats(struct dp_pdev *pdev, uint32_t delay,
1220 			   uint8_t tid, uint8_t mode, uint8_t ring_id);
1221 
1222 /**
1223  * dp_print_ring_stats(): Print tail and head pointer
1224  * @pdev: DP_PDEV handle
1225  *
1226  * Return:void
1227  */
1228 void dp_print_ring_stats(struct dp_pdev *pdev);
1229 
1230 /**
1231  * dp_print_pdev_cfg_params() - Print the pdev cfg parameters
1232  * @pdev_handle: DP pdev handle
1233  *
1234  * Return - void
1235  */
1236 void dp_print_pdev_cfg_params(struct dp_pdev *pdev);
1237 
1238 /**
1239  * dp_print_soc_cfg_params()- Dump soc wlan config parameters
1240  * @soc_handle: Soc handle
1241  *
1242  * Return: void
1243  */
1244 void dp_print_soc_cfg_params(struct dp_soc *soc);
1245 
1246 /**
1247  * dp_srng_get_str_from_ring_type() - Return string name for a ring
1248  * @ring_type: Ring
1249  *
1250  * Return: char const pointer
1251  */
1252 const
1253 char *dp_srng_get_str_from_hal_ring_type(enum hal_ring_type ring_type);
1254 
1255 /*
1256  * dp_txrx_path_stats() - Function to display dump stats
1257  * @soc - soc handle
1258  *
1259  * return: none
1260  */
1261 void dp_txrx_path_stats(struct dp_soc *soc);
1262 
1263 /*
1264  * dp_print_per_ring_stats(): Packet count per ring
1265  * @soc - soc handle
1266  *
1267  * Return - None
1268  */
1269 void dp_print_per_ring_stats(struct dp_soc *soc);
1270 
1271 /**
1272  * dp_aggregate_pdev_stats(): Consolidate stats at PDEV level
1273  * @pdev: DP PDEV handle
1274  *
1275  * return: void
1276  */
1277 void dp_aggregate_pdev_stats(struct dp_pdev *pdev);
1278 
1279 /**
1280  * dp_print_rx_rates(): Print Rx rate stats
1281  * @vdev: DP_VDEV handle
1282  *
1283  * Return:void
1284  */
1285 void dp_print_rx_rates(struct dp_vdev *vdev);
1286 
1287 /**
1288  * dp_print_tx_rates(): Print tx rates
1289  * @vdev: DP_VDEV handle
1290  *
1291  * Return:void
1292  */
1293 void dp_print_tx_rates(struct dp_vdev *vdev);
1294 
1295 /**
1296  * dp_print_peer_stats():print peer stats
1297  * @peer: DP_PEER handle
1298  *
1299  * return void
1300  */
1301 void dp_print_peer_stats(struct dp_peer *peer);
1302 
1303 /**
1304  * dp_print_pdev_tx_stats(): Print Pdev level TX stats
1305  * @pdev: DP_PDEV Handle
1306  *
1307  * Return:void
1308  */
1309 void
1310 dp_print_pdev_tx_stats(struct dp_pdev *pdev);
1311 
1312 /**
1313  * dp_print_pdev_rx_stats(): Print Pdev level RX stats
1314  * @pdev: DP_PDEV Handle
1315  *
1316  * Return: void
1317  */
1318 void
1319 dp_print_pdev_rx_stats(struct dp_pdev *pdev);
1320 
1321 /**
1322  * dp_print_pdev_rx_mon_stats(): Print Pdev level RX monitor stats
1323  * @pdev: DP_PDEV Handle
1324  *
1325  * Return: void
1326  */
1327 void
1328 dp_print_pdev_rx_mon_stats(struct dp_pdev *pdev);
1329 
1330 /**
1331  * dp_print_soc_tx_stats(): Print SOC level  stats
1332  * @soc DP_SOC Handle
1333  *
1334  * Return: void
1335  */
1336 void dp_print_soc_tx_stats(struct dp_soc *soc);
1337 
1338 /**
1339  * dp_print_soc_interrupt_stats() - Print interrupt stats for the soc
1340  * @soc: dp_soc handle
1341  *
1342  * Return: None
1343  */
1344 void dp_print_soc_interrupt_stats(struct dp_soc *soc);
1345 
1346 /**
1347  * dp_print_soc_rx_stats: Print SOC level Rx stats
1348  * @soc: DP_SOC Handle
1349  *
1350  * Return:void
1351  */
1352 void dp_print_soc_rx_stats(struct dp_soc *soc);
1353 
1354 /**
1355  * dp_get_mac_id_for_pdev() -  Return mac corresponding to pdev for mac
1356  *
1357  * @mac_id: MAC id
1358  * @pdev_id: pdev_id corresponding to pdev, 0 for MCL
1359  *
1360  * Single pdev using both MACs will operate on both MAC rings,
1361  * which is the case for MCL.
1362  * For WIN each PDEV will operate one ring, so index is zero.
1363  *
1364  */
1365 static inline int dp_get_mac_id_for_pdev(uint32_t mac_id, uint32_t pdev_id)
1366 {
1367 	if (mac_id && pdev_id) {
1368 		qdf_print("Both mac_id and pdev_id cannot be non zero");
1369 		QDF_BUG(0);
1370 		return 0;
1371 	}
1372 	return (mac_id + pdev_id);
1373 }
1374 
1375 /**
1376  * dp_get_lmac_id_for_pdev_id() -  Return lmac id corresponding to host pdev id
1377  * @soc: soc pointer
1378  * @mac_id: MAC id
1379  * @pdev_id: pdev_id corresponding to pdev, 0 for MCL
1380  *
1381  * For MCL, Single pdev using both MACs will operate on both MAC rings.
1382  *
1383  * For WIN, each PDEV will operate one ring.
1384  *
1385  */
1386 static inline int
1387 dp_get_lmac_id_for_pdev_id
1388 	(struct dp_soc *soc, uint32_t mac_id, uint32_t pdev_id)
1389 {
1390 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
1391 		if (mac_id && pdev_id) {
1392 			qdf_print("Both mac_id and pdev_id cannot be non zero");
1393 			QDF_BUG(0);
1394 			return 0;
1395 		}
1396 		return (mac_id + pdev_id);
1397 	}
1398 
1399 	return soc->pdev_list[pdev_id]->lmac_id;
1400 }
1401 
1402 /**
1403  * dp_get_pdev_for_lmac_id() -  Return pdev pointer corresponding to lmac id
1404  * @soc: soc pointer
1405  * @lmac_id: LMAC id
1406  *
1407  * For MCL, Single pdev exists
1408  *
1409  * For WIN, each PDEV will operate one ring.
1410  *
1411  */
1412 static inline struct dp_pdev *
1413 	dp_get_pdev_for_lmac_id(struct dp_soc *soc, uint32_t lmac_id)
1414 {
1415 	uint8_t i = 0;
1416 
1417 	if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
1418 		i = wlan_cfg_get_pdev_idx(soc->wlan_cfg_ctx, lmac_id);
1419 		return ((i < MAX_PDEV_CNT) ? soc->pdev_list[i] : NULL);
1420 	}
1421 
1422 	/* Typically for MCL as there only 1 PDEV*/
1423 	return soc->pdev_list[0];
1424 }
1425 
1426 /**
1427  * dp_calculate_target_pdev_id_from_host_pdev_id() - Return target pdev
1428  *                                          corresponding to host pdev id
1429  * @soc: soc pointer
1430  * @mac_for_pdev: pdev_id corresponding to host pdev for WIN, mac id for MCL
1431  *
1432  * returns target pdev_id for host pdev id. For WIN, this is derived through
1433  * a two step process:
1434  * 1. Get lmac_id corresponding to host pdev_id (lmac_id can change
1435  *    during mode switch)
1436  * 2. Get target pdev_id (set up during WMI ready) from lmac_id
1437  *
1438  * For MCL, return the offset-1 translated mac_id
1439  */
1440 static inline int
1441 dp_calculate_target_pdev_id_from_host_pdev_id
1442 	(struct dp_soc *soc, uint32_t mac_for_pdev)
1443 {
1444 	struct dp_pdev *pdev;
1445 
1446 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
1447 		return DP_SW2HW_MACID(mac_for_pdev);
1448 
1449 	pdev = soc->pdev_list[mac_for_pdev];
1450 
1451 	/*non-MCL case, get original target_pdev mapping*/
1452 	return wlan_cfg_get_target_pdev_id(soc->wlan_cfg_ctx, pdev->lmac_id);
1453 }
1454 
1455 /**
1456  * dp_get_target_pdev_id_for_host_pdev_id() - Return target pdev corresponding
1457  *                                         to host pdev id
1458  * @soc: soc pointer
1459  * @mac_for_pdev: pdev_id corresponding to host pdev for WIN, mac id for MCL
1460  *
1461  * returns target pdev_id for host pdev id.
1462  * For WIN, return the value stored in pdev object.
1463  * For MCL, return the offset-1 translated mac_id.
1464  */
1465 static inline int
1466 dp_get_target_pdev_id_for_host_pdev_id
1467 	(struct dp_soc *soc, uint32_t mac_for_pdev)
1468 {
1469 	struct dp_pdev *pdev;
1470 
1471 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
1472 		return DP_SW2HW_MACID(mac_for_pdev);
1473 
1474 	pdev = soc->pdev_list[mac_for_pdev];
1475 
1476 	return pdev->target_pdev_id;
1477 }
1478 
1479 /**
1480  * dp_get_host_pdev_id_for_target_pdev_id() - Return host pdev corresponding
1481  *                                         to target pdev id
1482  * @soc: soc pointer
1483  * @pdev_id: pdev_id corresponding to target pdev
1484  *
1485  * returns host pdev_id for target pdev id. For WIN, this is derived through
1486  * a two step process:
1487  * 1. Get lmac_id corresponding to target pdev_id
1488  * 2. Get host pdev_id (set up during WMI ready) from lmac_id
1489  *
1490  * For MCL, return the 0-offset pdev_id
1491  */
1492 static inline int
1493 dp_get_host_pdev_id_for_target_pdev_id
1494 	(struct dp_soc *soc, uint32_t pdev_id)
1495 {
1496 	struct dp_pdev *pdev;
1497 	int lmac_id;
1498 
1499 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
1500 		return DP_HW2SW_MACID(pdev_id);
1501 
1502 	/*non-MCL case, get original target_lmac mapping from target pdev*/
1503 	lmac_id = wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx,
1504 					  DP_HW2SW_MACID(pdev_id));
1505 
1506 	/*Get host pdev from lmac*/
1507 	pdev = dp_get_pdev_for_lmac_id(soc, lmac_id);
1508 
1509 	return pdev ? pdev->pdev_id : INVALID_PDEV_ID;
1510 }
1511 
1512 /*
1513  * dp_get_mac_id_for_mac() -  Return mac corresponding WIN and MCL mac_ids
1514  *
1515  * @soc: handle to DP soc
1516  * @mac_id: MAC id
1517  *
1518  * Single pdev using both MACs will operate on both MAC rings,
1519  * which is the case for MCL.
1520  * For WIN each PDEV will operate one ring, so index is zero.
1521  *
1522  */
1523 static inline int dp_get_mac_id_for_mac(struct dp_soc *soc, uint32_t mac_id)
1524 {
1525 	/*
1526 	 * Single pdev using both MACs will operate on both MAC rings,
1527 	 * which is the case for MCL.
1528 	 */
1529 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
1530 		return mac_id;
1531 
1532 	/* For WIN each PDEV will operate one ring, so index is zero. */
1533 	return 0;
1534 }
1535 
1536 /*
1537  * dp_is_subtype_data() - check if the frame subtype is data
1538  *
1539  * @frame_ctrl: Frame control field
1540  *
1541  * check the frame control field and verify if the packet
1542  * is a data packet.
1543  *
1544  * Return: true or false
1545  */
1546 static inline bool dp_is_subtype_data(uint16_t frame_ctrl)
1547 {
1548 	if (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_TYPE_MASK) ==
1549 	    QDF_IEEE80211_FC0_TYPE_DATA) &&
1550 	    (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
1551 	    QDF_IEEE80211_FC0_SUBTYPE_DATA) ||
1552 	    ((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
1553 	    QDF_IEEE80211_FC0_SUBTYPE_QOS))) {
1554 		return true;
1555 	}
1556 
1557 	return false;
1558 }
1559 
1560 #ifdef WDI_EVENT_ENABLE
1561 QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
1562 				uint32_t stats_type_upload_mask,
1563 				uint8_t mac_id);
1564 
1565 int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id,
1566 		       wdi_event_subscribe *event_cb_sub_handle,
1567 		       uint32_t event);
1568 
1569 int dp_wdi_event_sub(struct cdp_soc_t *soc, uint8_t pdev_id,
1570 		     wdi_event_subscribe *event_cb_sub_handle,
1571 		     uint32_t event);
1572 
1573 void dp_wdi_event_handler(enum WDI_EVENT event, struct dp_soc *soc,
1574 			  void *data, u_int16_t peer_id,
1575 			  int status, u_int8_t pdev_id);
1576 
1577 int dp_wdi_event_attach(struct dp_pdev *txrx_pdev);
1578 int dp_wdi_event_detach(struct dp_pdev *txrx_pdev);
1579 int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
1580 	bool enable);
1581 
1582 /**
1583  * dp_get_pldev() - function to get pktlog device handle
1584  * @soc_hdl: datapath soc handle
1585  * @pdev_id: physical device id
1586  *
1587  * Return: pktlog device handle or NULL
1588  */
1589 void *dp_get_pldev(struct cdp_soc_t *soc_hdl, uint8_t pdev_id);
1590 void dp_pkt_log_init(struct cdp_soc_t *soc_hdl, uint8_t pdev_id, void *scn);
1591 
1592 static inline void
1593 dp_hif_update_pipe_callback(struct dp_soc *dp_soc,
1594 			    void *cb_context,
1595 			    QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t),
1596 			    uint8_t pipe_id)
1597 {
1598 	struct hif_msg_callbacks hif_pipe_callbacks;
1599 
1600 	/* TODO: Temporary change to bypass HTC connection for this new
1601 	 * HIF pipe, which will be used for packet log and other high-
1602 	 * priority HTT messages. Proper HTC connection to be added
1603 	 * later once required FW changes are available
1604 	 */
1605 	hif_pipe_callbacks.rxCompletionHandler = callback;
1606 	hif_pipe_callbacks.Context = cb_context;
1607 	hif_update_pipe_callback(dp_soc->hif_handle,
1608 		DP_HTT_T2H_HP_PIPE, &hif_pipe_callbacks);
1609 }
1610 
1611 QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev, struct dp_peer *peer);
1612 
1613 #else
1614 static inline int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id,
1615 				     wdi_event_subscribe *event_cb_sub_handle,
1616 				     uint32_t event)
1617 {
1618 	return 0;
1619 }
1620 
1621 static inline int dp_wdi_event_sub(struct cdp_soc_t *soc, uint8_t pdev_id,
1622 				   wdi_event_subscribe *event_cb_sub_handle,
1623 				   uint32_t event)
1624 {
1625 	return 0;
1626 }
1627 
1628 static inline
1629 void dp_wdi_event_handler(enum WDI_EVENT event,
1630 			  struct dp_soc *soc,
1631 			  void *data, u_int16_t peer_id,
1632 			  int status, u_int8_t pdev_id)
1633 {
1634 }
1635 
1636 static inline int dp_wdi_event_attach(struct dp_pdev *txrx_pdev)
1637 {
1638 	return 0;
1639 }
1640 
1641 static inline int dp_wdi_event_detach(struct dp_pdev *txrx_pdev)
1642 {
1643 	return 0;
1644 }
1645 
1646 static inline int dp_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
1647 	bool enable)
1648 {
1649 	return 0;
1650 }
1651 static inline QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
1652 		uint32_t stats_type_upload_mask, uint8_t mac_id)
1653 {
1654 	return 0;
1655 }
1656 
1657 static inline void
1658 dp_hif_update_pipe_callback(struct dp_soc *dp_soc, void *cb_context,
1659 			    QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t),
1660 			    uint8_t pipe_id)
1661 {
1662 }
1663 
1664 static inline QDF_STATUS dp_peer_stats_notify(struct dp_pdev *pdev,
1665 					      struct dp_peer *peer)
1666 {
1667 	return QDF_STATUS_SUCCESS;
1668 }
1669 
1670 #endif /* CONFIG_WIN */
1671 
1672 #ifdef VDEV_PEER_PROTOCOL_COUNT
1673 /**
1674  * dp_vdev_peer_stats_update_protocol_cnt() - update per-peer protocol counters
1675  * @vdev: VDEV DP object
1676  * @nbuf: data packet
1677  * @peer: Peer DP object
1678  * @is_egress: whether egress or ingress
1679  * @is_rx: whether rx or tx
1680  *
1681  * This function updates the per-peer protocol counters
1682  * Return: void
1683  */
1684 void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
1685 					    qdf_nbuf_t nbuf,
1686 					    struct dp_peer *peer,
1687 					    bool is_egress,
1688 					    bool is_rx);
1689 
1690 /**
1691  * dp_vdev_peer_stats_update_protocol_cnt() - update per-peer protocol counters
1692  * @soc: SOC DP object
1693  * @vdev_id: vdev_id
1694  * @nbuf: data packet
1695  * @is_egress: whether egress or ingress
1696  * @is_rx: whether rx or tx
1697  *
1698  * This function updates the per-peer protocol counters
1699  * Return: void
1700  */
1701 
1702 void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc,
1703 				       int8_t vdev_id,
1704 				       qdf_nbuf_t nbuf,
1705 				       bool is_egress,
1706 				       bool is_rx);
1707 
1708 #else
1709 #define dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, peer, \
1710 					       is_egress, is_rx)
1711 #endif
1712 
1713 #ifdef QCA_LL_TX_FLOW_CONTROL_V2
1714 void dp_tx_dump_flow_pool_info(struct cdp_soc_t *soc_hdl);
1715 int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool,
1716 	bool force);
1717 #endif /* QCA_LL_TX_FLOW_CONTROL_V2 */
1718 
1719 #ifdef PEER_PROTECTED_ACCESS
1720 /**
1721  * dp_peer_unref_del_find_by_id() - dec ref and del peer if ref count is
1722  *                                  taken by dp_peer_find_by_id
1723  * @peer: peer context
1724  *
1725  * Return: none
1726  */
1727 static inline void dp_peer_unref_del_find_by_id(struct dp_peer *peer)
1728 {
1729 	dp_peer_unref_delete(peer);
1730 }
1731 #else
1732 static inline void dp_peer_unref_del_find_by_id(struct dp_peer *peer)
1733 {
1734 }
1735 #endif
1736 
1737 #ifdef WLAN_FEATURE_DP_EVENT_HISTORY
1738 /**
1739  * dp_srng_access_start() - Wrapper function to log access start of a hal ring
1740  * @int_ctx: pointer to DP interrupt context
1741  * @soc: DP Soc handle
1742  * @hal_ring: opaque pointer to the HAL Rx Error Ring, which will be serviced
1743  *
1744  * Return: 0 on success; error on failure
1745  */
1746 int dp_srng_access_start(struct dp_intr *int_ctx, struct dp_soc *dp_soc,
1747 			 hal_ring_handle_t hal_ring_hdl);
1748 
1749 /**
1750  * dp_srng_access_end() - Wrapper function to log access end of a hal ring
1751  * @int_ctx: pointer to DP interrupt context
1752  * @soc: DP Soc handle
1753  * @hal_ring: opaque pointer to the HAL Rx Error Ring, which will be serviced
1754  *
1755  * Return: void
1756  */
1757 void dp_srng_access_end(struct dp_intr *int_ctx, struct dp_soc *dp_soc,
1758 			hal_ring_handle_t hal_ring_hdl);
1759 
1760 #else
1761 
1762 static inline int dp_srng_access_start(struct dp_intr *int_ctx,
1763 				       struct dp_soc *dp_soc,
1764 				       hal_ring_handle_t hal_ring_hdl)
1765 {
1766 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1767 
1768 	return hal_srng_access_start(hal_soc, hal_ring_hdl);
1769 }
1770 
1771 static inline void dp_srng_access_end(struct dp_intr *int_ctx,
1772 				      struct dp_soc *dp_soc,
1773 				      hal_ring_handle_t hal_ring_hdl)
1774 {
1775 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1776 
1777 	return hal_srng_access_end(hal_soc, hal_ring_hdl);
1778 }
1779 #endif /* WLAN_FEATURE_DP_EVENT_HISTORY */
1780 
1781 #ifdef QCA_CACHED_RING_DESC
1782 /**
1783  * dp_srng_dst_get_next() - Wrapper function to get next ring desc
1784  * @dp_socsoc: DP Soc handle
1785  * @hal_ring: opaque pointer to the HAL Destination Ring
1786  *
1787  * Return: HAL ring descriptor
1788  */
1789 static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc,
1790 					 hal_ring_handle_t hal_ring_hdl)
1791 {
1792 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1793 
1794 	return hal_srng_dst_get_next_cached(hal_soc, hal_ring_hdl);
1795 }
1796 
1797 /**
1798  * dp_srng_dst_inv_cached_descs() - Wrapper function to invalidate cached
1799  * descriptors
1800  * @dp_socsoc: DP Soc handle
1801  * @hal_ring: opaque pointer to the HAL Rx Destination ring
1802  * @num_entries: Entry count
1803  *
1804  * Return: None
1805  */
1806 static inline void dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc,
1807 						hal_ring_handle_t hal_ring_hdl,
1808 						uint32_t num_entries)
1809 {
1810 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1811 
1812 	hal_srng_dst_inv_cached_descs(hal_soc, hal_ring_hdl, num_entries);
1813 }
1814 #else
1815 static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc,
1816 					 hal_ring_handle_t hal_ring_hdl)
1817 {
1818 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
1819 
1820 	return hal_srng_dst_get_next(hal_soc, hal_ring_hdl);
1821 }
1822 
1823 static inline void dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc,
1824 						hal_ring_handle_t hal_ring_hdl,
1825 						uint32_t num_entries)
1826 {
1827 }
1828 #endif /* QCA_CACHED_RING_DESC */
1829 
1830 #ifdef QCA_ENH_V3_STATS_SUPPORT
1831 /**
1832  * dp_pdev_print_delay_stats(): Print pdev level delay stats
1833  * @pdev: DP_PDEV handle
1834  *
1835  * Return:void
1836  */
1837 void dp_pdev_print_delay_stats(struct dp_pdev *pdev);
1838 
1839 /**
1840  * dp_pdev_print_tid_stats(): Print pdev level tid stats
1841  * @pdev: DP_PDEV handle
1842  *
1843  * Return:void
1844  */
1845 void dp_pdev_print_tid_stats(struct dp_pdev *pdev);
1846 #endif /* CONFIG_WIN */
1847 
1848 void dp_soc_set_txrx_ring_map(struct dp_soc *soc);
1849 
1850 #ifndef WLAN_TX_PKT_CAPTURE_ENH
1851 /**
1852  * dp_tx_ppdu_stats_attach - Initialize Tx PPDU stats and enhanced capture
1853  * @pdev: DP PDEV
1854  *
1855  * Return: none
1856  */
1857 static inline void dp_tx_ppdu_stats_attach(struct dp_pdev *pdev)
1858 {
1859 }
1860 
1861 /**
1862  * dp_tx_ppdu_stats_detach - Cleanup Tx PPDU stats and enhanced capture
1863  * @pdev: DP PDEV
1864  *
1865  * Return: none
1866  */
1867 static inline void dp_tx_ppdu_stats_detach(struct dp_pdev *pdev)
1868 {
1869 }
1870 
1871 /**
1872  * dp_tx_ppdu_stats_process - Deferred PPDU stats handler
1873  * @context: Opaque work context (PDEV)
1874  *
1875  * Return: none
1876  */
1877 static  inline void dp_tx_ppdu_stats_process(void *context)
1878 {
1879 }
1880 
1881 /**
1882  * dp_tx_add_to_comp_queue() - add completion msdu to queue
1883  * @soc: DP Soc handle
1884  * @tx_desc: software Tx descriptor
1885  * @ts : Tx completion status from HAL/HTT descriptor
1886  * @peer: DP peer
1887  *
1888  * Return: none
1889  */
1890 static inline
1891 QDF_STATUS dp_tx_add_to_comp_queue(struct dp_soc *soc,
1892 				   struct dp_tx_desc_s *desc,
1893 				   struct hal_tx_completion_status *ts,
1894 				   struct dp_peer *peer)
1895 {
1896 	return QDF_STATUS_E_FAILURE;
1897 }
1898 
1899 /*
1900  * dp_tx_capture_htt_frame_counter: increment counter for htt_frame_type
1901  * pdev: DP pdev handle
1902  * htt_frame_type: htt frame type received from fw
1903  *
1904  * return: void
1905  */
1906 static inline
1907 void dp_tx_capture_htt_frame_counter(struct dp_pdev *pdev,
1908 				     uint32_t htt_frame_type)
1909 {
1910 }
1911 
1912 /*
1913  * dp_tx_cature_stats: print tx capture stats
1914  * @pdev: DP PDEV handle
1915  *
1916  * return: void
1917  */
1918 static inline
1919 void dp_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
1920 {
1921 }
1922 
1923 /*
1924  * dp_peer_tx_capture_filter_check: check filter is enable for the filter
1925  * and update tx_cap_enabled flag
1926  * @pdev: DP PDEV handle
1927  * @peer: DP PEER handle
1928  *
1929  * return: void
1930  */
1931 static inline
1932 void dp_peer_tx_capture_filter_check(struct dp_pdev *pdev,
1933 				     struct dp_peer *peer)
1934 {
1935 }
1936 #endif
1937 
1938 #ifdef FEATURE_PERPKT_INFO
1939 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf);
1940 #else
1941 static inline
1942 void dp_deliver_mgmt_frm(struct dp_pdev *pdev, qdf_nbuf_t nbuf)
1943 {
1944 }
1945 #endif
1946 
1947 /**
1948  * dp_vdev_to_cdp_vdev() - typecast dp vdev to cdp vdev
1949  * @vdev: DP vdev handle
1950  *
1951  * Return: struct cdp_vdev pointer
1952  */
1953 static inline
1954 struct cdp_vdev *dp_vdev_to_cdp_vdev(struct dp_vdev *vdev)
1955 {
1956 	return (struct cdp_vdev *)vdev;
1957 }
1958 
1959 /**
1960  * dp_pdev_to_cdp_pdev() - typecast dp pdev to cdp pdev
1961  * @pdev: DP pdev handle
1962  *
1963  * Return: struct cdp_pdev pointer
1964  */
1965 static inline
1966 struct cdp_pdev *dp_pdev_to_cdp_pdev(struct dp_pdev *pdev)
1967 {
1968 	return (struct cdp_pdev *)pdev;
1969 }
1970 
1971 /**
1972  * dp_soc_to_cdp_soc() - typecast dp psoc to cdp psoc
1973  * @psoc: DP psoc handle
1974  *
1975  * Return: struct cdp_soc pointer
1976  */
1977 static inline
1978 struct cdp_soc *dp_soc_to_cdp_soc(struct dp_soc *psoc)
1979 {
1980 	return (struct cdp_soc *)psoc;
1981 }
1982 
1983 /**
1984  * dp_soc_to_cdp_soc_t() - typecast dp psoc to
1985  * ol txrx soc handle
1986  * @psoc: DP psoc handle
1987  *
1988  * Return: struct cdp_soc_t pointer
1989  */
1990 static inline
1991 struct cdp_soc_t *dp_soc_to_cdp_soc_t(struct dp_soc *psoc)
1992 {
1993 	return (struct cdp_soc_t *)psoc;
1994 }
1995 
1996 /**
1997  * cdp_soc_t_to_dp_soc() - typecast cdp_soc_t to
1998  * dp soc handle
1999  * @psoc: CDP psoc handle
2000  *
2001  * Return: struct dp_soc pointer
2002  */
2003 static inline
2004 struct dp_soc *cdp_soc_t_to_dp_soc(struct cdp_soc_t *psoc)
2005 {
2006 	return (struct dp_soc *)psoc;
2007 }
2008 
2009 #if defined(WLAN_SUPPORT_RX_FLOW_TAG) || defined(WLAN_SUPPORT_RX_FISA)
2010 /**
2011  * dp_rx_flow_update_fse_stats() - Update a flow's statistics
2012  * @pdev: pdev handle
2013  * @flow_id: flow index (truncated hash) in the Rx FST
2014  *
2015  * Return: Success when flow statistcs is updated, error on failure
2016  */
2017 QDF_STATUS dp_rx_flow_get_fse_stats(struct dp_pdev *pdev,
2018 				    struct cdp_rx_flow_info *rx_flow_info,
2019 				    struct cdp_flow_stats *stats);
2020 
2021 /**
2022  * dp_rx_flow_delete_entry() - Delete a flow entry from flow search table
2023  * @pdev: pdev handle
2024  * @rx_flow_info: DP flow parameters
2025  *
2026  * Return: Success when flow is deleted, error on failure
2027  */
2028 QDF_STATUS dp_rx_flow_delete_entry(struct dp_pdev *pdev,
2029 				   struct cdp_rx_flow_info *rx_flow_info);
2030 
2031 /**
2032  * dp_rx_flow_add_entry() - Add a flow entry to flow search table
2033  * @pdev: DP pdev instance
2034  * @rx_flow_info: DP flow paramaters
2035  *
2036  * Return: Success when flow is added, no-memory or already exists on error
2037  */
2038 QDF_STATUS dp_rx_flow_add_entry(struct dp_pdev *pdev,
2039 				struct cdp_rx_flow_info *rx_flow_info);
2040 
2041 /**
2042  * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters
2043  * @soc: SoC handle
2044  * @pdev: Pdev handle
2045  *
2046  * Return: Handle to flow search table entry
2047  */
2048 QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev);
2049 
2050 /**
2051  * dp_rx_fst_detach() - De-initialize Rx FST
2052  * @soc: SoC handle
2053  * @pdev: Pdev handle
2054  *
2055  * Return: None
2056  */
2057 void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev);
2058 
2059 /**
2060  * dp_rx_flow_send_fst_fw_setup() - Program FST parameters in FW/HW post-attach
2061  * @soc: SoC handle
2062  * @pdev: Pdev handle
2063  *
2064  * Return: Success when fst parameters are programmed in FW, error otherwise
2065  */
2066 QDF_STATUS dp_rx_flow_send_fst_fw_setup(struct dp_soc *soc,
2067 					struct dp_pdev *pdev);
2068 #else /* !((WLAN_SUPPORT_RX_FLOW_TAG) || defined(WLAN_SUPPORT_RX_FISA)) */
2069 
2070 /**
2071  * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters
2072  * @soc: SoC handle
2073  * @pdev: Pdev handle
2074  *
2075  * Return: Handle to flow search table entry
2076  */
2077 static inline
2078 QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev)
2079 {
2080 	return QDF_STATUS_SUCCESS;
2081 }
2082 
2083 /**
2084  * dp_rx_fst_detach() - De-initialize Rx FST
2085  * @soc: SoC handle
2086  * @pdev: Pdev handle
2087  *
2088  * Return: None
2089  */
2090 static inline
2091 void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev)
2092 {
2093 }
2094 #endif
2095 
2096 /**
2097  * dp_get_vdev_from_soc_vdev_id_wifi3() - Returns vdev object given the vdev id
2098  * @soc: core DP soc context
2099  * @vdev_id: vdev id from vdev object can be retrieved
2100  *
2101  * Return: struct dp_vdev*: Pointer to DP vdev object
2102  */
2103 static inline struct dp_vdev *
2104 dp_get_vdev_from_soc_vdev_id_wifi3(struct dp_soc *soc,
2105 				   uint8_t vdev_id)
2106 {
2107 	if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
2108 		return NULL;
2109 
2110 	return soc->vdev_id_map[vdev_id];
2111 }
2112 
2113 /**
2114  * dp_get_pdev_from_soc_pdev_id_wifi3() - Returns pdev object given the pdev id
2115  * @soc: core DP soc context
2116  * @pdev_id: pdev id from pdev object can be retrieved
2117  *
2118  * Return: struct dp_pdev*: Pointer to DP pdev object
2119  */
2120 static inline struct dp_pdev *
2121 dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc,
2122 				   uint8_t pdev_id)
2123 {
2124 	if (qdf_unlikely(pdev_id >= MAX_PDEV_CNT))
2125 		return NULL;
2126 
2127 	return soc->pdev_list[pdev_id];
2128 }
2129 
2130 /*
2131  * dp_rx_tid_update_wifi3() – Update receive TID state
2132  * @peer: Datapath peer handle
2133  * @tid: TID
2134  * @ba_window_size: BlockAck window size
2135  * @start_seq: Starting sequence number
2136  *
2137  * Return: QDF_STATUS code
2138  */
2139 QDF_STATUS dp_rx_tid_update_wifi3(struct dp_peer *peer, int tid, uint32_t
2140 					 ba_window_size, uint32_t start_seq);
2141 
2142 /**
2143  * dp_get_peer_mac_list(): function to get peer mac list of vdev
2144  * @soc: Datapath soc handle
2145  * @vdev_id: vdev id
2146  * @newmac: Table of the clients mac
2147  * @mac_cnt: No. of MACs required
2148  *
2149  * return: no of clients
2150  */
2151 uint16_t dp_get_peer_mac_list(ol_txrx_soc_handle soc, uint8_t vdev_id,
2152 			      u_int8_t newmac[][QDF_MAC_ADDR_SIZE],
2153 			      u_int16_t mac_cnt);
2154 /*
2155  * dp_is_hw_dbs_enable() - Procedure to check if DBS is supported
2156  * @soc:		DP SoC context
2157  * @max_mac_rings:	No of MAC rings
2158  *
2159  * Return: None
2160  */
2161 void dp_is_hw_dbs_enable(struct dp_soc *soc,
2162 				int *max_mac_rings);
2163 
2164 
2165 #if defined(WLAN_SUPPORT_RX_FISA)
2166 void dp_rx_dump_fisa_table(struct dp_soc *soc);
2167 #endif /* WLAN_SUPPORT_RX_FISA */
2168 
2169 #ifdef MAX_ALLOC_PAGE_SIZE
2170 /**
2171  * dp_set_page_size() - Set the max page size for hw link desc.
2172  * For MCL the page size is set to OS defined value and for WIN
2173  * the page size is set to the max_alloc_size cfg ini
2174  * param.
2175  * This is to ensure that WIN gets contiguous memory allocations
2176  * as per requirement.
2177  * @pages: link desc page handle
2178  * @max_alloc_size: max_alloc_size
2179  *
2180  * Return: None
2181  */
2182 static inline
2183 void dp_set_max_page_size(struct qdf_mem_multi_page_t *pages,
2184 			  uint32_t max_alloc_size)
2185 {
2186 	pages->page_size = qdf_page_size;
2187 }
2188 
2189 #else
2190 static inline
2191 void dp_set_max_page_size(struct qdf_mem_multi_page_t *pages,
2192 			  uint32_t max_alloc_size)
2193 {
2194 	pages->page_size = max_alloc_size;
2195 }
2196 #endif /* MAX_ALLOC_PAGE_SIZE */
2197 
2198 /**
2199  * dp_rx_skip_tlvs() - Skip TLVs len + L2 hdr_offset, save in nbuf->cb
2200  * @nbuf: nbuf cb to be updated
2201  * @l2_hdr_offset: l2_hdr_offset
2202  *
2203  * Return: None
2204  */
2205 void dp_rx_skip_tlvs(qdf_nbuf_t nbuf, uint32_t l3_padding);
2206 
2207 /**
2208  * dp_soc_is_full_mon_enable () - Return if full monitor mode is enabled
2209  * @soc: DP soc handle
2210  *
2211  * Return: Full monitor mode status
2212  */
2213 static inline bool dp_soc_is_full_mon_enable(struct dp_pdev *pdev)
2214 {
2215 	return (pdev->soc->full_mon_mode && pdev->monitor_configured) ?
2216 			true : false;
2217 }
2218 #endif /* #ifndef _DP_INTERNAL_H_ */
2219