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