hal_9224_tx.h 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520
  1. /*
  2. * Copyright (c) 2021 The Linux Foundation. All rights reserved.
  3. * Copyright (c) 2021-2022 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_set_dscp_tid_map_9224() - Configure default DSCP to TID map table
  34. * @soc: HAL SoC context
  35. * @map: DSCP-TID mapping table
  36. * @id: mapping table ID - 0-31
  37. *
  38. * DSCP are mapped to 8 TID values using TID values programmed
  39. * in any of the 32 DSCP_TID_MAPS (id = 0-31).
  40. *
  41. * Return: none
  42. */
  43. static void hal_tx_set_dscp_tid_map_9224(struct hal_soc *hal_soc, uint8_t *map,
  44. uint8_t id)
  45. {
  46. int i;
  47. uint32_t addr, cmn_reg_addr;
  48. uint32_t value = 0, regval;
  49. uint8_t val[DSCP_TID_TABLE_SIZE], cnt = 0;
  50. struct hal_soc *soc = (struct hal_soc *)hal_soc;
  51. if (id >= HAL_MAX_HW_DSCP_TID_V2_MAPS)
  52. return;
  53. cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
  54. MAC_TCL_REG_REG_BASE);
  55. addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
  56. MAC_TCL_REG_REG_BASE,
  57. id * NUM_WORDS_PER_DSCP_TID_TABLE);
  58. /* Enable read/write access */
  59. regval = HAL_REG_READ(soc, cmn_reg_addr);
  60. regval |=
  61. (1 <<
  62. HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
  63. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  64. /* Write 8 (24 bits) DSCP-TID mappings in each interation */
  65. for (i = 0; i < 64; i += 8) {
  66. value = (map[i] |
  67. (map[i + 1] << 0x3) |
  68. (map[i + 2] << 0x6) |
  69. (map[i + 3] << 0x9) |
  70. (map[i + 4] << 0xc) |
  71. (map[i + 5] << 0xf) |
  72. (map[i + 6] << 0x12) |
  73. (map[i + 7] << 0x15));
  74. qdf_mem_copy(&val[cnt], (void *)&value, 3);
  75. cnt += 3;
  76. }
  77. for (i = 0; i < DSCP_TID_TABLE_SIZE; i += 4) {
  78. regval = *(uint32_t *)(val + i);
  79. HAL_REG_WRITE(soc, addr,
  80. (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  81. addr += 4;
  82. }
  83. /* Diasble read/write access */
  84. regval = HAL_REG_READ(soc, cmn_reg_addr);
  85. regval &=
  86. ~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
  87. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  88. }
  89. /**
  90. * hal_tx_update_dscp_tid_9224() - Update the dscp tid map table as updated
  91. * by the user
  92. * @soc: HAL SoC context
  93. * @map: DSCP-TID mapping table
  94. * @id : MAP ID
  95. * @dscp: DSCP_TID map index
  96. *
  97. * Return: void
  98. */
  99. static void hal_tx_update_dscp_tid_9224(struct hal_soc *soc, uint8_t tid,
  100. uint8_t id, uint8_t dscp)
  101. {
  102. uint32_t addr, addr1, cmn_reg_addr;
  103. uint32_t start_value = 0, end_value = 0;
  104. uint32_t regval;
  105. uint8_t end_bits = 0;
  106. uint8_t start_bits = 0;
  107. uint32_t start_index, end_index;
  108. cmn_reg_addr = HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_ADDR(
  109. MAC_TCL_REG_REG_BASE);
  110. addr = HWIO_TCL_R0_DSCP_TID_MAP_n_ADDR(
  111. MAC_TCL_REG_REG_BASE,
  112. id * NUM_WORDS_PER_DSCP_TID_TABLE);
  113. start_index = dscp * HAL_TX_BITS_PER_TID;
  114. end_index = (start_index + (HAL_TX_BITS_PER_TID - 1))
  115. % HAL_TX_NUM_DSCP_REGISTER_SIZE;
  116. start_index = start_index % HAL_TX_NUM_DSCP_REGISTER_SIZE;
  117. addr += (4 * ((dscp * HAL_TX_BITS_PER_TID) /
  118. HAL_TX_NUM_DSCP_REGISTER_SIZE));
  119. if (end_index < start_index) {
  120. end_bits = end_index + 1;
  121. start_bits = HAL_TX_BITS_PER_TID - end_bits;
  122. start_value = tid << start_index;
  123. end_value = tid >> start_bits;
  124. addr1 = addr + 4;
  125. } else {
  126. start_bits = HAL_TX_BITS_PER_TID - end_bits;
  127. start_value = tid << start_index;
  128. addr1 = 0;
  129. }
  130. /* Enable read/write access */
  131. regval = HAL_REG_READ(soc, cmn_reg_addr);
  132. regval |=
  133. (1 << HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_SHFT);
  134. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  135. regval = HAL_REG_READ(soc, addr);
  136. if (end_index < start_index)
  137. regval &= (~0) >> start_bits;
  138. else
  139. regval &= ~(7 << start_index);
  140. regval |= start_value;
  141. HAL_REG_WRITE(soc, addr, (regval & HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  142. if (addr1) {
  143. regval = HAL_REG_READ(soc, addr1);
  144. regval &= (~0) << end_bits;
  145. regval |= end_value;
  146. HAL_REG_WRITE(soc, addr1, (regval &
  147. HWIO_TCL_R0_DSCP_TID_MAP_n_RMSK));
  148. }
  149. /* Diasble read/write access */
  150. regval = HAL_REG_READ(soc, cmn_reg_addr);
  151. regval &=
  152. ~(HWIO_TCL_R0_CONS_RING_CMN_CTRL_REG_DSCP_TID_MAP_PROGRAM_EN_BMSK);
  153. HAL_REG_WRITE(soc, cmn_reg_addr, regval);
  154. }
  155. #ifdef DP_TX_IMPLICIT_RBM_MAPPING
  156. #define RBM_MAPPING_BMSK HWIO_TCL_R0_RBM_MAPPING0_SW2TCL1_RING_BMSK
  157. #define RBM_MAPPING_SHFT HWIO_TCL_R0_RBM_MAPPING0_SW2TCL2_RING_SHFT
  158. #define RBM_PPE2TCL_OFFSET \
  159. (HWIO_TCL_R0_RBM_MAPPING0_PPE2TCL1_RING_SHFT >> 2)
  160. #define RBM_TCL_CMD_CREDIT_OFFSET \
  161. (HWIO_TCL_R0_RBM_MAPPING0_SW2TCL_CREDIT_RING_SHFT >> 2)
  162. /**
  163. * hal_tx_config_rbm_mapping_be() - Update return buffer manager ring id
  164. * @hal_soc: HAL SoC context
  165. * @hal_ring_hdl: Source ring pointer
  166. * @rbm_id: return buffer manager ring id
  167. *
  168. * Return: void
  169. */
  170. static inline void
  171. hal_tx_config_rbm_mapping_be_9224(hal_soc_handle_t hal_soc_hdl,
  172. hal_ring_handle_t hal_ring_hdl,
  173. uint8_t rbm_id)
  174. {
  175. struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
  176. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  177. uint32_t reg_addr = 0;
  178. uint32_t reg_val = 0;
  179. uint32_t val = 0;
  180. uint8_t ring_num;
  181. enum hal_ring_type ring_type;
  182. ring_type = srng->ring_type;
  183. ring_num = hal_soc->hw_srng_table[ring_type].start_ring_id;
  184. ring_num = srng->ring_id - ring_num;
  185. reg_addr = HWIO_TCL_R0_RBM_MAPPING0_ADDR(MAC_TCL_REG_REG_BASE);
  186. if (ring_type == PPE2TCL)
  187. ring_num = ring_num + RBM_PPE2TCL_OFFSET;
  188. else if (ring_type == TCL_CMD_CREDIT)
  189. ring_num = ring_num + RBM_TCL_CMD_CREDIT_OFFSET;
  190. /* get current value stored in register address */
  191. val = HAL_REG_READ(hal_soc, reg_addr);
  192. /* mask out other stored value */
  193. val &= (~(RBM_MAPPING_BMSK << (RBM_MAPPING_SHFT * ring_num)));
  194. reg_val = val | ((RBM_MAPPING_BMSK & rbm_id) <<
  195. (RBM_MAPPING_SHFT * ring_num));
  196. /* write rbm mapped value to register address */
  197. HAL_REG_WRITE(hal_soc, reg_addr, reg_val);
  198. }
  199. #else
  200. static inline void
  201. hal_tx_config_rbm_mapping_be_9224(hal_soc_handle_t hal_soc_hdl,
  202. hal_ring_handle_t hal_ring_hdl,
  203. uint8_t rbm_id)
  204. {
  205. }
  206. #endif
  207. /**
  208. * hal_tx_init_cmd_credit_ring_9224() - Initialize command/credit SRNG
  209. * @hal_soc_hdl: Handle to HAL SoC structure
  210. * @hal_srng: Handle to HAL SRNG structure
  211. *
  212. * Return: none
  213. */
  214. static inline void
  215. hal_tx_init_cmd_credit_ring_9224(hal_soc_handle_t hal_soc_hdl,
  216. hal_ring_handle_t hal_ring_hdl)
  217. {
  218. }
  219. /* TX MONITOR */
  220. #ifdef QCA_MONITOR_2_0_SUPPORT
  221. #if defined(TX_MONITOR_WORD_MASK)
  222. typedef struct tx_fes_setup_compact_9224 hal_tx_fes_setup_t;
  223. struct tx_fes_setup_compact_9224 {
  224. /* DWORD - 0 */
  225. uint32_t schedule_id;
  226. /* DWORD - 1 */
  227. uint32_t reserved_1a : 7, // [0: 6]
  228. transmit_start_reason : 3, // [7: 9]
  229. reserved_1b : 13, // [10: 22]
  230. number_of_users : 6, // [28: 23]
  231. MU_type : 1, // [29]
  232. reserved_1c : 2; // [30]
  233. /* DWORD - 2 */
  234. uint32_t reserved_2a : 4, // [0: 3]
  235. ndp_frame : 2, // [4: 5]
  236. txbf : 1, // [6]
  237. reserved_2b : 3, // [7: 9]
  238. static_bandwidth : 3, // [12: 10]
  239. reserved_2c : 1, // [13]
  240. transmission_contains_MU_RTS : 1, // [14]
  241. reserved_2d : 17; // [15: 31]
  242. /* DWORD - 3 */
  243. uint32_t reserved_3a : 15, // [0: 14]
  244. mu_ndp : 1, // [15]
  245. reserved_3b : 11, // [16: 26]
  246. ndpa : 1, // [27]
  247. reserved_3c : 4; // [28: 31]
  248. };
  249. #endif
  250. #endif /* QCA_MONITOR_2_0_SUPPORT */
  251. /**
  252. * hal_tx_set_ppe_cmn_config_9224() - Set the PPE common config register
  253. * @hal_soc_hdl: HAL SoC handle
  254. * @cmn_cfg: Common PPE config
  255. *
  256. * Based on the PPE2TCL descriptor below errors, if the below register
  257. * values are set then the packets are forward to Tx rule handler if 1'0b
  258. * or to TCL exit base if 1'1b.
  259. *
  260. * Return: void
  261. */
  262. static inline
  263. void hal_tx_set_ppe_cmn_config_9224(hal_soc_handle_t hal_soc_hdl,
  264. union hal_tx_cmn_config_ppe *cmn_cfg)
  265. {
  266. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  267. union hal_tx_cmn_config_ppe *cfg =
  268. (union hal_tx_cmn_config_ppe *)cmn_cfg;
  269. uint32_t reg_addr, reg_val = 0;
  270. reg_addr = HWIO_TCL_R0_CMN_CONFIG_PPE_ADDR(MAC_TCL_REG_REG_BASE);
  271. reg_val = HAL_REG_READ(soc, reg_addr);
  272. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_BMSK;
  273. reg_val |=
  274. (cfg->drop_prec_err &
  275. HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_BMSK) <<
  276. HWIO_TCL_R0_CMN_CONFIG_PPE_DROP_PREC_ERR_EXCEPTION_SHFT;
  277. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_BMSK;
  278. reg_val |=
  279. (cfg->fake_mac_hdr &
  280. HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_BMSK) <<
  281. HWIO_TCL_R0_CMN_CONFIG_PPE_FAKE_MAC_HDR_EXCEPTION_SHFT;
  282. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_BMSK;
  283. reg_val |=
  284. (cfg->cpu_code_inv &
  285. HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_BMSK) <<
  286. HWIO_TCL_R0_CMN_CONFIG_PPE_CPU_CODE_VALID_EXCEPTION_SHFT;
  287. reg_val &= ~HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_BMSK;
  288. reg_val |=
  289. (cfg->l3_l4_err &
  290. HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_BMSK) <<
  291. HWIO_TCL_R0_CMN_CONFIG_PPE_L3_L4_CSUM_ERR_EXCEPTION_SHFT;
  292. HAL_REG_WRITE(soc, reg_addr, reg_val);
  293. }
  294. /**
  295. * hal_tx_set_ppe_vp_entry_9224() - Set the PPE VP entry
  296. * @hal_soc_hdl: HAL SoC handle
  297. * @vp_cfg: PPE VP config
  298. * @ppe_vp_idx : PPE VP index to the table
  299. *
  300. * Return: void
  301. */
  302. static inline
  303. void hal_tx_set_ppe_vp_entry_9224(hal_soc_handle_t hal_soc_hdl,
  304. union hal_tx_ppe_vp_config *cfg,
  305. int ppe_vp_idx)
  306. {
  307. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  308. uint32_t reg_addr, reg_val = 0;
  309. reg_addr = HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  310. ppe_vp_idx);
  311. /*
  312. * Drop precedence is enabled by default.
  313. */
  314. reg_val = HAL_REG_READ(soc, reg_addr);
  315. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VP_NUM_BMSK;
  316. reg_val |= (cfg->vp_num &
  317. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VP_NUM_BMSK) <<
  318. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VP_NUM_SHFT;
  319. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_PMAC_ID_BMSK;
  320. reg_val |= (cfg->pmac_id &
  321. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_PMAC_ID_BMSK) <<
  322. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_PMAC_ID_SHFT;
  323. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_BANK_ID_BMSK;
  324. reg_val |= (cfg->bank_id &
  325. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_BANK_ID_BMSK) <<
  326. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_BANK_ID_SHFT;
  327. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VDEV_ID_BMSK;
  328. reg_val |= (cfg->vdev_id &
  329. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VDEV_ID_BMSK) <<
  330. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_VDEV_ID_SHFT;
  331. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_SEARCH_INDEX_REG_NUM_BMSK;
  332. reg_val |=
  333. (cfg->search_idx_reg_num &
  334. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_SEARCH_INDEX_REG_NUM_BMSK) <<
  335. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_SEARCH_INDEX_REG_NUM_SHFT;
  336. reg_val &=
  337. ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK;
  338. reg_val |=
  339. (cfg->use_ppe_int_pri &
  340. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK) <<
  341. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_SHFT;
  342. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_TO_FW_BMSK;
  343. reg_val |= (cfg->to_fw &
  344. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_TO_FW_BMSK) <<
  345. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_TO_FW_SHFT;
  346. reg_val &= ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_DROP_PREC_ENABLE_BMSK;
  347. reg_val |= (cfg->drop_prec_enable &
  348. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_DROP_PREC_ENABLE_BMSK) <<
  349. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_DROP_PREC_ENABLE_SHFT;
  350. HAL_REG_WRITE(soc, reg_addr, reg_val);
  351. }
  352. /**
  353. * hal_tx_set_ppe_pri2tid_map1_9224()
  354. * @hal_soc_hdl: HAL SoC handle
  355. * @val : PRI to TID value
  356. * @map_no: Map number
  357. *
  358. * Return: void
  359. */
  360. static inline
  361. void hal_tx_set_ppe_pri2tid_map_9224(hal_soc_handle_t hal_soc_hdl,
  362. uint32_t val, uint8_t map_no)
  363. {
  364. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  365. uint32_t reg_addr, reg_val = 0;
  366. if (map_no == 0)
  367. reg_addr =
  368. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_ADDR(MAC_TCL_REG_REG_BASE);
  369. else
  370. reg_addr =
  371. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_ADDR(MAC_TCL_REG_REG_BASE);
  372. reg_val |= val;
  373. HAL_REG_WRITE(soc, reg_addr, reg_val);
  374. }
  375. /**
  376. * hal_tx_set_ppe_pri2tid_map1_9224()
  377. * @hal_soc_hdl: HAL SoC handle
  378. * @val : PRI to TID value
  379. * @map_no: Map number
  380. *
  381. * Return: void
  382. */
  383. static inline
  384. void hal_tx_enable_pri2tid_map_9224(hal_soc_handle_t hal_soc_hdl,
  385. bool val, uint8_t ppe_vp_idx)
  386. {
  387. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  388. uint32_t reg_addr, reg_val = 0;
  389. reg_addr = HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_ADDR(MAC_TCL_REG_REG_BASE,
  390. ppe_vp_idx);
  391. /*
  392. * Drop precedence is enabled by default.
  393. */
  394. reg_val = HAL_REG_READ(soc, reg_addr);
  395. reg_val &=
  396. ~HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK;
  397. reg_val |=
  398. (val &
  399. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_BMSK) <<
  400. HWIO_TCL_R0_PPE_VP_CONFIG_TABLE_n_USE_PPE_INT_PRI_FOR_TID_SHFT;
  401. HAL_REG_WRITE(soc, reg_addr, reg_val);
  402. }
  403. /**
  404. * hal_tx_update_ppe_pri2tid_9224()
  405. * @hal_soc_hdl: HAL SoC handle
  406. * @pri: INT_PRI
  407. * @tid: Wi-Fi TID
  408. *
  409. * Return: void
  410. */
  411. static inline
  412. void hal_tx_update_ppe_pri2tid_9224(hal_soc_handle_t hal_soc_hdl,
  413. uint8_t pri, uint8_t tid)
  414. {
  415. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  416. uint32_t reg_addr, reg_val = 0, mask, shift;
  417. /*
  418. * INT_PRI 0..9 is in MAP0 register and INT_PRI 10..15
  419. * is in MAP1 register.
  420. */
  421. switch (pri) {
  422. case 0 ... 9:
  423. reg_addr =
  424. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_ADDR(MAC_TCL_REG_REG_BASE);
  425. mask =
  426. (HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_INT_PRI_0_BMSK << (0x3 * pri));
  427. shift = HWIO_TCL_R0_PPE_INT_PRI_TID_MAP0_INT_PRI_0_SHFT + (pri * 0x3);
  428. break;
  429. case 10 ... 15:
  430. pri = pri - 10;
  431. reg_addr =
  432. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_ADDR(MAC_TCL_REG_REG_BASE);
  433. mask =
  434. (HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_INT_PRI_10_BMSK << (0x3 * pri));
  435. shift =
  436. HWIO_TCL_R0_PPE_INT_PRI_TID_MAP1_INT_PRI_10_SHFT + (pri * 0x3);
  437. break;
  438. default:
  439. return;
  440. }
  441. reg_val = HAL_REG_READ(soc, reg_addr);
  442. reg_val &= ~mask;
  443. reg_val |= (pri << shift) & mask;
  444. HAL_REG_WRITE(soc, reg_addr, reg_val);
  445. }
  446. #endif /* _HAL_9224_TX_H_ */