dp.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704
  1. /* SPDX-License-Identifier: BSD-3-Clause-Clear */
  2. /*
  3. * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
  4. * Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries.
  5. */
  6. #ifndef ATH12K_DP_H
  7. #define ATH12K_DP_H
  8. #include "hw.h"
  9. #include "dp_htt.h"
  10. #include "dp_cmn.h"
  11. #include <linux/rhashtable.h>
  12. #define MAX_RXDMA_PER_PDEV 2
  13. struct ath12k_base;
  14. struct ath12k_dp_link_peer;
  15. struct ath12k_dp;
  16. struct ath12k_vif;
  17. struct ath12k_link_vif;
  18. struct ath12k_ext_irq_grp;
  19. struct ath12k_dp_rx_tid;
  20. struct ath12k_dp_rx_tid_rxq;
  21. #define DP_MON_PURGE_TIMEOUT_MS 100
  22. #define DP_MON_SERVICE_BUDGET 128
  23. #define DP_ENCAP_TYPE_MAX 4
  24. #define DP_ENCRYPT_TYPE_MAX 12
  25. #define DP_DESC_TYPE_MAX 2
  26. struct dp_srng {
  27. u32 *vaddr_unaligned;
  28. u32 *vaddr;
  29. dma_addr_t paddr_unaligned;
  30. dma_addr_t paddr;
  31. int size;
  32. u32 ring_id;
  33. };
  34. struct dp_rxdma_mon_ring {
  35. struct dp_srng refill_buf_ring;
  36. struct idr bufs_idr;
  37. /* Protects bufs_idr */
  38. spinlock_t idr_lock;
  39. int bufs_max;
  40. };
  41. struct dp_rxdma_ring {
  42. struct dp_srng refill_buf_ring;
  43. int bufs_max;
  44. };
  45. #define ATH12K_TX_COMPL_NEXT(ab, x) (((x) + 1) % DP_TX_COMP_RING_SIZE(ab))
  46. struct dp_tx_ring {
  47. u8 tcl_data_ring_id;
  48. struct dp_srng tcl_data_ring;
  49. struct dp_srng tcl_comp_ring;
  50. struct hal_wbm_completion_ring_tx *tx_status;
  51. int tx_status_head;
  52. int tx_status_tail;
  53. };
  54. struct ath12k_pdev_mon_stats {
  55. u32 status_ppdu_state;
  56. u32 status_ppdu_start;
  57. u32 status_ppdu_end;
  58. u32 status_ppdu_compl;
  59. u32 status_ppdu_start_mis;
  60. u32 status_ppdu_end_mis;
  61. u32 status_ppdu_done;
  62. u32 dest_ppdu_done;
  63. u32 dest_mpdu_done;
  64. u32 dest_mpdu_drop;
  65. u32 dup_mon_linkdesc_cnt;
  66. u32 dup_mon_buf_cnt;
  67. u32 dest_mon_stuck;
  68. u32 dest_mon_not_reaped;
  69. };
  70. enum dp_mon_status_buf_state {
  71. DP_MON_STATUS_MATCH,
  72. DP_MON_STATUS_NO_DMA,
  73. DP_MON_STATUS_LAG,
  74. DP_MON_STATUS_LEAD,
  75. DP_MON_STATUS_REPLINISH,
  76. };
  77. struct dp_link_desc_bank {
  78. void *vaddr_unaligned;
  79. void *vaddr;
  80. dma_addr_t paddr_unaligned;
  81. dma_addr_t paddr;
  82. u32 size;
  83. };
  84. /* Size to enforce scatter idle list mode */
  85. #define DP_LINK_DESC_ALLOC_SIZE_THRESH 0x200000
  86. #define DP_LINK_DESC_BANKS_MAX 8
  87. #define DP_LINK_DESC_START 0x4000
  88. #define DP_LINK_DESC_SHIFT 3
  89. #define DP_LINK_DESC_COOKIE_SET(id, page) \
  90. ((((id) + DP_LINK_DESC_START) << DP_LINK_DESC_SHIFT) | (page))
  91. #define DP_LINK_DESC_BANK_MASK GENMASK(2, 0)
  92. #define DP_RX_DESC_COOKIE_INDEX_MAX 0x3ffff
  93. #define DP_RX_DESC_COOKIE_POOL_ID_MAX 0x1c0000
  94. #define DP_RX_DESC_COOKIE_MAX \
  95. (DP_RX_DESC_COOKIE_INDEX_MAX | DP_RX_DESC_COOKIE_POOL_ID_MAX)
  96. #define DP_NOT_PPDU_ID_WRAP_AROUND 20000
  97. enum ath12k_dp_ppdu_state {
  98. DP_PPDU_STATUS_START,
  99. DP_PPDU_STATUS_DONE,
  100. };
  101. struct dp_mon_mpdu {
  102. struct list_head list;
  103. struct sk_buff *head;
  104. struct sk_buff *tail;
  105. u32 err_bitmap;
  106. u8 decap_format;
  107. };
  108. #define DP_MON_MAX_STATUS_BUF 32
  109. struct ath12k_mon_data {
  110. struct dp_link_desc_bank link_desc_banks[DP_LINK_DESC_BANKS_MAX];
  111. struct hal_rx_mon_ppdu_info mon_ppdu_info;
  112. u32 mon_ppdu_status;
  113. u32 mon_last_buf_cookie;
  114. u64 mon_last_linkdesc_paddr;
  115. u16 chan_noise_floor;
  116. u32 err_bitmap;
  117. u8 decap_format;
  118. struct ath12k_pdev_mon_stats rx_mon_stats;
  119. enum dp_mon_status_buf_state buf_state;
  120. /* lock for monitor data */
  121. spinlock_t mon_lock;
  122. struct sk_buff_head rx_status_q;
  123. struct dp_mon_mpdu *mon_mpdu;
  124. struct list_head dp_rx_mon_mpdu_list;
  125. struct dp_mon_tx_ppdu_info *tx_prot_ppdu_info;
  126. struct dp_mon_tx_ppdu_info *tx_data_ppdu_info;
  127. };
  128. struct ath12k_pdev_dp {
  129. u32 mac_id;
  130. atomic_t num_tx_pending;
  131. wait_queue_head_t tx_empty_waitq;
  132. struct ath12k_dp *dp;
  133. struct ieee80211_hw *hw;
  134. u8 hw_link_id;
  135. struct ath12k_dp_hw *dp_hw;
  136. /* Protects ppdu stats */
  137. spinlock_t ppdu_list_lock;
  138. struct ath12k_per_peer_tx_stats peer_tx_stats;
  139. struct list_head ppdu_stats_info;
  140. u32 ppdu_stat_list_depth;
  141. struct dp_srng rxdma_mon_dst_ring[MAX_RXDMA_PER_PDEV];
  142. struct dp_srng tx_mon_dst_ring[MAX_RXDMA_PER_PDEV];
  143. struct ieee80211_rx_status rx_status;
  144. struct ath12k_mon_data mon_data;
  145. };
  146. #define DP_NUM_CLIENTS_MAX 64
  147. #define DP_AVG_TIDS_PER_CLIENT 2
  148. #define DP_NUM_TIDS_MAX (DP_NUM_CLIENTS_MAX * DP_AVG_TIDS_PER_CLIENT)
  149. #define DP_AVG_MSDUS_PER_FLOW 128
  150. #define DP_AVG_FLOWS_PER_TID 2
  151. #define DP_AVG_MPDUS_PER_TID_MAX 128
  152. #define DP_AVG_MSDUS_PER_MPDU 4
  153. #define DP_RX_HASH_ENABLE 1 /* Enable hash based Rx steering */
  154. #define DP_BA_WIN_SZ_MAX 1024
  155. #define DP_TCL_NUM_RING_MAX 4
  156. #define DP_IDLE_SCATTER_BUFS_MAX 16
  157. #define DP_WBM_RELEASE_RING_SIZE 64
  158. #define DP_TCL_DATA_RING_SIZE 512
  159. #define DP_TX_COMP_RING_SIZE(ab) \
  160. ((ab)->profile_param->dp_params.tx_comp_ring_size)
  161. #define DP_TX_IDR_SIZE(ab) DP_TX_COMP_RING_SIZE(ab)
  162. #define DP_TCL_CMD_RING_SIZE 32
  163. #define DP_TCL_STATUS_RING_SIZE 32
  164. #define DP_REO_DST_RING_MAX 8
  165. #define DP_REO_DST_RING_SIZE 2048
  166. #define DP_REO_REINJECT_RING_SIZE 32
  167. #define DP_RX_RELEASE_RING_SIZE 1024
  168. #define DP_REO_EXCEPTION_RING_SIZE 128
  169. #define DP_REO_CMD_RING_SIZE 256
  170. #define DP_REO_STATUS_RING_SIZE 2048
  171. #define DP_RXDMA_BUF_RING_SIZE 4096
  172. #define DP_RX_MAC_BUF_RING_SIZE 2048
  173. #define DP_RXDMA_REFILL_RING_SIZE 2048
  174. #define DP_RXDMA_ERR_DST_RING_SIZE 1024
  175. #define DP_RXDMA_MON_STATUS_RING_SIZE 1024
  176. #define DP_RXDMA_MONITOR_BUF_RING_SIZE(ab) \
  177. ((ab)->profile_param->dp_params.rxdma_monitor_buf_ring_size)
  178. #define DP_RXDMA_MONITOR_DST_RING_SIZE(ab) \
  179. ((ab)->profile_param->dp_params.rxdma_monitor_dst_ring_size)
  180. #define DP_RXDMA_MONITOR_DESC_RING_SIZE 4096
  181. #define DP_TX_MONITOR_BUF_RING_SIZE 4096
  182. #define DP_TX_MONITOR_DEST_RING_SIZE 2048
  183. #define DP_TX_MONITOR_BUF_SIZE 2048
  184. #define DP_TX_MONITOR_BUF_SIZE_MIN 48
  185. #define DP_TX_MONITOR_BUF_SIZE_MAX 8192
  186. #define DP_RX_BUFFER_SIZE 2048
  187. #define DP_RX_BUFFER_SIZE_LITE 1024
  188. #define DP_RX_BUFFER_ALIGN_SIZE 128
  189. #define RX_MON_STATUS_BASE_BUF_SIZE 2048
  190. #define RX_MON_STATUS_BUF_ALIGN 128
  191. #define RX_MON_STATUS_BUF_RESERVATION 128
  192. #define RX_MON_STATUS_BUF_SIZE (RX_MON_STATUS_BASE_BUF_SIZE - \
  193. (RX_MON_STATUS_BUF_RESERVATION + \
  194. RX_MON_STATUS_BUF_ALIGN + \
  195. SKB_DATA_ALIGN(sizeof(struct skb_shared_info))))
  196. #define DP_RXDMA_BUF_COOKIE_BUF_ID GENMASK(17, 0)
  197. #define DP_RXDMA_BUF_COOKIE_PDEV_ID GENMASK(19, 18)
  198. #define DP_HW2SW_MACID(mac_id) ({ typeof(mac_id) x = (mac_id); x ? x - 1 : 0; })
  199. #define DP_SW2HW_MACID(mac_id) ((mac_id) + 1)
  200. #define DP_TX_DESC_ID_MAC_ID GENMASK(1, 0)
  201. #define DP_TX_DESC_ID_MSDU_ID GENMASK(18, 2)
  202. #define DP_TX_DESC_ID_POOL_ID GENMASK(20, 19)
  203. #define ATH12K_SHADOW_DP_TIMER_INTERVAL 20
  204. #define ATH12K_SHADOW_CTRL_TIMER_INTERVAL 10
  205. #define ATH12K_NUM_POOL_TX_DESC(ab) \
  206. ((ab)->profile_param->dp_params.num_pool_tx_desc)
  207. /* TODO: revisit this count during testing */
  208. #define ATH12K_RX_DESC_COUNT(ab) \
  209. ((ab)->profile_param->dp_params.rx_desc_count)
  210. #define ATH12K_PAGE_SIZE PAGE_SIZE
  211. /* Total 1024 entries in PPT, i.e 4K/4 considering 4K aligned
  212. * SPT pages which makes lower 12bits 0
  213. */
  214. #define ATH12K_MAX_PPT_ENTRIES 1024
  215. /* Total 512 entries in a SPT, i.e 4K Page/8 */
  216. #define ATH12K_MAX_SPT_ENTRIES 512
  217. #define ATH12K_NUM_RX_SPT_PAGES(ab) ((ATH12K_RX_DESC_COUNT(ab)) / \
  218. ATH12K_MAX_SPT_ENTRIES)
  219. #define ATH12K_TX_SPT_PAGES_PER_POOL(ab) (ATH12K_NUM_POOL_TX_DESC(ab) / \
  220. ATH12K_MAX_SPT_ENTRIES)
  221. #define ATH12K_NUM_TX_SPT_PAGES(ab) (ATH12K_TX_SPT_PAGES_PER_POOL(ab) * \
  222. ATH12K_HW_MAX_QUEUES)
  223. #define ATH12K_TX_SPT_PAGE_OFFSET 0
  224. #define ATH12K_RX_SPT_PAGE_OFFSET(ab) ATH12K_NUM_TX_SPT_PAGES(ab)
  225. /* The SPT pages are divided for RX and TX, first block for RX
  226. * and remaining for TX
  227. */
  228. #define ATH12K_NUM_TX_SPT_PAGE_START(ab) ATH12K_NUM_RX_SPT_PAGES(ab)
  229. #define ATH12K_DP_RX_DESC_MAGIC 0xBABABABA
  230. /* 4K aligned address have last 12 bits set to 0, this check is done
  231. * so that two spt pages address can be stored per 8bytes
  232. * of CMEM (PPT)
  233. */
  234. #define ATH12K_SPT_4K_ALIGN_CHECK 0xFFF
  235. #define ATH12K_SPT_4K_ALIGN_OFFSET 12
  236. #define ATH12K_PPT_ADDR_OFFSET(ppt_index) (4 * (ppt_index))
  237. /* To indicate HW of CMEM address, b0-31 are cmem base received via QMI */
  238. #define ATH12K_CMEM_ADDR_MSB 0x10
  239. /* Of 20 bits cookie, b0-b8 is to indicate SPT offset and b9-19 for PPT */
  240. #define ATH12K_CC_SPT_MSB 8
  241. #define ATH12K_CC_PPT_MSB 19
  242. #define ATH12K_CC_PPT_SHIFT 9
  243. #define ATH12K_DP_CC_COOKIE_SPT GENMASK(8, 0)
  244. #define ATH12K_DP_CC_COOKIE_PPT GENMASK(19, 9)
  245. #define DP_REO_QREF_NUM GENMASK(31, 16)
  246. #define DP_MAX_PEER_ID 2047
  247. /* Total size of the LUT is based on 2K peers, each having reference
  248. * for 17tids, note each entry is of type ath12k_reo_queue_ref
  249. * hence total size is 2048 * 17 * 8 = 278528
  250. */
  251. #define DP_REOQ_LUT_SIZE 278528
  252. /* Invalid TX Bank ID value */
  253. #define DP_INVALID_BANK_ID -1
  254. #define MAX_TQM_RELEASE_REASON 15
  255. #define MAX_FW_TX_STATUS 7
  256. struct ath12k_dp_tx_bank_profile {
  257. u8 is_configured;
  258. u32 num_users;
  259. u32 bank_config;
  260. };
  261. struct ath12k_hp_update_timer {
  262. struct timer_list timer;
  263. bool started;
  264. bool init;
  265. u32 tx_num;
  266. u32 timer_tx_num;
  267. u32 ring_id;
  268. u32 interval;
  269. struct ath12k_base *ab;
  270. };
  271. struct ath12k_rx_desc_info {
  272. struct list_head list;
  273. struct sk_buff *skb;
  274. u32 cookie;
  275. u32 magic;
  276. u8 in_use : 1,
  277. device_id : 3,
  278. reserved : 4;
  279. };
  280. struct ath12k_tx_desc_info {
  281. struct list_head list;
  282. struct sk_buff *skb;
  283. struct sk_buff *skb_ext_desc;
  284. u32 desc_id; /* Cookie */
  285. u8 mac_id;
  286. u8 pool_id;
  287. };
  288. struct ath12k_tx_desc_params {
  289. struct sk_buff *skb;
  290. struct sk_buff *skb_ext_desc;
  291. u8 mac_id;
  292. };
  293. struct ath12k_spt_info {
  294. dma_addr_t paddr;
  295. u64 *vaddr;
  296. };
  297. struct ath12k_reo_queue_ref {
  298. u32 info0;
  299. u32 info1;
  300. } __packed;
  301. struct ath12k_reo_q_addr_lut {
  302. u32 *vaddr_unaligned;
  303. u32 *vaddr;
  304. dma_addr_t paddr_unaligned;
  305. dma_addr_t paddr;
  306. u32 size;
  307. };
  308. struct ath12k_link_stats {
  309. u32 tx_enqueued;
  310. u32 tx_completed;
  311. u32 tx_bcast_mcast;
  312. u32 tx_dropped;
  313. u32 tx_encap_type[DP_ENCAP_TYPE_MAX];
  314. u32 tx_encrypt_type[DP_ENCRYPT_TYPE_MAX];
  315. u32 tx_desc_type[DP_DESC_TYPE_MAX];
  316. };
  317. /* DP arch ops to communicate from common module
  318. * to arch specific module
  319. */
  320. struct ath12k_dp_arch_ops {
  321. int (*service_srng)(struct ath12k_dp *dp,
  322. struct ath12k_ext_irq_grp *irq_grp,
  323. int budget);
  324. u32 (*tx_get_vdev_bank_config)(struct ath12k_base *ab,
  325. struct ath12k_link_vif *arvif);
  326. int (*reo_cmd_send)(struct ath12k_base *ab,
  327. struct ath12k_dp_rx_tid_rxq *rx_tid,
  328. enum hal_reo_cmd_type type,
  329. struct ath12k_hal_reo_cmd *cmd,
  330. void (*cb)(struct ath12k_dp *dp, void *ctx,
  331. enum hal_reo_cmd_status status));
  332. void (*setup_pn_check_reo_cmd)(struct ath12k_hal_reo_cmd *cmd,
  333. struct ath12k_dp_rx_tid *rx_tid,
  334. u32 cipher, enum set_key_cmd key_cmd);
  335. void (*rx_peer_tid_delete)(struct ath12k_base *ab,
  336. struct ath12k_dp_link_peer *peer, u8 tid);
  337. int (*reo_cache_flush)(struct ath12k_base *ab,
  338. struct ath12k_dp_rx_tid_rxq *rx_tid);
  339. int (*rx_link_desc_return)(struct ath12k_dp *dp,
  340. struct ath12k_buffer_addr *buf_addr_info,
  341. enum hal_wbm_rel_bm_act action);
  342. void (*rx_frags_cleanup)(struct ath12k_dp_rx_tid *rx_tid,
  343. bool rel_link_desc);
  344. int (*peer_rx_tid_reo_update)(struct ath12k_dp *dp,
  345. struct ath12k_dp_link_peer *peer,
  346. struct ath12k_dp_rx_tid *rx_tid,
  347. u32 ba_win_sz, u16 ssn,
  348. bool update_ssn);
  349. int (*rx_assign_reoq)(struct ath12k_base *ab, struct ath12k_dp_peer *dp_peer,
  350. struct ath12k_dp_rx_tid *rx_tid,
  351. u16 ssn, enum hal_pn_type pn_type);
  352. void (*peer_rx_tid_qref_setup)(struct ath12k_base *ab, u16 peer_id, u16 tid,
  353. dma_addr_t paddr);
  354. void (*peer_rx_tid_qref_reset)(struct ath12k_base *ab, u16 peer_id, u16 tid);
  355. int (*rx_tid_delete_handler)(struct ath12k_base *ab,
  356. struct ath12k_dp_rx_tid_rxq *rx_tid);
  357. };
  358. struct ath12k_device_dp_tx_err_stats {
  359. /* TCL Ring Descriptor unavailable */
  360. u32 desc_na[DP_TCL_NUM_RING_MAX];
  361. /* Other failures during dp_tx due to mem allocation failure
  362. * idr unavailable etc.
  363. */
  364. atomic_t misc_fail;
  365. };
  366. struct ath12k_device_dp_stats {
  367. u32 err_ring_pkts;
  368. u32 invalid_rbm;
  369. u32 rxdma_error[HAL_REO_ENTR_RING_RXDMA_ECODE_MAX];
  370. u32 reo_error[HAL_REO_DEST_RING_ERROR_CODE_MAX];
  371. u32 hal_reo_error[DP_REO_DST_RING_MAX];
  372. struct ath12k_device_dp_tx_err_stats tx_err;
  373. u32 reo_rx[DP_REO_DST_RING_MAX][ATH12K_MAX_DEVICES];
  374. u32 rx_wbm_rel_source[HAL_WBM_REL_SRC_MODULE_MAX][ATH12K_MAX_DEVICES];
  375. u32 tqm_rel_reason[MAX_TQM_RELEASE_REASON];
  376. u32 fw_tx_status[MAX_FW_TX_STATUS];
  377. u32 tx_wbm_rel_source[HAL_WBM_REL_SRC_MODULE_MAX];
  378. u32 tx_enqueued[DP_TCL_NUM_RING_MAX];
  379. u32 tx_completed[DP_TCL_NUM_RING_MAX];
  380. u32 reo_excep_msdu_buf_type;
  381. };
  382. struct ath12k_dp {
  383. struct ath12k_base *ab;
  384. u32 mon_dest_ring_stuck_cnt;
  385. u8 num_bank_profiles;
  386. /* protects the access and update of bank_profiles */
  387. spinlock_t tx_bank_lock;
  388. struct ath12k_dp_tx_bank_profile *bank_profiles;
  389. enum ath12k_htc_ep_id eid;
  390. struct completion htt_tgt_version_received;
  391. u8 htt_tgt_ver_major;
  392. u8 htt_tgt_ver_minor;
  393. struct dp_link_desc_bank link_desc_banks[DP_LINK_DESC_BANKS_MAX];
  394. enum hal_rx_buf_return_buf_manager idle_link_rbm;
  395. struct dp_srng wbm_idle_ring;
  396. struct dp_srng wbm_desc_rel_ring;
  397. struct dp_srng reo_reinject_ring;
  398. struct dp_srng rx_rel_ring;
  399. struct dp_srng reo_except_ring;
  400. struct dp_srng reo_cmd_ring;
  401. struct dp_srng reo_status_ring;
  402. enum ath12k_peer_metadata_version peer_metadata_ver;
  403. struct dp_srng reo_dst_ring[DP_REO_DST_RING_MAX];
  404. struct dp_tx_ring tx_ring[DP_TCL_NUM_RING_MAX];
  405. struct hal_wbm_idle_scatter_list scatter_list[DP_IDLE_SCATTER_BUFS_MAX];
  406. struct list_head reo_cmd_update_rx_queue_list;
  407. struct list_head reo_cmd_cache_flush_list;
  408. u32 reo_cmd_cache_flush_count;
  409. /* protects access to below fields,
  410. * - reo_cmd_update_rx_queue_list
  411. * - reo_cmd_cache_flush_list
  412. * - reo_cmd_cache_flush_count
  413. */
  414. spinlock_t reo_rxq_flush_lock;
  415. struct list_head reo_cmd_list;
  416. /* protects access to below fields,
  417. * - reo_cmd_list
  418. */
  419. spinlock_t reo_cmd_lock;
  420. struct ath12k_hp_update_timer reo_cmd_timer;
  421. struct ath12k_hp_update_timer tx_ring_timer[DP_TCL_NUM_RING_MAX];
  422. struct ath12k_spt_info *spt_info;
  423. u32 num_spt_pages;
  424. u32 rx_ppt_base;
  425. struct ath12k_rx_desc_info **rxbaddr;
  426. struct ath12k_tx_desc_info **txbaddr;
  427. struct list_head rx_desc_free_list;
  428. /* protects the free desc list */
  429. spinlock_t rx_desc_lock;
  430. struct list_head tx_desc_free_list[ATH12K_HW_MAX_QUEUES];
  431. struct list_head tx_desc_used_list[ATH12K_HW_MAX_QUEUES];
  432. /* protects the free and used desc lists */
  433. spinlock_t tx_desc_lock[ATH12K_HW_MAX_QUEUES];
  434. struct dp_rxdma_ring rx_refill_buf_ring;
  435. struct dp_srng rx_mac_buf_ring[MAX_RXDMA_PER_PDEV];
  436. struct dp_srng rxdma_err_dst_ring[MAX_RXDMA_PER_PDEV];
  437. struct dp_rxdma_mon_ring rxdma_mon_buf_ring;
  438. struct dp_rxdma_mon_ring tx_mon_buf_ring;
  439. struct dp_rxdma_mon_ring rx_mon_status_refill_ring[MAX_RXDMA_PER_PDEV];
  440. struct ath12k_reo_q_addr_lut reoq_lut;
  441. struct ath12k_reo_q_addr_lut ml_reoq_lut;
  442. const struct ath12k_hw_params *hw_params;
  443. struct device *dev;
  444. struct ath12k_hal *hal;
  445. /* RCU on dp_pdevs[] provides a teardown synchronization mechanism,
  446. * ensuring in-flight data path readers complete before reclaim. Writers
  447. * update internal fields under their own synchronization, while readers of
  448. * internal fields may perform lockless read if occasional inconsistency
  449. * is acceptable or use additional synchronization for a coherent view.
  450. *
  451. * RCU is used for dp_pdevs[] at this stage to align with
  452. * ab->pdevs_active[]. However, if the teardown paths ensure quiescence,
  453. * both dp_pdevs[] and pdevs_active[] can be converted to plain pointers,
  454. * removing RCU synchronize overhead.
  455. *
  456. * TODO: evaluate removal of RCU from dp_pdevs in the future
  457. */
  458. struct ath12k_pdev_dp __rcu *dp_pdevs[MAX_RADIOS];
  459. struct ath12k_hw_group *ag;
  460. u8 device_id;
  461. /* Lock for protection of peers and rhead_peer_addr */
  462. spinlock_t dp_lock;
  463. struct ath12k_dp_arch_ops *ops;
  464. /* Linked list of struct ath12k_dp_link_peer */
  465. struct list_head peers;
  466. /* For rhash table init and deinit protection */
  467. struct mutex link_peer_rhash_tbl_lock;
  468. /* The rhashtable containing struct ath12k_link_peer keyed by mac addr */
  469. struct rhashtable *rhead_peer_addr;
  470. struct rhashtable_params rhash_peer_addr_param;
  471. struct ath12k_device_dp_stats device_stats;
  472. };
  473. static inline u32 ath12k_dp_arch_tx_get_vdev_bank_config(struct ath12k_dp *dp,
  474. struct ath12k_link_vif *arvif)
  475. {
  476. return dp->ops->tx_get_vdev_bank_config(dp->ab, arvif);
  477. }
  478. static inline int ath12k_dp_arch_reo_cmd_send(struct ath12k_dp *dp,
  479. struct ath12k_dp_rx_tid_rxq *rx_tid,
  480. enum hal_reo_cmd_type type,
  481. struct ath12k_hal_reo_cmd *cmd,
  482. void (*cb)(struct ath12k_dp *dp, void *ctx,
  483. enum hal_reo_cmd_status status))
  484. {
  485. return dp->ops->reo_cmd_send(dp->ab, rx_tid, type, cmd, cb);
  486. }
  487. static inline
  488. void ath12k_dp_arch_setup_pn_check_reo_cmd(struct ath12k_dp *dp,
  489. struct ath12k_hal_reo_cmd *cmd,
  490. struct ath12k_dp_rx_tid *rx_tid,
  491. u32 cipher,
  492. enum set_key_cmd key_cmd)
  493. {
  494. dp->ops->setup_pn_check_reo_cmd(cmd, rx_tid, cipher, key_cmd);
  495. }
  496. static inline void ath12k_dp_arch_rx_peer_tid_delete(struct ath12k_dp *dp,
  497. struct ath12k_dp_link_peer *peer,
  498. u8 tid)
  499. {
  500. dp->ops->rx_peer_tid_delete(dp->ab, peer, tid);
  501. }
  502. static inline int ath12k_dp_arch_reo_cache_flush(struct ath12k_dp *dp,
  503. struct ath12k_dp_rx_tid_rxq *rx_tid)
  504. {
  505. return dp->ops->reo_cache_flush(dp->ab, rx_tid);
  506. }
  507. static inline
  508. int ath12k_dp_arch_rx_link_desc_return(struct ath12k_dp *dp,
  509. struct ath12k_buffer_addr *buf_addr_info,
  510. enum hal_wbm_rel_bm_act action)
  511. {
  512. return dp->ops->rx_link_desc_return(dp, buf_addr_info, action);
  513. }
  514. static inline
  515. void ath12k_dp_arch_rx_frags_cleanup(struct ath12k_dp *dp,
  516. struct ath12k_dp_rx_tid *rx_tid,
  517. bool rel_link_desc)
  518. {
  519. dp->ops->rx_frags_cleanup(rx_tid, rel_link_desc);
  520. }
  521. static inline int ath12k_dp_arch_peer_rx_tid_reo_update(struct ath12k_dp *dp,
  522. struct ath12k_dp_link_peer *peer,
  523. struct ath12k_dp_rx_tid *rx_tid,
  524. u32 ba_win_sz, u16 ssn,
  525. bool update_ssn)
  526. {
  527. return dp->ops->peer_rx_tid_reo_update(dp, peer, rx_tid,
  528. ba_win_sz, ssn, update_ssn);
  529. }
  530. static inline int ath12k_dp_arch_rx_assign_reoq(struct ath12k_dp *dp,
  531. struct ath12k_dp_peer *dp_peer,
  532. struct ath12k_dp_rx_tid *rx_tid,
  533. u16 ssn, enum hal_pn_type pn_type)
  534. {
  535. return dp->ops->rx_assign_reoq(dp->ab, dp_peer, rx_tid, ssn, pn_type);
  536. }
  537. static inline void ath12k_dp_arch_peer_rx_tid_qref_setup(struct ath12k_dp *dp,
  538. u16 peer_id, u16 tid,
  539. dma_addr_t paddr)
  540. {
  541. dp->ops->peer_rx_tid_qref_setup(dp->ab, peer_id, tid, paddr);
  542. }
  543. static inline void ath12k_dp_arch_peer_rx_tid_qref_reset(struct ath12k_dp *dp,
  544. u16 peer_id, u16 tid)
  545. {
  546. dp->ops->peer_rx_tid_qref_reset(dp->ab, peer_id, tid);
  547. }
  548. static inline
  549. int ath12k_dp_arch_rx_tid_delete_handler(struct ath12k_dp *dp,
  550. struct ath12k_dp_rx_tid_rxq *rx_tid)
  551. {
  552. return dp->ops->rx_tid_delete_handler(dp->ab, rx_tid);
  553. }
  554. static inline void ath12k_dp_get_mac_addr(u32 addr_l32, u16 addr_h16, u8 *addr)
  555. {
  556. memcpy(addr, &addr_l32, 4);
  557. memcpy(addr + 4, &addr_h16, ETH_ALEN - 4);
  558. }
  559. static inline struct ath12k_dp *
  560. ath12k_dp_hw_grp_to_dp(struct ath12k_dp_hw_group *dp_hw_grp, u8 device_id)
  561. {
  562. return dp_hw_grp->dp[device_id];
  563. }
  564. static inline int
  565. ath12k_dp_service_srng(struct ath12k_dp *dp, struct ath12k_ext_irq_grp *irq_grp,
  566. int budget)
  567. {
  568. return dp->ops->service_srng(dp, irq_grp, budget);
  569. }
  570. static inline struct ieee80211_hw *
  571. ath12k_pdev_dp_to_hw(struct ath12k_pdev_dp *pdev)
  572. {
  573. return pdev->hw;
  574. }
  575. static inline struct ath12k_pdev_dp *
  576. ath12k_dp_to_pdev_dp(struct ath12k_dp *dp, u8 pdev_idx)
  577. {
  578. RCU_LOCKDEP_WARN(!rcu_read_lock_held(),
  579. "ath12k dp to dp pdev called without rcu lock");
  580. return rcu_dereference(dp->dp_pdevs[pdev_idx]);
  581. }
  582. void ath12k_dp_vdev_tx_attach(struct ath12k *ar, struct ath12k_link_vif *arvif);
  583. void ath12k_dp_partner_cc_init(struct ath12k_base *ab);
  584. int ath12k_dp_pdev_alloc(struct ath12k_base *ab);
  585. void ath12k_dp_pdev_pre_alloc(struct ath12k *ar);
  586. void ath12k_dp_pdev_free(struct ath12k_base *ab);
  587. int ath12k_dp_peer_setup(struct ath12k *ar, int vdev_id, const u8 *addr);
  588. void ath12k_dp_peer_cleanup(struct ath12k *ar, int vdev_id, const u8 *addr);
  589. void ath12k_dp_srng_cleanup(struct ath12k_base *ab, struct dp_srng *ring);
  590. int ath12k_dp_srng_setup(struct ath12k_base *ab, struct dp_srng *ring,
  591. enum hal_ring_type type, int ring_num,
  592. int mac_id, int num_entries);
  593. void ath12k_dp_link_desc_cleanup(struct ath12k_base *ab,
  594. struct dp_link_desc_bank *desc_bank,
  595. u32 ring_type, struct dp_srng *ring);
  596. int ath12k_dp_link_desc_setup(struct ath12k_base *ab,
  597. struct dp_link_desc_bank *link_desc_banks,
  598. u32 ring_type, struct hal_srng *srng,
  599. u32 n_link_desc);
  600. struct ath12k_rx_desc_info *ath12k_dp_get_rx_desc(struct ath12k_dp *dp,
  601. u32 cookie);
  602. struct ath12k_tx_desc_info *ath12k_dp_get_tx_desc(struct ath12k_dp *dp,
  603. u32 desc_id);
  604. #endif