dp_be.h 30 KB

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