hal_li_generic_api.c 34 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135
  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 "hal_li_api.h"
  19. #include "hal_li_hw_headers.h"
  20. #include "hal_li_reo.h"
  21. #include "hal_rx.h"
  22. #include "hal_li_rx.h"
  23. #include "hal_tx.h"
  24. #include <hal_api_mon.h>
  25. #if defined(QDF_BIG_ENDIAN_MACHINE)
  26. /**
  27. * hal_setup_reo_swap() - Set the swap flag for big endian machines
  28. * @soc: HAL soc handle
  29. *
  30. * Return: None
  31. */
  32. static inline void hal_setup_reo_swap(struct hal_soc *soc)
  33. {
  34. uint32_t reg_val;
  35. reg_val = HAL_REG_READ(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR(
  36. SEQ_WCSS_UMAC_REO_REG_OFFSET));
  37. reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, WRITE_STRUCT_SWAP, 1);
  38. reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, READ_STRUCT_SWAP, 1);
  39. HAL_REG_WRITE(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR(
  40. SEQ_WCSS_UMAC_REO_REG_OFFSET), reg_val);
  41. }
  42. #else
  43. static inline void hal_setup_reo_swap(struct hal_soc *soc)
  44. {
  45. }
  46. #endif
  47. void hal_reo_setup_generic_li(struct hal_soc *soc, void *reoparams)
  48. {
  49. uint32_t reg_val;
  50. struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams;
  51. reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
  52. SEQ_WCSS_UMAC_REO_REG_OFFSET));
  53. hal_reo_config(soc, reg_val, reo_params);
  54. /* Other ring enable bits and REO_ENABLE will be set by FW */
  55. /* TODO: Setup destination ring mapping if enabled */
  56. /* TODO: Error destination ring setting is left to default.
  57. * Default setting is to send all errors to release ring.
  58. */
  59. /* Set the reo descriptor swap bits in case of BIG endian platform */
  60. hal_setup_reo_swap(soc);
  61. HAL_REG_WRITE(soc,
  62. HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(
  63. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  64. HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000);
  65. HAL_REG_WRITE(soc,
  66. HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(
  67. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  68. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  69. HAL_REG_WRITE(soc,
  70. HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(
  71. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  72. (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
  73. HAL_REG_WRITE(soc,
  74. HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(
  75. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  76. (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000));
  77. /*
  78. * When hash based routing is enabled, routing of the rx packet
  79. * is done based on the following value: 1 _ _ _ _ The last 4
  80. * bits are based on hash[3:0]. This means the possible values
  81. * are 0x10 to 0x1f. This value is used to look-up the
  82. * ring ID configured in Destination_Ring_Ctrl_IX_* register.
  83. * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3
  84. * registers need to be configured to set-up the 16 entries to
  85. * map the hash values to a ring number. There are 3 bits per
  86. * hash entry – which are mapped as follows:
  87. * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI),
  88. * 7: NOT_USED.
  89. */
  90. if (reo_params->rx_hash_enabled) {
  91. HAL_REG_WRITE(soc,
  92. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
  93. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  94. reo_params->remap1);
  95. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x",
  96. HAL_REG_READ(soc,
  97. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
  98. SEQ_WCSS_UMAC_REO_REG_OFFSET)));
  99. HAL_REG_WRITE(soc,
  100. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
  101. SEQ_WCSS_UMAC_REO_REG_OFFSET),
  102. reo_params->remap2);
  103. hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x",
  104. HAL_REG_READ(soc,
  105. HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
  106. SEQ_WCSS_UMAC_REO_REG_OFFSET)));
  107. }
  108. /* TODO: Check if the following registers shoould be setup by host:
  109. * AGING_CONTROL
  110. * HIGH_MEMORY_THRESHOLD
  111. * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2]
  112. * GLOBAL_LINK_DESC_COUNT_CTRL
  113. */
  114. }
  115. void hal_set_link_desc_addr_li(void *desc, uint32_t cookie,
  116. qdf_dma_addr_t link_desc_paddr)
  117. {
  118. uint32_t *buf_addr = (uint32_t *)desc;
  119. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO_0, BUFFER_ADDR_31_0,
  120. link_desc_paddr & 0xffffffff);
  121. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO_1, BUFFER_ADDR_39_32,
  122. (uint64_t)link_desc_paddr >> 32);
  123. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO_1, RETURN_BUFFER_MANAGER,
  124. WBM_IDLE_DESC_LIST);
  125. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO_1, SW_BUFFER_COOKIE,
  126. cookie);
  127. }
  128. #ifdef TCL_DATA_CMD_2_SEARCH_TYPE_OFFSET
  129. void hal_tx_desc_set_search_type_generic_li(void *desc, uint8_t search_type)
  130. {
  131. HAL_SET_FLD(desc, TCL_DATA_CMD_2, SEARCH_TYPE) |=
  132. HAL_TX_SM(TCL_DATA_CMD_2, SEARCH_TYPE, search_type);
  133. }
  134. #else
  135. void hal_tx_desc_set_search_type_generic_li(void *desc, uint8_t search_type)
  136. {
  137. }
  138. #endif
  139. #ifdef TCL_DATA_CMD_5_SEARCH_INDEX_OFFSET
  140. void hal_tx_desc_set_search_index_generic_li(void *desc, uint32_t search_index)
  141. {
  142. HAL_SET_FLD(desc, TCL_DATA_CMD_5, SEARCH_INDEX) |=
  143. HAL_TX_SM(TCL_DATA_CMD_5, SEARCH_INDEX, search_index);
  144. }
  145. #else
  146. void hal_tx_desc_set_search_index_generic_li(void *desc, uint32_t search_index)
  147. {
  148. }
  149. #endif
  150. #ifdef TCL_DATA_CMD_5_CACHE_SET_NUM_OFFSET
  151. void hal_tx_desc_set_cache_set_num_generic_li(void *desc, uint8_t cache_num)
  152. {
  153. HAL_SET_FLD(desc, TCL_DATA_CMD_5, CACHE_SET_NUM) |=
  154. HAL_TX_SM(TCL_DATA_CMD_5, CACHE_SET_NUM, cache_num);
  155. }
  156. #else
  157. void hal_tx_desc_set_cache_set_num_generic_li(void *desc, uint8_t cache_num)
  158. {
  159. }
  160. #endif
  161. void hal_tx_init_data_ring_li(hal_soc_handle_t hal_soc_hdl,
  162. hal_ring_handle_t hal_ring_hdl)
  163. {
  164. uint8_t *desc_addr;
  165. struct hal_srng_params srng_params;
  166. uint32_t desc_size;
  167. uint32_t num_desc;
  168. hal_get_srng_params(hal_soc_hdl, hal_ring_hdl, &srng_params);
  169. desc_addr = (uint8_t *)srng_params.ring_base_vaddr;
  170. desc_size = sizeof(struct tcl_data_cmd);
  171. num_desc = srng_params.num_entries;
  172. while (num_desc) {
  173. HAL_TX_DESC_SET_TLV_HDR(desc_addr, HAL_TX_TCL_DATA_TAG,
  174. desc_size);
  175. desc_addr += (desc_size + sizeof(struct tlv_32_hdr));
  176. num_desc--;
  177. }
  178. }
  179. /**
  180. * hal_setup_link_idle_list_generic_li - Setup scattered idle list using the
  181. * buffer list provided
  182. *
  183. * @hal_soc: Opaque HAL SOC handle
  184. * @scatter_bufs_base_paddr: Array of physical base addresses
  185. * @scatter_bufs_base_vaddr: Array of virtual base addresses
  186. * @num_scatter_bufs: Number of scatter buffers in the above lists
  187. * @scatter_buf_size: Size of each scatter buffer
  188. * @last_buf_end_offset: Offset to the last entry
  189. * @num_entries: Total entries of all scatter bufs
  190. *
  191. * Return: None
  192. */
  193. static void
  194. hal_setup_link_idle_list_generic_li(struct hal_soc *soc,
  195. qdf_dma_addr_t scatter_bufs_base_paddr[],
  196. void *scatter_bufs_base_vaddr[],
  197. uint32_t num_scatter_bufs,
  198. uint32_t scatter_buf_size,
  199. uint32_t last_buf_end_offset,
  200. uint32_t num_entries)
  201. {
  202. int i;
  203. uint32_t *prev_buf_link_ptr = NULL;
  204. uint32_t reg_scatter_buf_size, reg_tot_scatter_buf_size;
  205. uint32_t val;
  206. /* Link the scatter buffers */
  207. for (i = 0; i < num_scatter_bufs; i++) {
  208. if (i > 0) {
  209. prev_buf_link_ptr[0] =
  210. scatter_bufs_base_paddr[i] & 0xffffffff;
  211. prev_buf_link_ptr[1] = HAL_SM(
  212. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  213. BASE_ADDRESS_39_32,
  214. ((uint64_t)(scatter_bufs_base_paddr[i])
  215. >> 32)) | HAL_SM(
  216. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  217. ADDRESS_MATCH_TAG,
  218. ADDRESS_MATCH_TAG_VAL);
  219. }
  220. prev_buf_link_ptr = (uint32_t *)(scatter_bufs_base_vaddr[i] +
  221. scatter_buf_size - WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE);
  222. }
  223. /* TBD: Register programming partly based on MLD & the rest based on
  224. * inputs from HW team. Not complete yet.
  225. */
  226. reg_scatter_buf_size = (scatter_buf_size -
  227. WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) / 64;
  228. reg_tot_scatter_buf_size = ((scatter_buf_size -
  229. WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) * num_scatter_bufs) / 64;
  230. HAL_REG_WRITE(soc,
  231. HWIO_WBM_R0_IDLE_LIST_CONTROL_ADDR(
  232. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  233. HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, SCATTER_BUFFER_SIZE,
  234. reg_scatter_buf_size) |
  235. HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, LINK_DESC_IDLE_LIST_MODE,
  236. 0x1));
  237. HAL_REG_WRITE(soc,
  238. HWIO_WBM_R0_IDLE_LIST_SIZE_ADDR(
  239. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  240. HAL_SM(HWIO_WBM_R0_IDLE_LIST_SIZE,
  241. SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST,
  242. reg_tot_scatter_buf_size));
  243. HAL_REG_WRITE(soc,
  244. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_LSB_ADDR(
  245. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  246. scatter_bufs_base_paddr[0] & 0xffffffff);
  247. HAL_REG_WRITE(soc,
  248. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
  249. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  250. ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32) &
  251. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_BASE_ADDRESS_39_32_BMSK);
  252. HAL_REG_WRITE(soc,
  253. HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
  254. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  255. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  256. BASE_ADDRESS_39_32, ((uint64_t)(scatter_bufs_base_paddr[0])
  257. >> 32)) |
  258. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
  259. ADDRESS_MATCH_TAG, ADDRESS_MATCH_TAG_VAL));
  260. /* ADDRESS_MATCH_TAG field in the above register is expected to match
  261. * with the upper bits of link pointer. The above write sets this field
  262. * to zero and we are also setting the upper bits of link pointers to
  263. * zero while setting up the link list of scatter buffers above
  264. */
  265. /* Setup head and tail pointers for the idle list */
  266. HAL_REG_WRITE(soc,
  267. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
  268. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  269. scatter_bufs_base_paddr[num_scatter_bufs - 1] & 0xffffffff);
  270. HAL_REG_WRITE(soc,
  271. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1_ADDR(
  272. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  273. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
  274. BUFFER_ADDRESS_39_32,
  275. ((uint64_t)(scatter_bufs_base_paddr[num_scatter_bufs - 1])
  276. >> 32)) |
  277. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
  278. HEAD_POINTER_OFFSET, last_buf_end_offset >> 2));
  279. HAL_REG_WRITE(soc,
  280. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
  281. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  282. scatter_bufs_base_paddr[0] & 0xffffffff);
  283. HAL_REG_WRITE(soc,
  284. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX0_ADDR(
  285. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  286. scatter_bufs_base_paddr[0] & 0xffffffff);
  287. HAL_REG_WRITE(soc,
  288. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1_ADDR(
  289. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  290. HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
  291. BUFFER_ADDRESS_39_32,
  292. ((uint64_t)(scatter_bufs_base_paddr[0]) >>
  293. 32)) | HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
  294. TAIL_POINTER_OFFSET, 0));
  295. HAL_REG_WRITE(soc,
  296. HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HP_ADDR(
  297. SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  298. 2 * num_entries);
  299. /* Set RING_ID_DISABLE */
  300. val = HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, RING_ID_DISABLE, 1);
  301. /*
  302. * SRNG_ENABLE bit is not available in HWK v1 (QCA8074v1). Hence
  303. * check the presence of the bit before toggling it.
  304. */
  305. #ifdef HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE_BMSK
  306. val |= HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, SRNG_ENABLE, 1);
  307. #endif
  308. HAL_REG_WRITE(soc,
  309. HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
  310. val);
  311. }
  312. /*
  313. * hal_rx_msdu_is_wlan_mcast_generic_li(): Check if the buffer is for multicast
  314. * address
  315. * @nbuf: Network buffer
  316. *
  317. * Returns: flag to indicate whether the nbuf has MC/BC address
  318. */
  319. static uint32_t hal_rx_msdu_is_wlan_mcast_generic_li(qdf_nbuf_t nbuf)
  320. {
  321. uint8_t *buf = qdf_nbuf_data(nbuf);
  322. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  323. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  324. return rx_attn->mcast_bcast;
  325. }
  326. /**
  327. * hal_rx_tlv_decap_format_get_li() - Get packet decap format from the TLV
  328. * @hw_desc_addr: rx tlv desc
  329. *
  330. * Return: pkt decap format
  331. */
  332. static uint32_t hal_rx_tlv_decap_format_get_li(void *hw_desc_addr)
  333. {
  334. struct rx_msdu_start *rx_msdu_start;
  335. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  336. rx_msdu_start = &rx_desc->msdu_start_tlv.rx_msdu_start;
  337. return HAL_RX_GET(rx_msdu_start, RX_MSDU_START_2, DECAP_FORMAT);
  338. }
  339. /**
  340. * hal_rx_dump_pkt_tlvs_li(): API to print all member elements of
  341. * RX TLVs
  342. * @ buf: pointer the pkt buffer.
  343. * @ dbg_level: log level.
  344. *
  345. * Return: void
  346. */
  347. static void hal_rx_dump_pkt_tlvs_li(hal_soc_handle_t hal_soc_hdl,
  348. uint8_t *buf, uint8_t dbg_level)
  349. {
  350. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  351. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  352. struct rx_mpdu_start *mpdu_start =
  353. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  354. struct rx_msdu_start *msdu_start =
  355. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  356. struct rx_mpdu_end *mpdu_end = &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
  357. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  358. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  359. hal_rx_dump_rx_attention_tlv(rx_attn, dbg_level);
  360. hal_rx_dump_mpdu_start_tlv(mpdu_start, dbg_level, hal_soc);
  361. hal_rx_dump_msdu_start_tlv(hal_soc, msdu_start, dbg_level);
  362. hal_rx_dump_mpdu_end_tlv(mpdu_end, dbg_level);
  363. hal_rx_dump_msdu_end_tlv(hal_soc, msdu_end, dbg_level);
  364. hal_rx_dump_pkt_hdr_tlv(pkt_tlvs, dbg_level);
  365. }
  366. /**
  367. * hal_rx_tlv_get_offload_info_li() - Get the offload info from TLV
  368. * @rx_tlv: RX tlv start address in buffer
  369. * @offload_info: Buffer to store the offload info
  370. *
  371. * Return: 0 on success, -EINVAL on failure.
  372. */
  373. static int
  374. hal_rx_tlv_get_offload_info_li(uint8_t *rx_tlv,
  375. struct hal_offload_info *offload_info)
  376. {
  377. offload_info->tcp_proto = HAL_RX_TLV_GET_TCP_PROTO(rx_tlv);
  378. if (!offload_info->tcp_proto)
  379. return -EINVAL;
  380. offload_info->lro_eligible = HAL_RX_TLV_GET_LRO_ELIGIBLE(rx_tlv);
  381. offload_info->tcp_pure_ack = HAL_RX_TLV_GET_TCP_PURE_ACK(rx_tlv);
  382. offload_info->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_tlv);
  383. offload_info->tcp_offset = HAL_RX_TLV_GET_TCP_OFFSET(rx_tlv);
  384. offload_info->tcp_win = HAL_RX_TLV_GET_TCP_WIN(rx_tlv);
  385. offload_info->tcp_seq_num = HAL_RX_TLV_GET_TCP_SEQ(rx_tlv);
  386. offload_info->tcp_ack_num = HAL_RX_TLV_GET_TCP_ACK(rx_tlv);
  387. offload_info->flow_id = HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(rx_tlv);
  388. return 0;
  389. }
  390. /*
  391. * hal_rx_attn_phy_ppdu_id_get(): get phy_ppdu_id value
  392. * from rx attention
  393. * @buf: pointer to rx_pkt_tlvs
  394. *
  395. * Return: phy_ppdu_id
  396. */
  397. static uint16_t hal_rx_attn_phy_ppdu_id_get_li(uint8_t *buf)
  398. {
  399. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  400. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  401. uint16_t phy_ppdu_id;
  402. phy_ppdu_id = HAL_RX_ATTN_PHY_PPDU_ID_GET(rx_attn);
  403. return phy_ppdu_id;
  404. }
  405. /**
  406. * hal_rx_msdu_start_msdu_len_get(): API to get the MSDU length
  407. * from rx_msdu_start TLV
  408. *
  409. * @ buf: pointer to the start of RX PKT TLV headers
  410. * Return: msdu length
  411. */
  412. static uint32_t hal_rx_msdu_start_msdu_len_get_li(uint8_t *buf)
  413. {
  414. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  415. struct rx_msdu_start *msdu_start =
  416. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  417. uint32_t msdu_len;
  418. msdu_len = HAL_RX_MSDU_START_MSDU_LEN_GET(msdu_start);
  419. return msdu_len;
  420. }
  421. /**
  422. * hal_rx_get_frame_ctrl_field(): Function to retrieve frame control field
  423. *
  424. * @nbuf: Network buffer
  425. * Returns: rx more fragment bit
  426. *
  427. */
  428. static uint16_t hal_rx_get_frame_ctrl_field_li(uint8_t *buf)
  429. {
  430. struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
  431. struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
  432. uint16_t frame_ctrl = 0;
  433. frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_mpdu_info);
  434. return frame_ctrl;
  435. }
  436. /**
  437. * hal_rx_get_proto_params_li() - Get l4 proto values from TLV
  438. * @buf: rx tlv address
  439. * @proto_params: Buffer to store proto parameters
  440. *
  441. * Return: 0 on success.
  442. */
  443. static int hal_rx_get_proto_params_li(uint8_t *buf, void *proto_params)
  444. {
  445. struct hal_proto_params *param =
  446. (struct hal_proto_params *)proto_params;
  447. param->tcp_proto = HAL_RX_TLV_GET_IP_OFFSET(buf);
  448. param->udp_proto = HAL_RX_TLV_GET_UDP_PROTO(buf);
  449. param->ipv6_proto = HAL_RX_TLV_GET_IPV6(buf);
  450. return 0;
  451. }
  452. /**
  453. * hal_rx_get_l3_l4_offsets_li() - Get l3/l4 header offset from TLV
  454. * @buf: rx tlv start address
  455. * @l3_hdr_offset: buffer to store l3 offset
  456. * @l4_hdr_offset: buffer to store l4 offset
  457. *
  458. * Return: 0 on success.
  459. */
  460. static int hal_rx_get_l3_l4_offsets_li(uint8_t *buf, uint32_t *l3_hdr_offset,
  461. uint32_t *l4_hdr_offset)
  462. {
  463. *l3_hdr_offset = HAL_RX_TLV_GET_IP_OFFSET(buf);
  464. *l4_hdr_offset = HAL_RX_TLV_GET_TCP_OFFSET(buf);
  465. return 0;
  466. }
  467. /**
  468. * hal_rx_mpdu_end_mic_err_get_li(): API to get the MIC ERR
  469. * from rx_mpdu_end TLV
  470. *
  471. * @buf: pointer to the start of RX PKT TLV headers
  472. * Return: uint32_t(mic_err)
  473. */
  474. static inline uint32_t hal_rx_mpdu_end_mic_err_get_li(uint8_t *buf)
  475. {
  476. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  477. struct rx_mpdu_end *mpdu_end =
  478. &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
  479. uint32_t mic_err;
  480. mic_err = HAL_RX_MPDU_END_MIC_ERR_GET(mpdu_end);
  481. return mic_err;
  482. }
  483. /*
  484. * hal_rx_msdu_start_get_pkt_type_li(): API to get the pkt type
  485. * from rx_msdu_start
  486. *
  487. * @buf: pointer to the start of RX PKT TLV header
  488. * Return: uint32_t(pkt type)
  489. */
  490. static inline uint32_t hal_rx_msdu_start_get_pkt_type_li(uint8_t *buf)
  491. {
  492. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  493. struct rx_msdu_start *msdu_start =
  494. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  495. uint32_t pkt_type;
  496. pkt_type = HAL_RX_MSDU_START_PKT_TYPE_GET(msdu_start);
  497. return pkt_type;
  498. }
  499. /**
  500. * hal_rx_tlv_get_pn_num_li() - Get packet number from RX TLV
  501. * @buf: rx tlv address
  502. * @pn_num: buffer to store packet number
  503. *
  504. * Return: None
  505. */
  506. static inline void hal_rx_tlv_get_pn_num_li(uint8_t *buf, uint64_t *pn_num)
  507. {
  508. struct rx_pkt_tlvs *rx_pkt_tlv =
  509. (struct rx_pkt_tlvs *)buf;
  510. struct rx_mpdu_info *rx_mpdu_info_details =
  511. &rx_pkt_tlv->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
  512. pn_num[0] = rx_mpdu_info_details->pn_31_0;
  513. pn_num[0] |=
  514. ((uint64_t)rx_mpdu_info_details->pn_63_32 << 32);
  515. pn_num[1] = rx_mpdu_info_details->pn_95_64;
  516. pn_num[1] |=
  517. ((uint64_t)rx_mpdu_info_details->pn_127_96 << 32);
  518. }
  519. #ifdef NO_RX_PKT_HDR_TLV
  520. /**
  521. * hal_rx_pkt_hdr_get_li() - Get rx packet header start address.
  522. * @buf: packet start address
  523. *
  524. * Return: packet data start address.
  525. */
  526. static inline uint8_t *hal_rx_pkt_hdr_get_li(uint8_t *buf)
  527. {
  528. return buf + RX_PKT_TLVS_LEN;
  529. }
  530. #else
  531. static inline uint8_t *hal_rx_pkt_hdr_get_li(uint8_t *buf)
  532. {
  533. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  534. return pkt_tlvs->pkt_hdr_tlv.rx_pkt_hdr;
  535. }
  536. #endif
  537. /*
  538. * hal_rx_msdu_start_bw_get_li(): API to get the Bandwidth
  539. * Interval from rx_msdu_start
  540. *
  541. * @buf: pointer to the start of RX PKT TLV header
  542. * Return: uint32_t(bw)
  543. */
  544. static inline uint32_t hal_rx_bw_bw_get_li(uint8_t *buf)
  545. {
  546. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  547. struct rx_msdu_start *msdu_start =
  548. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  549. uint32_t bw;
  550. bw = HAL_RX_MSDU_START_BW_GET(msdu_start);
  551. return bw;
  552. }
  553. /**
  554. * hal_rx_priv_info_set_in_tlv_li(): Save the private info to
  555. * the reserved bytes of rx_tlv_hdr
  556. * @buf: start of rx_tlv_hdr
  557. * @priv_data: hal_wbm_err_desc_info structure
  558. * @len: length of the private data
  559. * Return: void
  560. */
  561. static inline void
  562. hal_rx_priv_info_set_in_tlv_li(uint8_t *buf, uint8_t *priv_data,
  563. uint32_t len)
  564. {
  565. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  566. uint32_t copy_len = (len > RX_PADDING0_BYTES) ?
  567. RX_PADDING0_BYTES : len;
  568. qdf_mem_copy(pkt_tlvs->rx_padding0, priv_data, copy_len);
  569. }
  570. /**
  571. * hal_rx_priv_info_get_from_tlv_li(): retrieve the private data from
  572. * the reserved bytes of rx_tlv_hdr.
  573. * @buf: start of rx_tlv_hdr
  574. * @priv_data: hal_wbm_err_desc_info structure
  575. * @len: length of the private data
  576. * Return: void
  577. */
  578. static inline void
  579. hal_rx_priv_info_get_from_tlv_li(uint8_t *buf, uint8_t *priv_data,
  580. uint32_t len)
  581. {
  582. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  583. uint32_t copy_len = (len > RX_PADDING0_BYTES) ?
  584. RX_PADDING0_BYTES : len;
  585. qdf_mem_copy(priv_data, pkt_tlvs->rx_padding0, copy_len);
  586. }
  587. /**
  588. * hal_rx_get_tlv_size_generic_li() - Get rx packet tlv size
  589. * @rx_pkt_tlv_size: TLV size for regular RX packets
  590. * @rx_mon_pkt_tlv_size: TLV size for monitor mode packets
  591. *
  592. * Return: size of rx pkt tlv before the actual data
  593. */
  594. static void hal_rx_get_tlv_size_generic_li(uint16_t *rx_pkt_tlv_size,
  595. uint16_t *rx_mon_pkt_tlv_size)
  596. {
  597. *rx_pkt_tlv_size = RX_PKT_TLVS_LEN;
  598. *rx_mon_pkt_tlv_size = SIZE_OF_MONITOR_TLV;
  599. }
  600. /**
  601. * hal_rx_wbm_err_src_get_li() - Get WBM error source from descriptor
  602. * @ring_desc: ring descriptor
  603. *
  604. * Return: wbm error source
  605. */
  606. uint32_t hal_rx_wbm_err_src_get_li(hal_ring_desc_t ring_desc)
  607. {
  608. return HAL_WBM2SW_RELEASE_SRC_GET(ring_desc);
  609. }
  610. #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) \
  611. (_HAL_MS((*_OFFSET_TO_WORD_PTR(wbm_desc, \
  612. WBM_RELEASE_RING_2_REO_PUSH_REASON_OFFSET)), \
  613. WBM_RELEASE_RING_2_REO_PUSH_REASON_MASK, \
  614. WBM_RELEASE_RING_2_REO_PUSH_REASON_LSB))
  615. #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) \
  616. (_HAL_MS((*_OFFSET_TO_WORD_PTR(wbm_desc, \
  617. WBM_RELEASE_RING_2_REO_ERROR_CODE_OFFSET)), \
  618. WBM_RELEASE_RING_2_REO_ERROR_CODE_MASK, \
  619. WBM_RELEASE_RING_2_REO_ERROR_CODE_LSB))
  620. #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc) \
  621. (((*(((uint32_t *)wbm_desc) + \
  622. (WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_OFFSET >> 2))) & \
  623. WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_MASK) >> \
  624. WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_LSB)
  625. #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc) \
  626. (((*(((uint32_t *)wbm_desc) + \
  627. (WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_OFFSET >> 2))) & \
  628. WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_MASK) >> \
  629. WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_LSB)
  630. /**
  631. * hal_rx_wbm_err_info_get_generic_li(): Retrieves WBM error code and reason and
  632. * save it to hal_wbm_err_desc_info structure passed by caller
  633. * @wbm_desc: wbm ring descriptor
  634. * @wbm_er_info1: hal_wbm_err_desc_info structure, output parameter.
  635. * Return: void
  636. */
  637. void hal_rx_wbm_err_info_get_generic_li(void *wbm_desc,
  638. void *wbm_er_info1)
  639. {
  640. struct hal_wbm_err_desc_info *wbm_er_info =
  641. (struct hal_wbm_err_desc_info *)wbm_er_info1;
  642. wbm_er_info->wbm_err_src = HAL_WBM2SW_RELEASE_SRC_GET(wbm_desc);
  643. wbm_er_info->reo_psh_rsn = HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc);
  644. wbm_er_info->reo_err_code = HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc);
  645. wbm_er_info->rxdma_psh_rsn = HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc);
  646. wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc);
  647. }
  648. /**
  649. * hal_rx_ret_buf_manager_get_li() - Get return buffer manager from ring desc
  650. * @ring_desc: ring descriptor
  651. *
  652. * Return: rbm
  653. */
  654. uint8_t hal_rx_ret_buf_manager_get_li(hal_ring_desc_t ring_desc)
  655. {
  656. /*
  657. * The following macro takes buf_addr_info as argument,
  658. * but since buf_addr_info is the first field in ring_desc
  659. * Hence the following call is OK
  660. */
  661. return HAL_RX_BUF_RBM_GET(ring_desc);
  662. }
  663. /**
  664. * hal_rx_reo_ent_buf_paddr_get_li: Gets the physical address and
  665. * cookie from the REO entrance ring element
  666. *
  667. * @ hal_rx_desc_cookie: Opaque cookie pointer used by HAL to get to
  668. * the current descriptor
  669. * @ buf_info: structure to return the buffer information
  670. * @ msdu_cnt: pointer to msdu count in MPDU
  671. * Return: void
  672. */
  673. static
  674. void hal_rx_buf_cookie_rbm_get_li(hal_buff_addrinfo_t buf_addr_info_hdl,
  675. hal_buf_info_t buf_info_hdl)
  676. {
  677. struct hal_buf_info *buf_info =
  678. (struct hal_buf_info *)buf_info_hdl;
  679. struct buffer_addr_info *buf_addr_info =
  680. (struct buffer_addr_info *)buf_addr_info_hdl;
  681. buf_info->sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
  682. /*
  683. * buffer addr info is the first member of ring desc, so the typecast
  684. * can be done.
  685. */
  686. buf_info->rbm = hal_rx_ret_buf_manager_get_li(
  687. (hal_ring_desc_t)buf_addr_info);
  688. }
  689. /*
  690. * hal_rxdma_buff_addr_info_set() - set the buffer_addr_info of the
  691. * rxdma ring entry.
  692. * @rxdma_entry: descriptor entry
  693. * @paddr: physical address of nbuf data pointer.
  694. * @cookie: SW cookie used as a index to SW rx desc.
  695. * @manager: who owns the nbuf (host, NSS, etc...).
  696. *
  697. */
  698. static void hal_rxdma_buff_addr_info_set_li(void *rxdma_entry,
  699. qdf_dma_addr_t paddr, uint32_t cookie, uint8_t manager)
  700. {
  701. uint32_t paddr_lo = ((u64)paddr & 0x00000000ffffffff);
  702. uint32_t paddr_hi = ((u64)paddr & 0xffffffff00000000) >> 32;
  703. HAL_RXDMA_PADDR_LO_SET(rxdma_entry, paddr_lo);
  704. HAL_RXDMA_PADDR_HI_SET(rxdma_entry, paddr_hi);
  705. HAL_RXDMA_COOKIE_SET(rxdma_entry, cookie);
  706. HAL_RXDMA_MANAGER_SET(rxdma_entry, manager);
  707. }
  708. /**
  709. * hal_rx_msdu_flags_get_li() - Get msdu flags from ring desc
  710. * @msdu_desc_info_hdl: msdu desc info handle
  711. *
  712. * Return: msdu flags
  713. */
  714. static uint32_t hal_rx_msdu_flags_get_li(rx_msdu_desc_info_t msdu_desc_info_hdl)
  715. {
  716. struct rx_msdu_desc_info *msdu_desc_info =
  717. (struct rx_msdu_desc_info *)msdu_desc_info_hdl;
  718. uint32_t flags = 0;
  719. if (HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_GET(msdu_desc_info))
  720. flags |= HAL_MSDU_F_FIRST_MSDU_IN_MPDU;
  721. if (HAL_RX_LAST_MSDU_IN_MPDU_FLAG_GET(msdu_desc_info))
  722. flags |= HAL_MSDU_F_LAST_MSDU_IN_MPDU;
  723. if (HAL_RX_MSDU_CONTINUATION_FLAG_GET(msdu_desc_info))
  724. flags |= HAL_MSDU_F_MSDU_CONTINUATION;
  725. if (HAL_RX_MSDU_SA_IS_VALID_FLAG_GET(msdu_desc_info))
  726. flags |= HAL_MSDU_F_SA_IS_VALID;
  727. if (HAL_RX_MSDU_SA_IDX_TIMEOUT_FLAG_GET(msdu_desc_info))
  728. flags |= HAL_MSDU_F_SA_IDX_TIMEOUT;
  729. if (HAL_RX_MSDU_DA_IS_VALID_FLAG_GET(msdu_desc_info))
  730. flags |= HAL_MSDU_F_DA_IS_VALID;
  731. if (HAL_RX_MSDU_DA_IDX_TIMEOUT_FLAG_GET(msdu_desc_info))
  732. flags |= HAL_MSDU_F_DA_IDX_TIMEOUT;
  733. if (HAL_RX_MSDU_DA_IS_MCBC_FLAG_GET(msdu_desc_info))
  734. flags |= HAL_MSDU_F_DA_IS_MCBC;
  735. return flags;
  736. }
  737. /**
  738. * hal_rx_get_reo_error_code_li() - Get REO error code from ring desc
  739. * @rx_desc: rx descriptor
  740. *
  741. * Return: REO error code
  742. */
  743. static uint32_t hal_rx_get_reo_error_code_li(hal_ring_desc_t rx_desc)
  744. {
  745. struct reo_destination_ring *reo_desc =
  746. (struct reo_destination_ring *)rx_desc;
  747. return HAL_RX_REO_ERROR_GET(reo_desc);
  748. }
  749. /**
  750. * hal_gen_reo_remap_val_generic_li() - Generate the reo map value
  751. * @ix0_map: mapping values for reo
  752. *
  753. * Return: IX0 reo remap register value to be written
  754. */
  755. static uint32_t
  756. hal_gen_reo_remap_val_generic_li(enum hal_reo_remap_reg remap_reg,
  757. uint8_t *ix0_map)
  758. {
  759. uint32_t ix_val = 0;
  760. switch (remap_reg) {
  761. case HAL_REO_REMAP_REG_IX0:
  762. ix_val = HAL_REO_REMAP_IX0(ix0_map[0], 0) |
  763. HAL_REO_REMAP_IX0(ix0_map[1], 1) |
  764. HAL_REO_REMAP_IX0(ix0_map[2], 2) |
  765. HAL_REO_REMAP_IX0(ix0_map[3], 3) |
  766. HAL_REO_REMAP_IX0(ix0_map[4], 4) |
  767. HAL_REO_REMAP_IX0(ix0_map[5], 5) |
  768. HAL_REO_REMAP_IX0(ix0_map[6], 6) |
  769. HAL_REO_REMAP_IX0(ix0_map[7], 7);
  770. break;
  771. case HAL_REO_REMAP_REG_IX2:
  772. ix_val = HAL_REO_REMAP_IX2(ix0_map[0], 16) |
  773. HAL_REO_REMAP_IX2(ix0_map[1], 17) |
  774. HAL_REO_REMAP_IX2(ix0_map[2], 18) |
  775. HAL_REO_REMAP_IX2(ix0_map[3], 19) |
  776. HAL_REO_REMAP_IX2(ix0_map[4], 20) |
  777. HAL_REO_REMAP_IX2(ix0_map[5], 21) |
  778. HAL_REO_REMAP_IX2(ix0_map[6], 22) |
  779. HAL_REO_REMAP_IX2(ix0_map[7], 23);
  780. break;
  781. default:
  782. break;
  783. }
  784. return ix_val;
  785. }
  786. /**
  787. * hal_rx_tlv_csum_err_get_li() - Get IP and tcp-udp checksum fail flag
  788. * @rx_tlv_hdr: start address of rx_tlv_hdr
  789. * @ip_csum_err: buffer to return ip_csum_fail flag
  790. * @tcp_udp_csum_fail: placeholder to return tcp-udp checksum fail flag
  791. *
  792. * Return: None
  793. */
  794. static inline void
  795. hal_rx_tlv_csum_err_get_li(uint8_t *rx_tlv_hdr, uint32_t *ip_csum_err,
  796. uint32_t *tcp_udp_csum_err)
  797. {
  798. *ip_csum_err = hal_rx_attn_ip_cksum_fail_get(rx_tlv_hdr);
  799. *tcp_udp_csum_err = hal_rx_attn_tcp_udp_cksum_fail_get(rx_tlv_hdr);
  800. }
  801. static
  802. void hal_rx_tlv_get_pkt_capture_flags_li(uint8_t *rx_tlv_pkt_hdr,
  803. struct hal_rx_pkt_capture_flags *flags)
  804. {
  805. struct rx_pkt_tlvs *rx_tlv_hdr = (struct rx_pkt_tlvs *)rx_tlv_pkt_hdr;
  806. struct rx_attention *rx_attn = &rx_tlv_hdr->attn_tlv.rx_attn;
  807. struct rx_mpdu_start *mpdu_start =
  808. &rx_tlv_hdr->mpdu_start_tlv.rx_mpdu_start;
  809. struct rx_mpdu_end *mpdu_end = &rx_tlv_hdr->mpdu_end_tlv.rx_mpdu_end;
  810. struct rx_msdu_start *msdu_start =
  811. &rx_tlv_hdr->msdu_start_tlv.rx_msdu_start;
  812. flags->encrypt_type = mpdu_start->rx_mpdu_info_details.encrypt_type;
  813. flags->fcs_err = mpdu_end->fcs_err;
  814. flags->fragment_flag = rx_attn->fragment_flag;
  815. flags->chan_freq = HAL_RX_MSDU_START_FREQ_GET(msdu_start);
  816. flags->rssi_comb = HAL_RX_MSDU_START_RSSI_GET(msdu_start);
  817. flags->tsft = msdu_start->ppdu_start_timestamp;
  818. }
  819. static uint8_t hal_rx_err_status_get_li(hal_ring_desc_t rx_desc)
  820. {
  821. return HAL_RX_ERROR_STATUS_GET(rx_desc);
  822. }
  823. static uint8_t hal_rx_reo_buf_type_get_li(hal_ring_desc_t rx_desc)
  824. {
  825. return HAL_RX_REO_BUF_TYPE_GET(rx_desc);
  826. }
  827. static inline bool
  828. hal_rx_mpdu_info_ampdu_flag_get_li(uint8_t *buf)
  829. {
  830. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  831. struct rx_mpdu_start *mpdu_start =
  832. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  833. struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
  834. bool ampdu_flag;
  835. ampdu_flag = HAL_RX_MPDU_INFO_AMPDU_FLAG_GET(mpdu_info);
  836. return ampdu_flag;
  837. }
  838. static
  839. uint32_t hal_rx_tlv_mpdu_len_err_get_li(void *hw_desc_addr)
  840. {
  841. struct rx_attention *rx_attn;
  842. struct rx_mon_pkt_tlvs *rx_desc =
  843. (struct rx_mon_pkt_tlvs *)hw_desc_addr;
  844. rx_attn = &rx_desc->attn_tlv.rx_attn;
  845. return HAL_RX_GET(rx_attn, RX_ATTENTION_1, MPDU_LENGTH_ERR);
  846. }
  847. static
  848. uint32_t hal_rx_tlv_mpdu_fcs_err_get_li(void *hw_desc_addr)
  849. {
  850. struct rx_attention *rx_attn;
  851. struct rx_mon_pkt_tlvs *rx_desc =
  852. (struct rx_mon_pkt_tlvs *)hw_desc_addr;
  853. rx_attn = &rx_desc->attn_tlv.rx_attn;
  854. return HAL_RX_GET(rx_attn, RX_ATTENTION_1, FCS_ERR);
  855. }
  856. #ifdef NO_RX_PKT_HDR_TLV
  857. static uint8_t *hal_rx_desc_get_80211_hdr_li(void *hw_desc_addr)
  858. {
  859. uint8_t *rx_pkt_hdr;
  860. struct rx_mon_pkt_tlvs *rx_desc =
  861. (struct rx_mon_pkt_tlvs *)hw_desc_addr;
  862. rx_pkt_hdr = &rx_desc->pkt_hdr_tlv.rx_pkt_hdr[0];
  863. return rx_pkt_hdr;
  864. }
  865. #else
  866. static uint8_t *hal_rx_desc_get_80211_hdr_li(void *hw_desc_addr)
  867. {
  868. uint8_t *rx_pkt_hdr;
  869. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  870. rx_pkt_hdr = &rx_desc->pkt_hdr_tlv.rx_pkt_hdr[0];
  871. return rx_pkt_hdr;
  872. }
  873. #endif
  874. static uint32_t hal_rx_hw_desc_mpdu_user_id_li(void *hw_desc_addr)
  875. {
  876. struct rx_mon_pkt_tlvs *rx_desc =
  877. (struct rx_mon_pkt_tlvs *)hw_desc_addr;
  878. uint32_t user_id;
  879. user_id = HAL_RX_GET_USER_TLV32_USERID(
  880. &rx_desc->mpdu_start_tlv);
  881. return user_id;
  882. }
  883. /**
  884. * hal_rx_msdu_start_msdu_len_set_li(): API to set the MSDU length
  885. * from rx_msdu_start TLV
  886. *
  887. * @buf: pointer to the start of RX PKT TLV headers
  888. * @len: msdu length
  889. *
  890. * Return: none
  891. */
  892. static inline void
  893. hal_rx_msdu_start_msdu_len_set_li(uint8_t *buf, uint32_t len)
  894. {
  895. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  896. struct rx_msdu_start *msdu_start =
  897. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  898. void *wrd1;
  899. wrd1 = (uint8_t *)msdu_start + RX_MSDU_START_1_MSDU_LENGTH_OFFSET;
  900. *(uint32_t *)wrd1 &= (~RX_MSDU_START_1_MSDU_LENGTH_MASK);
  901. *(uint32_t *)wrd1 |= len;
  902. }
  903. /**
  904. * hal_hw_txrx_default_ops_attach_be() - Attach the default hal ops for
  905. * lithium chipsets.
  906. * @hal_soc_hdl: HAL soc handle
  907. *
  908. * Return: None
  909. */
  910. void hal_hw_txrx_default_ops_attach_li(struct hal_soc *hal_soc)
  911. {
  912. hal_soc->ops->hal_set_link_desc_addr = hal_set_link_desc_addr_li;
  913. hal_soc->ops->hal_tx_init_data_ring = hal_tx_init_data_ring_li;
  914. hal_soc->ops->hal_get_ba_aging_timeout = hal_get_ba_aging_timeout_li;
  915. hal_soc->ops->hal_set_ba_aging_timeout = hal_set_ba_aging_timeout_li;
  916. hal_soc->ops->hal_get_reo_reg_base_offset =
  917. hal_get_reo_reg_base_offset_li;
  918. hal_soc->ops->hal_setup_link_idle_list =
  919. hal_setup_link_idle_list_generic_li;
  920. hal_soc->ops->hal_rx_get_tlv_size = hal_rx_get_tlv_size_generic_li;
  921. hal_soc->ops->hal_rx_msdu_is_wlan_mcast =
  922. hal_rx_msdu_is_wlan_mcast_generic_li;
  923. hal_soc->ops->hal_rx_tlv_decap_format_get =
  924. hal_rx_tlv_decap_format_get_li;
  925. hal_soc->ops->hal_rx_dump_pkt_tlvs = hal_rx_dump_pkt_tlvs_li;
  926. hal_soc->ops->hal_rx_tlv_get_offload_info =
  927. hal_rx_tlv_get_offload_info_li;
  928. hal_soc->ops->hal_rx_tlv_phy_ppdu_id_get =
  929. hal_rx_attn_phy_ppdu_id_get_li;
  930. hal_soc->ops->hal_rx_tlv_msdu_done_get = hal_rx_attn_msdu_done_get_li;
  931. hal_soc->ops->hal_rx_tlv_msdu_len_get =
  932. hal_rx_msdu_start_msdu_len_get_li;
  933. hal_soc->ops->hal_rx_get_frame_ctrl_field =
  934. hal_rx_get_frame_ctrl_field_li;
  935. hal_soc->ops->hal_rx_get_proto_params = hal_rx_get_proto_params_li;
  936. hal_soc->ops->hal_rx_get_l3_l4_offsets = hal_rx_get_l3_l4_offsets_li;
  937. hal_soc->ops->hal_rx_buf_cookie_rbm_get = hal_rx_buf_cookie_rbm_get_li;
  938. hal_soc->ops->hal_rx_ret_buf_manager_get =
  939. hal_rx_ret_buf_manager_get_li;
  940. hal_soc->ops->hal_rxdma_buff_addr_info_set =
  941. hal_rxdma_buff_addr_info_set_li;
  942. hal_soc->ops->hal_rx_msdu_flags_get = hal_rx_msdu_flags_get_li;
  943. hal_soc->ops->hal_rx_get_reo_error_code = hal_rx_get_reo_error_code_li;
  944. hal_soc->ops->hal_gen_reo_remap_val =
  945. hal_gen_reo_remap_val_generic_li;
  946. hal_soc->ops->hal_rx_tlv_csum_err_get =
  947. hal_rx_tlv_csum_err_get_li;
  948. hal_soc->ops->hal_rx_mpdu_desc_info_get =
  949. hal_rx_mpdu_desc_info_get_li;
  950. hal_soc->ops->hal_rx_err_status_get = hal_rx_err_status_get_li;
  951. hal_soc->ops->hal_rx_reo_buf_type_get = hal_rx_reo_buf_type_get_li;
  952. hal_soc->ops->hal_rx_pkt_hdr_get = hal_rx_pkt_hdr_get_li;
  953. hal_soc->ops->hal_rx_wbm_err_src_get = hal_rx_wbm_err_src_get_li;
  954. hal_soc->ops->hal_rx_priv_info_set_in_tlv =
  955. hal_rx_priv_info_set_in_tlv_li;
  956. hal_soc->ops->hal_rx_priv_info_get_from_tlv =
  957. hal_rx_priv_info_get_from_tlv_li;
  958. hal_soc->ops->hal_rx_mpdu_info_ampdu_flag_get =
  959. hal_rx_mpdu_info_ampdu_flag_get_li;
  960. hal_soc->ops->hal_rx_tlv_mpdu_len_err_get =
  961. hal_rx_tlv_mpdu_len_err_get_li;
  962. hal_soc->ops->hal_rx_tlv_mpdu_fcs_err_get =
  963. hal_rx_tlv_mpdu_fcs_err_get_li;
  964. hal_soc->ops->hal_reo_send_cmd = hal_reo_send_cmd_li;
  965. hal_soc->ops->hal_reo_queue_stats_status =
  966. hal_reo_queue_stats_status_li;
  967. hal_soc->ops->hal_reo_flush_queue_status =
  968. hal_reo_flush_queue_status_li;
  969. hal_soc->ops->hal_reo_flush_cache_status =
  970. hal_reo_flush_cache_status_li;
  971. hal_soc->ops->hal_reo_unblock_cache_status =
  972. hal_reo_unblock_cache_status_li;
  973. hal_soc->ops->hal_reo_flush_timeout_list_status =
  974. hal_reo_flush_timeout_list_status_li;
  975. hal_soc->ops->hal_reo_desc_thres_reached_status =
  976. hal_reo_desc_thres_reached_status_li;
  977. hal_soc->ops->hal_reo_rx_update_queue_status =
  978. hal_reo_rx_update_queue_status_li;
  979. hal_soc->ops->hal_rx_tlv_get_pkt_capture_flags =
  980. hal_rx_tlv_get_pkt_capture_flags_li;
  981. hal_soc->ops->hal_rx_desc_get_80211_hdr = hal_rx_desc_get_80211_hdr_li;
  982. hal_soc->ops->hal_rx_hw_desc_mpdu_user_id =
  983. hal_rx_hw_desc_mpdu_user_id_li;
  984. hal_soc->ops->hal_reo_qdesc_setup = hal_reo_qdesc_setup_li;
  985. hal_soc->ops->hal_rx_tlv_msdu_len_set =
  986. hal_rx_msdu_start_msdu_len_set_li;
  987. }