hal_9224_tx.h 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  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 _HAL_9224_TX_H_
  20. #define _HAL_9224_TX_H_
  21. #include "tcl_data_cmd.h"
  22. #include "phyrx_rssi_legacy.h"
  23. #include "hal_internal.h"
  24. #include "qdf_trace.h"
  25. #include "hal_rx.h"
  26. #include "hal_tx.h"
  27. #include "hal_api_mon.h"
  28. #include <hal_be_tx.h>
  29. #define DSCP_TID_TABLE_SIZE 24
  30. #define NUM_WORDS_PER_DSCP_TID_TABLE (DSCP_TID_TABLE_SIZE / 4)
  31. #define HAL_TX_NUM_DSCP_REGISTER_SIZE 32
  32. /**
  33. * hal_tx_ppe2tcl_ring_halt_set_9224() - Enable ring halt for the ppe2tcl ring
  34. * @hal_soc: HAL SoC context
  35. *
  36. * Return: none
  37. */
  38. static void hal_tx_ppe2tcl_ring_halt_set_9224(hal_soc_handle_t hal_soc)
  39. {
  40. uint32_t cmn_reg_addr;
  41. uint32_t regval;
  42. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  43. cmn_reg_addr =
  44. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(MAC_TCL_REG_REG_BASE);
  45. /* Enable RING_HALT */
  46. regval = HAL_REG_READ(soc, cmn_reg_addr);
  47. regval |=
  48. (1 <<
  49. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_PPE2TCL1_RNG_HALT_SHFT);
  50. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  51. }
  52. /**
  53. * hal_tx_ppe2tcl_ring_halt_reset_9224() - Disable ring halt for the ppe2tcl
  54. * ring
  55. * @hal_soc: HAL SoC context
  56. *
  57. * Return: none
  58. */
  59. static void hal_tx_ppe2tcl_ring_halt_reset_9224(hal_soc_handle_t hal_soc)
  60. {
  61. uint32_t cmn_reg_addr;
  62. uint32_t regval;
  63. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  64. cmn_reg_addr =
  65. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(MAC_TCL_REG_REG_BASE);
  66. /* Disable RING_HALT */
  67. regval = HAL_REG_READ(soc, cmn_reg_addr);
  68. regval &= ~(1 <<
  69. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_PPE2TCL1_RNG_HALT_SHFT);
  70. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  71. }
  72. /**
  73. * hal_tx_ppe2tcl_ring_halt_done_9224() - Check if ring halt is done
  74. * for ppe2tcl ring
  75. * @hal_soc: HAL SoC context
  76. *
  77. * Return: true if halt done
  78. */
  79. static bool hal_tx_ppe2tcl_ring_halt_done_9224(hal_soc_handle_t hal_soc)
  80. {
  81. uint32_t cmn_reg_addr;
  82. uint32_t regval;
  83. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  84. cmn_reg_addr =
  85. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(MAC_TCL_REG_REG_BASE);
  86. regval = HAL_REG_READ(soc, cmn_reg_addr);
  87. regval &= (1 << HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_PPE2TCL1_RNG_HALT_STAT_SHFT);
  88. return(!!regval);
  89. }
  90. /**
  91. * hal_tx_set_dscp_tid_map_9224() - Configure default DSCP to TID map table
  92. * @hal_soc: HAL SoC context
  93. * @map: DSCP-TID mapping table
  94. * @id: mapping table ID - 0-31
  95. *
  96. * DSCP are mapped to 8 TID values using TID values programmed
  97. * in any of the 32 DSCP_TID_MAPS (id = 0-31).
  98. *
  99. * Return: none
  100. */
  101. static void hal_tx_set_dscp_tid_map_9224(struct hal_soc *hal_soc, uint8_t *map,
  102. uint8_t id)
  103. {
  104. int i;
  105. uint32_t addr, cmn_reg_addr;
  106. uint32_t value = 0, regval;
  107. uint8_t val[DSCP_TID_TABLE_SIZE], cnt = 0;
  108. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  109. if (id >= HAL_MAX_HW_DSCP_TID_V2_MAPS)
  110. return;
  111. cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
  112. MAC_TCL_REG_REG_BASE);
  113. addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
  114. MAC_TCL_REG_REG_BASE,
  115. id * NUM_WORDS_PER_DSCP_TID_TABLE);
  116. /* Enable read/write access */
  117. regval = HAL_REG_READ(soc, cmn_reg_addr);
  118. regval |=
  119. (1 <<
  120. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
  121. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  122. /* Write 8 (24 bits) DSCP-TID mappings in each iteration */
  123. for (i = 0; i < 64; i += 8) {
  124. value = (map[i] |
  125. (map[i + 1] << 0x3) |
  126. (map[i + 2] << 0x6) |
  127. (map[i + 3] << 0x9) |
  128. (map[i + 4] << 0xc) |
  129. (map[i + 5] << 0xf) |
  130. (map[i + 6] << 0x12) |
  131. (map[i + 7] << 0x15));
  132. qdf_mem_copy(&val[cnt], (void *)&value, 3);
  133. cnt += 3;
  134. }
  135. for (i = 0; i < DSCP_TID_TABLE_SIZE; i += 4) {
  136. regval = *(uint32_t *)(val + i);
  137. HAL_REG_WRITE(soc, addr,
  138. (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  139. addr += 4;
  140. }
  141. /* Diasble read/write access */
  142. regval = HAL_REG_READ(soc, cmn_reg_addr);
  143. regval &=
  144. ~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
  145. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  146. }
  147. /**
  148. * hal_tx_update_dscp_tid_9224() - Update the dscp tid map table as updated
  149. * by the user
  150. * @soc: HAL SoC context
  151. * @tid: TID
  152. * @id: MAP ID
  153. * @dscp: DSCP
  154. *
  155. * Return: void
  156. */
  157. static void hal_tx_update_dscp_tid_9224(struct hal_soc *soc, uint8_t tid,
  158. uint8_t id, uint8_t dscp)
  159. {
  160. uint32_t addr, addr1, cmn_reg_addr;
  161. uint32_t start_value = 0, end_value = 0;
  162. uint32_t regval;
  163. uint8_t end_bits = 0;
  164. uint8_t start_bits = 0;
  165. uint32_t start_index, end_index;
  166. cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
  167. MAC_TCL_REG_REG_BASE);
  168. addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
  169. MAC_TCL_REG_REG_BASE,
  170. id * NUM_WORDS_PER_DSCP_TID_TABLE);
  171. start_index = dscp * HAL_TX_BITS_PER_TID;
  172. end_index = (start_index + (HAL_TX_BITS_PER_TID - 1))
  173. % HAL_TX_NUM_DSCP_REGISTER_SIZE;
  174. start_index = start_index % HAL_TX_NUM_DSCP_REGISTER_SIZE;
  175. addr += (4 * ((dscp * HAL_TX_BITS_PER_TID) /
  176. HAL_TX_NUM_DSCP_REGISTER_SIZE));
  177. if (end_index < start_index) {
  178. end_bits = end_index + 1;
  179. start_bits = HAL_TX_BITS_PER_TID - end_bits;
  180. start_value = tid << start_index;
  181. end_value = tid >> start_bits;
  182. addr1 = addr + 4;
  183. } else {
  184. start_bits = HAL_TX_BITS_PER_TID - end_bits;
  185. start_value = tid << start_index;
  186. addr1 = 0;
  187. }
  188. /* Enable read/write access */
  189. regval = HAL_REG_READ(soc, cmn_reg_addr);
  190. regval |=
  191. (1 << HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
  192. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  193. regval = HAL_REG_READ(soc, addr);
  194. if (end_index < start_index)
  195. regval &= (~0) >> start_bits;
  196. else
  197. regval &= ~(7 << start_index);
  198. regval |= start_value;
  199. HAL_REG_WRITE(soc, addr, (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  200. if (addr1) {
  201. regval = HAL_REG_READ(soc, addr1);
  202. regval &= (~0) << end_bits;
  203. regval |= end_value;
  204. HAL_REG_WRITE(soc, addr1, (regval &
  205. HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  206. }
  207. /* Diasble read/write access */
  208. regval = HAL_REG_READ(soc, cmn_reg_addr);
  209. regval &=
  210. ~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
  211. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  212. }
  213. #ifdef DP_TX_IMPLICIT_RBM_MAPPING
  214. #define RBM_MAPPING_BMSK HWIO_TCL_R0_RBM_MAPPING0_SW2TCL1_RING_BMSK
  215. #define RBM_MAPPING_SHFT HWIO_TCL_R0_RBM_MAPPING0_SW2TCL2_RING_SHFT
  216. #define RBM_PPE2TCL_OFFSET \
  217. (HWIO_TCL_R0_RBM_MAPPING0_PPE2TCL1_RING_SHFT >> 2)
  218. #define RBM_TCL_CMD_CREDIT_OFFSET \
  219. (HWIO_TCL_R0_RBM_MAPPING0_SW2TCL_CREDIT_RING_SHFT >> 2)
  220. /**
  221. * hal_tx_config_rbm_mapping_be_9224() - Update return buffer manager ring id
  222. * @hal_soc_hdl: HAL SoC context
  223. * @hal_ring_hdl: Source ring pointer
  224. * @rbm_id: return buffer manager ring id
  225. *
  226. * Return: void
  227. */
  228. static inline void
  229. hal_tx_config_rbm_mapping_be_9224(hal_soc_handle_t hal_soc_hdl,
  230. hal_ring_handle_t hal_ring_hdl,
  231. uint8_t rbm_id)
  232. {
  233. struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
  234. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  235. uint32_t reg_addr = 0;
  236. uint32_t reg_val = 0;
  237. uint32_t val = 0;
  238. uint8_t ring_num;
  239. enum hal_ring_type ring_type;
  240. ring_type = srng->ring_type;
  241. ring_num = hal_soc->hw_srng_table[ring_type].start_ring_id;
  242. ring_num = srng->ring_id - ring_num;
  243. reg_addr = HWIO_TCL_R0_RBM_MAPPING0_ADDR(MAC_TCL_REG_REG_BASE);
  244. if (ring_type == PPE2TCL)
  245. ring_num = ring_num + RBM_PPE2TCL_OFFSET;
  246. else if (ring_type == TCL_CMD_CREDIT)
  247. ring_num = ring_num + RBM_TCL_CMD_CREDIT_OFFSET;
  248. /* get current value stored in register address */
  249. val = HAL_REG_READ(hal_soc, reg_addr);
  250. /* mask out other stored value */
  251. val &= (~(RBM_MAPPING_BMSK << (RBM_MAPPING_SHFT * ring_num)));
  252. reg_val = val | ((RBM_MAPPING_BMSK & rbm_id) <<
  253. (RBM_MAPPING_SHFT * ring_num));
  254. /* write rbm mapped value to register address */
  255. HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
  256. }
  257. #else
  258. static inline void
  259. hal_tx_config_rbm_mapping_be_9224(hal_soc_handle_t hal_soc_hdl,
  260. hal_ring_handle_t hal_ring_hdl,
  261. uint8_t rbm_id)
  262. {
  263. }
  264. #endif
  265. /**
  266. * hal_tx_init_cmd_credit_ring_9224() - Initialize command/credit SRNG
  267. * @hal_soc_hdl: Handle to HAL SoC structure
  268. * @hal_ring_hdl: Handle to HAL SRNG structure
  269. *
  270. * Return: none
  271. */
  272. static inline void
  273. hal_tx_init_cmd_credit_ring_9224(hal_soc_handle_t hal_soc_hdl,
  274. hal_ring_handle_t hal_ring_hdl)
  275. {
  276. }
  277. /* TX MONITOR */
  278. #if defined(QCA_MONITOR_2_0_SUPPORT) && defined(TX_MONITOR_WORD_MASK)
  279. #define TX_FES_SETUP_MASK 0x3
  280. typedef struct tx_fes_setup_compact_9224 hal_tx_fes_setup_t;
  281. struct tx_fes_setup_compact_9224 {
  282. /* DWORD - 0 */
  283. uint32_t schedule_id;
  284. /* DWORD - 1 */
  285. uint32_t reserved_1a : 7, // [0: 6]
  286. transmit_start_reason : 3, // [7: 9]
  287. reserved_1b : 13, // [10: 22]
  288. number_of_users : 6, // [28: 23]
  289. mu_type : 1, // [29]
  290. reserved_1c : 2; // [30]
  291. /* DWORD - 2 */
  292. uint32_t reserved_2a : 4, // [0: 3]
  293. ndp_frame : 2, // [4: 5]
  294. txbf : 1, // [6]
  295. reserved_2b : 3, // [7: 9]
  296. static_bandwidth : 3, // [12: 10]
  297. reserved_2c : 1, // [13]
  298. transmission_contains_mu_rts : 1, // [14]
  299. reserved_2d : 17; // [15: 31]
  300. /* DWORD - 3 */
  301. uint32_t reserved_3a : 15, // [0: 14]
  302. mu_ndp : 1, // [15]
  303. reserved_3b : 11, // [16: 26]
  304. ndpa : 1, // [27]
  305. reserved_3c : 4; // [28: 31]
  306. };
  307. #define TX_PEER_ENTRY_MASK 0x103
  308. typedef struct tx_peer_entry_compact_9224 hal_tx_peer_entry_t;
  309. struct tx_peer_entry_compact_9224 {
  310. /* DWORD - 0 */
  311. uint32_t mac_addr_a_31_0 : 32;
  312. /* DWORD - 1 */
  313. uint32_t mac_addr_a_47_32 : 16,
  314. mac_addr_b_15_0 : 16;
  315. /* DWORD - 2 */
  316. uint32_t mac_addr_b_47_16 : 32;
  317. /* DWORD - 3 */
  318. uint32_t reserved_3 : 32;
  319. /* DWORD - 16 */
  320. uint32_t reserved_16 : 32;
  321. /* DWORD - 17 */
  322. uint32_t multi_link_addr_crypto_enable : 1,
  323. reserved_17_a : 15,
  324. sw_peer_id : 16;
  325. };
  326. #define TX_QUEUE_EXT_MASK 0x1
  327. typedef struct tx_queue_ext_compact_9224 hal_tx_queue_ext_t;
  328. struct tx_queue_ext_compact_9224 {
  329. /* DWORD - 0 */
  330. uint32_t frame_ctl : 16,
  331. qos_ctl : 16;
  332. /* DWORD - 1 */
  333. uint32_t ampdu_flag : 1,
  334. reserved_1 : 31;
  335. };
  336. #define TX_MSDU_START_MASK 0x1
  337. typedef struct tx_msdu_start_compact_9224 hal_tx_msdu_start_t;
  338. struct tx_msdu_start_compact_9224 {
  339. /* DWORD - 0 */
  340. uint32_t reserved_0 : 32;
  341. /* DWORD - 1 */
  342. uint32_t reserved_1 : 32;
  343. };
  344. #define TX_MPDU_START_MASK 0x3
  345. typedef struct tx_mpdu_start_compact_9224 hal_tx_mpdu_start_t;
  346. struct tx_mpdu_start_compact_9224 {
  347. /* DWORD - 0 */
  348. uint32_t mpdu_length : 14,
  349. frame_not_from_tqm : 1,
  350. vht_control_present : 1,
  351. mpdu_header_length : 8,
  352. retry_count : 7,
  353. wds : 1;
  354. /* DWORD - 1 */
  355. uint32_t pn_31_0 : 32;
  356. /* DWORD - 2 */
  357. uint32_t pn_47_32 : 16,
  358. mpdu_sequence_number : 12,
  359. raw_already_encrypted : 1,
  360. frame_type : 2,
  361. txdma_dropped_mpdu_warning : 1;
  362. /* DWORD - 3 */
  363. uint32_t reserved_3 : 32;
  364. };
  365. typedef struct rxpcu_user_setup_compact_9224 hal_rxpcu_user_setup_t;
  366. struct rxpcu_user_setup_compact_9224 {
  367. };
  368. #define TX_FES_STATUS_END_MASK 0x7
  369. typedef struct tx_fes_status_end_compact_9224 hal_tx_fes_status_end_t;
  370. struct tx_fes_status_end_compact_9224 {
  371. /* DWORD - 0 */
  372. uint32_t reserved_0 : 32;
  373. /* DWORD - 1 */
  374. struct {
  375. uint16_t phytx_abort_reason : 8,
  376. user_number : 6,
  377. reserved_1a : 2;
  378. } phytx_abort_request_info_details;
  379. uint16_t reserved_1b : 12,
  380. phytx_abort_request_info_valid : 1,
  381. reserved_1c : 3;
  382. /* DWORD - 2 */
  383. uint32_t start_of_frame_timestamp_15_0 : 16,
  384. start_of_frame_timestamp_31_16 : 16;
  385. /* DWORD - 3 */
  386. uint32_t end_of_frame_timestamp_15_0 : 16,
  387. end_of_frame_timestamp_31_16 : 16;
  388. /* DWORD - 4 */
  389. uint32_t terminate_ranging_sequence : 1,
  390. reserved_4a : 7,
  391. timing_status : 2,
  392. response_type : 5,
  393. r2r_end_status_to_follow : 1,
  394. transmit_delay : 16;
  395. /* DWORD - 5 */
  396. uint32_t reserved_5 : 32;
  397. };
  398. #define RESPONSE_END_STATUS_MASK 0xD
  399. typedef struct response_end_status_compact_9224 hal_response_end_status_t;
  400. struct response_end_status_compact_9224 {
  401. /* DWORD - 0 */
  402. uint32_t coex_bt_tx_while_wlan_tx : 1,
  403. coex_wan_tx_while_wlan_tx : 1,
  404. coex_wlan_tx_while_wlan_tx : 1,
  405. global_data_underflow_warning : 1,
  406. response_transmit_status : 4,
  407. phytx_pkt_end_info_valid : 1,
  408. phytx_abort_request_info_valid : 1,
  409. generated_response : 3,
  410. mba_user_count : 7,
  411. mba_fake_bitmap_count : 7,
  412. coex_based_tx_bw : 3,
  413. trig_response_related : 1,
  414. dpdtrain_done : 1;
  415. /* DWORD - 1 */
  416. uint32_t reserved_1 : 32;
  417. /* DWORD - 4 */
  418. uint32_t reserved_4 : 32;
  419. /* DWORD - 5 */
  420. uint32_t start_of_frame_timestamp_15_0 : 16,
  421. start_of_frame_timestamp_31_16 : 16;
  422. /* DWORD - 6 */
  423. uint32_t end_of_frame_timestamp_15_0 : 16,
  424. end_of_frame_timestamp_31_16 : 16;
  425. /* DWORD - 7 */
  426. uint32_t reserved_7 : 32;
  427. };
  428. #define TX_FES_STATUS_PROT_MASK 0x2
  429. typedef struct tx_fes_status_prot_compact_9224 hal_tx_fes_status_prot_t;
  430. struct tx_fes_status_prot_compact_9224 {
  431. /* DWORD - 2 */
  432. uint32_t start_of_frame_timestamp_15_0 : 16,
  433. start_of_frame_timestamp_31_16 : 16;
  434. /* DWROD - 3 */
  435. uint32_t end_of_frame_timestamp_15_0 : 16,
  436. end_of_frame_timestamp_31_16 : 16;
  437. };
  438. #define PCU_PPDU_SETUP_INIT_MASK 0x1E800000
  439. typedef struct pcu_ppdu_setup_init_compact_9224 hal_pcu_ppdu_setup_t;
  440. struct pcu_ppdu_setup_init_compact_9224 {
  441. /* DWORD - 46 */
  442. uint32_t reserved_46 : 32;
  443. /* DWORD - 47 */
  444. uint32_t r2r_group_id : 6,
  445. r2r_response_frame_type : 4,
  446. r2r_sta_partial_aid : 11,
  447. use_address_fields_for_protection : 1,
  448. r2r_set_required_response_time : 1,
  449. reserved_47 : 9;
  450. /* DWORD - 50 */
  451. uint32_t reserved_50 : 32;
  452. /* DWORD - 51 */
  453. uint32_t protection_frame_ad1_31_0 : 32;
  454. /* DWORD - 52 */
  455. uint32_t protection_frame_ad1_47_32 : 16,
  456. protection_frame_ad2_15_0 : 16;
  457. /* DWORD - 53 */
  458. uint32_t protection_frame_ad2_47_16 : 32;
  459. /* DWORD - 54 */
  460. uint32_t reserved_54 : 32;
  461. /* DWORD - 55 */
  462. uint32_t protection_frame_ad3_31_0 : 32;
  463. /* DWORD - 56 */
  464. uint32_t protection_frame_ad3_47_32 : 16,
  465. protection_frame_ad4_15_0 : 16;
  466. /* DWORD - 57 */
  467. uint32_t protection_frame_ad4_47_16 : 32;
  468. };
  469. /**
  470. * hal_txmon_set_word_mask_qcn9224() - api to set word mask for tx monitor
  471. * @wmask: pointer to hal_txmon_word_mask_config_t
  472. *
  473. * Return: void
  474. */
  475. static inline
  476. void hal_txmon_set_word_mask_qcn9224(void *wmask)
  477. {
  478. hal_txmon_word_mask_config_t *word_mask = NULL;
  479. word_mask = (hal_txmon_word_mask_config_t *)wmask;
  480. word_mask->compaction_enable = 1;
  481. word_mask->tx_fes_setup = TX_FES_SETUP_MASK;
  482. word_mask->tx_peer_entry = TX_PEER_ENTRY_MASK;
  483. word_mask->tx_queue_ext = TX_QUEUE_EXT_MASK;
  484. word_mask->tx_msdu_start = TX_MSDU_START_MASK;
  485. word_mask->pcu_ppdu_setup_init = PCU_PPDU_SETUP_INIT_MASK;
  486. word_mask->tx_mpdu_start = TX_MPDU_START_MASK;
  487. word_mask->rxpcu_user_setup = 0xFF;
  488. word_mask->tx_fes_status_end = TX_FES_STATUS_END_MASK;
  489. word_mask->response_end_status = RESPONSE_END_STATUS_MASK;
  490. word_mask->tx_fes_status_prot = TX_FES_STATUS_PROT_MASK;
  491. }
  492. #endif
  493. /**
  494. * hal_tx_set_ppe_cmn_config_9224() - Set the PPE common config register
  495. * @hal_soc_hdl: HAL SoC handle
  496. * @cmn_cfg: Common PPE config
  497. *
  498. * Based on the PPE2TCL descriptor below errors, if the below register
  499. * values are set then the packets are forward to Tx rule handler if 1'0b
  500. * or to TCL exit base if 1'1b.
  501. *
  502. * Return: void
  503. */
  504. static inline
  505. void hal_tx_set_ppe_cmn_config_9224(hal_soc_handle_t hal_soc_hdl,
  506. union hal_tx_cmn_config_ppe *cmn_cfg)
  507. {
  508. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  509. union hal_tx_cmn_config_ppe *cfg =
  510. (union hal_tx_cmn_config_ppe *)cmn_cfg;
  511. uint32_t reg_addr, reg_val = 0;
  512. reg_addr = HWIO_TCL_R0_CMN_CONFIG_PPE_ADDR(MAC_TCL_REG_REG_BASE);
  513. reg_val = HAL_REG_READ(soc, reg_addr);
  514. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_BMSK;
  515. reg_val |=
  516. (cfg->drop_prec_err &
  517. HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_BMSK) <<
  518. HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_SHFT;
  519. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_BMSK;
  520. reg_val |=
  521. (cfg->fake_mac_hdr &
  522. HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_BMSK) <<
  523. HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_SHFT;
  524. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_BMSK;
  525. reg_val |=
  526. (cfg->cpu_code_inv &
  527. HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_BMSK) <<
  528. HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_SHFT;
  529. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_BMSK;
  530. reg_val |=
  531. (cfg->l3_l4_err &
  532. HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_BMSK) <<
  533. HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_SHFT;
  534. HAL_REG_WRITE(soc, reg_addr, reg_val);
  535. }
  536. /**
  537. * hal_tx_set_ppe_vp_entry_9224() - Set the PPE VP entry
  538. * @hal_soc_hdl: HAL SoC handle
  539. * @cfg: PPE VP config
  540. * @ppe_vp_idx : PPE VP index to the table
  541. *
  542. * Return: void
  543. */
  544. static inline
  545. void hal_tx_set_ppe_vp_entry_9224(hal_soc_handle_t hal_soc_hdl,
  546. union hal_tx_ppe_vp_config *cfg,
  547. int ppe_vp_idx)
  548. {
  549. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  550. uint32_t reg_addr;
  551. reg_addr = HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  552. ppe_vp_idx);
  553. HAL_REG_WRITE(soc, reg_addr, cfg->val);
  554. }
  555. /**
  556. * hal_ppeds_cfg_ast_override_map_reg_9224() - Set the PPE index mapping table
  557. * @hal_soc_hdl: HAL SoC context
  558. * @idx: index into the table
  559. * @idx_map: HAL PPE INDESX MAPPING config
  560. *
  561. * Return: void
  562. */
  563. static inline void
  564. hal_ppeds_cfg_ast_override_map_reg_9224(hal_soc_handle_t hal_soc_hdl,
  565. uint8_t idx,
  566. union hal_tx_ppe_idx_map_config *idx_map)
  567. {
  568. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  569. uint32_t reg_addr;
  570. reg_addr =
  571. HWIO_TCL_R0_PPE_INDEX_MAPPING_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  572. idx);
  573. HAL_REG_WRITE(soc, reg_addr, idx_map->val);
  574. }
  575. /**
  576. * hal_tx_set_ppe_pri2tid_map_9224() - Set PPE PRI to TID map
  577. * @hal_soc_hdl: HAL SoC handle
  578. * @val : PRI to TID value
  579. * @map_no: Map number
  580. *
  581. * Return: void
  582. */
  583. static inline
  584. void hal_tx_set_ppe_pri2tid_map_9224(hal_soc_handle_t hal_soc_hdl,
  585. uint32_t val, uint8_t map_no)
  586. {
  587. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  588. uint32_t reg_addr, reg_val = 0;
  589. if (map_no == 0)
  590. reg_addr =
  591. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_ADDR(MAC_TCL_REG_REG_BASE);
  592. else
  593. reg_addr =
  594. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_ADDR(MAC_TCL_REG_REG_BASE);
  595. reg_val |= val;
  596. HAL_REG_WRITE(soc, reg_addr, reg_val);
  597. }
  598. /**
  599. * hal_tx_enable_pri2tid_map_9224() - Enable PRI to TID map
  600. * @hal_soc_hdl: HAL SoC handle
  601. * @val: PRI to TID value
  602. * @ppe_vp_idx: Map number
  603. *
  604. * Return: void
  605. */
  606. static inline
  607. void hal_tx_enable_pri2tid_map_9224(hal_soc_handle_t hal_soc_hdl,
  608. bool val, uint8_t ppe_vp_idx)
  609. {
  610. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  611. uint32_t reg_addr, reg_val = 0;
  612. reg_addr = HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  613. ppe_vp_idx);
  614. /*
  615. * Drop precedence is enabled by default.
  616. */
  617. reg_val = HAL_REG_READ(soc, reg_addr);
  618. reg_val &=
  619. ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK;
  620. reg_val |=
  621. (val &
  622. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK) <<
  623. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_SHFT;
  624. HAL_REG_WRITE(soc, reg_addr, reg_val);
  625. }
  626. /**
  627. * hal_tx_update_ppe_pri2tid_9224() - Update PPE PRI to TID
  628. * @hal_soc_hdl: HAL SoC handle
  629. * @pri: INT_PRI
  630. * @tid: Wi-Fi TID
  631. *
  632. * Return: void
  633. */
  634. static inline
  635. void hal_tx_update_ppe_pri2tid_9224(hal_soc_handle_t hal_soc_hdl,
  636. uint8_t pri, uint8_t tid)
  637. {
  638. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  639. uint32_t reg_addr, reg_val = 0, mask, shift;
  640. /*
  641. * INT_PRI 0..9 is in MAP0 register and INT_PRI 10..15
  642. * is in MAP1 register.
  643. */
  644. switch (pri) {
  645. case 0 ... 9:
  646. reg_addr =
  647. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_ADDR(MAC_TCL_REG_REG_BASE);
  648. mask =
  649. (HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_INT_PRI_0_BMSK << (0x3 * pri));
  650. shift = HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_INT_PRI_0_SHFT + (pri * 0x3);
  651. break;
  652. case 10 ... 15:
  653. pri = pri - 10;
  654. reg_addr =
  655. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_ADDR(MAC_TCL_REG_REG_BASE);
  656. mask =
  657. (HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_INT_PRI_10_BMSK << (0x3 * pri));
  658. shift =
  659. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_INT_PRI_10_SHFT + (pri * 0x3);
  660. break;
  661. default:
  662. return;
  663. }
  664. reg_val = HAL_REG_READ(soc, reg_addr);
  665. reg_val &= ~mask;
  666. reg_val |= (pri << shift) & mask;
  667. HAL_REG_WRITE(soc, reg_addr, reg_val);
  668. }
  669. #endif /* _HAL_9224_TX_H_ */