xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/dp_peer.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
3*5113495bSYour Name  * Copyright (c) 2021-2023 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 #ifndef _DP_PEER_H_
20*5113495bSYour Name #define _DP_PEER_H_
21*5113495bSYour Name 
22*5113495bSYour Name #include <qdf_types.h>
23*5113495bSYour Name #include <qdf_lock.h>
24*5113495bSYour Name #include "dp_types.h"
25*5113495bSYour Name #include "dp_internal.h"
26*5113495bSYour Name 
27*5113495bSYour Name #ifdef DUMP_REO_QUEUE_INFO_IN_DDR
28*5113495bSYour Name #include "hal_reo.h"
29*5113495bSYour Name #endif
30*5113495bSYour Name 
31*5113495bSYour Name #define DP_INVALID_PEER_ID 0xffff
32*5113495bSYour Name 
33*5113495bSYour Name #define DP_PEER_MAX_MEC_IDX 1024	/* maximum index for MEC table */
34*5113495bSYour Name #define DP_PEER_MAX_MEC_ENTRY 4096	/* maximum MEC entries in MEC table */
35*5113495bSYour Name 
36*5113495bSYour Name #define DP_FW_PEER_STATS_CMP_TIMEOUT_MSEC 5000
37*5113495bSYour Name 
38*5113495bSYour Name #define DP_PEER_HASH_LOAD_MULT  2
39*5113495bSYour Name #define DP_PEER_HASH_LOAD_SHIFT 0
40*5113495bSYour Name 
41*5113495bSYour Name /* Threshold for peer's cached buf queue beyond which frames are dropped */
42*5113495bSYour Name #define DP_RX_CACHED_BUFQ_THRESH 64
43*5113495bSYour Name 
44*5113495bSYour Name #define dp_peer_alert(params...) QDF_TRACE_FATAL(QDF_MODULE_ID_DP_PEER, params)
45*5113495bSYour Name #define dp_peer_err(params...) QDF_TRACE_ERROR(QDF_MODULE_ID_DP_PEER, params)
46*5113495bSYour Name #define dp_peer_warn(params...) QDF_TRACE_WARN(QDF_MODULE_ID_DP_PEER, params)
47*5113495bSYour Name #define dp_peer_info(params...) \
48*5113495bSYour Name 	__QDF_TRACE_FL(QDF_TRACE_LEVEL_INFO_HIGH, QDF_MODULE_ID_DP_PEER, ## params)
49*5113495bSYour Name #define dp_peer_debug(params...) QDF_TRACE_DEBUG(QDF_MODULE_ID_DP_PEER, params)
50*5113495bSYour Name 
51*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(DP_MLO_LINK_STATS_SUPPORT)
52*5113495bSYour Name /**
53*5113495bSYour Name  * enum dp_bands - WiFi Band
54*5113495bSYour Name  *
55*5113495bSYour Name  * @DP_BAND_INVALID: Invalid band
56*5113495bSYour Name  * @DP_BAND_2GHZ: 2GHz link
57*5113495bSYour Name  * @DP_BAND_5GHZ: 5GHz link
58*5113495bSYour Name  * @DP_BAND_6GHZ: 6GHz link
59*5113495bSYour Name  * @DP_BAND_UNKNOWN: Unknown band
60*5113495bSYour Name  */
61*5113495bSYour Name enum dp_bands {
62*5113495bSYour Name 	DP_BAND_INVALID = 0,
63*5113495bSYour Name 	DP_BAND_2GHZ = 1,
64*5113495bSYour Name 	DP_BAND_5GHZ = 2,
65*5113495bSYour Name 	DP_BAND_6GHZ = 3,
66*5113495bSYour Name 	DP_BAND_UNKNOWN = 4,
67*5113495bSYour Name };
68*5113495bSYour Name 
69*5113495bSYour Name /**
70*5113495bSYour Name  * dp_freq_to_band() - Convert frequency to band
71*5113495bSYour Name  * @freq: peer frequency
72*5113495bSYour Name  *
73*5113495bSYour Name  * Return: band for input frequency
74*5113495bSYour Name  */
75*5113495bSYour Name enum dp_bands dp_freq_to_band(qdf_freq_t freq);
76*5113495bSYour Name #endif
77*5113495bSYour Name 
78*5113495bSYour Name void check_free_list_for_invalid_flush(struct dp_soc *soc);
79*5113495bSYour Name 
80*5113495bSYour Name static inline
add_entry_alloc_list(struct dp_soc * soc,struct dp_rx_tid * rx_tid,struct dp_peer * peer,void * hw_qdesc_vaddr)81*5113495bSYour Name void add_entry_alloc_list(struct dp_soc *soc, struct dp_rx_tid *rx_tid,
82*5113495bSYour Name 			  struct dp_peer *peer, void *hw_qdesc_vaddr)
83*5113495bSYour Name {
84*5113495bSYour Name 	uint32_t max_list_size;
85*5113495bSYour Name 	unsigned long curr_ts = qdf_get_system_timestamp();
86*5113495bSYour Name 	uint32_t qref_index = soc->free_addr_list_idx;
87*5113495bSYour Name 
88*5113495bSYour Name 	max_list_size = soc->wlan_cfg_ctx->qref_control_size;
89*5113495bSYour Name 
90*5113495bSYour Name 	if (max_list_size == 0)
91*5113495bSYour Name 		return;
92*5113495bSYour Name 
93*5113495bSYour Name 	soc->list_qdesc_addr_alloc[qref_index].hw_qdesc_paddr =
94*5113495bSYour Name 							 rx_tid->hw_qdesc_paddr;
95*5113495bSYour Name 	soc->list_qdesc_addr_alloc[qref_index].ts_qdesc_mem_hdl = curr_ts;
96*5113495bSYour Name 	soc->list_qdesc_addr_alloc[qref_index].hw_qdesc_vaddr_align =
97*5113495bSYour Name 								 hw_qdesc_vaddr;
98*5113495bSYour Name 	soc->list_qdesc_addr_alloc[qref_index].hw_qdesc_vaddr_unalign =
99*5113495bSYour Name 					       rx_tid->hw_qdesc_vaddr_unaligned;
100*5113495bSYour Name 	soc->list_qdesc_addr_alloc[qref_index].peer_id = peer->peer_id;
101*5113495bSYour Name 	soc->list_qdesc_addr_alloc[qref_index].tid = rx_tid->tid;
102*5113495bSYour Name 	soc->alloc_addr_list_idx++;
103*5113495bSYour Name 
104*5113495bSYour Name 	if (soc->alloc_addr_list_idx == max_list_size)
105*5113495bSYour Name 		soc->alloc_addr_list_idx = 0;
106*5113495bSYour Name }
107*5113495bSYour Name 
108*5113495bSYour Name static inline
add_entry_free_list(struct dp_soc * soc,struct dp_rx_tid * rx_tid)109*5113495bSYour Name void add_entry_free_list(struct dp_soc *soc, struct dp_rx_tid *rx_tid)
110*5113495bSYour Name {
111*5113495bSYour Name 	uint32_t max_list_size;
112*5113495bSYour Name 	unsigned long curr_ts = qdf_get_system_timestamp();
113*5113495bSYour Name 	uint32_t qref_index = soc->free_addr_list_idx;
114*5113495bSYour Name 
115*5113495bSYour Name 	max_list_size = soc->wlan_cfg_ctx->qref_control_size;
116*5113495bSYour Name 
117*5113495bSYour Name 	if (max_list_size == 0)
118*5113495bSYour Name 		return;
119*5113495bSYour Name 
120*5113495bSYour Name 	soc->list_qdesc_addr_free[qref_index].ts_qdesc_mem_hdl = curr_ts;
121*5113495bSYour Name 	soc->list_qdesc_addr_free[qref_index].hw_qdesc_paddr =
122*5113495bSYour Name 							 rx_tid->hw_qdesc_paddr;
123*5113495bSYour Name 	soc->list_qdesc_addr_free[qref_index].hw_qdesc_vaddr_align =
124*5113495bSYour Name 						 rx_tid->hw_qdesc_vaddr_aligned;
125*5113495bSYour Name 	soc->list_qdesc_addr_free[qref_index].hw_qdesc_vaddr_unalign =
126*5113495bSYour Name 					       rx_tid->hw_qdesc_vaddr_unaligned;
127*5113495bSYour Name 	soc->free_addr_list_idx++;
128*5113495bSYour Name 
129*5113495bSYour Name 	if (soc->free_addr_list_idx == max_list_size)
130*5113495bSYour Name 		soc->free_addr_list_idx = 0;
131*5113495bSYour Name }
132*5113495bSYour Name 
133*5113495bSYour Name static inline
add_entry_write_list(struct dp_soc * soc,struct dp_peer * peer,uint32_t tid)134*5113495bSYour Name void add_entry_write_list(struct dp_soc *soc, struct dp_peer *peer,
135*5113495bSYour Name 			  uint32_t tid)
136*5113495bSYour Name {
137*5113495bSYour Name 	uint32_t max_list_size;
138*5113495bSYour Name 	unsigned long curr_ts = qdf_get_system_timestamp();
139*5113495bSYour Name 
140*5113495bSYour Name 	max_list_size = soc->wlan_cfg_ctx->qref_control_size;
141*5113495bSYour Name 
142*5113495bSYour Name 	if (max_list_size == 0)
143*5113495bSYour Name 		return;
144*5113495bSYour Name 
145*5113495bSYour Name 	soc->reo_write_list[soc->write_paddr_list_idx].ts_qaddr_del = curr_ts;
146*5113495bSYour Name 	soc->reo_write_list[soc->write_paddr_list_idx].peer_id = peer->peer_id;
147*5113495bSYour Name 	soc->reo_write_list[soc->write_paddr_list_idx].paddr =
148*5113495bSYour Name 					       peer->rx_tid[tid].hw_qdesc_paddr;
149*5113495bSYour Name 	soc->reo_write_list[soc->write_paddr_list_idx].tid = tid;
150*5113495bSYour Name 	soc->write_paddr_list_idx++;
151*5113495bSYour Name 
152*5113495bSYour Name 	if (soc->write_paddr_list_idx == max_list_size)
153*5113495bSYour Name 		soc->write_paddr_list_idx = 0;
154*5113495bSYour Name }
155*5113495bSYour Name 
156*5113495bSYour Name #ifdef REO_QDESC_HISTORY
157*5113495bSYour Name enum reo_qdesc_event_type {
158*5113495bSYour Name 	REO_QDESC_UPDATE_CB = 0,
159*5113495bSYour Name 	REO_QDESC_FREE,
160*5113495bSYour Name };
161*5113495bSYour Name 
162*5113495bSYour Name struct reo_qdesc_event {
163*5113495bSYour Name 	qdf_dma_addr_t qdesc_addr;
164*5113495bSYour Name 	uint64_t ts;
165*5113495bSYour Name 	enum reo_qdesc_event_type type;
166*5113495bSYour Name 	uint8_t peer_mac[QDF_MAC_ADDR_SIZE];
167*5113495bSYour Name };
168*5113495bSYour Name #endif
169*5113495bSYour Name 
170*5113495bSYour Name struct ast_del_ctxt {
171*5113495bSYour Name 	bool age;
172*5113495bSYour Name 	int del_count;
173*5113495bSYour Name };
174*5113495bSYour Name 
175*5113495bSYour Name #ifdef QCA_SUPPORT_WDS_EXTENDED
176*5113495bSYour Name /**
177*5113495bSYour Name  * dp_peer_is_wds_ext_peer() - peer is WDS_EXT peer
178*5113495bSYour Name  *
179*5113495bSYour Name  * @peer: DP peer context
180*5113495bSYour Name  *
181*5113495bSYour Name  * This API checks whether the peer is WDS_EXT peer or not
182*5113495bSYour Name  *
183*5113495bSYour Name  * Return: true in the wds_ext peer else flase
184*5113495bSYour Name  */
dp_peer_is_wds_ext_peer(struct dp_txrx_peer * peer)185*5113495bSYour Name static inline bool dp_peer_is_wds_ext_peer(struct dp_txrx_peer *peer)
186*5113495bSYour Name {
187*5113495bSYour Name 	return qdf_atomic_test_bit(WDS_EXT_PEER_INIT_BIT, &peer->wds_ext.init);
188*5113495bSYour Name }
189*5113495bSYour Name #else
dp_peer_is_wds_ext_peer(struct dp_txrx_peer * peer)190*5113495bSYour Name static inline bool dp_peer_is_wds_ext_peer(struct dp_txrx_peer *peer)
191*5113495bSYour Name {
192*5113495bSYour Name 	return false;
193*5113495bSYour Name }
194*5113495bSYour Name #endif
195*5113495bSYour Name 
196*5113495bSYour Name typedef void dp_peer_iter_func(struct dp_soc *soc, struct dp_peer *peer,
197*5113495bSYour Name 			       void *arg);
198*5113495bSYour Name /**
199*5113495bSYour Name  * dp_peer_unref_delete() - unref and delete peer
200*5113495bSYour Name  * @peer: Datapath peer handle
201*5113495bSYour Name  * @id: ID of module releasing reference
202*5113495bSYour Name  *
203*5113495bSYour Name  */
204*5113495bSYour Name void dp_peer_unref_delete(struct dp_peer *peer, enum dp_mod_id id);
205*5113495bSYour Name 
206*5113495bSYour Name /**
207*5113495bSYour Name  * dp_txrx_peer_unref_delete() - unref and delete peer
208*5113495bSYour Name  * @handle: Datapath txrx ref handle
209*5113495bSYour Name  * @id: Module ID of the caller
210*5113495bSYour Name  *
211*5113495bSYour Name  */
212*5113495bSYour Name void dp_txrx_peer_unref_delete(dp_txrx_ref_handle handle, enum dp_mod_id id);
213*5113495bSYour Name 
214*5113495bSYour Name /**
215*5113495bSYour Name  * dp_peer_find_hash_find() - returns legacy or mlo link peer from
216*5113495bSYour Name  *			      peer_hash_table matching vdev_id and mac_address
217*5113495bSYour Name  * @soc: soc handle
218*5113495bSYour Name  * @peer_mac_addr: peer mac address
219*5113495bSYour Name  * @mac_addr_is_aligned: is mac addr aligned
220*5113495bSYour Name  * @vdev_id: vdev_id
221*5113495bSYour Name  * @mod_id: id of module requesting reference
222*5113495bSYour Name  *
223*5113495bSYour Name  * return: peer in success
224*5113495bSYour Name  *         NULL in failure
225*5113495bSYour Name  */
226*5113495bSYour Name struct dp_peer *dp_peer_find_hash_find(struct dp_soc *soc,
227*5113495bSYour Name 				       uint8_t *peer_mac_addr,
228*5113495bSYour Name 				       int mac_addr_is_aligned,
229*5113495bSYour Name 				       uint8_t vdev_id,
230*5113495bSYour Name 				       enum dp_mod_id mod_id);
231*5113495bSYour Name 
232*5113495bSYour Name /**
233*5113495bSYour Name  * dp_peer_find_by_id_valid - check if peer exists for given id
234*5113495bSYour Name  * @soc: core DP soc context
235*5113495bSYour Name  * @peer_id: peer id from peer object can be retrieved
236*5113495bSYour Name  *
237*5113495bSYour Name  * Return: true if peer exists of false otherwise
238*5113495bSYour Name  */
239*5113495bSYour Name bool dp_peer_find_by_id_valid(struct dp_soc *soc, uint16_t peer_id);
240*5113495bSYour Name 
241*5113495bSYour Name /**
242*5113495bSYour Name  * dp_peer_get_ref() - Returns peer object given the peer id
243*5113495bSYour Name  *
244*5113495bSYour Name  * @soc: core DP soc context
245*5113495bSYour Name  * @peer: DP peer
246*5113495bSYour Name  * @mod_id: id of module requesting the reference
247*5113495bSYour Name  *
248*5113495bSYour Name  * Return:	QDF_STATUS_SUCCESS if reference held successfully
249*5113495bSYour Name  *		else QDF_STATUS_E_INVAL
250*5113495bSYour Name  */
251*5113495bSYour Name static inline
dp_peer_get_ref(struct dp_soc * soc,struct dp_peer * peer,enum dp_mod_id mod_id)252*5113495bSYour Name QDF_STATUS dp_peer_get_ref(struct dp_soc *soc,
253*5113495bSYour Name 			   struct dp_peer *peer,
254*5113495bSYour Name 			   enum dp_mod_id mod_id)
255*5113495bSYour Name {
256*5113495bSYour Name 	if (!qdf_atomic_inc_not_zero(&peer->ref_cnt))
257*5113495bSYour Name 		return QDF_STATUS_E_INVAL;
258*5113495bSYour Name 
259*5113495bSYour Name 	if (mod_id > DP_MOD_ID_RX)
260*5113495bSYour Name 		qdf_atomic_inc(&peer->mod_refs[mod_id]);
261*5113495bSYour Name 
262*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
263*5113495bSYour Name }
264*5113495bSYour Name 
265*5113495bSYour Name /**
266*5113495bSYour Name  * __dp_peer_get_ref_by_id() - Returns peer object given the peer id
267*5113495bSYour Name  *
268*5113495bSYour Name  * @soc: core DP soc context
269*5113495bSYour Name  * @peer_id: peer id from peer object can be retrieved
270*5113495bSYour Name  * @mod_id: module id
271*5113495bSYour Name  *
272*5113495bSYour Name  * Return: struct dp_peer*: Pointer to DP peer object
273*5113495bSYour Name  */
274*5113495bSYour Name static inline struct dp_peer *
__dp_peer_get_ref_by_id(struct dp_soc * soc,uint16_t peer_id,enum dp_mod_id mod_id)275*5113495bSYour Name __dp_peer_get_ref_by_id(struct dp_soc *soc,
276*5113495bSYour Name 			uint16_t peer_id,
277*5113495bSYour Name 			enum dp_mod_id mod_id)
278*5113495bSYour Name 
279*5113495bSYour Name {
280*5113495bSYour Name 	struct dp_peer *peer;
281*5113495bSYour Name 
282*5113495bSYour Name 	qdf_spin_lock_bh(&soc->peer_map_lock);
283*5113495bSYour Name 	peer = (peer_id >= soc->max_peer_id) ? NULL :
284*5113495bSYour Name 				soc->peer_id_to_obj_map[peer_id];
285*5113495bSYour Name 	if (!peer ||
286*5113495bSYour Name 	    (dp_peer_get_ref(soc, peer, mod_id) != QDF_STATUS_SUCCESS)) {
287*5113495bSYour Name 		qdf_spin_unlock_bh(&soc->peer_map_lock);
288*5113495bSYour Name 		return NULL;
289*5113495bSYour Name 	}
290*5113495bSYour Name 
291*5113495bSYour Name 	qdf_spin_unlock_bh(&soc->peer_map_lock);
292*5113495bSYour Name 	return peer;
293*5113495bSYour Name }
294*5113495bSYour Name 
295*5113495bSYour Name /**
296*5113495bSYour Name  * dp_peer_get_ref_by_id() - Returns peer object given the peer id
297*5113495bSYour Name  *                        if peer state is active
298*5113495bSYour Name  *
299*5113495bSYour Name  * @soc: core DP soc context
300*5113495bSYour Name  * @peer_id: peer id from peer object can be retrieved
301*5113495bSYour Name  * @mod_id: ID of module requesting reference
302*5113495bSYour Name  *
303*5113495bSYour Name  * Return: struct dp_peer*: Pointer to DP peer object
304*5113495bSYour Name  */
305*5113495bSYour Name static inline
dp_peer_get_ref_by_id(struct dp_soc * soc,uint16_t peer_id,enum dp_mod_id mod_id)306*5113495bSYour Name struct dp_peer *dp_peer_get_ref_by_id(struct dp_soc *soc,
307*5113495bSYour Name 				      uint16_t peer_id,
308*5113495bSYour Name 				      enum dp_mod_id mod_id)
309*5113495bSYour Name {
310*5113495bSYour Name 	struct dp_peer *peer;
311*5113495bSYour Name 
312*5113495bSYour Name 	qdf_spin_lock_bh(&soc->peer_map_lock);
313*5113495bSYour Name 	peer = (peer_id >= soc->max_peer_id) ? NULL :
314*5113495bSYour Name 				soc->peer_id_to_obj_map[peer_id];
315*5113495bSYour Name 
316*5113495bSYour Name 	if (!peer || peer->peer_state >= DP_PEER_STATE_LOGICAL_DELETE ||
317*5113495bSYour Name 	    (dp_peer_get_ref(soc, peer, mod_id) != QDF_STATUS_SUCCESS)) {
318*5113495bSYour Name 		qdf_spin_unlock_bh(&soc->peer_map_lock);
319*5113495bSYour Name 		return NULL;
320*5113495bSYour Name 	}
321*5113495bSYour Name 
322*5113495bSYour Name 	qdf_spin_unlock_bh(&soc->peer_map_lock);
323*5113495bSYour Name 
324*5113495bSYour Name 	return peer;
325*5113495bSYour Name }
326*5113495bSYour Name 
327*5113495bSYour Name /**
328*5113495bSYour Name  * dp_txrx_peer_get_ref_by_id() - Returns txrx peer object given the peer id
329*5113495bSYour Name  *
330*5113495bSYour Name  * @soc: core DP soc context
331*5113495bSYour Name  * @peer_id: peer id from peer object can be retrieved
332*5113495bSYour Name  * @handle: reference handle
333*5113495bSYour Name  * @mod_id: ID of module requesting reference
334*5113495bSYour Name  *
335*5113495bSYour Name  * Return: struct dp_txrx_peer*: Pointer to txrx DP peer object
336*5113495bSYour Name  */
337*5113495bSYour Name static inline struct dp_txrx_peer *
dp_txrx_peer_get_ref_by_id(struct dp_soc * soc,uint16_t peer_id,dp_txrx_ref_handle * handle,enum dp_mod_id mod_id)338*5113495bSYour Name dp_txrx_peer_get_ref_by_id(struct dp_soc *soc,
339*5113495bSYour Name 			   uint16_t peer_id,
340*5113495bSYour Name 			   dp_txrx_ref_handle *handle,
341*5113495bSYour Name 			   enum dp_mod_id mod_id)
342*5113495bSYour Name 
343*5113495bSYour Name {
344*5113495bSYour Name 	struct dp_peer *peer;
345*5113495bSYour Name 
346*5113495bSYour Name 	peer = dp_peer_get_ref_by_id(soc, peer_id, mod_id);
347*5113495bSYour Name 	if (!peer)
348*5113495bSYour Name 		return NULL;
349*5113495bSYour Name 
350*5113495bSYour Name 	if (!peer->txrx_peer) {
351*5113495bSYour Name 		dp_peer_unref_delete(peer, mod_id);
352*5113495bSYour Name 		return NULL;
353*5113495bSYour Name 	}
354*5113495bSYour Name 
355*5113495bSYour Name 	*handle = (dp_txrx_ref_handle)peer;
356*5113495bSYour Name 	return peer->txrx_peer;
357*5113495bSYour Name }
358*5113495bSYour Name 
359*5113495bSYour Name #ifdef PEER_CACHE_RX_PKTS
360*5113495bSYour Name /**
361*5113495bSYour Name  * dp_rx_flush_rx_cached() - flush cached rx frames
362*5113495bSYour Name  * @peer: peer
363*5113495bSYour Name  * @drop: set flag to drop frames
364*5113495bSYour Name  *
365*5113495bSYour Name  * Return: None
366*5113495bSYour Name  */
367*5113495bSYour Name void dp_rx_flush_rx_cached(struct dp_peer *peer, bool drop);
368*5113495bSYour Name #else
dp_rx_flush_rx_cached(struct dp_peer * peer,bool drop)369*5113495bSYour Name static inline void dp_rx_flush_rx_cached(struct dp_peer *peer, bool drop)
370*5113495bSYour Name {
371*5113495bSYour Name }
372*5113495bSYour Name #endif
373*5113495bSYour Name 
374*5113495bSYour Name static inline void
dp_clear_peer_internal(struct dp_soc * soc,struct dp_peer * peer)375*5113495bSYour Name dp_clear_peer_internal(struct dp_soc *soc, struct dp_peer *peer)
376*5113495bSYour Name {
377*5113495bSYour Name 	qdf_spin_lock_bh(&peer->peer_info_lock);
378*5113495bSYour Name 	peer->state = OL_TXRX_PEER_STATE_DISC;
379*5113495bSYour Name 	qdf_spin_unlock_bh(&peer->peer_info_lock);
380*5113495bSYour Name 
381*5113495bSYour Name 	dp_rx_flush_rx_cached(peer, true);
382*5113495bSYour Name }
383*5113495bSYour Name 
384*5113495bSYour Name /**
385*5113495bSYour Name  * dp_vdev_iterate_peer() - API to iterate through vdev peer list
386*5113495bSYour Name  *
387*5113495bSYour Name  * @vdev: DP vdev context
388*5113495bSYour Name  * @func: function to be called for each peer
389*5113495bSYour Name  * @arg: argument need to be passed to func
390*5113495bSYour Name  * @mod_id: module_id
391*5113495bSYour Name  *
392*5113495bSYour Name  * Return: void
393*5113495bSYour Name  */
394*5113495bSYour Name static inline void
dp_vdev_iterate_peer(struct dp_vdev * vdev,dp_peer_iter_func * func,void * arg,enum dp_mod_id mod_id)395*5113495bSYour Name dp_vdev_iterate_peer(struct dp_vdev *vdev, dp_peer_iter_func *func, void *arg,
396*5113495bSYour Name 		     enum dp_mod_id mod_id)
397*5113495bSYour Name {
398*5113495bSYour Name 	struct dp_peer *peer;
399*5113495bSYour Name 	struct dp_peer *tmp_peer;
400*5113495bSYour Name 	struct dp_soc *soc = NULL;
401*5113495bSYour Name 
402*5113495bSYour Name 	if (!vdev || !vdev->pdev || !vdev->pdev->soc)
403*5113495bSYour Name 		return;
404*5113495bSYour Name 
405*5113495bSYour Name 	soc = vdev->pdev->soc;
406*5113495bSYour Name 
407*5113495bSYour Name 	qdf_spin_lock_bh(&vdev->peer_list_lock);
408*5113495bSYour Name 	TAILQ_FOREACH_SAFE(peer, &vdev->peer_list,
409*5113495bSYour Name 			   peer_list_elem,
410*5113495bSYour Name 			   tmp_peer) {
411*5113495bSYour Name 		if (dp_peer_get_ref(soc, peer, mod_id) ==
412*5113495bSYour Name 					QDF_STATUS_SUCCESS) {
413*5113495bSYour Name 			(*func)(soc, peer, arg);
414*5113495bSYour Name 			dp_peer_unref_delete(peer, mod_id);
415*5113495bSYour Name 		}
416*5113495bSYour Name 	}
417*5113495bSYour Name 	qdf_spin_unlock_bh(&vdev->peer_list_lock);
418*5113495bSYour Name }
419*5113495bSYour Name 
420*5113495bSYour Name /**
421*5113495bSYour Name  * dp_pdev_iterate_peer() - API to iterate through all peers of pdev
422*5113495bSYour Name  *
423*5113495bSYour Name  * @pdev: DP pdev context
424*5113495bSYour Name  * @func: function to be called for each peer
425*5113495bSYour Name  * @arg: argument need to be passed to func
426*5113495bSYour Name  * @mod_id: module_id
427*5113495bSYour Name  *
428*5113495bSYour Name  * Return: void
429*5113495bSYour Name  */
430*5113495bSYour Name static inline void
dp_pdev_iterate_peer(struct dp_pdev * pdev,dp_peer_iter_func * func,void * arg,enum dp_mod_id mod_id)431*5113495bSYour Name dp_pdev_iterate_peer(struct dp_pdev *pdev, dp_peer_iter_func *func, void *arg,
432*5113495bSYour Name 		     enum dp_mod_id mod_id)
433*5113495bSYour Name {
434*5113495bSYour Name 	struct dp_vdev *vdev;
435*5113495bSYour Name 
436*5113495bSYour Name 	if (!pdev)
437*5113495bSYour Name 		return;
438*5113495bSYour Name 
439*5113495bSYour Name 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
440*5113495bSYour Name 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev)
441*5113495bSYour Name 		dp_vdev_iterate_peer(vdev, func, arg, mod_id);
442*5113495bSYour Name 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
443*5113495bSYour Name }
444*5113495bSYour Name 
445*5113495bSYour Name /**
446*5113495bSYour Name  * dp_soc_iterate_peer() - API to iterate through all peers of soc
447*5113495bSYour Name  *
448*5113495bSYour Name  * @soc: DP soc context
449*5113495bSYour Name  * @func: function to be called for each peer
450*5113495bSYour Name  * @arg: argument need to be passed to func
451*5113495bSYour Name  * @mod_id: module_id
452*5113495bSYour Name  *
453*5113495bSYour Name  * Return: void
454*5113495bSYour Name  */
455*5113495bSYour Name static inline void
dp_soc_iterate_peer(struct dp_soc * soc,dp_peer_iter_func * func,void * arg,enum dp_mod_id mod_id)456*5113495bSYour Name dp_soc_iterate_peer(struct dp_soc *soc, dp_peer_iter_func *func, void *arg,
457*5113495bSYour Name 		    enum dp_mod_id mod_id)
458*5113495bSYour Name {
459*5113495bSYour Name 	struct dp_pdev *pdev;
460*5113495bSYour Name 	int i;
461*5113495bSYour Name 
462*5113495bSYour Name 	if (!soc)
463*5113495bSYour Name 		return;
464*5113495bSYour Name 
465*5113495bSYour Name 	for (i = 0; i < MAX_PDEV_CNT && soc->pdev_list[i]; i++) {
466*5113495bSYour Name 		pdev = soc->pdev_list[i];
467*5113495bSYour Name 		dp_pdev_iterate_peer(pdev, func, arg, mod_id);
468*5113495bSYour Name 	}
469*5113495bSYour Name }
470*5113495bSYour Name 
471*5113495bSYour Name /**
472*5113495bSYour Name  * dp_vdev_iterate_peer_lock_safe() - API to iterate through vdev list
473*5113495bSYour Name  *
474*5113495bSYour Name  * This API will cache the peers in local allocated memory and calls
475*5113495bSYour Name  * iterate function outside the lock.
476*5113495bSYour Name  *
477*5113495bSYour Name  * As this API is allocating new memory it is suggested to use this
478*5113495bSYour Name  * only when lock cannot be held
479*5113495bSYour Name  *
480*5113495bSYour Name  * @vdev: DP vdev context
481*5113495bSYour Name  * @func: function to be called for each peer
482*5113495bSYour Name  * @arg: argument need to be passed to func
483*5113495bSYour Name  * @mod_id: module_id
484*5113495bSYour Name  *
485*5113495bSYour Name  * Return: void
486*5113495bSYour Name  */
487*5113495bSYour Name static inline void
dp_vdev_iterate_peer_lock_safe(struct dp_vdev * vdev,dp_peer_iter_func * func,void * arg,enum dp_mod_id mod_id)488*5113495bSYour Name dp_vdev_iterate_peer_lock_safe(struct dp_vdev *vdev,
489*5113495bSYour Name 			       dp_peer_iter_func *func,
490*5113495bSYour Name 			       void *arg,
491*5113495bSYour Name 			       enum dp_mod_id mod_id)
492*5113495bSYour Name {
493*5113495bSYour Name 	struct dp_peer *peer;
494*5113495bSYour Name 	struct dp_peer *tmp_peer;
495*5113495bSYour Name 	struct dp_soc *soc = NULL;
496*5113495bSYour Name 	struct dp_peer **peer_array = NULL;
497*5113495bSYour Name 	int i = 0;
498*5113495bSYour Name 	uint32_t num_peers = 0;
499*5113495bSYour Name 
500*5113495bSYour Name 	if (!vdev || !vdev->pdev || !vdev->pdev->soc)
501*5113495bSYour Name 		return;
502*5113495bSYour Name 
503*5113495bSYour Name 	num_peers = vdev->num_peers;
504*5113495bSYour Name 
505*5113495bSYour Name 	soc = vdev->pdev->soc;
506*5113495bSYour Name 
507*5113495bSYour Name 	peer_array = qdf_mem_malloc(num_peers * sizeof(struct dp_peer *));
508*5113495bSYour Name 	if (!peer_array)
509*5113495bSYour Name 		return;
510*5113495bSYour Name 
511*5113495bSYour Name 	qdf_spin_lock_bh(&vdev->peer_list_lock);
512*5113495bSYour Name 	TAILQ_FOREACH_SAFE(peer, &vdev->peer_list,
513*5113495bSYour Name 			   peer_list_elem,
514*5113495bSYour Name 			   tmp_peer) {
515*5113495bSYour Name 		if (i >= num_peers)
516*5113495bSYour Name 			break;
517*5113495bSYour Name 
518*5113495bSYour Name 		if (dp_peer_get_ref(soc, peer, mod_id) == QDF_STATUS_SUCCESS) {
519*5113495bSYour Name 			peer_array[i] = peer;
520*5113495bSYour Name 			i = (i + 1);
521*5113495bSYour Name 		}
522*5113495bSYour Name 	}
523*5113495bSYour Name 	qdf_spin_unlock_bh(&vdev->peer_list_lock);
524*5113495bSYour Name 
525*5113495bSYour Name 	for (i = 0; i < num_peers; i++) {
526*5113495bSYour Name 		peer = peer_array[i];
527*5113495bSYour Name 
528*5113495bSYour Name 		if (!peer)
529*5113495bSYour Name 			continue;
530*5113495bSYour Name 
531*5113495bSYour Name 		(*func)(soc, peer, arg);
532*5113495bSYour Name 		dp_peer_unref_delete(peer, mod_id);
533*5113495bSYour Name 	}
534*5113495bSYour Name 
535*5113495bSYour Name 	qdf_mem_free(peer_array);
536*5113495bSYour Name }
537*5113495bSYour Name 
538*5113495bSYour Name /**
539*5113495bSYour Name  * dp_pdev_iterate_peer_lock_safe() - API to iterate through all peers of pdev
540*5113495bSYour Name  *
541*5113495bSYour Name  * This API will cache the peers in local allocated memory and calls
542*5113495bSYour Name  * iterate function outside the lock.
543*5113495bSYour Name  *
544*5113495bSYour Name  * As this API is allocating new memory it is suggested to use this
545*5113495bSYour Name  * only when lock cannot be held
546*5113495bSYour Name  *
547*5113495bSYour Name  * @pdev: DP pdev context
548*5113495bSYour Name  * @func: function to be called for each peer
549*5113495bSYour Name  * @arg: argument need to be passed to func
550*5113495bSYour Name  * @mod_id: module_id
551*5113495bSYour Name  *
552*5113495bSYour Name  * Return: void
553*5113495bSYour Name  */
554*5113495bSYour Name static inline void
dp_pdev_iterate_peer_lock_safe(struct dp_pdev * pdev,dp_peer_iter_func * func,void * arg,enum dp_mod_id mod_id)555*5113495bSYour Name dp_pdev_iterate_peer_lock_safe(struct dp_pdev *pdev,
556*5113495bSYour Name 			       dp_peer_iter_func *func,
557*5113495bSYour Name 			       void *arg,
558*5113495bSYour Name 			       enum dp_mod_id mod_id)
559*5113495bSYour Name {
560*5113495bSYour Name 	struct dp_peer *peer;
561*5113495bSYour Name 	struct dp_peer *tmp_peer;
562*5113495bSYour Name 	struct dp_soc *soc = NULL;
563*5113495bSYour Name 	struct dp_vdev *vdev = NULL;
564*5113495bSYour Name 	struct dp_peer **peer_array[DP_PDEV_MAX_VDEVS] = {0};
565*5113495bSYour Name 	int i = 0;
566*5113495bSYour Name 	int j = 0;
567*5113495bSYour Name 	uint32_t num_peers[DP_PDEV_MAX_VDEVS] = {0};
568*5113495bSYour Name 
569*5113495bSYour Name 	if (!pdev || !pdev->soc)
570*5113495bSYour Name 		return;
571*5113495bSYour Name 
572*5113495bSYour Name 	soc = pdev->soc;
573*5113495bSYour Name 
574*5113495bSYour Name 	qdf_spin_lock_bh(&pdev->vdev_list_lock);
575*5113495bSYour Name 	DP_PDEV_ITERATE_VDEV_LIST(pdev, vdev) {
576*5113495bSYour Name 		num_peers[i] = vdev->num_peers;
577*5113495bSYour Name 		peer_array[i] = qdf_mem_malloc(num_peers[i] *
578*5113495bSYour Name 					       sizeof(struct dp_peer *));
579*5113495bSYour Name 		if (!peer_array[i])
580*5113495bSYour Name 			break;
581*5113495bSYour Name 
582*5113495bSYour Name 		qdf_spin_lock_bh(&vdev->peer_list_lock);
583*5113495bSYour Name 		TAILQ_FOREACH_SAFE(peer, &vdev->peer_list,
584*5113495bSYour Name 				   peer_list_elem,
585*5113495bSYour Name 				   tmp_peer) {
586*5113495bSYour Name 			if (j >= num_peers[i])
587*5113495bSYour Name 				break;
588*5113495bSYour Name 
589*5113495bSYour Name 			if (dp_peer_get_ref(soc, peer, mod_id) ==
590*5113495bSYour Name 					QDF_STATUS_SUCCESS) {
591*5113495bSYour Name 				peer_array[i][j] = peer;
592*5113495bSYour Name 
593*5113495bSYour Name 				j = (j + 1);
594*5113495bSYour Name 			}
595*5113495bSYour Name 		}
596*5113495bSYour Name 		qdf_spin_unlock_bh(&vdev->peer_list_lock);
597*5113495bSYour Name 		i = (i + 1);
598*5113495bSYour Name 	}
599*5113495bSYour Name 	qdf_spin_unlock_bh(&pdev->vdev_list_lock);
600*5113495bSYour Name 
601*5113495bSYour Name 	for (i = 0; i < DP_PDEV_MAX_VDEVS; i++) {
602*5113495bSYour Name 		if (!peer_array[i])
603*5113495bSYour Name 			break;
604*5113495bSYour Name 
605*5113495bSYour Name 		for (j = 0; j < num_peers[i]; j++) {
606*5113495bSYour Name 			peer = peer_array[i][j];
607*5113495bSYour Name 
608*5113495bSYour Name 			if (!peer)
609*5113495bSYour Name 				continue;
610*5113495bSYour Name 
611*5113495bSYour Name 			(*func)(soc, peer, arg);
612*5113495bSYour Name 			dp_peer_unref_delete(peer, mod_id);
613*5113495bSYour Name 		}
614*5113495bSYour Name 
615*5113495bSYour Name 		qdf_mem_free(peer_array[i]);
616*5113495bSYour Name 	}
617*5113495bSYour Name }
618*5113495bSYour Name 
619*5113495bSYour Name /**
620*5113495bSYour Name  * dp_soc_iterate_peer_lock_safe() - API to iterate through all peers of soc
621*5113495bSYour Name  *
622*5113495bSYour Name  * This API will cache the peers in local allocated memory and calls
623*5113495bSYour Name  * iterate function outside the lock.
624*5113495bSYour Name  *
625*5113495bSYour Name  * As this API is allocating new memory it is suggested to use this
626*5113495bSYour Name  * only when lock cannot be held
627*5113495bSYour Name  *
628*5113495bSYour Name  * @soc: DP soc context
629*5113495bSYour Name  * @func: function to be called for each peer
630*5113495bSYour Name  * @arg: argument need to be passed to func
631*5113495bSYour Name  * @mod_id: module_id
632*5113495bSYour Name  *
633*5113495bSYour Name  * Return: void
634*5113495bSYour Name  */
635*5113495bSYour Name static inline void
dp_soc_iterate_peer_lock_safe(struct dp_soc * soc,dp_peer_iter_func * func,void * arg,enum dp_mod_id mod_id)636*5113495bSYour Name dp_soc_iterate_peer_lock_safe(struct dp_soc *soc,
637*5113495bSYour Name 			      dp_peer_iter_func *func,
638*5113495bSYour Name 			      void *arg,
639*5113495bSYour Name 			      enum dp_mod_id mod_id)
640*5113495bSYour Name {
641*5113495bSYour Name 	struct dp_pdev *pdev;
642*5113495bSYour Name 	int i;
643*5113495bSYour Name 
644*5113495bSYour Name 	if (!soc)
645*5113495bSYour Name 		return;
646*5113495bSYour Name 
647*5113495bSYour Name 	for (i = 0; i < MAX_PDEV_CNT && soc->pdev_list[i]; i++) {
648*5113495bSYour Name 		pdev = soc->pdev_list[i];
649*5113495bSYour Name 		dp_pdev_iterate_peer_lock_safe(pdev, func, arg, mod_id);
650*5113495bSYour Name 	}
651*5113495bSYour Name }
652*5113495bSYour Name 
653*5113495bSYour Name #ifdef DP_PEER_STATE_DEBUG
654*5113495bSYour Name #define DP_PEER_STATE_ASSERT(_peer, _new_state, _condition) \
655*5113495bSYour Name 	do {  \
656*5113495bSYour Name 		if (!(_condition)) { \
657*5113495bSYour Name 			dp_alert("Invalid state shift from %u to %u peer " \
658*5113495bSYour Name 				 QDF_MAC_ADDR_FMT, \
659*5113495bSYour Name 				 (_peer)->peer_state, (_new_state), \
660*5113495bSYour Name 				 QDF_MAC_ADDR_REF((_peer)->mac_addr.raw)); \
661*5113495bSYour Name 			QDF_ASSERT(0); \
662*5113495bSYour Name 		} \
663*5113495bSYour Name 	} while (0)
664*5113495bSYour Name 
665*5113495bSYour Name #else
666*5113495bSYour Name #define DP_PEER_STATE_ASSERT(_peer, _new_state, _condition) \
667*5113495bSYour Name 	do {  \
668*5113495bSYour Name 		if (!(_condition)) { \
669*5113495bSYour Name 			dp_alert("Invalid state shift from %u to %u peer " \
670*5113495bSYour Name 				 QDF_MAC_ADDR_FMT, \
671*5113495bSYour Name 				 (_peer)->peer_state, (_new_state), \
672*5113495bSYour Name 				 QDF_MAC_ADDR_REF((_peer)->mac_addr.raw)); \
673*5113495bSYour Name 		} \
674*5113495bSYour Name 	} while (0)
675*5113495bSYour Name #endif
676*5113495bSYour Name 
677*5113495bSYour Name /**
678*5113495bSYour Name  * dp_peer_state_cmp() - compare dp peer state
679*5113495bSYour Name  *
680*5113495bSYour Name  * @peer: DP peer
681*5113495bSYour Name  * @state: state
682*5113495bSYour Name  *
683*5113495bSYour Name  * Return: true if state matches with peer state
684*5113495bSYour Name  *	   false if it does not match
685*5113495bSYour Name  */
686*5113495bSYour Name static inline bool
dp_peer_state_cmp(struct dp_peer * peer,enum dp_peer_state state)687*5113495bSYour Name dp_peer_state_cmp(struct dp_peer *peer,
688*5113495bSYour Name 		  enum dp_peer_state state)
689*5113495bSYour Name {
690*5113495bSYour Name 	bool is_status_equal = false;
691*5113495bSYour Name 
692*5113495bSYour Name 	qdf_spin_lock_bh(&peer->peer_state_lock);
693*5113495bSYour Name 	is_status_equal = (peer->peer_state == state);
694*5113495bSYour Name 	qdf_spin_unlock_bh(&peer->peer_state_lock);
695*5113495bSYour Name 
696*5113495bSYour Name 	return is_status_equal;
697*5113495bSYour Name }
698*5113495bSYour Name 
699*5113495bSYour Name /**
700*5113495bSYour Name  * dp_print_ast_stats() - Dump AST table contents
701*5113495bSYour Name  * @soc: Datapath soc handle
702*5113495bSYour Name  *
703*5113495bSYour Name  * Return: void
704*5113495bSYour Name  */
705*5113495bSYour Name void dp_print_ast_stats(struct dp_soc *soc);
706*5113495bSYour Name 
707*5113495bSYour Name /**
708*5113495bSYour Name  * dp_rx_peer_map_handler() - handle peer map event from firmware
709*5113495bSYour Name  * @soc: generic soc handle
710*5113495bSYour Name  * @peer_id: peer_id from firmware
711*5113495bSYour Name  * @hw_peer_id: ast index for this peer
712*5113495bSYour Name  * @vdev_id: vdev ID
713*5113495bSYour Name  * @peer_mac_addr: mac address of the peer
714*5113495bSYour Name  * @ast_hash: ast hash value
715*5113495bSYour Name  * @is_wds: flag to indicate peer map event for WDS ast entry
716*5113495bSYour Name  *
717*5113495bSYour Name  * associate the peer_id that firmware provided with peer entry
718*5113495bSYour Name  * and update the ast table in the host with the hw_peer_id.
719*5113495bSYour Name  *
720*5113495bSYour Name  * Return: QDF_STATUS code
721*5113495bSYour Name  */
722*5113495bSYour Name 
723*5113495bSYour Name QDF_STATUS dp_rx_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
724*5113495bSYour Name 				  uint16_t hw_peer_id, uint8_t vdev_id,
725*5113495bSYour Name 				  uint8_t *peer_mac_addr, uint16_t ast_hash,
726*5113495bSYour Name 				  uint8_t is_wds);
727*5113495bSYour Name 
728*5113495bSYour Name /**
729*5113495bSYour Name  * dp_rx_peer_unmap_handler() - handle peer unmap event from firmware
730*5113495bSYour Name  * @soc: generic soc handle
731*5113495bSYour Name  * @peer_id: peer_id from firmware
732*5113495bSYour Name  * @vdev_id: vdev ID
733*5113495bSYour Name  * @peer_mac_addr: mac address of the peer or wds entry
734*5113495bSYour Name  * @is_wds: flag to indicate peer map event for WDS ast entry
735*5113495bSYour Name  * @free_wds_count: number of wds entries freed by FW with peer delete
736*5113495bSYour Name  *
737*5113495bSYour Name  * Return: none
738*5113495bSYour Name  */
739*5113495bSYour Name void dp_rx_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id,
740*5113495bSYour Name 			      uint8_t vdev_id, uint8_t *peer_mac_addr,
741*5113495bSYour Name 			      uint8_t is_wds, uint32_t free_wds_count);
742*5113495bSYour Name 
743*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(DP_MLO_LINK_STATS_SUPPORT)
744*5113495bSYour Name /**
745*5113495bSYour Name  * dp_rx_peer_ext_evt() - handle peer extended event from firmware
746*5113495bSYour Name  * @soc: DP soc handle
747*5113495bSYour Name  * @info: extended evt info
748*5113495bSYour Name  *
749*5113495bSYour Name  *
750*5113495bSYour Name  * Return: QDF_STATUS
751*5113495bSYour Name  */
752*5113495bSYour Name 
753*5113495bSYour Name QDF_STATUS
754*5113495bSYour Name dp_rx_peer_ext_evt(struct dp_soc *soc, struct dp_peer_ext_evt_info *info);
755*5113495bSYour Name #endif
756*5113495bSYour Name #ifdef DP_RX_UDP_OVER_PEER_ROAM
757*5113495bSYour Name /**
758*5113495bSYour Name  * dp_rx_reset_roaming_peer() - Reset the roamed peer in vdev
759*5113495bSYour Name  * @soc: dp soc pointer
760*5113495bSYour Name  * @vdev_id: vdev id
761*5113495bSYour Name  * @peer_mac_addr: mac address of the peer
762*5113495bSYour Name  *
763*5113495bSYour Name  * This function resets the roamed peer auth status and mac address
764*5113495bSYour Name  * after peer map indication of same peer is received from firmware.
765*5113495bSYour Name  *
766*5113495bSYour Name  * Return: None
767*5113495bSYour Name  */
768*5113495bSYour Name void dp_rx_reset_roaming_peer(struct dp_soc *soc, uint8_t vdev_id,
769*5113495bSYour Name 			      uint8_t *peer_mac_addr);
770*5113495bSYour Name #else
dp_rx_reset_roaming_peer(struct dp_soc * soc,uint8_t vdev_id,uint8_t * peer_mac_addr)771*5113495bSYour Name static inline void dp_rx_reset_roaming_peer(struct dp_soc *soc, uint8_t vdev_id,
772*5113495bSYour Name 					    uint8_t *peer_mac_addr)
773*5113495bSYour Name {
774*5113495bSYour Name }
775*5113495bSYour Name #endif
776*5113495bSYour Name 
777*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
778*5113495bSYour Name /**
779*5113495bSYour Name  * dp_rx_mlo_peer_map_handler() - handle MLO peer map event from firmware
780*5113495bSYour Name  * @soc: generic soc handle
781*5113495bSYour Name  * @peer_id: ML peer_id from firmware
782*5113495bSYour Name  * @peer_mac_addr: mac address of the peer
783*5113495bSYour Name  * @mlo_flow_info: MLO AST flow info
784*5113495bSYour Name  * @mlo_link_info: MLO link info
785*5113495bSYour Name  *
786*5113495bSYour Name  * associate the ML peer_id that firmware provided with peer entry
787*5113495bSYour Name  * and update the ast table in the host with the hw_peer_id.
788*5113495bSYour Name  *
789*5113495bSYour Name  * Return: QDF_STATUS code
790*5113495bSYour Name  */
791*5113495bSYour Name QDF_STATUS
792*5113495bSYour Name dp_rx_mlo_peer_map_handler(struct dp_soc *soc, uint16_t peer_id,
793*5113495bSYour Name 			   uint8_t *peer_mac_addr,
794*5113495bSYour Name 			   struct dp_mlo_flow_override_info *mlo_flow_info,
795*5113495bSYour Name 			   struct dp_mlo_link_info *mlo_link_info);
796*5113495bSYour Name 
797*5113495bSYour Name /**
798*5113495bSYour Name  * dp_rx_mlo_peer_unmap_handler() - handle MLO peer unmap event from firmware
799*5113495bSYour Name  * @soc: generic soc handle
800*5113495bSYour Name  * @peer_id: peer_id from firmware
801*5113495bSYour Name  *
802*5113495bSYour Name  * Return: none
803*5113495bSYour Name  */
804*5113495bSYour Name void dp_rx_mlo_peer_unmap_handler(struct dp_soc *soc, uint16_t peer_id);
805*5113495bSYour Name #endif
806*5113495bSYour Name 
807*5113495bSYour Name void dp_rx_sec_ind_handler(struct dp_soc *soc, uint16_t peer_id,
808*5113495bSYour Name 			   enum cdp_sec_type sec_type, int is_unicast,
809*5113495bSYour Name 			   u_int32_t *michael_key, u_int32_t *rx_pn);
810*5113495bSYour Name 
811*5113495bSYour Name uint8_t dp_get_peer_mac_addr_frm_id(struct cdp_soc_t *soc_handle,
812*5113495bSYour Name 		uint16_t peer_id, uint8_t *peer_mac);
813*5113495bSYour Name 
814*5113495bSYour Name /**
815*5113495bSYour Name  * dp_peer_add_ast() - Allocate and add AST entry into peer list
816*5113495bSYour Name  * @soc: SoC handle
817*5113495bSYour Name  * @peer: peer to which ast node belongs
818*5113495bSYour Name  * @mac_addr: MAC address of ast node
819*5113495bSYour Name  * @type: AST entry type
820*5113495bSYour Name  * @flags: AST configuration flags
821*5113495bSYour Name  *
822*5113495bSYour Name  * This API is used by WDS source port learning function to
823*5113495bSYour Name  * add a new AST entry into peer AST list
824*5113495bSYour Name  *
825*5113495bSYour Name  * Return: QDF_STATUS code
826*5113495bSYour Name  */
827*5113495bSYour Name QDF_STATUS dp_peer_add_ast(struct dp_soc *soc, struct dp_peer *peer,
828*5113495bSYour Name 			   uint8_t *mac_addr, enum cdp_txrx_ast_entry_type type,
829*5113495bSYour Name 			   uint32_t flags);
830*5113495bSYour Name 
831*5113495bSYour Name /**
832*5113495bSYour Name  * dp_peer_del_ast() - Delete and free AST entry
833*5113495bSYour Name  * @soc: SoC handle
834*5113495bSYour Name  * @ast_entry: AST entry of the node
835*5113495bSYour Name  *
836*5113495bSYour Name  * This function removes the AST entry from peer and soc tables
837*5113495bSYour Name  * It assumes caller has taken the ast lock to protect the access to these
838*5113495bSYour Name  * tables
839*5113495bSYour Name  *
840*5113495bSYour Name  * Return: None
841*5113495bSYour Name  */
842*5113495bSYour Name void dp_peer_del_ast(struct dp_soc *soc, struct dp_ast_entry *ast_entry);
843*5113495bSYour Name 
844*5113495bSYour Name void dp_peer_ast_unmap_handler(struct dp_soc *soc,
845*5113495bSYour Name 			       struct dp_ast_entry *ast_entry);
846*5113495bSYour Name 
847*5113495bSYour Name /**
848*5113495bSYour Name  * dp_peer_update_ast() - Delete and free AST entry
849*5113495bSYour Name  * @soc: SoC handle
850*5113495bSYour Name  * @peer: peer to which ast node belongs
851*5113495bSYour Name  * @ast_entry: AST entry of the node
852*5113495bSYour Name  * @flags: wds or hmwds
853*5113495bSYour Name  *
854*5113495bSYour Name  * This function update the AST entry to the roamed peer and soc tables
855*5113495bSYour Name  * It assumes caller has taken the ast lock to protect the access to these
856*5113495bSYour Name  * tables
857*5113495bSYour Name  *
858*5113495bSYour Name  * Return: 0 if ast entry is updated successfully
859*5113495bSYour Name  *         -1 failure
860*5113495bSYour Name  */
861*5113495bSYour Name int dp_peer_update_ast(struct dp_soc *soc, struct dp_peer *peer,
862*5113495bSYour Name 			struct dp_ast_entry *ast_entry,	uint32_t flags);
863*5113495bSYour Name 
864*5113495bSYour Name /**
865*5113495bSYour Name  * dp_peer_ast_hash_find_by_pdevid() - Find AST entry by MAC address
866*5113495bSYour Name  * @soc: SoC handle
867*5113495bSYour Name  * @ast_mac_addr: Mac address
868*5113495bSYour Name  * @pdev_id: pdev Id
869*5113495bSYour Name  *
870*5113495bSYour Name  * It assumes caller has taken the ast lock to protect the access to
871*5113495bSYour Name  * AST hash table
872*5113495bSYour Name  *
873*5113495bSYour Name  * Return: AST entry
874*5113495bSYour Name  */
875*5113495bSYour Name struct dp_ast_entry *dp_peer_ast_hash_find_by_pdevid(struct dp_soc *soc,
876*5113495bSYour Name 						     uint8_t *ast_mac_addr,
877*5113495bSYour Name 						     uint8_t pdev_id);
878*5113495bSYour Name 
879*5113495bSYour Name /**
880*5113495bSYour Name  * dp_peer_ast_hash_find_by_vdevid() - Find AST entry by MAC address
881*5113495bSYour Name  * @soc: SoC handle
882*5113495bSYour Name  * @ast_mac_addr: Mac address
883*5113495bSYour Name  * @vdev_id: vdev Id
884*5113495bSYour Name  *
885*5113495bSYour Name  * It assumes caller has taken the ast lock to protect the access to
886*5113495bSYour Name  * AST hash table
887*5113495bSYour Name  *
888*5113495bSYour Name  * Return: AST entry
889*5113495bSYour Name  */
890*5113495bSYour Name struct dp_ast_entry *dp_peer_ast_hash_find_by_vdevid(struct dp_soc *soc,
891*5113495bSYour Name 						     uint8_t *ast_mac_addr,
892*5113495bSYour Name 						     uint8_t vdev_id);
893*5113495bSYour Name 
894*5113495bSYour Name /**
895*5113495bSYour Name  * dp_peer_ast_hash_find_soc() - Find AST entry by MAC address
896*5113495bSYour Name  * @soc: SoC handle
897*5113495bSYour Name  * @ast_mac_addr: Mac address
898*5113495bSYour Name  *
899*5113495bSYour Name  * It assumes caller has taken the ast lock to protect the access to
900*5113495bSYour Name  * AST hash table
901*5113495bSYour Name  *
902*5113495bSYour Name  * Return: AST entry
903*5113495bSYour Name  */
904*5113495bSYour Name struct dp_ast_entry *dp_peer_ast_hash_find_soc(struct dp_soc *soc,
905*5113495bSYour Name 					       uint8_t *ast_mac_addr);
906*5113495bSYour Name 
907*5113495bSYour Name /**
908*5113495bSYour Name  * dp_peer_ast_hash_find_soc_by_type() - Find AST entry by MAC address
909*5113495bSYour Name  * and AST type
910*5113495bSYour Name  * @soc: SoC handle
911*5113495bSYour Name  * @ast_mac_addr: Mac address
912*5113495bSYour Name  * @type: AST entry type
913*5113495bSYour Name  *
914*5113495bSYour Name  * It assumes caller has taken the ast lock to protect the access to
915*5113495bSYour Name  * AST hash table
916*5113495bSYour Name  *
917*5113495bSYour Name  * Return: AST entry
918*5113495bSYour Name  */
919*5113495bSYour Name struct dp_ast_entry *dp_peer_ast_hash_find_soc_by_type(
920*5113495bSYour Name 					struct dp_soc *soc,
921*5113495bSYour Name 					uint8_t *ast_mac_addr,
922*5113495bSYour Name 					enum cdp_txrx_ast_entry_type type);
923*5113495bSYour Name 
924*5113495bSYour Name /**
925*5113495bSYour Name  * dp_peer_ast_get_pdev_id() - get pdev_id from the ast entry
926*5113495bSYour Name  * @soc: SoC handle
927*5113495bSYour Name  * @ast_entry: AST entry of the node
928*5113495bSYour Name  *
929*5113495bSYour Name  * This function gets the pdev_id from the ast entry.
930*5113495bSYour Name  *
931*5113495bSYour Name  * Return: (uint8_t) pdev_id
932*5113495bSYour Name  */
933*5113495bSYour Name uint8_t dp_peer_ast_get_pdev_id(struct dp_soc *soc,
934*5113495bSYour Name 				struct dp_ast_entry *ast_entry);
935*5113495bSYour Name 
936*5113495bSYour Name 
937*5113495bSYour Name /**
938*5113495bSYour Name  * dp_peer_ast_get_next_hop() - get next_hop from the ast entry
939*5113495bSYour Name  * @soc: SoC handle
940*5113495bSYour Name  * @ast_entry: AST entry of the node
941*5113495bSYour Name  *
942*5113495bSYour Name  * This function gets the next hop from the ast entry.
943*5113495bSYour Name  *
944*5113495bSYour Name  * Return: (uint8_t) next_hop
945*5113495bSYour Name  */
946*5113495bSYour Name uint8_t dp_peer_ast_get_next_hop(struct dp_soc *soc,
947*5113495bSYour Name 				struct dp_ast_entry *ast_entry);
948*5113495bSYour Name 
949*5113495bSYour Name /**
950*5113495bSYour Name  * dp_peer_ast_set_type() - set type from the ast entry
951*5113495bSYour Name  * @soc: SoC handle
952*5113495bSYour Name  * @ast_entry: AST entry of the node
953*5113495bSYour Name  * @type: AST entry type
954*5113495bSYour Name  *
955*5113495bSYour Name  * This function sets the type in the ast entry.
956*5113495bSYour Name  *
957*5113495bSYour Name  * Return:
958*5113495bSYour Name  */
959*5113495bSYour Name void dp_peer_ast_set_type(struct dp_soc *soc,
960*5113495bSYour Name 				struct dp_ast_entry *ast_entry,
961*5113495bSYour Name 				enum cdp_txrx_ast_entry_type type);
962*5113495bSYour Name 
963*5113495bSYour Name void dp_peer_ast_send_wds_del(struct dp_soc *soc,
964*5113495bSYour Name 			      struct dp_ast_entry *ast_entry,
965*5113495bSYour Name 			      struct dp_peer *peer);
966*5113495bSYour Name 
967*5113495bSYour Name #ifdef WLAN_FEATURE_MULTI_AST_DEL
968*5113495bSYour Name void dp_peer_ast_send_multi_wds_del(
969*5113495bSYour Name 		struct dp_soc *soc, uint8_t vdev_id,
970*5113495bSYour Name 		struct peer_del_multi_wds_entries *wds_list);
971*5113495bSYour Name #endif
972*5113495bSYour Name 
973*5113495bSYour Name void dp_peer_free_hmwds_cb(struct cdp_ctrl_objmgr_psoc *ctrl_psoc,
974*5113495bSYour Name 			   struct cdp_soc *dp_soc,
975*5113495bSYour Name 			   void *cookie,
976*5113495bSYour Name 			   enum cdp_ast_free_status status);
977*5113495bSYour Name 
978*5113495bSYour Name /**
979*5113495bSYour Name  * dp_peer_ast_hash_remove() - Look up and remove AST entry from hash table
980*5113495bSYour Name  * @soc: SoC handle
981*5113495bSYour Name  * @ase: Address search entry
982*5113495bSYour Name  *
983*5113495bSYour Name  * This function removes the AST entry from soc AST hash table
984*5113495bSYour Name  * It assumes caller has taken the ast lock to protect the access to this table
985*5113495bSYour Name  *
986*5113495bSYour Name  * Return: None
987*5113495bSYour Name  */
988*5113495bSYour Name void dp_peer_ast_hash_remove(struct dp_soc *soc,
989*5113495bSYour Name 			     struct dp_ast_entry *ase);
990*5113495bSYour Name 
991*5113495bSYour Name /**
992*5113495bSYour Name  * dp_peer_free_ast_entry() - Free up the ast entry memory
993*5113495bSYour Name  * @soc: SoC handle
994*5113495bSYour Name  * @ast_entry: Address search entry
995*5113495bSYour Name  *
996*5113495bSYour Name  * This API is used to free up the memory associated with
997*5113495bSYour Name  * AST entry.
998*5113495bSYour Name  *
999*5113495bSYour Name  * Return: None
1000*5113495bSYour Name  */
1001*5113495bSYour Name void dp_peer_free_ast_entry(struct dp_soc *soc,
1002*5113495bSYour Name 			    struct dp_ast_entry *ast_entry);
1003*5113495bSYour Name 
1004*5113495bSYour Name /**
1005*5113495bSYour Name  * dp_peer_unlink_ast_entry() - Free up the ast entry memory
1006*5113495bSYour Name  * @soc: SoC handle
1007*5113495bSYour Name  * @ast_entry: Address search entry
1008*5113495bSYour Name  * @peer: peer
1009*5113495bSYour Name  *
1010*5113495bSYour Name  * This API is used to remove/unlink AST entry from the peer list
1011*5113495bSYour Name  * and hash list.
1012*5113495bSYour Name  *
1013*5113495bSYour Name  * Return: None
1014*5113495bSYour Name  */
1015*5113495bSYour Name void dp_peer_unlink_ast_entry(struct dp_soc *soc,
1016*5113495bSYour Name 			      struct dp_ast_entry *ast_entry,
1017*5113495bSYour Name 			      struct dp_peer *peer);
1018*5113495bSYour Name 
1019*5113495bSYour Name /**
1020*5113495bSYour Name  * dp_peer_mec_detach_entry() - Detach the MEC entry
1021*5113495bSYour Name  * @soc: SoC handle
1022*5113495bSYour Name  * @mecentry: MEC entry of the node
1023*5113495bSYour Name  * @ptr: pointer to free list
1024*5113495bSYour Name  *
1025*5113495bSYour Name  * The MEC entry is detached from MEC table and added to free_list
1026*5113495bSYour Name  * to free the object outside lock
1027*5113495bSYour Name  *
1028*5113495bSYour Name  * Return: None
1029*5113495bSYour Name  */
1030*5113495bSYour Name void dp_peer_mec_detach_entry(struct dp_soc *soc, struct dp_mec_entry *mecentry,
1031*5113495bSYour Name 			      void *ptr);
1032*5113495bSYour Name 
1033*5113495bSYour Name /**
1034*5113495bSYour Name  * dp_peer_mec_free_list() - free the MEC entry from free_list
1035*5113495bSYour Name  * @soc: SoC handle
1036*5113495bSYour Name  * @ptr: pointer to free list
1037*5113495bSYour Name  *
1038*5113495bSYour Name  * Return: None
1039*5113495bSYour Name  */
1040*5113495bSYour Name void dp_peer_mec_free_list(struct dp_soc *soc, void *ptr);
1041*5113495bSYour Name 
1042*5113495bSYour Name /**
1043*5113495bSYour Name  * dp_peer_mec_add_entry()
1044*5113495bSYour Name  * @soc: SoC handle
1045*5113495bSYour Name  * @vdev: vdev to which mec node belongs
1046*5113495bSYour Name  * @mac_addr: MAC address of mec node
1047*5113495bSYour Name  *
1048*5113495bSYour Name  * This function allocates and adds MEC entry to MEC table.
1049*5113495bSYour Name  * It assumes caller has taken the mec lock to protect the access to these
1050*5113495bSYour Name  * tables
1051*5113495bSYour Name  *
1052*5113495bSYour Name  * Return: QDF_STATUS
1053*5113495bSYour Name  */
1054*5113495bSYour Name QDF_STATUS dp_peer_mec_add_entry(struct dp_soc *soc,
1055*5113495bSYour Name 				 struct dp_vdev *vdev,
1056*5113495bSYour Name 				 uint8_t *mac_addr);
1057*5113495bSYour Name 
1058*5113495bSYour Name /**
1059*5113495bSYour Name  * dp_peer_mec_hash_find_by_pdevid() - Find MEC entry by PDEV Id
1060*5113495bSYour Name  * within pdev
1061*5113495bSYour Name  * @soc: SoC handle
1062*5113495bSYour Name  * @pdev_id: pdev Id
1063*5113495bSYour Name  * @mec_mac_addr: MAC address of mec node
1064*5113495bSYour Name  *
1065*5113495bSYour Name  * It assumes caller has taken the mec_lock to protect the access to
1066*5113495bSYour Name  * MEC hash table
1067*5113495bSYour Name  *
1068*5113495bSYour Name  * Return: MEC entry
1069*5113495bSYour Name  */
1070*5113495bSYour Name struct dp_mec_entry *dp_peer_mec_hash_find_by_pdevid(struct dp_soc *soc,
1071*5113495bSYour Name 						     uint8_t pdev_id,
1072*5113495bSYour Name 						     uint8_t *mec_mac_addr);
1073*5113495bSYour Name 
1074*5113495bSYour Name #define DP_AST_ASSERT(_condition) \
1075*5113495bSYour Name 	do { \
1076*5113495bSYour Name 		if (!(_condition)) { \
1077*5113495bSYour Name 			dp_print_ast_stats(soc);\
1078*5113495bSYour Name 			QDF_BUG(_condition); \
1079*5113495bSYour Name 		} \
1080*5113495bSYour Name 	} while (0)
1081*5113495bSYour Name 
1082*5113495bSYour Name /**
1083*5113495bSYour Name  * dp_peer_update_inactive_time() - Update inactive time for peer
1084*5113495bSYour Name  * @pdev: pdev object
1085*5113495bSYour Name  * @tag_type: htt_tlv_tag type
1086*5113495bSYour Name  * @tag_buf: buf message
1087*5113495bSYour Name  */
1088*5113495bSYour Name void
1089*5113495bSYour Name dp_peer_update_inactive_time(struct dp_pdev *pdev, uint32_t tag_type,
1090*5113495bSYour Name 			     uint32_t *tag_buf);
1091*5113495bSYour Name 
1092*5113495bSYour Name #ifndef QCA_MULTIPASS_SUPPORT
1093*5113495bSYour Name static inline
1094*5113495bSYour Name /**
1095*5113495bSYour Name  * dp_peer_set_vlan_id() - set vlan_id for this peer
1096*5113495bSYour Name  * @cdp_soc: soc handle
1097*5113495bSYour Name  * @vdev_id: id of vdev object
1098*5113495bSYour Name  * @peer_mac: mac address
1099*5113495bSYour Name  * @vlan_id: vlan id for peer
1100*5113495bSYour Name  *
1101*5113495bSYour Name  * Return: void
1102*5113495bSYour Name  */
dp_peer_set_vlan_id(struct cdp_soc_t * cdp_soc,uint8_t vdev_id,uint8_t * peer_mac,uint16_t vlan_id)1103*5113495bSYour Name void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
1104*5113495bSYour Name 			 uint8_t vdev_id, uint8_t *peer_mac,
1105*5113495bSYour Name 			 uint16_t vlan_id)
1106*5113495bSYour Name {
1107*5113495bSYour Name }
1108*5113495bSYour Name 
1109*5113495bSYour Name /**
1110*5113495bSYour Name  * dp_set_vlan_groupkey() - set vlan map for vdev
1111*5113495bSYour Name  * @soc_hdl: pointer to soc
1112*5113495bSYour Name  * @vdev_id: id of vdev handle
1113*5113495bSYour Name  * @vlan_id: vlan_id
1114*5113495bSYour Name  * @group_key: group key for vlan
1115*5113495bSYour Name  *
1116*5113495bSYour Name  * Return: set success/failure
1117*5113495bSYour Name  */
1118*5113495bSYour Name static inline
dp_set_vlan_groupkey(struct cdp_soc_t * soc_hdl,uint8_t vdev_id,uint16_t vlan_id,uint16_t group_key)1119*5113495bSYour Name QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc_hdl, uint8_t vdev_id,
1120*5113495bSYour Name 				uint16_t vlan_id, uint16_t group_key)
1121*5113495bSYour Name {
1122*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1123*5113495bSYour Name }
1124*5113495bSYour Name 
1125*5113495bSYour Name /**
1126*5113495bSYour Name  * dp_peer_multipass_list_init() - initialize multipass peer list
1127*5113495bSYour Name  * @vdev: pointer to vdev
1128*5113495bSYour Name  *
1129*5113495bSYour Name  * Return: void
1130*5113495bSYour Name  */
1131*5113495bSYour Name static inline
dp_peer_multipass_list_init(struct dp_vdev * vdev)1132*5113495bSYour Name void dp_peer_multipass_list_init(struct dp_vdev *vdev)
1133*5113495bSYour Name {
1134*5113495bSYour Name }
1135*5113495bSYour Name 
1136*5113495bSYour Name /**
1137*5113495bSYour Name  * dp_peer_multipass_list_remove() - remove peer from special peer list
1138*5113495bSYour Name  * @peer: peer handle
1139*5113495bSYour Name  *
1140*5113495bSYour Name  * Return: void
1141*5113495bSYour Name  */
1142*5113495bSYour Name static inline
dp_peer_multipass_list_remove(struct dp_peer * peer)1143*5113495bSYour Name void dp_peer_multipass_list_remove(struct dp_peer *peer)
1144*5113495bSYour Name {
1145*5113495bSYour Name }
1146*5113495bSYour Name #else
1147*5113495bSYour Name void dp_peer_set_vlan_id(struct cdp_soc_t *cdp_soc,
1148*5113495bSYour Name 			 uint8_t vdev_id, uint8_t *peer_mac,
1149*5113495bSYour Name 			 uint16_t vlan_id);
1150*5113495bSYour Name QDF_STATUS dp_set_vlan_groupkey(struct cdp_soc_t *soc, uint8_t vdev_id,
1151*5113495bSYour Name 				uint16_t vlan_id, uint16_t group_key);
1152*5113495bSYour Name void dp_peer_multipass_list_init(struct dp_vdev *vdev);
1153*5113495bSYour Name void dp_peer_multipass_list_remove(struct dp_peer *peer);
1154*5113495bSYour Name #endif
1155*5113495bSYour Name 
1156*5113495bSYour Name 
1157*5113495bSYour Name #ifndef QCA_PEER_MULTIQ_SUPPORT
1158*5113495bSYour Name /**
1159*5113495bSYour Name  * dp_peer_reset_flowq_map() - reset peer flowq map table
1160*5113495bSYour Name  * @peer: dp peer handle
1161*5113495bSYour Name  *
1162*5113495bSYour Name  * Return: none
1163*5113495bSYour Name  */
1164*5113495bSYour Name static inline
dp_peer_reset_flowq_map(struct dp_peer * peer)1165*5113495bSYour Name void dp_peer_reset_flowq_map(struct dp_peer *peer)
1166*5113495bSYour Name {
1167*5113495bSYour Name }
1168*5113495bSYour Name 
1169*5113495bSYour Name /**
1170*5113495bSYour Name  * dp_peer_ast_index_flow_queue_map_create() - create ast index flow queue map
1171*5113495bSYour Name  * @soc_hdl: generic soc handle
1172*5113495bSYour Name  * @is_wds: flag to indicate if peer is wds
1173*5113495bSYour Name  * @peer_id: peer_id from htt peer map message
1174*5113495bSYour Name  * @peer_mac_addr: mac address of the peer
1175*5113495bSYour Name  * @ast_info: ast flow override information from peer map
1176*5113495bSYour Name  *
1177*5113495bSYour Name  * Return: none
1178*5113495bSYour Name  */
1179*5113495bSYour Name static inline
dp_peer_ast_index_flow_queue_map_create(void * soc_hdl,bool is_wds,uint16_t peer_id,uint8_t * peer_mac_addr,struct dp_ast_flow_override_info * ast_info)1180*5113495bSYour Name void dp_peer_ast_index_flow_queue_map_create(void *soc_hdl,
1181*5113495bSYour Name 		    bool is_wds, uint16_t peer_id, uint8_t *peer_mac_addr,
1182*5113495bSYour Name 		    struct dp_ast_flow_override_info *ast_info)
1183*5113495bSYour Name {
1184*5113495bSYour Name }
1185*5113495bSYour Name #else
1186*5113495bSYour Name void dp_peer_reset_flowq_map(struct dp_peer *peer);
1187*5113495bSYour Name 
1188*5113495bSYour Name void dp_peer_ast_index_flow_queue_map_create(void *soc_hdl,
1189*5113495bSYour Name 		    bool is_wds, uint16_t peer_id, uint8_t *peer_mac_addr,
1190*5113495bSYour Name 		    struct dp_ast_flow_override_info *ast_info);
1191*5113495bSYour Name #endif
1192*5113495bSYour Name 
1193*5113495bSYour Name #ifdef QCA_PEER_EXT_STATS
1194*5113495bSYour Name /**
1195*5113495bSYour Name  * dp_peer_delay_stats_ctx_alloc() - Allocate peer delay stats content
1196*5113495bSYour Name  * @soc: DP SoC context
1197*5113495bSYour Name  * @txrx_peer: DP txrx peer context
1198*5113495bSYour Name  *
1199*5113495bSYour Name  * Allocate the peer delay stats context
1200*5113495bSYour Name  *
1201*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS if allocation is
1202*5113495bSYour Name  *	   successful
1203*5113495bSYour Name  */
1204*5113495bSYour Name QDF_STATUS dp_peer_delay_stats_ctx_alloc(struct dp_soc *soc,
1205*5113495bSYour Name 					 struct dp_txrx_peer *txrx_peer);
1206*5113495bSYour Name 
1207*5113495bSYour Name /**
1208*5113495bSYour Name  * dp_peer_delay_stats_ctx_dealloc() - Dealloc the peer delay stats context
1209*5113495bSYour Name  * @soc: DP SoC context
1210*5113495bSYour Name  * @txrx_peer: txrx DP peer context
1211*5113495bSYour Name  *
1212*5113495bSYour Name  * Free the peer delay stats context
1213*5113495bSYour Name  *
1214*5113495bSYour Name  * Return: Void
1215*5113495bSYour Name  */
1216*5113495bSYour Name void dp_peer_delay_stats_ctx_dealloc(struct dp_soc *soc,
1217*5113495bSYour Name 				     struct dp_txrx_peer *txrx_peer);
1218*5113495bSYour Name 
1219*5113495bSYour Name /**
1220*5113495bSYour Name  * dp_peer_delay_stats_ctx_clr() - Clear delay stats context of peer
1221*5113495bSYour Name  * @txrx_peer: dp_txrx_peer handle
1222*5113495bSYour Name  *
1223*5113495bSYour Name  * Return: void
1224*5113495bSYour Name  */
1225*5113495bSYour Name void dp_peer_delay_stats_ctx_clr(struct dp_txrx_peer *txrx_peer);
1226*5113495bSYour Name #else
1227*5113495bSYour Name static inline
dp_peer_delay_stats_ctx_alloc(struct dp_soc * soc,struct dp_txrx_peer * txrx_peer)1228*5113495bSYour Name QDF_STATUS dp_peer_delay_stats_ctx_alloc(struct dp_soc *soc,
1229*5113495bSYour Name 					 struct dp_txrx_peer *txrx_peer)
1230*5113495bSYour Name {
1231*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1232*5113495bSYour Name }
1233*5113495bSYour Name 
1234*5113495bSYour Name static inline
dp_peer_delay_stats_ctx_dealloc(struct dp_soc * soc,struct dp_txrx_peer * txrx_peer)1235*5113495bSYour Name void dp_peer_delay_stats_ctx_dealloc(struct dp_soc *soc,
1236*5113495bSYour Name 				     struct dp_txrx_peer *txrx_peer)
1237*5113495bSYour Name {
1238*5113495bSYour Name }
1239*5113495bSYour Name 
1240*5113495bSYour Name static inline
dp_peer_delay_stats_ctx_clr(struct dp_txrx_peer * txrx_peer)1241*5113495bSYour Name void dp_peer_delay_stats_ctx_clr(struct dp_txrx_peer *txrx_peer)
1242*5113495bSYour Name {
1243*5113495bSYour Name }
1244*5113495bSYour Name #endif
1245*5113495bSYour Name 
1246*5113495bSYour Name #ifdef WLAN_PEER_JITTER
1247*5113495bSYour Name /**
1248*5113495bSYour Name  * dp_peer_jitter_stats_ctx_alloc() - Allocate jitter stats context for peer
1249*5113495bSYour Name  * @pdev: Datapath pdev handle
1250*5113495bSYour Name  * @txrx_peer: dp_txrx_peer handle
1251*5113495bSYour Name  *
1252*5113495bSYour Name  * Return: QDF_STATUS
1253*5113495bSYour Name  */
1254*5113495bSYour Name QDF_STATUS dp_peer_jitter_stats_ctx_alloc(struct dp_pdev *pdev,
1255*5113495bSYour Name 					  struct dp_txrx_peer *txrx_peer);
1256*5113495bSYour Name 
1257*5113495bSYour Name /**
1258*5113495bSYour Name  * dp_peer_jitter_stats_ctx_dealloc() - Deallocate jitter stats context
1259*5113495bSYour Name  * @pdev: Datapath pdev handle
1260*5113495bSYour Name  * @txrx_peer: dp_txrx_peer handle
1261*5113495bSYour Name  *
1262*5113495bSYour Name  * Return: void
1263*5113495bSYour Name  */
1264*5113495bSYour Name void dp_peer_jitter_stats_ctx_dealloc(struct dp_pdev *pdev,
1265*5113495bSYour Name 				      struct dp_txrx_peer *txrx_peer);
1266*5113495bSYour Name 
1267*5113495bSYour Name /**
1268*5113495bSYour Name  * dp_peer_jitter_stats_ctx_clr() - Clear jitter stats context of peer
1269*5113495bSYour Name  * @txrx_peer: dp_txrx_peer handle
1270*5113495bSYour Name  *
1271*5113495bSYour Name  * Return: void
1272*5113495bSYour Name  */
1273*5113495bSYour Name void dp_peer_jitter_stats_ctx_clr(struct dp_txrx_peer *txrx_peer);
1274*5113495bSYour Name #else
1275*5113495bSYour Name static inline
dp_peer_jitter_stats_ctx_alloc(struct dp_pdev * pdev,struct dp_txrx_peer * txrx_peer)1276*5113495bSYour Name QDF_STATUS dp_peer_jitter_stats_ctx_alloc(struct dp_pdev *pdev,
1277*5113495bSYour Name 					  struct dp_txrx_peer *txrx_peer)
1278*5113495bSYour Name {
1279*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1280*5113495bSYour Name }
1281*5113495bSYour Name 
1282*5113495bSYour Name static inline
dp_peer_jitter_stats_ctx_dealloc(struct dp_pdev * pdev,struct dp_txrx_peer * txrx_peer)1283*5113495bSYour Name void dp_peer_jitter_stats_ctx_dealloc(struct dp_pdev *pdev,
1284*5113495bSYour Name 				      struct dp_txrx_peer *txrx_peer)
1285*5113495bSYour Name {
1286*5113495bSYour Name }
1287*5113495bSYour Name 
1288*5113495bSYour Name static inline
dp_peer_jitter_stats_ctx_clr(struct dp_txrx_peer * txrx_peer)1289*5113495bSYour Name void dp_peer_jitter_stats_ctx_clr(struct dp_txrx_peer *txrx_peer)
1290*5113495bSYour Name {
1291*5113495bSYour Name }
1292*5113495bSYour Name #endif
1293*5113495bSYour Name 
1294*5113495bSYour Name #ifndef CONFIG_SAWF_DEF_QUEUES
dp_peer_sawf_ctx_alloc(struct dp_soc * soc,struct dp_peer * peer)1295*5113495bSYour Name static inline QDF_STATUS dp_peer_sawf_ctx_alloc(struct dp_soc *soc,
1296*5113495bSYour Name 						struct dp_peer *peer)
1297*5113495bSYour Name {
1298*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1299*5113495bSYour Name }
1300*5113495bSYour Name 
dp_peer_sawf_ctx_free(struct dp_soc * soc,struct dp_peer * peer)1301*5113495bSYour Name static inline QDF_STATUS dp_peer_sawf_ctx_free(struct dp_soc *soc,
1302*5113495bSYour Name 					       struct dp_peer *peer)
1303*5113495bSYour Name {
1304*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1305*5113495bSYour Name }
1306*5113495bSYour Name 
1307*5113495bSYour Name #endif
1308*5113495bSYour Name 
1309*5113495bSYour Name #ifndef CONFIG_SAWF
1310*5113495bSYour Name static inline
dp_peer_sawf_stats_ctx_alloc(struct dp_soc * soc,struct dp_txrx_peer * txrx_peer)1311*5113495bSYour Name QDF_STATUS dp_peer_sawf_stats_ctx_alloc(struct dp_soc *soc,
1312*5113495bSYour Name 					struct dp_txrx_peer *txrx_peer)
1313*5113495bSYour Name {
1314*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1315*5113495bSYour Name }
1316*5113495bSYour Name 
1317*5113495bSYour Name static inline
dp_peer_sawf_stats_ctx_free(struct dp_soc * soc,struct dp_txrx_peer * txrx_peer)1318*5113495bSYour Name QDF_STATUS dp_peer_sawf_stats_ctx_free(struct dp_soc *soc,
1319*5113495bSYour Name 				       struct dp_txrx_peer *txrx_peer)
1320*5113495bSYour Name {
1321*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
1322*5113495bSYour Name }
1323*5113495bSYour Name #endif
1324*5113495bSYour Name 
1325*5113495bSYour Name /**
1326*5113495bSYour Name  * dp_vdev_bss_peer_ref_n_get: Get bss peer of a vdev
1327*5113495bSYour Name  * @soc: DP soc
1328*5113495bSYour Name  * @vdev: vdev
1329*5113495bSYour Name  * @mod_id: id of module requesting reference
1330*5113495bSYour Name  *
1331*5113495bSYour Name  * Return: VDEV BSS peer
1332*5113495bSYour Name  */
1333*5113495bSYour Name struct dp_peer *dp_vdev_bss_peer_ref_n_get(struct dp_soc *soc,
1334*5113495bSYour Name 					   struct dp_vdev *vdev,
1335*5113495bSYour Name 					   enum dp_mod_id mod_id);
1336*5113495bSYour Name 
1337*5113495bSYour Name /**
1338*5113495bSYour Name  * dp_sta_vdev_self_peer_ref_n_get: Get self peer of sta vdev
1339*5113495bSYour Name  * @soc: DP soc
1340*5113495bSYour Name  * @vdev: vdev
1341*5113495bSYour Name  * @mod_id: id of module requesting reference
1342*5113495bSYour Name  *
1343*5113495bSYour Name  * Return: VDEV self peer
1344*5113495bSYour Name  */
1345*5113495bSYour Name struct dp_peer *dp_sta_vdev_self_peer_ref_n_get(struct dp_soc *soc,
1346*5113495bSYour Name 						struct dp_vdev *vdev,
1347*5113495bSYour Name 						enum dp_mod_id mod_id);
1348*5113495bSYour Name 
1349*5113495bSYour Name void dp_peer_ast_table_detach(struct dp_soc *soc);
1350*5113495bSYour Name 
1351*5113495bSYour Name /**
1352*5113495bSYour Name  * dp_peer_find_map_detach() - cleanup memory for peer_id_to_obj_map
1353*5113495bSYour Name  * @soc: soc handle
1354*5113495bSYour Name  *
1355*5113495bSYour Name  * Return: none
1356*5113495bSYour Name  */
1357*5113495bSYour Name void dp_peer_find_map_detach(struct dp_soc *soc);
1358*5113495bSYour Name 
1359*5113495bSYour Name void dp_soc_wds_detach(struct dp_soc *soc);
1360*5113495bSYour Name QDF_STATUS dp_peer_ast_table_attach(struct dp_soc *soc);
1361*5113495bSYour Name 
1362*5113495bSYour Name /**
1363*5113495bSYour Name  * dp_find_peer_by_macaddr() - Finding the peer from mac address provided.
1364*5113495bSYour Name  * @soc: soc handle
1365*5113495bSYour Name  * @mac_addr: MAC address to be used to find peer
1366*5113495bSYour Name  * @vdev_id: VDEV id
1367*5113495bSYour Name  * @mod_id: MODULE ID
1368*5113495bSYour Name  *
1369*5113495bSYour Name  * Return: struct dp_peer
1370*5113495bSYour Name  */
1371*5113495bSYour Name struct dp_peer *dp_find_peer_by_macaddr(struct dp_soc *soc, uint8_t *mac_addr,
1372*5113495bSYour Name 					uint8_t vdev_id, enum dp_mod_id mod_id);
1373*5113495bSYour Name /**
1374*5113495bSYour Name  * dp_peer_ast_hash_attach() - Allocate and initialize AST Hash Table
1375*5113495bSYour Name  * @soc: SoC handle
1376*5113495bSYour Name  *
1377*5113495bSYour Name  * Return: QDF_STATUS
1378*5113495bSYour Name  */
1379*5113495bSYour Name QDF_STATUS dp_peer_ast_hash_attach(struct dp_soc *soc);
1380*5113495bSYour Name 
1381*5113495bSYour Name /**
1382*5113495bSYour Name  * dp_peer_mec_hash_attach() - Allocate and initialize MEC Hash Table
1383*5113495bSYour Name  * @soc: SoC handle
1384*5113495bSYour Name  *
1385*5113495bSYour Name  * Return: QDF_STATUS
1386*5113495bSYour Name  */
1387*5113495bSYour Name QDF_STATUS dp_peer_mec_hash_attach(struct dp_soc *soc);
1388*5113495bSYour Name 
1389*5113495bSYour Name /**
1390*5113495bSYour Name  * dp_del_wds_entry_wrapper() - delete a WDS AST entry
1391*5113495bSYour Name  * @soc: DP soc structure pointer
1392*5113495bSYour Name  * @vdev_id: vdev_id
1393*5113495bSYour Name  * @wds_macaddr: MAC address of ast node
1394*5113495bSYour Name  * @type: type from enum cdp_txrx_ast_entry_type
1395*5113495bSYour Name  * @delete_in_fw: Flag to indicate if entry needs to be deleted in fw
1396*5113495bSYour Name  *
1397*5113495bSYour Name  * This API is used to delete an AST entry from fw
1398*5113495bSYour Name  *
1399*5113495bSYour Name  * Return: None
1400*5113495bSYour Name  */
1401*5113495bSYour Name void dp_del_wds_entry_wrapper(struct dp_soc *soc, uint8_t vdev_id,
1402*5113495bSYour Name 			      uint8_t *wds_macaddr, uint8_t type,
1403*5113495bSYour Name 			      uint8_t delete_in_fw);
1404*5113495bSYour Name 
1405*5113495bSYour Name void dp_soc_wds_attach(struct dp_soc *soc);
1406*5113495bSYour Name 
1407*5113495bSYour Name /**
1408*5113495bSYour Name  * dp_peer_mec_hash_detach() - Free MEC Hash table
1409*5113495bSYour Name  * @soc: SoC handle
1410*5113495bSYour Name  *
1411*5113495bSYour Name  * Return: None
1412*5113495bSYour Name  */
1413*5113495bSYour Name void dp_peer_mec_hash_detach(struct dp_soc *soc);
1414*5113495bSYour Name 
1415*5113495bSYour Name /**
1416*5113495bSYour Name  * dp_peer_ast_hash_detach() - Free AST Hash table
1417*5113495bSYour Name  * @soc: SoC handle
1418*5113495bSYour Name  *
1419*5113495bSYour Name  * Return: None
1420*5113495bSYour Name  */
1421*5113495bSYour Name void dp_peer_ast_hash_detach(struct dp_soc *soc);
1422*5113495bSYour Name 
1423*5113495bSYour Name #ifdef FEATURE_AST
1424*5113495bSYour Name /**
1425*5113495bSYour Name  * dp_peer_delete_ast_entries(): Delete all AST entries for a peer
1426*5113495bSYour Name  * @soc: datapath soc handle
1427*5113495bSYour Name  * @peer: datapath peer handle
1428*5113495bSYour Name  *
1429*5113495bSYour Name  * Delete the AST entries belonging to a peer
1430*5113495bSYour Name  */
dp_peer_delete_ast_entries(struct dp_soc * soc,struct dp_peer * peer)1431*5113495bSYour Name static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
1432*5113495bSYour Name 					      struct dp_peer *peer)
1433*5113495bSYour Name {
1434*5113495bSYour Name 	struct dp_ast_entry *ast_entry, *temp_ast_entry;
1435*5113495bSYour Name 
1436*5113495bSYour Name 	dp_peer_debug("peer: %pK, self_ast: %pK", peer, peer->self_ast_entry);
1437*5113495bSYour Name 	/*
1438*5113495bSYour Name 	 * Delete peer self ast entry. This is done to handle scenarios
1439*5113495bSYour Name 	 * where peer is freed before peer map is received(for ex in case
1440*5113495bSYour Name 	 * of auth disallow due to ACL) in such cases self ast is not added
1441*5113495bSYour Name 	 * to peer->ast_list.
1442*5113495bSYour Name 	 */
1443*5113495bSYour Name 	if (peer->self_ast_entry) {
1444*5113495bSYour Name 		dp_peer_del_ast(soc, peer->self_ast_entry);
1445*5113495bSYour Name 		peer->self_ast_entry = NULL;
1446*5113495bSYour Name 	}
1447*5113495bSYour Name 
1448*5113495bSYour Name 	DP_PEER_ITERATE_ASE_LIST(peer, ast_entry, temp_ast_entry)
1449*5113495bSYour Name 		dp_peer_del_ast(soc, ast_entry);
1450*5113495bSYour Name }
1451*5113495bSYour Name 
1452*5113495bSYour Name /**
1453*5113495bSYour Name  * dp_print_peer_ast_entries() - Dump AST entries of peer
1454*5113495bSYour Name  * @soc: Datapath soc handle
1455*5113495bSYour Name  * @peer: Datapath peer
1456*5113495bSYour Name  * @arg: argument to iterate function
1457*5113495bSYour Name  *
1458*5113495bSYour Name  * Return: void
1459*5113495bSYour Name  */
1460*5113495bSYour Name void dp_print_peer_ast_entries(struct dp_soc *soc, struct dp_peer *peer,
1461*5113495bSYour Name 			       void *arg);
1462*5113495bSYour Name #else
dp_print_peer_ast_entries(struct dp_soc * soc,struct dp_peer * peer,void * arg)1463*5113495bSYour Name static inline void dp_print_peer_ast_entries(struct dp_soc *soc,
1464*5113495bSYour Name 					     struct dp_peer *peer, void *arg)
1465*5113495bSYour Name {
1466*5113495bSYour Name }
1467*5113495bSYour Name 
dp_peer_delete_ast_entries(struct dp_soc * soc,struct dp_peer * peer)1468*5113495bSYour Name static inline void dp_peer_delete_ast_entries(struct dp_soc *soc,
1469*5113495bSYour Name 					      struct dp_peer *peer)
1470*5113495bSYour Name {
1471*5113495bSYour Name }
1472*5113495bSYour Name #endif
1473*5113495bSYour Name 
1474*5113495bSYour Name #ifdef FEATURE_MEC
1475*5113495bSYour Name /**
1476*5113495bSYour Name  * dp_peer_mec_spinlock_create() - Create the MEC spinlock
1477*5113495bSYour Name  * @soc: SoC handle
1478*5113495bSYour Name  *
1479*5113495bSYour Name  * Return: none
1480*5113495bSYour Name  */
1481*5113495bSYour Name void dp_peer_mec_spinlock_create(struct dp_soc *soc);
1482*5113495bSYour Name 
1483*5113495bSYour Name /**
1484*5113495bSYour Name  * dp_peer_mec_spinlock_destroy() - Destroy the MEC spinlock
1485*5113495bSYour Name  * @soc: SoC handle
1486*5113495bSYour Name  *
1487*5113495bSYour Name  * Return: none
1488*5113495bSYour Name  */
1489*5113495bSYour Name void dp_peer_mec_spinlock_destroy(struct dp_soc *soc);
1490*5113495bSYour Name 
1491*5113495bSYour Name /**
1492*5113495bSYour Name  * dp_peer_mec_flush_entries() - Delete all mec entries in table
1493*5113495bSYour Name  * @soc: Datapath SOC
1494*5113495bSYour Name  *
1495*5113495bSYour Name  * Return: None
1496*5113495bSYour Name  */
1497*5113495bSYour Name void dp_peer_mec_flush_entries(struct dp_soc *soc);
1498*5113495bSYour Name #else
dp_peer_mec_spinlock_create(struct dp_soc * soc)1499*5113495bSYour Name static inline void dp_peer_mec_spinlock_create(struct dp_soc *soc)
1500*5113495bSYour Name {
1501*5113495bSYour Name }
1502*5113495bSYour Name 
dp_peer_mec_spinlock_destroy(struct dp_soc * soc)1503*5113495bSYour Name static inline void dp_peer_mec_spinlock_destroy(struct dp_soc *soc)
1504*5113495bSYour Name {
1505*5113495bSYour Name }
1506*5113495bSYour Name 
dp_peer_mec_flush_entries(struct dp_soc * soc)1507*5113495bSYour Name static inline void dp_peer_mec_flush_entries(struct dp_soc *soc)
1508*5113495bSYour Name {
1509*5113495bSYour Name }
1510*5113495bSYour Name #endif
1511*5113495bSYour Name 
dp_peer_find_mac_addr_cmp(union dp_align_mac_addr * mac_addr1,union dp_align_mac_addr * mac_addr2)1512*5113495bSYour Name static inline int dp_peer_find_mac_addr_cmp(
1513*5113495bSYour Name 	union dp_align_mac_addr *mac_addr1,
1514*5113495bSYour Name 	union dp_align_mac_addr *mac_addr2)
1515*5113495bSYour Name {
1516*5113495bSYour Name 		/*
1517*5113495bSYour Name 		 * Intentionally use & rather than &&.
1518*5113495bSYour Name 		 * because the operands are binary rather than generic boolean,
1519*5113495bSYour Name 		 * the functionality is equivalent.
1520*5113495bSYour Name 		 * Using && has the advantage of short-circuited evaluation,
1521*5113495bSYour Name 		 * but using & has the advantage of no conditional branching,
1522*5113495bSYour Name 		 * which is a more significant benefit.
1523*5113495bSYour Name 		 */
1524*5113495bSYour Name 	return !((mac_addr1->align4.bytes_abcd == mac_addr2->align4.bytes_abcd)
1525*5113495bSYour Name 		 & (mac_addr1->align4.bytes_ef == mac_addr2->align4.bytes_ef));
1526*5113495bSYour Name }
1527*5113495bSYour Name 
1528*5113495bSYour Name /**
1529*5113495bSYour Name  * dp_peer_delete() - delete DP peer
1530*5113495bSYour Name  *
1531*5113495bSYour Name  * @soc: Datatpath soc
1532*5113495bSYour Name  * @peer: Datapath peer
1533*5113495bSYour Name  * @arg: argument to iter function
1534*5113495bSYour Name  *
1535*5113495bSYour Name  * Return: void
1536*5113495bSYour Name  */
1537*5113495bSYour Name void dp_peer_delete(struct dp_soc *soc,
1538*5113495bSYour Name 		    struct dp_peer *peer,
1539*5113495bSYour Name 		    void *arg);
1540*5113495bSYour Name 
1541*5113495bSYour Name /**
1542*5113495bSYour Name  * dp_mlo_peer_delete() - delete MLO DP peer
1543*5113495bSYour Name  *
1544*5113495bSYour Name  * @soc: Datapath soc
1545*5113495bSYour Name  * @peer: Datapath peer
1546*5113495bSYour Name  * @arg: argument to iter function
1547*5113495bSYour Name  *
1548*5113495bSYour Name  * Return: void
1549*5113495bSYour Name  */
1550*5113495bSYour Name void dp_mlo_peer_delete(struct dp_soc *soc, struct dp_peer *peer, void *arg);
1551*5113495bSYour Name 
1552*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
1553*5113495bSYour Name 
1554*5113495bSYour Name /* is MLO connection mld peer */
1555*5113495bSYour Name #define IS_MLO_DP_MLD_TXRX_PEER(_peer) ((_peer)->mld_peer)
1556*5113495bSYour Name 
1557*5113495bSYour Name /* set peer type */
1558*5113495bSYour Name #define DP_PEER_SET_TYPE(_peer, _type_val) \
1559*5113495bSYour Name 	((_peer)->peer_type = (_type_val))
1560*5113495bSYour Name 
1561*5113495bSYour Name /* is legacy peer */
1562*5113495bSYour Name #define IS_DP_LEGACY_PEER(_peer) \
1563*5113495bSYour Name 	((_peer)->peer_type == CDP_LINK_PEER_TYPE && !((_peer)->mld_peer))
1564*5113495bSYour Name /* is MLO connection link peer */
1565*5113495bSYour Name #define IS_MLO_DP_LINK_PEER(_peer) \
1566*5113495bSYour Name 	((_peer)->peer_type == CDP_LINK_PEER_TYPE && (_peer)->mld_peer)
1567*5113495bSYour Name /* is MLO connection mld peer */
1568*5113495bSYour Name #define IS_MLO_DP_MLD_PEER(_peer) \
1569*5113495bSYour Name 	((_peer)->peer_type == CDP_MLD_PEER_TYPE)
1570*5113495bSYour Name /* Get Mld peer from link peer */
1571*5113495bSYour Name #define DP_GET_MLD_PEER_FROM_PEER(link_peer) \
1572*5113495bSYour Name 	((link_peer)->mld_peer)
1573*5113495bSYour Name 
1574*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
dp_get_chip_id(struct dp_soc * soc)1575*5113495bSYour Name static inline uint8_t dp_get_chip_id(struct dp_soc *soc)
1576*5113495bSYour Name {
1577*5113495bSYour Name 	if (soc->arch_ops.mlo_get_chip_id)
1578*5113495bSYour Name 		return soc->arch_ops.mlo_get_chip_id(soc);
1579*5113495bSYour Name 
1580*5113495bSYour Name 	return 0;
1581*5113495bSYour Name }
1582*5113495bSYour Name 
1583*5113495bSYour Name static inline struct dp_peer *
dp_link_peer_hash_find_by_chip_id(struct dp_soc * soc,uint8_t * peer_mac_addr,int mac_addr_is_aligned,uint8_t vdev_id,uint8_t chip_id,enum dp_mod_id mod_id)1584*5113495bSYour Name dp_link_peer_hash_find_by_chip_id(struct dp_soc *soc,
1585*5113495bSYour Name 				  uint8_t *peer_mac_addr,
1586*5113495bSYour Name 				  int mac_addr_is_aligned,
1587*5113495bSYour Name 				  uint8_t vdev_id,
1588*5113495bSYour Name 				  uint8_t chip_id,
1589*5113495bSYour Name 				  enum dp_mod_id mod_id)
1590*5113495bSYour Name {
1591*5113495bSYour Name 	if (soc->arch_ops.mlo_link_peer_find_hash_find_by_chip_id)
1592*5113495bSYour Name 		return soc->arch_ops.mlo_link_peer_find_hash_find_by_chip_id
1593*5113495bSYour Name 							(soc, peer_mac_addr,
1594*5113495bSYour Name 							 mac_addr_is_aligned,
1595*5113495bSYour Name 							 vdev_id, chip_id,
1596*5113495bSYour Name 							 mod_id);
1597*5113495bSYour Name 
1598*5113495bSYour Name 	return NULL;
1599*5113495bSYour Name }
1600*5113495bSYour Name #else
dp_get_chip_id(struct dp_soc * soc)1601*5113495bSYour Name static inline uint8_t dp_get_chip_id(struct dp_soc *soc)
1602*5113495bSYour Name {
1603*5113495bSYour Name 	return 0;
1604*5113495bSYour Name }
1605*5113495bSYour Name 
1606*5113495bSYour Name static inline struct dp_peer *
dp_link_peer_hash_find_by_chip_id(struct dp_soc * soc,uint8_t * peer_mac_addr,int mac_addr_is_aligned,uint8_t vdev_id,uint8_t chip_id,enum dp_mod_id mod_id)1607*5113495bSYour Name dp_link_peer_hash_find_by_chip_id(struct dp_soc *soc,
1608*5113495bSYour Name 				  uint8_t *peer_mac_addr,
1609*5113495bSYour Name 				  int mac_addr_is_aligned,
1610*5113495bSYour Name 				  uint8_t vdev_id,
1611*5113495bSYour Name 				  uint8_t chip_id,
1612*5113495bSYour Name 				  enum dp_mod_id mod_id)
1613*5113495bSYour Name {
1614*5113495bSYour Name 	return dp_peer_find_hash_find(soc, peer_mac_addr,
1615*5113495bSYour Name 				      mac_addr_is_aligned,
1616*5113495bSYour Name 				      vdev_id, mod_id);
1617*5113495bSYour Name }
1618*5113495bSYour Name #endif
1619*5113495bSYour Name 
1620*5113495bSYour Name /**
1621*5113495bSYour Name  * dp_mld_peer_find_hash_find() - returns mld peer from mld peer_hash_table
1622*5113495bSYour Name  *				  matching mac_address
1623*5113495bSYour Name  * @soc: soc handle
1624*5113495bSYour Name  * @peer_mac_addr: mld peer mac address
1625*5113495bSYour Name  * @mac_addr_is_aligned: is mac addr aligned
1626*5113495bSYour Name  * @vdev_id: vdev_id
1627*5113495bSYour Name  * @mod_id: id of module requesting reference
1628*5113495bSYour Name  *
1629*5113495bSYour Name  * Return: peer in success
1630*5113495bSYour Name  *         NULL in failure
1631*5113495bSYour Name  */
1632*5113495bSYour Name static inline
dp_mld_peer_find_hash_find(struct dp_soc * soc,uint8_t * peer_mac_addr,int mac_addr_is_aligned,uint8_t vdev_id,enum dp_mod_id mod_id)1633*5113495bSYour Name struct dp_peer *dp_mld_peer_find_hash_find(struct dp_soc *soc,
1634*5113495bSYour Name 					   uint8_t *peer_mac_addr,
1635*5113495bSYour Name 					   int mac_addr_is_aligned,
1636*5113495bSYour Name 					   uint8_t vdev_id,
1637*5113495bSYour Name 					   enum dp_mod_id mod_id)
1638*5113495bSYour Name {
1639*5113495bSYour Name 	if (soc->arch_ops.mlo_peer_find_hash_find)
1640*5113495bSYour Name 		return soc->arch_ops.mlo_peer_find_hash_find(soc,
1641*5113495bSYour Name 					      peer_mac_addr,
1642*5113495bSYour Name 					      mac_addr_is_aligned,
1643*5113495bSYour Name 					      mod_id, vdev_id);
1644*5113495bSYour Name 	return NULL;
1645*5113495bSYour Name }
1646*5113495bSYour Name 
1647*5113495bSYour Name /**
1648*5113495bSYour Name  * dp_peer_hash_find_wrapper() - find link peer or mld per according to
1649*5113495bSYour Name  *				 peer_type
1650*5113495bSYour Name  * @soc: DP SOC handle
1651*5113495bSYour Name  * @peer_info: peer information for hash find
1652*5113495bSYour Name  * @mod_id: ID of module requesting reference
1653*5113495bSYour Name  *
1654*5113495bSYour Name  * Return: peer handle
1655*5113495bSYour Name  */
1656*5113495bSYour Name static inline
dp_peer_hash_find_wrapper(struct dp_soc * soc,struct cdp_peer_info * peer_info,enum dp_mod_id mod_id)1657*5113495bSYour Name struct dp_peer *dp_peer_hash_find_wrapper(struct dp_soc *soc,
1658*5113495bSYour Name 					  struct cdp_peer_info *peer_info,
1659*5113495bSYour Name 					  enum dp_mod_id mod_id)
1660*5113495bSYour Name {
1661*5113495bSYour Name 	struct dp_peer *peer = NULL;
1662*5113495bSYour Name 
1663*5113495bSYour Name 	if (peer_info->peer_type == CDP_LINK_PEER_TYPE ||
1664*5113495bSYour Name 	    peer_info->peer_type == CDP_WILD_PEER_TYPE) {
1665*5113495bSYour Name 		peer = dp_peer_find_hash_find(soc, peer_info->mac_addr,
1666*5113495bSYour Name 					      peer_info->mac_addr_is_aligned,
1667*5113495bSYour Name 					      peer_info->vdev_id,
1668*5113495bSYour Name 					      mod_id);
1669*5113495bSYour Name 		if (peer)
1670*5113495bSYour Name 			return peer;
1671*5113495bSYour Name 	}
1672*5113495bSYour Name 	if (peer_info->peer_type == CDP_MLD_PEER_TYPE ||
1673*5113495bSYour Name 	    peer_info->peer_type == CDP_WILD_PEER_TYPE)
1674*5113495bSYour Name 		peer = dp_mld_peer_find_hash_find(
1675*5113495bSYour Name 					soc, peer_info->mac_addr,
1676*5113495bSYour Name 					peer_info->mac_addr_is_aligned,
1677*5113495bSYour Name 					peer_info->vdev_id,
1678*5113495bSYour Name 					mod_id);
1679*5113495bSYour Name 	return peer;
1680*5113495bSYour Name }
1681*5113495bSYour Name 
1682*5113495bSYour Name /**
1683*5113495bSYour Name  * dp_link_peer_add_mld_peer() - add mld peer pointer to link peer,
1684*5113495bSYour Name  *				 increase mld peer ref_cnt
1685*5113495bSYour Name  * @link_peer: link peer pointer
1686*5113495bSYour Name  * @mld_peer: mld peer pointer
1687*5113495bSYour Name  *
1688*5113495bSYour Name  * Return: none
1689*5113495bSYour Name  */
1690*5113495bSYour Name static inline
dp_link_peer_add_mld_peer(struct dp_peer * link_peer,struct dp_peer * mld_peer)1691*5113495bSYour Name void dp_link_peer_add_mld_peer(struct dp_peer *link_peer,
1692*5113495bSYour Name 			       struct dp_peer *mld_peer)
1693*5113495bSYour Name {
1694*5113495bSYour Name 	/* increase mld_peer ref_cnt */
1695*5113495bSYour Name 	dp_peer_get_ref(NULL, mld_peer, DP_MOD_ID_CDP);
1696*5113495bSYour Name 	link_peer->mld_peer = mld_peer;
1697*5113495bSYour Name }
1698*5113495bSYour Name 
1699*5113495bSYour Name /**
1700*5113495bSYour Name  * dp_link_peer_del_mld_peer() - delete mld peer pointer from link peer,
1701*5113495bSYour Name  *				 decrease mld peer ref_cnt
1702*5113495bSYour Name  * @link_peer: link peer pointer
1703*5113495bSYour Name  *
1704*5113495bSYour Name  * Return: None
1705*5113495bSYour Name  */
1706*5113495bSYour Name static inline
dp_link_peer_del_mld_peer(struct dp_peer * link_peer)1707*5113495bSYour Name void dp_link_peer_del_mld_peer(struct dp_peer *link_peer)
1708*5113495bSYour Name {
1709*5113495bSYour Name 	dp_peer_unref_delete(link_peer->mld_peer, DP_MOD_ID_CDP);
1710*5113495bSYour Name 	link_peer->mld_peer = NULL;
1711*5113495bSYour Name }
1712*5113495bSYour Name 
1713*5113495bSYour Name /**
1714*5113495bSYour Name  * dp_mld_peer_init_link_peers_info() - init link peers info in mld peer
1715*5113495bSYour Name  * @mld_peer: mld peer pointer
1716*5113495bSYour Name  *
1717*5113495bSYour Name  * Return: None
1718*5113495bSYour Name  */
1719*5113495bSYour Name static inline
dp_mld_peer_init_link_peers_info(struct dp_peer * mld_peer)1720*5113495bSYour Name void dp_mld_peer_init_link_peers_info(struct dp_peer *mld_peer)
1721*5113495bSYour Name {
1722*5113495bSYour Name 	int i;
1723*5113495bSYour Name 
1724*5113495bSYour Name 	qdf_spinlock_create(&mld_peer->link_peers_info_lock);
1725*5113495bSYour Name 	mld_peer->num_links = 0;
1726*5113495bSYour Name 	for (i = 0; i < DP_MAX_MLO_LINKS; i++)
1727*5113495bSYour Name 		mld_peer->link_peers[i].is_valid = false;
1728*5113495bSYour Name }
1729*5113495bSYour Name 
1730*5113495bSYour Name /**
1731*5113495bSYour Name  * dp_mld_peer_deinit_link_peers_info() - Deinit link peers info in mld peer
1732*5113495bSYour Name  * @mld_peer: mld peer pointer
1733*5113495bSYour Name  *
1734*5113495bSYour Name  * Return: None
1735*5113495bSYour Name  */
1736*5113495bSYour Name static inline
dp_mld_peer_deinit_link_peers_info(struct dp_peer * mld_peer)1737*5113495bSYour Name void dp_mld_peer_deinit_link_peers_info(struct dp_peer *mld_peer)
1738*5113495bSYour Name {
1739*5113495bSYour Name 	qdf_spinlock_destroy(&mld_peer->link_peers_info_lock);
1740*5113495bSYour Name }
1741*5113495bSYour Name 
1742*5113495bSYour Name /**
1743*5113495bSYour Name  * dp_mld_peer_add_link_peer() - add link peer info to mld peer
1744*5113495bSYour Name  * @mld_peer: mld dp peer pointer
1745*5113495bSYour Name  * @link_peer: link dp peer pointer
1746*5113495bSYour Name  * @is_bridge_peer: flag to indicate if peer is bridge peer
1747*5113495bSYour Name  *
1748*5113495bSYour Name  * Return: None
1749*5113495bSYour Name  */
1750*5113495bSYour Name static inline
dp_mld_peer_add_link_peer(struct dp_peer * mld_peer,struct dp_peer * link_peer,uint8_t is_bridge_peer)1751*5113495bSYour Name void dp_mld_peer_add_link_peer(struct dp_peer *mld_peer,
1752*5113495bSYour Name 			       struct dp_peer *link_peer,
1753*5113495bSYour Name 			       uint8_t is_bridge_peer)
1754*5113495bSYour Name {
1755*5113495bSYour Name 	int i;
1756*5113495bSYour Name 	struct dp_peer_link_info *link_peer_info;
1757*5113495bSYour Name 	struct dp_soc *soc = mld_peer->vdev->pdev->soc;
1758*5113495bSYour Name 
1759*5113495bSYour Name 	qdf_spin_lock_bh(&mld_peer->link_peers_info_lock);
1760*5113495bSYour Name 	for (i = 0; i < DP_MAX_MLO_LINKS; i++) {
1761*5113495bSYour Name 		link_peer_info = &mld_peer->link_peers[i];
1762*5113495bSYour Name 		if (!link_peer_info->is_valid) {
1763*5113495bSYour Name 			qdf_mem_copy(link_peer_info->mac_addr.raw,
1764*5113495bSYour Name 				     link_peer->mac_addr.raw,
1765*5113495bSYour Name 				     QDF_MAC_ADDR_SIZE);
1766*5113495bSYour Name 			link_peer_info->is_valid = true;
1767*5113495bSYour Name 			link_peer_info->vdev_id = link_peer->vdev->vdev_id;
1768*5113495bSYour Name 			link_peer_info->chip_id =
1769*5113495bSYour Name 				dp_get_chip_id(link_peer->vdev->pdev->soc);
1770*5113495bSYour Name 			link_peer_info->is_bridge_peer = is_bridge_peer;
1771*5113495bSYour Name 			mld_peer->num_links++;
1772*5113495bSYour Name 			break;
1773*5113495bSYour Name 		}
1774*5113495bSYour Name 	}
1775*5113495bSYour Name 	qdf_spin_unlock_bh(&mld_peer->link_peers_info_lock);
1776*5113495bSYour Name 
1777*5113495bSYour Name 	dp_peer_info("%s addition of link peer %pK (" QDF_MAC_ADDR_FMT ") "
1778*5113495bSYour Name 		     "to MLD peer %pK (" QDF_MAC_ADDR_FMT "), "
1779*5113495bSYour Name 		     "idx %u num_links %u",
1780*5113495bSYour Name 		     (i != DP_MAX_MLO_LINKS) ? "Successful" : "Failed",
1781*5113495bSYour Name 		     link_peer, QDF_MAC_ADDR_REF(link_peer->mac_addr.raw),
1782*5113495bSYour Name 		     mld_peer, QDF_MAC_ADDR_REF(mld_peer->mac_addr.raw),
1783*5113495bSYour Name 		     i, mld_peer->num_links);
1784*5113495bSYour Name 
1785*5113495bSYour Name 	dp_cfg_event_record_mlo_link_delink_evt(soc, DP_CFG_EVENT_MLO_ADD_LINK,
1786*5113495bSYour Name 						mld_peer, link_peer, i,
1787*5113495bSYour Name 						(i != DP_MAX_MLO_LINKS) ? 1 : 0);
1788*5113495bSYour Name }
1789*5113495bSYour Name 
1790*5113495bSYour Name /**
1791*5113495bSYour Name  * dp_mld_peer_del_link_peer() - Delete link peer info from MLD peer
1792*5113495bSYour Name  * @mld_peer: MLD dp peer pointer
1793*5113495bSYour Name  * @link_peer: link dp peer pointer
1794*5113495bSYour Name  *
1795*5113495bSYour Name  * Return: number of links left after deletion
1796*5113495bSYour Name  */
1797*5113495bSYour Name static inline
dp_mld_peer_del_link_peer(struct dp_peer * mld_peer,struct dp_peer * link_peer)1798*5113495bSYour Name uint8_t dp_mld_peer_del_link_peer(struct dp_peer *mld_peer,
1799*5113495bSYour Name 				  struct dp_peer *link_peer)
1800*5113495bSYour Name {
1801*5113495bSYour Name 	int i;
1802*5113495bSYour Name 	struct dp_peer_link_info *link_peer_info;
1803*5113495bSYour Name 	uint8_t num_links;
1804*5113495bSYour Name 	struct dp_soc *soc = mld_peer->vdev->pdev->soc;
1805*5113495bSYour Name 
1806*5113495bSYour Name 	qdf_spin_lock_bh(&mld_peer->link_peers_info_lock);
1807*5113495bSYour Name 	for (i = 0; i < DP_MAX_MLO_LINKS; i++) {
1808*5113495bSYour Name 		link_peer_info = &mld_peer->link_peers[i];
1809*5113495bSYour Name 		if (link_peer_info->is_valid &&
1810*5113495bSYour Name 		    !dp_peer_find_mac_addr_cmp(&link_peer->mac_addr,
1811*5113495bSYour Name 					&link_peer_info->mac_addr)) {
1812*5113495bSYour Name 			link_peer_info->is_valid = false;
1813*5113495bSYour Name 			mld_peer->num_links--;
1814*5113495bSYour Name 			break;
1815*5113495bSYour Name 		}
1816*5113495bSYour Name 	}
1817*5113495bSYour Name 	num_links = mld_peer->num_links;
1818*5113495bSYour Name 	qdf_spin_unlock_bh(&mld_peer->link_peers_info_lock);
1819*5113495bSYour Name 
1820*5113495bSYour Name 	dp_peer_info("%s deletion of link peer %pK (" QDF_MAC_ADDR_FMT ") "
1821*5113495bSYour Name 		     "from MLD peer %pK (" QDF_MAC_ADDR_FMT "), "
1822*5113495bSYour Name 		     "idx %u num_links %u",
1823*5113495bSYour Name 		     (i != DP_MAX_MLO_LINKS) ? "Successful" : "Failed",
1824*5113495bSYour Name 		     link_peer, QDF_MAC_ADDR_REF(link_peer->mac_addr.raw),
1825*5113495bSYour Name 		     mld_peer, QDF_MAC_ADDR_REF(mld_peer->mac_addr.raw),
1826*5113495bSYour Name 		     i, mld_peer->num_links);
1827*5113495bSYour Name 
1828*5113495bSYour Name 	dp_cfg_event_record_mlo_link_delink_evt(soc, DP_CFG_EVENT_MLO_DEL_LINK,
1829*5113495bSYour Name 						mld_peer, link_peer, i,
1830*5113495bSYour Name 						(i != DP_MAX_MLO_LINKS) ? 1 : 0);
1831*5113495bSYour Name 
1832*5113495bSYour Name 	return num_links;
1833*5113495bSYour Name }
1834*5113495bSYour Name 
1835*5113495bSYour Name /**
1836*5113495bSYour Name  * dp_get_link_peers_ref_from_mld_peer() - get link peers pointer and
1837*5113495bSYour Name  *					   increase link peers ref_cnt
1838*5113495bSYour Name  * @soc: dp_soc handle
1839*5113495bSYour Name  * @mld_peer: dp mld peer pointer
1840*5113495bSYour Name  * @mld_link_peers: structure that hold links peers pointer array and number
1841*5113495bSYour Name  * @mod_id: id of module requesting reference
1842*5113495bSYour Name  *
1843*5113495bSYour Name  * Return: None
1844*5113495bSYour Name  */
1845*5113495bSYour Name static inline
dp_get_link_peers_ref_from_mld_peer(struct dp_soc * soc,struct dp_peer * mld_peer,struct dp_mld_link_peers * mld_link_peers,enum dp_mod_id mod_id)1846*5113495bSYour Name void dp_get_link_peers_ref_from_mld_peer(
1847*5113495bSYour Name 				struct dp_soc *soc,
1848*5113495bSYour Name 				struct dp_peer *mld_peer,
1849*5113495bSYour Name 				struct dp_mld_link_peers *mld_link_peers,
1850*5113495bSYour Name 				enum dp_mod_id mod_id)
1851*5113495bSYour Name {
1852*5113495bSYour Name 	struct dp_peer *peer;
1853*5113495bSYour Name 	uint8_t i = 0, j = 0;
1854*5113495bSYour Name 	struct dp_peer_link_info *link_peer_info;
1855*5113495bSYour Name 
1856*5113495bSYour Name 	qdf_mem_zero(mld_link_peers, sizeof(*mld_link_peers));
1857*5113495bSYour Name 	qdf_spin_lock_bh(&mld_peer->link_peers_info_lock);
1858*5113495bSYour Name 	for (i = 0; i < DP_MAX_MLO_LINKS; i++)  {
1859*5113495bSYour Name 		link_peer_info = &mld_peer->link_peers[i];
1860*5113495bSYour Name 		if (link_peer_info->is_valid) {
1861*5113495bSYour Name 			peer = dp_link_peer_hash_find_by_chip_id(
1862*5113495bSYour Name 						soc,
1863*5113495bSYour Name 						link_peer_info->mac_addr.raw,
1864*5113495bSYour Name 						true,
1865*5113495bSYour Name 						link_peer_info->vdev_id,
1866*5113495bSYour Name 						link_peer_info->chip_id,
1867*5113495bSYour Name 						mod_id);
1868*5113495bSYour Name 			if (peer)
1869*5113495bSYour Name 				mld_link_peers->link_peers[j++] = peer;
1870*5113495bSYour Name 		}
1871*5113495bSYour Name 	}
1872*5113495bSYour Name 	qdf_spin_unlock_bh(&mld_peer->link_peers_info_lock);
1873*5113495bSYour Name 
1874*5113495bSYour Name 	mld_link_peers->num_links = j;
1875*5113495bSYour Name }
1876*5113495bSYour Name 
1877*5113495bSYour Name /**
1878*5113495bSYour Name  * dp_release_link_peers_ref() - release all link peers reference
1879*5113495bSYour Name  * @mld_link_peers: structure that hold links peers pointer array and number
1880*5113495bSYour Name  * @mod_id: id of module requesting reference
1881*5113495bSYour Name  *
1882*5113495bSYour Name  * Return: None.
1883*5113495bSYour Name  */
1884*5113495bSYour Name static inline
dp_release_link_peers_ref(struct dp_mld_link_peers * mld_link_peers,enum dp_mod_id mod_id)1885*5113495bSYour Name void dp_release_link_peers_ref(
1886*5113495bSYour Name 			struct dp_mld_link_peers *mld_link_peers,
1887*5113495bSYour Name 			enum dp_mod_id mod_id)
1888*5113495bSYour Name {
1889*5113495bSYour Name 	struct dp_peer *peer;
1890*5113495bSYour Name 	uint8_t i;
1891*5113495bSYour Name 
1892*5113495bSYour Name 	for (i = 0; i < mld_link_peers->num_links; i++) {
1893*5113495bSYour Name 		peer = mld_link_peers->link_peers[i];
1894*5113495bSYour Name 		if (peer)
1895*5113495bSYour Name 			dp_peer_unref_delete(peer, mod_id);
1896*5113495bSYour Name 		mld_link_peers->link_peers[i] = NULL;
1897*5113495bSYour Name 	}
1898*5113495bSYour Name 
1899*5113495bSYour Name 	 mld_link_peers->num_links = 0;
1900*5113495bSYour Name }
1901*5113495bSYour Name 
1902*5113495bSYour Name /**
1903*5113495bSYour Name  * dp_get_link_peer_id_by_lmac_id() - Get link peer id using peer id and lmac id
1904*5113495bSYour Name  * @soc: Datapath soc handle
1905*5113495bSYour Name  * @peer_id: peer id
1906*5113495bSYour Name  * @lmac_id: lmac id to find the link peer on given lmac
1907*5113495bSYour Name  *
1908*5113495bSYour Name  * Return: peer_id of link peer if found
1909*5113495bSYour Name  *         else return HTT_INVALID_PEER
1910*5113495bSYour Name  */
1911*5113495bSYour Name static inline
dp_get_link_peer_id_by_lmac_id(struct dp_soc * soc,uint16_t peer_id,uint8_t lmac_id)1912*5113495bSYour Name uint16_t dp_get_link_peer_id_by_lmac_id(struct dp_soc *soc, uint16_t peer_id,
1913*5113495bSYour Name 					uint8_t lmac_id)
1914*5113495bSYour Name {
1915*5113495bSYour Name 	uint8_t i;
1916*5113495bSYour Name 	struct dp_peer *peer;
1917*5113495bSYour Name 	struct dp_peer *link_peer;
1918*5113495bSYour Name 	struct dp_soc *link_peer_soc;
1919*5113495bSYour Name 	struct dp_mld_link_peers link_peers_info;
1920*5113495bSYour Name 	uint16_t link_peer_id = HTT_INVALID_PEER;
1921*5113495bSYour Name 
1922*5113495bSYour Name 	peer = dp_peer_get_ref_by_id(soc, peer_id, DP_MOD_ID_CDP);
1923*5113495bSYour Name 
1924*5113495bSYour Name 	if (!peer)
1925*5113495bSYour Name 		return HTT_INVALID_PEER;
1926*5113495bSYour Name 
1927*5113495bSYour Name 	if (IS_MLO_DP_MLD_PEER(peer)) {
1928*5113495bSYour Name 		/* get link peers with reference */
1929*5113495bSYour Name 		dp_get_link_peers_ref_from_mld_peer(soc, peer, &link_peers_info,
1930*5113495bSYour Name 						    DP_MOD_ID_CDP);
1931*5113495bSYour Name 
1932*5113495bSYour Name 		for (i = 0; i < link_peers_info.num_links; i++) {
1933*5113495bSYour Name 			link_peer = link_peers_info.link_peers[i];
1934*5113495bSYour Name 			link_peer_soc = link_peer->vdev->pdev->soc;
1935*5113495bSYour Name 			if ((link_peer_soc == soc) &&
1936*5113495bSYour Name 			    (link_peer->vdev->pdev->lmac_id == lmac_id)) {
1937*5113495bSYour Name 				link_peer_id = link_peer->peer_id;
1938*5113495bSYour Name 				break;
1939*5113495bSYour Name 			}
1940*5113495bSYour Name 		}
1941*5113495bSYour Name 		/* release link peers reference */
1942*5113495bSYour Name 		dp_release_link_peers_ref(&link_peers_info, DP_MOD_ID_CDP);
1943*5113495bSYour Name 	} else {
1944*5113495bSYour Name 		link_peer_id = peer_id;
1945*5113495bSYour Name 	}
1946*5113495bSYour Name 
1947*5113495bSYour Name 	dp_peer_unref_delete(peer, DP_MOD_ID_CDP);
1948*5113495bSYour Name 
1949*5113495bSYour Name 	return link_peer_id;
1950*5113495bSYour Name }
1951*5113495bSYour Name 
1952*5113495bSYour Name /**
1953*5113495bSYour Name  * dp_peer_get_tgt_peer_hash_find() - get dp_peer handle
1954*5113495bSYour Name  * @soc: soc handle
1955*5113495bSYour Name  * @peer_mac: peer mac address
1956*5113495bSYour Name  * @mac_addr_is_aligned: is mac addr aligned
1957*5113495bSYour Name  * @vdev_id: vdev_id
1958*5113495bSYour Name  * @mod_id: id of module requesting reference
1959*5113495bSYour Name  *
1960*5113495bSYour Name  * for MLO connection, get corresponding MLD peer,
1961*5113495bSYour Name  * otherwise get link peer for non-MLO case.
1962*5113495bSYour Name  *
1963*5113495bSYour Name  * Return: peer in success
1964*5113495bSYour Name  *         NULL in failure
1965*5113495bSYour Name  */
1966*5113495bSYour Name static inline
dp_peer_get_tgt_peer_hash_find(struct dp_soc * soc,uint8_t * peer_mac,int mac_addr_is_aligned,uint8_t vdev_id,enum dp_mod_id mod_id)1967*5113495bSYour Name struct dp_peer *dp_peer_get_tgt_peer_hash_find(struct dp_soc *soc,
1968*5113495bSYour Name 					       uint8_t *peer_mac,
1969*5113495bSYour Name 					       int mac_addr_is_aligned,
1970*5113495bSYour Name 					       uint8_t vdev_id,
1971*5113495bSYour Name 					       enum dp_mod_id mod_id)
1972*5113495bSYour Name {
1973*5113495bSYour Name 	struct dp_peer *ta_peer = NULL;
1974*5113495bSYour Name 	struct dp_peer *peer = dp_peer_find_hash_find(soc,
1975*5113495bSYour Name 						      peer_mac, 0, vdev_id,
1976*5113495bSYour Name 						      mod_id);
1977*5113495bSYour Name 
1978*5113495bSYour Name 	if (peer) {
1979*5113495bSYour Name 		/* mlo connection link peer, get mld peer with reference */
1980*5113495bSYour Name 		if (IS_MLO_DP_LINK_PEER(peer)) {
1981*5113495bSYour Name 			/* increase mld peer ref_cnt */
1982*5113495bSYour Name 			if (QDF_STATUS_SUCCESS ==
1983*5113495bSYour Name 			    dp_peer_get_ref(soc, peer->mld_peer, mod_id))
1984*5113495bSYour Name 				ta_peer = peer->mld_peer;
1985*5113495bSYour Name 			else
1986*5113495bSYour Name 				ta_peer = NULL;
1987*5113495bSYour Name 
1988*5113495bSYour Name 			/* release peer reference that added by hash find */
1989*5113495bSYour Name 			dp_peer_unref_delete(peer, mod_id);
1990*5113495bSYour Name 		} else {
1991*5113495bSYour Name 		/* mlo MLD peer or non-mlo link peer */
1992*5113495bSYour Name 			ta_peer = peer;
1993*5113495bSYour Name 		}
1994*5113495bSYour Name 	} else {
1995*5113495bSYour Name 		dp_peer_err("fail to find peer:" QDF_MAC_ADDR_FMT " vdev_id: %u",
1996*5113495bSYour Name 			    QDF_MAC_ADDR_REF(peer_mac), vdev_id);
1997*5113495bSYour Name 	}
1998*5113495bSYour Name 
1999*5113495bSYour Name 	return ta_peer;
2000*5113495bSYour Name }
2001*5113495bSYour Name 
2002*5113495bSYour Name /**
2003*5113495bSYour Name  * dp_peer_get_tgt_peer_by_id() - Returns target peer object given the peer id
2004*5113495bSYour Name  * @soc: core DP soc context
2005*5113495bSYour Name  * @peer_id: peer id from peer object can be retrieved
2006*5113495bSYour Name  * @mod_id: ID of module requesting reference
2007*5113495bSYour Name  *
2008*5113495bSYour Name  * for MLO connection, get corresponding MLD peer,
2009*5113495bSYour Name  * otherwise get link peer for non-MLO case.
2010*5113495bSYour Name  *
2011*5113495bSYour Name  * Return: peer in success
2012*5113495bSYour Name  *         NULL in failure
2013*5113495bSYour Name  */
2014*5113495bSYour Name static inline
dp_peer_get_tgt_peer_by_id(struct dp_soc * soc,uint16_t peer_id,enum dp_mod_id mod_id)2015*5113495bSYour Name struct dp_peer *dp_peer_get_tgt_peer_by_id(struct dp_soc *soc,
2016*5113495bSYour Name 					   uint16_t peer_id,
2017*5113495bSYour Name 					   enum dp_mod_id mod_id)
2018*5113495bSYour Name {
2019*5113495bSYour Name 	struct dp_peer *ta_peer = NULL;
2020*5113495bSYour Name 	struct dp_peer *peer = dp_peer_get_ref_by_id(soc, peer_id, mod_id);
2021*5113495bSYour Name 
2022*5113495bSYour Name 	if (peer) {
2023*5113495bSYour Name 		/* mlo connection link peer, get mld peer with reference */
2024*5113495bSYour Name 		if (IS_MLO_DP_LINK_PEER(peer)) {
2025*5113495bSYour Name 			/* increase mld peer ref_cnt */
2026*5113495bSYour Name 			if (QDF_STATUS_SUCCESS ==
2027*5113495bSYour Name 				dp_peer_get_ref(soc, peer->mld_peer, mod_id))
2028*5113495bSYour Name 				ta_peer = peer->mld_peer;
2029*5113495bSYour Name 			else
2030*5113495bSYour Name 				ta_peer = NULL;
2031*5113495bSYour Name 
2032*5113495bSYour Name 			/* release peer reference that added by hash find */
2033*5113495bSYour Name 			dp_peer_unref_delete(peer, mod_id);
2034*5113495bSYour Name 		} else {
2035*5113495bSYour Name 		/* mlo MLD peer or non-mlo link peer */
2036*5113495bSYour Name 			ta_peer = peer;
2037*5113495bSYour Name 		}
2038*5113495bSYour Name 	}
2039*5113495bSYour Name 
2040*5113495bSYour Name 	return ta_peer;
2041*5113495bSYour Name }
2042*5113495bSYour Name 
2043*5113495bSYour Name /**
2044*5113495bSYour Name  * dp_peer_mlo_delete() - peer MLO related delete operation
2045*5113495bSYour Name  * @peer: DP peer handle
2046*5113495bSYour Name  * Return: None
2047*5113495bSYour Name  */
2048*5113495bSYour Name static inline
dp_peer_mlo_delete(struct dp_peer * peer)2049*5113495bSYour Name void dp_peer_mlo_delete(struct dp_peer *peer)
2050*5113495bSYour Name {
2051*5113495bSYour Name 	struct dp_peer *ml_peer;
2052*5113495bSYour Name 	struct dp_soc *soc;
2053*5113495bSYour Name 
2054*5113495bSYour Name 	dp_info("peer " QDF_MAC_ADDR_FMT " type %d",
2055*5113495bSYour Name 		QDF_MAC_ADDR_REF(peer->mac_addr.raw), peer->peer_type);
2056*5113495bSYour Name 
2057*5113495bSYour Name 	/* MLO connection link peer */
2058*5113495bSYour Name 	if (IS_MLO_DP_LINK_PEER(peer)) {
2059*5113495bSYour Name 		ml_peer = peer->mld_peer;
2060*5113495bSYour Name 		soc = ml_peer->vdev->pdev->soc;
2061*5113495bSYour Name 
2062*5113495bSYour Name 		/* if last link peer deletion, delete MLD peer */
2063*5113495bSYour Name 		if (dp_mld_peer_del_link_peer(peer->mld_peer, peer) == 0)
2064*5113495bSYour Name 			dp_peer_delete(soc, peer->mld_peer, NULL);
2065*5113495bSYour Name 	}
2066*5113495bSYour Name }
2067*5113495bSYour Name 
2068*5113495bSYour Name /**
2069*5113495bSYour Name  * dp_peer_mlo_setup() - create MLD peer and MLO related initialization
2070*5113495bSYour Name  * @soc: Soc handle
2071*5113495bSYour Name  * @peer: DP peer handle
2072*5113495bSYour Name  * @vdev_id: Vdev ID
2073*5113495bSYour Name  * @setup_info: peer setup information for MLO
2074*5113495bSYour Name  */
2075*5113495bSYour Name QDF_STATUS dp_peer_mlo_setup(
2076*5113495bSYour Name 			struct dp_soc *soc,
2077*5113495bSYour Name 			struct dp_peer *peer,
2078*5113495bSYour Name 			uint8_t vdev_id,
2079*5113495bSYour Name 			struct cdp_peer_setup_info *setup_info);
2080*5113495bSYour Name 
2081*5113495bSYour Name /**
2082*5113495bSYour Name  * dp_get_tgt_peer_from_peer() - Get target peer from the given peer
2083*5113495bSYour Name  * @peer: datapath peer
2084*5113495bSYour Name  *
2085*5113495bSYour Name  * Return: MLD peer in case of MLO Link peer
2086*5113495bSYour Name  *	   Peer itself in other cases
2087*5113495bSYour Name  */
2088*5113495bSYour Name static inline
dp_get_tgt_peer_from_peer(struct dp_peer * peer)2089*5113495bSYour Name struct dp_peer *dp_get_tgt_peer_from_peer(struct dp_peer *peer)
2090*5113495bSYour Name {
2091*5113495bSYour Name 	return IS_MLO_DP_LINK_PEER(peer) ? peer->mld_peer : peer;
2092*5113495bSYour Name }
2093*5113495bSYour Name 
2094*5113495bSYour Name /**
2095*5113495bSYour Name  * dp_get_primary_link_peer_by_id(): Get primary link peer from the given
2096*5113495bSYour Name  *					peer id
2097*5113495bSYour Name  * @soc: core DP soc context
2098*5113495bSYour Name  * @peer_id: peer id
2099*5113495bSYour Name  * @mod_id: ID of module requesting reference
2100*5113495bSYour Name  *
2101*5113495bSYour Name  * Return: primary link peer for the MLO peer
2102*5113495bSYour Name  *	   legacy peer itself in case of legacy peer
2103*5113495bSYour Name  */
2104*5113495bSYour Name static inline
dp_get_primary_link_peer_by_id(struct dp_soc * soc,uint16_t peer_id,enum dp_mod_id mod_id)2105*5113495bSYour Name struct dp_peer *dp_get_primary_link_peer_by_id(struct dp_soc *soc,
2106*5113495bSYour Name 					       uint16_t peer_id,
2107*5113495bSYour Name 					       enum dp_mod_id mod_id)
2108*5113495bSYour Name {
2109*5113495bSYour Name 	uint8_t i;
2110*5113495bSYour Name 	struct dp_mld_link_peers link_peers_info;
2111*5113495bSYour Name 	struct dp_peer *peer;
2112*5113495bSYour Name 	struct dp_peer *link_peer;
2113*5113495bSYour Name 	struct dp_peer *primary_peer = NULL;
2114*5113495bSYour Name 
2115*5113495bSYour Name 	peer = dp_peer_get_ref_by_id(soc, peer_id, mod_id);
2116*5113495bSYour Name 
2117*5113495bSYour Name 	if (!peer)
2118*5113495bSYour Name 		return NULL;
2119*5113495bSYour Name 
2120*5113495bSYour Name 	if (IS_MLO_DP_MLD_PEER(peer)) {
2121*5113495bSYour Name 		/* get link peers with reference */
2122*5113495bSYour Name 		dp_get_link_peers_ref_from_mld_peer(soc, peer, &link_peers_info,
2123*5113495bSYour Name 						    mod_id);
2124*5113495bSYour Name 
2125*5113495bSYour Name 		for (i = 0; i < link_peers_info.num_links; i++) {
2126*5113495bSYour Name 			link_peer = link_peers_info.link_peers[i];
2127*5113495bSYour Name 			if (link_peer->primary_link) {
2128*5113495bSYour Name 				/*
2129*5113495bSYour Name 				 * Take additional reference over
2130*5113495bSYour Name 				 * primary link peer.
2131*5113495bSYour Name 				 */
2132*5113495bSYour Name 				if (QDF_STATUS_SUCCESS ==
2133*5113495bSYour Name 				    dp_peer_get_ref(NULL, link_peer, mod_id))
2134*5113495bSYour Name 					primary_peer = link_peer;
2135*5113495bSYour Name 				break;
2136*5113495bSYour Name 			}
2137*5113495bSYour Name 		}
2138*5113495bSYour Name 		/* release link peers reference */
2139*5113495bSYour Name 		dp_release_link_peers_ref(&link_peers_info, mod_id);
2140*5113495bSYour Name 		dp_peer_unref_delete(peer, mod_id);
2141*5113495bSYour Name 	} else {
2142*5113495bSYour Name 		primary_peer = peer;
2143*5113495bSYour Name 	}
2144*5113495bSYour Name 
2145*5113495bSYour Name 	return primary_peer;
2146*5113495bSYour Name }
2147*5113495bSYour Name 
2148*5113495bSYour Name /**
2149*5113495bSYour Name  * dp_get_txrx_peer() - Get dp_txrx_peer from passed dp_peer
2150*5113495bSYour Name  * @peer: Datapath peer
2151*5113495bSYour Name  *
2152*5113495bSYour Name  * Return: dp_txrx_peer from MLD peer if peer type is link peer
2153*5113495bSYour Name  *	   dp_txrx_peer from peer itself for other cases
2154*5113495bSYour Name  */
2155*5113495bSYour Name static inline
dp_get_txrx_peer(struct dp_peer * peer)2156*5113495bSYour Name struct dp_txrx_peer *dp_get_txrx_peer(struct dp_peer *peer)
2157*5113495bSYour Name {
2158*5113495bSYour Name 	return IS_MLO_DP_LINK_PEER(peer) ?
2159*5113495bSYour Name 				peer->mld_peer->txrx_peer : peer->txrx_peer;
2160*5113495bSYour Name }
2161*5113495bSYour Name 
2162*5113495bSYour Name /**
2163*5113495bSYour Name  * dp_peer_is_primary_link_peer() - Check if peer is primary link peer
2164*5113495bSYour Name  * @peer: Datapath peer
2165*5113495bSYour Name  *
2166*5113495bSYour Name  * Return: true if peer is primary link peer or legacy peer
2167*5113495bSYour Name  *	   false otherwise
2168*5113495bSYour Name  */
2169*5113495bSYour Name static inline
dp_peer_is_primary_link_peer(struct dp_peer * peer)2170*5113495bSYour Name bool dp_peer_is_primary_link_peer(struct dp_peer *peer)
2171*5113495bSYour Name {
2172*5113495bSYour Name 	if (IS_MLO_DP_LINK_PEER(peer) && peer->primary_link)
2173*5113495bSYour Name 		return true;
2174*5113495bSYour Name 	else if (IS_DP_LEGACY_PEER(peer))
2175*5113495bSYour Name 		return true;
2176*5113495bSYour Name 	else
2177*5113495bSYour Name 		return false;
2178*5113495bSYour Name }
2179*5113495bSYour Name 
2180*5113495bSYour Name /**
2181*5113495bSYour Name  * dp_tgt_txrx_peer_get_ref_by_id() - Gets tgt txrx peer for given the peer id
2182*5113495bSYour Name  *
2183*5113495bSYour Name  * @soc: core DP soc context
2184*5113495bSYour Name  * @peer_id: peer id from peer object can be retrieved
2185*5113495bSYour Name  * @handle: reference handle
2186*5113495bSYour Name  * @mod_id: ID of module requesting reference
2187*5113495bSYour Name  *
2188*5113495bSYour Name  * Return: struct dp_txrx_peer*: Pointer to txrx DP peer object
2189*5113495bSYour Name  */
2190*5113495bSYour Name static inline struct dp_txrx_peer *
dp_tgt_txrx_peer_get_ref_by_id(struct dp_soc * soc,uint16_t peer_id,dp_txrx_ref_handle * handle,enum dp_mod_id mod_id)2191*5113495bSYour Name dp_tgt_txrx_peer_get_ref_by_id(struct dp_soc *soc,
2192*5113495bSYour Name 			       uint16_t peer_id,
2193*5113495bSYour Name 			       dp_txrx_ref_handle *handle,
2194*5113495bSYour Name 			       enum dp_mod_id mod_id)
2195*5113495bSYour Name 
2196*5113495bSYour Name {
2197*5113495bSYour Name 	struct dp_peer *peer;
2198*5113495bSYour Name 	struct dp_txrx_peer *txrx_peer;
2199*5113495bSYour Name 
2200*5113495bSYour Name 	peer = dp_peer_get_ref_by_id(soc, peer_id, mod_id);
2201*5113495bSYour Name 	if (!peer)
2202*5113495bSYour Name 		return NULL;
2203*5113495bSYour Name 
2204*5113495bSYour Name 	txrx_peer = dp_get_txrx_peer(peer);
2205*5113495bSYour Name 	if (txrx_peer) {
2206*5113495bSYour Name 		*handle = (dp_txrx_ref_handle)peer;
2207*5113495bSYour Name 		return txrx_peer;
2208*5113495bSYour Name 	}
2209*5113495bSYour Name 
2210*5113495bSYour Name 	dp_peer_unref_delete(peer, mod_id);
2211*5113495bSYour Name 	return NULL;
2212*5113495bSYour Name }
2213*5113495bSYour Name 
2214*5113495bSYour Name /**
2215*5113495bSYour Name  * dp_print_mlo_ast_stats_be() - Print AST stats for MLO peers
2216*5113495bSYour Name  *
2217*5113495bSYour Name  * @soc: core DP soc context
2218*5113495bSYour Name  *
2219*5113495bSYour Name  * Return: void
2220*5113495bSYour Name  */
2221*5113495bSYour Name void dp_print_mlo_ast_stats_be(struct dp_soc *soc);
2222*5113495bSYour Name 
2223*5113495bSYour Name /**
2224*5113495bSYour Name  * dp_get_peer_link_id() - Get Link peer Link ID
2225*5113495bSYour Name  * @peer: Datapath peer
2226*5113495bSYour Name  *
2227*5113495bSYour Name  * Return: Link peer Link ID
2228*5113495bSYour Name  */
2229*5113495bSYour Name uint8_t dp_get_peer_link_id(struct dp_peer *peer);
2230*5113495bSYour Name #else
2231*5113495bSYour Name 
2232*5113495bSYour Name #define IS_MLO_DP_MLD_TXRX_PEER(_peer) false
2233*5113495bSYour Name 
2234*5113495bSYour Name #define DP_PEER_SET_TYPE(_peer, _type_val) /* no op */
2235*5113495bSYour Name /* is legacy peer */
2236*5113495bSYour Name #define IS_DP_LEGACY_PEER(_peer) true
2237*5113495bSYour Name #define IS_MLO_DP_LINK_PEER(_peer) false
2238*5113495bSYour Name #define IS_MLO_DP_MLD_PEER(_peer) false
2239*5113495bSYour Name #define DP_GET_MLD_PEER_FROM_PEER(link_peer) NULL
2240*5113495bSYour Name 
2241*5113495bSYour Name static inline
dp_peer_hash_find_wrapper(struct dp_soc * soc,struct cdp_peer_info * peer_info,enum dp_mod_id mod_id)2242*5113495bSYour Name struct dp_peer *dp_peer_hash_find_wrapper(struct dp_soc *soc,
2243*5113495bSYour Name 					  struct cdp_peer_info *peer_info,
2244*5113495bSYour Name 					  enum dp_mod_id mod_id)
2245*5113495bSYour Name {
2246*5113495bSYour Name 	return dp_peer_find_hash_find(soc, peer_info->mac_addr,
2247*5113495bSYour Name 				      peer_info->mac_addr_is_aligned,
2248*5113495bSYour Name 				      peer_info->vdev_id,
2249*5113495bSYour Name 				      mod_id);
2250*5113495bSYour Name }
2251*5113495bSYour Name 
2252*5113495bSYour Name static inline
dp_peer_get_tgt_peer_hash_find(struct dp_soc * soc,uint8_t * peer_mac,int mac_addr_is_aligned,uint8_t vdev_id,enum dp_mod_id mod_id)2253*5113495bSYour Name struct dp_peer *dp_peer_get_tgt_peer_hash_find(struct dp_soc *soc,
2254*5113495bSYour Name 					       uint8_t *peer_mac,
2255*5113495bSYour Name 					       int mac_addr_is_aligned,
2256*5113495bSYour Name 					       uint8_t vdev_id,
2257*5113495bSYour Name 					       enum dp_mod_id mod_id)
2258*5113495bSYour Name {
2259*5113495bSYour Name 	return dp_peer_find_hash_find(soc, peer_mac,
2260*5113495bSYour Name 				      mac_addr_is_aligned, vdev_id,
2261*5113495bSYour Name 				      mod_id);
2262*5113495bSYour Name }
2263*5113495bSYour Name 
2264*5113495bSYour Name static inline
dp_peer_get_tgt_peer_by_id(struct dp_soc * soc,uint16_t peer_id,enum dp_mod_id mod_id)2265*5113495bSYour Name struct dp_peer *dp_peer_get_tgt_peer_by_id(struct dp_soc *soc,
2266*5113495bSYour Name 					   uint16_t peer_id,
2267*5113495bSYour Name 					   enum dp_mod_id mod_id)
2268*5113495bSYour Name {
2269*5113495bSYour Name 	return dp_peer_get_ref_by_id(soc, peer_id, mod_id);
2270*5113495bSYour Name }
2271*5113495bSYour Name 
2272*5113495bSYour Name static inline
dp_peer_mlo_setup(struct dp_soc * soc,struct dp_peer * peer,uint8_t vdev_id,struct cdp_peer_setup_info * setup_info)2273*5113495bSYour Name QDF_STATUS dp_peer_mlo_setup(
2274*5113495bSYour Name 			struct dp_soc *soc,
2275*5113495bSYour Name 			struct dp_peer *peer,
2276*5113495bSYour Name 			uint8_t vdev_id,
2277*5113495bSYour Name 			struct cdp_peer_setup_info *setup_info)
2278*5113495bSYour Name {
2279*5113495bSYour Name 	return QDF_STATUS_SUCCESS;
2280*5113495bSYour Name }
2281*5113495bSYour Name 
2282*5113495bSYour Name static inline
dp_mld_peer_init_link_peers_info(struct dp_peer * mld_peer)2283*5113495bSYour Name void dp_mld_peer_init_link_peers_info(struct dp_peer *mld_peer)
2284*5113495bSYour Name {
2285*5113495bSYour Name }
2286*5113495bSYour Name 
2287*5113495bSYour Name static inline
dp_mld_peer_deinit_link_peers_info(struct dp_peer * mld_peer)2288*5113495bSYour Name void dp_mld_peer_deinit_link_peers_info(struct dp_peer *mld_peer)
2289*5113495bSYour Name {
2290*5113495bSYour Name }
2291*5113495bSYour Name 
2292*5113495bSYour Name static inline
dp_link_peer_del_mld_peer(struct dp_peer * link_peer)2293*5113495bSYour Name void dp_link_peer_del_mld_peer(struct dp_peer *link_peer)
2294*5113495bSYour Name {
2295*5113495bSYour Name }
2296*5113495bSYour Name 
2297*5113495bSYour Name static inline
dp_peer_mlo_delete(struct dp_peer * peer)2298*5113495bSYour Name void dp_peer_mlo_delete(struct dp_peer *peer)
2299*5113495bSYour Name {
2300*5113495bSYour Name }
2301*5113495bSYour Name 
2302*5113495bSYour Name static inline
dp_mlo_peer_authorize(struct dp_soc * soc,struct dp_peer * link_peer)2303*5113495bSYour Name void dp_mlo_peer_authorize(struct dp_soc *soc,
2304*5113495bSYour Name 			   struct dp_peer *link_peer)
2305*5113495bSYour Name {
2306*5113495bSYour Name }
2307*5113495bSYour Name 
dp_get_chip_id(struct dp_soc * soc)2308*5113495bSYour Name static inline uint8_t dp_get_chip_id(struct dp_soc *soc)
2309*5113495bSYour Name {
2310*5113495bSYour Name 	return 0;
2311*5113495bSYour Name }
2312*5113495bSYour Name 
2313*5113495bSYour Name static inline struct dp_peer *
dp_link_peer_hash_find_by_chip_id(struct dp_soc * soc,uint8_t * peer_mac_addr,int mac_addr_is_aligned,uint8_t vdev_id,uint8_t chip_id,enum dp_mod_id mod_id)2314*5113495bSYour Name dp_link_peer_hash_find_by_chip_id(struct dp_soc *soc,
2315*5113495bSYour Name 				  uint8_t *peer_mac_addr,
2316*5113495bSYour Name 				  int mac_addr_is_aligned,
2317*5113495bSYour Name 				  uint8_t vdev_id,
2318*5113495bSYour Name 				  uint8_t chip_id,
2319*5113495bSYour Name 				  enum dp_mod_id mod_id)
2320*5113495bSYour Name {
2321*5113495bSYour Name 	return dp_peer_find_hash_find(soc, peer_mac_addr,
2322*5113495bSYour Name 				      mac_addr_is_aligned,
2323*5113495bSYour Name 				      vdev_id, mod_id);
2324*5113495bSYour Name }
2325*5113495bSYour Name 
2326*5113495bSYour Name static inline
dp_get_tgt_peer_from_peer(struct dp_peer * peer)2327*5113495bSYour Name struct dp_peer *dp_get_tgt_peer_from_peer(struct dp_peer *peer)
2328*5113495bSYour Name {
2329*5113495bSYour Name 	return peer;
2330*5113495bSYour Name }
2331*5113495bSYour Name 
2332*5113495bSYour Name static inline
dp_get_primary_link_peer_by_id(struct dp_soc * soc,uint16_t peer_id,enum dp_mod_id mod_id)2333*5113495bSYour Name struct dp_peer *dp_get_primary_link_peer_by_id(struct dp_soc *soc,
2334*5113495bSYour Name 					       uint16_t peer_id,
2335*5113495bSYour Name 					       enum dp_mod_id mod_id)
2336*5113495bSYour Name {
2337*5113495bSYour Name 	return dp_peer_get_ref_by_id(soc, peer_id, mod_id);
2338*5113495bSYour Name }
2339*5113495bSYour Name 
2340*5113495bSYour Name static inline
dp_get_txrx_peer(struct dp_peer * peer)2341*5113495bSYour Name struct dp_txrx_peer *dp_get_txrx_peer(struct dp_peer *peer)
2342*5113495bSYour Name {
2343*5113495bSYour Name 	return peer->txrx_peer;
2344*5113495bSYour Name }
2345*5113495bSYour Name 
2346*5113495bSYour Name static inline
dp_peer_is_primary_link_peer(struct dp_peer * peer)2347*5113495bSYour Name bool dp_peer_is_primary_link_peer(struct dp_peer *peer)
2348*5113495bSYour Name {
2349*5113495bSYour Name 	return true;
2350*5113495bSYour Name }
2351*5113495bSYour Name 
2352*5113495bSYour Name /**
2353*5113495bSYour Name  * dp_tgt_txrx_peer_get_ref_by_id() - Gets tgt txrx peer for given the peer id
2354*5113495bSYour Name  *
2355*5113495bSYour Name  * @soc: core DP soc context
2356*5113495bSYour Name  * @peer_id: peer id from peer object can be retrieved
2357*5113495bSYour Name  * @handle: reference handle
2358*5113495bSYour Name  * @mod_id: ID of module requesting reference
2359*5113495bSYour Name  *
2360*5113495bSYour Name  * Return: struct dp_txrx_peer*: Pointer to txrx DP peer object
2361*5113495bSYour Name  */
2362*5113495bSYour Name static inline struct dp_txrx_peer *
dp_tgt_txrx_peer_get_ref_by_id(struct dp_soc * soc,uint16_t peer_id,dp_txrx_ref_handle * handle,enum dp_mod_id mod_id)2363*5113495bSYour Name dp_tgt_txrx_peer_get_ref_by_id(struct dp_soc *soc,
2364*5113495bSYour Name 			       uint16_t peer_id,
2365*5113495bSYour Name 			       dp_txrx_ref_handle *handle,
2366*5113495bSYour Name 			       enum dp_mod_id mod_id)
2367*5113495bSYour Name 
2368*5113495bSYour Name {
2369*5113495bSYour Name 	return dp_txrx_peer_get_ref_by_id(soc, peer_id, handle, mod_id);
2370*5113495bSYour Name }
2371*5113495bSYour Name 
2372*5113495bSYour Name static inline
dp_get_link_peer_id_by_lmac_id(struct dp_soc * soc,uint16_t peer_id,uint8_t lmac_id)2373*5113495bSYour Name uint16_t dp_get_link_peer_id_by_lmac_id(struct dp_soc *soc, uint16_t peer_id,
2374*5113495bSYour Name 					uint8_t lmac_id)
2375*5113495bSYour Name {
2376*5113495bSYour Name 	return peer_id;
2377*5113495bSYour Name }
2378*5113495bSYour Name 
dp_print_mlo_ast_stats_be(struct dp_soc * soc)2379*5113495bSYour Name static inline void dp_print_mlo_ast_stats_be(struct dp_soc *soc)
2380*5113495bSYour Name {
2381*5113495bSYour Name }
2382*5113495bSYour Name 
dp_get_peer_link_id(struct dp_peer * peer)2383*5113495bSYour Name static inline uint8_t dp_get_peer_link_id(struct dp_peer *peer)
2384*5113495bSYour Name {
2385*5113495bSYour Name 	return 0;
2386*5113495bSYour Name }
2387*5113495bSYour Name #endif /* WLAN_FEATURE_11BE_MLO */
2388*5113495bSYour Name 
2389*5113495bSYour Name static inline
dp_peer_defrag_rx_tids_init(struct dp_txrx_peer * txrx_peer)2390*5113495bSYour Name void dp_peer_defrag_rx_tids_init(struct dp_txrx_peer *txrx_peer)
2391*5113495bSYour Name {
2392*5113495bSYour Name 	uint8_t i;
2393*5113495bSYour Name 
2394*5113495bSYour Name 	qdf_mem_zero(&txrx_peer->rx_tid, DP_MAX_TIDS *
2395*5113495bSYour Name 		     sizeof(struct dp_rx_tid_defrag));
2396*5113495bSYour Name 
2397*5113495bSYour Name 	for (i = 0; i < DP_MAX_TIDS; i++)
2398*5113495bSYour Name 		qdf_spinlock_create(&txrx_peer->rx_tid[i].defrag_tid_lock);
2399*5113495bSYour Name }
2400*5113495bSYour Name 
2401*5113495bSYour Name static inline
dp_peer_defrag_rx_tids_deinit(struct dp_txrx_peer * txrx_peer)2402*5113495bSYour Name void dp_peer_defrag_rx_tids_deinit(struct dp_txrx_peer *txrx_peer)
2403*5113495bSYour Name {
2404*5113495bSYour Name 	uint8_t i;
2405*5113495bSYour Name 
2406*5113495bSYour Name 	for (i = 0; i < DP_MAX_TIDS; i++)
2407*5113495bSYour Name 		qdf_spinlock_destroy(&txrx_peer->rx_tid[i].defrag_tid_lock);
2408*5113495bSYour Name }
2409*5113495bSYour Name 
2410*5113495bSYour Name #ifdef PEER_CACHE_RX_PKTS
2411*5113495bSYour Name static inline
dp_peer_rx_bufq_resources_init(struct dp_txrx_peer * txrx_peer)2412*5113495bSYour Name void dp_peer_rx_bufq_resources_init(struct dp_txrx_peer *txrx_peer)
2413*5113495bSYour Name {
2414*5113495bSYour Name 	qdf_spinlock_create(&txrx_peer->bufq_info.bufq_lock);
2415*5113495bSYour Name 	txrx_peer->bufq_info.thresh = DP_RX_CACHED_BUFQ_THRESH;
2416*5113495bSYour Name 	qdf_list_create(&txrx_peer->bufq_info.cached_bufq,
2417*5113495bSYour Name 			DP_RX_CACHED_BUFQ_THRESH);
2418*5113495bSYour Name }
2419*5113495bSYour Name 
2420*5113495bSYour Name static inline
dp_peer_rx_bufq_resources_deinit(struct dp_txrx_peer * txrx_peer)2421*5113495bSYour Name void dp_peer_rx_bufq_resources_deinit(struct dp_txrx_peer *txrx_peer)
2422*5113495bSYour Name {
2423*5113495bSYour Name 	qdf_list_destroy(&txrx_peer->bufq_info.cached_bufq);
2424*5113495bSYour Name 	qdf_spinlock_destroy(&txrx_peer->bufq_info.bufq_lock);
2425*5113495bSYour Name }
2426*5113495bSYour Name 
2427*5113495bSYour Name #else
2428*5113495bSYour Name static inline
dp_peer_rx_bufq_resources_init(struct dp_txrx_peer * txrx_peer)2429*5113495bSYour Name void dp_peer_rx_bufq_resources_init(struct dp_txrx_peer *txrx_peer)
2430*5113495bSYour Name {
2431*5113495bSYour Name }
2432*5113495bSYour Name 
2433*5113495bSYour Name static inline
dp_peer_rx_bufq_resources_deinit(struct dp_txrx_peer * txrx_peer)2434*5113495bSYour Name void dp_peer_rx_bufq_resources_deinit(struct dp_txrx_peer *txrx_peer)
2435*5113495bSYour Name {
2436*5113495bSYour Name }
2437*5113495bSYour Name #endif
2438*5113495bSYour Name 
2439*5113495bSYour Name /**
2440*5113495bSYour Name  * dp_peer_update_state() - update dp peer state
2441*5113495bSYour Name  *
2442*5113495bSYour Name  * @soc: core DP soc context
2443*5113495bSYour Name  * @peer: DP peer
2444*5113495bSYour Name  * @state: new state
2445*5113495bSYour Name  *
2446*5113495bSYour Name  * Return: None
2447*5113495bSYour Name  */
2448*5113495bSYour Name static inline void
dp_peer_update_state(struct dp_soc * soc,struct dp_peer * peer,enum dp_peer_state state)2449*5113495bSYour Name dp_peer_update_state(struct dp_soc *soc,
2450*5113495bSYour Name 		     struct dp_peer *peer,
2451*5113495bSYour Name 		     enum dp_peer_state state)
2452*5113495bSYour Name {
2453*5113495bSYour Name 	uint8_t peer_state;
2454*5113495bSYour Name 
2455*5113495bSYour Name 	qdf_spin_lock_bh(&peer->peer_state_lock);
2456*5113495bSYour Name 	peer_state = peer->peer_state;
2457*5113495bSYour Name 
2458*5113495bSYour Name 	switch (state) {
2459*5113495bSYour Name 	case DP_PEER_STATE_INIT:
2460*5113495bSYour Name 		DP_PEER_STATE_ASSERT
2461*5113495bSYour Name 			(peer, state, (peer_state != DP_PEER_STATE_ACTIVE) &&
2462*5113495bSYour Name 			(peer_state != DP_PEER_STATE_LOGICAL_DELETE));
2463*5113495bSYour Name 		break;
2464*5113495bSYour Name 
2465*5113495bSYour Name 	case DP_PEER_STATE_ACTIVE:
2466*5113495bSYour Name 		DP_PEER_STATE_ASSERT(peer, state,
2467*5113495bSYour Name 				     (peer_state == DP_PEER_STATE_INIT));
2468*5113495bSYour Name 		break;
2469*5113495bSYour Name 
2470*5113495bSYour Name 	case DP_PEER_STATE_LOGICAL_DELETE:
2471*5113495bSYour Name 		DP_PEER_STATE_ASSERT(peer, state,
2472*5113495bSYour Name 				     (peer_state == DP_PEER_STATE_ACTIVE) ||
2473*5113495bSYour Name 				     (peer_state == DP_PEER_STATE_INIT));
2474*5113495bSYour Name 		break;
2475*5113495bSYour Name 
2476*5113495bSYour Name 	case DP_PEER_STATE_INACTIVE:
2477*5113495bSYour Name 		if (IS_MLO_DP_MLD_PEER(peer))
2478*5113495bSYour Name 			DP_PEER_STATE_ASSERT
2479*5113495bSYour Name 				(peer, state,
2480*5113495bSYour Name 				 (peer_state == DP_PEER_STATE_ACTIVE));
2481*5113495bSYour Name 		else
2482*5113495bSYour Name 			DP_PEER_STATE_ASSERT
2483*5113495bSYour Name 				(peer, state,
2484*5113495bSYour Name 				 (peer_state == DP_PEER_STATE_LOGICAL_DELETE));
2485*5113495bSYour Name 		break;
2486*5113495bSYour Name 
2487*5113495bSYour Name 	case DP_PEER_STATE_FREED:
2488*5113495bSYour Name 		if (peer->sta_self_peer)
2489*5113495bSYour Name 			DP_PEER_STATE_ASSERT
2490*5113495bSYour Name 			(peer, state, (peer_state == DP_PEER_STATE_INIT));
2491*5113495bSYour Name 		else
2492*5113495bSYour Name 			DP_PEER_STATE_ASSERT
2493*5113495bSYour Name 				(peer, state,
2494*5113495bSYour Name 				 (peer_state == DP_PEER_STATE_INACTIVE) ||
2495*5113495bSYour Name 				 (peer_state == DP_PEER_STATE_LOGICAL_DELETE));
2496*5113495bSYour Name 		break;
2497*5113495bSYour Name 
2498*5113495bSYour Name 	default:
2499*5113495bSYour Name 		qdf_spin_unlock_bh(&peer->peer_state_lock);
2500*5113495bSYour Name 		dp_alert("Invalid peer state %u for peer " QDF_MAC_ADDR_FMT,
2501*5113495bSYour Name 			 state, QDF_MAC_ADDR_REF(peer->mac_addr.raw));
2502*5113495bSYour Name 		return;
2503*5113495bSYour Name 	}
2504*5113495bSYour Name 	peer->peer_state = state;
2505*5113495bSYour Name 	qdf_spin_unlock_bh(&peer->peer_state_lock);
2506*5113495bSYour Name 	dp_info("Updating peer state from %u to %u mac " QDF_MAC_ADDR_FMT "\n",
2507*5113495bSYour Name 		peer_state, state,
2508*5113495bSYour Name 		QDF_MAC_ADDR_REF(peer->mac_addr.raw));
2509*5113495bSYour Name }
2510*5113495bSYour Name 
2511*5113495bSYour Name /**
2512*5113495bSYour Name  * dp_vdev_iterate_specific_peer_type() - API to iterate through vdev peer
2513*5113495bSYour Name  * list based on type of peer (Legacy or MLD peer)
2514*5113495bSYour Name  *
2515*5113495bSYour Name  * @vdev: DP vdev context
2516*5113495bSYour Name  * @func: function to be called for each peer
2517*5113495bSYour Name  * @arg: argument need to be passed to func
2518*5113495bSYour Name  * @mod_id: module_id
2519*5113495bSYour Name  * @peer_type: type of peer - MLO Link Peer or Legacy Peer
2520*5113495bSYour Name  *
2521*5113495bSYour Name  * Return: void
2522*5113495bSYour Name  */
2523*5113495bSYour Name static inline void
dp_vdev_iterate_specific_peer_type(struct dp_vdev * vdev,dp_peer_iter_func * func,void * arg,enum dp_mod_id mod_id,enum dp_peer_type peer_type)2524*5113495bSYour Name dp_vdev_iterate_specific_peer_type(struct dp_vdev *vdev,
2525*5113495bSYour Name 				   dp_peer_iter_func *func,
2526*5113495bSYour Name 				   void *arg, enum dp_mod_id mod_id,
2527*5113495bSYour Name 				   enum dp_peer_type peer_type)
2528*5113495bSYour Name {
2529*5113495bSYour Name 	struct dp_peer *peer;
2530*5113495bSYour Name 	struct dp_peer *tmp_peer;
2531*5113495bSYour Name 	struct dp_soc *soc = NULL;
2532*5113495bSYour Name 
2533*5113495bSYour Name 	if (!vdev || !vdev->pdev || !vdev->pdev->soc)
2534*5113495bSYour Name 		return;
2535*5113495bSYour Name 
2536*5113495bSYour Name 	soc = vdev->pdev->soc;
2537*5113495bSYour Name 
2538*5113495bSYour Name 	qdf_spin_lock_bh(&vdev->peer_list_lock);
2539*5113495bSYour Name 	TAILQ_FOREACH_SAFE(peer, &vdev->peer_list,
2540*5113495bSYour Name 			   peer_list_elem,
2541*5113495bSYour Name 			   tmp_peer) {
2542*5113495bSYour Name 		if (dp_peer_get_ref(soc, peer, mod_id) ==
2543*5113495bSYour Name 					QDF_STATUS_SUCCESS) {
2544*5113495bSYour Name 			if ((peer_type == DP_PEER_TYPE_LEGACY &&
2545*5113495bSYour Name 			     (IS_DP_LEGACY_PEER(peer))) ||
2546*5113495bSYour Name 			    (peer_type == DP_PEER_TYPE_MLO_LINK &&
2547*5113495bSYour Name 			     (IS_MLO_DP_LINK_PEER(peer)))) {
2548*5113495bSYour Name 				(*func)(soc, peer, arg);
2549*5113495bSYour Name 			}
2550*5113495bSYour Name 			dp_peer_unref_delete(peer, mod_id);
2551*5113495bSYour Name 		}
2552*5113495bSYour Name 	}
2553*5113495bSYour Name 	qdf_spin_unlock_bh(&vdev->peer_list_lock);
2554*5113495bSYour Name }
2555*5113495bSYour Name 
2556*5113495bSYour Name #ifdef REO_SHARED_QREF_TABLE_EN
2557*5113495bSYour Name void dp_peer_rx_reo_shared_qaddr_delete(struct dp_soc *soc,
2558*5113495bSYour Name 					struct dp_peer *peer);
2559*5113495bSYour Name #else
dp_peer_rx_reo_shared_qaddr_delete(struct dp_soc * soc,struct dp_peer * peer)2560*5113495bSYour Name static inline void dp_peer_rx_reo_shared_qaddr_delete(struct dp_soc *soc,
2561*5113495bSYour Name 						      struct dp_peer *peer) {}
2562*5113495bSYour Name #endif
2563*5113495bSYour Name 
2564*5113495bSYour Name /**
2565*5113495bSYour Name  * dp_peer_check_wds_ext_peer() - Check WDS ext peer
2566*5113495bSYour Name  *
2567*5113495bSYour Name  * @peer: DP peer
2568*5113495bSYour Name  *
2569*5113495bSYour Name  * Return: True for WDS ext peer, false otherwise
2570*5113495bSYour Name  */
2571*5113495bSYour Name bool dp_peer_check_wds_ext_peer(struct dp_peer *peer);
2572*5113495bSYour Name 
2573*5113495bSYour Name /**
2574*5113495bSYour Name  * dp_gen_ml_peer_id() - Generate MLD peer id for DP
2575*5113495bSYour Name  *
2576*5113495bSYour Name  * @soc: DP soc context
2577*5113495bSYour Name  * @peer_id: mld peer id
2578*5113495bSYour Name  *
2579*5113495bSYour Name  * Return: DP MLD peer id
2580*5113495bSYour Name  */
2581*5113495bSYour Name uint16_t dp_gen_ml_peer_id(struct dp_soc *soc, uint16_t peer_id);
2582*5113495bSYour Name 
2583*5113495bSYour Name #ifdef FEATURE_AST
2584*5113495bSYour Name /**
2585*5113495bSYour Name  * dp_peer_host_add_map_ast() - Add ast entry with HW AST Index
2586*5113495bSYour Name  * @soc: SoC handle
2587*5113495bSYour Name  * @peer_id: peer id from firmware
2588*5113495bSYour Name  * @mac_addr: MAC address of ast node
2589*5113495bSYour Name  * @hw_peer_id: HW AST Index returned by target in peer map event
2590*5113495bSYour Name  * @vdev_id: vdev id for VAP to which the peer belongs to
2591*5113495bSYour Name  * @ast_hash: ast hash value in HW
2592*5113495bSYour Name  * @is_wds: flag to indicate peer map event for WDS ast entry
2593*5113495bSYour Name  *
2594*5113495bSYour Name  * Return: QDF_STATUS code
2595*5113495bSYour Name  */
2596*5113495bSYour Name QDF_STATUS dp_peer_host_add_map_ast(struct dp_soc *soc, uint16_t peer_id,
2597*5113495bSYour Name 				    uint8_t *mac_addr, uint16_t hw_peer_id,
2598*5113495bSYour Name 				    uint8_t vdev_id, uint16_t ast_hash,
2599*5113495bSYour Name 				    uint8_t is_wds);
2600*5113495bSYour Name #endif
2601*5113495bSYour Name 
2602*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(DP_MLO_LINK_STATS_SUPPORT)
2603*5113495bSYour Name /**
2604*5113495bSYour Name  * dp_map_link_id_band: Set link id to band mapping in txrx_peer
2605*5113495bSYour Name  * @peer: dp peer pointer
2606*5113495bSYour Name  *
2607*5113495bSYour Name  * Return: None
2608*5113495bSYour Name  */
2609*5113495bSYour Name void dp_map_link_id_band(struct dp_peer *peer);
2610*5113495bSYour Name #else
2611*5113495bSYour Name static inline
dp_map_link_id_band(struct dp_peer * peer)2612*5113495bSYour Name void dp_map_link_id_band(struct dp_peer *peer)
2613*5113495bSYour Name {
2614*5113495bSYour Name }
2615*5113495bSYour Name #endif
2616*5113495bSYour Name #endif /* _DP_PEER_H_ */
2617