hal_li_generic_api.c 36 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214
  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. static uint32_t hal_get_reo_qdesc_size_li(uint32_t ba_window_size, int tid)
  26. {
  27. /* Return descriptor size corresponding to window size of 2 since
  28. * we set ba_window_size to 2 while setting up REO descriptors as
  29. * a WAR to get 2k jump exception aggregates are received without
  30. * a BA session.
  31. */
  32. if (ba_window_size <= 1) {
  33. if (tid != HAL_NON_QOS_TID)
  34. return sizeof(struct rx_reo_queue) +
  35. sizeof(struct rx_reo_queue_ext);
  36. else
  37. return sizeof(struct rx_reo_queue);
  38. }
  39. if (ba_window_size <= 105)
  40. return sizeof(struct rx_reo_queue) +
  41. sizeof(struct rx_reo_queue_ext);
  42. if (ba_window_size <= 210)
  43. return sizeof(struct rx_reo_queue) +
  44. (2 * sizeof(struct rx_reo_queue_ext));
  45. return sizeof(struct rx_reo_queue) +
  46. (3 * sizeof(struct rx_reo_queue_ext));
  47. }
  48. void hal_set_link_desc_addr_li(void *desc, uint32_t cookie,
  49. qdf_dma_addr_t link_desc_paddr)
  50. {
  51. uint32_t *buf_addr = (uint32_t *)desc;
  52. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO_0, BUFFER_ADDR_31_0,
  53. link_desc_paddr & 0xffffffff);
  54. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO_1, BUFFER_ADDR_39_32,
  55. (uint64_t)link_desc_paddr >> 32);
  56. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO_1, RETURN_BUFFER_MANAGER,
  57. WBM_IDLE_DESC_LIST);
  58. HAL_DESC_SET_FIELD(buf_addr, BUFFER_ADDR_INFO_1, SW_BUFFER_COOKIE,
  59. cookie);
  60. }
  61. void hal_tx_init_data_ring_li(hal_soc_handle_t hal_soc_hdl,
  62. hal_ring_handle_t hal_ring_hdl)
  63. {
  64. uint8_t *desc_addr;
  65. struct hal_srng_params srng_params;
  66. uint32_t desc_size;
  67. uint32_t num_desc;
  68. hal_get_srng_params(hal_soc_hdl, hal_ring_hdl, &srng_params);
  69. desc_addr = (uint8_t *)srng_params.ring_base_vaddr;
  70. desc_size = sizeof(struct tcl_data_cmd);
  71. num_desc = srng_params.num_entries;
  72. while (num_desc) {
  73. HAL_TX_DESC_SET_TLV_HDR(desc_addr, HAL_TX_TCL_DATA_TAG,
  74. desc_size);
  75. desc_addr += (desc_size + sizeof(struct tlv_32_hdr));
  76. num_desc--;
  77. }
  78. }
  79. /*
  80. * hal_rx_msdu_is_wlan_mcast_generic_li(): Check if the buffer is for multicast
  81. * address
  82. * @nbuf: Network buffer
  83. *
  84. * Returns: flag to indicate whether the nbuf has MC/BC address
  85. */
  86. static uint32_t hal_rx_msdu_is_wlan_mcast_generic_li(qdf_nbuf_t nbuf)
  87. {
  88. uint8_t *buf = qdf_nbuf_data(nbuf);
  89. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  90. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  91. return rx_attn->mcast_bcast;
  92. }
  93. /**
  94. * hal_rx_tlv_decap_format_get_li() - Get packet decap format from the TLV
  95. * @hw_desc_addr: rx tlv desc
  96. *
  97. * Return: pkt decap format
  98. */
  99. static uint32_t hal_rx_tlv_decap_format_get_li(void *hw_desc_addr)
  100. {
  101. struct rx_msdu_start *rx_msdu_start;
  102. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  103. rx_msdu_start = &rx_desc->msdu_start_tlv.rx_msdu_start;
  104. return HAL_RX_GET(rx_msdu_start, RX_MSDU_START_2, DECAP_FORMAT);
  105. }
  106. /**
  107. * hal_rx_dump_pkt_tlvs_li(): API to print all member elements of
  108. * RX TLVs
  109. * @ buf: pointer the pkt buffer.
  110. * @ dbg_level: log level.
  111. *
  112. * Return: void
  113. */
  114. static void hal_rx_dump_pkt_tlvs_li(hal_soc_handle_t hal_soc_hdl,
  115. uint8_t *buf, uint8_t dbg_level)
  116. {
  117. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  118. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  119. struct rx_mpdu_start *mpdu_start =
  120. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  121. struct rx_msdu_start *msdu_start =
  122. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  123. struct rx_mpdu_end *mpdu_end = &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
  124. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  125. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  126. hal_rx_dump_rx_attention_tlv(rx_attn, dbg_level);
  127. hal_rx_dump_mpdu_start_tlv(mpdu_start, dbg_level, hal_soc);
  128. hal_rx_dump_msdu_start_tlv(hal_soc, msdu_start, dbg_level);
  129. hal_rx_dump_mpdu_end_tlv(mpdu_end, dbg_level);
  130. hal_rx_dump_msdu_end_tlv(hal_soc, msdu_end, dbg_level);
  131. hal_rx_dump_pkt_hdr_tlv(pkt_tlvs, dbg_level);
  132. }
  133. /**
  134. * hal_rx_tlv_get_offload_info_li() - Get the offload info from TLV
  135. * @rx_tlv: RX tlv start address in buffer
  136. * @offload_info: Buffer to store the offload info
  137. *
  138. * Return: 0 on success, -EINVAL on failure.
  139. */
  140. static int
  141. hal_rx_tlv_get_offload_info_li(uint8_t *rx_tlv,
  142. struct hal_offload_info *offload_info)
  143. {
  144. offload_info->flow_id = HAL_RX_TLV_GET_FLOW_ID_TOEPLITZ(rx_tlv);
  145. offload_info->ipv6_proto = HAL_RX_TLV_GET_IPV6(rx_tlv);
  146. offload_info->lro_eligible = HAL_RX_TLV_GET_LRO_ELIGIBLE(rx_tlv);
  147. offload_info->tcp_proto = HAL_RX_TLV_GET_TCP_PROTO(rx_tlv);
  148. if (offload_info->tcp_proto) {
  149. offload_info->tcp_pure_ack =
  150. HAL_RX_TLV_GET_TCP_PURE_ACK(rx_tlv);
  151. offload_info->tcp_offset = HAL_RX_TLV_GET_TCP_OFFSET(rx_tlv);
  152. offload_info->tcp_win = HAL_RX_TLV_GET_TCP_WIN(rx_tlv);
  153. offload_info->tcp_seq_num = HAL_RX_TLV_GET_TCP_SEQ(rx_tlv);
  154. offload_info->tcp_ack_num = HAL_RX_TLV_GET_TCP_ACK(rx_tlv);
  155. }
  156. return 0;
  157. }
  158. /*
  159. * hal_rx_attn_phy_ppdu_id_get(): get phy_ppdu_id value
  160. * from rx attention
  161. * @buf: pointer to rx_pkt_tlvs
  162. *
  163. * Return: phy_ppdu_id
  164. */
  165. static uint16_t hal_rx_attn_phy_ppdu_id_get_li(uint8_t *buf)
  166. {
  167. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  168. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  169. uint16_t phy_ppdu_id;
  170. phy_ppdu_id = HAL_RX_ATTN_PHY_PPDU_ID_GET(rx_attn);
  171. return phy_ppdu_id;
  172. }
  173. /**
  174. * hal_rx_msdu_start_msdu_len_get(): API to get the MSDU length
  175. * from rx_msdu_start TLV
  176. *
  177. * @ buf: pointer to the start of RX PKT TLV headers
  178. * Return: msdu length
  179. */
  180. static uint32_t hal_rx_msdu_start_msdu_len_get_li(uint8_t *buf)
  181. {
  182. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  183. struct rx_msdu_start *msdu_start =
  184. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  185. uint32_t msdu_len;
  186. msdu_len = HAL_RX_MSDU_START_MSDU_LEN_GET(msdu_start);
  187. return msdu_len;
  188. }
  189. /**
  190. * hal_rx_get_frame_ctrl_field(): Function to retrieve frame control field
  191. *
  192. * @nbuf: Network buffer
  193. * Returns: rx more fragment bit
  194. *
  195. */
  196. static uint16_t hal_rx_get_frame_ctrl_field_li(uint8_t *buf)
  197. {
  198. struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf);
  199. struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs);
  200. uint16_t frame_ctrl = 0;
  201. frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_mpdu_info);
  202. return frame_ctrl;
  203. }
  204. /**
  205. * hal_rx_get_proto_params_li() - Get l4 proto values from TLV
  206. * @buf: rx tlv address
  207. * @proto_params: Buffer to store proto parameters
  208. *
  209. * Return: 0 on success.
  210. */
  211. static int hal_rx_get_proto_params_li(uint8_t *buf, void *proto_params)
  212. {
  213. struct hal_proto_params *param =
  214. (struct hal_proto_params *)proto_params;
  215. param->tcp_proto = HAL_RX_TLV_GET_IP_OFFSET(buf);
  216. param->udp_proto = HAL_RX_TLV_GET_UDP_PROTO(buf);
  217. param->ipv6_proto = HAL_RX_TLV_GET_IPV6(buf);
  218. return 0;
  219. }
  220. /**
  221. * hal_rx_get_l3_l4_offsets_li() - Get l3/l4 header offset from TLV
  222. * @buf: rx tlv start address
  223. * @l3_hdr_offset: buffer to store l3 offset
  224. * @l4_hdr_offset: buffer to store l4 offset
  225. *
  226. * Return: 0 on success.
  227. */
  228. static int hal_rx_get_l3_l4_offsets_li(uint8_t *buf, uint32_t *l3_hdr_offset,
  229. uint32_t *l4_hdr_offset)
  230. {
  231. *l3_hdr_offset = HAL_RX_TLV_GET_IP_OFFSET(buf);
  232. *l4_hdr_offset = HAL_RX_TLV_GET_TCP_OFFSET(buf);
  233. return 0;
  234. }
  235. /**
  236. * hal_rx_tlv_get_pn_num_li() - Get packet number from RX TLV
  237. * @buf: rx tlv address
  238. * @pn_num: buffer to store packet number
  239. *
  240. * Return: None
  241. */
  242. static inline void hal_rx_tlv_get_pn_num_li(uint8_t *buf, uint64_t *pn_num)
  243. {
  244. struct rx_pkt_tlvs *rx_pkt_tlv =
  245. (struct rx_pkt_tlvs *)buf;
  246. struct rx_mpdu_info *rx_mpdu_info_details =
  247. &rx_pkt_tlv->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
  248. pn_num[0] = rx_mpdu_info_details->pn_31_0;
  249. pn_num[0] |=
  250. ((uint64_t)rx_mpdu_info_details->pn_63_32 << 32);
  251. pn_num[1] = rx_mpdu_info_details->pn_95_64;
  252. pn_num[1] |=
  253. ((uint64_t)rx_mpdu_info_details->pn_127_96 << 32);
  254. }
  255. #ifdef NO_RX_PKT_HDR_TLV
  256. /**
  257. * hal_rx_pkt_hdr_get_li() - Get rx packet header start address.
  258. * @buf: packet start address
  259. *
  260. * Return: packet data start address.
  261. */
  262. static inline uint8_t *hal_rx_pkt_hdr_get_li(uint8_t *buf)
  263. {
  264. return buf + RX_PKT_TLVS_LEN;
  265. }
  266. #else
  267. static inline uint8_t *hal_rx_pkt_hdr_get_li(uint8_t *buf)
  268. {
  269. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  270. return pkt_tlvs->pkt_hdr_tlv.rx_pkt_hdr;
  271. }
  272. #endif
  273. /**
  274. * hal_rx_priv_info_set_in_tlv_li(): Save the private info to
  275. * the reserved bytes of rx_tlv_hdr
  276. * @buf: start of rx_tlv_hdr
  277. * @priv_data: hal_wbm_err_desc_info structure
  278. * @len: length of the private data
  279. * Return: void
  280. */
  281. static inline void
  282. hal_rx_priv_info_set_in_tlv_li(uint8_t *buf, uint8_t *priv_data,
  283. uint32_t len)
  284. {
  285. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  286. uint32_t copy_len = (len > RX_PADDING0_BYTES) ?
  287. RX_PADDING0_BYTES : len;
  288. qdf_mem_copy(pkt_tlvs->rx_padding0, priv_data, copy_len);
  289. }
  290. /**
  291. * hal_rx_priv_info_get_from_tlv_li(): retrieve the private data from
  292. * the reserved bytes of rx_tlv_hdr.
  293. * @buf: start of rx_tlv_hdr
  294. * @priv_data: hal_wbm_err_desc_info structure
  295. * @len: length of the private data
  296. * Return: void
  297. */
  298. static inline void
  299. hal_rx_priv_info_get_from_tlv_li(uint8_t *buf, uint8_t *priv_data,
  300. uint32_t len)
  301. {
  302. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  303. uint32_t copy_len = (len > RX_PADDING0_BYTES) ?
  304. RX_PADDING0_BYTES : len;
  305. qdf_mem_copy(priv_data, pkt_tlvs->rx_padding0, copy_len);
  306. }
  307. /**
  308. * hal_rx_get_tlv_size_generic_li() - Get rx packet tlv size
  309. * @rx_pkt_tlv_size: TLV size for regular RX packets
  310. * @rx_mon_pkt_tlv_size: TLV size for monitor mode packets
  311. *
  312. * Return: size of rx pkt tlv before the actual data
  313. */
  314. static void hal_rx_get_tlv_size_generic_li(uint16_t *rx_pkt_tlv_size,
  315. uint16_t *rx_mon_pkt_tlv_size)
  316. {
  317. *rx_pkt_tlv_size = RX_PKT_TLVS_LEN;
  318. *rx_mon_pkt_tlv_size = SIZE_OF_MONITOR_TLV;
  319. }
  320. /**
  321. * hal_rx_wbm_err_src_get_li() - Get WBM error source from descriptor
  322. * @ring_desc: ring descriptor
  323. *
  324. * Return: wbm error source
  325. */
  326. uint32_t hal_rx_wbm_err_src_get_li(hal_ring_desc_t ring_desc)
  327. {
  328. return HAL_WBM2SW_RELEASE_SRC_GET(ring_desc);
  329. }
  330. /**
  331. * hal_rx_ret_buf_manager_get_li() - Get return buffer manager from ring desc
  332. * @ring_desc: ring descriptor
  333. *
  334. * Return: rbm
  335. */
  336. uint8_t hal_rx_ret_buf_manager_get_li(hal_ring_desc_t ring_desc)
  337. {
  338. /*
  339. * The following macro takes buf_addr_info as argument,
  340. * but since buf_addr_info is the first field in ring_desc
  341. * Hence the following call is OK
  342. */
  343. return HAL_RX_BUF_RBM_GET(ring_desc);
  344. }
  345. /**
  346. * hal_rx_reo_buf_paddr_get_li: Gets the physical address and
  347. * cookie from the REO destination ring element
  348. *
  349. * @ rx_desc: Opaque cookie pointer used by HAL to get to
  350. * the current descriptor
  351. * @ buf_info: structure to return the buffer information
  352. * Return: void
  353. */
  354. static void hal_rx_reo_buf_paddr_get_li(hal_ring_desc_t rx_desc,
  355. struct hal_buf_info *buf_info)
  356. {
  357. struct reo_destination_ring *reo_ring =
  358. (struct reo_destination_ring *)rx_desc;
  359. buf_info->paddr =
  360. (HAL_RX_REO_BUFFER_ADDR_31_0_GET(reo_ring) |
  361. ((uint64_t)(HAL_RX_REO_BUFFER_ADDR_39_32_GET(reo_ring)) << 32));
  362. buf_info->sw_cookie = HAL_RX_REO_BUF_COOKIE_GET(reo_ring);
  363. }
  364. /**
  365. * hal_rx_msdu_link_desc_set_li: Retrieves MSDU Link Descriptor to WBM
  366. *
  367. * @ hal_soc_hdl : HAL version of the SOC pointer
  368. * @ src_srng_desc : void pointer to the WBM Release Ring descriptor
  369. * @ buf_addr_info : void pointer to the buffer_addr_info
  370. * @ bm_action : put in IDLE list or release to MSDU_LIST
  371. *
  372. * Return: void
  373. */
  374. /* look at implementation at dp_hw_link_desc_pool_setup()*/
  375. static void hal_rx_msdu_link_desc_set_li(hal_soc_handle_t hal_soc_hdl,
  376. void *src_srng_desc,
  377. hal_buff_addrinfo_t buf_addr_info,
  378. uint8_t bm_action)
  379. {
  380. /*
  381. * The offsets for fields used in this function are same in
  382. * wbm_release_ring for Lithium and wbm_release_ring_tx
  383. * for Beryllium. hence we can use wbm_release_ring directly.
  384. */
  385. struct wbm_release_ring *wbm_rel_srng =
  386. (struct wbm_release_ring *)src_srng_desc;
  387. uint32_t addr_31_0;
  388. uint8_t addr_39_32;
  389. /* Structure copy !!! */
  390. wbm_rel_srng->released_buff_or_desc_addr_info =
  391. *(struct buffer_addr_info *)buf_addr_info;
  392. addr_31_0 =
  393. wbm_rel_srng->released_buff_or_desc_addr_info.buffer_addr_31_0;
  394. addr_39_32 =
  395. wbm_rel_srng->released_buff_or_desc_addr_info.buffer_addr_39_32;
  396. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING,
  397. RELEASE_SOURCE_MODULE, HAL_RX_WBM_ERR_SRC_SW);
  398. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING, BM_ACTION,
  399. bm_action);
  400. HAL_DESC_SET_FIELD(src_srng_desc, HAL_SW2WBM_RELEASE_RING,
  401. BUFFER_OR_DESC_TYPE,
  402. HAL_RX_WBM_BUF_TYPE_MSDU_LINK_DESC);
  403. /* WBM error is indicated when any of the link descriptors given to
  404. * WBM has a NULL address, and one those paths is the link descriptors
  405. * released from host after processing RXDMA errors,
  406. * or from Rx defrag path, and we want to add an assert here to ensure
  407. * host is not releasing descriptors with NULL address.
  408. */
  409. if (qdf_unlikely(!addr_31_0 && !addr_39_32)) {
  410. hal_dump_wbm_rel_desc(src_srng_desc);
  411. qdf_assert_always(0);
  412. }
  413. }
  414. static
  415. void hal_rx_buf_cookie_rbm_get_li(uint32_t *buf_addr_info_hdl,
  416. hal_buf_info_t buf_info_hdl)
  417. {
  418. struct hal_buf_info *buf_info =
  419. (struct hal_buf_info *)buf_info_hdl;
  420. struct buffer_addr_info *buf_addr_info =
  421. (struct buffer_addr_info *)buf_addr_info_hdl;
  422. buf_info->sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
  423. /*
  424. * buffer addr info is the first member of ring desc, so the typecast
  425. * can be done.
  426. */
  427. buf_info->rbm = hal_rx_ret_buf_manager_get_li
  428. ((hal_ring_desc_t)buf_addr_info);
  429. }
  430. /**
  431. * hal_rx_msdu_link_desc_get(): API to get the MSDU information
  432. * from the MSDU link descriptor
  433. *
  434. * @ hal_soc_hdl : HAL version of the SOC pointer
  435. * @msdu_link_desc: Opaque pointer used by HAL to get to the
  436. * MSDU link descriptor (struct rx_msdu_link)
  437. *
  438. * @msdu_list: Return the list of MSDUs contained in this link descriptor
  439. *
  440. * @num_msdus: Number of MSDUs in the MPDU
  441. *
  442. * Return: void
  443. */
  444. static inline void hal_rx_msdu_list_get_li(hal_soc_handle_t hal_soc_hdl,
  445. void *msdu_link_desc,
  446. void *hal_msdu_list,
  447. uint16_t *num_msdus)
  448. {
  449. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  450. struct rx_msdu_details *msdu_details;
  451. struct rx_msdu_desc_info *msdu_desc_info;
  452. struct hal_rx_msdu_list *msdu_list = hal_msdu_list;
  453. struct rx_msdu_link *msdu_link = (struct rx_msdu_link *)msdu_link_desc;
  454. int i;
  455. struct hal_buf_info buf_info;
  456. msdu_details = hal_rx_link_desc_msdu0_ptr(msdu_link, hal_soc);
  457. hal_debug("msdu_link=%pK msdu_details=%pK", msdu_link, msdu_details);
  458. for (i = 0; i < HAL_RX_NUM_MSDU_DESC; i++) {
  459. /* num_msdus received in mpdu descriptor may be incorrect
  460. * sometimes due to HW issue. Check msdu buffer address also
  461. */
  462. if (!i && (HAL_RX_BUFFER_ADDR_31_0_GET(
  463. &msdu_details[i].buffer_addr_info_details) == 0))
  464. break;
  465. if (HAL_RX_BUFFER_ADDR_31_0_GET(
  466. &msdu_details[i].buffer_addr_info_details) == 0) {
  467. /* set the last msdu bit in the prev msdu_desc_info */
  468. msdu_desc_info =
  469. hal_rx_msdu_desc_info_get_ptr
  470. (&msdu_details[i - 1], hal_soc);
  471. HAL_RX_LAST_MSDU_IN_MPDU_FLAG_SET(msdu_desc_info, 1);
  472. break;
  473. }
  474. msdu_desc_info = hal_rx_msdu_desc_info_get_ptr(&msdu_details[i],
  475. hal_soc);
  476. /* set first MSDU bit or the last MSDU bit */
  477. if (!i)
  478. HAL_RX_FIRST_MSDU_IN_MPDU_FLAG_SET(msdu_desc_info, 1);
  479. else if (i == (HAL_RX_NUM_MSDU_DESC - 1))
  480. HAL_RX_LAST_MSDU_IN_MPDU_FLAG_SET(msdu_desc_info, 1);
  481. msdu_list->msdu_info[i].msdu_flags =
  482. hal_rx_msdu_flags_get(hal_soc_hdl, msdu_desc_info);
  483. msdu_list->msdu_info[i].msdu_len =
  484. HAL_RX_MSDU_PKT_LENGTH_GET(msdu_desc_info);
  485. /* addr field in buf_info will not be valid */
  486. hal_rx_buf_cookie_rbm_get_li(
  487. (uint32_t *)
  488. &msdu_details[i].buffer_addr_info_details,
  489. &buf_info);
  490. msdu_list->sw_cookie[i] = buf_info.sw_cookie;
  491. msdu_list->rbm[i] = buf_info.rbm;
  492. msdu_list->paddr[i] = HAL_RX_BUFFER_ADDR_31_0_GET(
  493. &msdu_details[i].buffer_addr_info_details) |
  494. (uint64_t)HAL_RX_BUFFER_ADDR_39_32_GET(
  495. &msdu_details[i].buffer_addr_info_details) << 32;
  496. hal_debug("i=%d sw_cookie=%d", i, msdu_list->sw_cookie[i]);
  497. }
  498. *num_msdus = i;
  499. }
  500. /*
  501. * hal_rxdma_buff_addr_info_set() - set the buffer_addr_info of the
  502. * rxdma ring entry.
  503. * @rxdma_entry: descriptor entry
  504. * @paddr: physical address of nbuf data pointer.
  505. * @cookie: SW cookie used as a index to SW rx desc.
  506. * @manager: who owns the nbuf (host, NSS, etc...).
  507. *
  508. */
  509. static void hal_rxdma_buff_addr_info_set_li(void *rxdma_entry,
  510. qdf_dma_addr_t paddr, uint32_t cookie, uint8_t manager)
  511. {
  512. uint32_t paddr_lo = ((u64)paddr & 0x00000000ffffffff);
  513. uint32_t paddr_hi = ((u64)paddr & 0xffffffff00000000) >> 32;
  514. HAL_RXDMA_PADDR_LO_SET(rxdma_entry, paddr_lo);
  515. HAL_RXDMA_PADDR_HI_SET(rxdma_entry, paddr_hi);
  516. HAL_RXDMA_COOKIE_SET(rxdma_entry, cookie);
  517. HAL_RXDMA_MANAGER_SET(rxdma_entry, manager);
  518. }
  519. /**
  520. * hal_rx_get_reo_error_code_li() - Get REO error code from ring desc
  521. * @rx_desc: rx descriptor
  522. *
  523. * Return: REO error code
  524. */
  525. static uint32_t hal_rx_get_reo_error_code_li(hal_ring_desc_t rx_desc)
  526. {
  527. struct reo_destination_ring *reo_desc =
  528. (struct reo_destination_ring *)rx_desc;
  529. return HAL_RX_REO_ERROR_GET(reo_desc);
  530. }
  531. /**
  532. * hal_gen_reo_remap_val_generic_li() - Generate the reo map value
  533. * @ix0_map: mapping values for reo
  534. *
  535. * Return: IX0 reo remap register value to be written
  536. */
  537. static uint32_t
  538. hal_gen_reo_remap_val_generic_li(enum hal_reo_remap_reg remap_reg,
  539. uint8_t *ix0_map)
  540. {
  541. uint32_t ix_val = 0;
  542. switch (remap_reg) {
  543. case HAL_REO_REMAP_REG_IX0:
  544. ix_val = HAL_REO_REMAP_IX0(ix0_map[0], 0) |
  545. HAL_REO_REMAP_IX0(ix0_map[1], 1) |
  546. HAL_REO_REMAP_IX0(ix0_map[2], 2) |
  547. HAL_REO_REMAP_IX0(ix0_map[3], 3) |
  548. HAL_REO_REMAP_IX0(ix0_map[4], 4) |
  549. HAL_REO_REMAP_IX0(ix0_map[5], 5) |
  550. HAL_REO_REMAP_IX0(ix0_map[6], 6) |
  551. HAL_REO_REMAP_IX0(ix0_map[7], 7);
  552. break;
  553. case HAL_REO_REMAP_REG_IX2:
  554. ix_val = HAL_REO_REMAP_IX2(ix0_map[0], 16) |
  555. HAL_REO_REMAP_IX2(ix0_map[1], 17) |
  556. HAL_REO_REMAP_IX2(ix0_map[2], 18) |
  557. HAL_REO_REMAP_IX2(ix0_map[3], 19) |
  558. HAL_REO_REMAP_IX2(ix0_map[4], 20) |
  559. HAL_REO_REMAP_IX2(ix0_map[5], 21) |
  560. HAL_REO_REMAP_IX2(ix0_map[6], 22) |
  561. HAL_REO_REMAP_IX2(ix0_map[7], 23);
  562. break;
  563. default:
  564. break;
  565. }
  566. return ix_val;
  567. }
  568. /**
  569. * hal_rx_tlv_csum_err_get_li() - Get IP and tcp-udp checksum fail flag
  570. * @rx_tlv_hdr: start address of rx_tlv_hdr
  571. * @ip_csum_err: buffer to return ip_csum_fail flag
  572. * @tcp_udp_csum_fail: placeholder to return tcp-udp checksum fail flag
  573. *
  574. * Return: None
  575. */
  576. static inline void
  577. hal_rx_tlv_csum_err_get_li(uint8_t *rx_tlv_hdr, uint32_t *ip_csum_err,
  578. uint32_t *tcp_udp_csum_err)
  579. {
  580. *ip_csum_err = hal_rx_attn_ip_cksum_fail_get(rx_tlv_hdr);
  581. *tcp_udp_csum_err = hal_rx_attn_tcp_udp_cksum_fail_get(rx_tlv_hdr);
  582. }
  583. static
  584. void hal_rx_tlv_get_pkt_capture_flags_li(uint8_t *rx_tlv_pkt_hdr,
  585. struct hal_rx_pkt_capture_flags *flags)
  586. {
  587. struct rx_pkt_tlvs *rx_tlv_hdr = (struct rx_pkt_tlvs *)rx_tlv_pkt_hdr;
  588. struct rx_attention *rx_attn = &rx_tlv_hdr->attn_tlv.rx_attn;
  589. struct rx_mpdu_start *mpdu_start =
  590. &rx_tlv_hdr->mpdu_start_tlv.rx_mpdu_start;
  591. struct rx_mpdu_end *mpdu_end = &rx_tlv_hdr->mpdu_end_tlv.rx_mpdu_end;
  592. struct rx_msdu_start *msdu_start =
  593. &rx_tlv_hdr->msdu_start_tlv.rx_msdu_start;
  594. flags->encrypt_type = mpdu_start->rx_mpdu_info_details.encrypt_type;
  595. flags->fcs_err = mpdu_end->fcs_err;
  596. flags->fragment_flag = rx_attn->fragment_flag;
  597. flags->chan_freq = HAL_RX_MSDU_START_FREQ_GET(msdu_start);
  598. flags->rssi_comb = HAL_RX_MSDU_START_RSSI_GET(msdu_start);
  599. flags->tsft = msdu_start->ppdu_start_timestamp;
  600. }
  601. static uint8_t hal_rx_err_status_get_li(hal_ring_desc_t rx_desc)
  602. {
  603. return HAL_RX_ERROR_STATUS_GET(rx_desc);
  604. }
  605. static uint8_t hal_rx_reo_buf_type_get_li(hal_ring_desc_t rx_desc)
  606. {
  607. return HAL_RX_REO_BUF_TYPE_GET(rx_desc);
  608. }
  609. static inline bool
  610. hal_rx_mpdu_info_ampdu_flag_get_li(uint8_t *buf)
  611. {
  612. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  613. struct rx_mpdu_start *mpdu_start =
  614. &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start;
  615. struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details;
  616. bool ampdu_flag;
  617. ampdu_flag = HAL_RX_MPDU_INFO_AMPDU_FLAG_GET(mpdu_info);
  618. return ampdu_flag;
  619. }
  620. static
  621. uint32_t hal_rx_tlv_mpdu_len_err_get_li(void *hw_desc_addr)
  622. {
  623. struct rx_attention *rx_attn;
  624. struct rx_mon_pkt_tlvs *rx_desc =
  625. (struct rx_mon_pkt_tlvs *)hw_desc_addr;
  626. rx_attn = &rx_desc->attn_tlv.rx_attn;
  627. return HAL_RX_GET(rx_attn, RX_ATTENTION_1, MPDU_LENGTH_ERR);
  628. }
  629. static
  630. uint32_t hal_rx_tlv_mpdu_fcs_err_get_li(void *hw_desc_addr)
  631. {
  632. struct rx_attention *rx_attn;
  633. struct rx_mon_pkt_tlvs *rx_desc =
  634. (struct rx_mon_pkt_tlvs *)hw_desc_addr;
  635. rx_attn = &rx_desc->attn_tlv.rx_attn;
  636. return HAL_RX_GET(rx_attn, RX_ATTENTION_1, FCS_ERR);
  637. }
  638. #ifdef NO_RX_PKT_HDR_TLV
  639. static uint8_t *hal_rx_desc_get_80211_hdr_li(void *hw_desc_addr)
  640. {
  641. uint8_t *rx_pkt_hdr;
  642. struct rx_mon_pkt_tlvs *rx_desc =
  643. (struct rx_mon_pkt_tlvs *)hw_desc_addr;
  644. rx_pkt_hdr = &rx_desc->pkt_hdr_tlv.rx_pkt_hdr[0];
  645. return rx_pkt_hdr;
  646. }
  647. #else
  648. static uint8_t *hal_rx_desc_get_80211_hdr_li(void *hw_desc_addr)
  649. {
  650. uint8_t *rx_pkt_hdr;
  651. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  652. rx_pkt_hdr = &rx_desc->pkt_hdr_tlv.rx_pkt_hdr[0];
  653. return rx_pkt_hdr;
  654. }
  655. #endif
  656. static uint32_t hal_rx_hw_desc_mpdu_user_id_li(void *hw_desc_addr)
  657. {
  658. struct rx_mon_pkt_tlvs *rx_desc =
  659. (struct rx_mon_pkt_tlvs *)hw_desc_addr;
  660. uint32_t user_id;
  661. user_id = HAL_RX_GET_USER_TLV32_USERID(
  662. &rx_desc->mpdu_start_tlv);
  663. return user_id;
  664. }
  665. /**
  666. * hal_rx_msdu_start_msdu_len_set_li(): API to set the MSDU length
  667. * from rx_msdu_start TLV
  668. *
  669. * @buf: pointer to the start of RX PKT TLV headers
  670. * @len: msdu length
  671. *
  672. * Return: none
  673. */
  674. static inline void
  675. hal_rx_msdu_start_msdu_len_set_li(uint8_t *buf, uint32_t len)
  676. {
  677. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  678. struct rx_msdu_start *msdu_start =
  679. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  680. void *wrd1;
  681. wrd1 = (uint8_t *)msdu_start + RX_MSDU_START_1_MSDU_LENGTH_OFFSET;
  682. *(uint32_t *)wrd1 &= (~RX_MSDU_START_1_MSDU_LENGTH_MASK);
  683. *(uint32_t *)wrd1 |= len;
  684. }
  685. /*
  686. * hal_rx_tlv_bw_get_li(): API to get the Bandwidth
  687. * Interval from rx_msdu_start
  688. *
  689. * @buf: pointer to the start of RX PKT TLV header
  690. * Return: uint32_t(bw)
  691. */
  692. static inline uint32_t hal_rx_tlv_bw_get_li(uint8_t *buf)
  693. {
  694. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  695. struct rx_msdu_start *msdu_start =
  696. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  697. uint32_t bw;
  698. bw = HAL_RX_MSDU_START_BW_GET(msdu_start);
  699. return bw;
  700. }
  701. /*
  702. * hal_rx_tlv_get_freq_li(): API to get the frequency of operating channel
  703. * from rx_msdu_start
  704. *
  705. * @buf: pointer to the start of RX PKT TLV header
  706. * Return: uint32_t(frequency)
  707. */
  708. static inline uint32_t
  709. hal_rx_tlv_get_freq_li(uint8_t *buf)
  710. {
  711. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  712. struct rx_msdu_start *msdu_start =
  713. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  714. uint32_t freq;
  715. freq = HAL_RX_MSDU_START_FREQ_GET(msdu_start);
  716. return freq;
  717. }
  718. /**
  719. * hal_rx_tlv_sgi_get_li(): API to get the Short Gaurd
  720. * Interval from rx_msdu_start TLV
  721. *
  722. * @buf: pointer to the start of RX PKT TLV headers
  723. * Return: uint32_t(sgi)
  724. */
  725. static inline uint32_t
  726. hal_rx_tlv_sgi_get_li(uint8_t *buf)
  727. {
  728. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  729. struct rx_msdu_start *msdu_start =
  730. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  731. uint32_t sgi;
  732. sgi = HAL_RX_MSDU_START_SGI_GET(msdu_start);
  733. return sgi;
  734. }
  735. /**
  736. * hal_rx_tlv_rate_mcs_get_li(): API to get the MCS rate
  737. * from rx_msdu_start TLV
  738. *
  739. * @buf: pointer to the start of RX PKT TLV headers
  740. * Return: uint32_t(rate_mcs)
  741. */
  742. static inline uint32_t
  743. hal_rx_tlv_rate_mcs_get_li(uint8_t *buf)
  744. {
  745. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  746. struct rx_msdu_start *msdu_start =
  747. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  748. uint32_t rate_mcs;
  749. rate_mcs = HAL_RX_MSDU_START_RATE_MCS_GET(msdu_start);
  750. return rate_mcs;
  751. }
  752. /*
  753. * hal_rx_tlv_get_pkt_type_li(): API to get the pkt type
  754. * from rx_msdu_start
  755. *
  756. * @buf: pointer to the start of RX PKT TLV header
  757. * Return: uint32_t(pkt type)
  758. */
  759. static inline uint32_t hal_rx_tlv_get_pkt_type_li(uint8_t *buf)
  760. {
  761. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  762. struct rx_msdu_start *msdu_start =
  763. &pkt_tlvs->msdu_start_tlv.rx_msdu_start;
  764. uint32_t pkt_type;
  765. pkt_type = HAL_RX_MSDU_START_PKT_TYPE_GET(msdu_start);
  766. return pkt_type;
  767. }
  768. /**
  769. * hal_rx_tlv_mic_err_get_li(): API to get the MIC ERR
  770. * from rx_mpdu_end TLV
  771. *
  772. * @buf: pointer to the start of RX PKT TLV headers
  773. * Return: uint32_t(mic_err)
  774. */
  775. static inline uint32_t
  776. hal_rx_tlv_mic_err_get_li(uint8_t *buf)
  777. {
  778. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  779. struct rx_mpdu_end *mpdu_end =
  780. &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
  781. uint32_t mic_err;
  782. mic_err = HAL_RX_MPDU_END_MIC_ERR_GET(mpdu_end);
  783. return mic_err;
  784. }
  785. /**
  786. * hal_rx_tlv_decrypt_err_get_li(): API to get the Decrypt ERR
  787. * from rx_mpdu_end TLV
  788. *
  789. * @buf: pointer to the start of RX PKT TLV headers
  790. * Return: uint32_t(decrypt_err)
  791. */
  792. static inline uint32_t
  793. hal_rx_tlv_decrypt_err_get_li(uint8_t *buf)
  794. {
  795. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  796. struct rx_mpdu_end *mpdu_end =
  797. &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end;
  798. uint32_t decrypt_err;
  799. decrypt_err = HAL_RX_MPDU_END_DECRYPT_ERR_GET(mpdu_end);
  800. return decrypt_err;
  801. }
  802. /*
  803. * hal_rx_tlv_first_mpdu_get_li(): get fist_mpdu bit from rx attention
  804. * @buf: pointer to rx_pkt_tlvs
  805. *
  806. * reutm: uint32_t(first_msdu)
  807. */
  808. static inline uint32_t
  809. hal_rx_tlv_first_mpdu_get_li(uint8_t *buf)
  810. {
  811. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  812. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  813. uint32_t first_mpdu;
  814. first_mpdu = HAL_RX_ATTN_FIRST_MPDU_GET(rx_attn);
  815. return first_mpdu;
  816. }
  817. /*
  818. * hal_rx_msdu_get_keyid_li(): API to get the key id if the decrypted packet
  819. * from rx_msdu_end
  820. *
  821. * @buf: pointer to the start of RX PKT TLV header
  822. * Return: uint32_t(key id)
  823. */
  824. static inline uint8_t
  825. hal_rx_msdu_get_keyid_li(uint8_t *buf)
  826. {
  827. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  828. struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end;
  829. uint32_t keyid_octet;
  830. keyid_octet = HAL_RX_MSDU_END_KEYID_OCTET_GET(msdu_end);
  831. return keyid_octet & 0x3;
  832. }
  833. /*
  834. * hal_rx_tlv_get_is_decrypted_li(): API to get the decrypt status of the
  835. * packet from rx_attention
  836. *
  837. * @buf: pointer to the start of RX PKT TLV header
  838. * Return: uint32_t(decryt status)
  839. */
  840. static inline uint32_t
  841. hal_rx_tlv_get_is_decrypted_li(uint8_t *buf)
  842. {
  843. struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf;
  844. struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn;
  845. uint32_t is_decrypt = 0;
  846. uint32_t decrypt_status;
  847. decrypt_status = HAL_RX_ATTN_DECRYPT_STATUS_GET(rx_attn);
  848. if (!decrypt_status)
  849. is_decrypt = 1;
  850. return is_decrypt;
  851. }
  852. /**
  853. * hal_rx_msdu_reo_dst_ind_get_li: Gets the REO
  854. * destination ring ID from the msdu desc info
  855. *
  856. * @ hal_soc_hdl : HAL version of the SOC pointer
  857. * @msdu_link_desc : Opaque cookie pointer used by HAL to get to
  858. * the current descriptor
  859. *
  860. * Return: dst_ind (REO destination ring ID)
  861. */
  862. static inline uint32_t
  863. hal_rx_msdu_reo_dst_ind_get_li(hal_soc_handle_t hal_soc_hdl,
  864. void *msdu_link_desc)
  865. {
  866. struct hal_soc *hal_soc = (struct hal_soc *)hal_soc_hdl;
  867. struct rx_msdu_details *msdu_details;
  868. struct rx_msdu_desc_info *msdu_desc_info;
  869. struct rx_msdu_link *msdu_link = (struct rx_msdu_link *)msdu_link_desc;
  870. uint32_t dst_ind;
  871. msdu_details = hal_rx_link_desc_msdu0_ptr(msdu_link, hal_soc);
  872. /* The first msdu in the link should exsist */
  873. msdu_desc_info = hal_rx_msdu_desc_info_get_ptr(&msdu_details[0],
  874. hal_soc);
  875. dst_ind = HAL_RX_MSDU_REO_DST_IND_GET(msdu_desc_info);
  876. return dst_ind;
  877. }
  878. static inline void
  879. hal_mpdu_desc_info_set_li(hal_soc_handle_t hal_soc_hdl,
  880. void *mpdu_desc, uint32_t seq_no)
  881. {
  882. struct rx_mpdu_desc_info *mpdu_desc_info =
  883. (struct rx_mpdu_desc_info *)mpdu_desc;
  884. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  885. MSDU_COUNT, 0x1);
  886. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  887. MPDU_SEQUENCE_NUMBER, seq_no);
  888. /* unset frag bit */
  889. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  890. FRAGMENT_FLAG, 0x0);
  891. /* set sa/da valid bits */
  892. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  893. SA_IS_VALID, 0x1);
  894. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  895. DA_IS_VALID, 0x1);
  896. HAL_RX_MPDU_DESC_INFO_SET(mpdu_desc_info,
  897. RAW_MPDU, 0x0);
  898. }
  899. static inline void
  900. hal_msdu_desc_info_set_li(hal_soc_handle_t hal_soc_hdl,
  901. void *msdu_desc, uint32_t dst_ind,
  902. uint32_t nbuf_len)
  903. {
  904. struct rx_msdu_desc_info *msdu_desc_info =
  905. (struct rx_msdu_desc_info *)msdu_desc;
  906. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  907. FIRST_MSDU_IN_MPDU_FLAG, 1);
  908. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  909. LAST_MSDU_IN_MPDU_FLAG, 1);
  910. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  911. MSDU_CONTINUATION, 0x0);
  912. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  913. REO_DESTINATION_INDICATION,
  914. dst_ind);
  915. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  916. MSDU_LENGTH, nbuf_len);
  917. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  918. SA_IS_VALID, 1);
  919. HAL_RX_MSDU_DESC_INFO_SET(msdu_desc_info,
  920. DA_IS_VALID, 1);
  921. }
  922. static QDF_STATUS hal_reo_status_update_li(hal_soc_handle_t hal_soc_hdl,
  923. hal_ring_desc_t reo_desc,
  924. void *st_handle,
  925. uint32_t tlv, int *num_ref)
  926. {
  927. union hal_reo_status *reo_status_ref;
  928. reo_status_ref = (union hal_reo_status *)st_handle;
  929. switch (tlv) {
  930. case HAL_REO_QUEUE_STATS_STATUS_TLV:
  931. hal_reo_queue_stats_status_li(reo_desc,
  932. &reo_status_ref->queue_status,
  933. hal_soc_hdl);
  934. *num_ref = reo_status_ref->queue_status.header.cmd_num;
  935. break;
  936. case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
  937. hal_reo_flush_queue_status_li(reo_desc,
  938. &reo_status_ref->fl_queue_status,
  939. hal_soc_hdl);
  940. *num_ref = reo_status_ref->fl_queue_status.header.cmd_num;
  941. break;
  942. case HAL_REO_FLUSH_CACHE_STATUS_TLV:
  943. hal_reo_flush_cache_status_li(reo_desc,
  944. &reo_status_ref->fl_cache_status,
  945. hal_soc_hdl);
  946. *num_ref = reo_status_ref->fl_cache_status.header.cmd_num;
  947. break;
  948. case HAL_REO_UNBLK_CACHE_STATUS_TLV:
  949. hal_reo_unblock_cache_status_li(
  950. reo_desc, hal_soc_hdl,
  951. &reo_status_ref->unblk_cache_status);
  952. *num_ref = reo_status_ref->unblk_cache_status.header.cmd_num;
  953. break;
  954. case HAL_REO_TIMOUT_LIST_STATUS_TLV:
  955. hal_reo_flush_timeout_list_status_li(
  956. reo_desc,
  957. &reo_status_ref->fl_timeout_status,
  958. hal_soc_hdl);
  959. *num_ref = reo_status_ref->fl_timeout_status.header.cmd_num;
  960. break;
  961. case HAL_REO_DESC_THRES_STATUS_TLV:
  962. hal_reo_desc_thres_reached_status_li(
  963. reo_desc,
  964. &reo_status_ref->thres_status,
  965. hal_soc_hdl);
  966. *num_ref = reo_status_ref->thres_status.header.cmd_num;
  967. break;
  968. case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
  969. hal_reo_rx_update_queue_status_li(
  970. reo_desc,
  971. &reo_status_ref->rx_queue_status,
  972. hal_soc_hdl);
  973. *num_ref = reo_status_ref->rx_queue_status.header.cmd_num;
  974. break;
  975. default:
  976. QDF_TRACE(QDF_MODULE_ID_DP_REO, QDF_TRACE_LEVEL_WARN,
  977. "hal_soc %pK: no handler for TLV:%d",
  978. hal_soc_hdl, tlv);
  979. return QDF_STATUS_E_FAILURE;
  980. } /* switch */
  981. return QDF_STATUS_SUCCESS;
  982. }
  983. /**
  984. * hal_hw_txrx_default_ops_attach_li() - Attach the default hal ops for
  985. * lithium chipsets.
  986. * @hal_soc_hdl: HAL soc handle
  987. *
  988. * Return: None
  989. */
  990. void hal_hw_txrx_default_ops_attach_li(struct hal_soc *hal_soc)
  991. {
  992. hal_soc->ops->hal_get_reo_qdesc_size = hal_get_reo_qdesc_size_li;
  993. hal_soc->ops->hal_set_link_desc_addr = hal_set_link_desc_addr_li;
  994. hal_soc->ops->hal_tx_init_data_ring = hal_tx_init_data_ring_li;
  995. hal_soc->ops->hal_get_ba_aging_timeout = hal_get_ba_aging_timeout_li;
  996. hal_soc->ops->hal_set_ba_aging_timeout = hal_set_ba_aging_timeout_li;
  997. hal_soc->ops->hal_get_reo_reg_base_offset =
  998. hal_get_reo_reg_base_offset_li;
  999. hal_soc->ops->hal_rx_get_tlv_size = hal_rx_get_tlv_size_generic_li;
  1000. hal_soc->ops->hal_rx_msdu_is_wlan_mcast =
  1001. hal_rx_msdu_is_wlan_mcast_generic_li;
  1002. hal_soc->ops->hal_rx_tlv_decap_format_get =
  1003. hal_rx_tlv_decap_format_get_li;
  1004. hal_soc->ops->hal_rx_dump_pkt_tlvs = hal_rx_dump_pkt_tlvs_li;
  1005. hal_soc->ops->hal_rx_tlv_get_offload_info =
  1006. hal_rx_tlv_get_offload_info_li;
  1007. hal_soc->ops->hal_rx_tlv_phy_ppdu_id_get =
  1008. hal_rx_attn_phy_ppdu_id_get_li;
  1009. hal_soc->ops->hal_rx_tlv_msdu_done_get = hal_rx_attn_msdu_done_get_li;
  1010. hal_soc->ops->hal_rx_tlv_msdu_len_get =
  1011. hal_rx_msdu_start_msdu_len_get_li;
  1012. hal_soc->ops->hal_rx_get_frame_ctrl_field =
  1013. hal_rx_get_frame_ctrl_field_li;
  1014. hal_soc->ops->hal_rx_get_proto_params = hal_rx_get_proto_params_li;
  1015. hal_soc->ops->hal_rx_get_l3_l4_offsets = hal_rx_get_l3_l4_offsets_li;
  1016. hal_soc->ops->hal_rx_reo_buf_paddr_get = hal_rx_reo_buf_paddr_get_li;
  1017. hal_soc->ops->hal_rx_msdu_link_desc_set = hal_rx_msdu_link_desc_set_li;
  1018. hal_soc->ops->hal_rx_buf_cookie_rbm_get = hal_rx_buf_cookie_rbm_get_li;
  1019. hal_soc->ops->hal_rx_ret_buf_manager_get =
  1020. hal_rx_ret_buf_manager_get_li;
  1021. hal_soc->ops->hal_rxdma_buff_addr_info_set =
  1022. hal_rxdma_buff_addr_info_set_li;
  1023. hal_soc->ops->hal_rx_msdu_flags_get = hal_rx_msdu_flags_get_li;
  1024. hal_soc->ops->hal_rx_get_reo_error_code = hal_rx_get_reo_error_code_li;
  1025. hal_soc->ops->hal_gen_reo_remap_val =
  1026. hal_gen_reo_remap_val_generic_li;
  1027. hal_soc->ops->hal_rx_tlv_csum_err_get =
  1028. hal_rx_tlv_csum_err_get_li;
  1029. hal_soc->ops->hal_rx_mpdu_desc_info_get =
  1030. hal_rx_mpdu_desc_info_get_li;
  1031. hal_soc->ops->hal_rx_err_status_get = hal_rx_err_status_get_li;
  1032. hal_soc->ops->hal_rx_reo_buf_type_get = hal_rx_reo_buf_type_get_li;
  1033. hal_soc->ops->hal_rx_pkt_hdr_get = hal_rx_pkt_hdr_get_li;
  1034. hal_soc->ops->hal_rx_wbm_err_src_get = hal_rx_wbm_err_src_get_li;
  1035. hal_soc->ops->hal_rx_priv_info_set_in_tlv =
  1036. hal_rx_priv_info_set_in_tlv_li;
  1037. hal_soc->ops->hal_rx_priv_info_get_from_tlv =
  1038. hal_rx_priv_info_get_from_tlv_li;
  1039. hal_soc->ops->hal_rx_mpdu_info_ampdu_flag_get =
  1040. hal_rx_mpdu_info_ampdu_flag_get_li;
  1041. hal_soc->ops->hal_rx_tlv_mpdu_len_err_get =
  1042. hal_rx_tlv_mpdu_len_err_get_li;
  1043. hal_soc->ops->hal_rx_tlv_mpdu_fcs_err_get =
  1044. hal_rx_tlv_mpdu_fcs_err_get_li;
  1045. hal_soc->ops->hal_reo_send_cmd = hal_reo_send_cmd_li;
  1046. hal_soc->ops->hal_rx_tlv_get_pkt_capture_flags =
  1047. hal_rx_tlv_get_pkt_capture_flags_li;
  1048. hal_soc->ops->hal_rx_desc_get_80211_hdr = hal_rx_desc_get_80211_hdr_li;
  1049. hal_soc->ops->hal_rx_hw_desc_mpdu_user_id =
  1050. hal_rx_hw_desc_mpdu_user_id_li;
  1051. hal_soc->ops->hal_reo_qdesc_setup = hal_reo_qdesc_setup_li;
  1052. hal_soc->ops->hal_rx_tlv_msdu_len_set =
  1053. hal_rx_msdu_start_msdu_len_set_li;
  1054. hal_soc->ops->hal_rx_tlv_bw_get = hal_rx_tlv_bw_get_li;
  1055. hal_soc->ops->hal_rx_tlv_get_freq = hal_rx_tlv_get_freq_li;
  1056. hal_soc->ops->hal_rx_tlv_sgi_get = hal_rx_tlv_sgi_get_li;
  1057. hal_soc->ops->hal_rx_tlv_rate_mcs_get = hal_rx_tlv_rate_mcs_get_li;
  1058. hal_soc->ops->hal_rx_tlv_get_pkt_type = hal_rx_tlv_get_pkt_type_li;
  1059. hal_soc->ops->hal_rx_tlv_get_pn_num = hal_rx_tlv_get_pn_num_li;
  1060. hal_soc->ops->hal_rx_tlv_mic_err_get = hal_rx_tlv_mic_err_get_li;
  1061. hal_soc->ops->hal_rx_tlv_decrypt_err_get =
  1062. hal_rx_tlv_decrypt_err_get_li;
  1063. hal_soc->ops->hal_rx_tlv_first_mpdu_get = hal_rx_tlv_first_mpdu_get_li;
  1064. hal_soc->ops->hal_rx_tlv_get_is_decrypted =
  1065. hal_rx_tlv_get_is_decrypted_li;
  1066. hal_soc->ops->hal_rx_msdu_get_keyid = hal_rx_msdu_get_keyid_li;
  1067. hal_soc->ops->hal_rx_msdu_reo_dst_ind_get =
  1068. hal_rx_msdu_reo_dst_ind_get_li;
  1069. hal_soc->ops->hal_msdu_desc_info_set = hal_msdu_desc_info_set_li;
  1070. hal_soc->ops->hal_mpdu_desc_info_set = hal_mpdu_desc_info_set_li;
  1071. hal_soc->ops->hal_reo_status_update = hal_reo_status_update_li;
  1072. hal_soc->ops->hal_get_tlv_hdr_size = hal_get_tlv_hdr_size_li;
  1073. }