hal_be_generic_api.c 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942
  1. /*
  2. * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved.
  3. *
  4. * Permission to use, copy, modify, and/or distribute this software for
  5. * any purpose with or without fee is hereby granted, provided that the
  6. * above copyright notice and this permission notice appear in all
  7. * copies.
  8. *
  9. * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
  10. * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
  11. * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
  12. * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
  13. * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
  14. * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
  15. * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  16. * PERFORMANCE OF THIS SOFTWARE.
  17. */
  18. #include <qdf_module.h>
  19. #include "hal_be_api.h"
  20. #include "hal_be_hw_headers.h"
  21. #include "hal_be_reo.h"
  22. #include "hal_tx.h" //HAL_SET_FLD
  23. #include "hal_be_rx.h" //HAL_RX_BUF_RBM_GET
  24. #if defined(QDF_BIG_ENDIAN_MACHINE)
  25. /**
  26. * hal_setup_reo_swap() - Set the swap flag for big endian machines
  27. * @soc: HAL soc handle
  28. *
  29. * Return: None
  30. */
  31. static void hal_setup_reo_swap(struct hal_soc *soc)
  32. {
  33. uint32_t reg_val;
  34. reg_val = HAL_REG_READ(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR(
  35. REO_REG_REG_BASE));
  36. reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, WRITE_STRUCT_SWAP, 1);
  37. reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, READ_STRUCT_SWAP, 1);
  38. HAL_REG_WRITE(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR(
  39. REO_REG_REG_BASE), reg_val);
  40. }
  41. #else
  42. static inline void hal_setup_reo_swap(struct hal_soc *soc)
  43. {
  44. }
  45. #endif
  46. /**
  47. * hal_tx_init_data_ring_be() - Initialize all the TCL Descriptors in SRNG
  48. * @hal_soc_hdl: Handle to HAL SoC structure
  49. * @hal_srng: Handle to HAL SRNG structure
  50. *
  51. * Return: none
  52. */
  53. static void
  54. hal_tx_init_data_ring_be(hal_soc_handle_t hal_soc_hdl,
  55. hal_ring_handle_t hal_ring_hdl)
  56. {
  57. }
  58. void hal_reo_setup_generic_be(struct hal_soc *soc, void *reoparams)
  59. {
  60. uint32_t reg_val;
  61. struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams;
  62. reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
  63. REO_REG_REG_BASE));
  64. hal_reo_config(soc, reg_val, reo_params);
  65. /* Other ring enable bits and REO_ENABLE will be set by FW */
  66. /* TODO: Setup destination ring mapping if enabled */
  67. /* TODO: Error destination ring setting is left to default.
  68. * Default setting is to send all errors to release ring.
  69. */
  70. /* Set the reo descriptor swap bits in case of BIG endian platform */
  71. hal_setup_reo_swap(soc);
  72. HAL_REG_WRITE(soc,
  73. HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(REO_REG_REG_BASE),
  74. HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000);
  75. HAL_REG_WRITE(soc,
  76. HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(REO_REG_REG_BASE),
  77. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  78. HAL_REG_WRITE(soc,
  79. HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(REO_REG_REG_BASE),
  80. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  81. HAL_REG_WRITE(soc,
  82. HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(REO_REG_REG_BASE),
  83. (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000));
  84. /*
  85. * When hash based routing is enabled, routing of the rx packet
  86. * is done based on the following value: 1 _ _ _ _ The last 4
  87. * bits are based on hash[3:0]. This means the possible values
  88. * are 0x10 to 0x1f. This value is used to look-up the
  89. * ring ID configured in Destination_Ring_Ctrl_IX_* register.
  90. * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3
  91. * registers need to be configured to set-up the 16 entries to
  92. * map the hash values to a ring number. There are 3 bits per
  93. * hash entry – which are mapped as follows:
  94. * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI),
  95. * 7: NOT_USED.
  96. */
  97. if (reo_params->rx_hash_enabled) {
  98. HAL_REG_WRITE(soc,
  99. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
  100. REO_REG_REG_BASE),
  101. reo_params->remap1);
  102. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
  103. HAL_REG_READ(soc,
  104. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
  105. REO_REG_REG_BASE)));
  106. HAL_REG_WRITE(soc,
  107. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
  108. REO_REG_REG_BASE),
  109. reo_params->remap2);
  110. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x",
  111. HAL_REG_READ(soc,
  112. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
  113. REO_REG_REG_BASE)));
  114. }
  115. /* TODO: Check if the following registers shoould be setup by host:
  116. * AGING_CONTROL
  117. * HIGH_MEMORY_THRESHOLD
  118. * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2]
  119. * GLOBAL_LINK_DESC_COUNT_CTRL
  120. */
  121. }
  122. void hal_set_link_desc_addr_be(void *desc, uint32_t cookie,
  123. qdf_dma_addr_t link_desc_paddr)
  124. {
  125. uint32_t *buf_addr = (uint32_t *)desc;
  126. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO, BUFFER_ADDR_31_0,
  127. link_desc_paddr & 0xffffffff);
  128. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO, BUFFER_ADDR_39_32,
  129. (uint64_t)link_desc_paddr >> 32);
  130. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO, RETURN_BUFFER_MANAGER,
  131. WBM_IDLE_DESC_LIST);
  132. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO, SW_BUFFER_COOKIE,
  133. cookie);
  134. }
  135. static uint32_t hal_get_reo_qdesc_size_be(uint32_t ba_window_size, int tid)
  136. {
  137. /* Return descriptor size corresponding to window size of 2 since
  138. * we set ba_window_size to 2 while setting up REO descriptors as
  139. * a WAR to get 2k jump exception aggregates are received without
  140. * a BA session.
  141. */
  142. if (ba_window_size <= 1) {
  143. if (tid != HAL_NON_QOS_TID)
  144. return sizeof(struct rx_reo_queue) +
  145. sizeof(struct rx_reo_queue_ext);
  146. else
  147. return sizeof(struct rx_reo_queue);
  148. }
  149. if (ba_window_size <= 105)
  150. return sizeof(struct rx_reo_queue) +
  151. sizeof(struct rx_reo_queue_ext);
  152. if (ba_window_size <= 210)
  153. return sizeof(struct rx_reo_queue) +
  154. (2 * sizeof(struct rx_reo_queue_ext));
  155. return sizeof(struct rx_reo_queue) +
  156. (3 * sizeof(struct rx_reo_queue_ext));
  157. }
  158. void *hal_rx_msdu_ext_desc_info_get_ptr_be(void *msdu_details_ptr)
  159. {
  160. return HAL_RX_MSDU_EXT_DESC_INFO_GET(msdu_details_ptr);
  161. }
  162. #ifdef QCA_WIFI_WCN7850
  163. static inline uint32_t
  164. hal_wbm2sw_release_source_get(void *hal_desc, enum hal_be_wbm_release_dir dir)
  165. {
  166. uint32_t buf_src;
  167. buf_src = HAL_WBM2SW_RELEASE_SRC_GET(hal_desc);
  168. switch (buf_src) {
  169. case HAL_BE_RX_WBM_ERR_SRC_RXDMA:
  170. return HAL_RX_WBM_ERR_SRC_RXDMA;
  171. case HAL_BE_RX_WBM_ERR_SRC_REO:
  172. return HAL_RX_WBM_ERR_SRC_REO;
  173. case HAL_BE_RX_WBM_ERR_SRC_FW_RX:
  174. if (dir != HAL_BE_WBM_RELEASE_DIR_RX)
  175. qdf_assert_always(0);
  176. return HAL_RX_WBM_ERR_SRC_FW;
  177. case HAL_BE_RX_WBM_ERR_SRC_SW_RX:
  178. if (dir != HAL_BE_WBM_RELEASE_DIR_RX)
  179. qdf_assert_always(0);
  180. return HAL_RX_WBM_ERR_SRC_SW;
  181. case HAL_BE_RX_WBM_ERR_SRC_TQM:
  182. return HAL_RX_WBM_ERR_SRC_TQM;
  183. case HAL_BE_RX_WBM_ERR_SRC_FW_TX:
  184. if (dir != HAL_BE_WBM_RELEASE_DIR_TX)
  185. qdf_assert_always(0);
  186. return HAL_RX_WBM_ERR_SRC_FW;
  187. case HAL_BE_RX_WBM_ERR_SRC_SW_TX:
  188. if (dir != HAL_BE_WBM_RELEASE_DIR_TX)
  189. qdf_assert_always(0);
  190. return HAL_RX_WBM_ERR_SRC_SW;
  191. default:
  192. qdf_assert_always(0);
  193. }
  194. return buf_src;
  195. }
  196. #else
  197. static inline uint32_t
  198. hal_wbm2sw_release_source_get(void *hal_desc, enum hal_be_wbm_release_dir dir)
  199. {
  200. return HAL_WBM2SW_RELEASE_SRC_GET(hal_desc);
  201. }
  202. #endif
  203. uint32_t hal_tx_comp_get_buffer_source_generic_be(void *hal_desc)
  204. {
  205. return hal_wbm2sw_release_source_get(hal_desc,
  206. HAL_BE_WBM_RELEASE_DIR_TX);
  207. }
  208. /**
  209. * hal_tx_comp_get_release_reason_generic_be() - TQM Release reason
  210. * @hal_desc: completion ring descriptor pointer
  211. *
  212. * This function will return the type of pointer - buffer or descriptor
  213. *
  214. * Return: buffer type
  215. */
  216. static uint8_t hal_tx_comp_get_release_reason_generic_be(void *hal_desc)
  217. {
  218. uint32_t comp_desc = *(uint32_t *)(((uint8_t *)hal_desc) +
  219. WBM2SW_COMPLETION_RING_TX_TQM_RELEASE_REASON_OFFSET);
  220. return (comp_desc &
  221. WBM2SW_COMPLETION_RING_TX_TQM_RELEASE_REASON_MASK) >>
  222. WBM2SW_COMPLETION_RING_TX_TQM_RELEASE_REASON_LSB;
  223. }
  224. /**
  225. * hal_get_wbm_internal_error_generic_be() - is WBM internal error
  226. * @hal_desc: completion ring descriptor pointer
  227. *
  228. * This function will return 0 or 1 - is it WBM internal error or not
  229. *
  230. * Return: uint8_t
  231. */
  232. static uint8_t hal_get_wbm_internal_error_generic_be(void *hal_desc)
  233. {
  234. /*
  235. * TODO - This func is called by tx comp and wbm error handler
  236. * Check if one needs to use WBM2SW-TX and other WBM2SW-RX
  237. */
  238. uint32_t comp_desc =
  239. *(uint32_t *)(((uint8_t *)hal_desc) +
  240. HAL_WBM_INTERNAL_ERROR_OFFSET);
  241. return (comp_desc & HAL_WBM_INTERNAL_ERROR_MASK) >>
  242. HAL_WBM_INTERNAL_ERROR_LSB;
  243. }
  244. /**
  245. * hal_setup_link_idle_list_generic_be - Setup scattered idle list using the
  246. * buffer list provided
  247. *
  248. * @hal_soc: Opaque HAL SOC handle
  249. * @scatter_bufs_base_paddr: Array of physical base addresses
  250. * @scatter_bufs_base_vaddr: Array of virtual base addresses
  251. * @num_scatter_bufs: Number of scatter buffers in the above lists
  252. * @scatter_buf_size: Size of each scatter buffer
  253. * @last_buf_end_offset: Offset to the last entry
  254. * @num_entries: Total entries of all scatter bufs
  255. *
  256. * Return: None
  257. */
  258. static void
  259. hal_setup_link_idle_list_generic_be(struct hal_soc *soc,
  260. qdf_dma_addr_t scatter_bufs_base_paddr[],
  261. void *scatter_bufs_base_vaddr[],
  262. uint32_t num_scatter_bufs,
  263. uint32_t scatter_buf_size,
  264. uint32_t last_buf_end_offset,
  265. uint32_t num_entries)
  266. {
  267. int i;
  268. uint32_t *prev_buf_link_ptr = NULL;
  269. uint32_t reg_scatter_buf_size, reg_tot_scatter_buf_size;
  270. uint32_t val;
  271. /* Link the scatter buffers */
  272. for (i = 0; i < num_scatter_bufs; i++) {
  273. if (i > 0) {
  274. prev_buf_link_ptr[0] =
  275. scatter_bufs_base_paddr[i] & 0xffffffff;
  276. prev_buf_link_ptr[1] = HAL_SM(
  277. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  278. BASE_ADDRESS_39_32,
  279. ((uint64_t)(scatter_bufs_base_paddr[i])
  280. >> 32)) | HAL_SM(
  281. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  282. ADDRESS_MATCH_TAG,
  283. ADDRESS_MATCH_TAG_VAL);
  284. }
  285. prev_buf_link_ptr = (uint32_t *)(scatter_bufs_base_vaddr[i] +
  286. scatter_buf_size - WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE);
  287. }
  288. /* TBD: Register programming partly based on MLD & the rest based on
  289. * inputs from HW team. Not complete yet.
  290. */
  291. reg_scatter_buf_size = (scatter_buf_size -
  292. WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) / 64;
  293. reg_tot_scatter_buf_size = ((scatter_buf_size -
  294. WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) * num_scatter_bufs) / 64;
  295. HAL_REG_WRITE(soc,
  296. HWIO_WBM_R0_IDLE_LIST_CONTROL_ADDR(
  297. WBM_REG_REG_BASE),
  298. HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, SCATTER_BUFFER_SIZE,
  299. reg_scatter_buf_size) |
  300. HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, LINK_DESC_IDLE_LIST_MODE,
  301. 0x1));
  302. HAL_REG_WRITE(soc,
  303. HWIO_WBM_R0_IDLE_LIST_SIZE_ADDR(
  304. WBM_REG_REG_BASE),
  305. HAL_SM(HWIO_WBM_R0_IDLE_LIST_SIZE,
  306. SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST,
  307. reg_tot_scatter_buf_size));
  308. HAL_REG_WRITE(soc,
  309. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_LSB_ADDR(
  310. WBM_REG_REG_BASE),
  311. scatter_bufs_base_paddr[0] & 0xffffffff);
  312. HAL_REG_WRITE(soc,
  313. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
  314. WBM_REG_REG_BASE),
  315. ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32) &
  316. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_BASE_ADDRESS_39_32_BMSK);
  317. HAL_REG_WRITE(soc,
  318. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
  319. WBM_REG_REG_BASE),
  320. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  321. BASE_ADDRESS_39_32, ((uint64_t)(scatter_bufs_base_paddr[0])
  322. >> 32)) |
  323. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  324. ADDRESS_MATCH_TAG, ADDRESS_MATCH_TAG_VAL));
  325. /* ADDRESS_MATCH_TAG field in the above register is expected to match
  326. * with the upper bits of link pointer. The above write sets this field
  327. * to zero and we are also setting the upper bits of link pointers to
  328. * zero while setting up the link list of scatter buffers above
  329. */
  330. /* Setup head and tail pointers for the idle list */
  331. HAL_REG_WRITE(soc,
  332. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
  333. WBM_REG_REG_BASE),
  334. scatter_bufs_base_paddr[num_scatter_bufs - 1] & 0xffffffff);
  335. HAL_REG_WRITE(soc,
  336. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1_ADDR(
  337. WBM_REG_REG_BASE),
  338. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
  339. BUFFER_ADDRESS_39_32,
  340. ((uint64_t)(scatter_bufs_base_paddr[num_scatter_bufs - 1])
  341. >> 32)) |
  342. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
  343. HEAD_POINTER_OFFSET, last_buf_end_offset >> 2));
  344. HAL_REG_WRITE(soc,
  345. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
  346. WBM_REG_REG_BASE),
  347. scatter_bufs_base_paddr[0] & 0xffffffff);
  348. HAL_REG_WRITE(soc,
  349. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX0_ADDR(
  350. WBM_REG_REG_BASE),
  351. scatter_bufs_base_paddr[0] & 0xffffffff);
  352. HAL_REG_WRITE(soc,
  353. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1_ADDR(
  354. WBM_REG_REG_BASE),
  355. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
  356. BUFFER_ADDRESS_39_32,
  357. ((uint64_t)(scatter_bufs_base_paddr[0]) >>
  358. 32)) | HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
  359. TAIL_POINTER_OFFSET, 0));
  360. HAL_REG_WRITE(soc,
  361. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HP_ADDR(
  362. WBM_REG_REG_BASE),
  363. 2 * num_entries);
  364. /* Set RING_ID_DISABLE */
  365. val = HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, RING_ID_DISABLE, 1);
  366. /*
  367. * SRNG_ENABLE bit is not available in HWK v1 (QCA8074v1). Hence
  368. * check the presence of the bit before toggling it.
  369. */
  370. #ifdef HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE_BMSK
  371. val |= HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, SRNG_ENABLE, 1);
  372. #endif
  373. HAL_REG_WRITE(soc,
  374. HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_ADDR(WBM_REG_REG_BASE),
  375. val);
  376. }
  377. /**
  378. * hal_rx_wbm_err_src_get_be() - Get WBM error source from descriptor
  379. * @ring_desc: ring descriptor
  380. *
  381. * Return: wbm error source
  382. */
  383. static uint32_t hal_rx_wbm_err_src_get_be(hal_ring_desc_t ring_desc)
  384. {
  385. return hal_wbm2sw_release_source_get(ring_desc,
  386. HAL_BE_WBM_RELEASE_DIR_RX);
  387. }
  388. /**
  389. * hal_rx_ret_buf_manager_get_be() - Get return buffer manager from ring desc
  390. * @ring_desc: ring descriptor
  391. *
  392. * Return: rbm
  393. */
  394. uint8_t hal_rx_ret_buf_manager_get_be(hal_ring_desc_t ring_desc)
  395. {
  396. /*
  397. * The following macro takes buf_addr_info as argument,
  398. * but since buf_addr_info is the first field in ring_desc
  399. * Hence the following call is OK
  400. */
  401. return HAL_RX_BUF_RBM_GET(ring_desc);
  402. }
  403. #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) (((*(((uint32_t *)wbm_desc) + \
  404. (WBM2SW_COMPLETION_RING_RX_REO_PUSH_REASON_OFFSET >> 2))) & \
  405. WBM2SW_COMPLETION_RING_RX_REO_PUSH_REASON_MASK) >> \
  406. WBM2SW_COMPLETION_RING_RX_REO_PUSH_REASON_LSB)
  407. #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) (((*(((uint32_t *)wbm_desc) + \
  408. (WBM2SW_COMPLETION_RING_RX_REO_ERROR_CODE_OFFSET >> 2))) & \
  409. WBM2SW_COMPLETION_RING_RX_REO_ERROR_CODE_MASK) >> \
  410. WBM2SW_COMPLETION_RING_RX_REO_ERROR_CODE_LSB)
  411. #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc) \
  412. (((*(((uint32_t *)wbm_desc) + \
  413. (WBM2SW_COMPLETION_RING_RX_RXDMA_PUSH_REASON_OFFSET >> 2))) & \
  414. WBM2SW_COMPLETION_RING_RX_RXDMA_PUSH_REASON_MASK) >> \
  415. WBM2SW_COMPLETION_RING_RX_RXDMA_PUSH_REASON_LSB)
  416. #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc) \
  417. (((*(((uint32_t *)wbm_desc) + \
  418. (WBM2SW_COMPLETION_RING_RX_RXDMA_ERROR_CODE_OFFSET >> 2))) & \
  419. WBM2SW_COMPLETION_RING_RX_RXDMA_ERROR_CODE_MASK) >> \
  420. WBM2SW_COMPLETION_RING_RX_RXDMA_ERROR_CODE_LSB)
  421. /**
  422. * hal_rx_wbm_err_info_get_generic_be(): Retrieves WBM error code and reason and
  423. * save it to hal_wbm_err_desc_info structure passed by caller
  424. * @wbm_desc: wbm ring descriptor
  425. * @wbm_er_info1: hal_wbm_err_desc_info structure, output parameter.
  426. * Return: void
  427. */
  428. void hal_rx_wbm_err_info_get_generic_be(void *wbm_desc, void *wbm_er_info1)
  429. {
  430. struct hal_wbm_err_desc_info *wbm_er_info =
  431. (struct hal_wbm_err_desc_info *)wbm_er_info1;
  432. wbm_er_info->wbm_err_src = hal_rx_wbm_err_src_get_be(wbm_desc);
  433. wbm_er_info->reo_psh_rsn = HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc);
  434. wbm_er_info->reo_err_code = HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc);
  435. wbm_er_info->rxdma_psh_rsn = HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc);
  436. wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc);
  437. }
  438. static void hal_rx_reo_buf_paddr_get_be(hal_ring_desc_t rx_desc,
  439. struct hal_buf_info *buf_info)
  440. {
  441. struct reo_destination_ring *reo_ring =
  442. (struct reo_destination_ring *)rx_desc;
  443. buf_info->paddr =
  444. (HAL_RX_REO_BUFFER_ADDR_31_0_GET(reo_ring) |
  445. ((uint64_t)(HAL_RX_REO_BUFFER_ADDR_39_32_GET(reo_ring)) << 32));
  446. buf_info->sw_cookie = HAL_RX_REO_BUF_COOKIE_GET(reo_ring);
  447. }
  448. static void hal_rx_msdu_link_desc_set_be(hal_soc_handle_t hal_soc_hdl,
  449. void *src_srng_desc,
  450. hal_buff_addrinfo_t buf_addr_info,
  451. uint8_t bm_action)
  452. {
  453. /*
  454. * The offsets for fields used in this function are same in
  455. * wbm_release_ring for Lithium and wbm_release_ring_tx
  456. * for Beryllium. hence we can use wbm_release_ring directly.
  457. */
  458. struct wbm_release_ring *wbm_rel_srng =
  459. (struct wbm_release_ring *)src_srng_desc;
  460. uint32_t addr_31_0;
  461. uint8_t addr_39_32;
  462. /* Structure copy !!! */
  463. wbm_rel_srng->released_buff_or_desc_addr_info =
  464. *((struct buffer_addr_info *)buf_addr_info);
  465. addr_31_0 =
  466. wbm_rel_srng->released_buff_or_desc_addr_info.buffer_addr_31_0;
  467. addr_39_32 =
  468. wbm_rel_srng->released_buff_or_desc_addr_info.buffer_addr_39_32;
  469. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING,
  470. RELEASE_SOURCE_MODULE, HAL_RX_WBM_ERR_SRC_SW);
  471. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING, BM_ACTION,
  472. bm_action);
  473. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING,
  474. BUFFER_OR_DESC_TYPE,
  475. HAL_RX_WBM_BUF_TYPE_MSDU_LINK_DESC);
  476. /* WBM error is indicated when any of the link descriptors given to
  477. * WBM has a NULL address, and one those paths is the link descriptors
  478. * released from host after processing RXDMA errors,
  479. * or from Rx defrag path, and we want to add an assert here to ensure
  480. * host is not releasing descriptors with NULL address.
  481. */
  482. if (qdf_unlikely(!addr_31_0 && !addr_39_32)) {
  483. hal_dump_wbm_rel_desc(src_srng_desc);
  484. qdf_assert_always(0);
  485. }
  486. }
  487. /**
  488. * hal_rx_reo_ent_buf_paddr_get_be: Gets the physical address and
  489. * cookie from the REO entrance ring element
  490. *
  491. * @ hal_rx_desc_cookie: Opaque cookie pointer used by HAL to get to
  492. * the current descriptor
  493. * @ buf_info: structure to return the buffer information
  494. * @ msdu_cnt: pointer to msdu count in MPDU
  495. * Return: void
  496. */
  497. static
  498. void hal_rx_buf_cookie_rbm_get_be(uint32_t *buf_addr_info_hdl,
  499. hal_buf_info_t buf_info_hdl)
  500. {
  501. struct hal_buf_info *buf_info =
  502. (struct hal_buf_info *)buf_info_hdl;
  503. struct buffer_addr_info *buf_addr_info =
  504. (struct buffer_addr_info *)buf_addr_info_hdl;
  505. buf_info->sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
  506. /*
  507. * buffer addr info is the first member of ring desc, so the typecast
  508. * can be done.
  509. */
  510. buf_info->rbm = hal_rx_ret_buf_manager_get_be(
  511. (hal_ring_desc_t)buf_addr_info);
  512. }
  513. /*
  514. * hal_rxdma_buff_addr_info_set_be() - set the buffer_addr_info of the
  515. * rxdma ring entry.
  516. * @rxdma_entry: descriptor entry
  517. * @paddr: physical address of nbuf data pointer.
  518. * @cookie: SW cookie used as a index to SW rx desc.
  519. * @manager: who owns the nbuf (host, NSS, etc...).
  520. *
  521. */
  522. static inline void
  523. hal_rxdma_buff_addr_info_set_be(void *rxdma_entry,
  524. qdf_dma_addr_t paddr, uint32_t cookie,
  525. uint8_t manager)
  526. {
  527. uint32_t paddr_lo = ((u64)paddr & 0x00000000ffffffff);
  528. uint32_t paddr_hi = ((u64)paddr & 0xffffffff00000000) >> 32;
  529. HAL_RXDMA_PADDR_LO_SET(rxdma_entry, paddr_lo);
  530. HAL_RXDMA_PADDR_HI_SET(rxdma_entry, paddr_hi);
  531. HAL_RXDMA_COOKIE_SET(rxdma_entry, cookie);
  532. HAL_RXDMA_MANAGER_SET(rxdma_entry, manager);
  533. }
  534. /**
  535. * hal_rx_get_reo_error_code_be() - Get REO error code from ring desc
  536. * @rx_desc: rx descriptor
  537. *
  538. * Return: REO error code
  539. */
  540. static uint32_t hal_rx_get_reo_error_code_be(hal_ring_desc_t rx_desc)
  541. {
  542. struct reo_destination_ring *reo_desc =
  543. (struct reo_destination_ring *)rx_desc;
  544. return HAL_RX_REO_ERROR_GET(reo_desc);
  545. }
  546. /**
  547. * hal_gen_reo_remap_val_generic_be() - Generate the reo map value
  548. * @ix0_map: mapping values for reo
  549. *
  550. * Return: IX0 reo remap register value to be written
  551. */
  552. static uint32_t
  553. hal_gen_reo_remap_val_generic_be(enum hal_reo_remap_reg remap_reg,
  554. uint8_t *ix0_map)
  555. {
  556. uint32_t ix_val = 0;
  557. switch (remap_reg) {
  558. case HAL_REO_REMAP_REG_IX0:
  559. ix_val = HAL_REO_REMAP_IX0(ix0_map[0], 0) |
  560. HAL_REO_REMAP_IX0(ix0_map[1], 1) |
  561. HAL_REO_REMAP_IX0(ix0_map[2], 2) |
  562. HAL_REO_REMAP_IX0(ix0_map[3], 3) |
  563. HAL_REO_REMAP_IX0(ix0_map[4], 4) |
  564. HAL_REO_REMAP_IX0(ix0_map[5], 5) |
  565. HAL_REO_REMAP_IX0(ix0_map[6], 6) |
  566. HAL_REO_REMAP_IX0(ix0_map[7], 7);
  567. break;
  568. case HAL_REO_REMAP_REG_IX2:
  569. ix_val = HAL_REO_REMAP_IX2(ix0_map[0], 16) |
  570. HAL_REO_REMAP_IX2(ix0_map[1], 17) |
  571. HAL_REO_REMAP_IX2(ix0_map[2], 18) |
  572. HAL_REO_REMAP_IX2(ix0_map[3], 19) |
  573. HAL_REO_REMAP_IX2(ix0_map[4], 20) |
  574. HAL_REO_REMAP_IX2(ix0_map[5], 21) |
  575. HAL_REO_REMAP_IX2(ix0_map[6], 22) |
  576. HAL_REO_REMAP_IX2(ix0_map[7], 23);
  577. break;
  578. default:
  579. break;
  580. }
  581. return ix_val;
  582. }
  583. static uint8_t hal_rx_err_status_get_be(hal_ring_desc_t rx_desc)
  584. {
  585. return HAL_RX_ERROR_STATUS_GET(rx_desc);
  586. }
  587. static QDF_STATUS hal_reo_status_update_be(hal_soc_handle_t hal_soc_hdl,
  588. hal_ring_desc_t reo_desc,
  589. void *st_handle,
  590. uint32_t tlv, int *num_ref)
  591. {
  592. union hal_reo_status *reo_status_ref;
  593. reo_status_ref = (union hal_reo_status *)st_handle;
  594. switch (tlv) {
  595. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  596. hal_reo_queue_stats_status_be(reo_desc,
  597. &reo_status_ref->queue_status,
  598. hal_soc_hdl);
  599. *num_ref = reo_status_ref->queue_status.header.cmd_num;
  600. break;
  601. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  602. hal_reo_flush_queue_status_be(reo_desc,
  603. &reo_status_ref->fl_queue_status,
  604. hal_soc_hdl);
  605. *num_ref = reo_status_ref->fl_queue_status.header.cmd_num;
  606. break;
  607. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  608. hal_reo_flush_cache_status_be(reo_desc,
  609. &reo_status_ref->fl_cache_status,
  610. hal_soc_hdl);
  611. *num_ref = reo_status_ref->fl_cache_status.header.cmd_num;
  612. break;
  613. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  614. hal_reo_unblock_cache_status_be
  615. (reo_desc, hal_soc_hdl,
  616. &reo_status_ref->unblk_cache_status);
  617. *num_ref = reo_status_ref->unblk_cache_status.header.cmd_num;
  618. break;
  619. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  620. hal_reo_flush_timeout_list_status_be(
  621. reo_desc,
  622. &reo_status_ref->fl_timeout_status,
  623. hal_soc_hdl);
  624. *num_ref = reo_status_ref->fl_timeout_status.header.cmd_num;
  625. break;
  626. case HAL_REO_DESC_THRES_STATUS_TLV:
  627. hal_reo_desc_thres_reached_status_be(
  628. reo_desc,
  629. &reo_status_ref->thres_status,
  630. hal_soc_hdl);
  631. *num_ref = reo_status_ref->thres_status.header.cmd_num;
  632. break;
  633. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  634. hal_reo_rx_update_queue_status_be(
  635. reo_desc,
  636. &reo_status_ref->rx_queue_status,
  637. hal_soc_hdl);
  638. *num_ref = reo_status_ref->rx_queue_status.header.cmd_num;
  639. break;
  640. default:
  641. QDF_TRACE(QDF_MODULE_ID_DP_REO, QDF_TRACE_LEVEL_WARN,
  642. "hal_soc %pK: no handler for TLV:%d",
  643. hal_soc_hdl, tlv);
  644. return QDF_STATUS_E_FAILURE;
  645. } /* switch */
  646. return QDF_STATUS_SUCCESS;
  647. }
  648. static uint8_t hal_rx_reo_buf_type_get_be(hal_ring_desc_t rx_desc)
  649. {
  650. return HAL_RX_REO_BUF_TYPE_GET(rx_desc);
  651. }
  652. #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
  653. #define HAL_WBM_MISC_CONTROL_SPARE_CONTROL_FIELD_BIT15 0x8000
  654. #endif
  655. void hal_cookie_conversion_reg_cfg_be(hal_soc_handle_t hal_soc_hdl,
  656. struct hal_hw_cc_config *cc_cfg)
  657. {
  658. uint32_t reg_addr, reg_val = 0;
  659. struct hal_soc *soc = (struct hal_soc *)hal_soc_hdl;
  660. /* REO CFG */
  661. reg_addr = HWIO_REO_R0_SW_COOKIE_CFG0_ADDR(REO_REG_REG_BASE);
  662. reg_val = cc_cfg->lut_base_addr_31_0;
  663. HAL_REG_WRITE(soc, reg_addr, reg_val);
  664. reg_addr = HWIO_REO_R0_SW_COOKIE_CFG1_ADDR(REO_REG_REG_BASE);
  665. reg_val = 0;
  666. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  667. SW_COOKIE_CONVERT_GLOBAL_ENABLE,
  668. cc_cfg->cc_global_en);
  669. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  670. SW_COOKIE_CONVERT_ENABLE,
  671. cc_cfg->cc_global_en);
  672. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  673. PAGE_ALIGNMENT,
  674. cc_cfg->page_4k_align);
  675. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  676. COOKIE_OFFSET_MSB,
  677. cc_cfg->cookie_offset_msb);
  678. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  679. COOKIE_PAGE_MSB,
  680. cc_cfg->cookie_page_msb);
  681. reg_val |= HAL_SM(HWIO_REO_R0_SW_COOKIE_CFG1,
  682. CMEM_LUT_BASE_ADDR_39_32,
  683. cc_cfg->lut_base_addr_39_32);
  684. HAL_REG_WRITE(soc, reg_addr, reg_val);
  685. /* WBM CFG */
  686. reg_addr = HWIO_WBM_R0_SW_COOKIE_CFG0_ADDR(WBM_REG_REG_BASE);
  687. reg_val = cc_cfg->lut_base_addr_31_0;
  688. HAL_REG_WRITE(soc, reg_addr, reg_val);
  689. reg_addr = HWIO_WBM_R0_SW_COOKIE_CFG1_ADDR(WBM_REG_REG_BASE);
  690. reg_val = 0;
  691. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
  692. PAGE_ALIGNMENT,
  693. cc_cfg->page_4k_align);
  694. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
  695. COOKIE_OFFSET_MSB,
  696. cc_cfg->cookie_offset_msb);
  697. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
  698. COOKIE_PAGE_MSB,
  699. cc_cfg->cookie_page_msb);
  700. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CFG1,
  701. CMEM_LUT_BASE_ADDR_39_32,
  702. cc_cfg->lut_base_addr_39_32);
  703. HAL_REG_WRITE(soc, reg_addr, reg_val);
  704. /*
  705. * WCSS_UMAC_WBM_R0_SW_COOKIE_CONVERT_CFG default value is 0x1FE,
  706. */
  707. reg_addr = HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG_ADDR(WBM_REG_REG_BASE);
  708. reg_val = 0;
  709. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  710. WBM_COOKIE_CONV_GLOBAL_ENABLE,
  711. cc_cfg->cc_global_en);
  712. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  713. WBM2SW6_COOKIE_CONVERSION_EN,
  714. cc_cfg->wbm2sw6_cc_en);
  715. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  716. WBM2SW5_COOKIE_CONVERSION_EN,
  717. cc_cfg->wbm2sw5_cc_en);
  718. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  719. WBM2SW4_COOKIE_CONVERSION_EN,
  720. cc_cfg->wbm2sw4_cc_en);
  721. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  722. WBM2SW3_COOKIE_CONVERSION_EN,
  723. cc_cfg->wbm2sw3_cc_en);
  724. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  725. WBM2SW2_COOKIE_CONVERSION_EN,
  726. cc_cfg->wbm2sw2_cc_en);
  727. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  728. WBM2SW1_COOKIE_CONVERSION_EN,
  729. cc_cfg->wbm2sw1_cc_en);
  730. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  731. WBM2SW0_COOKIE_CONVERSION_EN,
  732. cc_cfg->wbm2sw0_cc_en);
  733. reg_val |= HAL_SM(HWIO_WBM_R0_SW_COOKIE_CONVERT_CFG,
  734. WBM2FW_COOKIE_CONVERSION_EN,
  735. cc_cfg->wbm2fw_cc_en);
  736. HAL_REG_WRITE(soc, reg_addr, reg_val);
  737. #ifdef HWIO_WBM_R0_WBM_CFG_2_COOKIE_DEBUG_SEL_BMSK
  738. reg_addr = HWIO_WBM_R0_WBM_CFG_2_ADDR(WBM_REG_REG_BASE);
  739. reg_val = 0;
  740. reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
  741. COOKIE_DEBUG_SEL,
  742. cc_cfg->cc_global_en);
  743. reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
  744. COOKIE_CONV_INDICATION_EN,
  745. cc_cfg->cc_global_en);
  746. reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
  747. ERROR_PATH_COOKIE_CONV_EN,
  748. cc_cfg->error_path_cookie_conv_en);
  749. reg_val |= HAL_SM(HWIO_WBM_R0_WBM_CFG_2,
  750. RELEASE_PATH_COOKIE_CONV_EN,
  751. cc_cfg->release_path_cookie_conv_en);
  752. HAL_REG_WRITE(soc, reg_addr, reg_val);
  753. #endif
  754. #ifdef DP_HW_COOKIE_CONVERT_EXCEPTION
  755. /*
  756. * To enable indication for HW cookie conversion done or not for
  757. * WBM, WCSS_UMAC_WBM_R0_MISC_CONTROL spare_control field 15th
  758. * bit spare_control[15] should be set.
  759. */
  760. reg_addr = HWIO_WBM_R0_MISC_CONTROL_ADDR(WBM_REG_REG_BASE);
  761. reg_val = HAL_REG_READ(soc, reg_addr);
  762. reg_val |= HAL_SM(HWIO_WCSS_UMAC_WBM_R0_MISC_CONTROL,
  763. SPARE_CONTROL,
  764. HAL_WBM_MISC_CONTROL_SPARE_CONTROL_FIELD_BIT15);
  765. HAL_REG_WRITE(soc, reg_addr, reg_val);
  766. #endif
  767. }
  768. qdf_export_symbol(hal_cookie_conversion_reg_cfg_be);
  769. /**
  770. * hal_rx_msdu_reo_dst_ind_get: Gets the REO
  771. * destination ring ID from the msdu desc info
  772. *
  773. * @msdu_link_desc : Opaque cookie pointer used by HAL to get to
  774. * the current descriptor
  775. *
  776. * Return: dst_ind (REO destination ring ID)
  777. */
  778. static inline
  779. uint32_t hal_rx_msdu_reo_dst_ind_get_be(hal_soc_handle_t hal_soc_hdl,
  780. void *msdu_link_desc)
  781. {
  782. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  783. struct rx_msdu_details *msdu_details;
  784. struct rx_msdu_desc_info *msdu_desc_info;
  785. struct rx_msdu_link *msdu_link = (struct rx_msdu_link *)msdu_link_desc;
  786. uint32_t dst_ind;
  787. msdu_details = hal_rx_link_desc_msdu0_ptr(msdu_link, hal_soc);
  788. /* The first msdu in the link should exsist */
  789. msdu_desc_info = hal_rx_msdu_ext_desc_info_get_ptr(&msdu_details[0],
  790. hal_soc);
  791. dst_ind = HAL_RX_MSDU_REO_DST_IND_GET(msdu_desc_info);
  792. return dst_ind;
  793. }
  794. /**
  795. * hal_hw_txrx_default_ops_attach_be() - Attach the default hal ops for
  796. * beryllium chipsets.
  797. * @hal_soc_hdl: HAL soc handle
  798. *
  799. * Return: None
  800. */
  801. void hal_hw_txrx_default_ops_attach_be(struct hal_soc *hal_soc)
  802. {
  803. hal_soc->ops->hal_get_reo_qdesc_size = hal_get_reo_qdesc_size_be;
  804. hal_soc->ops->hal_set_link_desc_addr = hal_set_link_desc_addr_be;
  805. hal_soc->ops->hal_tx_init_data_ring = hal_tx_init_data_ring_be;
  806. hal_soc->ops->hal_get_ba_aging_timeout = hal_get_ba_aging_timeout_be;
  807. hal_soc->ops->hal_set_ba_aging_timeout = hal_set_ba_aging_timeout_be;
  808. hal_soc->ops->hal_get_reo_reg_base_offset =
  809. hal_get_reo_reg_base_offset_be;
  810. hal_soc->ops->hal_setup_link_idle_list =
  811. hal_setup_link_idle_list_generic_be;
  812. hal_soc->ops->hal_reo_setup = hal_reo_setup_generic_be;
  813. hal_soc->ops->hal_rx_reo_buf_paddr_get = hal_rx_reo_buf_paddr_get_be;
  814. hal_soc->ops->hal_rx_msdu_link_desc_set = hal_rx_msdu_link_desc_set_be;
  815. hal_soc->ops->hal_rx_buf_cookie_rbm_get = hal_rx_buf_cookie_rbm_get_be;
  816. hal_soc->ops->hal_rx_ret_buf_manager_get =
  817. hal_rx_ret_buf_manager_get_be;
  818. hal_soc->ops->hal_rxdma_buff_addr_info_set =
  819. hal_rxdma_buff_addr_info_set_be;
  820. hal_soc->ops->hal_rx_msdu_flags_get = hal_rx_msdu_flags_get_be;
  821. hal_soc->ops->hal_rx_get_reo_error_code = hal_rx_get_reo_error_code_be;
  822. hal_soc->ops->hal_gen_reo_remap_val =
  823. hal_gen_reo_remap_val_generic_be;
  824. hal_soc->ops->hal_tx_comp_get_buffer_source =
  825. hal_tx_comp_get_buffer_source_generic_be;
  826. hal_soc->ops->hal_tx_comp_get_release_reason =
  827. hal_tx_comp_get_release_reason_generic_be;
  828. hal_soc->ops->hal_get_wbm_internal_error =
  829. hal_get_wbm_internal_error_generic_be;
  830. hal_soc->ops->hal_rx_mpdu_desc_info_get =
  831. hal_rx_mpdu_desc_info_get_be;
  832. hal_soc->ops->hal_rx_err_status_get = hal_rx_err_status_get_be;
  833. hal_soc->ops->hal_rx_reo_buf_type_get = hal_rx_reo_buf_type_get_be;
  834. hal_soc->ops->hal_rx_wbm_err_src_get = hal_rx_wbm_err_src_get_be;
  835. hal_soc->ops->hal_reo_send_cmd = hal_reo_send_cmd_be;
  836. hal_soc->ops->hal_reo_qdesc_setup = hal_reo_qdesc_setup_be;
  837. hal_soc->ops->hal_reo_status_update = hal_reo_status_update_be;
  838. hal_soc->ops->hal_get_tlv_hdr_size = hal_get_tlv_hdr_size_be;
  839. hal_soc->ops->hal_rx_msdu_reo_dst_ind_get =
  840. hal_rx_msdu_reo_dst_ind_get_be;
  841. }