xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/dp_internal.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
4*5113495bSYour Name  *
5*5113495bSYour Name  * Permission to use, copy, modify, and/or distribute this software for
6*5113495bSYour Name  * any purpose with or without fee is hereby granted, provided that the
7*5113495bSYour Name  * above copyright notice and this permission notice appear in all
8*5113495bSYour Name  * copies.
9*5113495bSYour Name  *
10*5113495bSYour Name  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
11*5113495bSYour Name  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
12*5113495bSYour Name  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
13*5113495bSYour Name  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
14*5113495bSYour Name  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15*5113495bSYour Name  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
16*5113495bSYour Name  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*5113495bSYour Name  * PERFORMANCE OF THIS SOFTWARE.
18*5113495bSYour Name  */
19*5113495bSYour Name 
20*5113495bSYour Name #ifndef _DP_INTERNAL_H_
21*5113495bSYour Name #define _DP_INTERNAL_H_
22*5113495bSYour Name 
23*5113495bSYour Name #include "dp_types.h"
24*5113495bSYour Name #include "dp_htt.h"
25*5113495bSYour Name #include "dp_rx_tid.h"
26*5113495bSYour Name 
27*5113495bSYour Name #define RX_BUFFER_SIZE_PKTLOG_LITE 1024
28*5113495bSYour Name 
29*5113495bSYour Name #define DP_PEER_WDS_COUNT_INVALID UINT_MAX
30*5113495bSYour Name 
31*5113495bSYour Name #define DP_BLOCKMEM_SIZE 4096
32*5113495bSYour Name #define WBM2_SW_PPE_REL_RING_ID 6
33*5113495bSYour Name #define WBM2_SW_PPE_REL_MAP_ID 11
34*5113495bSYour Name #define DP_TX_PPEDS_POOL_ID 0xF
35*5113495bSYour Name 
36*5113495bSYour Name /* Alignment for consistent memory for DP rings*/
37*5113495bSYour Name #define DP_RING_BASE_ALIGN 32
38*5113495bSYour Name 
39*5113495bSYour Name #define DP_RSSI_INVAL 0x80
40*5113495bSYour Name #define DP_RSSI_AVG_WEIGHT 2
41*5113495bSYour Name /*
42*5113495bSYour Name  * Formula to derive avg_rssi is taken from wifi2.o firmware
43*5113495bSYour Name  */
44*5113495bSYour Name #define DP_GET_AVG_RSSI(avg_rssi, last_rssi) \
45*5113495bSYour Name 	(((avg_rssi) - (((uint8_t)(avg_rssi)) >> DP_RSSI_AVG_WEIGHT)) \
46*5113495bSYour Name 	+ ((((uint8_t)(last_rssi)) >> DP_RSSI_AVG_WEIGHT)))
47*5113495bSYour Name 
48*5113495bSYour Name /* Macro For NYSM value received in VHT TLV */
49*5113495bSYour Name #define VHT_SGI_NYSM 3
50*5113495bSYour Name 
51*5113495bSYour Name #define INVALID_WBM_RING_NUM 0xF
52*5113495bSYour Name 
53*5113495bSYour Name #ifdef FEATURE_DIRECT_LINK
54*5113495bSYour Name #define DIRECT_LINK_REFILL_RING_ENTRIES 64
55*5113495bSYour Name #ifdef IPA_OFFLOAD
56*5113495bSYour Name #ifdef IPA_WDI3_VLAN_SUPPORT
57*5113495bSYour Name #define DIRECT_LINK_REFILL_RING_IDX     4
58*5113495bSYour Name #else
59*5113495bSYour Name #define DIRECT_LINK_REFILL_RING_IDX     3
60*5113495bSYour Name #endif
61*5113495bSYour Name #else
62*5113495bSYour Name #define DIRECT_LINK_REFILL_RING_IDX     2
63*5113495bSYour Name #endif
64*5113495bSYour Name #endif
65*5113495bSYour Name 
66*5113495bSYour Name #define DP_MAX_VLAN_IDS 4096
67*5113495bSYour Name #define DP_VLAN_UNTAGGED 0
68*5113495bSYour Name #define DP_VLAN_TAGGED_MULTICAST 1
69*5113495bSYour Name #define DP_VLAN_TAGGED_UNICAST 2
70*5113495bSYour Name 
71*5113495bSYour Name /**
72*5113495bSYour Name  * struct htt_dbgfs_cfg - structure to maintain required htt data
73*5113495bSYour Name  * @msg_word: htt msg sent to upper layer
74*5113495bSYour Name  * @m: qdf debugfs file pointer
75*5113495bSYour Name  */
76*5113495bSYour Name struct htt_dbgfs_cfg {
77*5113495bSYour Name 	uint32_t *msg_word;
78*5113495bSYour Name 	qdf_debugfs_file_t m;
79*5113495bSYour Name };
80*5113495bSYour Name 
81*5113495bSYour Name /* Cookie MSB bits assigned for different use case.
82*5113495bSYour Name  * Note: User can't use last 3 bits, as it is reserved for pdev_id.
83*5113495bSYour Name  * If in future number of pdev are more than 3.
84*5113495bSYour Name  */
85*5113495bSYour Name /* Reserve for default case */
86*5113495bSYour Name #define DBG_STATS_COOKIE_DEFAULT 0x0
87*5113495bSYour Name 
88*5113495bSYour Name /* Reserve for DP Stats: 3rd bit */
89*5113495bSYour Name #define DBG_STATS_COOKIE_DP_STATS BIT(3)
90*5113495bSYour Name 
91*5113495bSYour Name /* Reserve for HTT Stats debugfs support: 4th bit */
92*5113495bSYour Name #define DBG_STATS_COOKIE_HTT_DBGFS BIT(4)
93*5113495bSYour Name 
94*5113495bSYour Name /*Reserve for HTT Stats debugfs support: 5th bit */
95*5113495bSYour Name #define DBG_SYSFS_STATS_COOKIE BIT(5)
96*5113495bSYour Name 
97*5113495bSYour Name /* Reserve for HTT Stats OBSS PD support: 6th bit */
98*5113495bSYour Name #define DBG_STATS_COOKIE_HTT_OBSS BIT(6)
99*5113495bSYour Name 
100*5113495bSYour Name /*
101*5113495bSYour Name  * Bitmap of HTT PPDU TLV types for Default mode
102*5113495bSYour Name  */
103*5113495bSYour Name #define HTT_PPDU_DEFAULT_TLV_BITMAP \
104*5113495bSYour Name 	(1 << HTT_PPDU_STATS_COMMON_TLV) | \
105*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
106*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
107*5113495bSYour Name 	(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
108*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
109*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV)
110*5113495bSYour Name 
111*5113495bSYour Name /* PPDU STATS CFG */
112*5113495bSYour Name #define DP_PPDU_STATS_CFG_ALL 0xFFFF
113*5113495bSYour Name 
114*5113495bSYour Name /* PPDU stats mask sent to FW to enable enhanced stats */
115*5113495bSYour Name #define DP_PPDU_STATS_CFG_ENH_STATS \
116*5113495bSYour Name 	(HTT_PPDU_DEFAULT_TLV_BITMAP) | \
117*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV) | \
118*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMMON_ARRAY_TLV) | \
119*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USERS_INFO_TLV)
120*5113495bSYour Name 
121*5113495bSYour Name /* PPDU stats mask sent to FW to support debug sniffer feature */
122*5113495bSYour Name #define DP_PPDU_STATS_CFG_SNIFFER \
123*5113495bSYour Name 	(HTT_PPDU_DEFAULT_TLV_BITMAP) | \
124*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV) | \
125*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV) | \
126*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV) | \
127*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \
128*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV) | \
129*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \
130*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_FLUSH_TLV) | \
131*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMMON_ARRAY_TLV) | \
132*5113495bSYour Name 	(1 << HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV) | \
133*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USERS_INFO_TLV)
134*5113495bSYour Name 
135*5113495bSYour Name /* PPDU stats mask sent to FW to support BPR feature*/
136*5113495bSYour Name #define DP_PPDU_STATS_CFG_BPR \
137*5113495bSYour Name 	(1 << HTT_PPDU_STATS_TX_MGMTCTRL_PAYLOAD_TLV) | \
138*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USERS_INFO_TLV)
139*5113495bSYour Name 
140*5113495bSYour Name /* PPDU stats mask sent to FW to support BPR and enhanced stats feature */
141*5113495bSYour Name #define DP_PPDU_STATS_CFG_BPR_ENH (DP_PPDU_STATS_CFG_BPR | \
142*5113495bSYour Name 				   DP_PPDU_STATS_CFG_ENH_STATS)
143*5113495bSYour Name /* PPDU stats mask sent to FW to support BPR and pcktlog stats feature */
144*5113495bSYour Name #define DP_PPDU_STATS_CFG_BPR_PKTLOG (DP_PPDU_STATS_CFG_BPR | \
145*5113495bSYour Name 				      DP_PPDU_TXLITE_STATS_BITMASK_CFG)
146*5113495bSYour Name 
147*5113495bSYour Name /*
148*5113495bSYour Name  * Bitmap of HTT PPDU delayed ba TLV types for Default mode
149*5113495bSYour Name  */
150*5113495bSYour Name #define HTT_PPDU_DELAYED_BA_TLV_BITMAP \
151*5113495bSYour Name 	(1 << HTT_PPDU_STATS_COMMON_TLV) | \
152*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
153*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_RATE_TLV)
154*5113495bSYour Name 
155*5113495bSYour Name /*
156*5113495bSYour Name  * Bitmap of HTT PPDU TLV types for Delayed BA
157*5113495bSYour Name  */
158*5113495bSYour Name #define HTT_PPDU_STATUS_TLV_BITMAP \
159*5113495bSYour Name 	(1 << HTT_PPDU_STATS_COMMON_TLV) | \
160*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV)
161*5113495bSYour Name 
162*5113495bSYour Name /*
163*5113495bSYour Name  * Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 64
164*5113495bSYour Name  */
165*5113495bSYour Name #define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_64 \
166*5113495bSYour Name 	((1 << HTT_PPDU_STATS_COMMON_TLV) | \
167*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
168*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
169*5113495bSYour Name 	(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
170*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
171*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \
172*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_64_TLV) | \
173*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_64_TLV))
174*5113495bSYour Name 
175*5113495bSYour Name /*
176*5113495bSYour Name  * Bitmap of HTT PPDU TLV types for Sniffer mode bitmap 256
177*5113495bSYour Name  */
178*5113495bSYour Name #define HTT_PPDU_SNIFFER_AMPDU_TLV_BITMAP_256 \
179*5113495bSYour Name 	((1 << HTT_PPDU_STATS_COMMON_TLV) | \
180*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMMON_TLV) | \
181*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_RATE_TLV) | \
182*5113495bSYour Name 	(1 << HTT_PPDU_STATS_SCH_CMD_STATUS_TLV) | \
183*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_COMMON_TLV) | \
184*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_ACK_BA_STATUS_TLV) | \
185*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_COMPLTN_BA_BITMAP_256_TLV) | \
186*5113495bSYour Name 	(1 << HTT_PPDU_STATS_USR_MPDU_ENQ_BITMAP_256_TLV))
187*5113495bSYour Name 
188*5113495bSYour Name static const enum cdp_packet_type hal_2_dp_pkt_type_map[HAL_DOT11_MAX] = {
189*5113495bSYour Name 	[HAL_DOT11A] = DOT11_A,
190*5113495bSYour Name 	[HAL_DOT11B] = DOT11_B,
191*5113495bSYour Name 	[HAL_DOT11N_MM] = DOT11_N,
192*5113495bSYour Name 	[HAL_DOT11AC] = DOT11_AC,
193*5113495bSYour Name 	[HAL_DOT11AX] = DOT11_AX,
194*5113495bSYour Name 	[HAL_DOT11BA] = DOT11_MAX,
195*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
196*5113495bSYour Name 	[HAL_DOT11BE] = DOT11_BE,
197*5113495bSYour Name #else
198*5113495bSYour Name 	[HAL_DOT11BE] = DOT11_MAX,
199*5113495bSYour Name #endif
200*5113495bSYour Name 	[HAL_DOT11AZ] = DOT11_MAX,
201*5113495bSYour Name 	[HAL_DOT11N_GF] = DOT11_MAX,
202*5113495bSYour Name };
203*5113495bSYour Name 
204*5113495bSYour Name #ifdef GLOBAL_ASSERT_AVOIDANCE
205*5113495bSYour Name #define dp_assert_always_internal_stat(_expr, _handle, _field) \
206*5113495bSYour Name 	(qdf_unlikely(!(_expr)) ? ((_handle)->stats._field++, true) : false)
207*5113495bSYour Name 
208*5113495bSYour Name #define dp_assert_always_internal_ds_stat(_expr, _handle, _field) \
209*5113495bSYour Name 				((_handle)->ppeds_stats._field++)
210*5113495bSYour Name 
dp_assert_always_internal(bool expr)211*5113495bSYour Name static inline bool dp_assert_always_internal(bool expr)
212*5113495bSYour Name {
213*5113495bSYour Name 	return !expr;
214*5113495bSYour Name }
215*5113495bSYour Name #else
__dp_assert_always_internal(bool expr)216*5113495bSYour Name static inline bool __dp_assert_always_internal(bool expr)
217*5113495bSYour Name {
218*5113495bSYour Name 	qdf_assert_always(expr);
219*5113495bSYour Name 
220*5113495bSYour Name 	return false;
221*5113495bSYour Name }
222*5113495bSYour Name 
223*5113495bSYour Name #define dp_assert_always_internal(_expr) __dp_assert_always_internal(_expr)
224*5113495bSYour Name 
225*5113495bSYour Name #define dp_assert_always_internal_stat(_expr, _handle, _field) \
226*5113495bSYour Name 				dp_assert_always_internal(_expr)
227*5113495bSYour Name 
228*5113495bSYour Name #define dp_assert_always_internal_ds_stat(_expr, _handle, _field) \
229*5113495bSYour Name 				dp_assert_always_internal(_expr)
230*5113495bSYour Name #endif
231*5113495bSYour Name 
232*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
233*5113495bSYour Name /**
234*5113495bSYour Name  * dp_get_mcs_array_index_by_pkt_type_mcs() - get the destination mcs index
235*5113495bSYour Name  *					      in array
236*5113495bSYour Name  * @pkt_type: host SW pkt type
237*5113495bSYour Name  * @mcs: mcs value for TX/RX rate
238*5113495bSYour Name  *
239*5113495bSYour Name  * Return: succeeded - valid index in mcs array
240*5113495bSYour Name  *	   fail - same value as MCS_MAX
241*5113495bSYour Name  */
242*5113495bSYour Name static inline uint8_t
dp_get_mcs_array_index_by_pkt_type_mcs(uint32_t pkt_type,uint32_t mcs)243*5113495bSYour Name dp_get_mcs_array_index_by_pkt_type_mcs(uint32_t pkt_type, uint32_t mcs)
244*5113495bSYour Name {
245*5113495bSYour Name 	uint8_t dst_mcs_idx = MCS_INVALID_ARRAY_INDEX;
246*5113495bSYour Name 
247*5113495bSYour Name 	switch (pkt_type) {
248*5113495bSYour Name 	case DOT11_A:
249*5113495bSYour Name 		dst_mcs_idx =
250*5113495bSYour Name 			mcs >= MAX_MCS_11A ? (MAX_MCS - 1) : mcs;
251*5113495bSYour Name 		break;
252*5113495bSYour Name 	case DOT11_B:
253*5113495bSYour Name 		dst_mcs_idx =
254*5113495bSYour Name 			mcs >= MAX_MCS_11B ? (MAX_MCS - 1) : mcs;
255*5113495bSYour Name 		break;
256*5113495bSYour Name 	case DOT11_N:
257*5113495bSYour Name 		dst_mcs_idx =
258*5113495bSYour Name 			mcs >= MAX_MCS_11N ? (MAX_MCS - 1) : mcs;
259*5113495bSYour Name 		break;
260*5113495bSYour Name 	case DOT11_AC:
261*5113495bSYour Name 		dst_mcs_idx =
262*5113495bSYour Name 			mcs >= MAX_MCS_11AC ? (MAX_MCS - 1) : mcs;
263*5113495bSYour Name 		break;
264*5113495bSYour Name 	case DOT11_AX:
265*5113495bSYour Name 		dst_mcs_idx =
266*5113495bSYour Name 			mcs >= MAX_MCS_11AX ? (MAX_MCS - 1) : mcs;
267*5113495bSYour Name 		break;
268*5113495bSYour Name 	case DOT11_BE:
269*5113495bSYour Name 		dst_mcs_idx =
270*5113495bSYour Name 			mcs >= MAX_MCS_11BE ? (MAX_MCS - 1) : mcs;
271*5113495bSYour Name 		break;
272*5113495bSYour Name 	default:
273*5113495bSYour Name 		break;
274*5113495bSYour Name 	}
275*5113495bSYour Name 
276*5113495bSYour Name 	return dst_mcs_idx;
277*5113495bSYour Name }
278*5113495bSYour Name #else
279*5113495bSYour Name static inline uint8_t
dp_get_mcs_array_index_by_pkt_type_mcs(uint32_t pkt_type,uint32_t mcs)280*5113495bSYour Name dp_get_mcs_array_index_by_pkt_type_mcs(uint32_t pkt_type, uint32_t mcs)
281*5113495bSYour Name {
282*5113495bSYour Name 	uint8_t dst_mcs_idx = MCS_INVALID_ARRAY_INDEX;
283*5113495bSYour Name 
284*5113495bSYour Name 	switch (pkt_type) {
285*5113495bSYour Name 	case DOT11_A:
286*5113495bSYour Name 		dst_mcs_idx =
287*5113495bSYour Name 			mcs >= MAX_MCS_11A ? (MAX_MCS - 1) : mcs;
288*5113495bSYour Name 		break;
289*5113495bSYour Name 	case DOT11_B:
290*5113495bSYour Name 		dst_mcs_idx =
291*5113495bSYour Name 			mcs >= MAX_MCS_11B ? (MAX_MCS - 1) : mcs;
292*5113495bSYour Name 		break;
293*5113495bSYour Name 	case DOT11_N:
294*5113495bSYour Name 		dst_mcs_idx =
295*5113495bSYour Name 			mcs >= MAX_MCS_11N ? (MAX_MCS - 1) : mcs;
296*5113495bSYour Name 		break;
297*5113495bSYour Name 	case DOT11_AC:
298*5113495bSYour Name 		dst_mcs_idx =
299*5113495bSYour Name 			mcs >= MAX_MCS_11AC ? (MAX_MCS - 1) : mcs;
300*5113495bSYour Name 		break;
301*5113495bSYour Name 	case DOT11_AX:
302*5113495bSYour Name 		dst_mcs_idx =
303*5113495bSYour Name 			mcs >= MAX_MCS_11AX ? (MAX_MCS - 1) : mcs;
304*5113495bSYour Name 		break;
305*5113495bSYour Name 	default:
306*5113495bSYour Name 		break;
307*5113495bSYour Name 	}
308*5113495bSYour Name 
309*5113495bSYour Name 	return dst_mcs_idx;
310*5113495bSYour Name }
311*5113495bSYour Name #endif
312*5113495bSYour Name 
313*5113495bSYour Name #ifdef WIFI_MONITOR_SUPPORT
314*5113495bSYour Name QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc);
315*5113495bSYour Name QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc);
316*5113495bSYour Name #else
317*5113495bSYour Name static inline
dp_mon_soc_attach(struct dp_soc * soc)318*5113495bSYour Name QDF_STATUS dp_mon_soc_attach(struct dp_soc *soc)
319*5113495bSYour Name {
320*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
321*5113495bSYour Name }
322*5113495bSYour Name 
323*5113495bSYour Name static inline
dp_mon_soc_detach(struct dp_soc * soc)324*5113495bSYour Name QDF_STATUS dp_mon_soc_detach(struct dp_soc *soc)
325*5113495bSYour Name {
326*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
327*5113495bSYour Name }
328*5113495bSYour Name #endif
329*5113495bSYour Name 
330*5113495bSYour Name /**
331*5113495bSYour Name  * dp_rx_err_match_dhost() - function to check whether dest-mac is correct
332*5113495bSYour Name  * @eh: Ethernet header of incoming packet
333*5113495bSYour Name  * @vdev: dp_vdev object of the VAP on which this data packet is received
334*5113495bSYour Name  *
335*5113495bSYour Name  * Return: 1 if the destination mac is correct,
336*5113495bSYour Name  *         0 if this frame is not correctly destined to this VAP/MLD
337*5113495bSYour Name  */
338*5113495bSYour Name int dp_rx_err_match_dhost(qdf_ether_header_t *eh, struct dp_vdev *vdev);
339*5113495bSYour Name 
340*5113495bSYour Name #ifdef MONITOR_MODULARIZED_ENABLE
dp_monitor_modularized_enable(void)341*5113495bSYour Name static inline bool dp_monitor_modularized_enable(void)
342*5113495bSYour Name {
343*5113495bSYour Name 	return TRUE;
344*5113495bSYour Name }
345*5113495bSYour Name 
346*5113495bSYour Name static inline QDF_STATUS
dp_mon_soc_attach_wrapper(struct dp_soc * soc)347*5113495bSYour Name dp_mon_soc_attach_wrapper(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; }
348*5113495bSYour Name 
349*5113495bSYour Name static inline QDF_STATUS
dp_mon_soc_detach_wrapper(struct dp_soc * soc)350*5113495bSYour Name dp_mon_soc_detach_wrapper(struct dp_soc *soc) { return QDF_STATUS_SUCCESS; }
351*5113495bSYour Name #else
dp_monitor_modularized_enable(void)352*5113495bSYour Name static inline bool dp_monitor_modularized_enable(void)
353*5113495bSYour Name {
354*5113495bSYour Name 	return FALSE;
355*5113495bSYour Name }
356*5113495bSYour Name 
dp_mon_soc_attach_wrapper(struct dp_soc * soc)357*5113495bSYour Name static inline QDF_STATUS dp_mon_soc_attach_wrapper(struct dp_soc *soc)
358*5113495bSYour Name {
359*5113495bSYour Name 	return dp_mon_soc_attach(soc);
360*5113495bSYour Name }
361*5113495bSYour Name 
dp_mon_soc_detach_wrapper(struct dp_soc * soc)362*5113495bSYour Name static inline QDF_STATUS dp_mon_soc_detach_wrapper(struct dp_soc *soc)
363*5113495bSYour Name {
364*5113495bSYour Name 	return dp_mon_soc_detach(soc);
365*5113495bSYour Name }
366*5113495bSYour Name #endif
367*5113495bSYour Name 
368*5113495bSYour Name #ifndef WIFI_MONITOR_SUPPORT
369*5113495bSYour Name #define MON_BUF_MIN_ENTRIES 64
370*5113495bSYour Name 
dp_monitor_pdev_attach(struct dp_pdev * pdev)371*5113495bSYour Name static inline QDF_STATUS dp_monitor_pdev_attach(struct dp_pdev *pdev)
372*5113495bSYour Name {
373*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
374*5113495bSYour Name }
375*5113495bSYour Name 
dp_monitor_pdev_detach(struct dp_pdev * pdev)376*5113495bSYour Name static inline QDF_STATUS dp_monitor_pdev_detach(struct dp_pdev *pdev)
377*5113495bSYour Name {
378*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
379*5113495bSYour Name }
380*5113495bSYour Name 
dp_monitor_vdev_attach(struct dp_vdev * vdev)381*5113495bSYour Name static inline QDF_STATUS dp_monitor_vdev_attach(struct dp_vdev *vdev)
382*5113495bSYour Name {
383*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
384*5113495bSYour Name }
385*5113495bSYour Name 
dp_monitor_vdev_detach(struct dp_vdev * vdev)386*5113495bSYour Name static inline QDF_STATUS dp_monitor_vdev_detach(struct dp_vdev *vdev)
387*5113495bSYour Name {
388*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
389*5113495bSYour Name }
390*5113495bSYour Name 
dp_monitor_peer_attach(struct dp_soc * soc,struct dp_peer * peer)391*5113495bSYour Name static inline QDF_STATUS dp_monitor_peer_attach(struct dp_soc *soc,
392*5113495bSYour Name 						struct dp_peer *peer)
393*5113495bSYour Name {
394*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
395*5113495bSYour Name }
396*5113495bSYour Name 
dp_monitor_peer_detach(struct dp_soc * soc,struct dp_peer * peer)397*5113495bSYour Name static inline QDF_STATUS dp_monitor_peer_detach(struct dp_soc *soc,
398*5113495bSYour Name 						struct dp_peer *peer)
399*5113495bSYour Name {
400*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
401*5113495bSYour Name }
402*5113495bSYour Name 
403*5113495bSYour Name static inline struct cdp_peer_rate_stats_ctx*
dp_monitor_peer_get_peerstats_ctx(struct dp_soc * soc,struct dp_peer * peer)404*5113495bSYour Name dp_monitor_peer_get_peerstats_ctx(struct dp_soc *soc, struct dp_peer *peer)
405*5113495bSYour Name {
406*5113495bSYour Name 	return NULL;
407*5113495bSYour Name }
408*5113495bSYour Name 
409*5113495bSYour Name static inline
dp_monitor_peer_reset_stats(struct dp_soc * soc,struct dp_peer * peer)410*5113495bSYour Name void dp_monitor_peer_reset_stats(struct dp_soc *soc, struct dp_peer *peer)
411*5113495bSYour Name {
412*5113495bSYour Name }
413*5113495bSYour Name 
414*5113495bSYour Name static inline
dp_monitor_peer_get_stats(struct dp_soc * soc,struct dp_peer * peer,void * arg,enum cdp_stat_update_type type)415*5113495bSYour Name void dp_monitor_peer_get_stats(struct dp_soc *soc, struct dp_peer *peer,
416*5113495bSYour Name 			       void *arg, enum cdp_stat_update_type type)
417*5113495bSYour Name {
418*5113495bSYour Name }
419*5113495bSYour Name 
420*5113495bSYour Name static inline
dp_monitor_invalid_peer_update_pdev_stats(struct dp_soc * soc,struct dp_pdev * pdev)421*5113495bSYour Name void dp_monitor_invalid_peer_update_pdev_stats(struct dp_soc *soc,
422*5113495bSYour Name 					       struct dp_pdev *pdev)
423*5113495bSYour Name {
424*5113495bSYour Name }
425*5113495bSYour Name 
426*5113495bSYour Name static inline
dp_monitor_peer_get_stats_param(struct dp_soc * soc,struct dp_peer * peer,enum cdp_peer_stats_type type,cdp_peer_stats_param_t * buf)427*5113495bSYour Name QDF_STATUS dp_monitor_peer_get_stats_param(struct dp_soc *soc,
428*5113495bSYour Name 					   struct dp_peer *peer,
429*5113495bSYour Name 					   enum cdp_peer_stats_type type,
430*5113495bSYour Name 					   cdp_peer_stats_param_t *buf)
431*5113495bSYour Name {
432*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
433*5113495bSYour Name }
434*5113495bSYour Name 
dp_monitor_pdev_init(struct dp_pdev * pdev)435*5113495bSYour Name static inline QDF_STATUS dp_monitor_pdev_init(struct dp_pdev *pdev)
436*5113495bSYour Name {
437*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
438*5113495bSYour Name }
439*5113495bSYour Name 
dp_monitor_pdev_deinit(struct dp_pdev * pdev)440*5113495bSYour Name static inline QDF_STATUS dp_monitor_pdev_deinit(struct dp_pdev *pdev)
441*5113495bSYour Name {
442*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
443*5113495bSYour Name }
444*5113495bSYour Name 
dp_monitor_soc_cfg_init(struct dp_soc * soc)445*5113495bSYour Name static inline QDF_STATUS dp_monitor_soc_cfg_init(struct dp_soc *soc)
446*5113495bSYour Name {
447*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
448*5113495bSYour Name }
449*5113495bSYour Name 
dp_monitor_config_debug_sniffer(struct dp_pdev * pdev,int val)450*5113495bSYour Name static inline QDF_STATUS dp_monitor_config_debug_sniffer(struct dp_pdev *pdev,
451*5113495bSYour Name 							 int val)
452*5113495bSYour Name {
453*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
454*5113495bSYour Name }
455*5113495bSYour Name 
dp_monitor_flush_rings(struct dp_soc * soc)456*5113495bSYour Name static inline void dp_monitor_flush_rings(struct dp_soc *soc)
457*5113495bSYour Name {
458*5113495bSYour Name }
459*5113495bSYour Name 
dp_monitor_htt_srng_setup(struct dp_soc * soc,struct dp_pdev * pdev,int mac_id,int mac_for_pdev)460*5113495bSYour Name static inline QDF_STATUS dp_monitor_htt_srng_setup(struct dp_soc *soc,
461*5113495bSYour Name 						   struct dp_pdev *pdev,
462*5113495bSYour Name 						   int mac_id,
463*5113495bSYour Name 						   int mac_for_pdev)
464*5113495bSYour Name {
465*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
466*5113495bSYour Name }
467*5113495bSYour Name 
dp_monitor_service_mon_rings(struct dp_soc * soc,uint32_t quota)468*5113495bSYour Name static inline void dp_monitor_service_mon_rings(struct dp_soc *soc,
469*5113495bSYour Name 						uint32_t quota)
470*5113495bSYour Name {
471*5113495bSYour Name }
472*5113495bSYour Name 
473*5113495bSYour Name static inline
dp_monitor_process(struct dp_soc * soc,struct dp_intr * int_ctx,uint32_t mac_id,uint32_t quota)474*5113495bSYour Name uint32_t dp_monitor_process(struct dp_soc *soc, struct dp_intr *int_ctx,
475*5113495bSYour Name 			    uint32_t mac_id, uint32_t quota)
476*5113495bSYour Name {
477*5113495bSYour Name 	return 0;
478*5113495bSYour Name }
479*5113495bSYour Name 
480*5113495bSYour Name static inline
dp_monitor_drop_packets_for_mac(struct dp_pdev * pdev,uint32_t mac_id,uint32_t quota)481*5113495bSYour Name uint32_t dp_monitor_drop_packets_for_mac(struct dp_pdev *pdev,
482*5113495bSYour Name 					 uint32_t mac_id, uint32_t quota)
483*5113495bSYour Name {
484*5113495bSYour Name 	return 0;
485*5113495bSYour Name }
486*5113495bSYour Name 
dp_monitor_peer_tx_init(struct dp_pdev * pdev,struct dp_peer * peer)487*5113495bSYour Name static inline void dp_monitor_peer_tx_init(struct dp_pdev *pdev,
488*5113495bSYour Name 					   struct dp_peer *peer)
489*5113495bSYour Name {
490*5113495bSYour Name }
491*5113495bSYour Name 
dp_monitor_peer_tx_cleanup(struct dp_vdev * vdev,struct dp_peer * peer)492*5113495bSYour Name static inline void dp_monitor_peer_tx_cleanup(struct dp_vdev *vdev,
493*5113495bSYour Name 					      struct dp_peer *peer)
494*5113495bSYour Name {
495*5113495bSYour Name }
496*5113495bSYour Name 
497*5113495bSYour Name static inline
dp_monitor_peer_tid_peer_id_update(struct dp_soc * soc,struct dp_peer * peer,uint16_t peer_id)498*5113495bSYour Name void dp_monitor_peer_tid_peer_id_update(struct dp_soc *soc,
499*5113495bSYour Name 					struct dp_peer *peer,
500*5113495bSYour Name 					uint16_t peer_id)
501*5113495bSYour Name {
502*5113495bSYour Name }
503*5113495bSYour Name 
dp_monitor_tx_ppdu_stats_attach(struct dp_pdev * pdev)504*5113495bSYour Name static inline void dp_monitor_tx_ppdu_stats_attach(struct dp_pdev *pdev)
505*5113495bSYour Name {
506*5113495bSYour Name }
507*5113495bSYour Name 
dp_monitor_tx_ppdu_stats_detach(struct dp_pdev * pdev)508*5113495bSYour Name static inline void dp_monitor_tx_ppdu_stats_detach(struct dp_pdev *pdev)
509*5113495bSYour Name {
510*5113495bSYour Name }
511*5113495bSYour Name 
512*5113495bSYour Name static inline
dp_monitor_tx_capture_debugfs_init(struct dp_pdev * pdev)513*5113495bSYour Name QDF_STATUS dp_monitor_tx_capture_debugfs_init(struct dp_pdev *pdev)
514*5113495bSYour Name {
515*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
516*5113495bSYour Name }
517*5113495bSYour Name 
dp_monitor_peer_tx_capture_filter_check(struct dp_pdev * pdev,struct dp_peer * peer)518*5113495bSYour Name static inline void dp_monitor_peer_tx_capture_filter_check(struct dp_pdev *pdev,
519*5113495bSYour Name 							   struct dp_peer *peer)
520*5113495bSYour Name {
521*5113495bSYour Name }
522*5113495bSYour Name 
523*5113495bSYour Name static inline
dp_monitor_tx_add_to_comp_queue(struct dp_soc * soc,struct dp_tx_desc_s * desc,struct hal_tx_completion_status * ts,uint16_t peer_id)524*5113495bSYour Name QDF_STATUS dp_monitor_tx_add_to_comp_queue(struct dp_soc *soc,
525*5113495bSYour Name 					   struct dp_tx_desc_s *desc,
526*5113495bSYour Name 					   struct hal_tx_completion_status *ts,
527*5113495bSYour Name 					   uint16_t peer_id)
528*5113495bSYour Name {
529*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
530*5113495bSYour Name }
531*5113495bSYour Name 
532*5113495bSYour Name static inline
monitor_update_msdu_to_list(struct dp_soc * soc,struct dp_pdev * pdev,struct dp_peer * peer,struct hal_tx_completion_status * ts,qdf_nbuf_t netbuf)533*5113495bSYour Name QDF_STATUS monitor_update_msdu_to_list(struct dp_soc *soc,
534*5113495bSYour Name 				       struct dp_pdev *pdev,
535*5113495bSYour Name 				       struct dp_peer *peer,
536*5113495bSYour Name 				       struct hal_tx_completion_status *ts,
537*5113495bSYour Name 				       qdf_nbuf_t netbuf)
538*5113495bSYour Name {
539*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
540*5113495bSYour Name }
541*5113495bSYour Name 
dp_monitor_ppdu_stats_ind_handler(struct htt_soc * soc,uint32_t * msg_word,qdf_nbuf_t htt_t2h_msg)542*5113495bSYour Name static inline bool dp_monitor_ppdu_stats_ind_handler(struct htt_soc *soc,
543*5113495bSYour Name 						     uint32_t *msg_word,
544*5113495bSYour Name 						     qdf_nbuf_t htt_t2h_msg)
545*5113495bSYour Name {
546*5113495bSYour Name 	return true;
547*5113495bSYour Name }
548*5113495bSYour Name 
dp_monitor_htt_ppdu_stats_attach(struct dp_pdev * pdev)549*5113495bSYour Name static inline QDF_STATUS dp_monitor_htt_ppdu_stats_attach(struct dp_pdev *pdev)
550*5113495bSYour Name {
551*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
552*5113495bSYour Name }
553*5113495bSYour Name 
dp_monitor_htt_ppdu_stats_detach(struct dp_pdev * pdev)554*5113495bSYour Name static inline void dp_monitor_htt_ppdu_stats_detach(struct dp_pdev *pdev)
555*5113495bSYour Name {
556*5113495bSYour Name }
557*5113495bSYour Name 
dp_monitor_print_pdev_rx_mon_stats(struct dp_pdev * pdev)558*5113495bSYour Name static inline void dp_monitor_print_pdev_rx_mon_stats(struct dp_pdev *pdev)
559*5113495bSYour Name {
560*5113495bSYour Name }
561*5113495bSYour Name 
dp_monitor_config_enh_tx_capture(struct dp_pdev * pdev,uint32_t val)562*5113495bSYour Name static inline QDF_STATUS dp_monitor_config_enh_tx_capture(struct dp_pdev *pdev,
563*5113495bSYour Name 							  uint32_t val)
564*5113495bSYour Name {
565*5113495bSYour Name 	return QDF_STATUS_E_INVAL;
566*5113495bSYour Name }
567*5113495bSYour Name 
dp_monitor_tx_peer_filter(struct dp_pdev * pdev,struct dp_peer * peer,uint8_t is_tx_pkt_cap_enable,uint8_t * peer_mac)568*5113495bSYour Name static inline QDF_STATUS dp_monitor_tx_peer_filter(struct dp_pdev *pdev,
569*5113495bSYour Name 						   struct dp_peer *peer,
570*5113495bSYour Name 						   uint8_t is_tx_pkt_cap_enable,
571*5113495bSYour Name 						   uint8_t *peer_mac)
572*5113495bSYour Name {
573*5113495bSYour Name 	return QDF_STATUS_E_INVAL;
574*5113495bSYour Name }
575*5113495bSYour Name 
dp_monitor_config_enh_rx_capture(struct dp_pdev * pdev,uint32_t val)576*5113495bSYour Name static inline QDF_STATUS dp_monitor_config_enh_rx_capture(struct dp_pdev *pdev,
577*5113495bSYour Name 							  uint32_t val)
578*5113495bSYour Name {
579*5113495bSYour Name 	return QDF_STATUS_E_INVAL;
580*5113495bSYour Name }
581*5113495bSYour Name 
582*5113495bSYour Name static inline
dp_monitor_set_bpr_enable(struct dp_pdev * pdev,uint32_t val)583*5113495bSYour Name QDF_STATUS dp_monitor_set_bpr_enable(struct dp_pdev *pdev, uint32_t val)
584*5113495bSYour Name {
585*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
586*5113495bSYour Name }
587*5113495bSYour Name 
588*5113495bSYour Name static inline
dp_monitor_set_filter_neigh_peers(struct dp_pdev * pdev,bool val)589*5113495bSYour Name int dp_monitor_set_filter_neigh_peers(struct dp_pdev *pdev, bool val)
590*5113495bSYour Name {
591*5113495bSYour Name 	return 0;
592*5113495bSYour Name }
593*5113495bSYour Name 
594*5113495bSYour Name static inline
dp_monitor_set_atf_stats_enable(struct dp_pdev * pdev,bool value)595*5113495bSYour Name void dp_monitor_set_atf_stats_enable(struct dp_pdev *pdev, bool value)
596*5113495bSYour Name {
597*5113495bSYour Name }
598*5113495bSYour Name 
599*5113495bSYour Name static inline
dp_monitor_set_bsscolor(struct dp_pdev * pdev,uint8_t bsscolor)600*5113495bSYour Name void dp_monitor_set_bsscolor(struct dp_pdev *pdev, uint8_t bsscolor)
601*5113495bSYour Name {
602*5113495bSYour Name }
603*5113495bSYour Name 
604*5113495bSYour Name static inline
dp_monitor_pdev_get_filter_mcast_data(struct cdp_pdev * pdev_handle)605*5113495bSYour Name bool dp_monitor_pdev_get_filter_mcast_data(struct cdp_pdev *pdev_handle)
606*5113495bSYour Name {
607*5113495bSYour Name 	return false;
608*5113495bSYour Name }
609*5113495bSYour Name 
610*5113495bSYour Name static inline
dp_monitor_pdev_get_filter_non_data(struct cdp_pdev * pdev_handle)611*5113495bSYour Name bool dp_monitor_pdev_get_filter_non_data(struct cdp_pdev *pdev_handle)
612*5113495bSYour Name {
613*5113495bSYour Name 	return false;
614*5113495bSYour Name }
615*5113495bSYour Name 
616*5113495bSYour Name static inline
dp_monitor_pdev_get_filter_ucast_data(struct cdp_pdev * pdev_handle)617*5113495bSYour Name bool dp_monitor_pdev_get_filter_ucast_data(struct cdp_pdev *pdev_handle)
618*5113495bSYour Name {
619*5113495bSYour Name 	return false;
620*5113495bSYour Name }
621*5113495bSYour Name 
622*5113495bSYour Name static inline
dp_monitor_set_pktlog_wifi3(struct dp_pdev * pdev,uint32_t event,bool enable)623*5113495bSYour Name int dp_monitor_set_pktlog_wifi3(struct dp_pdev *pdev, uint32_t event,
624*5113495bSYour Name 				bool enable)
625*5113495bSYour Name {
626*5113495bSYour Name 	return 0;
627*5113495bSYour Name }
628*5113495bSYour Name 
dp_monitor_pktlogmod_exit(struct dp_pdev * pdev)629*5113495bSYour Name static inline void dp_monitor_pktlogmod_exit(struct dp_pdev *pdev)
630*5113495bSYour Name {
631*5113495bSYour Name }
632*5113495bSYour Name 
633*5113495bSYour Name static inline
dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev * pdev)634*5113495bSYour Name QDF_STATUS dp_monitor_vdev_set_monitor_mode_buf_rings(struct dp_pdev *pdev)
635*5113495bSYour Name {
636*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
637*5113495bSYour Name }
638*5113495bSYour Name 
639*5113495bSYour Name static inline
dp_monitor_neighbour_peers_detach(struct dp_pdev * pdev)640*5113495bSYour Name void dp_monitor_neighbour_peers_detach(struct dp_pdev *pdev)
641*5113495bSYour Name {
642*5113495bSYour Name }
643*5113495bSYour Name 
dp_monitor_filter_neighbour_peer(struct dp_pdev * pdev,uint8_t * rx_pkt_hdr)644*5113495bSYour Name static inline QDF_STATUS dp_monitor_filter_neighbour_peer(struct dp_pdev *pdev,
645*5113495bSYour Name 							  uint8_t *rx_pkt_hdr)
646*5113495bSYour Name {
647*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
648*5113495bSYour Name }
649*5113495bSYour Name 
dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev * pdev)650*5113495bSYour Name static inline void dp_monitor_print_pdev_tx_capture_stats(struct dp_pdev *pdev)
651*5113495bSYour Name {
652*5113495bSYour Name }
653*5113495bSYour Name 
654*5113495bSYour Name static inline
dp_monitor_reap_timer_init(struct dp_soc * soc)655*5113495bSYour Name void dp_monitor_reap_timer_init(struct dp_soc *soc)
656*5113495bSYour Name {
657*5113495bSYour Name }
658*5113495bSYour Name 
659*5113495bSYour Name static inline
dp_monitor_reap_timer_deinit(struct dp_soc * soc)660*5113495bSYour Name void dp_monitor_reap_timer_deinit(struct dp_soc *soc)
661*5113495bSYour Name {
662*5113495bSYour Name }
663*5113495bSYour Name 
664*5113495bSYour Name static inline
dp_monitor_reap_timer_start(struct dp_soc * soc,enum cdp_mon_reap_source source)665*5113495bSYour Name bool dp_monitor_reap_timer_start(struct dp_soc *soc,
666*5113495bSYour Name 				 enum cdp_mon_reap_source source)
667*5113495bSYour Name {
668*5113495bSYour Name 	return false;
669*5113495bSYour Name }
670*5113495bSYour Name 
671*5113495bSYour Name static inline
dp_monitor_reap_timer_stop(struct dp_soc * soc,enum cdp_mon_reap_source source)672*5113495bSYour Name bool dp_monitor_reap_timer_stop(struct dp_soc *soc,
673*5113495bSYour Name 				enum cdp_mon_reap_source source)
674*5113495bSYour Name {
675*5113495bSYour Name 	return false;
676*5113495bSYour Name }
677*5113495bSYour Name 
678*5113495bSYour Name static inline void
dp_monitor_reap_timer_suspend(struct dp_soc * soc)679*5113495bSYour Name dp_monitor_reap_timer_suspend(struct dp_soc *soc)
680*5113495bSYour Name {
681*5113495bSYour Name }
682*5113495bSYour Name 
683*5113495bSYour Name static inline
dp_monitor_vdev_timer_init(struct dp_soc * soc)684*5113495bSYour Name void dp_monitor_vdev_timer_init(struct dp_soc *soc)
685*5113495bSYour Name {
686*5113495bSYour Name }
687*5113495bSYour Name 
688*5113495bSYour Name static inline
dp_monitor_vdev_timer_deinit(struct dp_soc * soc)689*5113495bSYour Name void dp_monitor_vdev_timer_deinit(struct dp_soc *soc)
690*5113495bSYour Name {
691*5113495bSYour Name }
692*5113495bSYour Name 
693*5113495bSYour Name static inline
dp_monitor_vdev_timer_start(struct dp_soc * soc)694*5113495bSYour Name void dp_monitor_vdev_timer_start(struct dp_soc *soc)
695*5113495bSYour Name {
696*5113495bSYour Name }
697*5113495bSYour Name 
698*5113495bSYour Name static inline
dp_monitor_vdev_timer_stop(struct dp_soc * soc)699*5113495bSYour Name bool dp_monitor_vdev_timer_stop(struct dp_soc *soc)
700*5113495bSYour Name {
701*5113495bSYour Name 	return false;
702*5113495bSYour Name }
703*5113495bSYour Name 
704*5113495bSYour Name static inline struct qdf_mem_multi_page_t*
dp_monitor_get_link_desc_pages(struct dp_soc * soc,uint32_t mac_id)705*5113495bSYour Name dp_monitor_get_link_desc_pages(struct dp_soc *soc, uint32_t mac_id)
706*5113495bSYour Name {
707*5113495bSYour Name 	return NULL;
708*5113495bSYour Name }
709*5113495bSYour Name 
710*5113495bSYour Name static inline struct dp_srng*
dp_monitor_get_link_desc_ring(struct dp_soc * soc,uint32_t mac_id)711*5113495bSYour Name dp_monitor_get_link_desc_ring(struct dp_soc *soc, uint32_t mac_id)
712*5113495bSYour Name {
713*5113495bSYour Name 	return NULL;
714*5113495bSYour Name }
715*5113495bSYour Name 
716*5113495bSYour Name static inline uint32_t
dp_monitor_get_num_link_desc_ring_entries(struct dp_soc * soc)717*5113495bSYour Name dp_monitor_get_num_link_desc_ring_entries(struct dp_soc *soc)
718*5113495bSYour Name {
719*5113495bSYour Name 	return 0;
720*5113495bSYour Name }
721*5113495bSYour Name 
722*5113495bSYour Name static inline uint32_t *
dp_monitor_get_total_link_descs(struct dp_soc * soc,uint32_t mac_id)723*5113495bSYour Name dp_monitor_get_total_link_descs(struct dp_soc *soc, uint32_t mac_id)
724*5113495bSYour Name {
725*5113495bSYour Name 	return NULL;
726*5113495bSYour Name }
727*5113495bSYour Name 
dp_monitor_drop_inv_peer_pkts(struct dp_vdev * vdev)728*5113495bSYour Name static inline QDF_STATUS dp_monitor_drop_inv_peer_pkts(struct dp_vdev *vdev)
729*5113495bSYour Name {
730*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
731*5113495bSYour Name }
732*5113495bSYour Name 
dp_is_enable_reap_timer_non_pkt(struct dp_pdev * pdev)733*5113495bSYour Name static inline bool dp_is_enable_reap_timer_non_pkt(struct dp_pdev *pdev)
734*5113495bSYour Name {
735*5113495bSYour Name 	return false;
736*5113495bSYour Name }
737*5113495bSYour Name 
dp_monitor_vdev_register_osif(struct dp_vdev * vdev,struct ol_txrx_ops * txrx_ops)738*5113495bSYour Name static inline void dp_monitor_vdev_register_osif(struct dp_vdev *vdev,
739*5113495bSYour Name 						 struct ol_txrx_ops *txrx_ops)
740*5113495bSYour Name {
741*5113495bSYour Name }
742*5113495bSYour Name 
dp_monitor_is_vdev_timer_running(struct dp_soc * soc)743*5113495bSYour Name static inline bool dp_monitor_is_vdev_timer_running(struct dp_soc *soc)
744*5113495bSYour Name {
745*5113495bSYour Name 	return false;
746*5113495bSYour Name }
747*5113495bSYour Name 
748*5113495bSYour Name static inline
dp_monitor_pdev_set_mon_vdev(struct dp_vdev * vdev)749*5113495bSYour Name void dp_monitor_pdev_set_mon_vdev(struct dp_vdev *vdev)
750*5113495bSYour Name {
751*5113495bSYour Name }
752*5113495bSYour Name 
dp_monitor_vdev_delete(struct dp_soc * soc,struct dp_vdev * vdev)753*5113495bSYour Name static inline void dp_monitor_vdev_delete(struct dp_soc *soc,
754*5113495bSYour Name 					  struct dp_vdev *vdev)
755*5113495bSYour Name {
756*5113495bSYour Name }
757*5113495bSYour Name 
dp_peer_ppdu_delayed_ba_init(struct dp_peer * peer)758*5113495bSYour Name static inline void dp_peer_ppdu_delayed_ba_init(struct dp_peer *peer)
759*5113495bSYour Name {
760*5113495bSYour Name }
761*5113495bSYour Name 
dp_monitor_neighbour_peer_add_ast(struct dp_pdev * pdev,struct dp_peer * ta_peer,uint8_t * mac_addr,qdf_nbuf_t nbuf,uint32_t flags)762*5113495bSYour Name static inline void dp_monitor_neighbour_peer_add_ast(struct dp_pdev *pdev,
763*5113495bSYour Name 						     struct dp_peer *ta_peer,
764*5113495bSYour Name 						     uint8_t *mac_addr,
765*5113495bSYour Name 						     qdf_nbuf_t nbuf,
766*5113495bSYour Name 						     uint32_t flags)
767*5113495bSYour Name {
768*5113495bSYour Name }
769*5113495bSYour Name 
770*5113495bSYour Name static inline void
dp_monitor_set_chan_band(struct dp_pdev * pdev,enum reg_wifi_band chan_band)771*5113495bSYour Name dp_monitor_set_chan_band(struct dp_pdev *pdev, enum reg_wifi_band chan_band)
772*5113495bSYour Name {
773*5113495bSYour Name }
774*5113495bSYour Name 
775*5113495bSYour Name static inline void
dp_monitor_set_chan_freq(struct dp_pdev * pdev,qdf_freq_t chan_freq)776*5113495bSYour Name dp_monitor_set_chan_freq(struct dp_pdev *pdev, qdf_freq_t chan_freq)
777*5113495bSYour Name {
778*5113495bSYour Name }
779*5113495bSYour Name 
dp_monitor_set_chan_num(struct dp_pdev * pdev,int chan_num)780*5113495bSYour Name static inline void dp_monitor_set_chan_num(struct dp_pdev *pdev, int chan_num)
781*5113495bSYour Name {
782*5113495bSYour Name }
783*5113495bSYour Name 
dp_monitor_is_enable_mcopy_mode(struct dp_pdev * pdev)784*5113495bSYour Name static inline bool dp_monitor_is_enable_mcopy_mode(struct dp_pdev *pdev)
785*5113495bSYour Name {
786*5113495bSYour Name 	return false;
787*5113495bSYour Name }
788*5113495bSYour Name 
789*5113495bSYour Name static inline
dp_monitor_neighbour_peer_list_remove(struct dp_pdev * pdev,struct dp_vdev * vdev,struct dp_neighbour_peer * peer)790*5113495bSYour Name void dp_monitor_neighbour_peer_list_remove(struct dp_pdev *pdev,
791*5113495bSYour Name 					   struct dp_vdev *vdev,
792*5113495bSYour Name 					   struct dp_neighbour_peer *peer)
793*5113495bSYour Name {
794*5113495bSYour Name }
795*5113495bSYour Name 
dp_monitor_is_chan_band_known(struct dp_pdev * pdev)796*5113495bSYour Name static inline bool dp_monitor_is_chan_band_known(struct dp_pdev *pdev)
797*5113495bSYour Name {
798*5113495bSYour Name 	return false;
799*5113495bSYour Name }
800*5113495bSYour Name 
801*5113495bSYour Name static inline enum reg_wifi_band
dp_monitor_get_chan_band(struct dp_pdev * pdev)802*5113495bSYour Name dp_monitor_get_chan_band(struct dp_pdev *pdev)
803*5113495bSYour Name {
804*5113495bSYour Name 	return 0;
805*5113495bSYour Name }
806*5113495bSYour Name 
807*5113495bSYour Name static inline int
dp_monitor_get_chan_num(struct dp_pdev * pdev)808*5113495bSYour Name dp_monitor_get_chan_num(struct dp_pdev *pdev)
809*5113495bSYour Name {
810*5113495bSYour Name 	return 0;
811*5113495bSYour Name }
812*5113495bSYour Name 
813*5113495bSYour Name static inline qdf_freq_t
dp_monitor_get_chan_freq(struct dp_pdev * pdev)814*5113495bSYour Name dp_monitor_get_chan_freq(struct dp_pdev *pdev)
815*5113495bSYour Name {
816*5113495bSYour Name 	return 0;
817*5113495bSYour Name }
818*5113495bSYour Name 
dp_monitor_get_mpdu_status(struct dp_pdev * pdev,struct dp_soc * soc,uint8_t * rx_tlv_hdr)819*5113495bSYour Name static inline void dp_monitor_get_mpdu_status(struct dp_pdev *pdev,
820*5113495bSYour Name 					      struct dp_soc *soc,
821*5113495bSYour Name 					      uint8_t *rx_tlv_hdr)
822*5113495bSYour Name {
823*5113495bSYour Name }
824*5113495bSYour Name 
dp_monitor_print_tx_stats(struct dp_pdev * pdev)825*5113495bSYour Name static inline void dp_monitor_print_tx_stats(struct dp_pdev *pdev)
826*5113495bSYour Name {
827*5113495bSYour Name }
828*5113495bSYour Name 
829*5113495bSYour Name static inline
dp_monitor_mcopy_check_deliver(struct dp_pdev * pdev,uint16_t peer_id,uint32_t ppdu_id,uint8_t first_msdu)830*5113495bSYour Name QDF_STATUS dp_monitor_mcopy_check_deliver(struct dp_pdev *pdev,
831*5113495bSYour Name 					  uint16_t peer_id, uint32_t ppdu_id,
832*5113495bSYour Name 					  uint8_t first_msdu)
833*5113495bSYour Name {
834*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
835*5113495bSYour Name }
836*5113495bSYour Name 
dp_monitor_is_enable_tx_sniffer(struct dp_pdev * pdev)837*5113495bSYour Name static inline bool dp_monitor_is_enable_tx_sniffer(struct dp_pdev *pdev)
838*5113495bSYour Name {
839*5113495bSYour Name 	return false;
840*5113495bSYour Name }
841*5113495bSYour Name 
842*5113495bSYour Name static inline struct dp_vdev*
dp_monitor_get_monitor_vdev_from_pdev(struct dp_pdev * pdev)843*5113495bSYour Name dp_monitor_get_monitor_vdev_from_pdev(struct dp_pdev *pdev)
844*5113495bSYour Name {
845*5113495bSYour Name 	return NULL;
846*5113495bSYour Name }
847*5113495bSYour Name 
dp_monitor_check_com_info_ppdu_id(struct dp_pdev * pdev,void * rx_desc)848*5113495bSYour Name static inline QDF_STATUS dp_monitor_check_com_info_ppdu_id(struct dp_pdev *pdev,
849*5113495bSYour Name 							   void *rx_desc)
850*5113495bSYour Name {
851*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
852*5113495bSYour Name }
853*5113495bSYour Name 
854*5113495bSYour Name static inline struct mon_rx_status*
dp_monitor_get_rx_status(struct dp_pdev * pdev)855*5113495bSYour Name dp_monitor_get_rx_status(struct dp_pdev *pdev)
856*5113495bSYour Name {
857*5113495bSYour Name 	return NULL;
858*5113495bSYour Name }
859*5113495bSYour Name 
860*5113495bSYour Name static inline
dp_monitor_pdev_config_scan_spcl_vap(struct dp_pdev * pdev,bool val)861*5113495bSYour Name void dp_monitor_pdev_config_scan_spcl_vap(struct dp_pdev *pdev, bool val)
862*5113495bSYour Name {
863*5113495bSYour Name }
864*5113495bSYour Name 
865*5113495bSYour Name static inline
dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev * pdev,bool val)866*5113495bSYour Name void dp_monitor_pdev_reset_scan_spcl_vap_stats_enable(struct dp_pdev *pdev,
867*5113495bSYour Name 						      bool val)
868*5113495bSYour Name {
869*5113495bSYour Name }
870*5113495bSYour Name 
871*5113495bSYour Name static inline QDF_STATUS
dp_monitor_peer_tx_capture_get_stats(struct dp_soc * soc,struct dp_peer * peer,struct cdp_peer_tx_capture_stats * stats)872*5113495bSYour Name dp_monitor_peer_tx_capture_get_stats(struct dp_soc *soc, struct dp_peer *peer,
873*5113495bSYour Name 				     struct cdp_peer_tx_capture_stats *stats)
874*5113495bSYour Name {
875*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
876*5113495bSYour Name }
877*5113495bSYour Name 
878*5113495bSYour Name static inline QDF_STATUS
dp_monitor_pdev_tx_capture_get_stats(struct dp_soc * soc,struct dp_pdev * pdev,struct cdp_pdev_tx_capture_stats * stats)879*5113495bSYour Name dp_monitor_pdev_tx_capture_get_stats(struct dp_soc *soc, struct dp_pdev *pdev,
880*5113495bSYour Name 				     struct cdp_pdev_tx_capture_stats *stats)
881*5113495bSYour Name {
882*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
883*5113495bSYour Name }
884*5113495bSYour Name 
885*5113495bSYour Name #ifdef DP_POWER_SAVE
886*5113495bSYour Name static inline
dp_monitor_pktlog_reap_pending_frames(struct dp_pdev * pdev)887*5113495bSYour Name void dp_monitor_pktlog_reap_pending_frames(struct dp_pdev *pdev)
888*5113495bSYour Name {
889*5113495bSYour Name }
890*5113495bSYour Name 
891*5113495bSYour Name static inline
dp_monitor_pktlog_start_reap_timer(struct dp_pdev * pdev)892*5113495bSYour Name void dp_monitor_pktlog_start_reap_timer(struct dp_pdev *pdev)
893*5113495bSYour Name {
894*5113495bSYour Name }
895*5113495bSYour Name #endif
896*5113495bSYour Name 
dp_monitor_is_configured(struct dp_pdev * pdev)897*5113495bSYour Name static inline bool dp_monitor_is_configured(struct dp_pdev *pdev)
898*5113495bSYour Name {
899*5113495bSYour Name 	return false;
900*5113495bSYour Name }
901*5113495bSYour Name 
902*5113495bSYour Name static inline void
dp_mon_rx_hdr_length_set(struct dp_soc * soc,uint32_t * msg_word,struct htt_rx_ring_tlv_filter * tlv_filter)903*5113495bSYour Name dp_mon_rx_hdr_length_set(struct dp_soc *soc, uint32_t *msg_word,
904*5113495bSYour Name 			 struct htt_rx_ring_tlv_filter *tlv_filter)
905*5113495bSYour Name {
906*5113495bSYour Name }
907*5113495bSYour Name 
dp_monitor_soc_init(struct dp_soc * soc)908*5113495bSYour Name static inline void dp_monitor_soc_init(struct dp_soc *soc)
909*5113495bSYour Name {
910*5113495bSYour Name }
911*5113495bSYour Name 
dp_monitor_soc_deinit(struct dp_soc * soc)912*5113495bSYour Name static inline void dp_monitor_soc_deinit(struct dp_soc *soc)
913*5113495bSYour Name {
914*5113495bSYour Name }
915*5113495bSYour Name 
916*5113495bSYour Name static inline
dp_monitor_config_undecoded_metadata_capture(struct dp_pdev * pdev,int val)917*5113495bSYour Name QDF_STATUS dp_monitor_config_undecoded_metadata_capture(struct dp_pdev *pdev,
918*5113495bSYour Name 							int val)
919*5113495bSYour Name {
920*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
921*5113495bSYour Name }
922*5113495bSYour Name 
923*5113495bSYour Name static inline QDF_STATUS
dp_monitor_config_undecoded_metadata_phyrx_error_mask(struct dp_pdev * pdev,int mask1,int mask2)924*5113495bSYour Name dp_monitor_config_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev,
925*5113495bSYour Name 						      int mask1, int mask2)
926*5113495bSYour Name {
927*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
928*5113495bSYour Name }
929*5113495bSYour Name 
930*5113495bSYour Name static inline QDF_STATUS
dp_monitor_get_undecoded_metadata_phyrx_error_mask(struct dp_pdev * pdev,int * mask,int * mask_cont)931*5113495bSYour Name dp_monitor_get_undecoded_metadata_phyrx_error_mask(struct dp_pdev *pdev,
932*5113495bSYour Name 						   int *mask, int *mask_cont)
933*5113495bSYour Name {
934*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
935*5113495bSYour Name }
936*5113495bSYour Name 
dp_monitor_soc_htt_srng_setup(struct dp_soc * soc)937*5113495bSYour Name static inline QDF_STATUS dp_monitor_soc_htt_srng_setup(struct dp_soc *soc)
938*5113495bSYour Name {
939*5113495bSYour Name 	return QDF_STATUS_E_FAILURE;
940*5113495bSYour Name }
941*5113495bSYour Name 
dp_is_monitor_mode_using_poll(struct dp_soc * soc)942*5113495bSYour Name static inline bool dp_is_monitor_mode_using_poll(struct dp_soc *soc)
943*5113495bSYour Name {
944*5113495bSYour Name 	return false;
945*5113495bSYour Name }
946*5113495bSYour Name 
947*5113495bSYour Name static inline
dp_tx_mon_buf_refill(struct dp_intr * int_ctx)948*5113495bSYour Name uint32_t dp_tx_mon_buf_refill(struct dp_intr *int_ctx)
949*5113495bSYour Name {
950*5113495bSYour Name 	return 0;
951*5113495bSYour Name }
952*5113495bSYour Name 
953*5113495bSYour Name static inline uint32_t
dp_tx_mon_process(struct dp_soc * soc,struct dp_intr * int_ctx,uint32_t mac_id,uint32_t quota)954*5113495bSYour Name dp_tx_mon_process(struct dp_soc *soc, struct dp_intr *int_ctx,
955*5113495bSYour Name 		  uint32_t mac_id, uint32_t quota)
956*5113495bSYour Name {
957*5113495bSYour Name 	return 0;
958*5113495bSYour Name }
959*5113495bSYour Name 
960*5113495bSYour Name static inline uint32_t
dp_print_txmon_ring_stat_from_hal(struct dp_pdev * pdev)961*5113495bSYour Name dp_print_txmon_ring_stat_from_hal(struct dp_pdev *pdev)
962*5113495bSYour Name {
963*5113495bSYour Name 	return 0;
964*5113495bSYour Name }
965*5113495bSYour Name 
966*5113495bSYour Name static inline
dp_rx_mon_buf_refill(struct dp_intr * int_ctx)967*5113495bSYour Name uint32_t dp_rx_mon_buf_refill(struct dp_intr *int_ctx)
968*5113495bSYour Name {
969*5113495bSYour Name 	return 0;
970*5113495bSYour Name }
971*5113495bSYour Name 
dp_monitor_is_tx_cap_enabled(struct dp_peer * peer)972*5113495bSYour Name static inline bool dp_monitor_is_tx_cap_enabled(struct dp_peer *peer)
973*5113495bSYour Name {
974*5113495bSYour Name 	return 0;
975*5113495bSYour Name }
976*5113495bSYour Name 
dp_monitor_is_rx_cap_enabled(struct dp_peer * peer)977*5113495bSYour Name static inline bool dp_monitor_is_rx_cap_enabled(struct dp_peer *peer)
978*5113495bSYour Name {
979*5113495bSYour Name 	return 0;
980*5113495bSYour Name }
981*5113495bSYour Name 
982*5113495bSYour Name static inline void
dp_rx_mon_enable(struct dp_soc * soc,uint32_t * msg_word,struct htt_rx_ring_tlv_filter * tlv_filter)983*5113495bSYour Name dp_rx_mon_enable(struct dp_soc *soc, uint32_t *msg_word,
984*5113495bSYour Name 		 struct htt_rx_ring_tlv_filter *tlv_filter)
985*5113495bSYour Name {
986*5113495bSYour Name }
987*5113495bSYour Name 
988*5113495bSYour Name static inline void
dp_mon_rx_packet_length_set(struct dp_soc * soc,uint32_t * msg_word,struct htt_rx_ring_tlv_filter * tlv_filter)989*5113495bSYour Name dp_mon_rx_packet_length_set(struct dp_soc *soc, uint32_t *msg_word,
990*5113495bSYour Name 			    struct htt_rx_ring_tlv_filter *tlv_filter)
991*5113495bSYour Name {
992*5113495bSYour Name }
993*5113495bSYour Name 
994*5113495bSYour Name static inline void
dp_mon_rx_enable_mpdu_logging(struct dp_soc * soc,uint32_t * msg_word,struct htt_rx_ring_tlv_filter * tlv_filter)995*5113495bSYour Name dp_mon_rx_enable_mpdu_logging(struct dp_soc *soc, uint32_t *msg_word,
996*5113495bSYour Name 			      struct htt_rx_ring_tlv_filter *tlv_filter)
997*5113495bSYour Name {
998*5113495bSYour Name }
999*5113495bSYour Name 
1000*5113495bSYour Name static inline void
dp_mon_rx_wmask_subscribe(struct dp_soc * soc,uint32_t * msg_word,int pdev_id,struct htt_rx_ring_tlv_filter * tlv_filter)1001*5113495bSYour Name dp_mon_rx_wmask_subscribe(struct dp_soc *soc,
1002*5113495bSYour Name 			  uint32_t *msg_word, int pdev_id,
1003*5113495bSYour Name 			  struct htt_rx_ring_tlv_filter *tlv_filter)
1004*5113495bSYour Name {
1005*5113495bSYour Name }
1006*5113495bSYour Name 
1007*5113495bSYour Name static inline void
dp_mon_rx_mac_filter_set(struct dp_soc * soc,uint32_t * msg_word,struct htt_rx_ring_tlv_filter * tlv_filter)1008*5113495bSYour Name dp_mon_rx_mac_filter_set(struct dp_soc *soc, uint32_t *msg_word,
1009*5113495bSYour Name 			 struct htt_rx_ring_tlv_filter *tlv_filter)
1010*5113495bSYour Name {
1011*5113495bSYour Name }
1012*5113495bSYour Name 
1013*5113495bSYour Name static inline void
dp_mon_rx_enable_pkt_tlv_offset(struct dp_soc * soc,uint32_t * msg_word,struct htt_rx_ring_tlv_filter * tlv_filter)1014*5113495bSYour Name dp_mon_rx_enable_pkt_tlv_offset(struct dp_soc *soc, uint32_t *msg_word,
1015*5113495bSYour Name 				struct htt_rx_ring_tlv_filter *tlv_filter)
1016*5113495bSYour Name {
1017*5113495bSYour Name }
1018*5113495bSYour Name 
1019*5113495bSYour Name static inline void
dp_mon_rx_enable_fpmo(struct dp_soc * soc,uint32_t * msg_word,struct htt_rx_ring_tlv_filter * tlv_filter)1020*5113495bSYour Name dp_mon_rx_enable_fpmo(struct dp_soc *soc, uint32_t *msg_word,
1021*5113495bSYour Name 		      struct htt_rx_ring_tlv_filter *tlv_filter)
1022*5113495bSYour Name {
1023*5113495bSYour Name }
1024*5113495bSYour Name 
1025*5113495bSYour Name #ifdef WLAN_CONFIG_TELEMETRY_AGENT
1026*5113495bSYour Name static inline
dp_monitor_peer_telemetry_stats(struct dp_peer * peer,struct cdp_peer_telemetry_stats * stats)1027*5113495bSYour Name void dp_monitor_peer_telemetry_stats(struct dp_peer *peer,
1028*5113495bSYour Name 				     struct cdp_peer_telemetry_stats *stats)
1029*5113495bSYour Name {
1030*5113495bSYour Name }
1031*5113495bSYour Name 
1032*5113495bSYour Name static inline
dp_monitor_peer_deter_stats(struct dp_peer * peer,struct cdp_peer_telemetry_stats * stats)1033*5113495bSYour Name void dp_monitor_peer_deter_stats(struct dp_peer *peer,
1034*5113495bSYour Name 				 struct cdp_peer_telemetry_stats *stats)
1035*5113495bSYour Name {
1036*5113495bSYour Name }
1037*5113495bSYour Name #endif /* WLAN_CONFIG_TELEMETRY_AGENT */
1038*5113495bSYour Name #endif /* !WIFI_MONITOR_SUPPORT */
1039*5113495bSYour Name 
1040*5113495bSYour Name /**
1041*5113495bSYour Name  * cdp_soc_t_to_dp_soc() - typecast cdp_soc_t to
1042*5113495bSYour Name  * dp soc handle
1043*5113495bSYour Name  * @psoc: CDP psoc handle
1044*5113495bSYour Name  *
1045*5113495bSYour Name  * Return: struct dp_soc pointer
1046*5113495bSYour Name  */
1047*5113495bSYour Name static inline
cdp_soc_t_to_dp_soc(struct cdp_soc_t * psoc)1048*5113495bSYour Name struct dp_soc *cdp_soc_t_to_dp_soc(struct cdp_soc_t *psoc)
1049*5113495bSYour Name {
1050*5113495bSYour Name 	return (struct dp_soc *)psoc;
1051*5113495bSYour Name }
1052*5113495bSYour Name 
1053*5113495bSYour Name #define DP_MAX_TIMER_EXEC_TIME_TICKS \
1054*5113495bSYour Name 		(QDF_LOG_TIMESTAMP_CYCLES_PER_10_US * 100 * 20)
1055*5113495bSYour Name 
1056*5113495bSYour Name /**
1057*5113495bSYour Name  * enum timer_yield_status - yield status code used in monitor mode timer.
1058*5113495bSYour Name  * @DP_TIMER_NO_YIELD: do not yield
1059*5113495bSYour Name  * @DP_TIMER_WORK_DONE: yield because work is done
1060*5113495bSYour Name  * @DP_TIMER_WORK_EXHAUST: yield because work quota is exhausted
1061*5113495bSYour Name  * @DP_TIMER_TIME_EXHAUST: yield due to time slot exhausted
1062*5113495bSYour Name  */
1063*5113495bSYour Name enum timer_yield_status {
1064*5113495bSYour Name 	DP_TIMER_NO_YIELD,
1065*5113495bSYour Name 	DP_TIMER_WORK_DONE,
1066*5113495bSYour Name 	DP_TIMER_WORK_EXHAUST,
1067*5113495bSYour Name 	DP_TIMER_TIME_EXHAUST,
1068*5113495bSYour Name };
1069*5113495bSYour Name 
1070*5113495bSYour Name #if DP_PRINT_ENABLE
1071*5113495bSYour Name #include <qdf_types.h> /* qdf_vprint */
1072*5113495bSYour Name #include <cdp_txrx_handle.h>
1073*5113495bSYour Name 
1074*5113495bSYour Name enum {
1075*5113495bSYour Name 	/* FATAL_ERR - print only irrecoverable error messages */
1076*5113495bSYour Name 	DP_PRINT_LEVEL_FATAL_ERR,
1077*5113495bSYour Name 
1078*5113495bSYour Name 	/* ERR - include non-fatal err messages */
1079*5113495bSYour Name 	DP_PRINT_LEVEL_ERR,
1080*5113495bSYour Name 
1081*5113495bSYour Name 	/* WARN - include warnings */
1082*5113495bSYour Name 	DP_PRINT_LEVEL_WARN,
1083*5113495bSYour Name 
1084*5113495bSYour Name 	/* INFO1 - include fundamental, infrequent events */
1085*5113495bSYour Name 	DP_PRINT_LEVEL_INFO1,
1086*5113495bSYour Name 
1087*5113495bSYour Name 	/* INFO2 - include non-fundamental but infrequent events */
1088*5113495bSYour Name 	DP_PRINT_LEVEL_INFO2,
1089*5113495bSYour Name };
1090*5113495bSYour Name 
1091*5113495bSYour Name #define dp_print(level, fmt, ...) do { \
1092*5113495bSYour Name 	if (level <= g_txrx_print_level) \
1093*5113495bSYour Name 		qdf_print(fmt, ## __VA_ARGS__); \
1094*5113495bSYour Name while (0)
1095*5113495bSYour Name #define DP_PRINT(level, fmt, ...) do { \
1096*5113495bSYour Name 	dp_print(level, "DP: " fmt, ## __VA_ARGS__); \
1097*5113495bSYour Name while (0)
1098*5113495bSYour Name #else
1099*5113495bSYour Name #define DP_PRINT(level, fmt, ...)
1100*5113495bSYour Name #endif /* DP_PRINT_ENABLE */
1101*5113495bSYour Name 
1102*5113495bSYour Name #define DP_TRACE(LVL, fmt, args ...)                             \
1103*5113495bSYour Name 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_##LVL,       \
1104*5113495bSYour Name 		fmt, ## args)
1105*5113495bSYour Name 
1106*5113495bSYour Name #ifdef WLAN_SYSFS_DP_STATS
1107*5113495bSYour Name void DP_PRINT_STATS(const char *fmt, ...);
1108*5113495bSYour Name #else /* WLAN_SYSFS_DP_STATS */
1109*5113495bSYour Name #ifdef DP_PRINT_NO_CONSOLE
1110*5113495bSYour Name /* Stat prints should not go to console or kernel logs.*/
1111*5113495bSYour Name #define DP_PRINT_STATS(fmt, args ...)\
1112*5113495bSYour Name 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO_HIGH,       \
1113*5113495bSYour Name 		  fmt, ## args)
1114*5113495bSYour Name #else
1115*5113495bSYour Name #define DP_PRINT_STATS(fmt, args ...)\
1116*5113495bSYour Name 	QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_FATAL,\
1117*5113495bSYour Name 		  fmt, ## args)
1118*5113495bSYour Name #endif
1119*5113495bSYour Name #endif /* WLAN_SYSFS_DP_STATS */
1120*5113495bSYour Name 
1121*5113495bSYour Name #define DP_STATS_INIT(_handle) \
1122*5113495bSYour Name 	qdf_mem_zero(&((_handle)->stats), sizeof((_handle)->stats))
1123*5113495bSYour Name 
1124*5113495bSYour Name #define DP_TXRX_PEER_STATS_INIT(_handle, size) \
1125*5113495bSYour Name 	qdf_mem_zero(&((_handle)->stats[0]), size)
1126*5113495bSYour Name 
1127*5113495bSYour Name #define DP_STATS_CLR(_handle) \
1128*5113495bSYour Name 	qdf_mem_zero(&((_handle)->stats), sizeof((_handle)->stats))
1129*5113495bSYour Name 
1130*5113495bSYour Name #define DP_TXRX_PEER_STATS_CLR(_handle, size) \
1131*5113495bSYour Name 	qdf_mem_zero(&((_handle)->stats[0]), size)
1132*5113495bSYour Name 
1133*5113495bSYour Name #ifndef DISABLE_DP_STATS
1134*5113495bSYour Name #define DP_STATS_INC(_handle, _field, _delta) \
1135*5113495bSYour Name { \
1136*5113495bSYour Name 	if (likely(_handle)) \
1137*5113495bSYour Name 		_handle->stats._field += _delta; \
1138*5113495bSYour Name }
1139*5113495bSYour Name 
1140*5113495bSYour Name #define DP_PEER_LINK_STATS_INC(_handle, _field, _delta, _link) \
1141*5113495bSYour Name { \
1142*5113495bSYour Name 	if (likely(_handle)) \
1143*5113495bSYour Name 		_handle->stats[_link]._field += _delta; \
1144*5113495bSYour Name }
1145*5113495bSYour Name 
1146*5113495bSYour Name #define DP_PEER_STATS_FLAT_INC(_handle, _field, _delta) \
1147*5113495bSYour Name { \
1148*5113495bSYour Name 	if (likely(_handle)) \
1149*5113495bSYour Name 		_handle->_field += _delta; \
1150*5113495bSYour Name }
1151*5113495bSYour Name 
1152*5113495bSYour Name #define DP_STATS_INCC(_handle, _field, _delta, _cond) \
1153*5113495bSYour Name { \
1154*5113495bSYour Name 	if (_cond && likely(_handle)) \
1155*5113495bSYour Name 		_handle->stats._field += _delta; \
1156*5113495bSYour Name }
1157*5113495bSYour Name 
1158*5113495bSYour Name #define DP_PEER_LINK_STATS_INCC(_handle, _field, _delta, _cond, _link) \
1159*5113495bSYour Name { \
1160*5113495bSYour Name 	if (_cond && likely(_handle)) \
1161*5113495bSYour Name 		_handle->stats[_link]._field += _delta; \
1162*5113495bSYour Name }
1163*5113495bSYour Name 
1164*5113495bSYour Name #define DP_STATS_DEC(_handle, _field, _delta) \
1165*5113495bSYour Name { \
1166*5113495bSYour Name 	if (likely(_handle)) \
1167*5113495bSYour Name 		_handle->stats._field -= _delta; \
1168*5113495bSYour Name }
1169*5113495bSYour Name 
1170*5113495bSYour Name #define DP_PEER_STATS_FLAT_DEC(_handle, _field, _delta) \
1171*5113495bSYour Name { \
1172*5113495bSYour Name 	if (likely(_handle)) \
1173*5113495bSYour Name 		_handle->_field -= _delta; \
1174*5113495bSYour Name }
1175*5113495bSYour Name 
1176*5113495bSYour Name #define DP_STATS_UPD(_handle, _field, _delta) \
1177*5113495bSYour Name { \
1178*5113495bSYour Name 	if (likely(_handle)) \
1179*5113495bSYour Name 		_handle->stats._field = _delta; \
1180*5113495bSYour Name }
1181*5113495bSYour Name 
1182*5113495bSYour Name #define DP_PEER_LINK_STATS_UPD(_handle, _field, _delta, _link) \
1183*5113495bSYour Name { \
1184*5113495bSYour Name 	if (likely(_handle)) \
1185*5113495bSYour Name 		_handle->stats[_link]._field = _delta; \
1186*5113495bSYour Name }
1187*5113495bSYour Name 
1188*5113495bSYour Name #define DP_STATS_INC_PKT(_handle, _field, _count, _bytes) \
1189*5113495bSYour Name { \
1190*5113495bSYour Name 	DP_STATS_INC(_handle, _field.num, _count); \
1191*5113495bSYour Name 	DP_STATS_INC(_handle, _field.bytes, _bytes) \
1192*5113495bSYour Name }
1193*5113495bSYour Name 
1194*5113495bSYour Name #define DP_PEER_STATS_FLAT_INC_PKT(_handle, _field, _count, _bytes) \
1195*5113495bSYour Name { \
1196*5113495bSYour Name 	DP_PEER_STATS_FLAT_INC(_handle, _field.num, _count); \
1197*5113495bSYour Name 	DP_PEER_STATS_FLAT_INC(_handle, _field.bytes, _bytes) \
1198*5113495bSYour Name }
1199*5113495bSYour Name 
1200*5113495bSYour Name #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond) \
1201*5113495bSYour Name { \
1202*5113495bSYour Name 	DP_STATS_INCC(_handle, _field.num, _count, _cond); \
1203*5113495bSYour Name 	DP_STATS_INCC(_handle, _field.bytes, _bytes, _cond) \
1204*5113495bSYour Name }
1205*5113495bSYour Name 
1206*5113495bSYour Name #define DP_STATS_AGGR(_handle_a, _handle_b, _field) \
1207*5113495bSYour Name { \
1208*5113495bSYour Name 	_handle_a->stats._field += _handle_b->stats._field; \
1209*5113495bSYour Name }
1210*5113495bSYour Name 
1211*5113495bSYour Name #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field) \
1212*5113495bSYour Name { \
1213*5113495bSYour Name 	DP_STATS_AGGR(_handle_a, _handle_b, _field.num); \
1214*5113495bSYour Name 	DP_STATS_AGGR(_handle_a, _handle_b, _field.bytes);\
1215*5113495bSYour Name }
1216*5113495bSYour Name 
1217*5113495bSYour Name #define DP_STATS_AGGR_IDX(_handle_a, _handle_b, _arr, _field, _idx) \
1218*5113495bSYour Name { \
1219*5113495bSYour Name 	_handle_a->stats._arr._field += _handle_b->stats._arr[_idx]._field; \
1220*5113495bSYour Name }
1221*5113495bSYour Name 
1222*5113495bSYour Name #define DP_STATS_AGGR_PKT_IDX(_handle_a, _handle_b, _arr, _field, _idx)\
1223*5113495bSYour Name { \
1224*5113495bSYour Name 	DP_STATS_AGGR_IDX(_handle_a, _handle_b, _arr, _field.num, _idx); \
1225*5113495bSYour Name 	DP_STATS_AGGR_IDX(_handle_a, _handle_b, _arr, _field.bytes, _idx);\
1226*5113495bSYour Name }
1227*5113495bSYour Name 
1228*5113495bSYour Name #define DP_STATS_UPD_STRUCT(_handle_a, _handle_b, _field) \
1229*5113495bSYour Name { \
1230*5113495bSYour Name 	_handle_a->stats._field = _handle_b->stats._field; \
1231*5113495bSYour Name }
1232*5113495bSYour Name 
1233*5113495bSYour Name #else
1234*5113495bSYour Name #define DP_STATS_INC(_handle, _field, _delta)
1235*5113495bSYour Name #define DP_PEER_LINK_STATS_INC(_handle, _field, _delta, _link)
1236*5113495bSYour Name #define DP_PEER_STATS_FLAT_INC(_handle, _field, _delta)
1237*5113495bSYour Name #define DP_STATS_INCC(_handle, _field, _delta, _cond)
1238*5113495bSYour Name #define DP_PEER_LINK_STATS_INCC(_handle, _field, _delta, _cond, _link)
1239*5113495bSYour Name #define DP_STATS_DEC(_handle, _field, _delta)
1240*5113495bSYour Name #define DP_PEER_STATS_FLAT_DEC(_handle, _field, _delta)
1241*5113495bSYour Name #define DP_STATS_UPD(_handle, _field, _delta)
1242*5113495bSYour Name #define DP_PEER_LINK_STATS_UPD(_handle, _field, _delta, _link)
1243*5113495bSYour Name #define DP_STATS_INC_PKT(_handle, _field, _count, _bytes)
1244*5113495bSYour Name #define DP_PEER_STATS_FLAT_INC_PKT(_handle, _field, _count, _bytes)
1245*5113495bSYour Name #define DP_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond)
1246*5113495bSYour Name #define DP_STATS_AGGR(_handle_a, _handle_b, _field)
1247*5113495bSYour Name #define DP_STATS_AGGR_PKT(_handle_a, _handle_b, _field)
1248*5113495bSYour Name #define DP_STATS_AGGR_IDX(_handle_a, _handle_b, _arr, _field, _idx)
1249*5113495bSYour Name #define DP_STATS_AGGR_PKT_IDX(_handle_a, _handle_b, _arr, _field, _idx)
1250*5113495bSYour Name #endif
1251*5113495bSYour Name 
1252*5113495bSYour Name #define DP_PEER_PER_PKT_STATS_INC(_handle, _field, _delta, _link) \
1253*5113495bSYour Name { \
1254*5113495bSYour Name 	DP_PEER_LINK_STATS_INC(_handle, per_pkt_stats._field, _delta, _link); \
1255*5113495bSYour Name }
1256*5113495bSYour Name 
1257*5113495bSYour Name #define DP_PEER_PER_PKT_STATS_INCC(_handle, _field, _delta, _cond, _link) \
1258*5113495bSYour Name { \
1259*5113495bSYour Name 	DP_PEER_LINK_STATS_INCC(_handle, per_pkt_stats._field, _delta, _cond, _link); \
1260*5113495bSYour Name }
1261*5113495bSYour Name 
1262*5113495bSYour Name #define DP_PEER_PER_PKT_STATS_INC_PKT(_handle, _field, _count, _bytes, _link) \
1263*5113495bSYour Name { \
1264*5113495bSYour Name 	DP_PEER_PER_PKT_STATS_INC(_handle, _field.num, _count, _link); \
1265*5113495bSYour Name 	DP_PEER_PER_PKT_STATS_INC(_handle, _field.bytes, _bytes, _link) \
1266*5113495bSYour Name }
1267*5113495bSYour Name 
1268*5113495bSYour Name #define DP_PEER_PER_PKT_STATS_INCC_PKT(_handle, _field, _count, _bytes, _cond, _link) \
1269*5113495bSYour Name { \
1270*5113495bSYour Name 	DP_PEER_PER_PKT_STATS_INCC(_handle, _field.num, _count, _cond, _link); \
1271*5113495bSYour Name 	DP_PEER_PER_PKT_STATS_INCC(_handle, _field.bytes, _bytes, _cond, _link) \
1272*5113495bSYour Name }
1273*5113495bSYour Name 
1274*5113495bSYour Name #define DP_PEER_PER_PKT_STATS_UPD(_handle, _field, _delta, _link) \
1275*5113495bSYour Name { \
1276*5113495bSYour Name 	DP_PEER_LINK_STATS_UPD(_handle, per_pkt_stats._field, _delta, _link); \
1277*5113495bSYour Name }
1278*5113495bSYour Name 
1279*5113495bSYour Name #ifndef QCA_ENHANCED_STATS_SUPPORT
1280*5113495bSYour Name #define DP_PEER_EXTD_STATS_INC(_handle, _field, _delta, _link) \
1281*5113495bSYour Name { \
1282*5113495bSYour Name 	DP_PEER_LINK_STATS_INC(_handle, extd_stats._field, _delta, _link); \
1283*5113495bSYour Name }
1284*5113495bSYour Name 
1285*5113495bSYour Name #define DP_PEER_EXTD_STATS_INCC(_handle, _field, _delta, _cond, _link) \
1286*5113495bSYour Name { \
1287*5113495bSYour Name 	DP_PEER_LINK_STATS_INCC(_handle, extd_stats._field, _delta, _cond, _link); \
1288*5113495bSYour Name }
1289*5113495bSYour Name 
1290*5113495bSYour Name #define DP_PEER_EXTD_STATS_UPD(_handle, _field, _delta, _link) \
1291*5113495bSYour Name { \
1292*5113495bSYour Name 	DP_PEER_LINK_STATS_UPD(_handle, extd_stats._field, _delta, _link); \
1293*5113495bSYour Name }
1294*5113495bSYour Name #endif
1295*5113495bSYour Name 
1296*5113495bSYour Name #if defined(QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT) && \
1297*5113495bSYour Name 	defined(QCA_ENHANCED_STATS_SUPPORT)
1298*5113495bSYour Name #define DP_PEER_TO_STACK_INCC_PKT(_handle, _count, _bytes, _cond) \
1299*5113495bSYour Name { \
1300*5113495bSYour Name 	if (_cond || !(_handle->hw_txrx_stats_en)) \
1301*5113495bSYour Name 		DP_PEER_STATS_FLAT_INC_PKT(_handle, to_stack, _count, _bytes); \
1302*5113495bSYour Name }
1303*5113495bSYour Name 
1304*5113495bSYour Name #define DP_PEER_TO_STACK_DECC(_handle, _count, _cond) \
1305*5113495bSYour Name { \
1306*5113495bSYour Name 	if (_cond || !(_handle->hw_txrx_stats_en)) \
1307*5113495bSYour Name 		DP_PEER_STATS_FLAT_DEC(_handle, to_stack.num, _count); \
1308*5113495bSYour Name }
1309*5113495bSYour Name 
1310*5113495bSYour Name #define DP_PEER_MC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1311*5113495bSYour Name { \
1312*5113495bSYour Name 	if (_cond || !(_handle->hw_txrx_stats_en)) \
1313*5113495bSYour Name 		DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.multicast, _count, _bytes, _link); \
1314*5113495bSYour Name }
1315*5113495bSYour Name 
1316*5113495bSYour Name #define DP_PEER_BC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1317*5113495bSYour Name { \
1318*5113495bSYour Name 	if (_cond || !(_handle->hw_txrx_stats_en)) \
1319*5113495bSYour Name 		DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.bcast, _count, _bytes, _link); \
1320*5113495bSYour Name }
1321*5113495bSYour Name 
1322*5113495bSYour Name #define DP_PEER_UC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1323*5113495bSYour Name { \
1324*5113495bSYour Name 	if (_cond || !(_handle->hw_txrx_stats_en)) \
1325*5113495bSYour Name 		DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.unicast, _count, _bytes, _link); \
1326*5113495bSYour Name }
1327*5113495bSYour Name #elif defined(QCA_VDEV_STATS_HW_OFFLOAD_SUPPORT)
1328*5113495bSYour Name #define DP_PEER_TO_STACK_INCC_PKT(_handle, _count, _bytes, _cond) \
1329*5113495bSYour Name { \
1330*5113495bSYour Name 	if (!(_handle->hw_txrx_stats_en)) \
1331*5113495bSYour Name 		DP_PEER_STATS_FLAT_INC_PKT(_handle, to_stack, _count, _bytes); \
1332*5113495bSYour Name }
1333*5113495bSYour Name 
1334*5113495bSYour Name #define DP_PEER_TO_STACK_DECC(_handle, _count, _cond) \
1335*5113495bSYour Name { \
1336*5113495bSYour Name 	if (!(_handle->hw_txrx_stats_en)) \
1337*5113495bSYour Name 		DP_PEER_STATS_FLAT_DEC(_handle, to_stack.num, _count); \
1338*5113495bSYour Name }
1339*5113495bSYour Name 
1340*5113495bSYour Name #define DP_PEER_MC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1341*5113495bSYour Name { \
1342*5113495bSYour Name 	if (!(_handle->hw_txrx_stats_en)) \
1343*5113495bSYour Name 		DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.multicast, _count, _bytes, _link); \
1344*5113495bSYour Name }
1345*5113495bSYour Name 
1346*5113495bSYour Name #define DP_PEER_BC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1347*5113495bSYour Name { \
1348*5113495bSYour Name 	if (!(_handle->hw_txrx_stats_en)) \
1349*5113495bSYour Name 		DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.bcast, _count, _bytes, _link); \
1350*5113495bSYour Name }
1351*5113495bSYour Name 
1352*5113495bSYour Name #define DP_PEER_UC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1353*5113495bSYour Name { \
1354*5113495bSYour Name 	if (!(_handle->hw_txrx_stats_en)) \
1355*5113495bSYour Name 		DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.unicast, _count, _bytes, _link); \
1356*5113495bSYour Name }
1357*5113495bSYour Name #else
1358*5113495bSYour Name #define DP_PEER_TO_STACK_INCC_PKT(_handle, _count, _bytes, _cond) \
1359*5113495bSYour Name 	DP_PEER_STATS_FLAT_INC_PKT(_handle, to_stack, _count, _bytes);
1360*5113495bSYour Name 
1361*5113495bSYour Name #define DP_PEER_TO_STACK_DECC(_handle, _count, _cond) \
1362*5113495bSYour Name 	DP_PEER_STATS_FLAT_DEC(_handle, to_stack.num, _count);
1363*5113495bSYour Name 
1364*5113495bSYour Name #define DP_PEER_MC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1365*5113495bSYour Name 	DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.multicast, _count, _bytes, _link);
1366*5113495bSYour Name 
1367*5113495bSYour Name #define DP_PEER_BC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1368*5113495bSYour Name 	DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.bcast, _count, _bytes, _link);
1369*5113495bSYour Name 
1370*5113495bSYour Name #define DP_PEER_UC_INCC_PKT(_handle, _count, _bytes, _cond, _link) \
1371*5113495bSYour Name 	DP_PEER_PER_PKT_STATS_INC_PKT(_handle, rx.unicast, _count, _bytes, _link);
1372*5113495bSYour Name #endif
1373*5113495bSYour Name 
1374*5113495bSYour Name #ifdef ENABLE_DP_HIST_STATS
1375*5113495bSYour Name #define DP_HIST_INIT() \
1376*5113495bSYour Name 	uint32_t num_of_packets[MAX_PDEV_CNT] = {0};
1377*5113495bSYour Name 
1378*5113495bSYour Name #define DP_HIST_PACKET_COUNT_INC(_pdev_id) \
1379*5113495bSYour Name { \
1380*5113495bSYour Name 		++num_of_packets[_pdev_id]; \
1381*5113495bSYour Name }
1382*5113495bSYour Name 
1383*5113495bSYour Name #define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
1384*5113495bSYour Name 	do {                                                              \
1385*5113495bSYour Name 		if (_p_cntrs == 1) {                                      \
1386*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1387*5113495bSYour Name 				tx_comp_histogram.pkts_1, 1);             \
1388*5113495bSYour Name 		} else if (_p_cntrs > 1 && _p_cntrs <= 20) {              \
1389*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1390*5113495bSYour Name 				tx_comp_histogram.pkts_2_20, 1);          \
1391*5113495bSYour Name 		} else if (_p_cntrs > 20 && _p_cntrs <= 40) {             \
1392*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1393*5113495bSYour Name 				tx_comp_histogram.pkts_21_40, 1);         \
1394*5113495bSYour Name 		} else if (_p_cntrs > 40 && _p_cntrs <= 60) {             \
1395*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1396*5113495bSYour Name 				tx_comp_histogram.pkts_41_60, 1);         \
1397*5113495bSYour Name 		} else if (_p_cntrs > 60 && _p_cntrs <= 80) {             \
1398*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1399*5113495bSYour Name 				tx_comp_histogram.pkts_61_80, 1);         \
1400*5113495bSYour Name 		} else if (_p_cntrs > 80 && _p_cntrs <= 100) {            \
1401*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1402*5113495bSYour Name 				tx_comp_histogram.pkts_81_100, 1);        \
1403*5113495bSYour Name 		} else if (_p_cntrs > 100 && _p_cntrs <= 200) {           \
1404*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1405*5113495bSYour Name 				tx_comp_histogram.pkts_101_200, 1);       \
1406*5113495bSYour Name 		} else if (_p_cntrs > 200) {                              \
1407*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1408*5113495bSYour Name 				tx_comp_histogram.pkts_201_plus, 1);      \
1409*5113495bSYour Name 		}                                                         \
1410*5113495bSYour Name 	} while (0)
1411*5113495bSYour Name 
1412*5113495bSYour Name #define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs) \
1413*5113495bSYour Name 	do {                                                              \
1414*5113495bSYour Name 		if (_p_cntrs == 1) {                                      \
1415*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1416*5113495bSYour Name 				rx_ind_histogram.pkts_1, 1);              \
1417*5113495bSYour Name 		} else if (_p_cntrs > 1 && _p_cntrs <= 20) {              \
1418*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1419*5113495bSYour Name 				rx_ind_histogram.pkts_2_20, 1);           \
1420*5113495bSYour Name 		} else if (_p_cntrs > 20 && _p_cntrs <= 40) {             \
1421*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1422*5113495bSYour Name 				rx_ind_histogram.pkts_21_40, 1);          \
1423*5113495bSYour Name 		} else if (_p_cntrs > 40 && _p_cntrs <= 60) {             \
1424*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1425*5113495bSYour Name 				rx_ind_histogram.pkts_41_60, 1);          \
1426*5113495bSYour Name 		} else if (_p_cntrs > 60 && _p_cntrs <= 80) {             \
1427*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1428*5113495bSYour Name 				rx_ind_histogram.pkts_61_80, 1);          \
1429*5113495bSYour Name 		} else if (_p_cntrs > 80 && _p_cntrs <= 100) {            \
1430*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1431*5113495bSYour Name 				rx_ind_histogram.pkts_81_100, 1);         \
1432*5113495bSYour Name 		} else if (_p_cntrs > 100 && _p_cntrs <= 200) {           \
1433*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1434*5113495bSYour Name 				rx_ind_histogram.pkts_101_200, 1);        \
1435*5113495bSYour Name 		} else if (_p_cntrs > 200) {                              \
1436*5113495bSYour Name 			DP_STATS_INC(_pdev,                               \
1437*5113495bSYour Name 				rx_ind_histogram.pkts_201_plus, 1);       \
1438*5113495bSYour Name 		}                                                         \
1439*5113495bSYour Name 	} while (0)
1440*5113495bSYour Name 
1441*5113495bSYour Name #define DP_TX_HIST_STATS_PER_PDEV() \
1442*5113495bSYour Name 	do { \
1443*5113495bSYour Name 		uint8_t hist_stats = 0; \
1444*5113495bSYour Name 		for (hist_stats = 0; hist_stats < soc->pdev_count; \
1445*5113495bSYour Name 				hist_stats++) { \
1446*5113495bSYour Name 			DP_TX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
1447*5113495bSYour Name 					num_of_packets[hist_stats]); \
1448*5113495bSYour Name 		} \
1449*5113495bSYour Name 	}  while (0)
1450*5113495bSYour Name 
1451*5113495bSYour Name 
1452*5113495bSYour Name #define DP_RX_HIST_STATS_PER_PDEV() \
1453*5113495bSYour Name 	do { \
1454*5113495bSYour Name 		uint8_t hist_stats = 0; \
1455*5113495bSYour Name 		for (hist_stats = 0; hist_stats < soc->pdev_count; \
1456*5113495bSYour Name 				hist_stats++) { \
1457*5113495bSYour Name 			DP_RX_HISTOGRAM_UPDATE(soc->pdev_list[hist_stats], \
1458*5113495bSYour Name 					num_of_packets[hist_stats]); \
1459*5113495bSYour Name 		} \
1460*5113495bSYour Name 	}  while (0)
1461*5113495bSYour Name 
1462*5113495bSYour Name #else
1463*5113495bSYour Name #define DP_HIST_INIT()
1464*5113495bSYour Name #define DP_HIST_PACKET_COUNT_INC(_pdev_id)
1465*5113495bSYour Name #define DP_TX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
1466*5113495bSYour Name #define DP_RX_HISTOGRAM_UPDATE(_pdev, _p_cntrs)
1467*5113495bSYour Name #define DP_RX_HIST_STATS_PER_PDEV()
1468*5113495bSYour Name #define DP_TX_HIST_STATS_PER_PDEV()
1469*5113495bSYour Name #endif /* DISABLE_DP_STATS */
1470*5113495bSYour Name 
1471*5113495bSYour Name #define FRAME_MASK_IPV4_ARP   0x1
1472*5113495bSYour Name #define FRAME_MASK_IPV4_DHCP  0x2
1473*5113495bSYour Name #define FRAME_MASK_IPV4_EAPOL 0x4
1474*5113495bSYour Name #define FRAME_MASK_IPV6_DHCP  0x8
1475*5113495bSYour Name #define FRAME_MASK_DNS_QUERY  0x10
1476*5113495bSYour Name #define FRAME_MASK_DNS_RESP   0x20
1477*5113495bSYour Name 
dp_log2_ceil(unsigned int value)1478*5113495bSYour Name static inline int dp_log2_ceil(unsigned int value)
1479*5113495bSYour Name {
1480*5113495bSYour Name 	unsigned int tmp = value;
1481*5113495bSYour Name 	int log2 = -1;
1482*5113495bSYour Name 
1483*5113495bSYour Name 	if (qdf_unlikely(value == 0))
1484*5113495bSYour Name 		return 0;
1485*5113495bSYour Name 	while (tmp) {
1486*5113495bSYour Name 		log2++;
1487*5113495bSYour Name 		tmp >>= 1;
1488*5113495bSYour Name 	}
1489*5113495bSYour Name 	if (1 << log2 != value)
1490*5113495bSYour Name 		log2++;
1491*5113495bSYour Name 	return log2;
1492*5113495bSYour Name }
1493*5113495bSYour Name 
1494*5113495bSYour Name #ifdef QCA_SUPPORT_PEER_ISOLATION
1495*5113495bSYour Name #define dp_get_peer_isolation(_peer) ((_peer)->isolation)
1496*5113495bSYour Name 
dp_set_peer_isolation(struct dp_txrx_peer * txrx_peer,bool val)1497*5113495bSYour Name static inline void dp_set_peer_isolation(struct dp_txrx_peer *txrx_peer,
1498*5113495bSYour Name 					 bool val)
1499*5113495bSYour Name {
1500*5113495bSYour Name 	txrx_peer->isolation = val;
1501*5113495bSYour Name }
1502*5113495bSYour Name 
1503*5113495bSYour Name #else
1504*5113495bSYour Name #define dp_get_peer_isolation(_peer) (0)
1505*5113495bSYour Name 
dp_set_peer_isolation(struct dp_txrx_peer * peer,bool val)1506*5113495bSYour Name static inline void dp_set_peer_isolation(struct dp_txrx_peer *peer, bool val)
1507*5113495bSYour Name {
1508*5113495bSYour Name }
1509*5113495bSYour Name #endif /* QCA_SUPPORT_PEER_ISOLATION */
1510*5113495bSYour Name 
1511*5113495bSYour Name bool dp_vdev_is_wds_ext_enabled(struct dp_vdev *vdev);
1512*5113495bSYour Name 
1513*5113495bSYour Name #ifdef QCA_SUPPORT_WDS_EXTENDED
dp_wds_ext_peer_init(struct dp_txrx_peer * txrx_peer)1514*5113495bSYour Name static inline void dp_wds_ext_peer_init(struct dp_txrx_peer *txrx_peer)
1515*5113495bSYour Name {
1516*5113495bSYour Name 	txrx_peer->wds_ext.osif_peer = NULL;
1517*5113495bSYour Name 	txrx_peer->wds_ext.init = 0;
1518*5113495bSYour Name }
1519*5113495bSYour Name #else
dp_wds_ext_peer_init(struct dp_txrx_peer * txrx_peer)1520*5113495bSYour Name static inline void dp_wds_ext_peer_init(struct dp_txrx_peer *txrx_peer)
1521*5113495bSYour Name {
1522*5113495bSYour Name }
1523*5113495bSYour Name #endif /* QCA_SUPPORT_WDS_EXTENDED */
1524*5113495bSYour Name 
1525*5113495bSYour Name #ifdef QCA_HOST2FW_RXBUF_RING
1526*5113495bSYour Name static inline
dp_get_rxdma_ring(struct dp_pdev * pdev,int lmac_id)1527*5113495bSYour Name struct dp_srng *dp_get_rxdma_ring(struct dp_pdev *pdev, int lmac_id)
1528*5113495bSYour Name {
1529*5113495bSYour Name 	return &pdev->rx_mac_buf_ring[lmac_id];
1530*5113495bSYour Name }
1531*5113495bSYour Name #else
1532*5113495bSYour Name static inline
dp_get_rxdma_ring(struct dp_pdev * pdev,int lmac_id)1533*5113495bSYour Name struct dp_srng *dp_get_rxdma_ring(struct dp_pdev *pdev, int lmac_id)
1534*5113495bSYour Name {
1535*5113495bSYour Name 	return &pdev->soc->rx_refill_buf_ring[lmac_id];
1536*5113495bSYour Name }
1537*5113495bSYour Name #endif
1538*5113495bSYour Name 
1539*5113495bSYour Name /*
1540*5113495bSYour Name  * The lmac ID for a particular channel band is fixed.
1541*5113495bSYour Name  * 2.4GHz band uses lmac_id = 1
1542*5113495bSYour Name  * 5GHz/6GHz band uses lmac_id=0
1543*5113495bSYour Name  */
1544*5113495bSYour Name #define DP_INVALID_LMAC_ID	(-1)
1545*5113495bSYour Name #define DP_MON_INVALID_LMAC_ID	(-1)
1546*5113495bSYour Name #define DP_MAC0_LMAC_ID	0
1547*5113495bSYour Name #define DP_MAC1_LMAC_ID	1
1548*5113495bSYour Name 
1549*5113495bSYour Name #ifdef FEATURE_TSO_STATS
1550*5113495bSYour Name /**
1551*5113495bSYour Name  * dp_init_tso_stats() - Clear tso stats
1552*5113495bSYour Name  * @pdev: pdev handle
1553*5113495bSYour Name  *
1554*5113495bSYour Name  * Return: None
1555*5113495bSYour Name  */
1556*5113495bSYour Name static inline
dp_init_tso_stats(struct dp_pdev * pdev)1557*5113495bSYour Name void dp_init_tso_stats(struct dp_pdev *pdev)
1558*5113495bSYour Name {
1559*5113495bSYour Name 	if (pdev) {
1560*5113495bSYour Name 		qdf_mem_zero(&((pdev)->stats.tso_stats),
1561*5113495bSYour Name 			     sizeof((pdev)->stats.tso_stats));
1562*5113495bSYour Name 		qdf_atomic_init(&pdev->tso_idx);
1563*5113495bSYour Name 	}
1564*5113495bSYour Name }
1565*5113495bSYour Name 
1566*5113495bSYour Name /**
1567*5113495bSYour Name  * dp_stats_tso_segment_histogram_update() - TSO Segment Histogram
1568*5113495bSYour Name  * @pdev: pdev handle
1569*5113495bSYour Name  * @_p_cntrs: number of tso segments for a tso packet
1570*5113495bSYour Name  *
1571*5113495bSYour Name  * Return: None
1572*5113495bSYour Name  */
1573*5113495bSYour Name void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
1574*5113495bSYour Name 					   uint8_t _p_cntrs);
1575*5113495bSYour Name 
1576*5113495bSYour Name /**
1577*5113495bSYour Name  * dp_tso_segment_update() - Collect tso segment information
1578*5113495bSYour Name  * @pdev: pdev handle
1579*5113495bSYour Name  * @stats_idx: tso packet number
1580*5113495bSYour Name  * @idx: tso segment number
1581*5113495bSYour Name  * @seg: tso segment
1582*5113495bSYour Name  *
1583*5113495bSYour Name  * Return: None
1584*5113495bSYour Name  */
1585*5113495bSYour Name void dp_tso_segment_update(struct dp_pdev *pdev,
1586*5113495bSYour Name 			   uint32_t stats_idx,
1587*5113495bSYour Name 			   uint8_t idx,
1588*5113495bSYour Name 			   struct qdf_tso_seg_t seg);
1589*5113495bSYour Name 
1590*5113495bSYour Name /**
1591*5113495bSYour Name  * dp_tso_packet_update() - TSO Packet information
1592*5113495bSYour Name  * @pdev: pdev handle
1593*5113495bSYour Name  * @stats_idx: tso packet number
1594*5113495bSYour Name  * @msdu: nbuf handle
1595*5113495bSYour Name  * @num_segs: tso segments
1596*5113495bSYour Name  *
1597*5113495bSYour Name  * Return: None
1598*5113495bSYour Name  */
1599*5113495bSYour Name void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
1600*5113495bSYour Name 			  qdf_nbuf_t msdu, uint16_t num_segs);
1601*5113495bSYour Name 
1602*5113495bSYour Name /**
1603*5113495bSYour Name  * dp_tso_segment_stats_update() - TSO Segment stats
1604*5113495bSYour Name  * @pdev: pdev handle
1605*5113495bSYour Name  * @stats_seg: tso segment list
1606*5113495bSYour Name  * @stats_idx: tso packet number
1607*5113495bSYour Name  *
1608*5113495bSYour Name  * Return: None
1609*5113495bSYour Name  */
1610*5113495bSYour Name void dp_tso_segment_stats_update(struct dp_pdev *pdev,
1611*5113495bSYour Name 				 struct qdf_tso_seg_elem_t *stats_seg,
1612*5113495bSYour Name 				 uint32_t stats_idx);
1613*5113495bSYour Name 
1614*5113495bSYour Name /**
1615*5113495bSYour Name  * dp_print_tso_stats() - dump tso statistics
1616*5113495bSYour Name  * @soc:soc handle
1617*5113495bSYour Name  * @level: verbosity level
1618*5113495bSYour Name  *
1619*5113495bSYour Name  * Return: None
1620*5113495bSYour Name  */
1621*5113495bSYour Name void dp_print_tso_stats(struct dp_soc *soc,
1622*5113495bSYour Name 			enum qdf_stats_verbosity_level level);
1623*5113495bSYour Name 
1624*5113495bSYour Name /**
1625*5113495bSYour Name  * dp_txrx_clear_tso_stats() - clear tso stats
1626*5113495bSYour Name  * @soc: soc handle
1627*5113495bSYour Name  *
1628*5113495bSYour Name  * Return: None
1629*5113495bSYour Name  */
1630*5113495bSYour Name void dp_txrx_clear_tso_stats(struct dp_soc *soc);
1631*5113495bSYour Name #else
1632*5113495bSYour Name static inline
dp_init_tso_stats(struct dp_pdev * pdev)1633*5113495bSYour Name void dp_init_tso_stats(struct dp_pdev *pdev)
1634*5113495bSYour Name {
1635*5113495bSYour Name }
1636*5113495bSYour Name 
1637*5113495bSYour Name static inline
dp_stats_tso_segment_histogram_update(struct dp_pdev * pdev,uint8_t _p_cntrs)1638*5113495bSYour Name void dp_stats_tso_segment_histogram_update(struct dp_pdev *pdev,
1639*5113495bSYour Name 					   uint8_t _p_cntrs)
1640*5113495bSYour Name {
1641*5113495bSYour Name }
1642*5113495bSYour Name 
1643*5113495bSYour Name static inline
dp_tso_segment_update(struct dp_pdev * pdev,uint32_t stats_idx,uint32_t idx,struct qdf_tso_seg_t seg)1644*5113495bSYour Name void dp_tso_segment_update(struct dp_pdev *pdev,
1645*5113495bSYour Name 			   uint32_t stats_idx,
1646*5113495bSYour Name 			   uint32_t idx,
1647*5113495bSYour Name 			   struct qdf_tso_seg_t seg)
1648*5113495bSYour Name {
1649*5113495bSYour Name }
1650*5113495bSYour Name 
1651*5113495bSYour Name static inline
dp_tso_packet_update(struct dp_pdev * pdev,uint32_t stats_idx,qdf_nbuf_t msdu,uint16_t num_segs)1652*5113495bSYour Name void dp_tso_packet_update(struct dp_pdev *pdev, uint32_t stats_idx,
1653*5113495bSYour Name 			  qdf_nbuf_t msdu, uint16_t num_segs)
1654*5113495bSYour Name {
1655*5113495bSYour Name }
1656*5113495bSYour Name 
1657*5113495bSYour Name static inline
dp_tso_segment_stats_update(struct dp_pdev * pdev,struct qdf_tso_seg_elem_t * stats_seg,uint32_t stats_idx)1658*5113495bSYour Name void dp_tso_segment_stats_update(struct dp_pdev *pdev,
1659*5113495bSYour Name 				 struct qdf_tso_seg_elem_t *stats_seg,
1660*5113495bSYour Name 				 uint32_t stats_idx)
1661*5113495bSYour Name {
1662*5113495bSYour Name }
1663*5113495bSYour Name 
1664*5113495bSYour Name static inline
dp_print_tso_stats(struct dp_soc * soc,enum qdf_stats_verbosity_level level)1665*5113495bSYour Name void dp_print_tso_stats(struct dp_soc *soc,
1666*5113495bSYour Name 			enum qdf_stats_verbosity_level level)
1667*5113495bSYour Name {
1668*5113495bSYour Name }
1669*5113495bSYour Name 
1670*5113495bSYour Name static inline
dp_txrx_clear_tso_stats(struct dp_soc * soc)1671*5113495bSYour Name void dp_txrx_clear_tso_stats(struct dp_soc *soc)
1672*5113495bSYour Name {
1673*5113495bSYour Name }
1674*5113495bSYour Name #endif /* FEATURE_TSO_STATS */
1675*5113495bSYour Name 
1676*5113495bSYour Name /**
1677*5113495bSYour Name  * dp_txrx_get_peer_per_pkt_stats_param() - Get peer per pkt stats param
1678*5113495bSYour Name  * @peer: DP peer handle
1679*5113495bSYour Name  * @type: Requested stats type
1680*5113495bSYour Name  * @buf: Buffer to hold the value
1681*5113495bSYour Name  *
1682*5113495bSYour Name  * Return: status success/failure
1683*5113495bSYour Name  */
1684*5113495bSYour Name QDF_STATUS dp_txrx_get_peer_per_pkt_stats_param(struct dp_peer *peer,
1685*5113495bSYour Name 						enum cdp_peer_stats_type type,
1686*5113495bSYour Name 						cdp_peer_stats_param_t *buf);
1687*5113495bSYour Name 
1688*5113495bSYour Name /**
1689*5113495bSYour Name  * dp_txrx_get_peer_extd_stats_param() - Get peer extd stats param
1690*5113495bSYour Name  * @peer: DP peer handle
1691*5113495bSYour Name  * @type: Requested stats type
1692*5113495bSYour Name  * @buf: Buffer to hold the value
1693*5113495bSYour Name  *
1694*5113495bSYour Name  * Return: status success/failure
1695*5113495bSYour Name  */
1696*5113495bSYour Name QDF_STATUS dp_txrx_get_peer_extd_stats_param(struct dp_peer *peer,
1697*5113495bSYour Name 					     enum cdp_peer_stats_type type,
1698*5113495bSYour Name 					     cdp_peer_stats_param_t *buf);
1699*5113495bSYour Name 
1700*5113495bSYour Name #define DP_HTT_T2H_HP_PIPE 5
1701*5113495bSYour Name /**
1702*5113495bSYour Name  * dp_update_pdev_stats(): Update the pdev stats
1703*5113495bSYour Name  * @tgtobj: pdev handle
1704*5113495bSYour Name  * @srcobj: vdev stats structure
1705*5113495bSYour Name  *
1706*5113495bSYour Name  * Update the pdev stats from the specified vdev stats
1707*5113495bSYour Name  *
1708*5113495bSYour Name  * Return: None
1709*5113495bSYour Name  */
1710*5113495bSYour Name void dp_update_pdev_stats(struct dp_pdev *tgtobj,
1711*5113495bSYour Name 			  struct cdp_vdev_stats *srcobj);
1712*5113495bSYour Name 
1713*5113495bSYour Name /**
1714*5113495bSYour Name  * dp_update_vdev_ingress_stats(): Update the vdev ingress stats
1715*5113495bSYour Name  * @tgtobj: vdev handle
1716*5113495bSYour Name  *
1717*5113495bSYour Name  * Update the vdev ingress stats
1718*5113495bSYour Name  *
1719*5113495bSYour Name  * Return: None
1720*5113495bSYour Name  */
1721*5113495bSYour Name void dp_update_vdev_ingress_stats(struct dp_vdev *tgtobj);
1722*5113495bSYour Name 
1723*5113495bSYour Name /**
1724*5113495bSYour Name  * dp_update_vdev_rate_stats() - Update the vdev rate stats
1725*5113495bSYour Name  * @tgtobj: tgt buffer for cdp vdev stats
1726*5113495bSYour Name  * @srcobj: srcobj dp vdev stats
1727*5113495bSYour Name  *
1728*5113495bSYour Name  * Return: None
1729*5113495bSYour Name  */
1730*5113495bSYour Name void dp_update_vdev_rate_stats(struct cdp_vdev_stats *tgtobj,
1731*5113495bSYour Name 			       struct dp_vdev_stats *srcobj);
1732*5113495bSYour Name 
1733*5113495bSYour Name /**
1734*5113495bSYour Name  * dp_update_pdev_ingress_stats(): Update the pdev ingress stats
1735*5113495bSYour Name  * @tgtobj: pdev handle
1736*5113495bSYour Name  * @srcobj: vdev stats structure
1737*5113495bSYour Name  *
1738*5113495bSYour Name  * Update the pdev ingress stats from the specified vdev stats
1739*5113495bSYour Name  *
1740*5113495bSYour Name  * Return: None
1741*5113495bSYour Name  */
1742*5113495bSYour Name void dp_update_pdev_ingress_stats(struct dp_pdev *tgtobj,
1743*5113495bSYour Name 				  struct dp_vdev *srcobj);
1744*5113495bSYour Name 
1745*5113495bSYour Name /**
1746*5113495bSYour Name  * dp_copy_vdev_stats_to_tgt_buf(): Update the cdp vdev ingress stats from
1747*5113495bSYour Name  *                                        dp vdev ingress stats
1748*5113495bSYour Name  * @vdev_stats: cdp vdev stats structure
1749*5113495bSYour Name  * @stats: dp vdev stats structure
1750*5113495bSYour Name  * @xmit_type: xmit type of packet - MLD/Link
1751*5113495bSYour Name  *
1752*5113495bSYour Name  * Update the cdp vdev ingress stats from dp vdev ingress stats
1753*5113495bSYour Name  *
1754*5113495bSYour Name  * Return: None
1755*5113495bSYour Name  */
1756*5113495bSYour Name 
1757*5113495bSYour Name void dp_copy_vdev_stats_to_tgt_buf(struct cdp_vdev_stats *vdev_stats,
1758*5113495bSYour Name 					 struct dp_vdev_stats *stats,
1759*5113495bSYour Name 					 enum dp_pkt_xmit_type xmit_type);
1760*5113495bSYour Name 
1761*5113495bSYour Name /**
1762*5113495bSYour Name  * dp_update_vdev_stats(): Update the vdev stats
1763*5113495bSYour Name  * @soc: soc handle
1764*5113495bSYour Name  * @srcobj: DP_PEER object
1765*5113495bSYour Name  * @arg: point to vdev stats structure
1766*5113495bSYour Name  *
1767*5113495bSYour Name  * Update the vdev stats from the specified peer stats
1768*5113495bSYour Name  *
1769*5113495bSYour Name  * Return: None
1770*5113495bSYour Name  */
1771*5113495bSYour Name void dp_update_vdev_stats(struct dp_soc *soc,
1772*5113495bSYour Name 			  struct dp_peer *srcobj,
1773*5113495bSYour Name 			  void *arg);
1774*5113495bSYour Name 
1775*5113495bSYour Name /**
1776*5113495bSYour Name  * dp_update_vdev_stats_on_peer_unmap() - Update the vdev stats on peer unmap
1777*5113495bSYour Name  * @vdev: DP_VDEV handle
1778*5113495bSYour Name  * @peer: DP_PEER handle
1779*5113495bSYour Name  *
1780*5113495bSYour Name  * Return: None
1781*5113495bSYour Name  */
1782*5113495bSYour Name void dp_update_vdev_stats_on_peer_unmap(struct dp_vdev *vdev,
1783*5113495bSYour Name 					struct dp_peer *peer);
1784*5113495bSYour Name 
1785*5113495bSYour Name #ifdef IPA_OFFLOAD
1786*5113495bSYour Name #define DP_IPA_UPDATE_RX_STATS(__tgtobj, __srcobj) \
1787*5113495bSYour Name { \
1788*5113495bSYour Name 	DP_STATS_AGGR_PKT(__tgtobj, __srcobj, rx.rx_total); \
1789*5113495bSYour Name }
1790*5113495bSYour Name 
1791*5113495bSYour Name #define DP_IPA_UPDATE_PER_PKT_RX_STATS(__tgtobj, __srcobj) \
1792*5113495bSYour Name { \
1793*5113495bSYour Name 	(__tgtobj)->rx.rx_total.num += (__srcobj)->rx.rx_total.num; \
1794*5113495bSYour Name 	(__tgtobj)->rx.rx_total.bytes += (__srcobj)->rx.rx_total.bytes; \
1795*5113495bSYour Name }
1796*5113495bSYour Name #else
1797*5113495bSYour Name #define DP_IPA_UPDATE_PER_PKT_RX_STATS(tgtobj, srcobj) \
1798*5113495bSYour Name 
1799*5113495bSYour Name #define DP_IPA_UPDATE_RX_STATS(tgtobj, srcobj)
1800*5113495bSYour Name #endif
1801*5113495bSYour Name 
1802*5113495bSYour Name #define DP_UPDATE_STATS(_tgtobj, _srcobj)	\
1803*5113495bSYour Name 	do {				\
1804*5113495bSYour Name 		uint8_t i;		\
1805*5113495bSYour Name 		uint8_t pream_type;	\
1806*5113495bSYour Name 		for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \
1807*5113495bSYour Name 			for (i = 0; i < MAX_MCS; i++) { \
1808*5113495bSYour Name 				DP_STATS_AGGR(_tgtobj, _srcobj, \
1809*5113495bSYour Name 					tx.pkt_type[pream_type].mcs_count[i]); \
1810*5113495bSYour Name 				DP_STATS_AGGR(_tgtobj, _srcobj, \
1811*5113495bSYour Name 					rx.pkt_type[pream_type].mcs_count[i]); \
1812*5113495bSYour Name 			} \
1813*5113495bSYour Name 		} \
1814*5113495bSYour Name 		  \
1815*5113495bSYour Name 		for (i = 0; i < MAX_BW; i++) { \
1816*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.bw[i]); \
1817*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.bw[i]); \
1818*5113495bSYour Name 		} \
1819*5113495bSYour Name 		  \
1820*5113495bSYour Name 		for (i = 0; i < SS_COUNT; i++) { \
1821*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.nss[i]); \
1822*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.nss[i]); \
1823*5113495bSYour Name 		} \
1824*5113495bSYour Name 		for (i = 0; i < WME_AC_MAX; i++) { \
1825*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.wme_ac_type[i]); \
1826*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.wme_ac_type[i]); \
1827*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, \
1828*5113495bSYour Name 				      tx.wme_ac_type_bytes[i]); \
1829*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, \
1830*5113495bSYour Name 				      rx.wme_ac_type_bytes[i]); \
1831*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.excess_retries_per_ac[i]); \
1832*5113495bSYour Name 		\
1833*5113495bSYour Name 		} \
1834*5113495bSYour Name 		\
1835*5113495bSYour Name 		for (i = 0; i < MAX_GI; i++) { \
1836*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.sgi_count[i]); \
1837*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.sgi_count[i]); \
1838*5113495bSYour Name 		} \
1839*5113495bSYour Name 		\
1840*5113495bSYour Name 		for (i = 0; i < MAX_RECEPTION_TYPES; i++) \
1841*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, rx.reception_type[i]); \
1842*5113495bSYour Name 		\
1843*5113495bSYour Name 		if (!wlan_cfg_get_vdev_stats_hw_offload_config(soc->wlan_cfg_ctx)) { \
1844*5113495bSYour Name 			DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.comp_pkt); \
1845*5113495bSYour Name 			DP_STATS_AGGR(_tgtobj, _srcobj, tx.tx_failed); \
1846*5113495bSYour Name 		} \
1847*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.ucast); \
1848*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.mcast); \
1849*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.bcast); \
1850*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_success); \
1851*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.nawds_mcast); \
1852*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.nawds_mcast_drop); \
1853*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ofdma); \
1854*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.stbc); \
1855*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ldpc); \
1856*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.retries); \
1857*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.non_amsdu_cnt); \
1858*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.amsdu_cnt); \
1859*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.non_ampdu_cnt); \
1860*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.ampdu_cnt); \
1861*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.dropped.fw_rem); \
1862*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_tx); \
1863*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_notx); \
1864*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason1); \
1865*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason2); \
1866*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_reason3); \
1867*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_queue_disable); \
1868*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.fw_rem_no_match); \
1869*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.drop_threshold); \
1870*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.drop_link_desc_na); \
1871*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.invalid_drop); \
1872*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.mcast_vdev_drop); \
1873*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.invalid_rr); \
1874*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, tx.dropped.age_out); \
1875*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_ucast_total); \
1876*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, tx.tx_ucast_success); \
1877*5113495bSYour Name 								\
1878*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.mic_err); \
1879*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.decrypt_err); \
1880*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.fcserr); \
1881*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.pn_err); \
1882*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.oor_err); \
1883*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.jump_2k_err); \
1884*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.err.rxdma_wifi_parse_err); \
1885*5113495bSYour Name 		if (_srcobj->stats.rx.snr != 0) \
1886*5113495bSYour Name 			DP_STATS_UPD_STRUCT(_tgtobj, _srcobj, rx.snr); \
1887*5113495bSYour Name 		DP_STATS_UPD_STRUCT(_tgtobj, _srcobj, rx.rx_rate); \
1888*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.non_ampdu_cnt); \
1889*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.ampdu_cnt); \
1890*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.non_amsdu_cnt); \
1891*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.amsdu_cnt); \
1892*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.nawds_mcast_drop); \
1893*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.to_stack); \
1894*5113495bSYour Name 								\
1895*5113495bSYour Name 		for (i = 0; i <  CDP_MAX_RX_RINGS; i++)	\
1896*5113495bSYour Name 			DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rcvd_reo[i]); \
1897*5113495bSYour Name 									\
1898*5113495bSYour Name 		for (i = 0; i <  CDP_MAX_LMACS; i++) \
1899*5113495bSYour Name 			DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.rx_lmac[i]); \
1900*5113495bSYour Name 									\
1901*5113495bSYour Name 		_srcobj->stats.rx.unicast.num = \
1902*5113495bSYour Name 			_srcobj->stats.rx.to_stack.num - \
1903*5113495bSYour Name 					_srcobj->stats.rx.multicast.num; \
1904*5113495bSYour Name 		_srcobj->stats.rx.unicast.bytes = \
1905*5113495bSYour Name 			_srcobj->stats.rx.to_stack.bytes - \
1906*5113495bSYour Name 					_srcobj->stats.rx.multicast.bytes; \
1907*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.unicast); \
1908*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.multicast); \
1909*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.bcast); \
1910*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.raw); \
1911*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.intra_bss.pkts); \
1912*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.intra_bss.fail); \
1913*5113495bSYour Name 		DP_STATS_AGGR_PKT(_tgtobj, _srcobj, rx.mec_drop); \
1914*5113495bSYour Name 								  \
1915*5113495bSYour Name 		_tgtobj->stats.tx.last_ack_rssi =	\
1916*5113495bSYour Name 			_srcobj->stats.tx.last_ack_rssi; \
1917*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.multipass_rx_pkt_drop); \
1918*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.peer_unauth_rx_pkt_drop); \
1919*5113495bSYour Name 		DP_STATS_AGGR(_tgtobj, _srcobj, rx.policy_check_drop); \
1920*5113495bSYour Name 		DP_IPA_UPDATE_RX_STATS(_tgtobj, _srcobj); \
1921*5113495bSYour Name 	}  while (0)
1922*5113495bSYour Name 
1923*5113495bSYour Name #ifdef VDEV_PEER_PROTOCOL_COUNT
1924*5113495bSYour Name #define DP_UPDATE_PROTOCOL_COUNT_STATS(_tgtobj, _srcobj) \
1925*5113495bSYour Name { \
1926*5113495bSYour Name 	uint8_t j; \
1927*5113495bSYour Name 	for (j = 0; j < CDP_TRACE_MAX; j++) { \
1928*5113495bSYour Name 		_tgtobj->tx.protocol_trace_cnt[j].egress_cnt += \
1929*5113495bSYour Name 			_srcobj->tx.protocol_trace_cnt[j].egress_cnt; \
1930*5113495bSYour Name 		_tgtobj->tx.protocol_trace_cnt[j].ingress_cnt += \
1931*5113495bSYour Name 			_srcobj->tx.protocol_trace_cnt[j].ingress_cnt; \
1932*5113495bSYour Name 		_tgtobj->rx.protocol_trace_cnt[j].egress_cnt += \
1933*5113495bSYour Name 			_srcobj->rx.protocol_trace_cnt[j].egress_cnt; \
1934*5113495bSYour Name 		_tgtobj->rx.protocol_trace_cnt[j].ingress_cnt += \
1935*5113495bSYour Name 			_srcobj->rx.protocol_trace_cnt[j].ingress_cnt; \
1936*5113495bSYour Name 	} \
1937*5113495bSYour Name }
1938*5113495bSYour Name #else
1939*5113495bSYour Name #define DP_UPDATE_PROTOCOL_COUNT_STATS(_tgtobj, _srcobj)
1940*5113495bSYour Name #endif
1941*5113495bSYour Name 
1942*5113495bSYour Name #ifdef WLAN_FEATURE_11BE
1943*5113495bSYour Name #define DP_UPDATE_11BE_STATS(_tgtobj, _srcobj) \
1944*5113495bSYour Name 	do { \
1945*5113495bSYour Name 		uint8_t i, mu_type; \
1946*5113495bSYour Name 		for (i = 0; i < MAX_MCS; i++) { \
1947*5113495bSYour Name 			_tgtobj->tx.su_be_ppdu_cnt.mcs_count[i] += \
1948*5113495bSYour Name 				_srcobj->tx.su_be_ppdu_cnt.mcs_count[i]; \
1949*5113495bSYour Name 			_tgtobj->rx.su_be_ppdu_cnt.mcs_count[i] += \
1950*5113495bSYour Name 				_srcobj->rx.su_be_ppdu_cnt.mcs_count[i]; \
1951*5113495bSYour Name 		} \
1952*5113495bSYour Name 		for (mu_type = 0; mu_type < TXRX_TYPE_MU_MAX; mu_type++) { \
1953*5113495bSYour Name 			for (i = 0; i < MAX_MCS; i++) { \
1954*5113495bSYour Name 				_tgtobj->tx.mu_be_ppdu_cnt[mu_type].mcs_count[i] += \
1955*5113495bSYour Name 					_srcobj->tx.mu_be_ppdu_cnt[mu_type].mcs_count[i]; \
1956*5113495bSYour Name 				_tgtobj->rx.mu_be_ppdu_cnt[mu_type].mcs_count[i] += \
1957*5113495bSYour Name 					_srcobj->rx.mu_be_ppdu_cnt[mu_type].mcs_count[i]; \
1958*5113495bSYour Name 			} \
1959*5113495bSYour Name 		} \
1960*5113495bSYour Name 		for (i = 0; i < MAX_PUNCTURED_MODE; i++) { \
1961*5113495bSYour Name 			_tgtobj->tx.punc_bw[i] += _srcobj->tx.punc_bw[i]; \
1962*5113495bSYour Name 			_tgtobj->rx.punc_bw[i] += _srcobj->rx.punc_bw[i]; \
1963*5113495bSYour Name 		} \
1964*5113495bSYour Name 	} while (0)
1965*5113495bSYour Name #else
1966*5113495bSYour Name #define DP_UPDATE_11BE_STATS(_tgtobj, _srcobj)
1967*5113495bSYour Name #endif
1968*5113495bSYour Name 
1969*5113495bSYour Name #define DP_UPDATE_BASIC_STATS(_tgtobj, _srcobj) \
1970*5113495bSYour Name 	do { \
1971*5113495bSYour Name 		_tgtobj->tx.comp_pkt.num += _srcobj->tx.comp_pkt.num; \
1972*5113495bSYour Name 		_tgtobj->tx.comp_pkt.bytes += _srcobj->tx.comp_pkt.bytes; \
1973*5113495bSYour Name 		_tgtobj->tx.tx_failed += _srcobj->tx.tx_failed; \
1974*5113495bSYour Name 		_tgtobj->rx.to_stack.num += _srcobj->rx.to_stack.num; \
1975*5113495bSYour Name 		_tgtobj->rx.to_stack.bytes += _srcobj->rx.to_stack.bytes; \
1976*5113495bSYour Name 	} while (0)
1977*5113495bSYour Name 
1978*5113495bSYour Name #define DP_UPDATE_PER_PKT_STATS(_tgtobj, _srcobj) \
1979*5113495bSYour Name 	do { \
1980*5113495bSYour Name 		uint8_t i; \
1981*5113495bSYour Name 		_tgtobj->tx.ucast.num += _srcobj->tx.ucast.num; \
1982*5113495bSYour Name 		_tgtobj->tx.ucast.bytes += _srcobj->tx.ucast.bytes; \
1983*5113495bSYour Name 		_tgtobj->tx.mcast.num += _srcobj->tx.mcast.num; \
1984*5113495bSYour Name 		_tgtobj->tx.mcast.bytes += _srcobj->tx.mcast.bytes; \
1985*5113495bSYour Name 		_tgtobj->tx.bcast.num += _srcobj->tx.bcast.num; \
1986*5113495bSYour Name 		_tgtobj->tx.bcast.bytes += _srcobj->tx.bcast.bytes; \
1987*5113495bSYour Name 		_tgtobj->tx.nawds_mcast.num += _srcobj->tx.nawds_mcast.num; \
1988*5113495bSYour Name 		_tgtobj->tx.nawds_mcast.bytes += \
1989*5113495bSYour Name 					_srcobj->tx.nawds_mcast.bytes; \
1990*5113495bSYour Name 		_tgtobj->tx.tx_success.num += _srcobj->tx.tx_success.num; \
1991*5113495bSYour Name 		_tgtobj->tx.tx_success.bytes += _srcobj->tx.tx_success.bytes; \
1992*5113495bSYour Name 		_tgtobj->tx.nawds_mcast_drop += _srcobj->tx.nawds_mcast_drop; \
1993*5113495bSYour Name 		_tgtobj->tx.ofdma += _srcobj->tx.ofdma; \
1994*5113495bSYour Name 		_tgtobj->tx.non_amsdu_cnt += _srcobj->tx.non_amsdu_cnt; \
1995*5113495bSYour Name 		_tgtobj->tx.amsdu_cnt += _srcobj->tx.amsdu_cnt; \
1996*5113495bSYour Name 		_tgtobj->tx.dropped.fw_rem.num += \
1997*5113495bSYour Name 					_srcobj->tx.dropped.fw_rem.num; \
1998*5113495bSYour Name 		_tgtobj->tx.dropped.fw_rem.bytes += \
1999*5113495bSYour Name 					_srcobj->tx.dropped.fw_rem.bytes; \
2000*5113495bSYour Name 		_tgtobj->tx.dropped.fw_rem_notx += \
2001*5113495bSYour Name 					_srcobj->tx.dropped.fw_rem_notx; \
2002*5113495bSYour Name 		_tgtobj->tx.dropped.fw_rem_tx += \
2003*5113495bSYour Name 					_srcobj->tx.dropped.fw_rem_tx; \
2004*5113495bSYour Name 		_tgtobj->tx.dropped.age_out += _srcobj->tx.dropped.age_out; \
2005*5113495bSYour Name 		_tgtobj->tx.dropped.fw_reason1 += \
2006*5113495bSYour Name 					_srcobj->tx.dropped.fw_reason1; \
2007*5113495bSYour Name 		_tgtobj->tx.dropped.fw_reason2 += \
2008*5113495bSYour Name 					_srcobj->tx.dropped.fw_reason2; \
2009*5113495bSYour Name 		_tgtobj->tx.dropped.fw_reason3 += \
2010*5113495bSYour Name 					_srcobj->tx.dropped.fw_reason3; \
2011*5113495bSYour Name 		_tgtobj->tx.dropped.fw_rem_queue_disable += \
2012*5113495bSYour Name 					_srcobj->tx.dropped.fw_rem_queue_disable; \
2013*5113495bSYour Name 		_tgtobj->tx.dropped.fw_rem_no_match += \
2014*5113495bSYour Name 					_srcobj->tx.dropped.fw_rem_no_match; \
2015*5113495bSYour Name 		_tgtobj->tx.dropped.drop_threshold += \
2016*5113495bSYour Name 					_srcobj->tx.dropped.drop_threshold; \
2017*5113495bSYour Name 		_tgtobj->tx.dropped.drop_link_desc_na += \
2018*5113495bSYour Name 					_srcobj->tx.dropped.drop_link_desc_na; \
2019*5113495bSYour Name 		_tgtobj->tx.dropped.invalid_drop += \
2020*5113495bSYour Name 					_srcobj->tx.dropped.invalid_drop; \
2021*5113495bSYour Name 		_tgtobj->tx.dropped.mcast_vdev_drop += \
2022*5113495bSYour Name 					_srcobj->tx.dropped.mcast_vdev_drop; \
2023*5113495bSYour Name 		_tgtobj->tx.dropped.invalid_rr += \
2024*5113495bSYour Name 					_srcobj->tx.dropped.invalid_rr; \
2025*5113495bSYour Name 		_tgtobj->tx.failed_retry_count += \
2026*5113495bSYour Name 					_srcobj->tx.failed_retry_count; \
2027*5113495bSYour Name 		_tgtobj->tx.retry_count += _srcobj->tx.retry_count; \
2028*5113495bSYour Name 		_tgtobj->tx.multiple_retry_count += \
2029*5113495bSYour Name 					_srcobj->tx.multiple_retry_count; \
2030*5113495bSYour Name 		_tgtobj->tx.tx_success_twt.num += \
2031*5113495bSYour Name 					_srcobj->tx.tx_success_twt.num; \
2032*5113495bSYour Name 		_tgtobj->tx.tx_success_twt.bytes += \
2033*5113495bSYour Name 					_srcobj->tx.tx_success_twt.bytes; \
2034*5113495bSYour Name 		_tgtobj->tx.last_tx_ts = _srcobj->tx.last_tx_ts; \
2035*5113495bSYour Name 		_tgtobj->tx.release_src_not_tqm += \
2036*5113495bSYour Name 					_srcobj->tx.release_src_not_tqm; \
2037*5113495bSYour Name 		for (i = 0; i < QDF_PROTO_SUBTYPE_MAX; i++) { \
2038*5113495bSYour Name 			_tgtobj->tx.no_ack_count[i] += \
2039*5113495bSYour Name 					_srcobj->tx.no_ack_count[i];\
2040*5113495bSYour Name 		} \
2041*5113495bSYour Name 		\
2042*5113495bSYour Name 		_tgtobj->rx.multicast.num += _srcobj->rx.multicast.num; \
2043*5113495bSYour Name 		_tgtobj->rx.multicast.bytes += _srcobj->rx.multicast.bytes; \
2044*5113495bSYour Name 		_tgtobj->rx.rx_success.num += _srcobj->rx.rx_success.num;\
2045*5113495bSYour Name 		_tgtobj->rx.rx_success.bytes += _srcobj->rx.rx_success.bytes;\
2046*5113495bSYour Name 		_tgtobj->rx.bcast.num += _srcobj->rx.bcast.num; \
2047*5113495bSYour Name 		_tgtobj->rx.bcast.bytes += _srcobj->rx.bcast.bytes; \
2048*5113495bSYour Name 		_tgtobj->rx.unicast.num += _srcobj->rx.unicast.num; \
2049*5113495bSYour Name 		_tgtobj->rx.unicast.bytes += _srcobj->rx.unicast.bytes; \
2050*5113495bSYour Name 		_tgtobj->rx.raw.num += _srcobj->rx.raw.num; \
2051*5113495bSYour Name 		_tgtobj->rx.raw.bytes += _srcobj->rx.raw.bytes; \
2052*5113495bSYour Name 		_tgtobj->rx.nawds_mcast_drop += _srcobj->rx.nawds_mcast_drop; \
2053*5113495bSYour Name 		_tgtobj->rx.mcast_3addr_drop += _srcobj->rx.mcast_3addr_drop; \
2054*5113495bSYour Name 		_tgtobj->rx.mec_drop.num += _srcobj->rx.mec_drop.num; \
2055*5113495bSYour Name 		_tgtobj->rx.mec_drop.bytes += _srcobj->rx.mec_drop.bytes; \
2056*5113495bSYour Name 		_tgtobj->rx.ppeds_drop.num += _srcobj->rx.ppeds_drop.num; \
2057*5113495bSYour Name 		_tgtobj->rx.ppeds_drop.bytes += _srcobj->rx.ppeds_drop.bytes; \
2058*5113495bSYour Name 		_tgtobj->rx.intra_bss.pkts.num += \
2059*5113495bSYour Name 					_srcobj->rx.intra_bss.pkts.num; \
2060*5113495bSYour Name 		_tgtobj->rx.intra_bss.pkts.bytes += \
2061*5113495bSYour Name 					_srcobj->rx.intra_bss.pkts.bytes; \
2062*5113495bSYour Name 		_tgtobj->rx.intra_bss.fail.num += \
2063*5113495bSYour Name 					_srcobj->rx.intra_bss.fail.num; \
2064*5113495bSYour Name 		_tgtobj->rx.intra_bss.fail.bytes += \
2065*5113495bSYour Name 					_srcobj->rx.intra_bss.fail.bytes; \
2066*5113495bSYour Name 		_tgtobj->rx.intra_bss.mdns_no_fwd += \
2067*5113495bSYour Name 					_srcobj->rx.intra_bss.mdns_no_fwd; \
2068*5113495bSYour Name 		_tgtobj->rx.err.mic_err += _srcobj->rx.err.mic_err; \
2069*5113495bSYour Name 		_tgtobj->rx.err.decrypt_err += _srcobj->rx.err.decrypt_err; \
2070*5113495bSYour Name 		_tgtobj->rx.err.fcserr += _srcobj->rx.err.fcserr; \
2071*5113495bSYour Name 		_tgtobj->rx.err.pn_err += _srcobj->rx.err.pn_err; \
2072*5113495bSYour Name 		_tgtobj->rx.err.oor_err += _srcobj->rx.err.oor_err; \
2073*5113495bSYour Name 		_tgtobj->rx.err.jump_2k_err += _srcobj->rx.err.jump_2k_err; \
2074*5113495bSYour Name 		_tgtobj->rx.err.rxdma_wifi_parse_err += \
2075*5113495bSYour Name 					_srcobj->rx.err.rxdma_wifi_parse_err; \
2076*5113495bSYour Name 		_tgtobj->rx.non_amsdu_cnt += _srcobj->rx.non_amsdu_cnt; \
2077*5113495bSYour Name 		_tgtobj->rx.amsdu_cnt += _srcobj->rx.amsdu_cnt; \
2078*5113495bSYour Name 		_tgtobj->rx.rx_retries += _srcobj->rx.rx_retries; \
2079*5113495bSYour Name 		_tgtobj->rx.multipass_rx_pkt_drop += \
2080*5113495bSYour Name 					_srcobj->rx.multipass_rx_pkt_drop; \
2081*5113495bSYour Name 		_tgtobj->rx.peer_unauth_rx_pkt_drop += \
2082*5113495bSYour Name 					_srcobj->rx.peer_unauth_rx_pkt_drop; \
2083*5113495bSYour Name 		_tgtobj->rx.policy_check_drop += \
2084*5113495bSYour Name 					_srcobj->rx.policy_check_drop; \
2085*5113495bSYour Name 		_tgtobj->rx.to_stack_twt.num += _srcobj->rx.to_stack_twt.num; \
2086*5113495bSYour Name 		_tgtobj->rx.to_stack_twt.bytes += \
2087*5113495bSYour Name 					_srcobj->rx.to_stack_twt.bytes; \
2088*5113495bSYour Name 		_tgtobj->rx.last_rx_ts = _srcobj->rx.last_rx_ts; \
2089*5113495bSYour Name 		for (i = 0; i < CDP_MAX_RX_RINGS; i++) { \
2090*5113495bSYour Name 			_tgtobj->rx.rcvd_reo[i].num += \
2091*5113495bSYour Name 					 _srcobj->rx.rcvd_reo[i].num; \
2092*5113495bSYour Name 			_tgtobj->rx.rcvd_reo[i].bytes += \
2093*5113495bSYour Name 					_srcobj->rx.rcvd_reo[i].bytes; \
2094*5113495bSYour Name 			_tgtobj->rx.rcvd.num += \
2095*5113495bSYour Name 					 _srcobj->rx.rcvd_reo[i].num; \
2096*5113495bSYour Name 			_tgtobj->rx.rcvd.bytes += \
2097*5113495bSYour Name 					_srcobj->rx.rcvd_reo[i].bytes; \
2098*5113495bSYour Name 		} \
2099*5113495bSYour Name 		for (i = 0; i < CDP_MAX_LMACS; i++) { \
2100*5113495bSYour Name 			_tgtobj->rx.rx_lmac[i].num += \
2101*5113495bSYour Name 					_srcobj->rx.rx_lmac[i].num; \
2102*5113495bSYour Name 			_tgtobj->rx.rx_lmac[i].bytes += \
2103*5113495bSYour Name 					_srcobj->rx.rx_lmac[i].bytes; \
2104*5113495bSYour Name 		} \
2105*5113495bSYour Name 		DP_IPA_UPDATE_PER_PKT_RX_STATS(_tgtobj, _srcobj); \
2106*5113495bSYour Name 		DP_UPDATE_PROTOCOL_COUNT_STATS(_tgtobj, _srcobj); \
2107*5113495bSYour Name 	} while (0)
2108*5113495bSYour Name 
2109*5113495bSYour Name #define DP_UPDATE_EXTD_STATS(_tgtobj, _srcobj) \
2110*5113495bSYour Name 	do { \
2111*5113495bSYour Name 		uint8_t i, pream_type, mu_type; \
2112*5113495bSYour Name 		_tgtobj->tx.stbc += _srcobj->tx.stbc; \
2113*5113495bSYour Name 		_tgtobj->tx.ldpc += _srcobj->tx.ldpc; \
2114*5113495bSYour Name 		_tgtobj->tx.retries += _srcobj->tx.retries; \
2115*5113495bSYour Name 		_tgtobj->tx.ampdu_cnt += _srcobj->tx.ampdu_cnt; \
2116*5113495bSYour Name 		_tgtobj->tx.non_ampdu_cnt += _srcobj->tx.non_ampdu_cnt; \
2117*5113495bSYour Name 		_tgtobj->tx.num_ppdu_cookie_valid += \
2118*5113495bSYour Name 					_srcobj->tx.num_ppdu_cookie_valid; \
2119*5113495bSYour Name 		_tgtobj->tx.tx_ppdus += _srcobj->tx.tx_ppdus; \
2120*5113495bSYour Name 		_tgtobj->tx.tx_mpdus_success += _srcobj->tx.tx_mpdus_success; \
2121*5113495bSYour Name 		_tgtobj->tx.tx_mpdus_tried += _srcobj->tx.tx_mpdus_tried; \
2122*5113495bSYour Name 		_tgtobj->tx.tx_rate = _srcobj->tx.tx_rate; \
2123*5113495bSYour Name 		_tgtobj->tx.last_tx_rate = _srcobj->tx.last_tx_rate; \
2124*5113495bSYour Name 		_tgtobj->tx.last_tx_rate_mcs = _srcobj->tx.last_tx_rate_mcs; \
2125*5113495bSYour Name 		_tgtobj->tx.mcast_last_tx_rate = \
2126*5113495bSYour Name 					_srcobj->tx.mcast_last_tx_rate; \
2127*5113495bSYour Name 		_tgtobj->tx.mcast_last_tx_rate_mcs = \
2128*5113495bSYour Name 					_srcobj->tx.mcast_last_tx_rate_mcs; \
2129*5113495bSYour Name 		_tgtobj->tx.rnd_avg_tx_rate = _srcobj->tx.rnd_avg_tx_rate; \
2130*5113495bSYour Name 		_tgtobj->tx.avg_tx_rate = _srcobj->tx.avg_tx_rate; \
2131*5113495bSYour Name 		_tgtobj->tx.tx_ratecode = _srcobj->tx.tx_ratecode; \
2132*5113495bSYour Name 		_tgtobj->tx.pream_punct_cnt += _srcobj->tx.pream_punct_cnt; \
2133*5113495bSYour Name 		_tgtobj->tx.ru_start = _srcobj->tx.ru_start; \
2134*5113495bSYour Name 		_tgtobj->tx.ru_tones = _srcobj->tx.ru_tones; \
2135*5113495bSYour Name 		_tgtobj->tx.last_ack_rssi = _srcobj->tx.last_ack_rssi; \
2136*5113495bSYour Name 		_tgtobj->tx.nss_info = _srcobj->tx.nss_info; \
2137*5113495bSYour Name 		_tgtobj->tx.mcs_info = _srcobj->tx.mcs_info; \
2138*5113495bSYour Name 		_tgtobj->tx.bw_info = _srcobj->tx.bw_info; \
2139*5113495bSYour Name 		_tgtobj->tx.gi_info = _srcobj->tx.gi_info; \
2140*5113495bSYour Name 		_tgtobj->tx.preamble_info = _srcobj->tx.preamble_info; \
2141*5113495bSYour Name 		_tgtobj->tx.retries_mpdu += _srcobj->tx.retries_mpdu; \
2142*5113495bSYour Name 		_tgtobj->tx.mpdu_success_with_retries += \
2143*5113495bSYour Name 					_srcobj->tx.mpdu_success_with_retries; \
2144*5113495bSYour Name 		_tgtobj->tx.rts_success = _srcobj->tx.rts_success; \
2145*5113495bSYour Name 		_tgtobj->tx.rts_failure = _srcobj->tx.rts_failure; \
2146*5113495bSYour Name 		_tgtobj->tx.bar_cnt = _srcobj->tx.bar_cnt; \
2147*5113495bSYour Name 		_tgtobj->tx.ndpa_cnt = _srcobj->tx.ndpa_cnt; \
2148*5113495bSYour Name 		for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \
2149*5113495bSYour Name 			for (i = 0; i < MAX_MCS; i++) \
2150*5113495bSYour Name 				_tgtobj->tx.pkt_type[pream_type].mcs_count[i] += \
2151*5113495bSYour Name 				_srcobj->tx.pkt_type[pream_type].mcs_count[i]; \
2152*5113495bSYour Name 		} \
2153*5113495bSYour Name 		for (i = 0; i < WME_AC_MAX; i++) { \
2154*5113495bSYour Name 			_tgtobj->tx.wme_ac_type[i] += _srcobj->tx.wme_ac_type[i]; \
2155*5113495bSYour Name 			_tgtobj->tx.wme_ac_type_bytes[i] += \
2156*5113495bSYour Name 					_srcobj->tx.wme_ac_type_bytes[i]; \
2157*5113495bSYour Name 			_tgtobj->tx.excess_retries_per_ac[i] += \
2158*5113495bSYour Name 					_srcobj->tx.excess_retries_per_ac[i]; \
2159*5113495bSYour Name 		} \
2160*5113495bSYour Name 		for (i = 0; i < MAX_GI; i++) { \
2161*5113495bSYour Name 			_tgtobj->tx.sgi_count[i] += _srcobj->tx.sgi_count[i]; \
2162*5113495bSYour Name 		} \
2163*5113495bSYour Name 		for (i = 0; i < SS_COUNT; i++) { \
2164*5113495bSYour Name 			_tgtobj->tx.nss[i] += _srcobj->tx.nss[i]; \
2165*5113495bSYour Name 		} \
2166*5113495bSYour Name 		for (i = 0; i < MAX_BW; i++) { \
2167*5113495bSYour Name 			_tgtobj->tx.bw[i] += _srcobj->tx.bw[i]; \
2168*5113495bSYour Name 		} \
2169*5113495bSYour Name 		for (i = 0; i < MAX_RU_LOCATIONS; i++) { \
2170*5113495bSYour Name 			_tgtobj->tx.ru_loc[i].num_msdu += \
2171*5113495bSYour Name 					_srcobj->tx.ru_loc[i].num_msdu; \
2172*5113495bSYour Name 			_tgtobj->tx.ru_loc[i].num_mpdu += \
2173*5113495bSYour Name 					_srcobj->tx.ru_loc[i].num_mpdu; \
2174*5113495bSYour Name 			_tgtobj->tx.ru_loc[i].mpdu_tried += \
2175*5113495bSYour Name 					_srcobj->tx.ru_loc[i].mpdu_tried; \
2176*5113495bSYour Name 		} \
2177*5113495bSYour Name 		for (i = 0; i < MAX_TRANSMIT_TYPES; i++) { \
2178*5113495bSYour Name 			_tgtobj->tx.transmit_type[i].num_msdu += \
2179*5113495bSYour Name 					_srcobj->tx.transmit_type[i].num_msdu; \
2180*5113495bSYour Name 			_tgtobj->tx.transmit_type[i].num_mpdu += \
2181*5113495bSYour Name 					_srcobj->tx.transmit_type[i].num_mpdu; \
2182*5113495bSYour Name 			_tgtobj->tx.transmit_type[i].mpdu_tried += \
2183*5113495bSYour Name 					_srcobj->tx.transmit_type[i].mpdu_tried; \
2184*5113495bSYour Name 		} \
2185*5113495bSYour Name 		for (i = 0; i < MAX_MU_GROUP_ID; i++) { \
2186*5113495bSYour Name 			_tgtobj->tx.mu_group_id[i] = _srcobj->tx.mu_group_id[i]; \
2187*5113495bSYour Name 		} \
2188*5113495bSYour Name 		_tgtobj->tx.tx_ucast_total.num += \
2189*5113495bSYour Name 				_srcobj->tx.tx_ucast_total.num;\
2190*5113495bSYour Name 		_tgtobj->tx.tx_ucast_total.bytes += \
2191*5113495bSYour Name 				 _srcobj->tx.tx_ucast_total.bytes;\
2192*5113495bSYour Name 		_tgtobj->tx.tx_ucast_success.num += \
2193*5113495bSYour Name 				_srcobj->tx.tx_ucast_success.num; \
2194*5113495bSYour Name 		_tgtobj->tx.tx_ucast_success.bytes += \
2195*5113495bSYour Name 				_srcobj->tx.tx_ucast_success.bytes; \
2196*5113495bSYour Name 		\
2197*5113495bSYour Name 		for (i = 0; i < CDP_RSSI_CHAIN_LEN; i++) \
2198*5113495bSYour Name 			_tgtobj->tx.rssi_chain[i] = _srcobj->tx.rssi_chain[i]; \
2199*5113495bSYour Name 		_tgtobj->rx.mpdu_cnt_fcs_ok += _srcobj->rx.mpdu_cnt_fcs_ok; \
2200*5113495bSYour Name 		_tgtobj->rx.mpdu_cnt_fcs_err += _srcobj->rx.mpdu_cnt_fcs_err; \
2201*5113495bSYour Name 		_tgtobj->rx.non_ampdu_cnt += _srcobj->rx.non_ampdu_cnt; \
2202*5113495bSYour Name 		_tgtobj->rx.ampdu_cnt += _srcobj->rx.ampdu_cnt; \
2203*5113495bSYour Name 		_tgtobj->rx.rx_mpdus += _srcobj->rx.rx_mpdus; \
2204*5113495bSYour Name 		_tgtobj->rx.rx_ppdus += _srcobj->rx.rx_ppdus; \
2205*5113495bSYour Name 		_tgtobj->rx.rx_rate = _srcobj->rx.rx_rate; \
2206*5113495bSYour Name 		_tgtobj->rx.last_rx_rate = _srcobj->rx.last_rx_rate; \
2207*5113495bSYour Name 		_tgtobj->rx.rnd_avg_rx_rate = _srcobj->rx.rnd_avg_rx_rate; \
2208*5113495bSYour Name 		_tgtobj->rx.avg_rx_rate = _srcobj->rx.avg_rx_rate; \
2209*5113495bSYour Name 		_tgtobj->rx.rx_ratecode = _srcobj->rx.rx_ratecode; \
2210*5113495bSYour Name 		_tgtobj->rx.avg_snr = _srcobj->rx.avg_snr; \
2211*5113495bSYour Name 		_tgtobj->rx.rx_snr_measured_time = \
2212*5113495bSYour Name 					_srcobj->rx.rx_snr_measured_time; \
2213*5113495bSYour Name 		_tgtobj->rx.snr = _srcobj->rx.snr; \
2214*5113495bSYour Name 		_tgtobj->rx.last_snr = _srcobj->rx.last_snr; \
2215*5113495bSYour Name 		_tgtobj->rx.nss_info = _srcobj->rx.nss_info; \
2216*5113495bSYour Name 		_tgtobj->rx.mcs_info = _srcobj->rx.mcs_info; \
2217*5113495bSYour Name 		_tgtobj->rx.bw_info = _srcobj->rx.bw_info; \
2218*5113495bSYour Name 		_tgtobj->rx.gi_info = _srcobj->rx.gi_info; \
2219*5113495bSYour Name 		_tgtobj->rx.preamble_info = _srcobj->rx.preamble_info; \
2220*5113495bSYour Name 		_tgtobj->rx.mpdu_retry_cnt += _srcobj->rx.mpdu_retry_cnt; \
2221*5113495bSYour Name 		_tgtobj->rx.bar_cnt = _srcobj->rx.bar_cnt; \
2222*5113495bSYour Name 		_tgtobj->rx.ndpa_cnt = _srcobj->rx.ndpa_cnt; \
2223*5113495bSYour Name 		for (pream_type = 0; pream_type < DOT11_MAX; pream_type++) { \
2224*5113495bSYour Name 			for (i = 0; i < MAX_MCS; i++) { \
2225*5113495bSYour Name 				_tgtobj->rx.pkt_type[pream_type].mcs_count[i] += \
2226*5113495bSYour Name 					_srcobj->rx.pkt_type[pream_type].mcs_count[i]; \
2227*5113495bSYour Name 			} \
2228*5113495bSYour Name 		} \
2229*5113495bSYour Name 		for (i = 0; i < WME_AC_MAX; i++) { \
2230*5113495bSYour Name 			_tgtobj->rx.wme_ac_type[i] += _srcobj->rx.wme_ac_type[i]; \
2231*5113495bSYour Name 			_tgtobj->rx.wme_ac_type_bytes[i] += \
2232*5113495bSYour Name 					_srcobj->rx.wme_ac_type_bytes[i]; \
2233*5113495bSYour Name 		} \
2234*5113495bSYour Name 		for (i = 0; i < MAX_MCS; i++) { \
2235*5113495bSYour Name 			_tgtobj->rx.su_ax_ppdu_cnt.mcs_count[i] += \
2236*5113495bSYour Name 					_srcobj->rx.su_ax_ppdu_cnt.mcs_count[i]; \
2237*5113495bSYour Name 			_tgtobj->rx.rx_mpdu_cnt[i] += _srcobj->rx.rx_mpdu_cnt[i]; \
2238*5113495bSYour Name 		} \
2239*5113495bSYour Name 		for (mu_type = 0 ; mu_type < TXRX_TYPE_MU_MAX; mu_type++) { \
2240*5113495bSYour Name 			_tgtobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok += \
2241*5113495bSYour Name 				_srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_ok; \
2242*5113495bSYour Name 			_tgtobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err += \
2243*5113495bSYour Name 				_srcobj->rx.rx_mu[mu_type].mpdu_cnt_fcs_err; \
2244*5113495bSYour Name 			for (i = 0; i < SS_COUNT; i++) \
2245*5113495bSYour Name 				_tgtobj->rx.rx_mu[mu_type].ppdu_nss[i] += \
2246*5113495bSYour Name 					_srcobj->rx.rx_mu[mu_type].ppdu_nss[i]; \
2247*5113495bSYour Name 			for (i = 0; i < MAX_MCS; i++) \
2248*5113495bSYour Name 				_tgtobj->rx.rx_mu[mu_type].ppdu.mcs_count[i] += \
2249*5113495bSYour Name 					_srcobj->rx.rx_mu[mu_type].ppdu.mcs_count[i]; \
2250*5113495bSYour Name 		} \
2251*5113495bSYour Name 		for (i = 0; i < MAX_RECEPTION_TYPES; i++) { \
2252*5113495bSYour Name 			_tgtobj->rx.reception_type[i] += \
2253*5113495bSYour Name 					_srcobj->rx.reception_type[i]; \
2254*5113495bSYour Name 			_tgtobj->rx.ppdu_cnt[i] += _srcobj->rx.ppdu_cnt[i]; \
2255*5113495bSYour Name 		} \
2256*5113495bSYour Name 		for (i = 0; i < MAX_GI; i++) { \
2257*5113495bSYour Name 			_tgtobj->rx.sgi_count[i] += _srcobj->rx.sgi_count[i]; \
2258*5113495bSYour Name 		} \
2259*5113495bSYour Name 		for (i = 0; i < SS_COUNT; i++) { \
2260*5113495bSYour Name 			_tgtobj->rx.nss[i] += _srcobj->rx.nss[i]; \
2261*5113495bSYour Name 			_tgtobj->rx.ppdu_nss[i] += _srcobj->rx.ppdu_nss[i]; \
2262*5113495bSYour Name 		} \
2263*5113495bSYour Name 		for (i = 0; i < MAX_BW; i++) { \
2264*5113495bSYour Name 			_tgtobj->rx.bw[i] += _srcobj->rx.bw[i]; \
2265*5113495bSYour Name 		} \
2266*5113495bSYour Name 		DP_UPDATE_11BE_STATS(_tgtobj, _srcobj); \
2267*5113495bSYour Name 	} while (0)
2268*5113495bSYour Name 
2269*5113495bSYour Name #define DP_UPDATE_VDEV_STATS_FOR_UNMAPPED_PEERS(_tgtobj, _srcobj) \
2270*5113495bSYour Name 	do { \
2271*5113495bSYour Name 		DP_UPDATE_BASIC_STATS(_tgtobj, _srcobj); \
2272*5113495bSYour Name 		DP_UPDATE_PER_PKT_STATS(_tgtobj, _srcobj); \
2273*5113495bSYour Name 		DP_UPDATE_EXTD_STATS(_tgtobj, _srcobj); \
2274*5113495bSYour Name 	} while (0)
2275*5113495bSYour Name 
2276*5113495bSYour Name #define DP_UPDATE_RX_INGRESS_STATS(_tgtobj, _srcobj) \
2277*5113495bSYour Name 	do { \
2278*5113495bSYour Name 		_tgtobj->rx_i.reo_rcvd_pkt.num += \
2279*5113495bSYour Name 					_srcobj->rx_i.reo_rcvd_pkt.num; \
2280*5113495bSYour Name 		_tgtobj->rx_i.reo_rcvd_pkt.bytes += \
2281*5113495bSYour Name 					_srcobj->rx_i.reo_rcvd_pkt.bytes; \
2282*5113495bSYour Name 		_tgtobj->rx_i.null_q_desc_pkt.num += \
2283*5113495bSYour Name 					_srcobj->rx_i.null_q_desc_pkt.num; \
2284*5113495bSYour Name 		_tgtobj->rx_i.null_q_desc_pkt.bytes += \
2285*5113495bSYour Name 					_srcobj->rx_i.null_q_desc_pkt.bytes; \
2286*5113495bSYour Name 		_tgtobj->rx_i.routed_eapol_pkt.num += \
2287*5113495bSYour Name 					_srcobj->rx_i.routed_eapol_pkt.num; \
2288*5113495bSYour Name 		_tgtobj->rx_i.routed_eapol_pkt.bytes += \
2289*5113495bSYour Name 					_srcobj->rx_i.routed_eapol_pkt.bytes; \
2290*5113495bSYour Name 	} while (0)
2291*5113495bSYour Name 
2292*5113495bSYour Name #define DP_UPDATE_LINK_VDEV_INGRESS_STATS(_tgtobj, _srcobj, _xmit_type) \
2293*5113495bSYour Name 	do { \
2294*5113495bSYour Name 		uint8_t i = 0; \
2295*5113495bSYour Name 		uint8_t idx = 0; \
2296*5113495bSYour Name 		enum dp_pkt_xmit_type temp_xmit_type = _xmit_type; \
2297*5113495bSYour Name 		if (temp_xmit_type == DP_XMIT_MLD) { \
2298*5113495bSYour Name 			idx = DP_VDEV_XMIT_TYPE; \
2299*5113495bSYour Name 			temp_xmit_type = DP_VDEV_XMIT_TYPE; \
2300*5113495bSYour Name 		} else if (temp_xmit_type == DP_XMIT_TOTAL) { \
2301*5113495bSYour Name 			temp_xmit_type = DP_VDEV_XMIT_TYPE; \
2302*5113495bSYour Name 		} \
2303*5113495bSYour Name 		for (; idx <= temp_xmit_type; idx++) { \
2304*5113495bSYour Name 			_tgtobj->tx_i.rcvd.num += _srcobj->tx_i[idx].rcvd.num; \
2305*5113495bSYour Name 			_tgtobj->tx_i.rcvd.bytes += \
2306*5113495bSYour Name 				_srcobj->tx_i[idx].rcvd.bytes; \
2307*5113495bSYour Name 			_tgtobj->tx_i.rcvd_in_fast_xmit_flow += \
2308*5113495bSYour Name 				_srcobj->tx_i[idx].rcvd_in_fast_xmit_flow; \
2309*5113495bSYour Name 			for (i = 0; i < CDP_MAX_TX_DATA_RINGS; i++) { \
2310*5113495bSYour Name 				_tgtobj->tx_i.rcvd_per_core[i] += \
2311*5113495bSYour Name 				_srcobj->tx_i[idx].rcvd_per_core[i]; \
2312*5113495bSYour Name 			} \
2313*5113495bSYour Name 			_tgtobj->tx_i.processed.num += \
2314*5113495bSYour Name 				_srcobj->tx_i[idx].processed.num; \
2315*5113495bSYour Name 			_tgtobj->tx_i.processed.bytes += \
2316*5113495bSYour Name 				_srcobj->tx_i[idx].processed.bytes; \
2317*5113495bSYour Name 			_tgtobj->tx_i.reinject_pkts.num += \
2318*5113495bSYour Name 				_srcobj->tx_i[idx].reinject_pkts.num; \
2319*5113495bSYour Name 			_tgtobj->tx_i.reinject_pkts.bytes += \
2320*5113495bSYour Name 				_srcobj->tx_i[idx].reinject_pkts.bytes; \
2321*5113495bSYour Name 			_tgtobj->tx_i.inspect_pkts.num += \
2322*5113495bSYour Name 				_srcobj->tx_i[idx].inspect_pkts.num; \
2323*5113495bSYour Name 			_tgtobj->tx_i.inspect_pkts.bytes += \
2324*5113495bSYour Name 				_srcobj->tx_i[idx].inspect_pkts.bytes; \
2325*5113495bSYour Name 			_tgtobj->tx_i.nawds_mcast.num += \
2326*5113495bSYour Name 				_srcobj->tx_i[idx].nawds_mcast.num; \
2327*5113495bSYour Name 			_tgtobj->tx_i.nawds_mcast.bytes += \
2328*5113495bSYour Name 				_srcobj->tx_i[idx].nawds_mcast.bytes; \
2329*5113495bSYour Name 			_tgtobj->tx_i.bcast.num += \
2330*5113495bSYour Name 				_srcobj->tx_i[idx].bcast.num; \
2331*5113495bSYour Name 			_tgtobj->tx_i.bcast.bytes += \
2332*5113495bSYour Name 				_srcobj->tx_i[idx].bcast.bytes; \
2333*5113495bSYour Name 			_tgtobj->tx_i.raw.raw_pkt.num += \
2334*5113495bSYour Name 				_srcobj->tx_i[idx].raw.raw_pkt.num; \
2335*5113495bSYour Name 			_tgtobj->tx_i.raw.raw_pkt.bytes += \
2336*5113495bSYour Name 				_srcobj->tx_i[idx].raw.raw_pkt.bytes; \
2337*5113495bSYour Name 			_tgtobj->tx_i.raw.dma_map_error += \
2338*5113495bSYour Name 				_srcobj->tx_i[idx].raw.dma_map_error; \
2339*5113495bSYour Name 			_tgtobj->tx_i.raw.invalid_raw_pkt_datatype += \
2340*5113495bSYour Name 			     _srcobj->tx_i[idx].raw.invalid_raw_pkt_datatype; \
2341*5113495bSYour Name 			_tgtobj->tx_i.raw.num_frags_overflow_err += \
2342*5113495bSYour Name 				_srcobj->tx_i[idx].raw.num_frags_overflow_err; \
2343*5113495bSYour Name 			_tgtobj->tx_i.sg.sg_pkt.num += \
2344*5113495bSYour Name 				_srcobj->tx_i[idx].sg.sg_pkt.num; \
2345*5113495bSYour Name 			_tgtobj->tx_i.sg.sg_pkt.bytes += \
2346*5113495bSYour Name 				_srcobj->tx_i[idx].sg.sg_pkt.bytes; \
2347*5113495bSYour Name 			_tgtobj->tx_i.sg.non_sg_pkts.num += \
2348*5113495bSYour Name 				_srcobj->tx_i[idx].sg.non_sg_pkts.num; \
2349*5113495bSYour Name 			_tgtobj->tx_i.sg.non_sg_pkts.bytes += \
2350*5113495bSYour Name 				_srcobj->tx_i[idx].sg.non_sg_pkts.bytes; \
2351*5113495bSYour Name 			_tgtobj->tx_i.sg.dropped_host.num += \
2352*5113495bSYour Name 				_srcobj->tx_i[idx].sg.dropped_host.num; \
2353*5113495bSYour Name 			_tgtobj->tx_i.sg.dropped_host.bytes += \
2354*5113495bSYour Name 				_srcobj->tx_i[idx].sg.dropped_host.bytes; \
2355*5113495bSYour Name 			_tgtobj->tx_i.sg.dropped_target += \
2356*5113495bSYour Name 				_srcobj->tx_i[idx].sg.dropped_target; \
2357*5113495bSYour Name 			_tgtobj->tx_i.sg.dma_map_error += \
2358*5113495bSYour Name 				_srcobj->tx_i[idx].sg.dma_map_error; \
2359*5113495bSYour Name 			_tgtobj->tx_i.mcast_en.mcast_pkt.num += \
2360*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.mcast_pkt.num; \
2361*5113495bSYour Name 			_tgtobj->tx_i.mcast_en.mcast_pkt.bytes += \
2362*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.mcast_pkt.bytes; \
2363*5113495bSYour Name 			_tgtobj->tx_i.mcast_en.dropped_map_error += \
2364*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.dropped_map_error; \
2365*5113495bSYour Name 			_tgtobj->tx_i.mcast_en.dropped_self_mac += \
2366*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.dropped_self_mac; \
2367*5113495bSYour Name 			_tgtobj->tx_i.mcast_en.dropped_send_fail += \
2368*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.dropped_send_fail; \
2369*5113495bSYour Name 			_tgtobj->tx_i.mcast_en.ucast += \
2370*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.ucast; \
2371*5113495bSYour Name 			_tgtobj->tx_i.mcast_en.fail_seg_alloc += \
2372*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.fail_seg_alloc; \
2373*5113495bSYour Name 			_tgtobj->tx_i.mcast_en.clone_fail += \
2374*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.clone_fail; \
2375*5113495bSYour Name 			_tgtobj->tx_i.igmp_mcast_en.igmp_rcvd += \
2376*5113495bSYour Name 				_srcobj->tx_i[idx].igmp_mcast_en.igmp_rcvd; \
2377*5113495bSYour Name 			_tgtobj->tx_i.igmp_mcast_en.igmp_ucast_converted += \
2378*5113495bSYour Name 			    _srcobj->tx_i[idx].igmp_mcast_en.igmp_ucast_converted; \
2379*5113495bSYour Name 			_tgtobj->tx_i.dropped.desc_na.num += \
2380*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.desc_na.num; \
2381*5113495bSYour Name 			_tgtobj->tx_i.dropped.desc_na.bytes += \
2382*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.desc_na.bytes; \
2383*5113495bSYour Name 			_tgtobj->tx_i.dropped.desc_na_exc_alloc_fail.num += \
2384*5113495bSYour Name 			_srcobj->tx_i[idx].dropped.desc_na_exc_alloc_fail.num; \
2385*5113495bSYour Name 			_tgtobj->tx_i.dropped.desc_na_exc_alloc_fail.bytes += \
2386*5113495bSYour Name 			    _srcobj->tx_i[idx].dropped.desc_na_exc_alloc_fail.bytes; \
2387*5113495bSYour Name 			_tgtobj->tx_i.dropped.desc_na_exc_outstand.num += \
2388*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.desc_na_exc_outstand.num; \
2389*5113495bSYour Name 			_tgtobj->tx_i.dropped.desc_na_exc_outstand.bytes += \
2390*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.desc_na_exc_outstand.bytes; \
2391*5113495bSYour Name 			_tgtobj->tx_i.dropped.exc_desc_na.num += \
2392*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.exc_desc_na.num; \
2393*5113495bSYour Name 			_tgtobj->tx_i.dropped.exc_desc_na.bytes += \
2394*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.exc_desc_na.bytes; \
2395*5113495bSYour Name 			_tgtobj->tx_i.dropped.ring_full += \
2396*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.ring_full; \
2397*5113495bSYour Name 			_tgtobj->tx_i.dropped.enqueue_fail += \
2398*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.enqueue_fail; \
2399*5113495bSYour Name 			_tgtobj->tx_i.dropped.dma_error += \
2400*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.dma_error; \
2401*5113495bSYour Name 			_tgtobj->tx_i.dropped.res_full += \
2402*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.res_full; \
2403*5113495bSYour Name 			_tgtobj->tx_i.dropped.headroom_insufficient += \
2404*5113495bSYour Name 			    _srcobj->tx_i[idx].dropped.headroom_insufficient; \
2405*5113495bSYour Name 			_tgtobj->tx_i.dropped.fail_per_pkt_vdev_id_check += \
2406*5113495bSYour Name 			    _srcobj->tx_i[idx].dropped.fail_per_pkt_vdev_id_check; \
2407*5113495bSYour Name 			_tgtobj->tx_i.dropped.drop_ingress += \
2408*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.drop_ingress; \
2409*5113495bSYour Name 			_tgtobj->tx_i.dropped.invalid_peer_id_in_exc_path += \
2410*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.invalid_peer_id_in_exc_path; \
2411*5113495bSYour Name 			_tgtobj->tx_i.dropped.tx_mcast_drop += \
2412*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.tx_mcast_drop; \
2413*5113495bSYour Name 			_tgtobj->tx_i.dropped.fw2wbm_tx_drop += \
2414*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.fw2wbm_tx_drop; \
2415*5113495bSYour Name 			_tgtobj->tx_i.dropped.dropped_pkt.bytes += \
2416*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.dropped_pkt.bytes; \
2417*5113495bSYour Name 			_tgtobj->tx_i.mesh.exception_fw += \
2418*5113495bSYour Name 					_srcobj->tx_i[idx].mesh.exception_fw; \
2419*5113495bSYour Name 			_tgtobj->tx_i.mesh.completion_fw += \
2420*5113495bSYour Name 				_srcobj->tx_i[idx].mesh.completion_fw; \
2421*5113495bSYour Name 			_tgtobj->tx_i.cce_classified += \
2422*5113495bSYour Name 				_srcobj->tx_i[idx].cce_classified; \
2423*5113495bSYour Name 			_tgtobj->tx_i.cce_classified_raw += \
2424*5113495bSYour Name 				_srcobj->tx_i[idx].cce_classified_raw; \
2425*5113495bSYour Name 			_tgtobj->tx_i.sniffer_rcvd.num += \
2426*5113495bSYour Name 				_srcobj->tx_i[idx].sniffer_rcvd.num; \
2427*5113495bSYour Name 			_tgtobj->tx_i.sniffer_rcvd.bytes += \
2428*5113495bSYour Name 				_srcobj->tx_i[idx].sniffer_rcvd.bytes; \
2429*5113495bSYour Name 		} \
2430*5113495bSYour Name 		_tgtobj->tx_i.dropped.dropped_pkt.num = \
2431*5113495bSYour Name 			_tgtobj->tx_i.dropped.dma_error + \
2432*5113495bSYour Name 			_tgtobj->tx_i.dropped.ring_full + \
2433*5113495bSYour Name 			_tgtobj->tx_i.dropped.enqueue_fail + \
2434*5113495bSYour Name 			_tgtobj->tx_i.dropped.fail_per_pkt_vdev_id_check + \
2435*5113495bSYour Name 			_tgtobj->tx_i.dropped.desc_na.num + \
2436*5113495bSYour Name 			_tgtobj->tx_i.dropped.res_full + \
2437*5113495bSYour Name 			_tgtobj->tx_i.dropped.drop_ingress + \
2438*5113495bSYour Name 			_tgtobj->tx_i.dropped.headroom_insufficient + \
2439*5113495bSYour Name 			_tgtobj->tx_i.dropped.invalid_peer_id_in_exc_path + \
2440*5113495bSYour Name 			_tgtobj->tx_i.dropped.tx_mcast_drop + \
2441*5113495bSYour Name 			_tgtobj->tx_i.dropped.fw2wbm_tx_drop; \
2442*5113495bSYour Name 		DP_UPDATE_RX_INGRESS_STATS(_tgtobj, _srcobj); \
2443*5113495bSYour Name 	} while (0)
2444*5113495bSYour Name 
2445*5113495bSYour Name #define DP_UPDATE_MLD_VDEV_INGRESS_STATS(_tgtobj, _srcobj, _xmit_type) \
2446*5113495bSYour Name 	do { \
2447*5113495bSYour Name 		uint8_t i = 0; \
2448*5113495bSYour Name 		uint8_t idx = 0; \
2449*5113495bSYour Name 		enum dp_pkt_xmit_type temp_xmit_type = _xmit_type; \
2450*5113495bSYour Name 		if (temp_xmit_type == DP_XMIT_MLD) { \
2451*5113495bSYour Name 			idx = DP_VDEV_XMIT_TYPE; \
2452*5113495bSYour Name 			temp_xmit_type = DP_VDEV_XMIT_TYPE; \
2453*5113495bSYour Name 		} else if (temp_xmit_type == DP_XMIT_TOTAL) { \
2454*5113495bSYour Name 			temp_xmit_type = DP_VDEV_XMIT_TYPE; \
2455*5113495bSYour Name 		} \
2456*5113495bSYour Name 		for (; idx <= temp_xmit_type; idx++) { \
2457*5113495bSYour Name 			_tgtobj->tx_i[idx].rcvd.num += _srcobj->tx_i[idx].rcvd.num; \
2458*5113495bSYour Name 			_tgtobj->tx_i[idx].rcvd.bytes += \
2459*5113495bSYour Name 				_srcobj->tx_i[idx].rcvd.bytes; \
2460*5113495bSYour Name 			_tgtobj->tx_i[idx].rcvd_in_fast_xmit_flow += \
2461*5113495bSYour Name 				_srcobj->tx_i[idx].rcvd_in_fast_xmit_flow; \
2462*5113495bSYour Name 			for (i = 0; i < CDP_MAX_TX_DATA_RINGS; i++) { \
2463*5113495bSYour Name 				_tgtobj->tx_i[idx].rcvd_per_core[i] += \
2464*5113495bSYour Name 				_srcobj->tx_i[idx].rcvd_per_core[i]; \
2465*5113495bSYour Name 			} \
2466*5113495bSYour Name 			_tgtobj->tx_i[idx].processed.num += \
2467*5113495bSYour Name 				_srcobj->tx_i[idx].processed.num; \
2468*5113495bSYour Name 			_tgtobj->tx_i[idx].processed.bytes += \
2469*5113495bSYour Name 				_srcobj->tx_i[idx].processed.bytes; \
2470*5113495bSYour Name 			_tgtobj->tx_i[idx].reinject_pkts.num += \
2471*5113495bSYour Name 				_srcobj->tx_i[idx].reinject_pkts.num; \
2472*5113495bSYour Name 			_tgtobj->tx_i[idx].reinject_pkts.bytes += \
2473*5113495bSYour Name 				_srcobj->tx_i[idx].reinject_pkts.bytes; \
2474*5113495bSYour Name 			_tgtobj->tx_i[idx].inspect_pkts.num += \
2475*5113495bSYour Name 				_srcobj->tx_i[idx].inspect_pkts.num; \
2476*5113495bSYour Name 			_tgtobj->tx_i[idx].inspect_pkts.bytes += \
2477*5113495bSYour Name 				_srcobj->tx_i[idx].inspect_pkts.bytes; \
2478*5113495bSYour Name 			_tgtobj->tx_i[idx].nawds_mcast.num += \
2479*5113495bSYour Name 				_srcobj->tx_i[idx].nawds_mcast.num; \
2480*5113495bSYour Name 			_tgtobj->tx_i[idx].nawds_mcast.bytes += \
2481*5113495bSYour Name 				_srcobj->tx_i[idx].nawds_mcast.bytes; \
2482*5113495bSYour Name 			_tgtobj->tx_i[idx].bcast.num += \
2483*5113495bSYour Name 				_srcobj->tx_i[idx].bcast.num; \
2484*5113495bSYour Name 			_tgtobj->tx_i[idx].bcast.bytes += \
2485*5113495bSYour Name 				_srcobj->tx_i[idx].bcast.bytes; \
2486*5113495bSYour Name 			_tgtobj->tx_i[idx].raw.raw_pkt.num += \
2487*5113495bSYour Name 				_srcobj->tx_i[idx].raw.raw_pkt.num; \
2488*5113495bSYour Name 			_tgtobj->tx_i[idx].raw.raw_pkt.bytes += \
2489*5113495bSYour Name 				_srcobj->tx_i[idx].raw.raw_pkt.bytes; \
2490*5113495bSYour Name 			_tgtobj->tx_i[idx].raw.dma_map_error += \
2491*5113495bSYour Name 				_srcobj->tx_i[idx].raw.dma_map_error; \
2492*5113495bSYour Name 			_tgtobj->tx_i[idx].raw.invalid_raw_pkt_datatype += \
2493*5113495bSYour Name 			     _srcobj->tx_i[idx].raw.invalid_raw_pkt_datatype; \
2494*5113495bSYour Name 			_tgtobj->tx_i[idx].raw.num_frags_overflow_err += \
2495*5113495bSYour Name 				_srcobj->tx_i[idx].raw.num_frags_overflow_err; \
2496*5113495bSYour Name 			_tgtobj->tx_i[idx].sg.sg_pkt.num += \
2497*5113495bSYour Name 				_srcobj->tx_i[idx].sg.sg_pkt.num; \
2498*5113495bSYour Name 			_tgtobj->tx_i[idx].sg.sg_pkt.bytes += \
2499*5113495bSYour Name 				_srcobj->tx_i[idx].sg.sg_pkt.bytes; \
2500*5113495bSYour Name 			_tgtobj->tx_i[idx].sg.non_sg_pkts.num += \
2501*5113495bSYour Name 				_srcobj->tx_i[idx].sg.non_sg_pkts.num; \
2502*5113495bSYour Name 			_tgtobj->tx_i[idx].sg.non_sg_pkts.bytes += \
2503*5113495bSYour Name 				_srcobj->tx_i[idx].sg.non_sg_pkts.bytes; \
2504*5113495bSYour Name 			_tgtobj->tx_i[idx].sg.dropped_host.num += \
2505*5113495bSYour Name 				_srcobj->tx_i[idx].sg.dropped_host.num; \
2506*5113495bSYour Name 			_tgtobj->tx_i[idx].sg.dropped_host.bytes += \
2507*5113495bSYour Name 				_srcobj->tx_i[idx].sg.dropped_host.bytes; \
2508*5113495bSYour Name 			_tgtobj->tx_i[idx].sg.dropped_target += \
2509*5113495bSYour Name 				_srcobj->tx_i[idx].sg.dropped_target; \
2510*5113495bSYour Name 			_tgtobj->tx_i[idx].sg.dma_map_error += \
2511*5113495bSYour Name 				_srcobj->tx_i[idx].sg.dma_map_error; \
2512*5113495bSYour Name 			_tgtobj->tx_i[idx].mcast_en.mcast_pkt.num += \
2513*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.mcast_pkt.num; \
2514*5113495bSYour Name 			_tgtobj->tx_i[idx].mcast_en.mcast_pkt.bytes += \
2515*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.mcast_pkt.bytes; \
2516*5113495bSYour Name 			_tgtobj->tx_i[idx].mcast_en.dropped_map_error += \
2517*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.dropped_map_error; \
2518*5113495bSYour Name 			_tgtobj->tx_i[idx].mcast_en.dropped_self_mac += \
2519*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.dropped_self_mac; \
2520*5113495bSYour Name 			_tgtobj->tx_i[idx].mcast_en.dropped_send_fail += \
2521*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.dropped_send_fail; \
2522*5113495bSYour Name 			_tgtobj->tx_i[idx].mcast_en.ucast += \
2523*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.ucast; \
2524*5113495bSYour Name 			_tgtobj->tx_i[idx].mcast_en.fail_seg_alloc += \
2525*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.fail_seg_alloc; \
2526*5113495bSYour Name 			_tgtobj->tx_i[idx].mcast_en.clone_fail += \
2527*5113495bSYour Name 				_srcobj->tx_i[idx].mcast_en.clone_fail; \
2528*5113495bSYour Name 			_tgtobj->tx_i[idx].igmp_mcast_en.igmp_rcvd += \
2529*5113495bSYour Name 				_srcobj->tx_i[idx].igmp_mcast_en.igmp_rcvd; \
2530*5113495bSYour Name 			_tgtobj->tx_i[idx].igmp_mcast_en.igmp_ucast_converted += \
2531*5113495bSYour Name 			    _srcobj->tx_i[idx].igmp_mcast_en.igmp_ucast_converted; \
2532*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.desc_na.num += \
2533*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.desc_na.num; \
2534*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.desc_na.bytes += \
2535*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.desc_na.bytes; \
2536*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.desc_na_exc_alloc_fail.num += \
2537*5113495bSYour Name 			_srcobj->tx_i[idx].dropped.desc_na_exc_alloc_fail.num; \
2538*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.desc_na_exc_alloc_fail.bytes += \
2539*5113495bSYour Name 			    _srcobj->tx_i[idx].dropped.desc_na_exc_alloc_fail.bytes; \
2540*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.desc_na_exc_outstand.num += \
2541*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.desc_na_exc_outstand.num; \
2542*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.desc_na_exc_outstand.bytes += \
2543*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.desc_na_exc_outstand.bytes; \
2544*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.exc_desc_na.num += \
2545*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.exc_desc_na.num; \
2546*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.exc_desc_na.bytes += \
2547*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.exc_desc_na.bytes; \
2548*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.ring_full += \
2549*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.ring_full; \
2550*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.enqueue_fail += \
2551*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.enqueue_fail; \
2552*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.dma_error += \
2553*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.dma_error; \
2554*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.res_full += \
2555*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.res_full; \
2556*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.headroom_insufficient += \
2557*5113495bSYour Name 			    _srcobj->tx_i[idx].dropped.headroom_insufficient; \
2558*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.fail_per_pkt_vdev_id_check += \
2559*5113495bSYour Name 			    _srcobj->tx_i[idx].dropped.fail_per_pkt_vdev_id_check; \
2560*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.drop_ingress += \
2561*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.drop_ingress; \
2562*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.invalid_peer_id_in_exc_path += \
2563*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.invalid_peer_id_in_exc_path; \
2564*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.tx_mcast_drop += \
2565*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.tx_mcast_drop; \
2566*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.fw2wbm_tx_drop += \
2567*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.fw2wbm_tx_drop; \
2568*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.dropped_pkt.bytes += \
2569*5113495bSYour Name 				_srcobj->tx_i[idx].dropped.dropped_pkt.bytes; \
2570*5113495bSYour Name 			_tgtobj->tx_i[idx].mesh.exception_fw += \
2571*5113495bSYour Name 					_srcobj->tx_i[idx].mesh.exception_fw; \
2572*5113495bSYour Name 			_tgtobj->tx_i[idx].mesh.completion_fw += \
2573*5113495bSYour Name 				_srcobj->tx_i[idx].mesh.completion_fw; \
2574*5113495bSYour Name 			_tgtobj->tx_i[idx].cce_classified += \
2575*5113495bSYour Name 				_srcobj->tx_i[idx].cce_classified; \
2576*5113495bSYour Name 			_tgtobj->tx_i[idx].cce_classified_raw += \
2577*5113495bSYour Name 				_srcobj->tx_i[idx].cce_classified_raw; \
2578*5113495bSYour Name 			_tgtobj->tx_i[idx].sniffer_rcvd.num += \
2579*5113495bSYour Name 				_srcobj->tx_i[idx].sniffer_rcvd.num; \
2580*5113495bSYour Name 			_tgtobj->tx_i[idx].sniffer_rcvd.bytes += \
2581*5113495bSYour Name 				_srcobj->tx_i[idx].sniffer_rcvd.bytes; \
2582*5113495bSYour Name 			_tgtobj->tx_i[idx].dropped.dropped_pkt.num = \
2583*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.dma_error + \
2584*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.ring_full + \
2585*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.enqueue_fail + \
2586*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.fail_per_pkt_vdev_id_check + \
2587*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.desc_na.num + \
2588*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.res_full + \
2589*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.drop_ingress + \
2590*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.headroom_insufficient + \
2591*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.invalid_peer_id_in_exc_path + \
2592*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.tx_mcast_drop + \
2593*5113495bSYour Name 				_tgtobj->tx_i[idx].dropped.fw2wbm_tx_drop; \
2594*5113495bSYour Name 		} \
2595*5113495bSYour Name 		DP_UPDATE_RX_INGRESS_STATS(_tgtobj, _srcobj); \
2596*5113495bSYour Name 	} while (0)
2597*5113495bSYour Name 
2598*5113495bSYour Name #define DP_UPDATE_TO_MLD_VDEV_STATS(_tgtobj, _srcobj, _xmit_type) \
2599*5113495bSYour Name 	do { \
2600*5113495bSYour Name 		DP_UPDATE_MLD_VDEV_INGRESS_STATS(_tgtobj, _srcobj, _xmit_type); \
2601*5113495bSYour Name 		DP_UPDATE_VDEV_STATS_FOR_UNMAPPED_PEERS(_tgtobj, _srcobj); \
2602*5113495bSYour Name 	} while (0)
2603*5113495bSYour Name 
2604*5113495bSYour Name #define DP_UPDATE_TO_LINK_VDEV_STATS(_tgtobj, _srcobj, _xmit_type) \
2605*5113495bSYour Name 	do { \
2606*5113495bSYour Name 		DP_UPDATE_LINK_VDEV_INGRESS_STATS(_tgtobj, _srcobj, _xmit_type); \
2607*5113495bSYour Name 		DP_UPDATE_VDEV_STATS_FOR_UNMAPPED_PEERS(_tgtobj, _srcobj); \
2608*5113495bSYour Name 	} while (0)
2609*5113495bSYour Name /**
2610*5113495bSYour Name  * dp_peer_find_attach() - Allocates memory for peer objects
2611*5113495bSYour Name  * @soc: SoC handle
2612*5113495bSYour Name  *
2613*5113495bSYour Name  * Return: QDF_STATUS
2614*5113495bSYour Name  */
2615*5113495bSYour Name QDF_STATUS dp_peer_find_attach(struct dp_soc *soc);
2616*5113495bSYour Name 
2617*5113495bSYour Name /**
2618*5113495bSYour Name  * dp_peer_find_detach() - Frees memory for peer objects
2619*5113495bSYour Name  * @soc: SoC handle
2620*5113495bSYour Name  *
2621*5113495bSYour Name  * Return: none
2622*5113495bSYour Name  */
2623*5113495bSYour Name void dp_peer_find_detach(struct dp_soc *soc);
2624*5113495bSYour Name 
2625*5113495bSYour Name /**
2626*5113495bSYour Name  * dp_peer_find_hash_add() - add peer to peer_hash_table
2627*5113495bSYour Name  * @soc: soc handle
2628*5113495bSYour Name  * @peer: peer handle
2629*5113495bSYour Name  *
2630*5113495bSYour Name  * Return: none
2631*5113495bSYour Name  */
2632*5113495bSYour Name void dp_peer_find_hash_add(struct dp_soc *soc, struct dp_peer *peer);
2633*5113495bSYour Name 
2634*5113495bSYour Name /**
2635*5113495bSYour Name  * dp_peer_find_hash_remove() - remove peer from peer_hash_table
2636*5113495bSYour Name  * @soc: soc handle
2637*5113495bSYour Name  * @peer: peer handle
2638*5113495bSYour Name  *
2639*5113495bSYour Name  * Return: none
2640*5113495bSYour Name  */
2641*5113495bSYour Name void dp_peer_find_hash_remove(struct dp_soc *soc, struct dp_peer *peer);
2642*5113495bSYour Name 
2643*5113495bSYour Name /* unused?? */
2644*5113495bSYour Name void dp_peer_find_hash_erase(struct dp_soc *soc);
2645*5113495bSYour Name 
2646*5113495bSYour Name /**
2647*5113495bSYour Name  * dp_peer_vdev_list_add() - add peer into vdev's peer list
2648*5113495bSYour Name  * @soc: soc handle
2649*5113495bSYour Name  * @vdev: vdev handle
2650*5113495bSYour Name  * @peer: peer handle
2651*5113495bSYour Name  *
2652*5113495bSYour Name  * Return: none
2653*5113495bSYour Name  */
2654*5113495bSYour Name void dp_peer_vdev_list_add(struct dp_soc *soc, struct dp_vdev *vdev,
2655*5113495bSYour Name 			   struct dp_peer *peer);
2656*5113495bSYour Name 
2657*5113495bSYour Name /**
2658*5113495bSYour Name  * dp_peer_vdev_list_remove() - remove peer from vdev's peer list
2659*5113495bSYour Name  * @soc: SoC handle
2660*5113495bSYour Name  * @vdev: VDEV handle
2661*5113495bSYour Name  * @peer: peer handle
2662*5113495bSYour Name  *
2663*5113495bSYour Name  * Return: none
2664*5113495bSYour Name  */
2665*5113495bSYour Name void dp_peer_vdev_list_remove(struct dp_soc *soc, struct dp_vdev *vdev,
2666*5113495bSYour Name 			      struct dp_peer *peer);
2667*5113495bSYour Name 
2668*5113495bSYour Name /**
2669*5113495bSYour Name  * dp_peer_find_id_to_obj_add() - Add peer into peer_id table
2670*5113495bSYour Name  * @soc: SoC handle
2671*5113495bSYour Name  * @peer: peer handle
2672*5113495bSYour Name  * @peer_id: peer_id
2673*5113495bSYour Name  *
2674*5113495bSYour Name  * Return: None
2675*5113495bSYour Name  */
2676*5113495bSYour Name void dp_peer_find_id_to_obj_add(struct dp_soc *soc,
2677*5113495bSYour Name 				struct dp_peer *peer,
2678*5113495bSYour Name 				uint16_t peer_id);
2679*5113495bSYour Name 
2680*5113495bSYour Name /**
2681*5113495bSYour Name  * dp_txrx_peer_attach_add() - Attach txrx_peer and add it to peer_id table
2682*5113495bSYour Name  * @soc: SoC handle
2683*5113495bSYour Name  * @peer: peer handle
2684*5113495bSYour Name  * @txrx_peer: txrx peer handle
2685*5113495bSYour Name  *
2686*5113495bSYour Name  * Return: None
2687*5113495bSYour Name  */
2688*5113495bSYour Name void dp_txrx_peer_attach_add(struct dp_soc *soc,
2689*5113495bSYour Name 			     struct dp_peer *peer,
2690*5113495bSYour Name 			     struct dp_txrx_peer *txrx_peer);
2691*5113495bSYour Name 
2692*5113495bSYour Name /**
2693*5113495bSYour Name  * dp_peer_find_id_to_obj_remove() - remove peer from peer_id table
2694*5113495bSYour Name  * @soc: SoC handle
2695*5113495bSYour Name  * @peer_id: peer_id
2696*5113495bSYour Name  *
2697*5113495bSYour Name  * Return: None
2698*5113495bSYour Name  */
2699*5113495bSYour Name void dp_peer_find_id_to_obj_remove(struct dp_soc *soc,
2700*5113495bSYour Name 				   uint16_t peer_id);
2701*5113495bSYour Name 
2702*5113495bSYour Name /**
2703*5113495bSYour Name  * dp_vdev_unref_delete() - check and process vdev delete
2704*5113495bSYour Name  * @soc: DP specific soc pointer
2705*5113495bSYour Name  * @vdev: DP specific vdev pointer
2706*5113495bSYour Name  * @mod_id: module id
2707*5113495bSYour Name  *
2708*5113495bSYour Name  */
2709*5113495bSYour Name void dp_vdev_unref_delete(struct dp_soc *soc, struct dp_vdev *vdev,
2710*5113495bSYour Name 			  enum dp_mod_id mod_id);
2711*5113495bSYour Name 
2712*5113495bSYour Name /**
2713*5113495bSYour Name  * dp_peer_ppdu_delayed_ba_cleanup() - free ppdu allocated in peer
2714*5113495bSYour Name  * @peer: Datapath peer
2715*5113495bSYour Name  *
2716*5113495bSYour Name  * Return: void
2717*5113495bSYour Name  */
2718*5113495bSYour Name void dp_peer_ppdu_delayed_ba_cleanup(struct dp_peer *peer);
2719*5113495bSYour Name 
2720*5113495bSYour Name /**
2721*5113495bSYour Name  * dp_peer_rx_init() - Initialize receive TID state
2722*5113495bSYour Name  * @pdev: Datapath pdev
2723*5113495bSYour Name  * @peer: Datapath peer
2724*5113495bSYour Name  *
2725*5113495bSYour Name  */
2726*5113495bSYour Name void dp_peer_rx_init(struct dp_pdev *pdev, struct dp_peer *peer);
2727*5113495bSYour Name 
2728*5113495bSYour Name /**
2729*5113495bSYour Name  * dp_peer_rx_init_wrapper() - Initialize receive TID state, based on peer type
2730*5113495bSYour Name  * @pdev: Datapath pdev
2731*5113495bSYour Name  * @peer: Datapath peer
2732*5113495bSYour Name  * @setup_info: setup info received for setting up the peer
2733*5113495bSYour Name  *
2734*5113495bSYour Name  * Return: None
2735*5113495bSYour Name  */
2736*5113495bSYour Name void dp_peer_rx_init_wrapper(struct dp_pdev *pdev, struct dp_peer *peer,
2737*5113495bSYour Name 			     struct cdp_peer_setup_info *setup_info);
2738*5113495bSYour Name 
2739*5113495bSYour Name /**
2740*5113495bSYour Name  * dp_peer_cleanup() - Cleanup peer information
2741*5113495bSYour Name  * @vdev: Datapath vdev
2742*5113495bSYour Name  * @peer: Datapath peer
2743*5113495bSYour Name  *
2744*5113495bSYour Name  */
2745*5113495bSYour Name void dp_peer_cleanup(struct dp_vdev *vdev, struct dp_peer *peer);
2746*5113495bSYour Name 
2747*5113495bSYour Name #ifdef DP_PEER_EXTENDED_API
2748*5113495bSYour Name /**
2749*5113495bSYour Name  * dp_register_peer() - Register peer into physical device
2750*5113495bSYour Name  * @soc_hdl: data path soc handle
2751*5113495bSYour Name  * @pdev_id: device instance id
2752*5113495bSYour Name  * @sta_desc: peer description
2753*5113495bSYour Name  *
2754*5113495bSYour Name  * Register peer into physical device
2755*5113495bSYour Name  *
2756*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS registration success
2757*5113495bSYour Name  *         QDF_STATUS_E_FAULT peer not found
2758*5113495bSYour Name  */
2759*5113495bSYour Name QDF_STATUS dp_register_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
2760*5113495bSYour Name 			    struct ol_txrx_desc_type *sta_desc);
2761*5113495bSYour Name 
2762*5113495bSYour Name /**
2763*5113495bSYour Name  * dp_clear_peer() - remove peer from physical device
2764*5113495bSYour Name  * @soc_hdl: data path soc handle
2765*5113495bSYour Name  * @pdev_id: device instance id
2766*5113495bSYour Name  * @peer_addr: peer mac address
2767*5113495bSYour Name  *
2768*5113495bSYour Name  * remove peer from physical device
2769*5113495bSYour Name  *
2770*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS registration success
2771*5113495bSYour Name  *         QDF_STATUS_E_FAULT peer not found
2772*5113495bSYour Name  */
2773*5113495bSYour Name QDF_STATUS dp_clear_peer(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
2774*5113495bSYour Name 			 struct qdf_mac_addr peer_addr);
2775*5113495bSYour Name 
2776*5113495bSYour Name /**
2777*5113495bSYour Name  * dp_find_peer_exist_on_vdev - find if peer exists on the given vdev
2778*5113495bSYour Name  * @soc_hdl: datapath soc handle
2779*5113495bSYour Name  * @vdev_id: vdev instance id
2780*5113495bSYour Name  * @peer_addr: peer mac address
2781*5113495bSYour Name  *
2782*5113495bSYour Name  * Return: true or false
2783*5113495bSYour Name  */
2784*5113495bSYour Name bool dp_find_peer_exist_on_vdev(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
2785*5113495bSYour Name 				uint8_t *peer_addr);
2786*5113495bSYour Name 
2787*5113495bSYour Name /**
2788*5113495bSYour Name  * dp_find_peer_exist_on_other_vdev - find if peer exists
2789*5113495bSYour Name  * on other than the given vdev
2790*5113495bSYour Name  * @soc_hdl: datapath soc handle
2791*5113495bSYour Name  * @vdev_id: vdev instance id
2792*5113495bSYour Name  * @peer_addr: peer mac address
2793*5113495bSYour Name  * @max_bssid: max number of bssids
2794*5113495bSYour Name  *
2795*5113495bSYour Name  * Return: true or false
2796*5113495bSYour Name  */
2797*5113495bSYour Name bool dp_find_peer_exist_on_other_vdev(struct cdp_soc_t *soc_hdl,
2798*5113495bSYour Name 				      uint8_t vdev_id, uint8_t *peer_addr,
2799*5113495bSYour Name 				      uint16_t max_bssid);
2800*5113495bSYour Name 
2801*5113495bSYour Name /**
2802*5113495bSYour Name  * dp_peer_state_update() - update peer local state
2803*5113495bSYour Name  * @soc: datapath soc handle
2804*5113495bSYour Name  * @peer_mac: peer mac address
2805*5113495bSYour Name  * @state: new peer local state
2806*5113495bSYour Name  *
2807*5113495bSYour Name  * update peer local state
2808*5113495bSYour Name  *
2809*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS registration success
2810*5113495bSYour Name  */
2811*5113495bSYour Name QDF_STATUS dp_peer_state_update(struct cdp_soc_t *soc, uint8_t *peer_mac,
2812*5113495bSYour Name 				enum ol_txrx_peer_state state);
2813*5113495bSYour Name 
2814*5113495bSYour Name /**
2815*5113495bSYour Name  * dp_get_vdevid() - Get virtual interface id which peer registered
2816*5113495bSYour Name  * @soc_hdl: datapath soc handle
2817*5113495bSYour Name  * @peer_mac: peer mac address
2818*5113495bSYour Name  * @vdev_id: virtual interface id which peer registered
2819*5113495bSYour Name  *
2820*5113495bSYour Name  * Get virtual interface id which peer registered
2821*5113495bSYour Name  *
2822*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS registration success
2823*5113495bSYour Name  */
2824*5113495bSYour Name QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
2825*5113495bSYour Name 			 uint8_t *vdev_id);
2826*5113495bSYour Name 
2827*5113495bSYour Name struct cdp_vdev *dp_get_vdev_by_peer_addr(struct cdp_pdev *pdev_handle,
2828*5113495bSYour Name 		struct qdf_mac_addr peer_addr);
2829*5113495bSYour Name 
2830*5113495bSYour Name /**
2831*5113495bSYour Name  * dp_get_vdev_for_peer() - Get virtual interface instance which peer belongs
2832*5113495bSYour Name  * @peer: peer instance
2833*5113495bSYour Name  *
2834*5113495bSYour Name  * Get virtual interface instance which peer belongs
2835*5113495bSYour Name  *
2836*5113495bSYour Name  * Return: virtual interface instance pointer
2837*5113495bSYour Name  *         NULL in case cannot find
2838*5113495bSYour Name  */
2839*5113495bSYour Name struct cdp_vdev *dp_get_vdev_for_peer(void *peer);
2840*5113495bSYour Name 
2841*5113495bSYour Name /**
2842*5113495bSYour Name  * dp_peer_get_peer_mac_addr() - Get peer mac address
2843*5113495bSYour Name  * @peer: peer instance
2844*5113495bSYour Name  *
2845*5113495bSYour Name  * Get peer mac address
2846*5113495bSYour Name  *
2847*5113495bSYour Name  * Return: peer mac address pointer
2848*5113495bSYour Name  *         NULL in case cannot find
2849*5113495bSYour Name  */
2850*5113495bSYour Name uint8_t *dp_peer_get_peer_mac_addr(void *peer);
2851*5113495bSYour Name 
2852*5113495bSYour Name /**
2853*5113495bSYour Name  * dp_get_peer_state() - Get local peer state
2854*5113495bSYour Name  * @soc: datapath soc handle
2855*5113495bSYour Name  * @vdev_id: vdev id
2856*5113495bSYour Name  * @peer_mac: peer mac addr
2857*5113495bSYour Name  * @slowpath: call from slowpath or not
2858*5113495bSYour Name  *
2859*5113495bSYour Name  * Get local peer state
2860*5113495bSYour Name  *
2861*5113495bSYour Name  * Return: peer status
2862*5113495bSYour Name  */
2863*5113495bSYour Name int dp_get_peer_state(struct cdp_soc_t *soc, uint8_t vdev_id,
2864*5113495bSYour Name 		      uint8_t *peer_mac, bool slowpath);
2865*5113495bSYour Name 
2866*5113495bSYour Name /**
2867*5113495bSYour Name  * dp_local_peer_id_pool_init() - local peer id pool alloc for physical device
2868*5113495bSYour Name  * @pdev: data path device instance
2869*5113495bSYour Name  *
2870*5113495bSYour Name  * local peer id pool alloc for physical device
2871*5113495bSYour Name  *
2872*5113495bSYour Name  * Return: none
2873*5113495bSYour Name  */
2874*5113495bSYour Name void dp_local_peer_id_pool_init(struct dp_pdev *pdev);
2875*5113495bSYour Name 
2876*5113495bSYour Name /**
2877*5113495bSYour Name  * dp_local_peer_id_alloc() - allocate local peer id
2878*5113495bSYour Name  * @pdev: data path device instance
2879*5113495bSYour Name  * @peer: new peer instance
2880*5113495bSYour Name  *
2881*5113495bSYour Name  * allocate local peer id
2882*5113495bSYour Name  *
2883*5113495bSYour Name  * Return: none
2884*5113495bSYour Name  */
2885*5113495bSYour Name void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer);
2886*5113495bSYour Name 
2887*5113495bSYour Name /**
2888*5113495bSYour Name  * dp_local_peer_id_free() - remove local peer id
2889*5113495bSYour Name  * @pdev: data path device instance
2890*5113495bSYour Name  * @peer: peer instance should be removed
2891*5113495bSYour Name  *
2892*5113495bSYour Name  * remove local peer id
2893*5113495bSYour Name  *
2894*5113495bSYour Name  * Return: none
2895*5113495bSYour Name  */
2896*5113495bSYour Name void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer);
2897*5113495bSYour Name 
2898*5113495bSYour Name /**
2899*5113495bSYour Name  * dp_set_peer_as_tdls_peer() - set tdls peer flag to peer
2900*5113495bSYour Name  * @soc_hdl: datapath soc handle
2901*5113495bSYour Name  * @vdev_id: vdev_id
2902*5113495bSYour Name  * @peer_mac: peer mac addr
2903*5113495bSYour Name  * @val: tdls peer flag
2904*5113495bSYour Name  *
2905*5113495bSYour Name  * Return: none
2906*5113495bSYour Name  */
2907*5113495bSYour Name void dp_set_peer_as_tdls_peer(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
2908*5113495bSYour Name 			      uint8_t *peer_mac, bool val);
2909*5113495bSYour Name #else
2910*5113495bSYour Name static inline
dp_get_vdevid(struct cdp_soc_t * soc_hdl,uint8_t * peer_mac,uint8_t * vdev_id)2911*5113495bSYour Name QDF_STATUS dp_get_vdevid(struct cdp_soc_t *soc_hdl, uint8_t *peer_mac,
2912*5113495bSYour Name 			 uint8_t *vdev_id)
2913*5113495bSYour Name {
2914*5113495bSYour Name 	return QDF_STATUS_E_NOSUPPORT;
2915*5113495bSYour Name }
2916*5113495bSYour Name 
dp_local_peer_id_pool_init(struct dp_pdev * pdev)2917*5113495bSYour Name static inline void dp_local_peer_id_pool_init(struct dp_pdev *pdev)
2918*5113495bSYour Name {
2919*5113495bSYour Name }
2920*5113495bSYour Name 
2921*5113495bSYour Name static inline
dp_local_peer_id_alloc(struct dp_pdev * pdev,struct dp_peer * peer)2922*5113495bSYour Name void dp_local_peer_id_alloc(struct dp_pdev *pdev, struct dp_peer *peer)
2923*5113495bSYour Name {
2924*5113495bSYour Name }
2925*5113495bSYour Name 
2926*5113495bSYour Name static inline
dp_local_peer_id_free(struct dp_pdev * pdev,struct dp_peer * peer)2927*5113495bSYour Name void dp_local_peer_id_free(struct dp_pdev *pdev, struct dp_peer *peer)
2928*5113495bSYour Name {
2929*5113495bSYour Name }
2930*5113495bSYour Name 
2931*5113495bSYour Name static inline
dp_set_peer_as_tdls_peer(struct cdp_soc_t * soc_hdl,uint8_t vdev_id,uint8_t * peer_mac,bool val)2932*5113495bSYour Name void dp_set_peer_as_tdls_peer(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
2933*5113495bSYour Name 			      uint8_t *peer_mac, bool val)
2934*5113495bSYour Name {
2935*5113495bSYour Name }
2936*5113495bSYour Name #endif
2937*5113495bSYour Name 
2938*5113495bSYour Name /**
2939*5113495bSYour Name  * dp_find_peer_exist - find peer if already exists
2940*5113495bSYour Name  * @soc_hdl: datapath soc handle
2941*5113495bSYour Name  * @pdev_id: physical device instance id
2942*5113495bSYour Name  * @peer_addr: peer mac address
2943*5113495bSYour Name  *
2944*5113495bSYour Name  * Return: true or false
2945*5113495bSYour Name  */
2946*5113495bSYour Name bool dp_find_peer_exist(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
2947*5113495bSYour Name 			uint8_t *peer_addr);
2948*5113495bSYour Name 
2949*5113495bSYour Name #ifdef DP_UMAC_HW_RESET_SUPPORT
2950*5113495bSYour Name /**
2951*5113495bSYour Name  * dp_pause_reo_send_cmd() - Pause Reo send commands.
2952*5113495bSYour Name  * @soc: dp soc
2953*5113495bSYour Name  *
2954*5113495bSYour Name  * Return: none
2955*5113495bSYour Name  */
2956*5113495bSYour Name void dp_pause_reo_send_cmd(struct dp_soc *soc);
2957*5113495bSYour Name 
2958*5113495bSYour Name /**
2959*5113495bSYour Name  * dp_resume_reo_send_cmd() - Resume Reo send commands.
2960*5113495bSYour Name  * @soc: dp soc
2961*5113495bSYour Name  *
2962*5113495bSYour Name  * Return: none
2963*5113495bSYour Name  */
2964*5113495bSYour Name void dp_resume_reo_send_cmd(struct dp_soc *soc);
2965*5113495bSYour Name 
2966*5113495bSYour Name /**
2967*5113495bSYour Name  * dp_cleanup_reo_cmd_module - Clean up the reo cmd module
2968*5113495bSYour Name  * @soc: DP SoC handle
2969*5113495bSYour Name  *
2970*5113495bSYour Name  * Return: none
2971*5113495bSYour Name  */
2972*5113495bSYour Name void dp_cleanup_reo_cmd_module(struct dp_soc *soc);
2973*5113495bSYour Name 
2974*5113495bSYour Name /**
2975*5113495bSYour Name  * dp_reo_desc_freelist_destroy() - Flush REO descriptors from deferred freelist
2976*5113495bSYour Name  * @soc: DP SOC handle
2977*5113495bSYour Name  *
2978*5113495bSYour Name  * Return: none
2979*5113495bSYour Name  */
2980*5113495bSYour Name void dp_reo_desc_freelist_destroy(struct dp_soc *soc);
2981*5113495bSYour Name 
2982*5113495bSYour Name /**
2983*5113495bSYour Name  * dp_reset_rx_reo_tid_queue() - Reset the reo tid queues
2984*5113495bSYour Name  * @soc: dp soc
2985*5113495bSYour Name  * @hw_qdesc_vaddr: starting address of the tid queues
2986*5113495bSYour Name  * @size: size of the memory pointed to by hw_qdesc_vaddr
2987*5113495bSYour Name  *
2988*5113495bSYour Name  * Return: none
2989*5113495bSYour Name  */
2990*5113495bSYour Name void dp_reset_rx_reo_tid_queue(struct dp_soc *soc, void *hw_qdesc_vaddr,
2991*5113495bSYour Name 			       uint32_t size);
2992*5113495bSYour Name 
2993*5113495bSYour Name 
dp_umac_reset_trigger_pre_reset_notify_cb(struct dp_soc * soc)2994*5113495bSYour Name static inline void dp_umac_reset_trigger_pre_reset_notify_cb(struct dp_soc *soc)
2995*5113495bSYour Name {
2996*5113495bSYour Name 	notify_pre_reset_fw_callback callback = soc->notify_fw_callback;
2997*5113495bSYour Name 
2998*5113495bSYour Name 	if (callback)
2999*5113495bSYour Name 		callback(soc);
3000*5113495bSYour Name }
3001*5113495bSYour Name 
3002*5113495bSYour Name /**
3003*5113495bSYour Name  * dp_reset_global_tx_desc_cleanup_flag() - Reset cleanup needed flag
3004*5113495bSYour Name  * @soc: dp soc handle
3005*5113495bSYour Name  *
3006*5113495bSYour Name  * Return: None
3007*5113495bSYour Name  */
3008*5113495bSYour Name void dp_reset_global_tx_desc_cleanup_flag(struct dp_soc *soc);
3009*5113495bSYour Name 
3010*5113495bSYour Name /**
3011*5113495bSYour Name  * dp_get_global_tx_desc_cleanup_flag() - Get cleanup needed flag
3012*5113495bSYour Name  * @soc: dp soc handle
3013*5113495bSYour Name  *
3014*5113495bSYour Name  * Return: cleanup needed/ not needed
3015*5113495bSYour Name  */
3016*5113495bSYour Name bool dp_get_global_tx_desc_cleanup_flag(struct dp_soc *soc);
3017*5113495bSYour Name 
3018*5113495bSYour Name 
3019*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
3020*5113495bSYour Name /**
3021*5113495bSYour Name  * dp_umac_reset_complete_umac_recovery() - Complete Umac reset session
3022*5113495bSYour Name  * @soc: dp soc handle
3023*5113495bSYour Name  *
3024*5113495bSYour Name  * Return: void
3025*5113495bSYour Name  */
3026*5113495bSYour Name void dp_umac_reset_complete_umac_recovery(struct dp_soc *soc);
3027*5113495bSYour Name 
3028*5113495bSYour Name /**
3029*5113495bSYour Name  * dp_umac_reset_initiate_umac_recovery() - Initiate Umac reset session
3030*5113495bSYour Name  * @soc: dp soc handle
3031*5113495bSYour Name  * @umac_reset_ctx: Umac reset context
3032*5113495bSYour Name  * @rx_event: Rx event received
3033*5113495bSYour Name  * @is_target_recovery: Flag to indicate if it is triggered for target recovery
3034*5113495bSYour Name  *
3035*5113495bSYour Name  * Return: status
3036*5113495bSYour Name  */
3037*5113495bSYour Name QDF_STATUS dp_umac_reset_initiate_umac_recovery(struct dp_soc *soc,
3038*5113495bSYour Name 				struct dp_soc_umac_reset_ctx *umac_reset_ctx,
3039*5113495bSYour Name 				enum umac_reset_rx_event rx_event,
3040*5113495bSYour Name 				bool is_target_recovery);
3041*5113495bSYour Name 
3042*5113495bSYour Name /**
3043*5113495bSYour Name  * dp_umac_reset_handle_action_cb() - Function to call action callback
3044*5113495bSYour Name  * @soc: dp soc handle
3045*5113495bSYour Name  * @umac_reset_ctx: Umac reset context
3046*5113495bSYour Name  * @action: Action to call the callback for
3047*5113495bSYour Name  *
3048*5113495bSYour Name  * Return: QDF_STATUS status
3049*5113495bSYour Name  */
3050*5113495bSYour Name QDF_STATUS dp_umac_reset_handle_action_cb(struct dp_soc *soc,
3051*5113495bSYour Name 				struct dp_soc_umac_reset_ctx *umac_reset_ctx,
3052*5113495bSYour Name 				enum umac_reset_action action);
3053*5113495bSYour Name 
3054*5113495bSYour Name /**
3055*5113495bSYour Name  * dp_umac_reset_post_tx_cmd() - Iterate partner socs and post Tx command
3056*5113495bSYour Name  * @umac_reset_ctx: UMAC reset context
3057*5113495bSYour Name  * @tx_cmd: Tx command to be posted
3058*5113495bSYour Name  *
3059*5113495bSYour Name  * Return: QDF status of operation
3060*5113495bSYour Name  */
3061*5113495bSYour Name QDF_STATUS
3062*5113495bSYour Name dp_umac_reset_post_tx_cmd(struct dp_soc_umac_reset_ctx *umac_reset_ctx,
3063*5113495bSYour Name 			  enum umac_reset_tx_cmd tx_cmd);
3064*5113495bSYour Name 
3065*5113495bSYour Name /**
3066*5113495bSYour Name  * dp_umac_reset_initiator_check() - Check if soc is the Umac reset initiator
3067*5113495bSYour Name  * @soc: dp soc handle
3068*5113495bSYour Name  *
3069*5113495bSYour Name  * Return: true if the soc is initiator or false otherwise
3070*5113495bSYour Name  */
3071*5113495bSYour Name bool dp_umac_reset_initiator_check(struct dp_soc *soc);
3072*5113495bSYour Name 
3073*5113495bSYour Name /**
3074*5113495bSYour Name  * dp_umac_reset_target_recovery_check() - Check if this is for target recovery
3075*5113495bSYour Name  * @soc: dp soc handle
3076*5113495bSYour Name  *
3077*5113495bSYour Name  * Return: true if the session is for target recovery or false otherwise
3078*5113495bSYour Name  */
3079*5113495bSYour Name bool dp_umac_reset_target_recovery_check(struct dp_soc *soc);
3080*5113495bSYour Name 
3081*5113495bSYour Name /**
3082*5113495bSYour Name  * dp_umac_reset_is_soc_ignored() - Check if this soc is to be ignored
3083*5113495bSYour Name  * @soc: dp soc handle
3084*5113495bSYour Name  *
3085*5113495bSYour Name  * Return: true if the soc is ignored or false otherwise
3086*5113495bSYour Name  */
3087*5113495bSYour Name bool dp_umac_reset_is_soc_ignored(struct dp_soc *soc);
3088*5113495bSYour Name 
3089*5113495bSYour Name /**
3090*5113495bSYour Name  * dp_mlo_umac_reset_stats_print() - API to print MLO umac reset stats
3091*5113495bSYour Name  * @soc: dp soc handle
3092*5113495bSYour Name  *
3093*5113495bSYour Name  * Return: QDF_STATUS
3094*5113495bSYour Name  */
3095*5113495bSYour Name QDF_STATUS dp_mlo_umac_reset_stats_print(struct dp_soc *soc);
3096*5113495bSYour Name #else
3097*5113495bSYour Name static inline
dp_mlo_umac_reset_stats_print(struct dp_soc * soc)3098*5113495bSYour Name QDF_STATUS dp_mlo_umac_reset_stats_print(struct dp_soc *soc)
3099*5113495bSYour Name {
3100*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3101*5113495bSYour Name }
3102*5113495bSYour Name #endif
3103*5113495bSYour Name #else
dp_umac_reset_trigger_pre_reset_notify_cb(struct dp_soc * soc)3104*5113495bSYour Name static inline void dp_umac_reset_trigger_pre_reset_notify_cb(struct dp_soc *soc)
3105*5113495bSYour Name {
3106*5113495bSYour Name }
3107*5113495bSYour Name #endif
3108*5113495bSYour Name 
3109*5113495bSYour Name #if defined(DP_UMAC_HW_RESET_SUPPORT) && defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MLO_MULTI_CHIP)
3110*5113495bSYour Name /**
3111*5113495bSYour Name  * dp_umac_reset_notify_asserted_soc() - API to notify the asserted SOC
3112*5113495bSYour Name  * @soc: dp soc
3113*5113495bSYour Name  *
3114*5113495bSYour Name  * Return: QDF_STATUS
3115*5113495bSYour Name  */
3116*5113495bSYour Name QDF_STATUS dp_umac_reset_notify_asserted_soc(struct dp_soc *soc);
3117*5113495bSYour Name 
3118*5113495bSYour Name /**
3119*5113495bSYour Name  * dp_get_umac_reset_in_progress_state() - API to check umac reset in progress
3120*5113495bSYour Name  * state
3121*5113495bSYour Name  * @psoc: dp soc handle
3122*5113495bSYour Name  *
3123*5113495bSYour Name  * Return: umac reset state
3124*5113495bSYour Name  */
3125*5113495bSYour Name enum cdp_umac_reset_state
3126*5113495bSYour Name dp_get_umac_reset_in_progress_state(struct cdp_soc_t *psoc);
3127*5113495bSYour Name #else
3128*5113495bSYour Name static inline
dp_umac_reset_notify_asserted_soc(struct dp_soc * soc)3129*5113495bSYour Name QDF_STATUS dp_umac_reset_notify_asserted_soc(struct dp_soc *soc)
3130*5113495bSYour Name {
3131*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
3132*5113495bSYour Name }
3133*5113495bSYour Name 
3134*5113495bSYour Name static inline enum cdp_umac_reset_state
dp_get_umac_reset_in_progress_state(struct cdp_soc_t * psoc)3135*5113495bSYour Name dp_get_umac_reset_in_progress_state(struct cdp_soc_t *psoc)
3136*5113495bSYour Name {
3137*5113495bSYour Name 	return CDP_UMAC_RESET_NOT_IN_PROGRESS;
3138*5113495bSYour Name }
3139*5113495bSYour Name #endif
3140*5113495bSYour Name 
3141*5113495bSYour Name #ifndef WLAN_SOFTUMAC_SUPPORT
3142*5113495bSYour Name QDF_STATUS dp_reo_send_cmd(struct dp_soc *soc, enum hal_reo_cmd_type type,
3143*5113495bSYour Name 			   struct hal_reo_cmd_params *params,
3144*5113495bSYour Name 			   void (*callback_fn), void *data);
3145*5113495bSYour Name 
3146*5113495bSYour Name /**
3147*5113495bSYour Name  * dp_reo_cmdlist_destroy() - Free REO commands in the queue
3148*5113495bSYour Name  * @soc: DP SoC handle
3149*5113495bSYour Name  *
3150*5113495bSYour Name  * Return: none
3151*5113495bSYour Name  */
3152*5113495bSYour Name void dp_reo_cmdlist_destroy(struct dp_soc *soc);
3153*5113495bSYour Name 
3154*5113495bSYour Name /**
3155*5113495bSYour Name  * dp_reo_status_ring_handler() - Handler for REO Status ring
3156*5113495bSYour Name  * @int_ctx: pointer to DP interrupt context
3157*5113495bSYour Name  * @soc: DP Soc handle
3158*5113495bSYour Name  *
3159*5113495bSYour Name  * Return: Number of descriptors reaped
3160*5113495bSYour Name  */
3161*5113495bSYour Name uint32_t dp_reo_status_ring_handler(struct dp_intr *int_ctx,
3162*5113495bSYour Name 				    struct dp_soc *soc);
3163*5113495bSYour Name #endif
3164*5113495bSYour Name 
3165*5113495bSYour Name /**
3166*5113495bSYour Name  * dp_aggregate_vdev_stats() - Consolidate stats at VDEV level
3167*5113495bSYour Name  * @vdev: DP VDEV handle
3168*5113495bSYour Name  * @vdev_stats: aggregate statistics
3169*5113495bSYour Name  * @xmit_type: xmit type of packet - MLD/Link
3170*5113495bSYour Name  * return: void
3171*5113495bSYour Name  */
3172*5113495bSYour Name void dp_aggregate_vdev_stats(struct dp_vdev *vdev,
3173*5113495bSYour Name 			     struct cdp_vdev_stats *vdev_stats,
3174*5113495bSYour Name 			     enum dp_pkt_xmit_type xmit_type);
3175*5113495bSYour Name 
3176*5113495bSYour Name /**
3177*5113495bSYour Name  * dp_txrx_get_vdev_stats() - Update buffer with cdp_vdev_stats
3178*5113495bSYour Name  * @soc_hdl: CDP SoC handle
3179*5113495bSYour Name  * @vdev_id: vdev Id
3180*5113495bSYour Name  * @buf: buffer for vdev stats
3181*5113495bSYour Name  * @is_aggregate: are aggregate stats being collected
3182*5113495bSYour Name  *
3183*5113495bSYour Name  * Return: QDF_STATUS
3184*5113495bSYour Name  */
3185*5113495bSYour Name QDF_STATUS
3186*5113495bSYour Name dp_txrx_get_vdev_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
3187*5113495bSYour Name 		       void *buf, bool is_aggregate);
3188*5113495bSYour Name 
3189*5113495bSYour Name /**
3190*5113495bSYour Name  * dp_rx_bar_stats_cb() - BAR received stats callback
3191*5113495bSYour Name  * @soc: SOC handle
3192*5113495bSYour Name  * @cb_ctxt: Call back context
3193*5113495bSYour Name  * @reo_status: Reo status
3194*5113495bSYour Name  *
3195*5113495bSYour Name  * Return: void
3196*5113495bSYour Name  */
3197*5113495bSYour Name void dp_rx_bar_stats_cb(struct dp_soc *soc, void *cb_ctxt,
3198*5113495bSYour Name 			union hal_reo_status *reo_status);
3199*5113495bSYour Name 
3200*5113495bSYour Name uint16_t dp_tx_me_send_convert_ucast(struct cdp_soc_t *soc, uint8_t vdev_id,
3201*5113495bSYour Name 				     qdf_nbuf_t nbuf,
3202*5113495bSYour Name 				     uint8_t newmac[][QDF_MAC_ADDR_SIZE],
3203*5113495bSYour Name 				     uint8_t new_mac_cnt, uint8_t tid,
3204*5113495bSYour Name 				     bool is_igmp, bool is_dms_pkt);
3205*5113495bSYour Name void dp_tx_me_alloc_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
3206*5113495bSYour Name 
3207*5113495bSYour Name void dp_tx_me_free_descriptor(struct cdp_soc_t *soc, uint8_t pdev_id);
3208*5113495bSYour Name 
3209*5113495bSYour Name /**
3210*5113495bSYour Name  * dp_h2t_ext_stats_msg_send(): function to construct HTT message to pass to FW
3211*5113495bSYour Name  * @pdev: DP PDEV handle
3212*5113495bSYour Name  * @stats_type_upload_mask: stats type requested by user
3213*5113495bSYour Name  * @config_param_0: extra configuration parameters
3214*5113495bSYour Name  * @config_param_1: extra configuration parameters
3215*5113495bSYour Name  * @config_param_2: extra configuration parameters
3216*5113495bSYour Name  * @config_param_3: extra configuration parameters
3217*5113495bSYour Name  * @cookie:
3218*5113495bSYour Name  * @cookie_msb:
3219*5113495bSYour Name  * @mac_id: mac number
3220*5113495bSYour Name  *
3221*5113495bSYour Name  * Return: QDF STATUS
3222*5113495bSYour Name  */
3223*5113495bSYour Name QDF_STATUS dp_h2t_ext_stats_msg_send(struct dp_pdev *pdev,
3224*5113495bSYour Name 		uint32_t stats_type_upload_mask, uint32_t config_param_0,
3225*5113495bSYour Name 		uint32_t config_param_1, uint32_t config_param_2,
3226*5113495bSYour Name 		uint32_t config_param_3, int cookie, int cookie_msb,
3227*5113495bSYour Name 		uint8_t mac_id);
3228*5113495bSYour Name 
3229*5113495bSYour Name /**
3230*5113495bSYour Name  * dp_htt_stats_print_tag() - function to select the tag type and
3231*5113495bSYour Name  * print the corresponding tag structure
3232*5113495bSYour Name  * @pdev: pdev pointer
3233*5113495bSYour Name  * @tag_type: tag type that is to be printed
3234*5113495bSYour Name  * @tag_buf: pointer to the tag structure
3235*5113495bSYour Name  *
3236*5113495bSYour Name  * Return: void
3237*5113495bSYour Name  */
3238*5113495bSYour Name void dp_htt_stats_print_tag(struct dp_pdev *pdev,
3239*5113495bSYour Name 			    uint8_t tag_type, uint32_t *tag_buf);
3240*5113495bSYour Name 
3241*5113495bSYour Name /**
3242*5113495bSYour Name  * dp_htt_stats_copy_tag() - function to select the tag type and
3243*5113495bSYour Name  * copy the corresponding tag structure
3244*5113495bSYour Name  * @pdev: DP_PDEV handle
3245*5113495bSYour Name  * @tag_type: tag type that is to be printed
3246*5113495bSYour Name  * @tag_buf: pointer to the tag structure
3247*5113495bSYour Name  *
3248*5113495bSYour Name  * Return: void
3249*5113495bSYour Name  */
3250*5113495bSYour Name void dp_htt_stats_copy_tag(struct dp_pdev *pdev, uint8_t tag_type, uint32_t *tag_buf);
3251*5113495bSYour Name 
3252*5113495bSYour Name /**
3253*5113495bSYour Name  * dp_h2t_3tuple_config_send(): function to construct 3 tuple configuration
3254*5113495bSYour Name  * HTT message to pass to FW
3255*5113495bSYour Name  * @pdev: DP PDEV handle
3256*5113495bSYour Name  * @tuple_mask: tuple configuration to report 3 tuple hash value in either
3257*5113495bSYour Name  * toeplitz_2_or_4 or flow_id_toeplitz in MSDU START TLV.
3258*5113495bSYour Name  *
3259*5113495bSYour Name  * tuple_mask[1:0]:
3260*5113495bSYour Name  *   00 - Do not report 3 tuple hash value
3261*5113495bSYour Name  *   10 - Report 3 tuple hash value in toeplitz_2_or_4
3262*5113495bSYour Name  *   01 - Report 3 tuple hash value in flow_id_toeplitz
3263*5113495bSYour Name  *   11 - Report 3 tuple hash value in both toeplitz_2_or_4 & flow_id_toeplitz
3264*5113495bSYour Name  * @mac_id: MAC ID
3265*5113495bSYour Name  *
3266*5113495bSYour Name  * Return: QDF STATUS
3267*5113495bSYour Name  */
3268*5113495bSYour Name QDF_STATUS dp_h2t_3tuple_config_send(struct dp_pdev *pdev, uint32_t tuple_mask,
3269*5113495bSYour Name 				     uint8_t mac_id);
3270*5113495bSYour Name 
3271*5113495bSYour Name #ifdef IPA_OFFLOAD
3272*5113495bSYour Name /**
3273*5113495bSYour Name  * dp_peer_update_tid_stats_from_reo() - update rx pkt and byte count from reo
3274*5113495bSYour Name  * @soc: soc handle
3275*5113495bSYour Name  * @cb_ctxt: combination of peer_id and tid
3276*5113495bSYour Name  * @reo_status: reo status
3277*5113495bSYour Name  *
3278*5113495bSYour Name  * Return: void
3279*5113495bSYour Name  */
3280*5113495bSYour Name void dp_peer_update_tid_stats_from_reo(struct dp_soc *soc, void *cb_ctxt,
3281*5113495bSYour Name 				       union hal_reo_status *reo_status);
3282*5113495bSYour Name 
3283*5113495bSYour Name int dp_peer_get_rxtid_stats_ipa(struct dp_peer *peer,
3284*5113495bSYour Name 				dp_rxtid_stats_cmd_cb dp_stats_cmd_cb);
3285*5113495bSYour Name #ifdef IPA_OPT_WIFI_DP
3286*5113495bSYour Name void dp_ipa_wdi_opt_dpath_notify_flt_rlsd(int flt0_rslt,
3287*5113495bSYour Name 					  int flt1_rslt);
3288*5113495bSYour Name void dp_ipa_wdi_opt_dpath_notify_flt_add_rem_cb(int flt0_rslt, int flt1_rslt);
3289*5113495bSYour Name void dp_ipa_wdi_opt_dpath_notify_flt_rsvd(bool is_success);
3290*5113495bSYour Name #endif
3291*5113495bSYour Name #ifdef QCA_ENHANCED_STATS_SUPPORT
3292*5113495bSYour Name /**
3293*5113495bSYour Name  * dp_peer_aggregate_tid_stats - aggregate rx tid stats
3294*5113495bSYour Name  * @peer: Data Path peer
3295*5113495bSYour Name  *
3296*5113495bSYour Name  * Return: void
3297*5113495bSYour Name  */
3298*5113495bSYour Name void dp_peer_aggregate_tid_stats(struct dp_peer *peer);
3299*5113495bSYour Name #endif
3300*5113495bSYour Name #else
dp_peer_aggregate_tid_stats(struct dp_peer * peer)3301*5113495bSYour Name static inline void dp_peer_aggregate_tid_stats(struct dp_peer *peer)
3302*5113495bSYour Name {
3303*5113495bSYour Name }
3304*5113495bSYour Name #endif
3305*5113495bSYour Name 
3306*5113495bSYour Name /**
3307*5113495bSYour Name  * dp_set_key_sec_type_wifi3() - set security mode of key
3308*5113495bSYour Name  * @soc: Datapath soc handle
3309*5113495bSYour Name  * @vdev_id: id of atapath vdev
3310*5113495bSYour Name  * @peer_mac: Datapath peer mac address
3311*5113495bSYour Name  * @sec_type: security type
3312*5113495bSYour Name  * @is_unicast: key type
3313*5113495bSYour Name  *
3314*5113495bSYour Name  */
3315*5113495bSYour Name QDF_STATUS
3316*5113495bSYour Name dp_set_key_sec_type_wifi3(struct cdp_soc_t *soc, uint8_t vdev_id,
3317*5113495bSYour Name 			  uint8_t *peer_mac, enum cdp_sec_type sec_type,
3318*5113495bSYour Name 			  bool is_unicast);
3319*5113495bSYour Name 
3320*5113495bSYour Name /**
3321*5113495bSYour Name  * dp_get_pdev_for_mac_id() -  Return pdev for mac_id
3322*5113495bSYour Name  * @soc: handle to DP soc
3323*5113495bSYour Name  * @mac_id: MAC id
3324*5113495bSYour Name  *
3325*5113495bSYour Name  * Return: Return pdev corresponding to MAC
3326*5113495bSYour Name  */
3327*5113495bSYour Name void *dp_get_pdev_for_mac_id(struct dp_soc *soc, uint32_t mac_id);
3328*5113495bSYour Name 
3329*5113495bSYour Name QDF_STATUS
3330*5113495bSYour Name dp_set_michael_key(struct cdp_soc_t *soc, uint8_t vdev_id,
3331*5113495bSYour Name 		   uint8_t *peer_mac,
3332*5113495bSYour Name 		   bool is_unicast, uint32_t *key);
3333*5113495bSYour Name 
3334*5113495bSYour Name /**
3335*5113495bSYour Name  * dp_check_pdev_exists() - Validate pdev before use
3336*5113495bSYour Name  * @soc: dp soc handle
3337*5113495bSYour Name  * @data: pdev handle
3338*5113495bSYour Name  *
3339*5113495bSYour Name  * Return: 0 - success/invalid - failure
3340*5113495bSYour Name  */
3341*5113495bSYour Name bool dp_check_pdev_exists(struct dp_soc *soc, struct dp_pdev *data);
3342*5113495bSYour Name 
3343*5113495bSYour Name /**
3344*5113495bSYour Name  * dp_update_delay_stats() - Update delay statistics in structure
3345*5113495bSYour Name  *				and fill min, max and avg delay
3346*5113495bSYour Name  * @tstats: tid tx stats
3347*5113495bSYour Name  * @rstats: tid rx stats
3348*5113495bSYour Name  * @delay: delay in ms
3349*5113495bSYour Name  * @tid: tid value
3350*5113495bSYour Name  * @mode: type of tx delay mode
3351*5113495bSYour Name  * @ring_id: ring number
3352*5113495bSYour Name  * @delay_in_us: flag to indicate whether the delay is in ms or us
3353*5113495bSYour Name  *
3354*5113495bSYour Name  * Return: none
3355*5113495bSYour Name  */
3356*5113495bSYour Name void dp_update_delay_stats(struct cdp_tid_tx_stats *tstats,
3357*5113495bSYour Name 			   struct cdp_tid_rx_stats *rstats, uint32_t delay,
3358*5113495bSYour Name 			   uint8_t tid, uint8_t mode, uint8_t ring_id,
3359*5113495bSYour Name 			   bool delay_in_us);
3360*5113495bSYour Name 
3361*5113495bSYour Name /**
3362*5113495bSYour Name  * dp_print_ring_stats(): Print tail and head pointer
3363*5113495bSYour Name  * @pdev: DP_PDEV handle
3364*5113495bSYour Name  *
3365*5113495bSYour Name  * Return: void
3366*5113495bSYour Name  */
3367*5113495bSYour Name void dp_print_ring_stats(struct dp_pdev *pdev);
3368*5113495bSYour Name 
3369*5113495bSYour Name /**
3370*5113495bSYour Name  * dp_print_ring_stat_from_hal(): Print tail and head pointer through hal
3371*5113495bSYour Name  * @soc: soc handle
3372*5113495bSYour Name  * @srng: srng handle
3373*5113495bSYour Name  * @ring_type: ring type
3374*5113495bSYour Name  *
3375*5113495bSYour Name  * Return: void
3376*5113495bSYour Name  */
3377*5113495bSYour Name void
3378*5113495bSYour Name dp_print_ring_stat_from_hal(struct dp_soc *soc,  struct dp_srng *srng,
3379*5113495bSYour Name 			    enum hal_ring_type ring_type);
3380*5113495bSYour Name 
3381*5113495bSYour Name /**
3382*5113495bSYour Name  * dp_print_pdev_cfg_params() - Print the pdev cfg parameters
3383*5113495bSYour Name  * @pdev: DP pdev handle
3384*5113495bSYour Name  *
3385*5113495bSYour Name  * Return: void
3386*5113495bSYour Name  */
3387*5113495bSYour Name void dp_print_pdev_cfg_params(struct dp_pdev *pdev);
3388*5113495bSYour Name 
3389*5113495bSYour Name /**
3390*5113495bSYour Name  * dp_print_soc_cfg_params()- Dump soc wlan config parameters
3391*5113495bSYour Name  * @soc: Soc handle
3392*5113495bSYour Name  *
3393*5113495bSYour Name  * Return: void
3394*5113495bSYour Name  */
3395*5113495bSYour Name void dp_print_soc_cfg_params(struct dp_soc *soc);
3396*5113495bSYour Name 
3397*5113495bSYour Name /**
3398*5113495bSYour Name  * dp_srng_get_str_from_hal_ring_type() - Return string name for a ring
3399*5113495bSYour Name  * @ring_type: Ring
3400*5113495bSYour Name  *
3401*5113495bSYour Name  * Return: char const pointer
3402*5113495bSYour Name  */
3403*5113495bSYour Name const
3404*5113495bSYour Name char *dp_srng_get_str_from_hal_ring_type(enum hal_ring_type ring_type);
3405*5113495bSYour Name 
3406*5113495bSYour Name /**
3407*5113495bSYour Name  * dp_txrx_path_stats() - Function to display dump stats
3408*5113495bSYour Name  * @soc: soc handle
3409*5113495bSYour Name  *
3410*5113495bSYour Name  * Return: none
3411*5113495bSYour Name  */
3412*5113495bSYour Name void dp_txrx_path_stats(struct dp_soc *soc);
3413*5113495bSYour Name 
3414*5113495bSYour Name /**
3415*5113495bSYour Name  * dp_print_per_ring_stats(): Packet count per ring
3416*5113495bSYour Name  * @soc: soc handle
3417*5113495bSYour Name  *
3418*5113495bSYour Name  * Return: None
3419*5113495bSYour Name  */
3420*5113495bSYour Name void dp_print_per_ring_stats(struct dp_soc *soc);
3421*5113495bSYour Name 
3422*5113495bSYour Name /**
3423*5113495bSYour Name  * dp_aggregate_pdev_stats(): Consolidate stats at PDEV level
3424*5113495bSYour Name  * @pdev: DP PDEV handle
3425*5113495bSYour Name  *
3426*5113495bSYour Name  * Return: void
3427*5113495bSYour Name  */
3428*5113495bSYour Name void dp_aggregate_pdev_stats(struct dp_pdev *pdev);
3429*5113495bSYour Name 
3430*5113495bSYour Name /**
3431*5113495bSYour Name  * dp_print_rx_rates(): Print Rx rate stats
3432*5113495bSYour Name  * @vdev: DP_VDEV handle
3433*5113495bSYour Name  *
3434*5113495bSYour Name  * Return:void
3435*5113495bSYour Name  */
3436*5113495bSYour Name void dp_print_rx_rates(struct dp_vdev *vdev);
3437*5113495bSYour Name 
3438*5113495bSYour Name /**
3439*5113495bSYour Name  * dp_print_tx_rates(): Print tx rates
3440*5113495bSYour Name  * @vdev: DP_VDEV handle
3441*5113495bSYour Name  *
3442*5113495bSYour Name  * Return:void
3443*5113495bSYour Name  */
3444*5113495bSYour Name void dp_print_tx_rates(struct dp_vdev *vdev);
3445*5113495bSYour Name 
3446*5113495bSYour Name /**
3447*5113495bSYour Name  * dp_print_peer_stats():print peer stats
3448*5113495bSYour Name  * @peer: DP_PEER handle
3449*5113495bSYour Name  * @peer_stats: buffer holding peer stats
3450*5113495bSYour Name  *
3451*5113495bSYour Name  * return void
3452*5113495bSYour Name  */
3453*5113495bSYour Name void dp_print_peer_stats(struct dp_peer *peer,
3454*5113495bSYour Name 			 struct cdp_peer_stats *peer_stats);
3455*5113495bSYour Name 
3456*5113495bSYour Name /**
3457*5113495bSYour Name  * dp_print_pdev_tx_stats(): Print Pdev level TX stats
3458*5113495bSYour Name  * @pdev: DP_PDEV Handle
3459*5113495bSYour Name  *
3460*5113495bSYour Name  * Return:void
3461*5113495bSYour Name  */
3462*5113495bSYour Name void
3463*5113495bSYour Name dp_print_pdev_tx_stats(struct dp_pdev *pdev);
3464*5113495bSYour Name 
3465*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_MCAST_MLO)
3466*5113495bSYour Name /**
3467*5113495bSYour Name  * dp_print_vdev_mlo_mcast_tx_stats(): Print vdev level mlo mcast tx stats
3468*5113495bSYour Name  * @vdev: DP_VDEV Handle
3469*5113495bSYour Name  *
3470*5113495bSYour Name  * Return:void
3471*5113495bSYour Name  */
3472*5113495bSYour Name void
3473*5113495bSYour Name dp_print_vdev_mlo_mcast_tx_stats(struct dp_vdev *vdev);
3474*5113495bSYour Name #else
3475*5113495bSYour Name /**
3476*5113495bSYour Name  * dp_print_vdev_mlo_mcast_tx_stats(): Print vdev level mlo mcast tx stats
3477*5113495bSYour Name  * @vdev: DP_VDEV Handle
3478*5113495bSYour Name  *
3479*5113495bSYour Name  * Return:void
3480*5113495bSYour Name  */
3481*5113495bSYour Name static inline
dp_print_vdev_mlo_mcast_tx_stats(struct dp_vdev * vdev)3482*5113495bSYour Name void dp_print_vdev_mlo_mcast_tx_stats(struct dp_vdev *vdev)
3483*5113495bSYour Name {
3484*5113495bSYour Name }
3485*5113495bSYour Name #endif
3486*5113495bSYour Name 
3487*5113495bSYour Name /**
3488*5113495bSYour Name  * dp_print_pdev_rx_stats(): Print Pdev level RX stats
3489*5113495bSYour Name  * @pdev: DP_PDEV Handle
3490*5113495bSYour Name  *
3491*5113495bSYour Name  * Return: void
3492*5113495bSYour Name  */
3493*5113495bSYour Name void
3494*5113495bSYour Name dp_print_pdev_rx_stats(struct dp_pdev *pdev);
3495*5113495bSYour Name 
3496*5113495bSYour Name /**
3497*5113495bSYour Name  * dp_print_soc_tx_stats(): Print SOC level  stats
3498*5113495bSYour Name  * @soc: DP_SOC Handle
3499*5113495bSYour Name  *
3500*5113495bSYour Name  * Return: void
3501*5113495bSYour Name  */
3502*5113495bSYour Name void dp_print_soc_tx_stats(struct dp_soc *soc);
3503*5113495bSYour Name 
3504*5113495bSYour Name #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
3505*5113495bSYour Name /**
3506*5113495bSYour Name  * dp_print_global_desc_count(): Print global desc in use
3507*5113495bSYour Name  *
3508*5113495bSYour Name  * Return: void
3509*5113495bSYour Name  */
3510*5113495bSYour Name void dp_print_global_desc_count(void);
3511*5113495bSYour Name #else
3512*5113495bSYour Name /**
3513*5113495bSYour Name  * dp_print_global_desc_count(): Print global desc in use
3514*5113495bSYour Name  *
3515*5113495bSYour Name  * Return: void
3516*5113495bSYour Name  */
3517*5113495bSYour Name static inline
dp_print_global_desc_count(void)3518*5113495bSYour Name void dp_print_global_desc_count(void)
3519*5113495bSYour Name {
3520*5113495bSYour Name }
3521*5113495bSYour Name #endif
3522*5113495bSYour Name 
3523*5113495bSYour Name /**
3524*5113495bSYour Name  * dp_print_soc_interrupt_stats() - Print interrupt stats for the soc
3525*5113495bSYour Name  * @soc: dp_soc handle
3526*5113495bSYour Name  *
3527*5113495bSYour Name  * Return: None
3528*5113495bSYour Name  */
3529*5113495bSYour Name void dp_print_soc_interrupt_stats(struct dp_soc *soc);
3530*5113495bSYour Name 
3531*5113495bSYour Name /**
3532*5113495bSYour Name  * dp_print_tx_ppeds_stats() - Print Tx in use stats for the soc in DS
3533*5113495bSYour Name  * @soc: dp_soc handle
3534*5113495bSYour Name  *
3535*5113495bSYour Name  * Return: None
3536*5113495bSYour Name  */
3537*5113495bSYour Name 
3538*5113495bSYour Name void dp_print_tx_ppeds_stats(struct dp_soc *soc);
3539*5113495bSYour Name 
3540*5113495bSYour Name /* REO destination ring's watermark mask */
3541*5113495bSYour Name #define DP_SRNG_WM_MASK_REO_DST  BIT(REO_DST)
3542*5113495bSYour Name /* TX completion ring's watermark mask */
3543*5113495bSYour Name #define DP_SRNG_WM_MASK_TX_COMP  BIT(WBM2SW_RELEASE)
3544*5113495bSYour Name /* All srng's watermark mask */
3545*5113495bSYour Name #define DP_SRNG_WM_MASK_ALL  0xFFFFFFFF
3546*5113495bSYour Name 
3547*5113495bSYour Name #ifdef WLAN_DP_SRNG_USAGE_WM_TRACKING
3548*5113495bSYour Name /**
3549*5113495bSYour Name  * dp_dump_srng_high_wm_stats() - Print the ring usage high watermark stats
3550*5113495bSYour Name  *				  for all SRNGs
3551*5113495bSYour Name  * @soc: DP soc handle
3552*5113495bSYour Name  * @srng_mask: SRNGs mask for dumping usage watermark stats
3553*5113495bSYour Name  *
3554*5113495bSYour Name  * Return: None
3555*5113495bSYour Name  */
3556*5113495bSYour Name void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask);
3557*5113495bSYour Name #else
3558*5113495bSYour Name static inline
dp_dump_srng_high_wm_stats(struct dp_soc * soc,uint64_t srng_mask)3559*5113495bSYour Name void dp_dump_srng_high_wm_stats(struct dp_soc *soc, uint64_t srng_mask)
3560*5113495bSYour Name {
3561*5113495bSYour Name }
3562*5113495bSYour Name #endif
3563*5113495bSYour Name 
3564*5113495bSYour Name /**
3565*5113495bSYour Name  * dp_print_soc_rx_stats() - Print SOC level Rx stats
3566*5113495bSYour Name  * @soc: DP_SOC Handle
3567*5113495bSYour Name  *
3568*5113495bSYour Name  * Return: void
3569*5113495bSYour Name  */
3570*5113495bSYour Name void dp_print_soc_rx_stats(struct dp_soc *soc);
3571*5113495bSYour Name 
3572*5113495bSYour Name /**
3573*5113495bSYour Name  * dp_get_mac_id_for_pdev() - Return mac corresponding to pdev for mac
3574*5113495bSYour Name  *
3575*5113495bSYour Name  * @mac_id: MAC id
3576*5113495bSYour Name  * @pdev_id: pdev_id corresponding to pdev, 0 for MCL
3577*5113495bSYour Name  *
3578*5113495bSYour Name  * Single pdev using both MACs will operate on both MAC rings,
3579*5113495bSYour Name  * which is the case for MCL.
3580*5113495bSYour Name  * For WIN each PDEV will operate one ring, so index is zero.
3581*5113495bSYour Name  *
3582*5113495bSYour Name  */
dp_get_mac_id_for_pdev(uint32_t mac_id,uint32_t pdev_id)3583*5113495bSYour Name static inline int dp_get_mac_id_for_pdev(uint32_t mac_id, uint32_t pdev_id)
3584*5113495bSYour Name {
3585*5113495bSYour Name 	if (mac_id && pdev_id) {
3586*5113495bSYour Name 		qdf_print("Both mac_id and pdev_id cannot be non zero");
3587*5113495bSYour Name 		QDF_BUG(0);
3588*5113495bSYour Name 		return 0;
3589*5113495bSYour Name 	}
3590*5113495bSYour Name 	return (mac_id + pdev_id);
3591*5113495bSYour Name }
3592*5113495bSYour Name 
3593*5113495bSYour Name /**
3594*5113495bSYour Name  * dp_get_lmac_id_for_pdev_id() - Return lmac id corresponding to host pdev id
3595*5113495bSYour Name  * @soc: soc pointer
3596*5113495bSYour Name  * @mac_id: MAC id
3597*5113495bSYour Name  * @pdev_id: pdev_id corresponding to pdev, 0 for MCL
3598*5113495bSYour Name  *
3599*5113495bSYour Name  * For MCL, Single pdev using both MACs will operate on both MAC rings.
3600*5113495bSYour Name  *
3601*5113495bSYour Name  * For WIN, each PDEV will operate one ring.
3602*5113495bSYour Name  *
3603*5113495bSYour Name  */
3604*5113495bSYour Name static inline int
dp_get_lmac_id_for_pdev_id(struct dp_soc * soc,uint32_t mac_id,uint32_t pdev_id)3605*5113495bSYour Name dp_get_lmac_id_for_pdev_id
3606*5113495bSYour Name 	(struct dp_soc *soc, uint32_t mac_id, uint32_t pdev_id)
3607*5113495bSYour Name {
3608*5113495bSYour Name 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
3609*5113495bSYour Name 		if (mac_id && pdev_id) {
3610*5113495bSYour Name 			qdf_print("Both mac_id and pdev_id cannot be non zero");
3611*5113495bSYour Name 			QDF_BUG(0);
3612*5113495bSYour Name 			return 0;
3613*5113495bSYour Name 		}
3614*5113495bSYour Name 		return (mac_id + pdev_id);
3615*5113495bSYour Name 	}
3616*5113495bSYour Name 
3617*5113495bSYour Name 	return soc->pdev_list[pdev_id]->lmac_id;
3618*5113495bSYour Name }
3619*5113495bSYour Name 
3620*5113495bSYour Name /**
3621*5113495bSYour Name  * dp_get_pdev_for_lmac_id() - Return pdev pointer corresponding to lmac id
3622*5113495bSYour Name  * @soc: soc pointer
3623*5113495bSYour Name  * @lmac_id: LMAC id
3624*5113495bSYour Name  *
3625*5113495bSYour Name  * For MCL, Single pdev exists
3626*5113495bSYour Name  *
3627*5113495bSYour Name  * For WIN, each PDEV will operate one ring.
3628*5113495bSYour Name  *
3629*5113495bSYour Name  */
3630*5113495bSYour Name static inline struct dp_pdev *
dp_get_pdev_for_lmac_id(struct dp_soc * soc,uint32_t lmac_id)3631*5113495bSYour Name 	dp_get_pdev_for_lmac_id(struct dp_soc *soc, uint32_t lmac_id)
3632*5113495bSYour Name {
3633*5113495bSYour Name 	uint8_t i = 0;
3634*5113495bSYour Name 
3635*5113495bSYour Name 	if (wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx)) {
3636*5113495bSYour Name 		i = wlan_cfg_get_pdev_idx(soc->wlan_cfg_ctx, lmac_id);
3637*5113495bSYour Name 		return ((i < MAX_PDEV_CNT) ? soc->pdev_list[i] : NULL);
3638*5113495bSYour Name 	}
3639*5113495bSYour Name 
3640*5113495bSYour Name 	/* Typically for MCL as there only 1 PDEV*/
3641*5113495bSYour Name 	return soc->pdev_list[0];
3642*5113495bSYour Name }
3643*5113495bSYour Name 
3644*5113495bSYour Name /**
3645*5113495bSYour Name  * dp_calculate_target_pdev_id_from_host_pdev_id() - Return target pdev
3646*5113495bSYour Name  *                                          corresponding to host pdev id
3647*5113495bSYour Name  * @soc: soc pointer
3648*5113495bSYour Name  * @mac_for_pdev: pdev_id corresponding to host pdev for WIN, mac id for MCL
3649*5113495bSYour Name  *
3650*5113495bSYour Name  * Return: target pdev_id for host pdev id. For WIN, this is derived through
3651*5113495bSYour Name  * a two step process:
3652*5113495bSYour Name  * 1. Get lmac_id corresponding to host pdev_id (lmac_id can change
3653*5113495bSYour Name  *    during mode switch)
3654*5113495bSYour Name  * 2. Get target pdev_id (set up during WMI ready) from lmac_id
3655*5113495bSYour Name  *
3656*5113495bSYour Name  * For MCL, return the offset-1 translated mac_id
3657*5113495bSYour Name  */
3658*5113495bSYour Name static inline int
dp_calculate_target_pdev_id_from_host_pdev_id(struct dp_soc * soc,uint32_t mac_for_pdev)3659*5113495bSYour Name dp_calculate_target_pdev_id_from_host_pdev_id
3660*5113495bSYour Name 	(struct dp_soc *soc, uint32_t mac_for_pdev)
3661*5113495bSYour Name {
3662*5113495bSYour Name 	struct dp_pdev *pdev;
3663*5113495bSYour Name 
3664*5113495bSYour Name 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
3665*5113495bSYour Name 		return DP_SW2HW_MACID(mac_for_pdev);
3666*5113495bSYour Name 
3667*5113495bSYour Name 	pdev = soc->pdev_list[mac_for_pdev];
3668*5113495bSYour Name 
3669*5113495bSYour Name 	/*non-MCL case, get original target_pdev mapping*/
3670*5113495bSYour Name 	return wlan_cfg_get_target_pdev_id(soc->wlan_cfg_ctx, pdev->lmac_id);
3671*5113495bSYour Name }
3672*5113495bSYour Name 
3673*5113495bSYour Name /**
3674*5113495bSYour Name  * dp_get_target_pdev_id_for_host_pdev_id() - Return target pdev corresponding
3675*5113495bSYour Name  *                                         to host pdev id
3676*5113495bSYour Name  * @soc: soc pointer
3677*5113495bSYour Name  * @mac_for_pdev: pdev_id corresponding to host pdev for WIN, mac id for MCL
3678*5113495bSYour Name  *
3679*5113495bSYour Name  * Return: target pdev_id for host pdev id.
3680*5113495bSYour Name  * For WIN, return the value stored in pdev object.
3681*5113495bSYour Name  * For MCL, return the offset-1 translated mac_id.
3682*5113495bSYour Name  */
3683*5113495bSYour Name static inline int
dp_get_target_pdev_id_for_host_pdev_id(struct dp_soc * soc,uint32_t mac_for_pdev)3684*5113495bSYour Name dp_get_target_pdev_id_for_host_pdev_id
3685*5113495bSYour Name 	(struct dp_soc *soc, uint32_t mac_for_pdev)
3686*5113495bSYour Name {
3687*5113495bSYour Name 	struct dp_pdev *pdev;
3688*5113495bSYour Name 
3689*5113495bSYour Name 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
3690*5113495bSYour Name 		return DP_SW2HW_MACID(mac_for_pdev);
3691*5113495bSYour Name 
3692*5113495bSYour Name 	pdev = soc->pdev_list[mac_for_pdev];
3693*5113495bSYour Name 
3694*5113495bSYour Name 	return pdev->target_pdev_id;
3695*5113495bSYour Name }
3696*5113495bSYour Name 
3697*5113495bSYour Name /**
3698*5113495bSYour Name  * dp_get_host_pdev_id_for_target_pdev_id() - Return host pdev corresponding
3699*5113495bSYour Name  *                                         to target pdev id
3700*5113495bSYour Name  * @soc: soc pointer
3701*5113495bSYour Name  * @pdev_id: pdev_id corresponding to target pdev
3702*5113495bSYour Name  *
3703*5113495bSYour Name  * Return: host pdev_id for target pdev id. For WIN, this is derived through
3704*5113495bSYour Name  * a two step process:
3705*5113495bSYour Name  * 1. Get lmac_id corresponding to target pdev_id
3706*5113495bSYour Name  * 2. Get host pdev_id (set up during WMI ready) from lmac_id
3707*5113495bSYour Name  *
3708*5113495bSYour Name  * For MCL, return the 0-offset pdev_id
3709*5113495bSYour Name  */
3710*5113495bSYour Name static inline int
dp_get_host_pdev_id_for_target_pdev_id(struct dp_soc * soc,uint32_t pdev_id)3711*5113495bSYour Name dp_get_host_pdev_id_for_target_pdev_id
3712*5113495bSYour Name 	(struct dp_soc *soc, uint32_t pdev_id)
3713*5113495bSYour Name {
3714*5113495bSYour Name 	struct dp_pdev *pdev;
3715*5113495bSYour Name 	int lmac_id;
3716*5113495bSYour Name 
3717*5113495bSYour Name 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
3718*5113495bSYour Name 		return DP_HW2SW_MACID(pdev_id);
3719*5113495bSYour Name 
3720*5113495bSYour Name 	/*non-MCL case, get original target_lmac mapping from target pdev*/
3721*5113495bSYour Name 	lmac_id = wlan_cfg_get_hw_mac_idx(soc->wlan_cfg_ctx,
3722*5113495bSYour Name 					  DP_HW2SW_MACID(pdev_id));
3723*5113495bSYour Name 
3724*5113495bSYour Name 	/*Get host pdev from lmac*/
3725*5113495bSYour Name 	pdev = dp_get_pdev_for_lmac_id(soc, lmac_id);
3726*5113495bSYour Name 
3727*5113495bSYour Name 	return pdev ? pdev->pdev_id : INVALID_PDEV_ID;
3728*5113495bSYour Name }
3729*5113495bSYour Name 
3730*5113495bSYour Name /**
3731*5113495bSYour Name  * dp_get_mac_id_for_mac() -  Return mac corresponding WIN and MCL mac_ids
3732*5113495bSYour Name  *
3733*5113495bSYour Name  * @soc: handle to DP soc
3734*5113495bSYour Name  * @mac_id: MAC id
3735*5113495bSYour Name  *
3736*5113495bSYour Name  * Single pdev using both MACs will operate on both MAC rings,
3737*5113495bSYour Name  * which is the case for MCL.
3738*5113495bSYour Name  * For WIN each PDEV will operate one ring, so index is zero.
3739*5113495bSYour Name  *
3740*5113495bSYour Name  */
dp_get_mac_id_for_mac(struct dp_soc * soc,uint32_t mac_id)3741*5113495bSYour Name static inline int dp_get_mac_id_for_mac(struct dp_soc *soc, uint32_t mac_id)
3742*5113495bSYour Name {
3743*5113495bSYour Name 	/*
3744*5113495bSYour Name 	 * Single pdev using both MACs will operate on both MAC rings,
3745*5113495bSYour Name 	 * which is the case for MCL.
3746*5113495bSYour Name 	 */
3747*5113495bSYour Name 	if (!wlan_cfg_per_pdev_lmac_ring(soc->wlan_cfg_ctx))
3748*5113495bSYour Name 		return mac_id;
3749*5113495bSYour Name 
3750*5113495bSYour Name 	/* For WIN each PDEV will operate one ring, so index is zero. */
3751*5113495bSYour Name 	return 0;
3752*5113495bSYour Name }
3753*5113495bSYour Name 
3754*5113495bSYour Name /**
3755*5113495bSYour Name  * dp_is_subtype_data() - check if the frame subtype is data
3756*5113495bSYour Name  *
3757*5113495bSYour Name  * @frame_ctrl: Frame control field
3758*5113495bSYour Name  *
3759*5113495bSYour Name  * check the frame control field and verify if the packet
3760*5113495bSYour Name  * is a data packet.
3761*5113495bSYour Name  *
3762*5113495bSYour Name  * Return: true or false
3763*5113495bSYour Name  */
dp_is_subtype_data(uint16_t frame_ctrl)3764*5113495bSYour Name static inline bool dp_is_subtype_data(uint16_t frame_ctrl)
3765*5113495bSYour Name {
3766*5113495bSYour Name 	if (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_TYPE_MASK) ==
3767*5113495bSYour Name 	    QDF_IEEE80211_FC0_TYPE_DATA) &&
3768*5113495bSYour Name 	    (((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
3769*5113495bSYour Name 	    QDF_IEEE80211_FC0_SUBTYPE_DATA) ||
3770*5113495bSYour Name 	    ((qdf_cpu_to_le16(frame_ctrl) & QDF_IEEE80211_FC0_SUBTYPE_MASK) ==
3771*5113495bSYour Name 	    QDF_IEEE80211_FC0_SUBTYPE_QOS))) {
3772*5113495bSYour Name 		return true;
3773*5113495bSYour Name 	}
3774*5113495bSYour Name 
3775*5113495bSYour Name 	return false;
3776*5113495bSYour Name }
3777*5113495bSYour Name 
3778*5113495bSYour Name #ifdef WDI_EVENT_ENABLE
3779*5113495bSYour Name /**
3780*5113495bSYour Name  * dp_h2t_cfg_stats_msg_send(): function to construct HTT message to pass to FW
3781*5113495bSYour Name  * @pdev: DP PDEV handle
3782*5113495bSYour Name  * @stats_type_upload_mask: stats type requested by user
3783*5113495bSYour Name  * @mac_id: Mac id number
3784*5113495bSYour Name  *
3785*5113495bSYour Name  * return: QDF STATUS
3786*5113495bSYour Name  */
3787*5113495bSYour Name QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
3788*5113495bSYour Name 				uint32_t stats_type_upload_mask,
3789*5113495bSYour Name 				uint8_t mac_id);
3790*5113495bSYour Name 
3791*5113495bSYour Name /**
3792*5113495bSYour Name  * dp_wdi_event_unsub() - WDI event unsubscribe
3793*5113495bSYour Name  * @soc: soc handle
3794*5113495bSYour Name  * @pdev_id: id of pdev
3795*5113495bSYour Name  * @event_cb_sub_handle: subscribed event handle
3796*5113495bSYour Name  * @event: Event to be unsubscribe
3797*5113495bSYour Name  *
3798*5113495bSYour Name  * Return: 0 for success. nonzero for failure.
3799*5113495bSYour Name  */
3800*5113495bSYour Name int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id,
3801*5113495bSYour Name 		       wdi_event_subscribe *event_cb_sub_handle,
3802*5113495bSYour Name 		       uint32_t event);
3803*5113495bSYour Name 
3804*5113495bSYour Name /**
3805*5113495bSYour Name  * dp_wdi_event_sub() - Subscribe WDI event
3806*5113495bSYour Name  * @soc: soc handle
3807*5113495bSYour Name  * @pdev_id: id of pdev
3808*5113495bSYour Name  * @event_cb_sub_handle: subscribe event handle
3809*5113495bSYour Name  * @event: Event to be subscribe
3810*5113495bSYour Name  *
3811*5113495bSYour Name  * Return: 0 for success. nonzero for failure.
3812*5113495bSYour Name  */
3813*5113495bSYour Name int dp_wdi_event_sub(struct cdp_soc_t *soc, uint8_t pdev_id,
3814*5113495bSYour Name 		     wdi_event_subscribe *event_cb_sub_handle,
3815*5113495bSYour Name 		     uint32_t event);
3816*5113495bSYour Name 
3817*5113495bSYour Name /**
3818*5113495bSYour Name  * dp_wdi_event_handler() - Event handler for WDI event
3819*5113495bSYour Name  * @event: wdi event number
3820*5113495bSYour Name  * @soc: soc handle
3821*5113495bSYour Name  * @data: pointer to data
3822*5113495bSYour Name  * @peer_id: peer id number
3823*5113495bSYour Name  * @status: HTT rx status
3824*5113495bSYour Name  * @pdev_id: id of pdev
3825*5113495bSYour Name  *
3826*5113495bSYour Name  * It will be called to register WDI event
3827*5113495bSYour Name  *
3828*5113495bSYour Name  * Return: None
3829*5113495bSYour Name  */
3830*5113495bSYour Name void dp_wdi_event_handler(enum WDI_EVENT event, struct dp_soc *soc,
3831*5113495bSYour Name 			  void *data, u_int16_t peer_id,
3832*5113495bSYour Name 			  int status, u_int8_t pdev_id);
3833*5113495bSYour Name 
3834*5113495bSYour Name /**
3835*5113495bSYour Name  * dp_wdi_event_attach() - Attach wdi event
3836*5113495bSYour Name  * @txrx_pdev: DP pdev handle
3837*5113495bSYour Name  *
3838*5113495bSYour Name  * Return: 0 for success. nonzero for failure.
3839*5113495bSYour Name  */
3840*5113495bSYour Name int dp_wdi_event_attach(struct dp_pdev *txrx_pdev);
3841*5113495bSYour Name 
3842*5113495bSYour Name /**
3843*5113495bSYour Name  * dp_wdi_event_detach() - Detach WDI event
3844*5113495bSYour Name  * @txrx_pdev: DP pdev handle
3845*5113495bSYour Name  *
3846*5113495bSYour Name  * Return: 0 for success. nonzero for failure.
3847*5113495bSYour Name  */
3848*5113495bSYour Name int dp_wdi_event_detach(struct dp_pdev *txrx_pdev);
3849*5113495bSYour Name 
3850*5113495bSYour Name static inline void
dp_hif_update_pipe_callback(struct dp_soc * dp_soc,void * cb_context,QDF_STATUS (* callback)(void *,qdf_nbuf_t,uint8_t),uint8_t pipe_id)3851*5113495bSYour Name dp_hif_update_pipe_callback(struct dp_soc *dp_soc,
3852*5113495bSYour Name 			    void *cb_context,
3853*5113495bSYour Name 			    QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t),
3854*5113495bSYour Name 			    uint8_t pipe_id)
3855*5113495bSYour Name {
3856*5113495bSYour Name 	struct hif_msg_callbacks hif_pipe_callbacks = { 0 };
3857*5113495bSYour Name 
3858*5113495bSYour Name 	/* TODO: Temporary change to bypass HTC connection for this new
3859*5113495bSYour Name 	 * HIF pipe, which will be used for packet log and other high-
3860*5113495bSYour Name 	 * priority HTT messages. Proper HTC connection to be added
3861*5113495bSYour Name 	 * later once required FW changes are available
3862*5113495bSYour Name 	 */
3863*5113495bSYour Name 	hif_pipe_callbacks.rxCompletionHandler = callback;
3864*5113495bSYour Name 	hif_pipe_callbacks.Context = cb_context;
3865*5113495bSYour Name 	hif_update_pipe_callback(dp_soc->hif_handle,
3866*5113495bSYour Name 		DP_HTT_T2H_HP_PIPE, &hif_pipe_callbacks);
3867*5113495bSYour Name }
3868*5113495bSYour Name #else
dp_wdi_event_unsub(struct cdp_soc_t * soc,uint8_t pdev_id,wdi_event_subscribe * event_cb_sub_handle,uint32_t event)3869*5113495bSYour Name static inline int dp_wdi_event_unsub(struct cdp_soc_t *soc, uint8_t pdev_id,
3870*5113495bSYour Name 				     wdi_event_subscribe *event_cb_sub_handle,
3871*5113495bSYour Name 				     uint32_t event)
3872*5113495bSYour Name {
3873*5113495bSYour Name 	return 0;
3874*5113495bSYour Name }
3875*5113495bSYour Name 
dp_wdi_event_sub(struct cdp_soc_t * soc,uint8_t pdev_id,wdi_event_subscribe * event_cb_sub_handle,uint32_t event)3876*5113495bSYour Name static inline int dp_wdi_event_sub(struct cdp_soc_t *soc, uint8_t pdev_id,
3877*5113495bSYour Name 				   wdi_event_subscribe *event_cb_sub_handle,
3878*5113495bSYour Name 				   uint32_t event)
3879*5113495bSYour Name {
3880*5113495bSYour Name 	return 0;
3881*5113495bSYour Name }
3882*5113495bSYour Name 
3883*5113495bSYour Name static inline
dp_wdi_event_handler(enum WDI_EVENT event,struct dp_soc * soc,void * data,u_int16_t peer_id,int status,u_int8_t pdev_id)3884*5113495bSYour Name void dp_wdi_event_handler(enum WDI_EVENT event,
3885*5113495bSYour Name 			  struct dp_soc *soc,
3886*5113495bSYour Name 			  void *data, u_int16_t peer_id,
3887*5113495bSYour Name 			  int status, u_int8_t pdev_id)
3888*5113495bSYour Name {
3889*5113495bSYour Name }
3890*5113495bSYour Name 
dp_wdi_event_attach(struct dp_pdev * txrx_pdev)3891*5113495bSYour Name static inline int dp_wdi_event_attach(struct dp_pdev *txrx_pdev)
3892*5113495bSYour Name {
3893*5113495bSYour Name 	return 0;
3894*5113495bSYour Name }
3895*5113495bSYour Name 
dp_wdi_event_detach(struct dp_pdev * txrx_pdev)3896*5113495bSYour Name static inline int dp_wdi_event_detach(struct dp_pdev *txrx_pdev)
3897*5113495bSYour Name {
3898*5113495bSYour Name 	return 0;
3899*5113495bSYour Name }
3900*5113495bSYour Name 
dp_h2t_cfg_stats_msg_send(struct dp_pdev * pdev,uint32_t stats_type_upload_mask,uint8_t mac_id)3901*5113495bSYour Name static inline QDF_STATUS dp_h2t_cfg_stats_msg_send(struct dp_pdev *pdev,
3902*5113495bSYour Name 		uint32_t stats_type_upload_mask, uint8_t mac_id)
3903*5113495bSYour Name {
3904*5113495bSYour Name 	return 0;
3905*5113495bSYour Name }
3906*5113495bSYour Name 
3907*5113495bSYour Name static inline void
dp_hif_update_pipe_callback(struct dp_soc * dp_soc,void * cb_context,QDF_STATUS (* callback)(void *,qdf_nbuf_t,uint8_t),uint8_t pipe_id)3908*5113495bSYour Name dp_hif_update_pipe_callback(struct dp_soc *dp_soc, void *cb_context,
3909*5113495bSYour Name 			    QDF_STATUS (*callback)(void *, qdf_nbuf_t, uint8_t),
3910*5113495bSYour Name 			    uint8_t pipe_id)
3911*5113495bSYour Name {
3912*5113495bSYour Name }
3913*5113495bSYour Name #endif
3914*5113495bSYour Name 
3915*5113495bSYour Name #ifdef VDEV_PEER_PROTOCOL_COUNT
3916*5113495bSYour Name /**
3917*5113495bSYour Name  * dp_vdev_peer_stats_update_protocol_cnt() - update per-peer protocol counters
3918*5113495bSYour Name  * @vdev: VDEV DP object
3919*5113495bSYour Name  * @nbuf: data packet
3920*5113495bSYour Name  * @txrx_peer: DP TXRX Peer object
3921*5113495bSYour Name  * @is_egress: whether egress or ingress
3922*5113495bSYour Name  * @is_rx: whether rx or tx
3923*5113495bSYour Name  *
3924*5113495bSYour Name  * This function updates the per-peer protocol counters
3925*5113495bSYour Name  * Return: void
3926*5113495bSYour Name  */
3927*5113495bSYour Name void dp_vdev_peer_stats_update_protocol_cnt(struct dp_vdev *vdev,
3928*5113495bSYour Name 					    qdf_nbuf_t nbuf,
3929*5113495bSYour Name 					    struct dp_txrx_peer *txrx_peer,
3930*5113495bSYour Name 					    bool is_egress,
3931*5113495bSYour Name 					    bool is_rx);
3932*5113495bSYour Name 
3933*5113495bSYour Name /**
3934*5113495bSYour Name  * dp_peer_stats_update_protocol_cnt() - update per-peer protocol counters
3935*5113495bSYour Name  * @soc: SOC DP object
3936*5113495bSYour Name  * @vdev_id: vdev_id
3937*5113495bSYour Name  * @nbuf: data packet
3938*5113495bSYour Name  * @is_egress: whether egress or ingress
3939*5113495bSYour Name  * @is_rx: whether rx or tx
3940*5113495bSYour Name  *
3941*5113495bSYour Name  * This function updates the per-peer protocol counters
3942*5113495bSYour Name  *
3943*5113495bSYour Name  * Return: void
3944*5113495bSYour Name  */
3945*5113495bSYour Name void dp_peer_stats_update_protocol_cnt(struct cdp_soc_t *soc,
3946*5113495bSYour Name 				       int8_t vdev_id,
3947*5113495bSYour Name 				       qdf_nbuf_t nbuf,
3948*5113495bSYour Name 				       bool is_egress,
3949*5113495bSYour Name 				       bool is_rx);
3950*5113495bSYour Name 
3951*5113495bSYour Name void dp_vdev_peer_stats_update_protocol_cnt_tx(struct dp_vdev *vdev_hdl,
3952*5113495bSYour Name 					       qdf_nbuf_t nbuf);
3953*5113495bSYour Name 
3954*5113495bSYour Name #else
3955*5113495bSYour Name #define dp_vdev_peer_stats_update_protocol_cnt(vdev, nbuf, txrx_peer, \
3956*5113495bSYour Name 					       is_egress, is_rx)
3957*5113495bSYour Name 
3958*5113495bSYour Name static inline
dp_vdev_peer_stats_update_protocol_cnt_tx(struct dp_vdev * vdev_hdl,qdf_nbuf_t nbuf)3959*5113495bSYour Name void dp_vdev_peer_stats_update_protocol_cnt_tx(struct dp_vdev *vdev_hdl,
3960*5113495bSYour Name 					       qdf_nbuf_t nbuf)
3961*5113495bSYour Name {
3962*5113495bSYour Name }
3963*5113495bSYour Name 
3964*5113495bSYour Name #endif
3965*5113495bSYour Name 
3966*5113495bSYour Name #ifdef QCA_LL_TX_FLOW_CONTROL_V2
3967*5113495bSYour Name /**
3968*5113495bSYour Name  * dp_tx_dump_flow_pool_info() - dump global_pool and flow_pool info
3969*5113495bSYour Name  * @soc_hdl: Handle to struct cdp_soc
3970*5113495bSYour Name  *
3971*5113495bSYour Name  * Return: none
3972*5113495bSYour Name  */
3973*5113495bSYour Name void dp_tx_dump_flow_pool_info(struct cdp_soc_t *soc_hdl);
3974*5113495bSYour Name 
3975*5113495bSYour Name /**
3976*5113495bSYour Name  * dp_tx_dump_flow_pool_info_compact() - dump flow pool info
3977*5113495bSYour Name  * @soc: DP soc context
3978*5113495bSYour Name  *
3979*5113495bSYour Name  * Return: none
3980*5113495bSYour Name  */
3981*5113495bSYour Name void dp_tx_dump_flow_pool_info_compact(struct dp_soc *soc);
3982*5113495bSYour Name int dp_tx_delete_flow_pool(struct dp_soc *soc, struct dp_tx_desc_pool_s *pool,
3983*5113495bSYour Name 	bool force);
3984*5113495bSYour Name #else
dp_tx_dump_flow_pool_info_compact(struct dp_soc * soc)3985*5113495bSYour Name static inline void dp_tx_dump_flow_pool_info_compact(struct dp_soc *soc)
3986*5113495bSYour Name {
3987*5113495bSYour Name }
3988*5113495bSYour Name #endif /* QCA_LL_TX_FLOW_CONTROL_V2 */
3989*5113495bSYour Name 
3990*5113495bSYour Name #ifdef QCA_OL_DP_SRNG_LOCK_LESS_ACCESS
3991*5113495bSYour Name static inline int
dp_hal_srng_access_start(hal_soc_handle_t soc,hal_ring_handle_t hal_ring_hdl)3992*5113495bSYour Name dp_hal_srng_access_start(hal_soc_handle_t soc, hal_ring_handle_t hal_ring_hdl)
3993*5113495bSYour Name {
3994*5113495bSYour Name 	return hal_srng_access_start_unlocked(soc, hal_ring_hdl);
3995*5113495bSYour Name }
3996*5113495bSYour Name 
3997*5113495bSYour Name static inline void
dp_hal_srng_access_end(hal_soc_handle_t soc,hal_ring_handle_t hal_ring_hdl)3998*5113495bSYour Name dp_hal_srng_access_end(hal_soc_handle_t soc, hal_ring_handle_t hal_ring_hdl)
3999*5113495bSYour Name {
4000*5113495bSYour Name 	hal_srng_access_end_unlocked(soc, hal_ring_hdl);
4001*5113495bSYour Name }
4002*5113495bSYour Name 
4003*5113495bSYour Name #else
4004*5113495bSYour Name static inline int
dp_hal_srng_access_start(hal_soc_handle_t soc,hal_ring_handle_t hal_ring_hdl)4005*5113495bSYour Name dp_hal_srng_access_start(hal_soc_handle_t soc, hal_ring_handle_t hal_ring_hdl)
4006*5113495bSYour Name {
4007*5113495bSYour Name 	return hal_srng_access_start(soc, hal_ring_hdl);
4008*5113495bSYour Name }
4009*5113495bSYour Name 
4010*5113495bSYour Name static inline void
dp_hal_srng_access_end(hal_soc_handle_t soc,hal_ring_handle_t hal_ring_hdl)4011*5113495bSYour Name dp_hal_srng_access_end(hal_soc_handle_t soc, hal_ring_handle_t hal_ring_hdl)
4012*5113495bSYour Name {
4013*5113495bSYour Name 	hal_srng_access_end(soc, hal_ring_hdl);
4014*5113495bSYour Name }
4015*5113495bSYour Name #endif
4016*5113495bSYour Name 
4017*5113495bSYour Name #ifdef WLAN_FEATURE_DP_EVENT_HISTORY
4018*5113495bSYour Name /**
4019*5113495bSYour Name  * dp_srng_access_start() - Wrapper function to log access start of a hal ring
4020*5113495bSYour Name  * @int_ctx: pointer to DP interrupt context. This should not be NULL
4021*5113495bSYour Name  * @dp_soc: DP Soc handle
4022*5113495bSYour Name  * @hal_ring_hdl: opaque pointer to the HAL Rx Error Ring, which will be
4023*5113495bSYour Name  *                serviced
4024*5113495bSYour Name  *
4025*5113495bSYour Name  * Return: 0 on success; error on failure
4026*5113495bSYour Name  */
4027*5113495bSYour Name int dp_srng_access_start(struct dp_intr *int_ctx, struct dp_soc *dp_soc,
4028*5113495bSYour Name 			 hal_ring_handle_t hal_ring_hdl);
4029*5113495bSYour Name 
4030*5113495bSYour Name /**
4031*5113495bSYour Name  * dp_srng_access_end() - Wrapper function to log access end of a hal ring
4032*5113495bSYour Name  * @int_ctx: pointer to DP interrupt context. This should not be NULL
4033*5113495bSYour Name  * @dp_soc: DP Soc handle
4034*5113495bSYour Name  * @hal_ring_hdl: opaque pointer to the HAL Rx Error Ring, which will be
4035*5113495bSYour Name  *                serviced
4036*5113495bSYour Name  *
4037*5113495bSYour Name  * Return: void
4038*5113495bSYour Name  */
4039*5113495bSYour Name void dp_srng_access_end(struct dp_intr *int_ctx, struct dp_soc *dp_soc,
4040*5113495bSYour Name 			hal_ring_handle_t hal_ring_hdl);
4041*5113495bSYour Name 
4042*5113495bSYour Name #else
dp_srng_access_start(struct dp_intr * int_ctx,struct dp_soc * dp_soc,hal_ring_handle_t hal_ring_hdl)4043*5113495bSYour Name static inline int dp_srng_access_start(struct dp_intr *int_ctx,
4044*5113495bSYour Name 				       struct dp_soc *dp_soc,
4045*5113495bSYour Name 				       hal_ring_handle_t hal_ring_hdl)
4046*5113495bSYour Name {
4047*5113495bSYour Name 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
4048*5113495bSYour Name 
4049*5113495bSYour Name 	return dp_hal_srng_access_start(hal_soc, hal_ring_hdl);
4050*5113495bSYour Name }
4051*5113495bSYour Name 
dp_srng_access_end(struct dp_intr * int_ctx,struct dp_soc * dp_soc,hal_ring_handle_t hal_ring_hdl)4052*5113495bSYour Name static inline void dp_srng_access_end(struct dp_intr *int_ctx,
4053*5113495bSYour Name 				      struct dp_soc *dp_soc,
4054*5113495bSYour Name 				      hal_ring_handle_t hal_ring_hdl)
4055*5113495bSYour Name {
4056*5113495bSYour Name 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
4057*5113495bSYour Name 
4058*5113495bSYour Name 	return dp_hal_srng_access_end(hal_soc, hal_ring_hdl);
4059*5113495bSYour Name }
4060*5113495bSYour Name #endif /* WLAN_FEATURE_DP_EVENT_HISTORY */
4061*5113495bSYour Name 
4062*5113495bSYour Name #ifdef QCA_CACHED_RING_DESC
4063*5113495bSYour Name /**
4064*5113495bSYour Name  * dp_srng_dst_get_next() - Wrapper function to get next ring desc
4065*5113495bSYour Name  * @dp_soc: DP Soc handle
4066*5113495bSYour Name  * @hal_ring_hdl: opaque pointer to the HAL Destination Ring
4067*5113495bSYour Name  *
4068*5113495bSYour Name  * Return: HAL ring descriptor
4069*5113495bSYour Name  */
dp_srng_dst_get_next(struct dp_soc * dp_soc,hal_ring_handle_t hal_ring_hdl)4070*5113495bSYour Name static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc,
4071*5113495bSYour Name 					 hal_ring_handle_t hal_ring_hdl)
4072*5113495bSYour Name {
4073*5113495bSYour Name 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
4074*5113495bSYour Name 
4075*5113495bSYour Name 	return hal_srng_dst_get_next_cached(hal_soc, hal_ring_hdl);
4076*5113495bSYour Name }
4077*5113495bSYour Name 
4078*5113495bSYour Name /**
4079*5113495bSYour Name  * dp_srng_dst_inv_cached_descs() - Wrapper function to invalidate cached
4080*5113495bSYour Name  * descriptors
4081*5113495bSYour Name  * @dp_soc: DP Soc handle
4082*5113495bSYour Name  * @hal_ring_hdl: opaque pointer to the HAL Rx Destination ring
4083*5113495bSYour Name  * @num_entries: Entry count
4084*5113495bSYour Name  *
4085*5113495bSYour Name  * Return: HAL ring descriptor
4086*5113495bSYour Name  */
dp_srng_dst_inv_cached_descs(struct dp_soc * dp_soc,hal_ring_handle_t hal_ring_hdl,uint32_t num_entries)4087*5113495bSYour Name static inline void *dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc,
4088*5113495bSYour Name 						 hal_ring_handle_t hal_ring_hdl,
4089*5113495bSYour Name 						 uint32_t num_entries)
4090*5113495bSYour Name {
4091*5113495bSYour Name 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
4092*5113495bSYour Name 
4093*5113495bSYour Name 	return hal_srng_dst_inv_cached_descs(hal_soc, hal_ring_hdl,
4094*5113495bSYour Name 					     num_entries);
4095*5113495bSYour Name }
4096*5113495bSYour Name #else
dp_srng_dst_get_next(struct dp_soc * dp_soc,hal_ring_handle_t hal_ring_hdl)4097*5113495bSYour Name static inline void *dp_srng_dst_get_next(struct dp_soc *dp_soc,
4098*5113495bSYour Name 					 hal_ring_handle_t hal_ring_hdl)
4099*5113495bSYour Name {
4100*5113495bSYour Name 	hal_soc_handle_t hal_soc = dp_soc->hal_soc;
4101*5113495bSYour Name 
4102*5113495bSYour Name 	return hal_srng_dst_get_next(hal_soc, hal_ring_hdl);
4103*5113495bSYour Name }
4104*5113495bSYour Name 
dp_srng_dst_inv_cached_descs(struct dp_soc * dp_soc,hal_ring_handle_t hal_ring_hdl,uint32_t num_entries)4105*5113495bSYour Name static inline void *dp_srng_dst_inv_cached_descs(struct dp_soc *dp_soc,
4106*5113495bSYour Name 						 hal_ring_handle_t hal_ring_hdl,
4107*5113495bSYour Name 						 uint32_t num_entries)
4108*5113495bSYour Name {
4109*5113495bSYour Name 	return NULL;
4110*5113495bSYour Name }
4111*5113495bSYour Name #endif /* QCA_CACHED_RING_DESC */
4112*5113495bSYour Name 
4113*5113495bSYour Name #if defined(QCA_CACHED_RING_DESC) && \
4114*5113495bSYour Name 	(defined(QCA_DP_RX_HW_SW_NBUF_DESC_PREFETCH) || \
4115*5113495bSYour Name 	 defined(QCA_DP_TX_HW_SW_NBUF_DESC_PREFETCH))
4116*5113495bSYour Name /**
4117*5113495bSYour Name  * dp_srng_dst_prefetch() - Wrapper function to prefetch descs from dest ring
4118*5113495bSYour Name  * @hal_soc: HAL SOC handle
4119*5113495bSYour Name  * @hal_ring_hdl: opaque pointer to the HAL Rx Destination ring
4120*5113495bSYour Name  * @num_entries: Entry count
4121*5113495bSYour Name  *
4122*5113495bSYour Name  * Return: None
4123*5113495bSYour Name  */
dp_srng_dst_prefetch(hal_soc_handle_t hal_soc,hal_ring_handle_t hal_ring_hdl,uint32_t num_entries)4124*5113495bSYour Name static inline void *dp_srng_dst_prefetch(hal_soc_handle_t hal_soc,
4125*5113495bSYour Name 					 hal_ring_handle_t hal_ring_hdl,
4126*5113495bSYour Name 					 uint32_t num_entries)
4127*5113495bSYour Name {
4128*5113495bSYour Name 	return hal_srng_dst_prefetch(hal_soc, hal_ring_hdl, num_entries);
4129*5113495bSYour Name }
4130*5113495bSYour Name 
4131*5113495bSYour Name /**
4132*5113495bSYour Name  * dp_srng_dst_prefetch_32_byte_desc() - Wrapper function to prefetch
4133*5113495bSYour Name  *					 32 byte descriptor starting at
4134*5113495bSYour Name  *					 64 byte offset
4135*5113495bSYour Name  * @hal_soc: HAL SOC handle
4136*5113495bSYour Name  * @hal_ring_hdl: opaque pointer to the HAL Rx Destination ring
4137*5113495bSYour Name  * @num_entries: Entry count
4138*5113495bSYour Name  *
4139*5113495bSYour Name  * Return: None
4140*5113495bSYour Name  */
4141*5113495bSYour Name static inline
dp_srng_dst_prefetch_32_byte_desc(hal_soc_handle_t hal_soc,hal_ring_handle_t hal_ring_hdl,uint32_t num_entries)4142*5113495bSYour Name void *dp_srng_dst_prefetch_32_byte_desc(hal_soc_handle_t hal_soc,
4143*5113495bSYour Name 					hal_ring_handle_t hal_ring_hdl,
4144*5113495bSYour Name 					uint32_t num_entries)
4145*5113495bSYour Name {
4146*5113495bSYour Name 	return hal_srng_dst_prefetch_32_byte_desc(hal_soc, hal_ring_hdl,
4147*5113495bSYour Name 						  num_entries);
4148*5113495bSYour Name }
4149*5113495bSYour Name #else
dp_srng_dst_prefetch(hal_soc_handle_t hal_soc,hal_ring_handle_t hal_ring_hdl,uint32_t num_entries)4150*5113495bSYour Name static inline void *dp_srng_dst_prefetch(hal_soc_handle_t hal_soc,
4151*5113495bSYour Name 					 hal_ring_handle_t hal_ring_hdl,
4152*5113495bSYour Name 					 uint32_t num_entries)
4153*5113495bSYour Name {
4154*5113495bSYour Name 	return NULL;
4155*5113495bSYour Name }
4156*5113495bSYour Name 
4157*5113495bSYour Name static inline
dp_srng_dst_prefetch_32_byte_desc(hal_soc_handle_t hal_soc,hal_ring_handle_t hal_ring_hdl,uint32_t num_entries)4158*5113495bSYour Name void *dp_srng_dst_prefetch_32_byte_desc(hal_soc_handle_t hal_soc,
4159*5113495bSYour Name 					hal_ring_handle_t hal_ring_hdl,
4160*5113495bSYour Name 					uint32_t num_entries)
4161*5113495bSYour Name {
4162*5113495bSYour Name 	return NULL;
4163*5113495bSYour Name }
4164*5113495bSYour Name #endif
4165*5113495bSYour Name 
4166*5113495bSYour Name #ifdef QCA_ENH_V3_STATS_SUPPORT
4167*5113495bSYour Name /**
4168*5113495bSYour Name  * dp_pdev_print_delay_stats(): Print pdev level delay stats
4169*5113495bSYour Name  * @pdev: DP_PDEV handle
4170*5113495bSYour Name  *
4171*5113495bSYour Name  * Return:void
4172*5113495bSYour Name  */
4173*5113495bSYour Name void dp_pdev_print_delay_stats(struct dp_pdev *pdev);
4174*5113495bSYour Name 
4175*5113495bSYour Name /**
4176*5113495bSYour Name  * dp_pdev_print_tid_stats(): Print pdev level tid stats
4177*5113495bSYour Name  * @pdev: DP_PDEV handle
4178*5113495bSYour Name  *
4179*5113495bSYour Name  * Return:void
4180*5113495bSYour Name  */
4181*5113495bSYour Name void dp_pdev_print_tid_stats(struct dp_pdev *pdev);
4182*5113495bSYour Name 
4183*5113495bSYour Name /**
4184*5113495bSYour Name  * dp_pdev_print_rx_error_stats(): Print pdev level rx error stats
4185*5113495bSYour Name  * @pdev: DP_PDEV handle
4186*5113495bSYour Name  *
4187*5113495bSYour Name  * Return:void
4188*5113495bSYour Name  */
4189*5113495bSYour Name void dp_pdev_print_rx_error_stats(struct dp_pdev *pdev);
4190*5113495bSYour Name #endif /* QCA_ENH_V3_STATS_SUPPORT */
4191*5113495bSYour Name 
4192*5113495bSYour Name /**
4193*5113495bSYour Name  * dp_pdev_get_tid_stats(): Get accumulated pdev level tid_stats
4194*5113495bSYour Name  * @soc_hdl: soc handle
4195*5113495bSYour Name  * @pdev_id: id of dp_pdev handle
4196*5113495bSYour Name  * @tid_stats: Pointer for cdp_tid_stats_intf
4197*5113495bSYour Name  *
4198*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS or QDF_STATUS_E_INVAL
4199*5113495bSYour Name  */
4200*5113495bSYour Name QDF_STATUS dp_pdev_get_tid_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
4201*5113495bSYour Name 				 struct cdp_tid_stats_intf *tid_stats);
4202*5113495bSYour Name 
4203*5113495bSYour Name /**
4204*5113495bSYour Name  * dp_soc_set_txrx_ring_map()
4205*5113495bSYour Name  * @soc: DP handler for soc
4206*5113495bSYour Name  *
4207*5113495bSYour Name  * Return: Void
4208*5113495bSYour Name  */
4209*5113495bSYour Name void dp_soc_set_txrx_ring_map(struct dp_soc *soc);
4210*5113495bSYour Name 
4211*5113495bSYour Name /**
4212*5113495bSYour Name  * dp_vdev_to_cdp_vdev() - typecast dp vdev to cdp vdev
4213*5113495bSYour Name  * @vdev: DP vdev handle
4214*5113495bSYour Name  *
4215*5113495bSYour Name  * Return: struct cdp_vdev pointer
4216*5113495bSYour Name  */
4217*5113495bSYour Name static inline
dp_vdev_to_cdp_vdev(struct dp_vdev * vdev)4218*5113495bSYour Name struct cdp_vdev *dp_vdev_to_cdp_vdev(struct dp_vdev *vdev)
4219*5113495bSYour Name {
4220*5113495bSYour Name 	return (struct cdp_vdev *)vdev;
4221*5113495bSYour Name }
4222*5113495bSYour Name 
4223*5113495bSYour Name /**
4224*5113495bSYour Name  * dp_pdev_to_cdp_pdev() - typecast dp pdev to cdp pdev
4225*5113495bSYour Name  * @pdev: DP pdev handle
4226*5113495bSYour Name  *
4227*5113495bSYour Name  * Return: struct cdp_pdev pointer
4228*5113495bSYour Name  */
4229*5113495bSYour Name static inline
dp_pdev_to_cdp_pdev(struct dp_pdev * pdev)4230*5113495bSYour Name struct cdp_pdev *dp_pdev_to_cdp_pdev(struct dp_pdev *pdev)
4231*5113495bSYour Name {
4232*5113495bSYour Name 	return (struct cdp_pdev *)pdev;
4233*5113495bSYour Name }
4234*5113495bSYour Name 
4235*5113495bSYour Name /**
4236*5113495bSYour Name  * dp_soc_to_cdp_soc() - typecast dp psoc to cdp psoc
4237*5113495bSYour Name  * @psoc: DP psoc handle
4238*5113495bSYour Name  *
4239*5113495bSYour Name  * Return: struct cdp_soc pointer
4240*5113495bSYour Name  */
4241*5113495bSYour Name static inline
dp_soc_to_cdp_soc(struct dp_soc * psoc)4242*5113495bSYour Name struct cdp_soc *dp_soc_to_cdp_soc(struct dp_soc *psoc)
4243*5113495bSYour Name {
4244*5113495bSYour Name 	return (struct cdp_soc *)psoc;
4245*5113495bSYour Name }
4246*5113495bSYour Name 
4247*5113495bSYour Name /**
4248*5113495bSYour Name  * dp_soc_to_cdp_soc_t() - typecast dp psoc to ol txrx soc handle
4249*5113495bSYour Name  * @psoc: DP psoc handle
4250*5113495bSYour Name  *
4251*5113495bSYour Name  * Return: struct cdp_soc_t pointer
4252*5113495bSYour Name  */
4253*5113495bSYour Name static inline
dp_soc_to_cdp_soc_t(struct dp_soc * psoc)4254*5113495bSYour Name struct cdp_soc_t *dp_soc_to_cdp_soc_t(struct dp_soc *psoc)
4255*5113495bSYour Name {
4256*5113495bSYour Name 	return (struct cdp_soc_t *)psoc;
4257*5113495bSYour Name }
4258*5113495bSYour Name 
4259*5113495bSYour Name #if defined(WLAN_SUPPORT_RX_FLOW_TAG)
4260*5113495bSYour Name /**
4261*5113495bSYour Name  * dp_rx_flow_get_fse_stats() - Retrieve a flow's statistics
4262*5113495bSYour Name  * @pdev: pdev handle
4263*5113495bSYour Name  * @rx_flow_info: flow information in the Rx FST
4264*5113495bSYour Name  * @stats: stats to update
4265*5113495bSYour Name  *
4266*5113495bSYour Name  * Return: Success when flow statistcs is updated, error on failure
4267*5113495bSYour Name  */
4268*5113495bSYour Name QDF_STATUS dp_rx_flow_get_fse_stats(struct dp_pdev *pdev,
4269*5113495bSYour Name 				    struct cdp_rx_flow_info *rx_flow_info,
4270*5113495bSYour Name 				    struct cdp_flow_stats *stats);
4271*5113495bSYour Name 
4272*5113495bSYour Name /**
4273*5113495bSYour Name  * dp_rx_flow_delete_entry() - Delete a flow entry from flow search table
4274*5113495bSYour Name  * @pdev: pdev handle
4275*5113495bSYour Name  * @rx_flow_info: DP flow parameters
4276*5113495bSYour Name  *
4277*5113495bSYour Name  * Return: Success when flow is deleted, error on failure
4278*5113495bSYour Name  */
4279*5113495bSYour Name QDF_STATUS dp_rx_flow_delete_entry(struct dp_pdev *pdev,
4280*5113495bSYour Name 				   struct cdp_rx_flow_info *rx_flow_info);
4281*5113495bSYour Name 
4282*5113495bSYour Name /**
4283*5113495bSYour Name  * dp_rx_flow_add_entry() - Add a flow entry to flow search table
4284*5113495bSYour Name  * @pdev: DP pdev instance
4285*5113495bSYour Name  * @rx_flow_info: DP flow parameters
4286*5113495bSYour Name  *
4287*5113495bSYour Name  * Return: Success when flow is added, no-memory or already exists on error
4288*5113495bSYour Name  */
4289*5113495bSYour Name QDF_STATUS dp_rx_flow_add_entry(struct dp_pdev *pdev,
4290*5113495bSYour Name 				struct cdp_rx_flow_info *rx_flow_info);
4291*5113495bSYour Name 
4292*5113495bSYour Name /**
4293*5113495bSYour Name  * dp_rx_fst_attach() - Initialize Rx FST and setup necessary parameters
4294*5113495bSYour Name  * @soc: SoC handle
4295*5113495bSYour Name  * @pdev: Pdev handle
4296*5113495bSYour Name  *
4297*5113495bSYour Name  * Return: Handle to flow search table entry
4298*5113495bSYour Name  */
4299*5113495bSYour Name QDF_STATUS dp_rx_fst_attach(struct dp_soc *soc, struct dp_pdev *pdev);
4300*5113495bSYour Name 
4301*5113495bSYour Name /**
4302*5113495bSYour Name  * dp_rx_fst_detach() - De-initialize Rx FST
4303*5113495bSYour Name  * @soc: SoC handle
4304*5113495bSYour Name  * @pdev: Pdev handle
4305*5113495bSYour Name  *
4306*5113495bSYour Name  * Return: None
4307*5113495bSYour Name  */
4308*5113495bSYour Name void dp_rx_fst_detach(struct dp_soc *soc, struct dp_pdev *pdev);
4309*5113495bSYour Name 
4310*5113495bSYour Name /**
4311*5113495bSYour Name  * dp_mon_rx_update_rx_flow_tag_stats() - Update a mon flow's statistics
4312*5113495bSYour Name  * @pdev: pdev handle
4313*5113495bSYour Name  * @flow_id: flow index (truncated hash) in the Rx FST
4314*5113495bSYour Name  *
4315*5113495bSYour Name  * Return: Success when flow statistcs is updated, error on failure
4316*5113495bSYour Name  */
4317*5113495bSYour Name QDF_STATUS
4318*5113495bSYour Name dp_mon_rx_update_rx_flow_tag_stats(struct dp_pdev *pdev, uint32_t flow_id);
4319*5113495bSYour Name #endif
4320*5113495bSYour Name 
4321*5113495bSYour Name #ifdef WLAN_SUPPORT_RX_FLOW_TAG
4322*5113495bSYour Name /**
4323*5113495bSYour Name  * dp_rx_flow_send_fst_fw_setup() - Program FST parameters in FW/HW post-attach
4324*5113495bSYour Name  * @soc: SoC handle
4325*5113495bSYour Name  * @pdev: Pdev handle
4326*5113495bSYour Name  *
4327*5113495bSYour Name  * Return: Success when fst parameters are programmed in FW, error otherwise
4328*5113495bSYour Name  */
4329*5113495bSYour Name QDF_STATUS dp_rx_flow_send_fst_fw_setup(struct dp_soc *soc,
4330*5113495bSYour Name 					struct dp_pdev *pdev);
4331*5113495bSYour Name #endif
4332*5113495bSYour Name 
4333*5113495bSYour Name /**
4334*5113495bSYour Name  * dp_rx_fst_attach_wrapper() - wrapper API for dp_rx_fst_attach
4335*5113495bSYour Name  * @soc: SoC handle
4336*5113495bSYour Name  * @pdev: Pdev handle
4337*5113495bSYour Name  *
4338*5113495bSYour Name  * Return: Handle to flow search table entry
4339*5113495bSYour Name  */
4340*5113495bSYour Name extern QDF_STATUS
4341*5113495bSYour Name dp_rx_fst_attach_wrapper(struct dp_soc *soc, struct dp_pdev *pdev);
4342*5113495bSYour Name 
4343*5113495bSYour Name /**
4344*5113495bSYour Name  * dp_rx_fst_detach_wrapper() - wrapper API for dp_rx_fst_detach
4345*5113495bSYour Name  * @soc: SoC handle
4346*5113495bSYour Name  * @pdev: Pdev handle
4347*5113495bSYour Name  *
4348*5113495bSYour Name  * Return: None
4349*5113495bSYour Name  */
4350*5113495bSYour Name extern void
4351*5113495bSYour Name dp_rx_fst_detach_wrapper(struct dp_soc *soc, struct dp_pdev *pdev);
4352*5113495bSYour Name 
4353*5113495bSYour Name /**
4354*5113495bSYour Name  * dp_vdev_get_ref() - API to take a reference for VDEV object
4355*5113495bSYour Name  *
4356*5113495bSYour Name  * @soc		: core DP soc context
4357*5113495bSYour Name  * @vdev	: DP vdev
4358*5113495bSYour Name  * @mod_id	: module id
4359*5113495bSYour Name  *
4360*5113495bSYour Name  * Return:	QDF_STATUS_SUCCESS if reference held successfully
4361*5113495bSYour Name  *		else QDF_STATUS_E_INVAL
4362*5113495bSYour Name  */
4363*5113495bSYour Name static inline
dp_vdev_get_ref(struct dp_soc * soc,struct dp_vdev * vdev,enum dp_mod_id mod_id)4364*5113495bSYour Name QDF_STATUS dp_vdev_get_ref(struct dp_soc *soc, struct dp_vdev *vdev,
4365*5113495bSYour Name 			   enum dp_mod_id mod_id)
4366*5113495bSYour Name {
4367*5113495bSYour Name 	if (!qdf_atomic_inc_not_zero(&vdev->ref_cnt))
4368*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
4369*5113495bSYour Name 
4370*5113495bSYour Name 	qdf_atomic_inc(&vdev->mod_refs[mod_id]);
4371*5113495bSYour Name 
4372*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4373*5113495bSYour Name }
4374*5113495bSYour Name 
4375*5113495bSYour Name /**
4376*5113495bSYour Name  * dp_vdev_get_ref_by_id() - Returns vdev object given the vdev id
4377*5113495bSYour Name  * @soc: core DP soc context
4378*5113495bSYour Name  * @vdev_id: vdev id from vdev object can be retrieved
4379*5113495bSYour Name  * @mod_id: module id which is requesting the reference
4380*5113495bSYour Name  *
4381*5113495bSYour Name  * Return: struct dp_vdev*: Pointer to DP vdev object
4382*5113495bSYour Name  */
4383*5113495bSYour Name static inline struct dp_vdev *
dp_vdev_get_ref_by_id(struct dp_soc * soc,uint8_t vdev_id,enum dp_mod_id mod_id)4384*5113495bSYour Name dp_vdev_get_ref_by_id(struct dp_soc *soc, uint8_t vdev_id,
4385*5113495bSYour Name 		      enum dp_mod_id mod_id)
4386*5113495bSYour Name {
4387*5113495bSYour Name 	struct dp_vdev *vdev = NULL;
4388*5113495bSYour Name 	if (qdf_unlikely(vdev_id >= MAX_VDEV_CNT))
4389*5113495bSYour Name 		return NULL;
4390*5113495bSYour Name 
4391*5113495bSYour Name 	qdf_spin_lock_bh(&soc->vdev_map_lock);
4392*5113495bSYour Name 	vdev = soc->vdev_id_map[vdev_id];
4393*5113495bSYour Name 
4394*5113495bSYour Name 	if (!vdev || dp_vdev_get_ref(soc, vdev, mod_id) != QDF_STATUS_SUCCESS) {
4395*5113495bSYour Name 		qdf_spin_unlock_bh(&soc->vdev_map_lock);
4396*5113495bSYour Name 		return NULL;
4397*5113495bSYour Name 	}
4398*5113495bSYour Name 	qdf_spin_unlock_bh(&soc->vdev_map_lock);
4399*5113495bSYour Name 
4400*5113495bSYour Name 	return vdev;
4401*5113495bSYour Name }
4402*5113495bSYour Name 
4403*5113495bSYour Name /**
4404*5113495bSYour Name  * dp_get_pdev_from_soc_pdev_id_wifi3() - Returns pdev object given the pdev id
4405*5113495bSYour Name  * @soc: core DP soc context
4406*5113495bSYour Name  * @pdev_id: pdev id from pdev object can be retrieved
4407*5113495bSYour Name  *
4408*5113495bSYour Name  * Return: struct dp_pdev*: Pointer to DP pdev object
4409*5113495bSYour Name  */
4410*5113495bSYour Name static inline struct dp_pdev *
dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc * soc,uint8_t pdev_id)4411*5113495bSYour Name dp_get_pdev_from_soc_pdev_id_wifi3(struct dp_soc *soc,
4412*5113495bSYour Name 				   uint8_t pdev_id)
4413*5113495bSYour Name {
4414*5113495bSYour Name 	if (qdf_unlikely(pdev_id >= MAX_PDEV_CNT))
4415*5113495bSYour Name 		return NULL;
4416*5113495bSYour Name 
4417*5113495bSYour Name 	return soc->pdev_list[pdev_id];
4418*5113495bSYour Name }
4419*5113495bSYour Name 
4420*5113495bSYour Name /**
4421*5113495bSYour Name  * dp_get_peer_mac_list(): function to get peer mac list of vdev
4422*5113495bSYour Name  * @soc: Datapath soc handle
4423*5113495bSYour Name  * @vdev_id: vdev id
4424*5113495bSYour Name  * @newmac: Table of the clients mac
4425*5113495bSYour Name  * @mac_cnt: No. of MACs required
4426*5113495bSYour Name  * @limit: Limit the number of clients
4427*5113495bSYour Name  *
4428*5113495bSYour Name  * Return: no of clients
4429*5113495bSYour Name  */
4430*5113495bSYour Name uint16_t dp_get_peer_mac_list(ol_txrx_soc_handle soc, uint8_t vdev_id,
4431*5113495bSYour Name 			      u_int8_t newmac[][QDF_MAC_ADDR_SIZE],
4432*5113495bSYour Name 			      u_int16_t mac_cnt, bool limit);
4433*5113495bSYour Name 
4434*5113495bSYour Name /**
4435*5113495bSYour Name  * dp_update_num_mac_rings_for_dbs() - Update No of MAC rings based on
4436*5113495bSYour Name  *				       DBS check
4437*5113495bSYour Name  * @soc: DP SoC context
4438*5113495bSYour Name  * @max_mac_rings: Pointer to variable for No of MAC rings
4439*5113495bSYour Name  *
4440*5113495bSYour Name  * Return: None
4441*5113495bSYour Name  */
4442*5113495bSYour Name void dp_update_num_mac_rings_for_dbs(struct dp_soc *soc,
4443*5113495bSYour Name 				     int *max_mac_rings);
4444*5113495bSYour Name 
4445*5113495bSYour Name 
4446*5113495bSYour Name #if defined(WLAN_SUPPORT_RX_FISA)
4447*5113495bSYour Name /**
4448*5113495bSYour Name  * dp_rx_fst_update_cmem_params() - Update CMEM FST params
4449*5113495bSYour Name  * @soc:		DP SoC context
4450*5113495bSYour Name  * @num_entries:	Number of flow search entries
4451*5113495bSYour Name  * @cmem_ba_lo:		CMEM base address low
4452*5113495bSYour Name  * @cmem_ba_hi:		CMEM base address high
4453*5113495bSYour Name  *
4454*5113495bSYour Name  * Return: None
4455*5113495bSYour Name  */
4456*5113495bSYour Name void dp_rx_fst_update_cmem_params(struct dp_soc *soc, uint16_t num_entries,
4457*5113495bSYour Name 				  uint32_t cmem_ba_lo, uint32_t cmem_ba_hi);
4458*5113495bSYour Name 
4459*5113495bSYour Name /**
4460*5113495bSYour Name  * dp_fisa_config() - FISA config handler
4461*5113495bSYour Name  * @cdp_soc: CDP SoC handle
4462*5113495bSYour Name  * @pdev_id: PDEV ID
4463*5113495bSYour Name  * @config_id: FISA config ID
4464*5113495bSYour Name  * @cfg: FISA config msg data
4465*5113495bSYour Name  */
4466*5113495bSYour Name QDF_STATUS dp_fisa_config(ol_txrx_soc_handle cdp_soc, uint8_t pdev_id,
4467*5113495bSYour Name 			  enum cdp_fisa_config_id config_id,
4468*5113495bSYour Name 			  union cdp_fisa_config *cfg);
4469*5113495bSYour Name #else
4470*5113495bSYour Name static inline void
dp_rx_fst_update_cmem_params(struct dp_soc * soc,uint16_t num_entries,uint32_t cmem_ba_lo,uint32_t cmem_ba_hi)4471*5113495bSYour Name dp_rx_fst_update_cmem_params(struct dp_soc *soc, uint16_t num_entries,
4472*5113495bSYour Name 			     uint32_t cmem_ba_lo, uint32_t cmem_ba_hi)
4473*5113495bSYour Name {
4474*5113495bSYour Name }
4475*5113495bSYour Name #endif /* WLAN_SUPPORT_RX_FISA */
4476*5113495bSYour Name 
4477*5113495bSYour Name #ifdef MAX_ALLOC_PAGE_SIZE
4478*5113495bSYour Name /**
4479*5113495bSYour Name  * dp_set_max_page_size() - Set the max page size for hw link desc.
4480*5113495bSYour Name  * @pages: link desc page handle
4481*5113495bSYour Name  * @max_alloc_size: max_alloc_size
4482*5113495bSYour Name  *
4483*5113495bSYour Name  * For MCL the page size is set to OS defined value and for WIN
4484*5113495bSYour Name  * the page size is set to the max_alloc_size cfg ini
4485*5113495bSYour Name  * param.
4486*5113495bSYour Name  * This is to ensure that WIN gets contiguous memory allocations
4487*5113495bSYour Name  * as per requirement.
4488*5113495bSYour Name  *
4489*5113495bSYour Name  * Return: None
4490*5113495bSYour Name  */
4491*5113495bSYour Name static inline
dp_set_max_page_size(struct qdf_mem_multi_page_t * pages,uint32_t max_alloc_size)4492*5113495bSYour Name void dp_set_max_page_size(struct qdf_mem_multi_page_t *pages,
4493*5113495bSYour Name 			  uint32_t max_alloc_size)
4494*5113495bSYour Name {
4495*5113495bSYour Name 	pages->page_size = qdf_page_size;
4496*5113495bSYour Name }
4497*5113495bSYour Name 
4498*5113495bSYour Name #else
4499*5113495bSYour Name static inline
dp_set_max_page_size(struct qdf_mem_multi_page_t * pages,uint32_t max_alloc_size)4500*5113495bSYour Name void dp_set_max_page_size(struct qdf_mem_multi_page_t *pages,
4501*5113495bSYour Name 			  uint32_t max_alloc_size)
4502*5113495bSYour Name {
4503*5113495bSYour Name 	pages->page_size = max_alloc_size;
4504*5113495bSYour Name }
4505*5113495bSYour Name #endif /* MAX_ALLOC_PAGE_SIZE */
4506*5113495bSYour Name 
4507*5113495bSYour Name /**
4508*5113495bSYour Name  * dp_get_next_index() - get the next entry to record an entry
4509*5113495bSYour Name  *			 in the history.
4510*5113495bSYour Name  * @curr_idx: Current index where the last entry is written.
4511*5113495bSYour Name  * @max_entries: Max number of entries in the history
4512*5113495bSYour Name  *
4513*5113495bSYour Name  * This function assumes that the max number os entries is a power of 2.
4514*5113495bSYour Name  *
4515*5113495bSYour Name  * Return: The index where the next entry is to be written.
4516*5113495bSYour Name  */
4517*5113495bSYour Name 
dp_get_next_index(qdf_atomic_t * curr_idx,uint32_t max_entries)4518*5113495bSYour Name static inline uint32_t dp_get_next_index(qdf_atomic_t *curr_idx,
4519*5113495bSYour Name 					 uint32_t max_entries)
4520*5113495bSYour Name {
4521*5113495bSYour Name 	uint32_t idx = qdf_atomic_inc_return(curr_idx);
4522*5113495bSYour Name 
4523*5113495bSYour Name 	return idx & (max_entries - 1);
4524*5113495bSYour Name }
4525*5113495bSYour Name 
4526*5113495bSYour Name /**
4527*5113495bSYour Name  * dp_history_get_next_index() - get the next entry to record an entry
4528*5113495bSYour Name  *				 in the history.
4529*5113495bSYour Name  * @curr_idx: Current index where the last entry is written.
4530*5113495bSYour Name  * @max_entries: Max number of entries in the history
4531*5113495bSYour Name  *
4532*5113495bSYour Name  * This function assumes that the max number os entries is a power of 2.
4533*5113495bSYour Name  *
4534*5113495bSYour Name  * Return: The index where the next entry is to be written.
4535*5113495bSYour Name  */
dp_history_get_next_index(qdf_atomic_t * curr_idx,uint32_t max_entries)4536*5113495bSYour Name static inline uint32_t dp_history_get_next_index(qdf_atomic_t *curr_idx,
4537*5113495bSYour Name 						 uint32_t max_entries)
4538*5113495bSYour Name {
4539*5113495bSYour Name 	return dp_get_next_index(curr_idx, max_entries);
4540*5113495bSYour Name }
4541*5113495bSYour Name 
4542*5113495bSYour Name /**
4543*5113495bSYour Name  * dp_rx_skip_tlvs() - Skip TLVs len + L3 padding, save in nbuf->cb
4544*5113495bSYour Name  * @soc: Datapath soc handle
4545*5113495bSYour Name  * @nbuf: nbuf cb to be updated
4546*5113495bSYour Name  * @l3_padding: L3 padding
4547*5113495bSYour Name  *
4548*5113495bSYour Name  * Return: None
4549*5113495bSYour Name  */
4550*5113495bSYour Name void dp_rx_skip_tlvs(struct dp_soc *soc, qdf_nbuf_t nbuf, uint32_t l3_padding);
4551*5113495bSYour Name 
4552*5113495bSYour Name #ifndef FEATURE_WDS
4553*5113495bSYour Name static inline void
dp_hmwds_ast_add_notify(struct dp_peer * peer,uint8_t * mac_addr,enum cdp_txrx_ast_entry_type type,QDF_STATUS err,bool is_peer_map)4554*5113495bSYour Name dp_hmwds_ast_add_notify(struct dp_peer *peer,
4555*5113495bSYour Name 			uint8_t *mac_addr,
4556*5113495bSYour Name 			enum cdp_txrx_ast_entry_type type,
4557*5113495bSYour Name 			QDF_STATUS err,
4558*5113495bSYour Name 			bool is_peer_map)
4559*5113495bSYour Name {
4560*5113495bSYour Name }
4561*5113495bSYour Name #endif
4562*5113495bSYour Name 
4563*5113495bSYour Name #ifdef HTT_STATS_DEBUGFS_SUPPORT
4564*5113495bSYour Name /**
4565*5113495bSYour Name  * dp_pdev_htt_stats_dbgfs_init() - Function to allocate memory and initialize
4566*5113495bSYour Name  * debugfs for HTT stats
4567*5113495bSYour Name  * @pdev: dp pdev handle
4568*5113495bSYour Name  *
4569*5113495bSYour Name  * Return: QDF_STATUS
4570*5113495bSYour Name  */
4571*5113495bSYour Name QDF_STATUS dp_pdev_htt_stats_dbgfs_init(struct dp_pdev *pdev);
4572*5113495bSYour Name 
4573*5113495bSYour Name /**
4574*5113495bSYour Name  * dp_pdev_htt_stats_dbgfs_deinit() - Function to remove debugfs entry for
4575*5113495bSYour Name  * HTT stats
4576*5113495bSYour Name  * @pdev: dp pdev handle
4577*5113495bSYour Name  *
4578*5113495bSYour Name  * Return: none
4579*5113495bSYour Name  */
4580*5113495bSYour Name void dp_pdev_htt_stats_dbgfs_deinit(struct dp_pdev *pdev);
4581*5113495bSYour Name #else
4582*5113495bSYour Name 
4583*5113495bSYour Name /**
4584*5113495bSYour Name  * dp_pdev_htt_stats_dbgfs_init() - Function to allocate memory and initialize
4585*5113495bSYour Name  * debugfs for HTT stats
4586*5113495bSYour Name  * @pdev: dp pdev handle
4587*5113495bSYour Name  *
4588*5113495bSYour Name  * Return: QDF_STATUS
4589*5113495bSYour Name  */
4590*5113495bSYour Name static inline QDF_STATUS
dp_pdev_htt_stats_dbgfs_init(struct dp_pdev * pdev)4591*5113495bSYour Name dp_pdev_htt_stats_dbgfs_init(struct dp_pdev *pdev)
4592*5113495bSYour Name {
4593*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4594*5113495bSYour Name }
4595*5113495bSYour Name 
4596*5113495bSYour Name /**
4597*5113495bSYour Name  * dp_pdev_htt_stats_dbgfs_deinit() - Function to remove debugfs entry for
4598*5113495bSYour Name  * HTT stats
4599*5113495bSYour Name  * @pdev: dp pdev handle
4600*5113495bSYour Name  *
4601*5113495bSYour Name  * Return: none
4602*5113495bSYour Name  */
4603*5113495bSYour Name static inline void
dp_pdev_htt_stats_dbgfs_deinit(struct dp_pdev * pdev)4604*5113495bSYour Name dp_pdev_htt_stats_dbgfs_deinit(struct dp_pdev *pdev)
4605*5113495bSYour Name {
4606*5113495bSYour Name }
4607*5113495bSYour Name #endif /* HTT_STATS_DEBUGFS_SUPPORT */
4608*5113495bSYour Name 
4609*5113495bSYour Name #ifndef WLAN_DP_FEATURE_SW_LATENCY_MGR
4610*5113495bSYour Name /**
4611*5113495bSYour Name  * dp_soc_swlm_attach() - attach the software latency manager resources
4612*5113495bSYour Name  * @soc: Datapath global soc handle
4613*5113495bSYour Name  *
4614*5113495bSYour Name  * Return: QDF_STATUS
4615*5113495bSYour Name  */
dp_soc_swlm_attach(struct dp_soc * soc)4616*5113495bSYour Name static inline QDF_STATUS dp_soc_swlm_attach(struct dp_soc *soc)
4617*5113495bSYour Name {
4618*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4619*5113495bSYour Name }
4620*5113495bSYour Name 
4621*5113495bSYour Name /**
4622*5113495bSYour Name  * dp_soc_swlm_detach() - detach the software latency manager resources
4623*5113495bSYour Name  * @soc: Datapath global soc handle
4624*5113495bSYour Name  *
4625*5113495bSYour Name  * Return: QDF_STATUS
4626*5113495bSYour Name  */
dp_soc_swlm_detach(struct dp_soc * soc)4627*5113495bSYour Name static inline QDF_STATUS dp_soc_swlm_detach(struct dp_soc *soc)
4628*5113495bSYour Name {
4629*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4630*5113495bSYour Name }
4631*5113495bSYour Name #endif /* !WLAN_DP_FEATURE_SW_LATENCY_MGR */
4632*5113495bSYour Name 
4633*5113495bSYour Name #ifndef WLAN_DP_PROFILE_SUPPORT
wlan_dp_soc_cfg_sync_profile(struct cdp_soc_t * cdp_soc)4634*5113495bSYour Name static inline void wlan_dp_soc_cfg_sync_profile(struct cdp_soc_t *cdp_soc) {}
4635*5113495bSYour Name 
wlan_dp_pdev_cfg_sync_profile(struct cdp_soc_t * cdp_soc,uint8_t pdev_id)4636*5113495bSYour Name static inline void wlan_dp_pdev_cfg_sync_profile(struct cdp_soc_t *cdp_soc,
4637*5113495bSYour Name 						 uint8_t pdev_id) {}
4638*5113495bSYour Name #endif
4639*5113495bSYour Name 
4640*5113495bSYour Name /**
4641*5113495bSYour Name  * dp_get_peer_id(): function to get peer id by mac
4642*5113495bSYour Name  * @soc: Datapath soc handle
4643*5113495bSYour Name  * @vdev_id: vdev id
4644*5113495bSYour Name  * @mac: Peer mac address
4645*5113495bSYour Name  *
4646*5113495bSYour Name  * Return: valid peer id on success
4647*5113495bSYour Name  *         HTT_INVALID_PEER on failure
4648*5113495bSYour Name  */
4649*5113495bSYour Name uint16_t dp_get_peer_id(ol_txrx_soc_handle soc, uint8_t vdev_id, uint8_t *mac);
4650*5113495bSYour Name 
4651*5113495bSYour Name #ifdef QCA_SUPPORT_WDS_EXTENDED
4652*5113495bSYour Name /**
4653*5113495bSYour Name  * dp_wds_ext_set_peer_rx(): function to set peer rx handler
4654*5113495bSYour Name  * @soc: Datapath soc handle
4655*5113495bSYour Name  * @vdev_id: vdev id
4656*5113495bSYour Name  * @mac: Peer mac address
4657*5113495bSYour Name  * @rx: rx function pointer
4658*5113495bSYour Name  * @osif_peer: OSIF peer handle
4659*5113495bSYour Name  *
4660*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success
4661*5113495bSYour Name  *         QDF_STATUS_E_INVAL if peer is not found
4662*5113495bSYour Name  *         QDF_STATUS_E_ALREADY if rx is already set/unset
4663*5113495bSYour Name  */
4664*5113495bSYour Name QDF_STATUS dp_wds_ext_set_peer_rx(ol_txrx_soc_handle soc,
4665*5113495bSYour Name 				  uint8_t vdev_id,
4666*5113495bSYour Name 				  uint8_t *mac,
4667*5113495bSYour Name 				  ol_txrx_rx_fp rx,
4668*5113495bSYour Name 				  ol_osif_peer_handle osif_peer);
4669*5113495bSYour Name 
4670*5113495bSYour Name /**
4671*5113495bSYour Name  * dp_wds_ext_get_peer_osif_handle(): function to get peer osif handle
4672*5113495bSYour Name  * @soc: Datapath soc handle
4673*5113495bSYour Name  * @vdev_id: vdev id
4674*5113495bSYour Name  * @mac: Peer mac address
4675*5113495bSYour Name  * @osif_peer: OSIF peer handle
4676*5113495bSYour Name  *
4677*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success
4678*5113495bSYour Name  *         QDF_STATUS_E_INVAL if peer is not found
4679*5113495bSYour Name  */
4680*5113495bSYour Name QDF_STATUS dp_wds_ext_get_peer_osif_handle(
4681*5113495bSYour Name 				ol_txrx_soc_handle soc,
4682*5113495bSYour Name 				uint8_t vdev_id,
4683*5113495bSYour Name 				uint8_t *mac,
4684*5113495bSYour Name 				ol_osif_peer_handle *osif_peer);
4685*5113495bSYour Name 
4686*5113495bSYour Name /**
4687*5113495bSYour Name  * dp_wds_ext_set_peer_bit(): function to set wds-ext peer bit
4688*5113495bSYour Name  * @soc: Datapath soc handle
4689*5113495bSYour Name  * @mac: Peer mac address
4690*5113495bSYour Name  *
4691*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS on success
4692*5113495bSYour Name  *         QDF_STATUS_E_INVAL if peer is not found
4693*5113495bSYour Name  */
4694*5113495bSYour Name QDF_STATUS dp_wds_ext_set_peer_bit(ol_txrx_soc_handle soc, uint8_t *mac);
4695*5113495bSYour Name 
4696*5113495bSYour Name #endif /* QCA_SUPPORT_WDS_EXTENDED */
4697*5113495bSYour Name 
4698*5113495bSYour Name #ifdef DP_MEM_PRE_ALLOC
4699*5113495bSYour Name 
4700*5113495bSYour Name /**
4701*5113495bSYour Name  * dp_context_alloc_mem() - allocate memory for DP context
4702*5113495bSYour Name  * @soc: datapath soc handle
4703*5113495bSYour Name  * @ctxt_type: DP context type
4704*5113495bSYour Name  * @ctxt_size: DP context size
4705*5113495bSYour Name  *
4706*5113495bSYour Name  * Return: DP context address
4707*5113495bSYour Name  */
4708*5113495bSYour Name void *dp_context_alloc_mem(struct dp_soc *soc, enum dp_ctxt_type ctxt_type,
4709*5113495bSYour Name 			   size_t ctxt_size);
4710*5113495bSYour Name 
4711*5113495bSYour Name /**
4712*5113495bSYour Name  * dp_context_free_mem() - Free memory of DP context
4713*5113495bSYour Name  * @soc: datapath soc handle
4714*5113495bSYour Name  * @ctxt_type: DP context type
4715*5113495bSYour Name  * @vaddr: Address of context memory
4716*5113495bSYour Name  *
4717*5113495bSYour Name  * Return: None
4718*5113495bSYour Name  */
4719*5113495bSYour Name void dp_context_free_mem(struct dp_soc *soc, enum dp_ctxt_type ctxt_type,
4720*5113495bSYour Name 			 void *vaddr);
4721*5113495bSYour Name 
4722*5113495bSYour Name /**
4723*5113495bSYour Name  * dp_desc_multi_pages_mem_alloc() - alloc memory over multiple pages
4724*5113495bSYour Name  * @soc: datapath soc handle
4725*5113495bSYour Name  * @desc_type: memory request source type
4726*5113495bSYour Name  * @pages: multi page information storage
4727*5113495bSYour Name  * @element_size: each element size
4728*5113495bSYour Name  * @element_num: total number of elements should be allocated
4729*5113495bSYour Name  * @memctxt: memory context
4730*5113495bSYour Name  * @cacheable: coherent memory or cacheable memory
4731*5113495bSYour Name  *
4732*5113495bSYour Name  * This function is a wrapper for memory allocation over multiple
4733*5113495bSYour Name  * pages, if dp prealloc method is registered, then will try prealloc
4734*5113495bSYour Name  * firstly. if prealloc failed, fall back to regular way over
4735*5113495bSYour Name  * qdf_mem_multi_pages_alloc().
4736*5113495bSYour Name  *
4737*5113495bSYour Name  * Return: None
4738*5113495bSYour Name  */
4739*5113495bSYour Name void dp_desc_multi_pages_mem_alloc(struct dp_soc *soc,
4740*5113495bSYour Name 				   enum qdf_dp_desc_type desc_type,
4741*5113495bSYour Name 				   struct qdf_mem_multi_page_t *pages,
4742*5113495bSYour Name 				   size_t element_size,
4743*5113495bSYour Name 				   uint32_t element_num,
4744*5113495bSYour Name 				   qdf_dma_context_t memctxt,
4745*5113495bSYour Name 				   bool cacheable);
4746*5113495bSYour Name 
4747*5113495bSYour Name /**
4748*5113495bSYour Name  * dp_desc_multi_pages_mem_free() - free multiple pages memory
4749*5113495bSYour Name  * @soc: datapath soc handle
4750*5113495bSYour Name  * @desc_type: memory request source type
4751*5113495bSYour Name  * @pages: multi page information storage
4752*5113495bSYour Name  * @memctxt: memory context
4753*5113495bSYour Name  * @cacheable: coherent memory or cacheable memory
4754*5113495bSYour Name  *
4755*5113495bSYour Name  * This function is a wrapper for multiple pages memory free,
4756*5113495bSYour Name  * if memory is got from prealloc pool, put it back to pool.
4757*5113495bSYour Name  * otherwise free by qdf_mem_multi_pages_free().
4758*5113495bSYour Name  *
4759*5113495bSYour Name  * Return: None
4760*5113495bSYour Name  */
4761*5113495bSYour Name void dp_desc_multi_pages_mem_free(struct dp_soc *soc,
4762*5113495bSYour Name 				  enum qdf_dp_desc_type desc_type,
4763*5113495bSYour Name 				  struct qdf_mem_multi_page_t *pages,
4764*5113495bSYour Name 				  qdf_dma_context_t memctxt,
4765*5113495bSYour Name 				  bool cacheable);
4766*5113495bSYour Name 
4767*5113495bSYour Name #else
4768*5113495bSYour Name static inline
dp_context_alloc_mem(struct dp_soc * soc,enum dp_ctxt_type ctxt_type,size_t ctxt_size)4769*5113495bSYour Name void *dp_context_alloc_mem(struct dp_soc *soc, enum dp_ctxt_type ctxt_type,
4770*5113495bSYour Name 			   size_t ctxt_size)
4771*5113495bSYour Name {
4772*5113495bSYour Name 	return qdf_mem_malloc(ctxt_size);
4773*5113495bSYour Name }
4774*5113495bSYour Name 
4775*5113495bSYour Name static inline
dp_context_free_mem(struct dp_soc * soc,enum dp_ctxt_type ctxt_type,void * vaddr)4776*5113495bSYour Name void dp_context_free_mem(struct dp_soc *soc, enum dp_ctxt_type ctxt_type,
4777*5113495bSYour Name 			 void *vaddr)
4778*5113495bSYour Name {
4779*5113495bSYour Name 	qdf_mem_free(vaddr);
4780*5113495bSYour Name }
4781*5113495bSYour Name 
4782*5113495bSYour Name static inline
dp_desc_multi_pages_mem_alloc(struct dp_soc * soc,enum qdf_dp_desc_type desc_type,struct qdf_mem_multi_page_t * pages,size_t element_size,uint32_t element_num,qdf_dma_context_t memctxt,bool cacheable)4783*5113495bSYour Name void dp_desc_multi_pages_mem_alloc(struct dp_soc *soc,
4784*5113495bSYour Name 				   enum qdf_dp_desc_type desc_type,
4785*5113495bSYour Name 				   struct qdf_mem_multi_page_t *pages,
4786*5113495bSYour Name 				   size_t element_size,
4787*5113495bSYour Name 				   uint32_t element_num,
4788*5113495bSYour Name 				   qdf_dma_context_t memctxt,
4789*5113495bSYour Name 				   bool cacheable)
4790*5113495bSYour Name {
4791*5113495bSYour Name 	qdf_mem_multi_pages_alloc(soc->osdev, pages, element_size,
4792*5113495bSYour Name 				  element_num, memctxt, cacheable);
4793*5113495bSYour Name }
4794*5113495bSYour Name 
4795*5113495bSYour Name static inline
dp_desc_multi_pages_mem_free(struct dp_soc * soc,enum qdf_dp_desc_type desc_type,struct qdf_mem_multi_page_t * pages,qdf_dma_context_t memctxt,bool cacheable)4796*5113495bSYour Name void dp_desc_multi_pages_mem_free(struct dp_soc *soc,
4797*5113495bSYour Name 				  enum qdf_dp_desc_type desc_type,
4798*5113495bSYour Name 				  struct qdf_mem_multi_page_t *pages,
4799*5113495bSYour Name 				  qdf_dma_context_t memctxt,
4800*5113495bSYour Name 				  bool cacheable)
4801*5113495bSYour Name {
4802*5113495bSYour Name 	qdf_mem_multi_pages_free(soc->osdev, pages,
4803*5113495bSYour Name 				 memctxt, cacheable);
4804*5113495bSYour Name }
4805*5113495bSYour Name #endif
4806*5113495bSYour Name 
4807*5113495bSYour Name /**
4808*5113495bSYour Name  * struct dp_frag_history_opaque_atomic - Opaque struct for adding a fragmented
4809*5113495bSYour Name  *					  history.
4810*5113495bSYour Name  * @index: atomic index
4811*5113495bSYour Name  * @num_entries_per_slot: Number of entries per slot
4812*5113495bSYour Name  * @allocated: is allocated or not
4813*5113495bSYour Name  * @entry: pointers to array of records
4814*5113495bSYour Name  */
4815*5113495bSYour Name struct dp_frag_history_opaque_atomic {
4816*5113495bSYour Name 	qdf_atomic_t index;
4817*5113495bSYour Name 	uint16_t num_entries_per_slot;
4818*5113495bSYour Name 	uint16_t allocated;
4819*5113495bSYour Name 	void *entry[];
4820*5113495bSYour Name };
4821*5113495bSYour Name 
4822*5113495bSYour Name static inline QDF_STATUS
dp_soc_frag_history_attach(struct dp_soc * soc,void * history_hdl,uint32_t max_slots,uint32_t max_entries_per_slot,uint32_t entry_size,bool attempt_prealloc,enum dp_ctxt_type ctxt_type)4823*5113495bSYour Name dp_soc_frag_history_attach(struct dp_soc *soc, void *history_hdl,
4824*5113495bSYour Name 			   uint32_t max_slots, uint32_t max_entries_per_slot,
4825*5113495bSYour Name 			   uint32_t entry_size,
4826*5113495bSYour Name 			   bool attempt_prealloc, enum dp_ctxt_type ctxt_type)
4827*5113495bSYour Name {
4828*5113495bSYour Name 	struct dp_frag_history_opaque_atomic *history =
4829*5113495bSYour Name 			(struct dp_frag_history_opaque_atomic *)history_hdl;
4830*5113495bSYour Name 	size_t alloc_size = max_entries_per_slot * entry_size;
4831*5113495bSYour Name 	int i;
4832*5113495bSYour Name 
4833*5113495bSYour Name 	for (i = 0; i < max_slots; i++) {
4834*5113495bSYour Name 		if (attempt_prealloc)
4835*5113495bSYour Name 			history->entry[i] = dp_context_alloc_mem(soc, ctxt_type,
4836*5113495bSYour Name 								 alloc_size);
4837*5113495bSYour Name 		else
4838*5113495bSYour Name 			history->entry[i] = qdf_mem_malloc(alloc_size);
4839*5113495bSYour Name 
4840*5113495bSYour Name 		if (!history->entry[i])
4841*5113495bSYour Name 			goto exit;
4842*5113495bSYour Name 	}
4843*5113495bSYour Name 
4844*5113495bSYour Name 	qdf_atomic_init(&history->index);
4845*5113495bSYour Name 	history->allocated = 1;
4846*5113495bSYour Name 	history->num_entries_per_slot = max_entries_per_slot;
4847*5113495bSYour Name 
4848*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
4849*5113495bSYour Name exit:
4850*5113495bSYour Name 	for (i = i - 1; i >= 0; i--) {
4851*5113495bSYour Name 		if (attempt_prealloc)
4852*5113495bSYour Name 			dp_context_free_mem(soc, ctxt_type, history->entry[i]);
4853*5113495bSYour Name 		else
4854*5113495bSYour Name 			qdf_mem_free(history->entry[i]);
4855*5113495bSYour Name 	}
4856*5113495bSYour Name 
4857*5113495bSYour Name 	return QDF_STATUS_E_NOMEM;
4858*5113495bSYour Name }
4859*5113495bSYour Name 
4860*5113495bSYour Name static inline
dp_soc_frag_history_detach(struct dp_soc * soc,void * history_hdl,uint32_t max_slots,bool attempt_prealloc,enum dp_ctxt_type ctxt_type)4861*5113495bSYour Name void dp_soc_frag_history_detach(struct dp_soc *soc,
4862*5113495bSYour Name 				void *history_hdl, uint32_t max_slots,
4863*5113495bSYour Name 				bool attempt_prealloc,
4864*5113495bSYour Name 				enum dp_ctxt_type ctxt_type)
4865*5113495bSYour Name {
4866*5113495bSYour Name 	struct dp_frag_history_opaque_atomic *history =
4867*5113495bSYour Name 			(struct dp_frag_history_opaque_atomic *)history_hdl;
4868*5113495bSYour Name 	int i;
4869*5113495bSYour Name 
4870*5113495bSYour Name 	for (i = 0; i < max_slots; i++) {
4871*5113495bSYour Name 		if (attempt_prealloc)
4872*5113495bSYour Name 			dp_context_free_mem(soc, ctxt_type, history->entry[i]);
4873*5113495bSYour Name 		else
4874*5113495bSYour Name 			qdf_mem_free(history->entry[i]);
4875*5113495bSYour Name 	}
4876*5113495bSYour Name 
4877*5113495bSYour Name 	history->allocated = 0;
4878*5113495bSYour Name }
4879*5113495bSYour Name 
4880*5113495bSYour Name /**
4881*5113495bSYour Name  * dp_get_frag_hist_next_atomic_idx() - get the next entry index to record an
4882*5113495bSYour Name  *					entry in a fragmented history with
4883*5113495bSYour Name  *					index being atomic.
4884*5113495bSYour Name  * @curr_idx: address of the current index where the last entry was written
4885*5113495bSYour Name  * @next_idx: pointer to update the next index
4886*5113495bSYour Name  * @slot: pointer to update the history slot to be selected
4887*5113495bSYour Name  * @slot_shift: BITwise shift mask for slot (in index)
4888*5113495bSYour Name  * @max_entries_per_slot: Max number of entries in a slot of history
4889*5113495bSYour Name  * @max_entries: Total number of entries in the history (sum of all slots)
4890*5113495bSYour Name  *
4891*5113495bSYour Name  * This function assumes that the "max_entries_per_slot" and "max_entries"
4892*5113495bSYour Name  * are a power-of-2.
4893*5113495bSYour Name  *
4894*5113495bSYour Name  * Return: None
4895*5113495bSYour Name  */
4896*5113495bSYour Name static inline void
dp_get_frag_hist_next_atomic_idx(qdf_atomic_t * curr_idx,uint32_t * next_idx,uint16_t * slot,uint32_t slot_shift,uint32_t max_entries_per_slot,uint32_t max_entries)4897*5113495bSYour Name dp_get_frag_hist_next_atomic_idx(qdf_atomic_t *curr_idx, uint32_t *next_idx,
4898*5113495bSYour Name 				 uint16_t *slot, uint32_t slot_shift,
4899*5113495bSYour Name 				 uint32_t max_entries_per_slot,
4900*5113495bSYour Name 				 uint32_t max_entries)
4901*5113495bSYour Name {
4902*5113495bSYour Name 	uint32_t idx;
4903*5113495bSYour Name 
4904*5113495bSYour Name 	idx = qdf_do_div_rem(qdf_atomic_inc_return(curr_idx), max_entries);
4905*5113495bSYour Name 
4906*5113495bSYour Name 	*slot = idx >> slot_shift;
4907*5113495bSYour Name 	*next_idx = idx & (max_entries_per_slot - 1);
4908*5113495bSYour Name }
4909*5113495bSYour Name 
4910*5113495bSYour Name #ifdef FEATURE_RUNTIME_PM
4911*5113495bSYour Name /**
4912*5113495bSYour Name  * dp_runtime_get() - Get dp runtime refcount
4913*5113495bSYour Name  * @soc: Datapath soc handle
4914*5113495bSYour Name  *
4915*5113495bSYour Name  * Get dp runtime refcount by increment of an atomic variable, which can block
4916*5113495bSYour Name  * dp runtime resume to wait to flush pending tx by runtime suspend.
4917*5113495bSYour Name  *
4918*5113495bSYour Name  * Return: Current refcount
4919*5113495bSYour Name  */
dp_runtime_get(struct dp_soc * soc)4920*5113495bSYour Name static inline int32_t dp_runtime_get(struct dp_soc *soc)
4921*5113495bSYour Name {
4922*5113495bSYour Name 	return qdf_atomic_inc_return(&soc->dp_runtime_refcount);
4923*5113495bSYour Name }
4924*5113495bSYour Name 
4925*5113495bSYour Name /**
4926*5113495bSYour Name  * dp_runtime_put() - Return dp runtime refcount
4927*5113495bSYour Name  * @soc: Datapath soc handle
4928*5113495bSYour Name  *
4929*5113495bSYour Name  * Return dp runtime refcount by decrement of an atomic variable, allow dp
4930*5113495bSYour Name  * runtime resume finish.
4931*5113495bSYour Name  *
4932*5113495bSYour Name  * Return: Current refcount
4933*5113495bSYour Name  */
dp_runtime_put(struct dp_soc * soc)4934*5113495bSYour Name static inline int32_t dp_runtime_put(struct dp_soc *soc)
4935*5113495bSYour Name {
4936*5113495bSYour Name 	return qdf_atomic_dec_return(&soc->dp_runtime_refcount);
4937*5113495bSYour Name }
4938*5113495bSYour Name 
4939*5113495bSYour Name /**
4940*5113495bSYour Name  * dp_runtime_get_refcount() - Get dp runtime refcount
4941*5113495bSYour Name  * @soc: Datapath soc handle
4942*5113495bSYour Name  *
4943*5113495bSYour Name  * Get dp runtime refcount by returning an atomic variable
4944*5113495bSYour Name  *
4945*5113495bSYour Name  * Return: Current refcount
4946*5113495bSYour Name  */
dp_runtime_get_refcount(struct dp_soc * soc)4947*5113495bSYour Name static inline int32_t dp_runtime_get_refcount(struct dp_soc *soc)
4948*5113495bSYour Name {
4949*5113495bSYour Name 	return qdf_atomic_read(&soc->dp_runtime_refcount);
4950*5113495bSYour Name }
4951*5113495bSYour Name 
4952*5113495bSYour Name /**
4953*5113495bSYour Name  * dp_runtime_init() - Init DP related runtime PM clients and runtime refcount
4954*5113495bSYour Name  * @soc: Datapath soc handle
4955*5113495bSYour Name  *
4956*5113495bSYour Name  * Return: QDF_STATUS
4957*5113495bSYour Name  */
dp_runtime_init(struct dp_soc * soc)4958*5113495bSYour Name static inline void dp_runtime_init(struct dp_soc *soc)
4959*5113495bSYour Name {
4960*5113495bSYour Name 	hif_rtpm_register(HIF_RTPM_ID_DP, NULL);
4961*5113495bSYour Name 	hif_rtpm_register(HIF_RTPM_ID_DP_RING_STATS, NULL);
4962*5113495bSYour Name 	qdf_atomic_init(&soc->dp_runtime_refcount);
4963*5113495bSYour Name }
4964*5113495bSYour Name 
4965*5113495bSYour Name /**
4966*5113495bSYour Name  * dp_runtime_deinit() - Deinit DP related runtime PM clients
4967*5113495bSYour Name  *
4968*5113495bSYour Name  * Return: None
4969*5113495bSYour Name  */
dp_runtime_deinit(void)4970*5113495bSYour Name static inline void dp_runtime_deinit(void)
4971*5113495bSYour Name {
4972*5113495bSYour Name 	hif_rtpm_deregister(HIF_RTPM_ID_DP);
4973*5113495bSYour Name 	hif_rtpm_deregister(HIF_RTPM_ID_DP_RING_STATS);
4974*5113495bSYour Name }
4975*5113495bSYour Name 
4976*5113495bSYour Name /**
4977*5113495bSYour Name  * dp_runtime_pm_mark_last_busy() - Mark last busy when rx path in use
4978*5113495bSYour Name  * @soc: Datapath soc handle
4979*5113495bSYour Name  *
4980*5113495bSYour Name  * Return: None
4981*5113495bSYour Name  */
dp_runtime_pm_mark_last_busy(struct dp_soc * soc)4982*5113495bSYour Name static inline void dp_runtime_pm_mark_last_busy(struct dp_soc *soc)
4983*5113495bSYour Name {
4984*5113495bSYour Name 	soc->rx_last_busy = qdf_get_log_timestamp_usecs();
4985*5113495bSYour Name 
4986*5113495bSYour Name 	hif_rtpm_mark_last_busy(HIF_RTPM_ID_DP);
4987*5113495bSYour Name }
4988*5113495bSYour Name #else
dp_runtime_get(struct dp_soc * soc)4989*5113495bSYour Name static inline int32_t dp_runtime_get(struct dp_soc *soc)
4990*5113495bSYour Name {
4991*5113495bSYour Name 	return 0;
4992*5113495bSYour Name }
4993*5113495bSYour Name 
dp_runtime_put(struct dp_soc * soc)4994*5113495bSYour Name static inline int32_t dp_runtime_put(struct dp_soc *soc)
4995*5113495bSYour Name {
4996*5113495bSYour Name 	return 0;
4997*5113495bSYour Name }
4998*5113495bSYour Name 
dp_runtime_init(struct dp_soc * soc)4999*5113495bSYour Name static inline QDF_STATUS dp_runtime_init(struct dp_soc *soc)
5000*5113495bSYour Name {
5001*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
5002*5113495bSYour Name }
5003*5113495bSYour Name 
dp_runtime_deinit(void)5004*5113495bSYour Name static inline void dp_runtime_deinit(void)
5005*5113495bSYour Name {
5006*5113495bSYour Name }
5007*5113495bSYour Name 
dp_runtime_pm_mark_last_busy(struct dp_soc * soc)5008*5113495bSYour Name static inline void dp_runtime_pm_mark_last_busy(struct dp_soc *soc)
5009*5113495bSYour Name {
5010*5113495bSYour Name }
5011*5113495bSYour Name #endif
5012*5113495bSYour Name 
dp_soc_get_con_mode(struct dp_soc * soc)5013*5113495bSYour Name static inline enum QDF_GLOBAL_MODE dp_soc_get_con_mode(struct dp_soc *soc)
5014*5113495bSYour Name {
5015*5113495bSYour Name 	if (soc->cdp_soc.ol_ops->get_con_mode)
5016*5113495bSYour Name 		return soc->cdp_soc.ol_ops->get_con_mode();
5017*5113495bSYour Name 
5018*5113495bSYour Name 	return QDF_GLOBAL_MAX_MODE;
5019*5113495bSYour Name }
5020*5113495bSYour Name 
5021*5113495bSYour Name /**
5022*5113495bSYour Name  * dp_pdev_bkp_stats_detach() - detach resources for back pressure stats
5023*5113495bSYour Name  *				processing
5024*5113495bSYour Name  * @pdev: Datapath PDEV handle
5025*5113495bSYour Name  *
5026*5113495bSYour Name  */
5027*5113495bSYour Name void dp_pdev_bkp_stats_detach(struct dp_pdev *pdev);
5028*5113495bSYour Name 
5029*5113495bSYour Name /**
5030*5113495bSYour Name  * dp_pdev_bkp_stats_attach() - attach resources for back pressure stats
5031*5113495bSYour Name  *				processing
5032*5113495bSYour Name  * @pdev: Datapath PDEV handle
5033*5113495bSYour Name  *
5034*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5035*5113495bSYour Name  *         QDF_STATUS_E_NOMEM: Error
5036*5113495bSYour Name  */
5037*5113495bSYour Name 
5038*5113495bSYour Name QDF_STATUS dp_pdev_bkp_stats_attach(struct dp_pdev *pdev);
5039*5113495bSYour Name 
5040*5113495bSYour Name /**
5041*5113495bSYour Name  * dp_peer_flush_frags() - Flush all fragments for a particular
5042*5113495bSYour Name  *  peer
5043*5113495bSYour Name  * @soc_hdl: data path soc handle
5044*5113495bSYour Name  * @vdev_id: vdev id
5045*5113495bSYour Name  * @peer_mac: peer mac address
5046*5113495bSYour Name  *
5047*5113495bSYour Name  * Return: None
5048*5113495bSYour Name  */
5049*5113495bSYour Name void dp_peer_flush_frags(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
5050*5113495bSYour Name 			 uint8_t *peer_mac);
5051*5113495bSYour Name 
5052*5113495bSYour Name /**
5053*5113495bSYour Name  * dp_soc_reset_mon_intr_mask() - reset mon intr mask
5054*5113495bSYour Name  * @soc: pointer to dp_soc handle
5055*5113495bSYour Name  *
5056*5113495bSYour Name  * Return:
5057*5113495bSYour Name  */
5058*5113495bSYour Name void dp_soc_reset_mon_intr_mask(struct dp_soc *soc);
5059*5113495bSYour Name 
5060*5113495bSYour Name /**
5061*5113495bSYour Name  * dp_txrx_get_soc_stats() - will return cdp_soc_stats
5062*5113495bSYour Name  * @soc_hdl: soc handle
5063*5113495bSYour Name  * @soc_stats: buffer to hold the values
5064*5113495bSYour Name  *
5065*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5066*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5067*5113495bSYour Name  */
5068*5113495bSYour Name QDF_STATUS dp_txrx_get_soc_stats(struct cdp_soc_t *soc_hdl,
5069*5113495bSYour Name 				 struct cdp_soc_stats *soc_stats);
5070*5113495bSYour Name 
5071*5113495bSYour Name /**
5072*5113495bSYour Name  * dp_txrx_get_peer_delay_stats() - to get peer delay stats per TIDs
5073*5113495bSYour Name  * @soc_hdl: soc handle
5074*5113495bSYour Name  * @vdev_id: id of vdev handle
5075*5113495bSYour Name  * @peer_mac: mac of DP_PEER handle
5076*5113495bSYour Name  * @delay_stats: pointer to delay stats array
5077*5113495bSYour Name  *
5078*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5079*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5080*5113495bSYour Name  */
5081*5113495bSYour Name QDF_STATUS
5082*5113495bSYour Name dp_txrx_get_peer_delay_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
5083*5113495bSYour Name 			     uint8_t *peer_mac,
5084*5113495bSYour Name 			     struct cdp_delay_tid_stats *delay_stats);
5085*5113495bSYour Name 
5086*5113495bSYour Name /**
5087*5113495bSYour Name  * dp_txrx_get_peer_jitter_stats() - to get peer jitter stats per TIDs
5088*5113495bSYour Name  * @soc_hdl: soc handle
5089*5113495bSYour Name  * @pdev_id: id of pdev handle
5090*5113495bSYour Name  * @vdev_id: id of vdev handle
5091*5113495bSYour Name  * @peer_mac: mac of DP_PEER handle
5092*5113495bSYour Name  * @tid_stats: pointer to jitter stats array
5093*5113495bSYour Name  *
5094*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5095*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5096*5113495bSYour Name  */
5097*5113495bSYour Name QDF_STATUS
5098*5113495bSYour Name dp_txrx_get_peer_jitter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5099*5113495bSYour Name 			      uint8_t vdev_id, uint8_t *peer_mac,
5100*5113495bSYour Name 			      struct cdp_peer_tid_stats *tid_stats);
5101*5113495bSYour Name 
5102*5113495bSYour Name /**
5103*5113495bSYour Name  * dp_peer_get_tx_capture_stats() - to get peer Tx Capture stats
5104*5113495bSYour Name  * @soc_hdl: soc handle
5105*5113495bSYour Name  * @vdev_id: id of vdev handle
5106*5113495bSYour Name  * @peer_mac: mac of DP_PEER handle
5107*5113495bSYour Name  * @stats: pointer to peer tx capture stats
5108*5113495bSYour Name  *
5109*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5110*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5111*5113495bSYour Name  */
5112*5113495bSYour Name QDF_STATUS
5113*5113495bSYour Name dp_peer_get_tx_capture_stats(struct cdp_soc_t *soc_hdl,
5114*5113495bSYour Name 			     uint8_t vdev_id, uint8_t *peer_mac,
5115*5113495bSYour Name 			     struct cdp_peer_tx_capture_stats *stats);
5116*5113495bSYour Name 
5117*5113495bSYour Name /**
5118*5113495bSYour Name  * dp_pdev_get_tx_capture_stats() - to get pdev Tx Capture stats
5119*5113495bSYour Name  * @soc_hdl: soc handle
5120*5113495bSYour Name  * @pdev_id: id of pdev handle
5121*5113495bSYour Name  * @stats: pointer to pdev tx capture stats
5122*5113495bSYour Name  *
5123*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5124*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5125*5113495bSYour Name  */
5126*5113495bSYour Name QDF_STATUS
5127*5113495bSYour Name dp_pdev_get_tx_capture_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5128*5113495bSYour Name 			     struct cdp_pdev_tx_capture_stats *stats);
5129*5113495bSYour Name 
5130*5113495bSYour Name #ifdef HW_TX_DELAY_STATS_ENABLE
5131*5113495bSYour Name /**
5132*5113495bSYour Name  * dp_is_vdev_tx_delay_stats_enabled(): Check if tx delay stats
5133*5113495bSYour Name  *  is enabled for vdev
5134*5113495bSYour Name  * @vdev: dp vdev
5135*5113495bSYour Name  *
5136*5113495bSYour Name  * Return: true if tx delay stats is enabled for vdev else false
5137*5113495bSYour Name  */
dp_is_vdev_tx_delay_stats_enabled(struct dp_vdev * vdev)5138*5113495bSYour Name static inline uint8_t dp_is_vdev_tx_delay_stats_enabled(struct dp_vdev *vdev)
5139*5113495bSYour Name {
5140*5113495bSYour Name 	return vdev->hw_tx_delay_stats_enabled;
5141*5113495bSYour Name }
5142*5113495bSYour Name 
5143*5113495bSYour Name /**
5144*5113495bSYour Name  * dp_pdev_print_tx_delay_stats(): Print vdev tx delay stats
5145*5113495bSYour Name  *  for pdev
5146*5113495bSYour Name  * @soc: dp soc
5147*5113495bSYour Name  *
5148*5113495bSYour Name  * Return: None
5149*5113495bSYour Name  */
5150*5113495bSYour Name void dp_pdev_print_tx_delay_stats(struct dp_soc *soc);
5151*5113495bSYour Name 
5152*5113495bSYour Name /**
5153*5113495bSYour Name  * dp_pdev_clear_tx_delay_stats() - clear tx delay stats
5154*5113495bSYour Name  * @soc: soc handle
5155*5113495bSYour Name  *
5156*5113495bSYour Name  * Return: None
5157*5113495bSYour Name  */
5158*5113495bSYour Name void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc);
5159*5113495bSYour Name #else
dp_is_vdev_tx_delay_stats_enabled(struct dp_vdev * vdev)5160*5113495bSYour Name static inline uint8_t dp_is_vdev_tx_delay_stats_enabled(struct dp_vdev *vdev)
5161*5113495bSYour Name {
5162*5113495bSYour Name 	return 0;
5163*5113495bSYour Name }
5164*5113495bSYour Name 
dp_pdev_print_tx_delay_stats(struct dp_soc * soc)5165*5113495bSYour Name static inline void dp_pdev_print_tx_delay_stats(struct dp_soc *soc)
5166*5113495bSYour Name {
5167*5113495bSYour Name }
5168*5113495bSYour Name 
dp_pdev_clear_tx_delay_stats(struct dp_soc * soc)5169*5113495bSYour Name static inline void dp_pdev_clear_tx_delay_stats(struct dp_soc *soc)
5170*5113495bSYour Name {
5171*5113495bSYour Name }
5172*5113495bSYour Name #endif
5173*5113495bSYour Name 
5174*5113495bSYour Name static inline void
dp_get_rx_hash_key_bytes(struct cdp_lro_hash_config * lro_hash)5175*5113495bSYour Name dp_get_rx_hash_key_bytes(struct cdp_lro_hash_config *lro_hash)
5176*5113495bSYour Name {
5177*5113495bSYour Name 	qdf_get_random_bytes(lro_hash->toeplitz_hash_ipv4,
5178*5113495bSYour Name 			     (sizeof(lro_hash->toeplitz_hash_ipv4[0]) *
5179*5113495bSYour Name 			      LRO_IPV4_SEED_ARR_SZ));
5180*5113495bSYour Name 	qdf_get_random_bytes(lro_hash->toeplitz_hash_ipv6,
5181*5113495bSYour Name 			     (sizeof(lro_hash->toeplitz_hash_ipv6[0]) *
5182*5113495bSYour Name 			      LRO_IPV6_SEED_ARR_SZ));
5183*5113495bSYour Name }
5184*5113495bSYour Name 
5185*5113495bSYour Name #ifdef WLAN_CONFIG_TELEMETRY_AGENT
5186*5113495bSYour Name /**
5187*5113495bSYour Name  * dp_get_pdev_telemetry_stats- API to get pdev telemetry stats
5188*5113495bSYour Name  * @soc_hdl: soc handle
5189*5113495bSYour Name  * @pdev_id: id of pdev handle
5190*5113495bSYour Name  * @stats: pointer to pdev telemetry stats
5191*5113495bSYour Name  *
5192*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5193*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5194*5113495bSYour Name  */
5195*5113495bSYour Name QDF_STATUS
5196*5113495bSYour Name dp_get_pdev_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5197*5113495bSYour Name 			    struct cdp_pdev_telemetry_stats *stats);
5198*5113495bSYour Name 
5199*5113495bSYour Name /**
5200*5113495bSYour Name  * dp_get_peer_telemetry_stats() - API to get peer telemetry stats
5201*5113495bSYour Name  * @soc_hdl: soc handle
5202*5113495bSYour Name  * @addr: peer mac
5203*5113495bSYour Name  * @stats: pointer to peer telemetry stats
5204*5113495bSYour Name  *
5205*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5206*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5207*5113495bSYour Name  */
5208*5113495bSYour Name QDF_STATUS
5209*5113495bSYour Name dp_get_peer_telemetry_stats(struct cdp_soc_t *soc_hdl, uint8_t *addr,
5210*5113495bSYour Name 			    struct cdp_peer_telemetry_stats *stats);
5211*5113495bSYour Name 
5212*5113495bSYour Name /**
5213*5113495bSYour Name  * dp_get_peer_deter_stats() - API to get peer deterministic stats
5214*5113495bSYour Name  * @soc_hdl: soc handle
5215*5113495bSYour Name  * @vdev_id: id of vdev handle
5216*5113495bSYour Name  * @addr: peer mac
5217*5113495bSYour Name  * @stats: pointer to peer deterministic stats
5218*5113495bSYour Name  *
5219*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5220*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5221*5113495bSYour Name  */
5222*5113495bSYour Name QDF_STATUS
5223*5113495bSYour Name dp_get_peer_deter_stats(struct cdp_soc_t *soc_hdl,
5224*5113495bSYour Name 			uint8_t vdev_id,
5225*5113495bSYour Name 			uint8_t *addr,
5226*5113495bSYour Name 			struct cdp_peer_deter_stats *stats);
5227*5113495bSYour Name 
5228*5113495bSYour Name /**
5229*5113495bSYour Name  * dp_get_pdev_deter_stats() - API to get pdev deterministic stats
5230*5113495bSYour Name  * @soc_hdl: soc handle
5231*5113495bSYour Name  * @pdev_id: id of pdev handle
5232*5113495bSYour Name  * @stats: pointer to pdev deterministic stats
5233*5113495bSYour Name  *
5234*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5235*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5236*5113495bSYour Name  */
5237*5113495bSYour Name QDF_STATUS
5238*5113495bSYour Name dp_get_pdev_deter_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5239*5113495bSYour Name 			struct cdp_pdev_deter_stats *stats);
5240*5113495bSYour Name 
5241*5113495bSYour Name /**
5242*5113495bSYour Name  * dp_update_pdev_chan_util_stats() - API to update channel utilization stats
5243*5113495bSYour Name  * @soc_hdl: soc handle
5244*5113495bSYour Name  * @pdev_id: id of pdev handle
5245*5113495bSYour Name  * @ch_util: Pointer to channel util stats
5246*5113495bSYour Name  *
5247*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS: Success
5248*5113495bSYour Name  *         QDF_STATUS_E_FAILURE: Error
5249*5113495bSYour Name  */
5250*5113495bSYour Name QDF_STATUS
5251*5113495bSYour Name dp_update_pdev_chan_util_stats(struct cdp_soc_t *soc_hdl, uint8_t pdev_id,
5252*5113495bSYour Name 			       struct cdp_pdev_chan_util_stats *ch_util);
5253*5113495bSYour Name #endif /* WLAN_CONFIG_TELEMETRY_AGENT */
5254*5113495bSYour Name 
5255*5113495bSYour Name #ifdef CONNECTIVITY_PKTLOG
5256*5113495bSYour Name /**
5257*5113495bSYour Name  * dp_tx_send_pktlog() - send tx packet log
5258*5113495bSYour Name  * @soc: soc handle
5259*5113495bSYour Name  * @pdev: pdev handle
5260*5113495bSYour Name  * @tx_desc: TX software descriptor
5261*5113495bSYour Name  * @nbuf: nbuf
5262*5113495bSYour Name  * @status: status of tx packet
5263*5113495bSYour Name  *
5264*5113495bSYour Name  * This function is used to send tx packet for logging
5265*5113495bSYour Name  *
5266*5113495bSYour Name  * Return: None
5267*5113495bSYour Name  *
5268*5113495bSYour Name  */
5269*5113495bSYour Name static inline
dp_tx_send_pktlog(struct dp_soc * soc,struct dp_pdev * pdev,struct dp_tx_desc_s * tx_desc,qdf_nbuf_t nbuf,enum qdf_dp_tx_rx_status status)5270*5113495bSYour Name void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
5271*5113495bSYour Name 		       struct dp_tx_desc_s *tx_desc,
5272*5113495bSYour Name 		       qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status)
5273*5113495bSYour Name {
5274*5113495bSYour Name 	ol_txrx_pktdump_cb packetdump_cb = pdev->dp_tx_packetdump_cb;
5275*5113495bSYour Name 
5276*5113495bSYour Name 	if (qdf_unlikely(packetdump_cb) &&
5277*5113495bSYour Name 	    dp_tx_frm_std == tx_desc->frm_type) {
5278*5113495bSYour Name 		packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id,
5279*5113495bSYour Name 			      tx_desc->vdev_id, nbuf, status, QDF_TX_DATA_PKT);
5280*5113495bSYour Name 	}
5281*5113495bSYour Name }
5282*5113495bSYour Name 
5283*5113495bSYour Name /**
5284*5113495bSYour Name  * dp_rx_send_pktlog() - send rx packet log
5285*5113495bSYour Name  * @soc: soc handle
5286*5113495bSYour Name  * @pdev: pdev handle
5287*5113495bSYour Name  * @nbuf: nbuf
5288*5113495bSYour Name  * @status: status of rx packet
5289*5113495bSYour Name  *
5290*5113495bSYour Name  * This function is used to send rx packet for logging
5291*5113495bSYour Name  *
5292*5113495bSYour Name  * Return: None
5293*5113495bSYour Name  *
5294*5113495bSYour Name  */
5295*5113495bSYour Name static inline
dp_rx_send_pktlog(struct dp_soc * soc,struct dp_pdev * pdev,qdf_nbuf_t nbuf,enum qdf_dp_tx_rx_status status)5296*5113495bSYour Name void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
5297*5113495bSYour Name 		       qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status)
5298*5113495bSYour Name {
5299*5113495bSYour Name 	ol_txrx_pktdump_cb packetdump_cb = pdev->dp_rx_packetdump_cb;
5300*5113495bSYour Name 
5301*5113495bSYour Name 	if (qdf_unlikely(packetdump_cb)) {
5302*5113495bSYour Name 		packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id,
5303*5113495bSYour Name 			      QDF_NBUF_CB_RX_VDEV_ID(nbuf),
5304*5113495bSYour Name 			      nbuf, status, QDF_RX_DATA_PKT);
5305*5113495bSYour Name 	}
5306*5113495bSYour Name }
5307*5113495bSYour Name 
5308*5113495bSYour Name /**
5309*5113495bSYour Name  * dp_rx_err_send_pktlog() - send rx error packet log
5310*5113495bSYour Name  * @soc: soc handle
5311*5113495bSYour Name  * @pdev: pdev handle
5312*5113495bSYour Name  * @mpdu_desc_info: MPDU descriptor info
5313*5113495bSYour Name  * @nbuf: nbuf
5314*5113495bSYour Name  * @status: status of rx packet
5315*5113495bSYour Name  * @set_pktlen: weither to set packet length
5316*5113495bSYour Name  *
5317*5113495bSYour Name  * This API should only be called when we have not removed
5318*5113495bSYour Name  * Rx TLV from head, and head is pointing to rx_tlv
5319*5113495bSYour Name  *
5320*5113495bSYour Name  * This function is used to send rx packet from error path
5321*5113495bSYour Name  * for logging for which rx packet tlv is not removed.
5322*5113495bSYour Name  *
5323*5113495bSYour Name  * Return: None
5324*5113495bSYour Name  *
5325*5113495bSYour Name  */
5326*5113495bSYour Name static inline
dp_rx_err_send_pktlog(struct dp_soc * soc,struct dp_pdev * pdev,struct hal_rx_mpdu_desc_info * mpdu_desc_info,qdf_nbuf_t nbuf,enum qdf_dp_tx_rx_status status,bool set_pktlen)5327*5113495bSYour Name void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
5328*5113495bSYour Name 			   struct hal_rx_mpdu_desc_info *mpdu_desc_info,
5329*5113495bSYour Name 			   qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status,
5330*5113495bSYour Name 			   bool set_pktlen)
5331*5113495bSYour Name {
5332*5113495bSYour Name 	ol_txrx_pktdump_cb packetdump_cb = pdev->dp_rx_packetdump_cb;
5333*5113495bSYour Name 	qdf_size_t skip_size;
5334*5113495bSYour Name 	uint16_t msdu_len, nbuf_len;
5335*5113495bSYour Name 	uint8_t *rx_tlv_hdr;
5336*5113495bSYour Name 	struct hal_rx_msdu_metadata msdu_metadata;
5337*5113495bSYour Name 	uint16_t buf_size;
5338*5113495bSYour Name 
5339*5113495bSYour Name 	buf_size = wlan_cfg_rx_buffer_size(soc->wlan_cfg_ctx);
5340*5113495bSYour Name 
5341*5113495bSYour Name 	if (qdf_unlikely(packetdump_cb)) {
5342*5113495bSYour Name 		rx_tlv_hdr = qdf_nbuf_data(nbuf);
5343*5113495bSYour Name 		nbuf_len = hal_rx_msdu_start_msdu_len_get(soc->hal_soc,
5344*5113495bSYour Name 							  rx_tlv_hdr);
5345*5113495bSYour Name 		hal_rx_msdu_metadata_get(soc->hal_soc, rx_tlv_hdr,
5346*5113495bSYour Name 					 &msdu_metadata);
5347*5113495bSYour Name 
5348*5113495bSYour Name 		if (mpdu_desc_info->bar_frame ||
5349*5113495bSYour Name 		    (mpdu_desc_info->mpdu_flags & HAL_MPDU_F_FRAGMENT))
5350*5113495bSYour Name 			skip_size = soc->rx_pkt_tlv_size;
5351*5113495bSYour Name 		else
5352*5113495bSYour Name 			skip_size = soc->rx_pkt_tlv_size +
5353*5113495bSYour Name 					msdu_metadata.l3_hdr_pad;
5354*5113495bSYour Name 
5355*5113495bSYour Name 		if (set_pktlen) {
5356*5113495bSYour Name 			msdu_len = nbuf_len + skip_size;
5357*5113495bSYour Name 			qdf_nbuf_set_pktlen(nbuf, qdf_min(msdu_len, buf_size));
5358*5113495bSYour Name 		}
5359*5113495bSYour Name 
5360*5113495bSYour Name 		qdf_nbuf_pull_head(nbuf, skip_size);
5361*5113495bSYour Name 		packetdump_cb((ol_txrx_soc_handle)soc, pdev->pdev_id,
5362*5113495bSYour Name 			      QDF_NBUF_CB_RX_VDEV_ID(nbuf),
5363*5113495bSYour Name 			      nbuf, status, QDF_RX_DATA_PKT);
5364*5113495bSYour Name 		qdf_nbuf_push_head(nbuf, skip_size);
5365*5113495bSYour Name 	}
5366*5113495bSYour Name }
5367*5113495bSYour Name 
5368*5113495bSYour Name #else
5369*5113495bSYour Name static inline
dp_tx_send_pktlog(struct dp_soc * soc,struct dp_pdev * pdev,struct dp_tx_desc_s * tx_desc,qdf_nbuf_t nbuf,enum qdf_dp_tx_rx_status status)5370*5113495bSYour Name void dp_tx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
5371*5113495bSYour Name 		       struct dp_tx_desc_s *tx_desc,
5372*5113495bSYour Name 		       qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status)
5373*5113495bSYour Name {
5374*5113495bSYour Name }
5375*5113495bSYour Name 
5376*5113495bSYour Name static inline
dp_rx_send_pktlog(struct dp_soc * soc,struct dp_pdev * pdev,qdf_nbuf_t nbuf,enum qdf_dp_tx_rx_status status)5377*5113495bSYour Name void dp_rx_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
5378*5113495bSYour Name 		       qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status)
5379*5113495bSYour Name {
5380*5113495bSYour Name }
5381*5113495bSYour Name 
5382*5113495bSYour Name static inline
dp_rx_err_send_pktlog(struct dp_soc * soc,struct dp_pdev * pdev,struct hal_rx_mpdu_desc_info * mpdu_desc_info,qdf_nbuf_t nbuf,enum qdf_dp_tx_rx_status status,bool set_pktlen)5383*5113495bSYour Name void dp_rx_err_send_pktlog(struct dp_soc *soc, struct dp_pdev *pdev,
5384*5113495bSYour Name 			   struct hal_rx_mpdu_desc_info *mpdu_desc_info,
5385*5113495bSYour Name 			   qdf_nbuf_t nbuf, enum qdf_dp_tx_rx_status status,
5386*5113495bSYour Name 			   bool set_pktlen)
5387*5113495bSYour Name {
5388*5113495bSYour Name }
5389*5113495bSYour Name #endif
5390*5113495bSYour Name 
5391*5113495bSYour Name /**
5392*5113495bSYour Name  * dp_pdev_update_fast_rx_flag() - Update Fast rx flag for a PDEV
5393*5113495bSYour Name  * @soc  : Data path soc handle
5394*5113495bSYour Name  * @pdev : PDEV handle
5395*5113495bSYour Name  *
5396*5113495bSYour Name  * Return: None
5397*5113495bSYour Name  */
5398*5113495bSYour Name void dp_pdev_update_fast_rx_flag(struct dp_soc *soc, struct dp_pdev *pdev);
5399*5113495bSYour Name 
5400*5113495bSYour Name #ifdef FEATURE_DIRECT_LINK
5401*5113495bSYour Name /**
5402*5113495bSYour Name  * dp_setup_direct_link_refill_ring(): Setup direct link refill ring for pdev
5403*5113495bSYour Name  * @soc_hdl: DP SOC handle
5404*5113495bSYour Name  * @pdev_id: pdev id
5405*5113495bSYour Name  *
5406*5113495bSYour Name  * Return: Handle to SRNG
5407*5113495bSYour Name  */
5408*5113495bSYour Name struct dp_srng *dp_setup_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
5409*5113495bSYour Name 						 uint8_t pdev_id);
5410*5113495bSYour Name 
5411*5113495bSYour Name /**
5412*5113495bSYour Name  * dp_destroy_direct_link_refill_ring(): Destroy direct link refill ring for
5413*5113495bSYour Name  *  pdev
5414*5113495bSYour Name  * @soc_hdl: DP SOC handle
5415*5113495bSYour Name  * @pdev_id: pdev id
5416*5113495bSYour Name  *
5417*5113495bSYour Name  * Return: None
5418*5113495bSYour Name  */
5419*5113495bSYour Name void dp_destroy_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
5420*5113495bSYour Name 					uint8_t pdev_id);
5421*5113495bSYour Name #else
5422*5113495bSYour Name static inline
dp_setup_direct_link_refill_ring(struct cdp_soc_t * soc_hdl,uint8_t pdev_id)5423*5113495bSYour Name struct dp_srng *dp_setup_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
5424*5113495bSYour Name 						 uint8_t pdev_id)
5425*5113495bSYour Name {
5426*5113495bSYour Name 	return NULL;
5427*5113495bSYour Name }
5428*5113495bSYour Name 
5429*5113495bSYour Name static inline
dp_destroy_direct_link_refill_ring(struct cdp_soc_t * soc_hdl,uint8_t pdev_id)5430*5113495bSYour Name void dp_destroy_direct_link_refill_ring(struct cdp_soc_t *soc_hdl,
5431*5113495bSYour Name 					uint8_t pdev_id)
5432*5113495bSYour Name {
5433*5113495bSYour Name }
5434*5113495bSYour Name #endif
5435*5113495bSYour Name 
5436*5113495bSYour Name #ifdef WLAN_FEATURE_DP_CFG_EVENT_HISTORY
5437*5113495bSYour Name static inline
dp_cfg_event_record(struct dp_soc * soc,enum dp_cfg_event_type event,union dp_cfg_event_desc * cfg_event_desc)5438*5113495bSYour Name void dp_cfg_event_record(struct dp_soc *soc,
5439*5113495bSYour Name 			 enum dp_cfg_event_type event,
5440*5113495bSYour Name 			 union dp_cfg_event_desc *cfg_event_desc)
5441*5113495bSYour Name {
5442*5113495bSYour Name 	struct dp_cfg_event_history *cfg_event_history =
5443*5113495bSYour Name 						&soc->cfg_event_history;
5444*5113495bSYour Name 	struct dp_cfg_event *entry;
5445*5113495bSYour Name 	uint32_t idx;
5446*5113495bSYour Name 	uint16_t slot;
5447*5113495bSYour Name 
5448*5113495bSYour Name 	dp_get_frag_hist_next_atomic_idx(&cfg_event_history->index, &idx,
5449*5113495bSYour Name 					 &slot,
5450*5113495bSYour Name 					 DP_CFG_EVT_HIST_SLOT_SHIFT,
5451*5113495bSYour Name 					 DP_CFG_EVT_HIST_PER_SLOT_MAX,
5452*5113495bSYour Name 					 DP_CFG_EVT_HISTORY_SIZE);
5453*5113495bSYour Name 
5454*5113495bSYour Name 	entry = &cfg_event_history->entry[slot][idx];
5455*5113495bSYour Name 
5456*5113495bSYour Name 	entry->timestamp = qdf_get_log_timestamp();
5457*5113495bSYour Name 	entry->type = event;
5458*5113495bSYour Name 	qdf_mem_copy(&entry->event_desc, cfg_event_desc,
5459*5113495bSYour Name 		     sizeof(entry->event_desc));
5460*5113495bSYour Name }
5461*5113495bSYour Name 
5462*5113495bSYour Name static inline void
dp_cfg_event_record_vdev_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_vdev * vdev)5463*5113495bSYour Name dp_cfg_event_record_vdev_evt(struct dp_soc *soc, enum dp_cfg_event_type event,
5464*5113495bSYour Name 			     struct dp_vdev *vdev)
5465*5113495bSYour Name {
5466*5113495bSYour Name 	union dp_cfg_event_desc cfg_evt_desc = {0};
5467*5113495bSYour Name 	struct dp_vdev_attach_detach_desc *vdev_evt =
5468*5113495bSYour Name 						&cfg_evt_desc.vdev_evt;
5469*5113495bSYour Name 
5470*5113495bSYour Name 	if (qdf_unlikely(event != DP_CFG_EVENT_VDEV_ATTACH &&
5471*5113495bSYour Name 			 event != DP_CFG_EVENT_VDEV_UNREF_DEL &&
5472*5113495bSYour Name 			 event != DP_CFG_EVENT_VDEV_DETACH)) {
5473*5113495bSYour Name 		qdf_assert_always(0);
5474*5113495bSYour Name 		return;
5475*5113495bSYour Name 	}
5476*5113495bSYour Name 
5477*5113495bSYour Name 	vdev_evt->vdev = vdev;
5478*5113495bSYour Name 	vdev_evt->vdev_id = vdev->vdev_id;
5479*5113495bSYour Name 	vdev_evt->ref_count = qdf_atomic_read(&vdev->ref_cnt);
5480*5113495bSYour Name 	vdev_evt->mac_addr = vdev->mac_addr;
5481*5113495bSYour Name 
5482*5113495bSYour Name 	dp_cfg_event_record(soc, event, &cfg_evt_desc);
5483*5113495bSYour Name }
5484*5113495bSYour Name 
5485*5113495bSYour Name static inline void
dp_cfg_event_record_peer_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_peer * peer,struct dp_vdev * vdev,uint8_t is_reuse)5486*5113495bSYour Name dp_cfg_event_record_peer_evt(struct dp_soc *soc, enum dp_cfg_event_type event,
5487*5113495bSYour Name 			     struct dp_peer *peer, struct dp_vdev *vdev,
5488*5113495bSYour Name 			     uint8_t is_reuse)
5489*5113495bSYour Name {
5490*5113495bSYour Name 	union dp_cfg_event_desc cfg_evt_desc = {0};
5491*5113495bSYour Name 	struct dp_peer_cmn_ops_desc *peer_evt = &cfg_evt_desc.peer_cmn_evt;
5492*5113495bSYour Name 
5493*5113495bSYour Name 	if (qdf_unlikely(event != DP_CFG_EVENT_PEER_CREATE &&
5494*5113495bSYour Name 			 event != DP_CFG_EVENT_PEER_DELETE &&
5495*5113495bSYour Name 			 event != DP_CFG_EVENT_PEER_UNREF_DEL)) {
5496*5113495bSYour Name 		qdf_assert_always(0);
5497*5113495bSYour Name 		return;
5498*5113495bSYour Name 	}
5499*5113495bSYour Name 
5500*5113495bSYour Name 	peer_evt->peer = peer;
5501*5113495bSYour Name 	peer_evt->vdev = vdev;
5502*5113495bSYour Name 	peer_evt->vdev_id = vdev->vdev_id;
5503*5113495bSYour Name 	peer_evt->is_reuse = is_reuse;
5504*5113495bSYour Name 	peer_evt->peer_ref_count = qdf_atomic_read(&peer->ref_cnt);
5505*5113495bSYour Name 	peer_evt->vdev_ref_count = qdf_atomic_read(&vdev->ref_cnt);
5506*5113495bSYour Name 	peer_evt->mac_addr = peer->mac_addr;
5507*5113495bSYour Name 	peer_evt->vdev_mac_addr = vdev->mac_addr;
5508*5113495bSYour Name 
5509*5113495bSYour Name 	dp_cfg_event_record(soc, event, &cfg_evt_desc);
5510*5113495bSYour Name }
5511*5113495bSYour Name 
5512*5113495bSYour Name static inline void
dp_cfg_event_record_mlo_link_delink_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_peer * mld_peer,struct dp_peer * link_peer,uint8_t idx,uint8_t result)5513*5113495bSYour Name dp_cfg_event_record_mlo_link_delink_evt(struct dp_soc *soc,
5514*5113495bSYour Name 					enum dp_cfg_event_type event,
5515*5113495bSYour Name 					struct dp_peer *mld_peer,
5516*5113495bSYour Name 					struct dp_peer *link_peer,
5517*5113495bSYour Name 					uint8_t idx, uint8_t result)
5518*5113495bSYour Name {
5519*5113495bSYour Name 	union dp_cfg_event_desc cfg_evt_desc = {0};
5520*5113495bSYour Name 	struct dp_mlo_add_del_link_desc *mlo_link_delink_evt =
5521*5113495bSYour Name 					&cfg_evt_desc.mlo_link_delink_evt;
5522*5113495bSYour Name 
5523*5113495bSYour Name 	if (qdf_unlikely(event != DP_CFG_EVENT_MLO_ADD_LINK &&
5524*5113495bSYour Name 			 event != DP_CFG_EVENT_MLO_DEL_LINK)) {
5525*5113495bSYour Name 		qdf_assert_always(0);
5526*5113495bSYour Name 		return;
5527*5113495bSYour Name 	}
5528*5113495bSYour Name 
5529*5113495bSYour Name 	mlo_link_delink_evt->link_peer = link_peer;
5530*5113495bSYour Name 	mlo_link_delink_evt->mld_peer = mld_peer;
5531*5113495bSYour Name 	mlo_link_delink_evt->link_mac_addr = link_peer->mac_addr;
5532*5113495bSYour Name 	mlo_link_delink_evt->mld_mac_addr = mld_peer->mac_addr;
5533*5113495bSYour Name 	mlo_link_delink_evt->num_links = mld_peer->num_links;
5534*5113495bSYour Name 	mlo_link_delink_evt->action_result = result;
5535*5113495bSYour Name 	mlo_link_delink_evt->idx = idx;
5536*5113495bSYour Name 
5537*5113495bSYour Name 	dp_cfg_event_record(soc, event, &cfg_evt_desc);
5538*5113495bSYour Name }
5539*5113495bSYour Name 
5540*5113495bSYour Name static inline void
dp_cfg_event_record_mlo_setup_vdev_update_evt(struct dp_soc * soc,struct dp_peer * mld_peer,struct dp_vdev * prev_vdev,struct dp_vdev * new_vdev)5541*5113495bSYour Name dp_cfg_event_record_mlo_setup_vdev_update_evt(struct dp_soc *soc,
5542*5113495bSYour Name 					      struct dp_peer *mld_peer,
5543*5113495bSYour Name 					      struct dp_vdev *prev_vdev,
5544*5113495bSYour Name 					      struct dp_vdev *new_vdev)
5545*5113495bSYour Name {
5546*5113495bSYour Name 	union dp_cfg_event_desc cfg_evt_desc = {0};
5547*5113495bSYour Name 	struct dp_mlo_setup_vdev_update_desc *vdev_update_evt =
5548*5113495bSYour Name 					&cfg_evt_desc.mlo_setup_vdev_update;
5549*5113495bSYour Name 
5550*5113495bSYour Name 	vdev_update_evt->mld_peer = mld_peer;
5551*5113495bSYour Name 	vdev_update_evt->prev_vdev = prev_vdev;
5552*5113495bSYour Name 	vdev_update_evt->new_vdev = new_vdev;
5553*5113495bSYour Name 
5554*5113495bSYour Name 	dp_cfg_event_record(soc, DP_CFG_EVENT_MLO_SETUP_VDEV_UPDATE,
5555*5113495bSYour Name 			    &cfg_evt_desc);
5556*5113495bSYour Name }
5557*5113495bSYour Name 
5558*5113495bSYour Name static inline void
dp_cfg_event_record_peer_map_unmap_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_peer * peer,uint8_t * mac_addr,uint8_t is_ml_peer,uint16_t peer_id,uint16_t ml_peer_id,uint16_t hw_peer_id,uint8_t vdev_id)5559*5113495bSYour Name dp_cfg_event_record_peer_map_unmap_evt(struct dp_soc *soc,
5560*5113495bSYour Name 				       enum dp_cfg_event_type event,
5561*5113495bSYour Name 				       struct dp_peer *peer,
5562*5113495bSYour Name 				       uint8_t *mac_addr,
5563*5113495bSYour Name 				       uint8_t is_ml_peer,
5564*5113495bSYour Name 				       uint16_t peer_id, uint16_t ml_peer_id,
5565*5113495bSYour Name 				       uint16_t hw_peer_id, uint8_t vdev_id)
5566*5113495bSYour Name {
5567*5113495bSYour Name 	union dp_cfg_event_desc cfg_evt_desc = {0};
5568*5113495bSYour Name 	struct dp_rx_peer_map_unmap_desc *peer_map_unmap_evt =
5569*5113495bSYour Name 					&cfg_evt_desc.peer_map_unmap_evt;
5570*5113495bSYour Name 
5571*5113495bSYour Name 	if (qdf_unlikely(event != DP_CFG_EVENT_PEER_MAP &&
5572*5113495bSYour Name 			 event != DP_CFG_EVENT_PEER_UNMAP &&
5573*5113495bSYour Name 			 event != DP_CFG_EVENT_MLO_PEER_MAP &&
5574*5113495bSYour Name 			 event != DP_CFG_EVENT_MLO_PEER_UNMAP)) {
5575*5113495bSYour Name 		qdf_assert_always(0);
5576*5113495bSYour Name 		return;
5577*5113495bSYour Name 	}
5578*5113495bSYour Name 
5579*5113495bSYour Name 	peer_map_unmap_evt->peer_id = peer_id;
5580*5113495bSYour Name 	peer_map_unmap_evt->ml_peer_id = ml_peer_id;
5581*5113495bSYour Name 	peer_map_unmap_evt->hw_peer_id = hw_peer_id;
5582*5113495bSYour Name 	peer_map_unmap_evt->vdev_id = vdev_id;
5583*5113495bSYour Name 	/* Peer may be NULL at times, but its not an issue. */
5584*5113495bSYour Name 	peer_map_unmap_evt->peer = peer;
5585*5113495bSYour Name 	peer_map_unmap_evt->is_ml_peer = is_ml_peer;
5586*5113495bSYour Name 	qdf_mem_copy(&peer_map_unmap_evt->mac_addr.raw, mac_addr,
5587*5113495bSYour Name 		     QDF_MAC_ADDR_SIZE);
5588*5113495bSYour Name 
5589*5113495bSYour Name 	dp_cfg_event_record(soc, event, &cfg_evt_desc);
5590*5113495bSYour Name }
5591*5113495bSYour Name 
5592*5113495bSYour Name static inline void
dp_cfg_event_record_peer_setup_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_peer * peer,struct dp_vdev * vdev,uint8_t vdev_id,struct cdp_peer_setup_info * peer_setup_info)5593*5113495bSYour Name dp_cfg_event_record_peer_setup_evt(struct dp_soc *soc,
5594*5113495bSYour Name 				   enum dp_cfg_event_type event,
5595*5113495bSYour Name 				   struct dp_peer *peer,
5596*5113495bSYour Name 				   struct dp_vdev *vdev,
5597*5113495bSYour Name 				   uint8_t vdev_id,
5598*5113495bSYour Name 				   struct cdp_peer_setup_info *peer_setup_info)
5599*5113495bSYour Name {
5600*5113495bSYour Name 	union dp_cfg_event_desc cfg_evt_desc = {0};
5601*5113495bSYour Name 	struct dp_peer_setup_desc *peer_setup_evt =
5602*5113495bSYour Name 					&cfg_evt_desc.peer_setup_evt;
5603*5113495bSYour Name 
5604*5113495bSYour Name 	if (qdf_unlikely(event != DP_CFG_EVENT_PEER_SETUP &&
5605*5113495bSYour Name 			 event != DP_CFG_EVENT_MLO_SETUP)) {
5606*5113495bSYour Name 		qdf_assert_always(0);
5607*5113495bSYour Name 		return;
5608*5113495bSYour Name 	}
5609*5113495bSYour Name 
5610*5113495bSYour Name 	peer_setup_evt->peer = peer;
5611*5113495bSYour Name 	peer_setup_evt->vdev = vdev;
5612*5113495bSYour Name 	if (vdev)
5613*5113495bSYour Name 		peer_setup_evt->vdev_ref_count = qdf_atomic_read(&vdev->ref_cnt);
5614*5113495bSYour Name 	peer_setup_evt->mac_addr = peer->mac_addr;
5615*5113495bSYour Name 	peer_setup_evt->vdev_id = vdev_id;
5616*5113495bSYour Name 	if (peer_setup_info) {
5617*5113495bSYour Name 		peer_setup_evt->is_first_link = peer_setup_info->is_first_link;
5618*5113495bSYour Name 		peer_setup_evt->is_primary_link = peer_setup_info->is_primary_link;
5619*5113495bSYour Name 		qdf_mem_copy(peer_setup_evt->mld_mac_addr.raw,
5620*5113495bSYour Name 			     peer_setup_info->mld_peer_mac,
5621*5113495bSYour Name 			     QDF_MAC_ADDR_SIZE);
5622*5113495bSYour Name 	}
5623*5113495bSYour Name 
5624*5113495bSYour Name 	dp_cfg_event_record(soc, event, &cfg_evt_desc);
5625*5113495bSYour Name }
5626*5113495bSYour Name #else
5627*5113495bSYour Name 
5628*5113495bSYour Name static inline void
dp_cfg_event_record_vdev_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_vdev * vdev)5629*5113495bSYour Name dp_cfg_event_record_vdev_evt(struct dp_soc *soc, enum dp_cfg_event_type event,
5630*5113495bSYour Name 			     struct dp_vdev *vdev)
5631*5113495bSYour Name {
5632*5113495bSYour Name }
5633*5113495bSYour Name 
5634*5113495bSYour Name static inline void
dp_cfg_event_record_peer_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_peer * peer,struct dp_vdev * vdev,uint8_t is_reuse)5635*5113495bSYour Name dp_cfg_event_record_peer_evt(struct dp_soc *soc, enum dp_cfg_event_type event,
5636*5113495bSYour Name 			     struct dp_peer *peer, struct dp_vdev *vdev,
5637*5113495bSYour Name 			     uint8_t is_reuse)
5638*5113495bSYour Name {
5639*5113495bSYour Name }
5640*5113495bSYour Name 
5641*5113495bSYour Name static inline void
dp_cfg_event_record_mlo_link_delink_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_peer * mld_peer,struct dp_peer * link_peer,uint8_t idx,uint8_t result)5642*5113495bSYour Name dp_cfg_event_record_mlo_link_delink_evt(struct dp_soc *soc,
5643*5113495bSYour Name 					enum dp_cfg_event_type event,
5644*5113495bSYour Name 					struct dp_peer *mld_peer,
5645*5113495bSYour Name 					struct dp_peer *link_peer,
5646*5113495bSYour Name 					uint8_t idx, uint8_t result)
5647*5113495bSYour Name {
5648*5113495bSYour Name }
5649*5113495bSYour Name 
5650*5113495bSYour Name static inline void
dp_cfg_event_record_mlo_setup_vdev_update_evt(struct dp_soc * soc,struct dp_peer * mld_peer,struct dp_vdev * prev_vdev,struct dp_vdev * new_vdev)5651*5113495bSYour Name dp_cfg_event_record_mlo_setup_vdev_update_evt(struct dp_soc *soc,
5652*5113495bSYour Name 					      struct dp_peer *mld_peer,
5653*5113495bSYour Name 					      struct dp_vdev *prev_vdev,
5654*5113495bSYour Name 					      struct dp_vdev *new_vdev)
5655*5113495bSYour Name {
5656*5113495bSYour Name }
5657*5113495bSYour Name 
5658*5113495bSYour Name static inline void
dp_cfg_event_record_peer_map_unmap_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_peer * peer,uint8_t * mac_addr,uint8_t is_ml_peer,uint16_t peer_id,uint16_t ml_peer_id,uint16_t hw_peer_id,uint8_t vdev_id)5659*5113495bSYour Name dp_cfg_event_record_peer_map_unmap_evt(struct dp_soc *soc,
5660*5113495bSYour Name 				       enum dp_cfg_event_type event,
5661*5113495bSYour Name 				       struct dp_peer *peer,
5662*5113495bSYour Name 				       uint8_t *mac_addr,
5663*5113495bSYour Name 				       uint8_t is_ml_peer,
5664*5113495bSYour Name 				       uint16_t peer_id, uint16_t ml_peer_id,
5665*5113495bSYour Name 				       uint16_t hw_peer_id, uint8_t vdev_id)
5666*5113495bSYour Name {
5667*5113495bSYour Name }
5668*5113495bSYour Name 
5669*5113495bSYour Name static inline void
dp_cfg_event_record_peer_setup_evt(struct dp_soc * soc,enum dp_cfg_event_type event,struct dp_peer * peer,struct dp_vdev * vdev,uint8_t vdev_id,struct cdp_peer_setup_info * peer_setup_info)5670*5113495bSYour Name dp_cfg_event_record_peer_setup_evt(struct dp_soc *soc,
5671*5113495bSYour Name 				   enum dp_cfg_event_type event,
5672*5113495bSYour Name 				   struct dp_peer *peer,
5673*5113495bSYour Name 				   struct dp_vdev *vdev,
5674*5113495bSYour Name 				   uint8_t vdev_id,
5675*5113495bSYour Name 				   struct cdp_peer_setup_info *peer_setup_info)
5676*5113495bSYour Name {
5677*5113495bSYour Name }
5678*5113495bSYour Name #endif
5679*5113495bSYour Name 
5680*5113495bSYour Name #ifndef WLAN_SOFTUMAC_SUPPORT
5681*5113495bSYour Name /**
5682*5113495bSYour Name  * dp_soc_interrupt_detach() - Deregister any allocations done for interrupts
5683*5113495bSYour Name  * @txrx_soc: DP SOC handle
5684*5113495bSYour Name  *
5685*5113495bSYour Name  * Return: none
5686*5113495bSYour Name  */
5687*5113495bSYour Name void dp_soc_interrupt_detach(struct cdp_soc_t *txrx_soc);
5688*5113495bSYour Name #endif
5689*5113495bSYour Name 
5690*5113495bSYour Name /**
5691*5113495bSYour Name  * dp_get_peer_stats()- Get peer stats
5692*5113495bSYour Name  * @peer: Datapath peer
5693*5113495bSYour Name  * @peer_stats: buffer for peer stats
5694*5113495bSYour Name  *
5695*5113495bSYour Name  * Return: none
5696*5113495bSYour Name  */
5697*5113495bSYour Name void dp_get_peer_stats(struct dp_peer *peer,
5698*5113495bSYour Name 		       struct cdp_peer_stats *peer_stats);
5699*5113495bSYour Name 
5700*5113495bSYour Name /**
5701*5113495bSYour Name  * dp_get_per_link_peer_stats()- Get per link peer stats
5702*5113495bSYour Name  * @peer: Datapath peer
5703*5113495bSYour Name  * @peer_stats: buffer for peer stats
5704*5113495bSYour Name  * @peer_type: Peer type
5705*5113495bSYour Name  * @num_link: Number of ML links
5706*5113495bSYour Name  *
5707*5113495bSYour Name  * Return: status success/failure
5708*5113495bSYour Name  */
5709*5113495bSYour Name QDF_STATUS dp_get_per_link_peer_stats(struct dp_peer *peer,
5710*5113495bSYour Name 				      struct cdp_peer_stats *peer_stats,
5711*5113495bSYour Name 				      enum cdp_peer_type peer_type,
5712*5113495bSYour Name 				      uint8_t num_link);
5713*5113495bSYour Name /**
5714*5113495bSYour Name  * dp_get_peer_hw_link_id() - get peer hardware link id
5715*5113495bSYour Name  * @soc: soc handle
5716*5113495bSYour Name  * @pdev: data path pdev
5717*5113495bSYour Name  *
5718*5113495bSYour Name  * Return: link_id
5719*5113495bSYour Name  */
5720*5113495bSYour Name static inline int
dp_get_peer_hw_link_id(struct dp_soc * soc,struct dp_pdev * pdev)5721*5113495bSYour Name dp_get_peer_hw_link_id(struct dp_soc *soc,
5722*5113495bSYour Name 		       struct dp_pdev *pdev)
5723*5113495bSYour Name {
5724*5113495bSYour Name 	if (wlan_cfg_is_peer_link_stats_enabled(soc->wlan_cfg_ctx))
5725*5113495bSYour Name 		return ((soc->arch_ops.get_hw_link_id(pdev)) + 1);
5726*5113495bSYour Name 
5727*5113495bSYour Name 	return 0;
5728*5113495bSYour Name }
5729*5113495bSYour Name 
5730*5113495bSYour Name #ifdef QCA_MULTIPASS_SUPPORT
5731*5113495bSYour Name /**
5732*5113495bSYour Name  * dp_tx_remove_vlan_tag() - Remove 4 bytes of vlan tag
5733*5113495bSYour Name  * @vdev: DP vdev handle
5734*5113495bSYour Name  * @nbuf: network buffer
5735*5113495bSYour Name  *
5736*5113495bSYour Name  * Return: void
5737*5113495bSYour Name  */
5738*5113495bSYour Name void dp_tx_remove_vlan_tag(struct dp_vdev *vdev, qdf_nbuf_t nbuf);
5739*5113495bSYour Name #endif
5740*5113495bSYour Name 
5741*5113495bSYour Name /**
5742*5113495bSYour Name  * dp_print_per_link_stats() - Print per link peer stats.
5743*5113495bSYour Name  * @soc_hdl: soc handle.
5744*5113495bSYour Name  * @vdev_id: vdev_id.
5745*5113495bSYour Name  *
5746*5113495bSYour Name  * Return: None.
5747*5113495bSYour Name  */
5748*5113495bSYour Name void dp_print_per_link_stats(struct cdp_soc_t *soc_hdl, uint8_t vdev_id);
5749*5113495bSYour Name 
5750*5113495bSYour Name /**
5751*5113495bSYour Name  * dp_get_ring_stats_from_hal(): get hal level ring pointer values
5752*5113495bSYour Name  * @soc: DP_SOC handle
5753*5113495bSYour Name  * @srng: DP_SRNG handle
5754*5113495bSYour Name  * @ring_type: srng src/dst ring
5755*5113495bSYour Name  * @_tailp: pointer to tail of ring
5756*5113495bSYour Name  * @_headp: pointer to head of ring
5757*5113495bSYour Name  * @_hw_headp: pointer to head of ring in HW
5758*5113495bSYour Name  * @_hw_tailp: pointer to tail of ring in HW
5759*5113495bSYour Name  *
5760*5113495bSYour Name  * Return: void
5761*5113495bSYour Name  */
5762*5113495bSYour Name static inline void
dp_get_ring_stats_from_hal(struct dp_soc * soc,struct dp_srng * srng,enum hal_ring_type ring_type,uint32_t * _tailp,uint32_t * _headp,int32_t * _hw_headp,int32_t * _hw_tailp)5763*5113495bSYour Name dp_get_ring_stats_from_hal(struct dp_soc *soc,  struct dp_srng *srng,
5764*5113495bSYour Name 			   enum hal_ring_type ring_type,
5765*5113495bSYour Name 			   uint32_t *_tailp, uint32_t *_headp,
5766*5113495bSYour Name 			   int32_t *_hw_headp, int32_t *_hw_tailp)
5767*5113495bSYour Name {
5768*5113495bSYour Name 	uint32_t tailp;
5769*5113495bSYour Name 	uint32_t headp;
5770*5113495bSYour Name 	int32_t hw_headp = -1;
5771*5113495bSYour Name 	int32_t hw_tailp = -1;
5772*5113495bSYour Name 	struct hal_soc *hal_soc;
5773*5113495bSYour Name 
5774*5113495bSYour Name 	if (soc && srng && srng->hal_srng) {
5775*5113495bSYour Name 		hal_soc = (struct hal_soc *)soc->hal_soc;
5776*5113495bSYour Name 		hal_get_sw_hptp(soc->hal_soc, srng->hal_srng, &tailp, &headp);
5777*5113495bSYour Name 		*_headp = headp;
5778*5113495bSYour Name 		*_tailp = tailp;
5779*5113495bSYour Name 
5780*5113495bSYour Name 		hal_get_hw_hptp(soc->hal_soc, srng->hal_srng, &hw_headp,
5781*5113495bSYour Name 				&hw_tailp, ring_type);
5782*5113495bSYour Name 		*_hw_headp = hw_headp;
5783*5113495bSYour Name 		*_hw_tailp = hw_tailp;
5784*5113495bSYour Name 	}
5785*5113495bSYour Name }
5786*5113495bSYour Name 
5787*5113495bSYour Name /**
5788*5113495bSYour Name  * dp_update_vdev_be_basic_stats() - Update vdev basic stats
5789*5113495bSYour Name  * @txrx_peer: DP txrx_peer handle
5790*5113495bSYour Name  * @tgtobj: Pointer to buffer for be vdev stats
5791*5113495bSYour Name  *
5792*5113495bSYour Name  * Return: None
5793*5113495bSYour Name  */
5794*5113495bSYour Name void dp_update_vdev_be_basic_stats(struct dp_txrx_peer *txrx_peer,
5795*5113495bSYour Name 				   struct dp_vdev_stats *tgtobj);
5796*5113495bSYour Name 
5797*5113495bSYour Name /**
5798*5113495bSYour Name  * dp_update_vdev_basic_stats() - Update vdev basic stats
5799*5113495bSYour Name  * @txrx_peer: DP txrx_peer handle
5800*5113495bSYour Name  * @tgtobj: Pointer to buffer for vdev stats
5801*5113495bSYour Name  *
5802*5113495bSYour Name  * Return: None
5803*5113495bSYour Name  */
5804*5113495bSYour Name void dp_update_vdev_basic_stats(struct dp_txrx_peer *txrx_peer,
5805*5113495bSYour Name 				struct cdp_vdev_stats *tgtobj);
5806*5113495bSYour Name 
5807*5113495bSYour Name /**
5808*5113495bSYour Name  * dp_get_vdev_stats_for_unmap_peer_legacy() - Update vdev basic stats
5809*5113495bSYour Name  * @vdev: vdev associated with the peer
5810*5113495bSYour Name  * @peer: unmapped peer
5811*5113495bSYour Name  *
5812*5113495bSYour Name  * Return: None
5813*5113495bSYour Name  */
5814*5113495bSYour Name void dp_get_vdev_stats_for_unmap_peer_legacy(struct dp_vdev *vdev,
5815*5113495bSYour Name 					     struct dp_peer *peer);
5816*5113495bSYour Name 
5817*5113495bSYour Name #ifdef WLAN_FEATURE_TX_LATENCY_STATS
5818*5113495bSYour Name /**
5819*5113495bSYour Name  * dp_h2t_tx_latency_stats_cfg_msg_send(): send HTT message for tx latency
5820*5113495bSYour Name  * stats config to FW
5821*5113495bSYour Name  * @dp_soc: DP SOC handle
5822*5113495bSYour Name  * @vdev_id: vdev id
5823*5113495bSYour Name  * @enable: indicates enablement of the feature
5824*5113495bSYour Name  * @period: statistical period for transmit latency in terms of ms
5825*5113495bSYour Name  * @granularity: granularity for tx latency distribution
5826*5113495bSYour Name  *
5827*5113495bSYour Name  * return: QDF STATUS
5828*5113495bSYour Name  */
5829*5113495bSYour Name QDF_STATUS
5830*5113495bSYour Name dp_h2t_tx_latency_stats_cfg_msg_send(struct dp_soc *dp_soc, uint16_t vdev_id,
5831*5113495bSYour Name 				     bool enable, uint32_t period,
5832*5113495bSYour Name 				     uint32_t granularity);
5833*5113495bSYour Name 
5834*5113495bSYour Name /**
5835*5113495bSYour Name  * dp_tx_latency_stats_update_cca() - update transmit latency statistics for
5836*5113495bSYour Name  * CCA
5837*5113495bSYour Name  * @soc: dp soc handle
5838*5113495bSYour Name  * @peer_id: peer id
5839*5113495bSYour Name  * @granularity: granularity of distribution
5840*5113495bSYour Name  * @distribution: distribution of transmit latency statistics
5841*5113495bSYour Name  * @avg: average of CCA latency(in microseconds) within a cycle
5842*5113495bSYour Name  *
5843*5113495bSYour Name  * Return: None
5844*5113495bSYour Name  */
5845*5113495bSYour Name void
5846*5113495bSYour Name dp_tx_latency_stats_update_cca(struct dp_soc *soc, uint16_t peer_id,
5847*5113495bSYour Name 			       uint32_t granularity, uint32_t *distribution,
5848*5113495bSYour Name 			       uint32_t avg);
5849*5113495bSYour Name 
5850*5113495bSYour Name /**
5851*5113495bSYour Name  * dp_tx_latency_stats_report() - report transmit latency statistics for each
5852*5113495bSYour Name  * vdev of specified pdev
5853*5113495bSYour Name  * @soc: dp soc handle
5854*5113495bSYour Name  * @pdev: dp pdev Handle
5855*5113495bSYour Name  *
5856*5113495bSYour Name  * Return: None
5857*5113495bSYour Name  */
5858*5113495bSYour Name void dp_tx_latency_stats_report(struct dp_soc *soc, struct dp_pdev *pdev);
5859*5113495bSYour Name #endif
5860*5113495bSYour Name #ifdef WLAN_FEATURE_SSR_DRIVER_DUMP
5861*5113495bSYour Name /**
5862*5113495bSYour Name  * dp_ssr_dump_srng_register() - Register DP ring with SSR dump.
5863*5113495bSYour Name  * @region_name: ring name to register.
5864*5113495bSYour Name  * @srng: dp srng handler.
5865*5113495bSYour Name  * @num: Ring number
5866*5113495bSYour Name  *
5867*5113495bSYour Name  * num = -1. If there is only single ring
5868*5113495bSYour Name  * num = ring number. If there are multiple rings pass ring number.
5869*5113495bSYour Name  *	e.g. in case of REO pass reo number (0..n).
5870*5113495bSYour Name  *
5871*5113495bSYour Name  * Return: None.
5872*5113495bSYour Name  */
5873*5113495bSYour Name void
5874*5113495bSYour Name dp_ssr_dump_srng_register(char *region_name, struct dp_srng *srng, int num);
5875*5113495bSYour Name 
5876*5113495bSYour Name /**
5877*5113495bSYour Name  * dp_ssr_dump_srng_unregister() - Unegister DP ring with SSR dump.
5878*5113495bSYour Name  * @region_name: ring name to unregister.
5879*5113495bSYour Name  * @num: Ring number
5880*5113495bSYour Name  *
5881*5113495bSYour Name  * num = -1. If there is only single ring
5882*5113495bSYour Name  * num = ring number. If there are multiple rings pass ring number.
5883*5113495bSYour Name  *      e.g. in case of REO pass reo number (0..n).
5884*5113495bSYour Name  *
5885*5113495bSYour Name  * Return: None.
5886*5113495bSYour Name  */
5887*5113495bSYour Name void dp_ssr_dump_srng_unregister(char *region_name, int num);
5888*5113495bSYour Name 
5889*5113495bSYour Name /**
5890*5113495bSYour Name  * dp_ssr_dump_pdev_register() - Register DP Pdev with SSR dump.
5891*5113495bSYour Name  * @pdev: Pdev handle to register.
5892*5113495bSYour Name  * @pdev_id: Pdev ID.
5893*5113495bSYour Name  *
5894*5113495bSYour Name  * Return: None.
5895*5113495bSYour Name  */
5896*5113495bSYour Name void dp_ssr_dump_pdev_register(struct dp_pdev *pdev, uint8_t pdev_id);
5897*5113495bSYour Name 
5898*5113495bSYour Name /**
5899*5113495bSYour Name  * dp_ssr_dump_pdev_unregister() - Unregister DP Pdev with SSR dump.
5900*5113495bSYour Name  * @pdev_id: Pdev ID.
5901*5113495bSYour Name  *
5902*5113495bSYour Name  * Return: None.
5903*5113495bSYour Name  */
5904*5113495bSYour Name void dp_ssr_dump_pdev_unregister(uint8_t pdev_id);
5905*5113495bSYour Name #else
5906*5113495bSYour Name static inline
dp_ssr_dump_srng_register(char * region_name,struct dp_srng * srng,int num)5907*5113495bSYour Name void dp_ssr_dump_srng_register(char *region_name, struct dp_srng *srng, int num)
5908*5113495bSYour Name {
5909*5113495bSYour Name }
5910*5113495bSYour Name 
5911*5113495bSYour Name static inline
dp_ssr_dump_srng_unregister(char * region_name,int num)5912*5113495bSYour Name void dp_ssr_dump_srng_unregister(char *region_name, int num)
5913*5113495bSYour Name {
5914*5113495bSYour Name }
5915*5113495bSYour Name 
5916*5113495bSYour Name static inline
dp_ssr_dump_pdev_register(struct dp_pdev * pdev,uint8_t pdev_id)5917*5113495bSYour Name void dp_ssr_dump_pdev_register(struct dp_pdev *pdev, uint8_t pdev_id)
5918*5113495bSYour Name {
5919*5113495bSYour Name }
5920*5113495bSYour Name 
5921*5113495bSYour Name static inline
dp_ssr_dump_pdev_unregister(uint8_t pdev_id)5922*5113495bSYour Name void dp_ssr_dump_pdev_unregister(uint8_t pdev_id)
5923*5113495bSYour Name {
5924*5113495bSYour Name }
5925*5113495bSYour Name #endif
5926*5113495bSYour Name 
5927*5113495bSYour Name /**
5928*5113495bSYour Name  * dp_get_peer_vdev_roaming_in_progress() - Check if peer's vdev is in roaming
5929*5113495bSYour Name  *					    state.
5930*5113495bSYour Name  * @peer: DP peer handle
5931*5113495bSYour Name  *
5932*5113495bSYour Name  * Return: true if the peer's vdev is in roaming state
5933*5113495bSYour Name  *	   else false.
5934*5113495bSYour Name  */
5935*5113495bSYour Name bool dp_get_peer_vdev_roaming_in_progress(struct dp_peer *peer);
5936*5113495bSYour Name 
5937*5113495bSYour Name #endif /* #ifndef _DP_INTERNAL_H_ */
5938