xref: /wlan-driver/qca-wifi-host-cmn/dp/wifi3.0/be/dp_be.h (revision 5113495b16420b49004c444715d2daae2066e7dc)
1*5113495bSYour Name /*
2*5113495bSYour Name  * Copyright (c) 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_BE_H
20*5113495bSYour Name #define __DP_BE_H
21*5113495bSYour Name 
22*5113495bSYour Name #include <dp_types.h>
23*5113495bSYour Name #include <hal_be_tx.h>
24*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
25*5113495bSYour Name #include "mlo/dp_mlo.h"
26*5113495bSYour Name #else
27*5113495bSYour Name #include <dp_peer.h>
28*5113495bSYour Name #endif
29*5113495bSYour Name #ifdef WIFI_MONITOR_SUPPORT
30*5113495bSYour Name #include <dp_mon.h>
31*5113495bSYour Name #endif
32*5113495bSYour Name 
33*5113495bSYour Name enum CMEM_MEM_CLIENTS {
34*5113495bSYour Name 	COOKIE_CONVERSION,
35*5113495bSYour Name 	FISA_FST,
36*5113495bSYour Name };
37*5113495bSYour Name 
38*5113495bSYour Name /* maximum number of entries in one page of secondary page table */
39*5113495bSYour Name #define DP_CC_SPT_PAGE_MAX_ENTRIES 512
40*5113495bSYour Name 
41*5113495bSYour Name /* maximum number of entries in one page of secondary page table */
42*5113495bSYour Name #define DP_CC_SPT_PAGE_MAX_ENTRIES_MASK (DP_CC_SPT_PAGE_MAX_ENTRIES - 1)
43*5113495bSYour Name 
44*5113495bSYour Name /* maximum number of entries in primary page table */
45*5113495bSYour Name #define DP_CC_PPT_MAX_ENTRIES \
46*5113495bSYour Name 	DP_CC_PPT_MEM_SIZE / DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED
47*5113495bSYour Name 
48*5113495bSYour Name /* cookie conversion required CMEM offset from CMEM pool */
49*5113495bSYour Name #define DP_CC_MEM_OFFSET_IN_CMEM 0
50*5113495bSYour Name 
51*5113495bSYour Name /* cookie conversion primary page table size 4K */
52*5113495bSYour Name #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
53*5113495bSYour Name #define DP_CC_PPT_MEM_SIZE 4096
54*5113495bSYour Name #else
55*5113495bSYour Name #define DP_CC_PPT_MEM_SIZE 8192
56*5113495bSYour Name #endif
57*5113495bSYour Name 
58*5113495bSYour Name /* FST required CMEM offset M pool */
59*5113495bSYour Name #define DP_FST_MEM_OFFSET_IN_CMEM \
60*5113495bSYour Name 	(DP_CC_MEM_OFFSET_IN_CMEM + DP_CC_PPT_MEM_SIZE)
61*5113495bSYour Name 
62*5113495bSYour Name /* lower 9 bits in Desc ID for offset in page of SPT */
63*5113495bSYour Name #define DP_CC_DESC_ID_SPT_VA_OS_SHIFT 0
64*5113495bSYour Name 
65*5113495bSYour Name #define DP_CC_DESC_ID_SPT_VA_OS_MASK 0x1FF
66*5113495bSYour Name 
67*5113495bSYour Name #define DP_CC_DESC_ID_SPT_VA_OS_LSB 0
68*5113495bSYour Name 
69*5113495bSYour Name #define DP_CC_DESC_ID_SPT_VA_OS_MSB 8
70*5113495bSYour Name 
71*5113495bSYour Name /* higher 11 bits in Desc ID for offset in CMEM of PPT */
72*5113495bSYour Name #define DP_CC_DESC_ID_PPT_PAGE_OS_LSB 9
73*5113495bSYour Name 
74*5113495bSYour Name #define DP_CC_DESC_ID_PPT_PAGE_OS_MSB 19
75*5113495bSYour Name 
76*5113495bSYour Name #define DP_CC_DESC_ID_PPT_PAGE_OS_SHIFT 9
77*5113495bSYour Name 
78*5113495bSYour Name #define DP_CC_DESC_ID_PPT_PAGE_OS_MASK 0xFFE00
79*5113495bSYour Name 
80*5113495bSYour Name /*
81*5113495bSYour Name  * page 4K unaligned case, single SPT page physical address
82*5113495bSYour Name  * need 8 bytes in PPT
83*5113495bSYour Name  */
84*5113495bSYour Name #define DP_CC_PPT_ENTRY_SIZE_4K_UNALIGNED 8
85*5113495bSYour Name /*
86*5113495bSYour Name  * page 4K aligned case, single SPT page physical address
87*5113495bSYour Name  * need 4 bytes in PPT
88*5113495bSYour Name  */
89*5113495bSYour Name #define DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED 4
90*5113495bSYour Name 
91*5113495bSYour Name /* 4K aligned case, number of bits HW append for one PPT entry value */
92*5113495bSYour Name #define DP_CC_PPT_ENTRY_HW_APEND_BITS_4K_ALIGNED 12
93*5113495bSYour Name 
94*5113495bSYour Name #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
95*5113495bSYour Name /* WBM2SW ring id for rx release */
96*5113495bSYour Name #define WBM2SW_REL_ERR_RING_NUM 3
97*5113495bSYour Name #else
98*5113495bSYour Name /* WBM2SW ring id for rx release */
99*5113495bSYour Name #define WBM2SW_REL_ERR_RING_NUM 5
100*5113495bSYour Name #endif
101*5113495bSYour Name 
102*5113495bSYour Name #ifdef WLAN_SUPPORT_PPEDS
103*5113495bSYour Name #define DP_PPEDS_STAMODE_ASTIDX_MAP_REG_IDX 1
104*5113495bSYour Name /* The MAX PPE PRI2TID */
105*5113495bSYour Name #define DP_TX_INT_PRI2TID_MAX 15
106*5113495bSYour Name 
107*5113495bSYour Name /* size of CMEM needed for a ppeds tx desc pool */
108*5113495bSYour Name #define DP_TX_PPEDS_DESC_POOL_CMEM_SIZE \
109*5113495bSYour Name 	((WLAN_CFG_NUM_PPEDS_TX_DESC_MAX / DP_CC_SPT_PAGE_MAX_ENTRIES) * \
110*5113495bSYour Name 	 DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED)
111*5113495bSYour Name 
112*5113495bSYour Name /* Offset of ppeds tx descripotor pool */
113*5113495bSYour Name #define DP_TX_PPEDS_DESC_CMEM_OFFSET 0
114*5113495bSYour Name 
115*5113495bSYour Name #define PEER_ROUTING_USE_PPE 1
116*5113495bSYour Name #define PEER_ROUTING_ENABLED 1
117*5113495bSYour Name #define DP_PPE_INTR_STRNG_LEN 32
118*5113495bSYour Name #define DP_PPE_INTR_MAX 3
119*5113495bSYour Name 
120*5113495bSYour Name #else
121*5113495bSYour Name #define DP_TX_PPEDS_DESC_CMEM_OFFSET 0
122*5113495bSYour Name #define DP_TX_PPEDS_DESC_POOL_CMEM_SIZE 0
123*5113495bSYour Name 
124*5113495bSYour Name #define DP_PPE_INTR_STRNG_LEN 0
125*5113495bSYour Name #define DP_PPE_INTR_MAX 0
126*5113495bSYour Name #endif
127*5113495bSYour Name 
128*5113495bSYour Name /* tx descriptor are programmed at start of CMEM region*/
129*5113495bSYour Name #define DP_TX_DESC_CMEM_OFFSET \
130*5113495bSYour Name 	(DP_TX_PPEDS_DESC_CMEM_OFFSET + DP_TX_PPEDS_DESC_POOL_CMEM_SIZE)
131*5113495bSYour Name 
132*5113495bSYour Name /* size of CMEM needed for a tx desc pool*/
133*5113495bSYour Name #define DP_TX_DESC_POOL_CMEM_SIZE \
134*5113495bSYour Name 	((WLAN_CFG_NUM_TX_DESC_MAX / DP_CC_SPT_PAGE_MAX_ENTRIES) * \
135*5113495bSYour Name 	 DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED)
136*5113495bSYour Name 
137*5113495bSYour Name #ifndef QCA_SUPPORT_DP_GLOBAL_CTX
138*5113495bSYour Name /* Offset of rx descripotor pool */
139*5113495bSYour Name #define DP_RX_DESC_CMEM_OFFSET \
140*5113495bSYour Name 	DP_TX_DESC_CMEM_OFFSET + (MAX_TXDESC_POOLS * DP_TX_DESC_POOL_CMEM_SIZE)
141*5113495bSYour Name 
142*5113495bSYour Name #else
143*5113495bSYour Name /* tx special descriptor are programmed after tx desc CMEM region*/
144*5113495bSYour Name #define DP_TX_SPCL_DESC_CMEM_OFFSET \
145*5113495bSYour Name 	DP_TX_DESC_CMEM_OFFSET + (MAX_TXDESC_POOLS * DP_TX_DESC_POOL_CMEM_SIZE)
146*5113495bSYour Name 
147*5113495bSYour Name /* size of CMEM needed for a tx special desc pool*/
148*5113495bSYour Name #define DP_TX_SPCL_DESC_POOL_CMEM_SIZE \
149*5113495bSYour Name 	((WLAN_CFG_NUM_TX_SPL_DESC_MAX / DP_CC_SPT_PAGE_MAX_ENTRIES) * \
150*5113495bSYour Name 	 DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED)
151*5113495bSYour Name 
152*5113495bSYour Name /* Offset of rx descripotor pool */
153*5113495bSYour Name #define DP_RX_DESC_CMEM_OFFSET \
154*5113495bSYour Name 	DP_TX_SPCL_DESC_CMEM_OFFSET + (MAX_TXDESC_POOLS * \
155*5113495bSYour Name 	DP_TX_SPCL_DESC_POOL_CMEM_SIZE)
156*5113495bSYour Name #endif
157*5113495bSYour Name 
158*5113495bSYour Name /* size of CMEM needed for a rx desc pool */
159*5113495bSYour Name #define DP_RX_DESC_POOL_CMEM_SIZE \
160*5113495bSYour Name 	((WLAN_CFG_RX_SW_DESC_NUM_SIZE_MAX / DP_CC_SPT_PAGE_MAX_ENTRIES) * \
161*5113495bSYour Name 	 DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED)
162*5113495bSYour Name 
163*5113495bSYour Name /* get ppt_id from CMEM_OFFSET */
164*5113495bSYour Name #define DP_CMEM_OFFSET_TO_PPT_ID(offset) \
165*5113495bSYour Name 	((offset) / DP_CC_PPT_ENTRY_SIZE_4K_ALIGNED)
166*5113495bSYour Name 
167*5113495bSYour Name /**
168*5113495bSYour Name  * struct dp_spt_page_desc - secondary page table page descriptors
169*5113495bSYour Name  * @page_v_addr: page virtual address
170*5113495bSYour Name  * @page_p_addr: page physical address
171*5113495bSYour Name  * @ppt_index: entry index in primary page table where this page physical
172*5113495bSYour Name  *		address stored
173*5113495bSYour Name  */
174*5113495bSYour Name struct dp_spt_page_desc {
175*5113495bSYour Name 	uint8_t *page_v_addr;
176*5113495bSYour Name 	qdf_dma_addr_t page_p_addr;
177*5113495bSYour Name 	uint32_t ppt_index;
178*5113495bSYour Name };
179*5113495bSYour Name 
180*5113495bSYour Name /**
181*5113495bSYour Name  * struct dp_hw_cookie_conversion_t - main context for HW cookie conversion
182*5113495bSYour Name  * @cmem_offset: CMEM offset from base address for primary page table setup
183*5113495bSYour Name  * @total_page_num: total DDR page allocated
184*5113495bSYour Name  * @page_desc_freelist: available page Desc list
185*5113495bSYour Name  * @page_desc_base: page Desc buffer base address.
186*5113495bSYour Name  * @page_pool: DDR pages pool
187*5113495bSYour Name  * @cc_lock: locks for page acquiring/free
188*5113495bSYour Name  */
189*5113495bSYour Name struct dp_hw_cookie_conversion_t {
190*5113495bSYour Name 	uint32_t cmem_offset;
191*5113495bSYour Name 	uint32_t total_page_num;
192*5113495bSYour Name 	struct dp_spt_page_desc *page_desc_base;
193*5113495bSYour Name 	struct qdf_mem_multi_page_t page_pool;
194*5113495bSYour Name 	qdf_spinlock_t cc_lock;
195*5113495bSYour Name };
196*5113495bSYour Name 
197*5113495bSYour Name /**
198*5113495bSYour Name  * struct dp_spt_page_desc_list - containor of SPT page desc list info
199*5113495bSYour Name  * @spt_page_list_head: head of SPT page descriptor list
200*5113495bSYour Name  * @spt_page_list_tail: tail of SPT page descriptor list
201*5113495bSYour Name  * @num_spt_pages: number of SPT page descriptor allocated
202*5113495bSYour Name  */
203*5113495bSYour Name struct dp_spt_page_desc_list {
204*5113495bSYour Name 	struct dp_spt_page_desc *spt_page_list_head;
205*5113495bSYour Name 	struct dp_spt_page_desc *spt_page_list_tail;
206*5113495bSYour Name 	uint16_t num_spt_pages;
207*5113495bSYour Name };
208*5113495bSYour Name 
209*5113495bSYour Name /* HW reading 8 bytes for VA */
210*5113495bSYour Name #define DP_CC_HW_READ_BYTES 8
211*5113495bSYour Name #define DP_CC_SPT_PAGE_UPDATE_VA(_page_base_va, _index, _desc_va) \
212*5113495bSYour Name 	{ *((uintptr_t *)((_page_base_va) + (_index) * DP_CC_HW_READ_BYTES)) \
213*5113495bSYour Name 	= (uintptr_t)(_desc_va); }
214*5113495bSYour Name 
215*5113495bSYour Name /**
216*5113495bSYour Name  * struct dp_tx_bank_profile - DP wrapper for TCL banks
217*5113495bSYour Name  * @is_configured: flag indicating if this bank is configured
218*5113495bSYour Name  * @ref_count: ref count indicating number of users of the bank
219*5113495bSYour Name  * @bank_config: HAL TX bank configuration
220*5113495bSYour Name  */
221*5113495bSYour Name struct dp_tx_bank_profile {
222*5113495bSYour Name 	uint8_t is_configured;
223*5113495bSYour Name 	qdf_atomic_t  ref_count;
224*5113495bSYour Name 	union hal_tx_bank_config bank_config;
225*5113495bSYour Name };
226*5113495bSYour Name 
227*5113495bSYour Name #ifdef WLAN_SUPPORT_PPEDS
228*5113495bSYour Name /**
229*5113495bSYour Name  * struct dp_ppe_vp_tbl_entry - PPE Virtual table entry
230*5113495bSYour Name  * @is_configured: Boolean that the entry is configured.
231*5113495bSYour Name  */
232*5113495bSYour Name struct dp_ppe_vp_tbl_entry {
233*5113495bSYour Name 	bool is_configured;
234*5113495bSYour Name };
235*5113495bSYour Name 
236*5113495bSYour Name /**
237*5113495bSYour Name  * struct dp_ppe_vp_search_idx_tbl_entry - PPE Virtual search table entry
238*5113495bSYour Name  * @is_configured: Boolean that the entry is configured.
239*5113495bSYour Name  */
240*5113495bSYour Name struct dp_ppe_vp_search_idx_tbl_entry {
241*5113495bSYour Name 	bool is_configured;
242*5113495bSYour Name };
243*5113495bSYour Name 
244*5113495bSYour Name /**
245*5113495bSYour Name  * struct dp_ppe_vp_profile - PPE direct switch profiler per vdev
246*5113495bSYour Name  * @is_configured: Boolean that the entry is configured.
247*5113495bSYour Name  * @vp_num: Virtual port number
248*5113495bSYour Name  * @ppe_vp_num_idx: Index to the PPE VP table entry
249*5113495bSYour Name  * @search_idx_reg_num: Address search Index register number
250*5113495bSYour Name  * @drop_prec_enable: Drop precedance enable
251*5113495bSYour Name  * @to_fw: To FW exception enable/disable.
252*5113495bSYour Name  * @use_ppe_int_pri: Use PPE INT_PRI to TID mapping table
253*5113495bSYour Name  * @vdev_id: Vdev ID
254*5113495bSYour Name  */
255*5113495bSYour Name struct dp_ppe_vp_profile {
256*5113495bSYour Name 	bool is_configured;
257*5113495bSYour Name 	uint8_t vp_num;
258*5113495bSYour Name 	uint8_t ppe_vp_num_idx;
259*5113495bSYour Name 	uint8_t search_idx_reg_num;
260*5113495bSYour Name 	uint8_t drop_prec_enable;
261*5113495bSYour Name 	uint8_t to_fw;
262*5113495bSYour Name 	uint8_t use_ppe_int_pri;
263*5113495bSYour Name 	uint8_t vdev_id;
264*5113495bSYour Name };
265*5113495bSYour Name 
266*5113495bSYour Name /**
267*5113495bSYour Name  * struct dp_ppeds_tx_desc_pool_s - PPEDS Tx Descriptor Pool
268*5113495bSYour Name  * @elem_size: Size of each descriptor
269*5113495bSYour Name  * @hot_list_len: Length of hotlist chain
270*5113495bSYour Name  * @num_allocated: Number of used descriptors
271*5113495bSYour Name  * @freelist: Chain of free descriptors
272*5113495bSYour Name  * @hotlist: Chain of descriptors with attached nbufs
273*5113495bSYour Name  * @desc_pages: multiple page allocation information for actual descriptors
274*5113495bSYour Name  * @elem_count: Number of descriptors in the pool
275*5113495bSYour Name  * @num_free: Number of free descriptors
276*5113495bSYour Name  * @lock: Lock for descriptor allocation/free from/to the pool
277*5113495bSYour Name  */
278*5113495bSYour Name struct dp_ppeds_tx_desc_pool_s {
279*5113495bSYour Name 	uint16_t elem_size;
280*5113495bSYour Name 	uint32_t num_allocated;
281*5113495bSYour Name 	uint32_t hot_list_len;
282*5113495bSYour Name 	struct dp_tx_desc_s *freelist;
283*5113495bSYour Name 	struct dp_tx_desc_s *hotlist;
284*5113495bSYour Name 	struct qdf_mem_multi_page_t desc_pages;
285*5113495bSYour Name 	uint16_t elem_count;
286*5113495bSYour Name 	uint32_t num_free;
287*5113495bSYour Name 	qdf_spinlock_t lock;
288*5113495bSYour Name };
289*5113495bSYour Name #endif
290*5113495bSYour Name 
291*5113495bSYour Name /**
292*5113495bSYour Name  * struct dp_ppeds_napi - napi parameters for ppe ds
293*5113495bSYour Name  * @napi: napi structure to register with napi infra
294*5113495bSYour Name  * @ndev: net_dev structure
295*5113495bSYour Name  */
296*5113495bSYour Name struct dp_ppeds_napi {
297*5113495bSYour Name 	struct napi_struct napi;
298*5113495bSYour Name 	struct net_device ndev;
299*5113495bSYour Name };
300*5113495bSYour Name 
301*5113495bSYour Name /*
302*5113495bSYour Name  * NB: intentionally not using kernel-doc comment because the kernel-doc
303*5113495bSYour Name  *     script does not handle the TAILQ_HEAD macro
304*5113495bSYour Name  * struct dp_soc_be - Extended DP soc for BE targets
305*5113495bSYour Name  * @soc: dp soc structure
306*5113495bSYour Name  * @num_bank_profiles: num TX bank profiles
307*5113495bSYour Name  * @tx_bank_lock: lock for @bank_profiles
308*5113495bSYour Name  * @bank_profiles: bank profiles for various TX banks
309*5113495bSYour Name  * @page_desc_base:
310*5113495bSYour Name  * @cc_cmem_base: cmem offset reserved for CC
311*5113495bSYour Name  * @tx_cc_ctx: Cookie conversion context for tx desc pools
312*5113495bSYour Name  * @rx_cc_ctx: Cookie conversion context for rx desc pools
313*5113495bSYour Name  * @ppeds_int_mode_enabled: PPE DS interrupt mode enabled
314*5113495bSYour Name  * @ppeds_stopped:
315*5113495bSYour Name  * @reo2ppe_ring: REO2PPE ring
316*5113495bSYour Name  * @ppe2tcl_ring: PPE2TCL ring
317*5113495bSYour Name  * @ppeds_wbm_release_ring:
318*5113495bSYour Name  * @ppe_vp_tbl: PPE VP table
319*5113495bSYour Name  * @ppe_vp_search_idx_tbl: PPE VP search idx table
320*5113495bSYour Name  * @ppeds_tx_cc_ctx: Cookie conversion context for ppeds tx desc pool
321*5113495bSYour Name  * @ppeds_tx_desc: PPEDS tx desc pool
322*5113495bSYour Name  * @ppeds_napi_ctxt:
323*5113495bSYour Name  * @ppeds_handle: PPEDS soc instance handle
324*5113495bSYour Name  * @dp_ppeds_txdesc_hotlist_len: PPEDS tx desc hotlist length
325*5113495bSYour Name  * @ppe_vp_tbl_lock: PPE VP table lock
326*5113495bSYour Name  * @num_ppe_vp_entries: Number of PPE VP entries
327*5113495bSYour Name  * @num_ppe_vp_search_idx_entries: PPEDS VP search idx entries
328*5113495bSYour Name  * @irq_name: PPEDS VP irq names
329*5113495bSYour Name  * @ppeds_stats: PPEDS stats
330*5113495bSYour Name  * @mlo_enabled: Flag to indicate MLO is enabled or not
331*5113495bSYour Name  * @mlo_chip_id: MLO chip_id
332*5113495bSYour Name  * @ml_ctxt: pointer to global ml_context
333*5113495bSYour Name  * @delta_tqm: delta_tqm
334*5113495bSYour Name  * @mlo_tstamp_offset: mlo timestamp offset
335*5113495bSYour Name  * @mld_peer_hash_lock: lock to protect mld_peer_hash
336*5113495bSYour Name  * @mld_peer_hash: peer hash table for ML peers
337*5113495bSYour Name  * @mlo_dev_list: list of MLO device context
338*5113495bSYour Name  * @mlo_dev_list_lock: lock to protect MLO device ctxt
339*5113495bSYour Name  * @ipa_bank_id: TCL bank id used by IPA
340*5113495bSYour Name  */
341*5113495bSYour Name struct dp_soc_be {
342*5113495bSYour Name 	struct dp_soc soc;
343*5113495bSYour Name 	uint8_t num_bank_profiles;
344*5113495bSYour Name #if defined(WLAN_MAX_PDEVS) && (WLAN_MAX_PDEVS == 1)
345*5113495bSYour Name 	qdf_mutex_t tx_bank_lock;
346*5113495bSYour Name #else
347*5113495bSYour Name 	qdf_spinlock_t tx_bank_lock;
348*5113495bSYour Name #endif
349*5113495bSYour Name 	struct dp_tx_bank_profile *bank_profiles;
350*5113495bSYour Name 	struct dp_spt_page_desc *page_desc_base;
351*5113495bSYour Name 	uint32_t cc_cmem_base;
352*5113495bSYour Name 	struct dp_hw_cookie_conversion_t tx_cc_ctx[MAX_TXDESC_POOLS];
353*5113495bSYour Name 	struct dp_hw_cookie_conversion_t rx_cc_ctx[MAX_RXDESC_POOLS];
354*5113495bSYour Name #ifdef WLAN_SUPPORT_PPEDS
355*5113495bSYour Name 	uint8_t ppeds_int_mode_enabled:1,
356*5113495bSYour Name 		ppeds_stopped:1;
357*5113495bSYour Name 	struct dp_srng reo2ppe_ring;
358*5113495bSYour Name 	struct dp_srng ppe2tcl_ring;
359*5113495bSYour Name 	struct dp_srng ppeds_wbm_release_ring;
360*5113495bSYour Name 	struct dp_ppe_vp_tbl_entry *ppe_vp_tbl;
361*5113495bSYour Name 	struct dp_ppe_vp_search_idx_tbl_entry *ppe_vp_search_idx_tbl;
362*5113495bSYour Name 	struct dp_ppe_vp_profile *ppe_vp_profile;
363*5113495bSYour Name 	struct dp_hw_cookie_conversion_t ppeds_tx_cc_ctx;
364*5113495bSYour Name 	struct dp_ppeds_tx_desc_pool_s ppeds_tx_desc;
365*5113495bSYour Name 	struct dp_ppeds_napi ppeds_napi_ctxt;
366*5113495bSYour Name 	void *ppeds_handle;
367*5113495bSYour Name 	int dp_ppeds_txdesc_hotlist_len;
368*5113495bSYour Name 	qdf_mutex_t ppe_vp_tbl_lock;
369*5113495bSYour Name 	uint8_t num_ppe_vp_entries;
370*5113495bSYour Name 	uint8_t num_ppe_vp_search_idx_entries;
371*5113495bSYour Name 	uint8_t num_ppe_vp_profiles;
372*5113495bSYour Name 	char irq_name[DP_PPE_INTR_MAX][DP_PPE_INTR_STRNG_LEN];
373*5113495bSYour Name 	struct {
374*5113495bSYour Name 		struct {
375*5113495bSYour Name 			uint64_t desc_alloc_failed;
376*5113495bSYour Name #ifdef GLOBAL_ASSERT_AVOIDANCE
377*5113495bSYour Name 			uint32_t tx_comp_buf_src;
378*5113495bSYour Name 			uint32_t tx_comp_desc_null;
379*5113495bSYour Name 			uint32_t tx_comp_invalid_flag;
380*5113495bSYour Name #endif
381*5113495bSYour Name 		} tx;
382*5113495bSYour Name 	} ppeds_stats;
383*5113495bSYour Name #endif
384*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
385*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
386*5113495bSYour Name 	uint8_t mlo_enabled;
387*5113495bSYour Name 	uint8_t mlo_chip_id;
388*5113495bSYour Name 	struct dp_mlo_ctxt *ml_ctxt;
389*5113495bSYour Name 	uint64_t delta_tqm;
390*5113495bSYour Name 	uint64_t mlo_tstamp_offset;
391*5113495bSYour Name #else
392*5113495bSYour Name 	/* Protect mld peer hash table */
393*5113495bSYour Name 	DP_MUTEX_TYPE mld_peer_hash_lock;
394*5113495bSYour Name 	struct {
395*5113495bSYour Name 		uint32_t mask;
396*5113495bSYour Name 		uint32_t idx_bits;
397*5113495bSYour Name 
398*5113495bSYour Name 		TAILQ_HEAD(, dp_peer) * bins;
399*5113495bSYour Name 	} mld_peer_hash;
400*5113495bSYour Name 
401*5113495bSYour Name 	/* MLO device ctxt list */
402*5113495bSYour Name 	TAILQ_HEAD(, dp_mlo_dev_ctxt) mlo_dev_list;
403*5113495bSYour Name 	qdf_spinlock_t mlo_dev_list_lock;
404*5113495bSYour Name #endif
405*5113495bSYour Name #endif
406*5113495bSYour Name #ifdef IPA_OFFLOAD
407*5113495bSYour Name 	int8_t ipa_bank_id;
408*5113495bSYour Name #endif
409*5113495bSYour Name };
410*5113495bSYour Name 
411*5113495bSYour Name /* convert struct dp_soc_be pointer to struct dp_soc pointer */
412*5113495bSYour Name #define DP_SOC_BE_GET_SOC(be_soc) ((struct dp_soc *)be_soc)
413*5113495bSYour Name 
414*5113495bSYour Name /**
415*5113495bSYour Name  * struct dp_pdev_be - Extended DP pdev for BE targets
416*5113495bSYour Name  * @pdev: dp pdev structure
417*5113495bSYour Name  * @monitor_pdev_be: BE specific monitor object
418*5113495bSYour Name  * @mlo_link_id: MLO link id for PDEV
419*5113495bSYour Name  * @delta_tsf2: delta_tsf2
420*5113495bSYour Name  */
421*5113495bSYour Name struct dp_pdev_be {
422*5113495bSYour Name 	struct dp_pdev pdev;
423*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
424*5113495bSYour Name 	uint8_t mlo_link_id;
425*5113495bSYour Name 	uint64_t delta_tsf2;
426*5113495bSYour Name #endif
427*5113495bSYour Name };
428*5113495bSYour Name 
429*5113495bSYour Name /**
430*5113495bSYour Name  * struct dp_vdev_be - Extended DP vdev for BE targets
431*5113495bSYour Name  * @vdev: dp vdev structure
432*5113495bSYour Name  * @bank_id: bank_id to be used for TX
433*5113495bSYour Name  * @vdev_id_check_en: flag if HW vdev_id check is enabled for vdev
434*5113495bSYour Name  * @partner_vdev_list: partner list used for Intra-BSS
435*5113495bSYour Name  * @bridge_vdev_list: partner bridge vdev list
436*5113495bSYour Name  * @mlo_stats: structure to hold stats for mlo unmapped peers
437*5113495bSYour Name  * @mcast_primary: MLO Mcast primary vdev
438*5113495bSYour Name  * @mlo_dev_ctxt: MLO device context pointer
439*5113495bSYour Name  */
440*5113495bSYour Name struct dp_vdev_be {
441*5113495bSYour Name 	struct dp_vdev vdev;
442*5113495bSYour Name 	int8_t bank_id;
443*5113495bSYour Name 	uint8_t vdev_id_check_en;
444*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
445*5113495bSYour Name 	struct cdp_vdev_stats mlo_stats;
446*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
447*5113495bSYour Name #ifdef WLAN_MCAST_MLO
448*5113495bSYour Name 	bool mcast_primary;
449*5113495bSYour Name #endif
450*5113495bSYour Name #endif
451*5113495bSYour Name #endif
452*5113495bSYour Name #ifdef WLAN_FEATURE_11BE_MLO
453*5113495bSYour Name 	struct dp_mlo_dev_ctxt *mlo_dev_ctxt;
454*5113495bSYour Name #endif /* WLAN_FEATURE_11BE_MLO */
455*5113495bSYour Name };
456*5113495bSYour Name 
457*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_DP_MLO_DEV_CTX)
458*5113495bSYour Name /**
459*5113495bSYour Name  * struct dp_mlo_dev_ctxt - Datapath MLO device context
460*5113495bSYour Name  *
461*5113495bSYour Name  * @ml_dev_list_elem: node in the ML dev list of Global MLO context
462*5113495bSYour Name  * @mld_mac_addr: MLO device MAC address
463*5113495bSYour Name  * @vdev_list: list of vdevs associated with this MLO connection
464*5113495bSYour Name  * @vdev_list_lock: lock to protect vdev list
465*5113495bSYour Name  * @bridge_vdev: list of bridge vdevs associated with this MLO connection
466*5113495bSYour Name  * @is_bridge_vdev_present: flag to check if bridge vdev is present
467*5113495bSYour Name  * @vdev_list_lock: lock to protect vdev list
468*5113495bSYour Name  * @vdev_count: number of elements in the vdev list
469*5113495bSYour Name  * @seq_num: DP MLO multicast sequence number
470*5113495bSYour Name  * @ref_cnt: reference count
471*5113495bSYour Name  * @mod_refs: module reference count
472*5113495bSYour Name  * @ref_delete_pending: flag to monitor last ref delete
473*5113495bSYour Name  * @stats: structure to store vdev stats of removed MLO Link
474*5113495bSYour Name  */
475*5113495bSYour Name struct dp_mlo_dev_ctxt {
476*5113495bSYour Name 	TAILQ_ENTRY(dp_mlo_dev_ctxt) ml_dev_list_elem;
477*5113495bSYour Name 	union dp_align_mac_addr mld_mac_addr;
478*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
479*5113495bSYour Name 	uint8_t vdev_list[WLAN_MAX_MLO_CHIPS][WLAN_MAX_MLO_LINKS_PER_SOC];
480*5113495bSYour Name 	uint8_t bridge_vdev[WLAN_MAX_MLO_CHIPS][WLAN_MAX_MLO_LINKS_PER_SOC];
481*5113495bSYour Name 	bool is_bridge_vdev_present;
482*5113495bSYour Name 	qdf_spinlock_t vdev_list_lock;
483*5113495bSYour Name 	uint16_t vdev_count;
484*5113495bSYour Name 	uint16_t seq_num;
485*5113495bSYour Name #endif
486*5113495bSYour Name 	qdf_atomic_t ref_cnt;
487*5113495bSYour Name 	qdf_atomic_t mod_refs[DP_MOD_ID_MAX];
488*5113495bSYour Name 	uint8_t ref_delete_pending;
489*5113495bSYour Name 	struct dp_vdev_stats stats;
490*5113495bSYour Name };
491*5113495bSYour Name #endif /* WLAN_FEATURE_11BE_MLO */
492*5113495bSYour Name 
493*5113495bSYour Name /**
494*5113495bSYour Name  * struct dp_peer_be - Extended DP peer for BE targets
495*5113495bSYour Name  * @peer: dp peer structure
496*5113495bSYour Name  * @priority_valid:
497*5113495bSYour Name  */
498*5113495bSYour Name struct dp_peer_be {
499*5113495bSYour Name 	struct dp_peer peer;
500*5113495bSYour Name #ifdef WLAN_SUPPORT_PPEDS
501*5113495bSYour Name 	uint8_t priority_valid;
502*5113495bSYour Name #endif
503*5113495bSYour Name };
504*5113495bSYour Name 
505*5113495bSYour Name /**
506*5113495bSYour Name  * dp_get_soc_context_size_be() - get context size for target specific DP soc
507*5113495bSYour Name  *
508*5113495bSYour Name  * Return: value in bytes for BE specific soc structure
509*5113495bSYour Name  */
510*5113495bSYour Name qdf_size_t dp_get_soc_context_size_be(void);
511*5113495bSYour Name 
512*5113495bSYour Name /**
513*5113495bSYour Name  * dp_initialize_arch_ops_be() - initialize BE specific arch ops
514*5113495bSYour Name  * @arch_ops: arch ops pointer
515*5113495bSYour Name  *
516*5113495bSYour Name  * Return: none
517*5113495bSYour Name  */
518*5113495bSYour Name void dp_initialize_arch_ops_be(struct dp_arch_ops *arch_ops);
519*5113495bSYour Name 
520*5113495bSYour Name /**
521*5113495bSYour Name  * dp_get_context_size_be() - get BE specific size for peer/vdev/pdev/soc
522*5113495bSYour Name  * @context_type: context type for which the size is needed
523*5113495bSYour Name  *
524*5113495bSYour Name  * Return: size in bytes for the context_type
525*5113495bSYour Name  */
526*5113495bSYour Name qdf_size_t dp_get_context_size_be(enum dp_context_type context_type);
527*5113495bSYour Name 
528*5113495bSYour Name /**
529*5113495bSYour Name  * dp_get_be_soc_from_dp_soc() - get dp_soc_be from dp_soc
530*5113495bSYour Name  * @soc: dp_soc pointer
531*5113495bSYour Name  *
532*5113495bSYour Name  * Return: dp_soc_be pointer
533*5113495bSYour Name  */
dp_get_be_soc_from_dp_soc(struct dp_soc * soc)534*5113495bSYour Name static inline struct dp_soc_be *dp_get_be_soc_from_dp_soc(struct dp_soc *soc)
535*5113495bSYour Name {
536*5113495bSYour Name 	return (struct dp_soc_be *)soc;
537*5113495bSYour Name }
538*5113495bSYour Name 
539*5113495bSYour Name /**
540*5113495bSYour Name  * dp_mlo_iter_ptnr_soc() - iterate through mlo soc list and call the callback
541*5113495bSYour Name  * @be_soc: dp_soc_be pointer
542*5113495bSYour Name  * @func: Function to be called for each soc
543*5113495bSYour Name  * @arg: context to be passed to the callback
544*5113495bSYour Name  *
545*5113495bSYour Name  * Return: true if mlo is enabled, false if mlo is disabled
546*5113495bSYour Name  */
547*5113495bSYour Name bool dp_mlo_iter_ptnr_soc(struct dp_soc_be *be_soc, dp_ptnr_soc_iter_func func,
548*5113495bSYour Name 			  void *arg);
549*5113495bSYour Name 
550*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
551*5113495bSYour Name typedef struct dp_mlo_ctxt *dp_mld_peer_hash_obj_t;
552*5113495bSYour Name typedef struct dp_mlo_ctxt *dp_mlo_dev_obj_t;
553*5113495bSYour Name 
554*5113495bSYour Name /**
555*5113495bSYour Name  * dp_mlo_get_peer_hash_obj() - return the container struct of MLO hash table
556*5113495bSYour Name  * @soc: soc handle
557*5113495bSYour Name  *
558*5113495bSYour Name  * return: MLD peer hash object
559*5113495bSYour Name  */
560*5113495bSYour Name static inline dp_mld_peer_hash_obj_t
dp_mlo_get_peer_hash_obj(struct dp_soc * soc)561*5113495bSYour Name dp_mlo_get_peer_hash_obj(struct dp_soc *soc)
562*5113495bSYour Name {
563*5113495bSYour Name 	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
564*5113495bSYour Name 
565*5113495bSYour Name 	return be_soc->ml_ctxt;
566*5113495bSYour Name }
567*5113495bSYour Name 
568*5113495bSYour Name /**
569*5113495bSYour Name  * dp_get_mlo_dev_list_obj() - return the container struct of MLO Dev list
570*5113495bSYour Name  * @be_soc: be soc handle
571*5113495bSYour Name  *
572*5113495bSYour Name  * return: MLO dev list object
573*5113495bSYour Name  */
574*5113495bSYour Name static inline dp_mlo_dev_obj_t
dp_get_mlo_dev_list_obj(struct dp_soc_be * be_soc)575*5113495bSYour Name dp_get_mlo_dev_list_obj(struct dp_soc_be *be_soc)
576*5113495bSYour Name {
577*5113495bSYour Name 	return be_soc->ml_ctxt;
578*5113495bSYour Name }
579*5113495bSYour Name 
580*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO)
581*5113495bSYour Name /**
582*5113495bSYour Name  * dp_mlo_partner_chips_map() - Map MLO peers to partner SOCs
583*5113495bSYour Name  * @soc: Soc handle
584*5113495bSYour Name  * @peer: DP peer handle for ML peer
585*5113495bSYour Name  * @peer_id: peer_id
586*5113495bSYour Name  * Return: None
587*5113495bSYour Name  */
588*5113495bSYour Name void dp_mlo_partner_chips_map(struct dp_soc *soc,
589*5113495bSYour Name 			      struct dp_peer *peer,
590*5113495bSYour Name 			      uint16_t peer_id);
591*5113495bSYour Name 
592*5113495bSYour Name /**
593*5113495bSYour Name  * dp_mlo_partner_chips_unmap() - Unmap MLO peers to partner SOCs
594*5113495bSYour Name  * @soc: Soc handle
595*5113495bSYour Name  * @peer_id: peer_id
596*5113495bSYour Name  * Return: None
597*5113495bSYour Name  */
598*5113495bSYour Name void dp_mlo_partner_chips_unmap(struct dp_soc *soc,
599*5113495bSYour Name 				uint16_t peer_id);
600*5113495bSYour Name 
601*5113495bSYour Name /**
602*5113495bSYour Name  * dp_soc_initialize_cdp_cmn_mlo_ops() - Initialize common CDP API's
603*5113495bSYour Name  * @soc: Soc handle
604*5113495bSYour Name  *
605*5113495bSYour Name  * Return: None
606*5113495bSYour Name  */
607*5113495bSYour Name void dp_soc_initialize_cdp_cmn_mlo_ops(struct dp_soc *soc);
608*5113495bSYour Name 
609*5113495bSYour Name #ifdef WLAN_MLO_MULTI_CHIP
610*5113495bSYour Name typedef void dp_ptnr_vdev_iter_func(struct dp_vdev_be *be_vdev,
611*5113495bSYour Name 				    struct dp_vdev *ptnr_vdev,
612*5113495bSYour Name 				    void *arg);
613*5113495bSYour Name 
614*5113495bSYour Name /**
615*5113495bSYour Name  * dp_mlo_iter_ptnr_vdev() - API to iterate through ptnr vdev list
616*5113495bSYour Name  * @be_soc: dp_soc_be pointer
617*5113495bSYour Name  * @be_vdev: dp_vdev_be pointer
618*5113495bSYour Name  * @func: function to be called for each peer
619*5113495bSYour Name  * @arg: argument need to be passed to func
620*5113495bSYour Name  * @mod_id: module id
621*5113495bSYour Name  * @type: iterate type
622*5113495bSYour Name  * @include_self_vdev: flag to include/exclude self vdev in iteration
623*5113495bSYour Name  *
624*5113495bSYour Name  * Return: None
625*5113495bSYour Name  */
626*5113495bSYour Name void dp_mlo_iter_ptnr_vdev(struct dp_soc_be *be_soc,
627*5113495bSYour Name 			   struct dp_vdev_be *be_vdev,
628*5113495bSYour Name 			   dp_ptnr_vdev_iter_func func, void *arg,
629*5113495bSYour Name 			   enum dp_mod_id mod_id,
630*5113495bSYour Name 			   uint8_t type,
631*5113495bSYour Name 			   bool include_self_vdev);
632*5113495bSYour Name #endif
633*5113495bSYour Name 
634*5113495bSYour Name #ifdef WLAN_MCAST_MLO
635*5113495bSYour Name /**
636*5113495bSYour Name  * dp_mlo_get_mcast_primary_vdev() - get ref to mcast primary vdev
637*5113495bSYour Name  * @be_soc: dp_soc_be pointer
638*5113495bSYour Name  * @be_vdev: dp_vdev_be pointer
639*5113495bSYour Name  * @mod_id: module id
640*5113495bSYour Name  *
641*5113495bSYour Name  * Return: mcast primary DP VDEV handle on success, NULL on failure
642*5113495bSYour Name  */
643*5113495bSYour Name struct dp_vdev *dp_mlo_get_mcast_primary_vdev(struct dp_soc_be *be_soc,
644*5113495bSYour Name 					      struct dp_vdev_be *be_vdev,
645*5113495bSYour Name 					      enum dp_mod_id mod_id);
646*5113495bSYour Name #endif
647*5113495bSYour Name #endif
648*5113495bSYour Name 
649*5113495bSYour Name #else
650*5113495bSYour Name typedef struct dp_soc_be *dp_mld_peer_hash_obj_t;
651*5113495bSYour Name typedef struct dp_soc_be *dp_mlo_dev_obj_t;
652*5113495bSYour Name 
653*5113495bSYour Name static inline dp_mld_peer_hash_obj_t
dp_mlo_get_peer_hash_obj(struct dp_soc * soc)654*5113495bSYour Name dp_mlo_get_peer_hash_obj(struct dp_soc *soc)
655*5113495bSYour Name {
656*5113495bSYour Name 	return dp_get_be_soc_from_dp_soc(soc);
657*5113495bSYour Name }
658*5113495bSYour Name 
659*5113495bSYour Name static inline dp_mlo_dev_obj_t
dp_get_mlo_dev_list_obj(struct dp_soc_be * be_soc)660*5113495bSYour Name dp_get_mlo_dev_list_obj(struct dp_soc_be *be_soc)
661*5113495bSYour Name {
662*5113495bSYour Name 	return be_soc;
663*5113495bSYour Name }
664*5113495bSYour Name #endif
665*5113495bSYour Name 
666*5113495bSYour Name #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
667*5113495bSYour Name static inline
dp_get_tx_cookie_t(struct dp_soc * soc,uint8_t pool_id)668*5113495bSYour Name struct dp_hw_cookie_conversion_t *dp_get_tx_cookie_t(struct dp_soc *soc,
669*5113495bSYour Name 						     uint8_t pool_id)
670*5113495bSYour Name {
671*5113495bSYour Name 	struct dp_global_context *dp_global = NULL;
672*5113495bSYour Name 
673*5113495bSYour Name 	dp_global = wlan_objmgr_get_global_ctx();
674*5113495bSYour Name 	return dp_global->tx_cc_ctx[pool_id];
675*5113495bSYour Name }
676*5113495bSYour Name 
677*5113495bSYour Name static inline
dp_get_spcl_tx_cookie_t(struct dp_soc * soc,uint8_t pool_id)678*5113495bSYour Name struct dp_hw_cookie_conversion_t *dp_get_spcl_tx_cookie_t(struct dp_soc *soc,
679*5113495bSYour Name 							  uint8_t pool_id)
680*5113495bSYour Name {
681*5113495bSYour Name 	struct dp_global_context *dp_global = NULL;
682*5113495bSYour Name 
683*5113495bSYour Name 	dp_global = wlan_objmgr_get_global_ctx();
684*5113495bSYour Name 	return dp_global->spcl_tx_cc_ctx[pool_id];
685*5113495bSYour Name }
686*5113495bSYour Name #else
687*5113495bSYour Name static inline
dp_get_tx_cookie_t(struct dp_soc * soc,uint8_t pool_id)688*5113495bSYour Name struct dp_hw_cookie_conversion_t *dp_get_tx_cookie_t(struct dp_soc *soc,
689*5113495bSYour Name 						     uint8_t pool_id)
690*5113495bSYour Name {
691*5113495bSYour Name 	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
692*5113495bSYour Name 
693*5113495bSYour Name 	return &be_soc->tx_cc_ctx[pool_id];
694*5113495bSYour Name }
695*5113495bSYour Name 
696*5113495bSYour Name static inline
dp_get_spcl_tx_cookie_t(struct dp_soc * soc,uint8_t pool_id)697*5113495bSYour Name struct dp_hw_cookie_conversion_t *dp_get_spcl_tx_cookie_t(struct dp_soc *soc,
698*5113495bSYour Name 							  uint8_t pool_id)
699*5113495bSYour Name {
700*5113495bSYour Name 	struct dp_soc_be *be_soc = dp_get_be_soc_from_dp_soc(soc);
701*5113495bSYour Name 
702*5113495bSYour Name 	return &be_soc->tx_cc_ctx[pool_id];
703*5113495bSYour Name }
704*5113495bSYour Name #endif
705*5113495bSYour Name 
706*5113495bSYour Name /**
707*5113495bSYour Name  * dp_mlo_peer_find_hash_attach_be() - API to initialize ML peer hash table
708*5113495bSYour Name  * @mld_hash_obj: Peer has object
709*5113495bSYour Name  * @hash_elems: number of entries in hash table
710*5113495bSYour Name  *
711*5113495bSYour Name  * Return: QDF_STATUS_SUCCESS when attach is success else QDF_STATUS_FAILURE
712*5113495bSYour Name  */
713*5113495bSYour Name QDF_STATUS
714*5113495bSYour Name dp_mlo_peer_find_hash_attach_be(dp_mld_peer_hash_obj_t mld_hash_obj,
715*5113495bSYour Name 				int hash_elems);
716*5113495bSYour Name 
717*5113495bSYour Name /**
718*5113495bSYour Name  * dp_mlo_peer_find_hash_detach_be() - API to de-initialize ML peer hash table
719*5113495bSYour Name  *
720*5113495bSYour Name  * @mld_hash_obj: Peer has object
721*5113495bSYour Name  *
722*5113495bSYour Name  * Return: void
723*5113495bSYour Name  */
724*5113495bSYour Name void dp_mlo_peer_find_hash_detach_be(dp_mld_peer_hash_obj_t mld_hash_obj);
725*5113495bSYour Name 
726*5113495bSYour Name /**
727*5113495bSYour Name  * dp_get_be_pdev_from_dp_pdev() - get dp_pdev_be from dp_pdev
728*5113495bSYour Name  * @pdev: dp_pdev pointer
729*5113495bSYour Name  *
730*5113495bSYour Name  * Return: dp_pdev_be pointer
731*5113495bSYour Name  */
732*5113495bSYour Name static inline
dp_get_be_pdev_from_dp_pdev(struct dp_pdev * pdev)733*5113495bSYour Name struct dp_pdev_be *dp_get_be_pdev_from_dp_pdev(struct dp_pdev *pdev)
734*5113495bSYour Name {
735*5113495bSYour Name 	return (struct dp_pdev_be *)pdev;
736*5113495bSYour Name }
737*5113495bSYour Name 
738*5113495bSYour Name /**
739*5113495bSYour Name  * dp_get_be_vdev_from_dp_vdev() - get dp_vdev_be from dp_vdev
740*5113495bSYour Name  * @vdev: dp_vdev pointer
741*5113495bSYour Name  *
742*5113495bSYour Name  * Return: dp_vdev_be pointer
743*5113495bSYour Name  */
744*5113495bSYour Name static inline
dp_get_be_vdev_from_dp_vdev(struct dp_vdev * vdev)745*5113495bSYour Name struct dp_vdev_be *dp_get_be_vdev_from_dp_vdev(struct dp_vdev *vdev)
746*5113495bSYour Name {
747*5113495bSYour Name 	return (struct dp_vdev_be *)vdev;
748*5113495bSYour Name }
749*5113495bSYour Name 
750*5113495bSYour Name /**
751*5113495bSYour Name  * dp_get_be_peer_from_dp_peer() - get dp_peer_be from dp_peer
752*5113495bSYour Name  * @peer: dp_peer pointer
753*5113495bSYour Name  *
754*5113495bSYour Name  * Return: dp_peer_be pointer
755*5113495bSYour Name  */
756*5113495bSYour Name static inline
dp_get_be_peer_from_dp_peer(struct dp_peer * peer)757*5113495bSYour Name struct dp_peer_be *dp_get_be_peer_from_dp_peer(struct dp_peer *peer)
758*5113495bSYour Name {
759*5113495bSYour Name 	return (struct dp_peer_be *)peer;
760*5113495bSYour Name }
761*5113495bSYour Name 
762*5113495bSYour Name void dp_ppeds_disable_irq(struct dp_soc *soc, struct dp_srng *srng);
763*5113495bSYour Name void dp_ppeds_enable_irq(struct dp_soc *soc, struct dp_srng *srng);
764*5113495bSYour Name 
765*5113495bSYour Name QDF_STATUS dp_peer_setup_ppeds_be(struct dp_soc *soc, struct dp_peer *peer,
766*5113495bSYour Name 				  struct dp_vdev_be *be_vdev,
767*5113495bSYour Name 				  void *args);
768*5113495bSYour Name 
769*5113495bSYour Name QDF_STATUS
770*5113495bSYour Name dp_hw_cookie_conversion_attach(struct dp_soc_be *be_soc,
771*5113495bSYour Name 			       struct dp_hw_cookie_conversion_t *cc_ctx,
772*5113495bSYour Name 			       uint32_t num_descs,
773*5113495bSYour Name 			       enum qdf_dp_desc_type desc_type,
774*5113495bSYour Name 			       uint8_t desc_pool_id);
775*5113495bSYour Name 
776*5113495bSYour Name void dp_reo_shared_qaddr_detach(struct dp_soc *soc);
777*5113495bSYour Name 
778*5113495bSYour Name QDF_STATUS
779*5113495bSYour Name dp_hw_cookie_conversion_detach(struct dp_soc_be *be_soc,
780*5113495bSYour Name 			       struct dp_hw_cookie_conversion_t *cc_ctx);
781*5113495bSYour Name QDF_STATUS
782*5113495bSYour Name dp_hw_cookie_conversion_init(struct dp_soc_be *be_soc,
783*5113495bSYour Name 			     struct dp_hw_cookie_conversion_t *cc_ctx);
784*5113495bSYour Name QDF_STATUS
785*5113495bSYour Name dp_hw_cookie_conversion_deinit(struct dp_soc_be *be_soc,
786*5113495bSYour Name 			       struct dp_hw_cookie_conversion_t *cc_ctx);
787*5113495bSYour Name 
788*5113495bSYour Name /**
789*5113495bSYour Name  * dp_cc_spt_page_desc_alloc() - allocate SPT DDR page descriptor from pool
790*5113495bSYour Name  * @be_soc: beryllium soc handler
791*5113495bSYour Name  * @list_head: pointer to page desc head
792*5113495bSYour Name  * @list_tail: pointer to page desc tail
793*5113495bSYour Name  * @num_desc: number of TX/RX Descs required for SPT pages
794*5113495bSYour Name  *
795*5113495bSYour Name  * Return: number of SPT page Desc allocated
796*5113495bSYour Name  */
797*5113495bSYour Name uint16_t dp_cc_spt_page_desc_alloc(struct dp_soc_be *be_soc,
798*5113495bSYour Name 				   struct dp_spt_page_desc **list_head,
799*5113495bSYour Name 				   struct dp_spt_page_desc **list_tail,
800*5113495bSYour Name 				   uint16_t num_desc);
801*5113495bSYour Name 
802*5113495bSYour Name /**
803*5113495bSYour Name  * dp_cc_spt_page_desc_free() - free SPT DDR page descriptor to pool
804*5113495bSYour Name  * @be_soc: beryllium soc handler
805*5113495bSYour Name  * @list_head: pointer to page desc head
806*5113495bSYour Name  * @list_tail: pointer to page desc tail
807*5113495bSYour Name  * @page_nums: number of page desc freed back to pool
808*5113495bSYour Name  */
809*5113495bSYour Name void dp_cc_spt_page_desc_free(struct dp_soc_be *be_soc,
810*5113495bSYour Name 			      struct dp_spt_page_desc **list_head,
811*5113495bSYour Name 			      struct dp_spt_page_desc **list_tail,
812*5113495bSYour Name 			      uint16_t page_nums);
813*5113495bSYour Name 
814*5113495bSYour Name /**
815*5113495bSYour Name  * dp_cc_desc_id_generate() - generate SW cookie ID according to
816*5113495bSYour Name  *				DDR page 4K aligned or not
817*5113495bSYour Name  * @ppt_index: offset index in primary page table
818*5113495bSYour Name  * @spt_index: offset index in sceondary DDR page
819*5113495bSYour Name  *
820*5113495bSYour Name  * Generate SW cookie ID to match as HW expected
821*5113495bSYour Name  *
822*5113495bSYour Name  * Return: cookie ID
823*5113495bSYour Name  */
dp_cc_desc_id_generate(uint32_t ppt_index,uint16_t spt_index)824*5113495bSYour Name static inline uint32_t dp_cc_desc_id_generate(uint32_t ppt_index,
825*5113495bSYour Name 					      uint16_t spt_index)
826*5113495bSYour Name {
827*5113495bSYour Name 	/*
828*5113495bSYour Name 	 * for 4k aligned case, cmem entry size is 4 bytes,
829*5113495bSYour Name 	 * HW index from bit19~bit10 value = ppt_index / 2, high 32bits flag
830*5113495bSYour Name 	 * from bit9 value = ppt_index % 2, then bit 19 ~ bit9 value is
831*5113495bSYour Name 	 * exactly same with original ppt_index value.
832*5113495bSYour Name 	 * for 4k un-aligned case, cmem entry size is 8 bytes.
833*5113495bSYour Name 	 * bit19 ~ bit9 will be HW index value, same as ppt_index value.
834*5113495bSYour Name 	 */
835*5113495bSYour Name 	return ((((uint32_t)ppt_index) << DP_CC_DESC_ID_PPT_PAGE_OS_SHIFT) |
836*5113495bSYour Name 		spt_index);
837*5113495bSYour Name }
838*5113495bSYour Name 
839*5113495bSYour Name /**
840*5113495bSYour Name  * dp_cc_desc_find() - find TX/RX Descs virtual address by ID
841*5113495bSYour Name  * @soc: be soc handle
842*5113495bSYour Name  * @desc_id: TX/RX Dess ID
843*5113495bSYour Name  *
844*5113495bSYour Name  * Return: TX/RX Desc virtual address
845*5113495bSYour Name  */
dp_cc_desc_find(struct dp_soc * soc,uint32_t desc_id)846*5113495bSYour Name static inline uintptr_t dp_cc_desc_find(struct dp_soc *soc,
847*5113495bSYour Name 					uint32_t desc_id)
848*5113495bSYour Name {
849*5113495bSYour Name 	struct dp_soc_be *be_soc;
850*5113495bSYour Name 	uint16_t ppt_page_id, spt_va_id;
851*5113495bSYour Name 	uint8_t *spt_page_va;
852*5113495bSYour Name 
853*5113495bSYour Name 	be_soc = dp_get_be_soc_from_dp_soc(soc);
854*5113495bSYour Name 	ppt_page_id = (desc_id & DP_CC_DESC_ID_PPT_PAGE_OS_MASK) >>
855*5113495bSYour Name 			DP_CC_DESC_ID_PPT_PAGE_OS_SHIFT;
856*5113495bSYour Name 
857*5113495bSYour Name 	spt_va_id = (desc_id & DP_CC_DESC_ID_SPT_VA_OS_MASK) >>
858*5113495bSYour Name 			DP_CC_DESC_ID_SPT_VA_OS_SHIFT;
859*5113495bSYour Name 
860*5113495bSYour Name 	/*
861*5113495bSYour Name 	 * ppt index in cmem is same order where the page in the
862*5113495bSYour Name 	 * page desc array during initialization.
863*5113495bSYour Name 	 * entry size in DDR page is 64 bits, for 32 bits system,
864*5113495bSYour Name 	 * only lower 32 bits VA value is needed.
865*5113495bSYour Name 	 */
866*5113495bSYour Name 	spt_page_va = be_soc->page_desc_base[ppt_page_id].page_v_addr;
867*5113495bSYour Name 
868*5113495bSYour Name 	return (*((uintptr_t *)(spt_page_va  +
869*5113495bSYour Name 				spt_va_id * DP_CC_HW_READ_BYTES)));
870*5113495bSYour Name }
871*5113495bSYour Name 
872*5113495bSYour Name /**
873*5113495bSYour Name  * dp_update_mlo_mld_vdev_ctxt_stats() - aggregate stats from mlo ctx
874*5113495bSYour Name  * @buf: vdev stats buf
875*5113495bSYour Name  * @mlo_ctxt_stats: mlo ctxt stats
876*5113495bSYour Name  *
877*5113495bSYour Name  * return: void
878*5113495bSYour Name  */
879*5113495bSYour Name static inline
dp_update_mlo_mld_vdev_ctxt_stats(void * buf,struct dp_vdev_stats * mlo_ctxt_stats)880*5113495bSYour Name void dp_update_mlo_mld_vdev_ctxt_stats(void *buf,
881*5113495bSYour Name 				   struct dp_vdev_stats *mlo_ctxt_stats)
882*5113495bSYour Name {
883*5113495bSYour Name 	struct dp_vdev_stats *tgt_vdev_stats = (struct dp_vdev_stats *)buf;
884*5113495bSYour Name 
885*5113495bSYour Name 	DP_UPDATE_TO_MLD_VDEV_STATS(tgt_vdev_stats, mlo_ctxt_stats,
886*5113495bSYour Name 				    DP_XMIT_TOTAL);
887*5113495bSYour Name }
888*5113495bSYour Name 
889*5113495bSYour Name /**
890*5113495bSYour Name  * dp_update_mlo_link_vdev_ctxt_stats() - aggregate stats from mlo ctx
891*5113495bSYour Name  * @buf: vdev stats buf
892*5113495bSYour Name  * @mlo_ctxt_stats: mlo ctxt stats
893*5113495bSYour Name  * @xmit_type: xmit type of packet - MLD/Link
894*5113495bSYour Name  * return: void
895*5113495bSYour Name  */
896*5113495bSYour Name static inline
dp_update_mlo_link_vdev_ctxt_stats(void * buf,struct dp_vdev_stats * mlo_ctxt_stats,enum dp_pkt_xmit_type xmit_type)897*5113495bSYour Name void dp_update_mlo_link_vdev_ctxt_stats(void *buf,
898*5113495bSYour Name 					struct dp_vdev_stats *mlo_ctxt_stats,
899*5113495bSYour Name 					enum dp_pkt_xmit_type xmit_type)
900*5113495bSYour Name {
901*5113495bSYour Name 	struct cdp_vdev_stats *tgt_vdev_stats = (struct cdp_vdev_stats *)buf;
902*5113495bSYour Name 
903*5113495bSYour Name 	DP_UPDATE_TO_LINK_VDEV_STATS(tgt_vdev_stats, mlo_ctxt_stats, xmit_type);
904*5113495bSYour Name }
905*5113495bSYour Name 
906*5113495bSYour Name #ifdef WLAN_FEATURE_NEAR_FULL_IRQ
907*5113495bSYour Name /**
908*5113495bSYour Name  * enum dp_srng_near_full_levels - SRNG Near FULL levels
909*5113495bSYour Name  * @DP_SRNG_THRESH_SAFE: SRNG level safe for yielding the near full mode
910*5113495bSYour Name  *		of processing the entries in SRNG
911*5113495bSYour Name  * @DP_SRNG_THRESH_NEAR_FULL: SRNG level enters the near full mode
912*5113495bSYour Name  *		of processing the entries in SRNG
913*5113495bSYour Name  * @DP_SRNG_THRESH_CRITICAL: SRNG level enters the critical level of full
914*5113495bSYour Name  *		condition and drastic steps need to be taken for processing
915*5113495bSYour Name  *		the entries in SRNG
916*5113495bSYour Name  */
917*5113495bSYour Name enum dp_srng_near_full_levels {
918*5113495bSYour Name 	DP_SRNG_THRESH_SAFE,
919*5113495bSYour Name 	DP_SRNG_THRESH_NEAR_FULL,
920*5113495bSYour Name 	DP_SRNG_THRESH_CRITICAL,
921*5113495bSYour Name };
922*5113495bSYour Name 
923*5113495bSYour Name /**
924*5113495bSYour Name  * dp_srng_check_ring_near_full() - Check if SRNG is marked as near-full from
925*5113495bSYour Name  *				its corresponding near-full irq handler
926*5113495bSYour Name  * @soc: Datapath SoC handle
927*5113495bSYour Name  * @dp_srng: datapath handle for this SRNG
928*5113495bSYour Name  *
929*5113495bSYour Name  * Return: 1, if the srng was marked as near-full
930*5113495bSYour Name  *	   0, if the srng was not marked as near-full
931*5113495bSYour Name  */
dp_srng_check_ring_near_full(struct dp_soc * soc,struct dp_srng * dp_srng)932*5113495bSYour Name static inline int dp_srng_check_ring_near_full(struct dp_soc *soc,
933*5113495bSYour Name 					       struct dp_srng *dp_srng)
934*5113495bSYour Name {
935*5113495bSYour Name 	return qdf_atomic_read(&dp_srng->near_full);
936*5113495bSYour Name }
937*5113495bSYour Name 
938*5113495bSYour Name /**
939*5113495bSYour Name  * dp_srng_get_near_full_level() - Check the num available entries in the
940*5113495bSYour Name  *			consumer srng and return the level of the srng
941*5113495bSYour Name  *			near full state.
942*5113495bSYour Name  * @soc: Datapath SoC Handle [To be validated by the caller]
943*5113495bSYour Name  * @dp_srng: SRNG handle
944*5113495bSYour Name  *
945*5113495bSYour Name  * Return: near-full level
946*5113495bSYour Name  */
947*5113495bSYour Name static inline int
dp_srng_get_near_full_level(struct dp_soc * soc,struct dp_srng * dp_srng)948*5113495bSYour Name dp_srng_get_near_full_level(struct dp_soc *soc, struct dp_srng *dp_srng)
949*5113495bSYour Name {
950*5113495bSYour Name 	uint32_t num_valid;
951*5113495bSYour Name 
952*5113495bSYour Name 	num_valid = hal_srng_dst_num_valid_nolock(soc->hal_soc,
953*5113495bSYour Name 						  dp_srng->hal_srng,
954*5113495bSYour Name 						  true);
955*5113495bSYour Name 
956*5113495bSYour Name 	if (num_valid > dp_srng->crit_thresh)
957*5113495bSYour Name 		return DP_SRNG_THRESH_CRITICAL;
958*5113495bSYour Name 	else if (num_valid < dp_srng->safe_thresh)
959*5113495bSYour Name 		return DP_SRNG_THRESH_SAFE;
960*5113495bSYour Name 	else
961*5113495bSYour Name 		return DP_SRNG_THRESH_NEAR_FULL;
962*5113495bSYour Name }
963*5113495bSYour Name 
964*5113495bSYour Name #define DP_SRNG_PER_LOOP_NF_REAP_MULTIPLIER	2
965*5113495bSYour Name 
966*5113495bSYour Name /**
967*5113495bSYour Name  * _dp_srng_test_and_update_nf_params() - Test the near full level and update
968*5113495bSYour Name  *			the reap_limit and flags to reflect the state.
969*5113495bSYour Name  * @soc: Datapath soc handle
970*5113495bSYour Name  * @srng: Datapath handle for the srng
971*5113495bSYour Name  * @max_reap_limit: [Output Param] Buffer to set the map_reap_limit as
972*5113495bSYour Name  *			per the near-full state
973*5113495bSYour Name  *
974*5113495bSYour Name  * Return: 1, if the srng is near full
975*5113495bSYour Name  *	   0, if the srng is not near full
976*5113495bSYour Name  */
977*5113495bSYour Name static inline int
_dp_srng_test_and_update_nf_params(struct dp_soc * soc,struct dp_srng * srng,int * max_reap_limit)978*5113495bSYour Name _dp_srng_test_and_update_nf_params(struct dp_soc *soc,
979*5113495bSYour Name 				   struct dp_srng *srng,
980*5113495bSYour Name 				   int *max_reap_limit)
981*5113495bSYour Name {
982*5113495bSYour Name 	int ring_near_full = 0, near_full_level;
983*5113495bSYour Name 
984*5113495bSYour Name 	if (dp_srng_check_ring_near_full(soc, srng)) {
985*5113495bSYour Name 		near_full_level = dp_srng_get_near_full_level(soc, srng);
986*5113495bSYour Name 		switch (near_full_level) {
987*5113495bSYour Name 		case DP_SRNG_THRESH_CRITICAL:
988*5113495bSYour Name 			/* Currently not doing anything special here */
989*5113495bSYour Name 			fallthrough;
990*5113495bSYour Name 		case DP_SRNG_THRESH_NEAR_FULL:
991*5113495bSYour Name 			ring_near_full = 1;
992*5113495bSYour Name 			*max_reap_limit *= DP_SRNG_PER_LOOP_NF_REAP_MULTIPLIER;
993*5113495bSYour Name 			break;
994*5113495bSYour Name 		case DP_SRNG_THRESH_SAFE:
995*5113495bSYour Name 			qdf_atomic_set(&srng->near_full, 0);
996*5113495bSYour Name 			ring_near_full = 0;
997*5113495bSYour Name 			break;
998*5113495bSYour Name 		default:
999*5113495bSYour Name 			qdf_assert(0);
1000*5113495bSYour Name 			break;
1001*5113495bSYour Name 		}
1002*5113495bSYour Name 	}
1003*5113495bSYour Name 
1004*5113495bSYour Name 	return ring_near_full;
1005*5113495bSYour Name }
1006*5113495bSYour Name #else
1007*5113495bSYour Name static inline int
_dp_srng_test_and_update_nf_params(struct dp_soc * soc,struct dp_srng * srng,int * max_reap_limit)1008*5113495bSYour Name _dp_srng_test_and_update_nf_params(struct dp_soc *soc,
1009*5113495bSYour Name 				   struct dp_srng *srng,
1010*5113495bSYour Name 				   int *max_reap_limit)
1011*5113495bSYour Name {
1012*5113495bSYour Name 	return 0;
1013*5113495bSYour Name }
1014*5113495bSYour Name #endif
1015*5113495bSYour Name 
1016*5113495bSYour Name #ifdef QCA_SUPPORT_DP_GLOBAL_CTX
1017*5113495bSYour Name static inline
dp_desc_pool_get_spcl_cmem_base(uint8_t desc_pool_id)1018*5113495bSYour Name uint32_t dp_desc_pool_get_spcl_cmem_base(uint8_t desc_pool_id)
1019*5113495bSYour Name {
1020*5113495bSYour Name 	return (DP_TX_SPCL_DESC_CMEM_OFFSET +
1021*5113495bSYour Name 		(desc_pool_id * DP_TX_SPCL_DESC_POOL_CMEM_SIZE));
1022*5113495bSYour Name }
1023*5113495bSYour Name #else
1024*5113495bSYour Name static inline
dp_desc_pool_get_spcl_cmem_base(uint8_t desc_pool_id)1025*5113495bSYour Name uint32_t dp_desc_pool_get_spcl_cmem_base(uint8_t desc_pool_id)
1026*5113495bSYour Name {
1027*5113495bSYour Name 	QDF_BUG(0);
1028*5113495bSYour Name 	return 0;
1029*5113495bSYour Name }
1030*5113495bSYour Name #endif
1031*5113495bSYour Name static inline
dp_desc_pool_get_cmem_base(uint8_t chip_id,uint8_t desc_pool_id,enum qdf_dp_desc_type desc_type)1032*5113495bSYour Name uint32_t dp_desc_pool_get_cmem_base(uint8_t chip_id, uint8_t desc_pool_id,
1033*5113495bSYour Name 				    enum qdf_dp_desc_type desc_type)
1034*5113495bSYour Name {
1035*5113495bSYour Name 	switch (desc_type) {
1036*5113495bSYour Name 	case QDF_DP_TX_DESC_TYPE:
1037*5113495bSYour Name 		return (DP_TX_DESC_CMEM_OFFSET +
1038*5113495bSYour Name 			(desc_pool_id * DP_TX_DESC_POOL_CMEM_SIZE));
1039*5113495bSYour Name 	case QDF_DP_TX_SPCL_DESC_TYPE:
1040*5113495bSYour Name 		return dp_desc_pool_get_spcl_cmem_base(desc_pool_id);
1041*5113495bSYour Name 	case QDF_DP_RX_DESC_BUF_TYPE:
1042*5113495bSYour Name 		return (DP_RX_DESC_CMEM_OFFSET +
1043*5113495bSYour Name 			((chip_id * MAX_RXDESC_POOLS) + desc_pool_id) *
1044*5113495bSYour Name 			DP_RX_DESC_POOL_CMEM_SIZE);
1045*5113495bSYour Name 	case QDF_DP_TX_PPEDS_DESC_TYPE:
1046*5113495bSYour Name 		return DP_TX_PPEDS_DESC_CMEM_OFFSET;
1047*5113495bSYour Name 	default:
1048*5113495bSYour Name 			QDF_BUG(0);
1049*5113495bSYour Name 	}
1050*5113495bSYour Name 	return 0;
1051*5113495bSYour Name }
1052*5113495bSYour Name 
1053*5113495bSYour Name #ifndef WLAN_MLO_MULTI_CHIP
1054*5113495bSYour Name static inline
dp_soc_mlo_fill_params(struct dp_soc * soc,struct cdp_soc_attach_params * params)1055*5113495bSYour Name void dp_soc_mlo_fill_params(struct dp_soc *soc,
1056*5113495bSYour Name 			    struct cdp_soc_attach_params *params)
1057*5113495bSYour Name {
1058*5113495bSYour Name }
1059*5113495bSYour Name 
1060*5113495bSYour Name static inline
dp_pdev_mlo_fill_params(struct dp_pdev * pdev,struct cdp_pdev_attach_params * params)1061*5113495bSYour Name void dp_pdev_mlo_fill_params(struct dp_pdev *pdev,
1062*5113495bSYour Name 			     struct cdp_pdev_attach_params *params)
1063*5113495bSYour Name {
1064*5113495bSYour Name }
1065*5113495bSYour Name 
1066*5113495bSYour Name static inline
dp_mlo_update_link_to_pdev_map(struct dp_soc * soc,struct dp_pdev * pdev)1067*5113495bSYour Name void dp_mlo_update_link_to_pdev_map(struct dp_soc *soc, struct dp_pdev *pdev)
1068*5113495bSYour Name {
1069*5113495bSYour Name }
1070*5113495bSYour Name 
1071*5113495bSYour Name static inline
dp_mlo_update_link_to_pdev_unmap(struct dp_soc * soc,struct dp_pdev * pdev)1072*5113495bSYour Name void dp_mlo_update_link_to_pdev_unmap(struct dp_soc *soc, struct dp_pdev *pdev)
1073*5113495bSYour Name {
1074*5113495bSYour Name }
1075*5113495bSYour Name 
dp_mlo_get_chip_id(struct dp_soc * soc)1076*5113495bSYour Name static inline uint8_t dp_mlo_get_chip_id(struct dp_soc *soc)
1077*5113495bSYour Name {
1078*5113495bSYour Name 	return 0;
1079*5113495bSYour Name }
1080*5113495bSYour Name #endif
1081*5113495bSYour Name 
1082*5113495bSYour Name /**
1083*5113495bSYour Name  * dp_mlo_dev_ctxt_list_attach_wrapper() - Wrapper API for MLO dev list Init
1084*5113495bSYour Name  *
1085*5113495bSYour Name  * @mlo_dev_obj: MLO device object
1086*5113495bSYour Name  *
1087*5113495bSYour Name  * Return: void
1088*5113495bSYour Name  */
1089*5113495bSYour Name void dp_mlo_dev_ctxt_list_attach_wrapper(dp_mlo_dev_obj_t mlo_dev_obj);
1090*5113495bSYour Name 
1091*5113495bSYour Name /**
1092*5113495bSYour Name  * dp_mlo_dev_ctxt_list_detach_wrapper() - Wrapper API for MLO dev list de-Init
1093*5113495bSYour Name  *
1094*5113495bSYour Name  * @mlo_dev_obj: MLO device object
1095*5113495bSYour Name  *
1096*5113495bSYour Name  * Return: void
1097*5113495bSYour Name  */
1098*5113495bSYour Name void dp_mlo_dev_ctxt_list_detach_wrapper(dp_mlo_dev_obj_t mlo_dev_obj);
1099*5113495bSYour Name 
1100*5113495bSYour Name /**
1101*5113495bSYour Name  * dp_mlo_dev_ctxt_list_attach() - API to initialize MLO device List
1102*5113495bSYour Name  *
1103*5113495bSYour Name  * @mlo_dev_obj: MLO device object
1104*5113495bSYour Name  *
1105*5113495bSYour Name  * Return: void
1106*5113495bSYour Name  */
1107*5113495bSYour Name void dp_mlo_dev_ctxt_list_attach(dp_mlo_dev_obj_t mlo_dev_obj);
1108*5113495bSYour Name 
1109*5113495bSYour Name /**
1110*5113495bSYour Name  * dp_mlo_dev_ctxt_list_detach() - API to de-initialize MLO device List
1111*5113495bSYour Name  *
1112*5113495bSYour Name  * @mlo_dev_obj: MLO device object
1113*5113495bSYour Name  *
1114*5113495bSYour Name  * Return: void
1115*5113495bSYour Name  */
1116*5113495bSYour Name void dp_mlo_dev_ctxt_list_detach(dp_mlo_dev_obj_t mlo_dev_obj);
1117*5113495bSYour Name 
1118*5113495bSYour Name /**
1119*5113495bSYour Name  * dp_soc_initialize_cdp_cmn_mlo_ops() - API to initialize common CDP MLO ops
1120*5113495bSYour Name  *
1121*5113495bSYour Name  * @soc: Datapath soc handle
1122*5113495bSYour Name  *
1123*5113495bSYour Name  * Return: void
1124*5113495bSYour Name  */
1125*5113495bSYour Name void dp_soc_initialize_cdp_cmn_mlo_ops(struct dp_soc *soc);
1126*5113495bSYour Name 
1127*5113495bSYour Name #if defined(WLAN_FEATURE_11BE_MLO) && defined(WLAN_DP_MLO_DEV_CTX)
1128*5113495bSYour Name /**
1129*5113495bSYour Name  * dp_mlo_dev_ctxt_unref_delete() - Releasing the ref for MLO device ctxt
1130*5113495bSYour Name  *
1131*5113495bSYour Name  * @mlo_dev_ctxt: MLO device context handle
1132*5113495bSYour Name  * @mod_id: module id which is releasing the reference
1133*5113495bSYour Name  *
1134*5113495bSYour Name  * Return: void
1135*5113495bSYour Name  */
1136*5113495bSYour Name void dp_mlo_dev_ctxt_unref_delete(struct dp_mlo_dev_ctxt *mlo_dev_ctxt,
1137*5113495bSYour Name 				  enum dp_mod_id mod_id);
1138*5113495bSYour Name 
1139*5113495bSYour Name /**
1140*5113495bSYour Name  * dp_mlo_dev_get_ref() - Get the ref for MLO device ctxt
1141*5113495bSYour Name  *
1142*5113495bSYour Name  * @mlo_dev_ctxt: MLO device context handle
1143*5113495bSYour Name  * @mod_id: module id which is requesting the reference
1144*5113495bSYour Name  *
1145*5113495bSYour Name  * Return: SUCCESS on acquiring the ref.
1146*5113495bSYour Name  */
1147*5113495bSYour Name QDF_STATUS
1148*5113495bSYour Name dp_mlo_dev_get_ref(struct dp_mlo_dev_ctxt *mlo_dev_ctxt,
1149*5113495bSYour Name 		   enum dp_mod_id mod_id);
1150*5113495bSYour Name 
1151*5113495bSYour Name /**
1152*5113495bSYour Name  * dp_get_mlo_dev_ctx_by_mld_mac_addr() - Get MLO device ctx based on MLD MAC
1153*5113495bSYour Name  *
1154*5113495bSYour Name  * @be_soc: be soc handle
1155*5113495bSYour Name  * @mldaddr: MLD MAC address
1156*5113495bSYour Name  * @mod_id: module id which is requesting the reference
1157*5113495bSYour Name  *
1158*5113495bSYour Name  * Return: MLO device context Handle on success, NULL on failure
1159*5113495bSYour Name  */
1160*5113495bSYour Name struct dp_mlo_dev_ctxt *
1161*5113495bSYour Name dp_get_mlo_dev_ctx_by_mld_mac_addr(struct dp_soc_be *be_soc,
1162*5113495bSYour Name 				   uint8_t *mldaddr, enum dp_mod_id mod_id);
1163*5113495bSYour Name #endif /* WLAN_DP_MLO_DEV_CTX */
1164*5113495bSYour Name #endif
1165