hal_api_mon.h 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705
  1. /*
  2. * Copyright (c) 2017 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. #ifndef _HAL_API_MON_H_
  19. #define _HAL_API_MON_H_
  20. #include "qdf_types.h"
  21. #include "hal_internal.h"
  22. #define HAL_RX_OFFSET(block, field) block##_##field##_OFFSET
  23. #define HAL_RX_LSB(block, field) block##_##field##_LSB
  24. #define HAL_RX_MASk(block, field) block##_##field##_MASK
  25. #define HAL_RX_GET(_ptr, block, field) \
  26. (((*((volatile uint32_t *)_ptr + (HAL_RX_OFFSET(block, field)>>2))) & \
  27. HAL_RX_MASk(block, field)) >> \
  28. HAL_RX_LSB(block, field))
  29. #define HAL_RX_PHY_DATA_RADAR 0x01
  30. #define HAL_SU_MU_CODING_LDPC 0x01
  31. #define HAL_RX_FCS_LEN (4)
  32. #define KEY_EXTIV 0x20
  33. #define HAL_RX_USER_TLV32_TYPE_OFFSET 0x00000000
  34. #define HAL_RX_USER_TLV32_TYPE_LSB 1
  35. #define HAL_RX_USER_TLV32_TYPE_MASK 0x000003FE
  36. #define HAL_RX_USER_TLV32_LEN_OFFSET 0x00000000
  37. #define HAL_RX_USER_TLV32_LEN_LSB 10
  38. #define HAL_RX_USER_TLV32_LEN_MASK 0x003FFC00
  39. #define HAL_RX_USER_TLV32_USERID_OFFSET 0x00000000
  40. #define HAL_RX_USER_TLV32_USERID_LSB 26
  41. #define HAL_RX_USER_TLV32_USERID_MASK 0xFC000000
  42. #define HAL_ALIGN(x, a) HAL_ALIGN_MASK(x, (a)-1)
  43. #define HAL_ALIGN_MASK(x, mask) (typeof(x))(((uint32)(x) + (mask)) & ~(mask))
  44. #define HAL_RX_TLV32_HDR_SIZE 4
  45. #define HAL_RX_GET_USER_TLV32_TYPE(rx_status_tlv_ptr) \
  46. ((*((uint32_t *)(rx_status_tlv_ptr)) & \
  47. HAL_RX_USER_TLV32_TYPE_MASK) >> \
  48. HAL_RX_USER_TLV32_TYPE_LSB)
  49. #define HAL_RX_GET_USER_TLV32_LEN(rx_status_tlv_ptr) \
  50. ((*((uint32_t *)(rx_status_tlv_ptr)) & \
  51. HAL_RX_USER_TLV32_LEN_MASK) >> \
  52. HAL_RX_USER_TLV32_LEN_LSB)
  53. #define HAL_RX_GET_USER_TLV32_USERID(rx_status_tlv_ptr) \
  54. ((*((uint32_t *)(rx_status_tlv_ptr)) & \
  55. HAL_RX_USER_TLV32_USERID_MASK) >> \
  56. HAL_RX_USER_TLV32_USERID_LSB)
  57. #define HAL_TLV_STATUS_PPDU_NOT_DONE 0
  58. #define HAL_TLV_STATUS_PPDU_DONE 1
  59. #define HAL_TLV_STATUS_DUMMY 2
  60. #define HAL_MAX_UL_MU_USERS 8
  61. #define HAL_RX_PKT_TYPE_11A 0
  62. #define HAL_RX_PKT_TYPE_11B 1
  63. #define HAL_RX_PKT_TYPE_11N 2
  64. #define HAL_RX_PKT_TYPE_11AC 3
  65. #define HAL_RX_PKT_TYPE_11AX 4
  66. #define HAL_RX_RECEPTION_TYPE_SU 0
  67. #define HAL_RX_RECEPTION_TYPE_MU_MIMO 1
  68. #define HAL_RX_RECEPTION_TYPE_OFDMA 2
  69. #define HAL_RX_RECEPTION_TYPE_MU_OFDMA 3
  70. enum {
  71. HAL_HW_RX_DECAP_FORMAT_RAW = 0,
  72. HAL_HW_RX_DECAP_FORMAT_NWIFI,
  73. HAL_HW_RX_DECAP_FORMAT_ETH2,
  74. HAL_HW_RX_DECAP_FORMAT_8023,
  75. };
  76. enum {
  77. DP_PPDU_STATUS_START,
  78. DP_PPDU_STATUS_DONE,
  79. };
  80. static inline
  81. uint32_t HAL_RX_MON_HW_RX_DESC_SIZE(void)
  82. {
  83. /* return the HW_RX_DESC size */
  84. return sizeof(struct rx_pkt_tlvs);
  85. }
  86. static inline
  87. uint8_t *HAL_RX_MON_DEST_GET_DESC(uint8_t *data)
  88. {
  89. return data;
  90. }
  91. static inline
  92. uint32_t HAL_RX_DESC_GET_MPDU_LENGTH_ERR(void *hw_desc_addr)
  93. {
  94. struct rx_attention *rx_attn;
  95. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  96. rx_attn = &rx_desc->attn_tlv.rx_attn;
  97. return HAL_RX_GET(rx_attn, RX_ATTENTION_1, MPDU_LENGTH_ERR);
  98. }
  99. static inline
  100. uint32_t HAL_RX_DESC_GET_MPDU_FCS_ERR(void *hw_desc_addr)
  101. {
  102. struct rx_attention *rx_attn;
  103. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  104. rx_attn = &rx_desc->attn_tlv.rx_attn;
  105. return HAL_RX_GET(rx_attn, RX_ATTENTION_1, FCS_ERR);
  106. }
  107. static inline
  108. uint32_t
  109. HAL_RX_DESC_GET_DECAP_FORMAT(void *hw_desc_addr) {
  110. struct rx_msdu_start *rx_msdu_start;
  111. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  112. rx_msdu_start = &rx_desc->msdu_start_tlv.rx_msdu_start;
  113. return HAL_RX_GET(rx_msdu_start, RX_MSDU_START_2, DECAP_FORMAT);
  114. }
  115. static inline
  116. uint8_t *
  117. HAL_RX_DESC_GET_80211_HDR(void *hw_desc_addr) {
  118. uint8_t *rx_pkt_hdr;
  119. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  120. rx_pkt_hdr = &rx_desc->pkt_hdr_tlv.rx_pkt_hdr[0];
  121. return rx_pkt_hdr;
  122. }
  123. static inline
  124. uint32_t HAL_RX_MON_HW_DESC_GET_PPDUID_GET(void *hw_desc_addr)
  125. {
  126. struct rx_mpdu_info *rx_mpdu_info;
  127. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  128. rx_mpdu_info =
  129. &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details;
  130. return HAL_RX_GET(rx_mpdu_info, RX_MPDU_INFO_0, PHY_PPDU_ID);
  131. }
  132. /* TODO: Move all Rx descriptor functions to hal_rx.h to avoid duplication */
  133. static inline
  134. uint32_t hal_rx_desc_is_first_msdu(void *hw_desc_addr)
  135. {
  136. struct rx_pkt_tlvs *rx_tlvs = (struct rx_pkt_tlvs *)hw_desc_addr;
  137. struct rx_msdu_end *msdu_end = &rx_tlvs->msdu_end_tlv.rx_msdu_end;
  138. return HAL_RX_GET(msdu_end, RX_MSDU_END_5, FIRST_MSDU);
  139. }
  140. #define HAL_RX_BUFFER_ADDR_31_0_GET(buff_addr_info) \
  141. (_HAL_MS((*_OFFSET_TO_WORD_PTR(buff_addr_info, \
  142. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_OFFSET)), \
  143. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK, \
  144. BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB))
  145. #define HAL_RX_REO_ENT_BUFFER_ADDR_39_32_GET(reo_ent_desc) \
  146. (HAL_RX_BUFFER_ADDR_39_32_GET(& \
  147. (((struct reo_entrance_ring *)reo_ent_desc) \
  148. ->reo_level_mpdu_frame_info.msdu_link_desc_addr_info)))
  149. #define HAL_RX_REO_ENT_BUFFER_ADDR_31_0_GET(reo_ent_desc) \
  150. (HAL_RX_BUFFER_ADDR_31_0_GET(& \
  151. (((struct reo_entrance_ring *)reo_ent_desc) \
  152. ->reo_level_mpdu_frame_info.msdu_link_desc_addr_info)))
  153. #define HAL_RX_REO_ENT_BUF_COOKIE_GET(reo_ent_desc) \
  154. (HAL_RX_BUF_COOKIE_GET(& \
  155. (((struct reo_entrance_ring *)reo_ent_desc) \
  156. ->reo_level_mpdu_frame_info.msdu_link_desc_addr_info)))
  157. /**
  158. * hal_rx_reo_ent_buf_paddr_get: Gets the physical address and
  159. * cookie from the REO entrance ring element
  160. *
  161. * @ hal_rx_desc_cookie: Opaque cookie pointer used by HAL to get to
  162. * the current descriptor
  163. * @ buf_info: structure to return the buffer information
  164. * @ msdu_cnt: pointer to msdu count in MPDU
  165. * Return: void
  166. */
  167. static inline
  168. void hal_rx_reo_ent_buf_paddr_get(void *rx_desc,
  169. struct hal_buf_info *buf_info,
  170. void **pp_buf_addr_info,
  171. uint32_t *msdu_cnt
  172. )
  173. {
  174. struct reo_entrance_ring *reo_ent_ring =
  175. (struct reo_entrance_ring *)rx_desc;
  176. struct buffer_addr_info *buf_addr_info;
  177. struct rx_mpdu_desc_info *rx_mpdu_desc_info_details;
  178. uint32_t loop_cnt;
  179. rx_mpdu_desc_info_details =
  180. &reo_ent_ring->reo_level_mpdu_frame_info.rx_mpdu_desc_info_details;
  181. *msdu_cnt = HAL_RX_GET(rx_mpdu_desc_info_details,
  182. RX_MPDU_DESC_INFO_0, MSDU_COUNT);
  183. loop_cnt = HAL_RX_GET(reo_ent_ring, REO_ENTRANCE_RING_7, LOOPING_COUNT);
  184. buf_addr_info =
  185. &reo_ent_ring->reo_level_mpdu_frame_info.msdu_link_desc_addr_info;
  186. buf_info->paddr =
  187. (HAL_RX_BUFFER_ADDR_31_0_GET(buf_addr_info) |
  188. ((uint64_t)
  189. (HAL_RX_BUFFER_ADDR_39_32_GET(buf_addr_info)) << 32));
  190. buf_info->sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
  191. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  192. "[%s][%d] ReoAddr=%p, addrInfo=%p, paddr=0x%llx, loopcnt=%d\n",
  193. __func__, __LINE__, reo_ent_ring, buf_addr_info,
  194. (unsigned long long)buf_info->paddr, loop_cnt);
  195. *pp_buf_addr_info = (void *)buf_addr_info;
  196. }
  197. static inline
  198. void hal_rx_mon_next_link_desc_get(void *rx_msdu_link_desc,
  199. struct hal_buf_info *buf_info, void **pp_buf_addr_info)
  200. {
  201. struct rx_msdu_link *msdu_link =
  202. (struct rx_msdu_link *)rx_msdu_link_desc;
  203. struct buffer_addr_info *buf_addr_info;
  204. buf_addr_info = &msdu_link->next_msdu_link_desc_addr_info;
  205. buf_info->paddr =
  206. (HAL_RX_BUFFER_ADDR_31_0_GET(buf_addr_info) |
  207. ((uint64_t)
  208. (HAL_RX_BUFFER_ADDR_39_32_GET(buf_addr_info)) << 32));
  209. buf_info->sw_cookie = HAL_RX_BUF_COOKIE_GET(buf_addr_info);
  210. *pp_buf_addr_info = (void *)buf_addr_info;
  211. }
  212. /**
  213. * hal_rx_msdu_link_desc_set: Retrieves MSDU Link Descriptor to WBM
  214. *
  215. * @ soc : HAL version of the SOC pointer
  216. * @ src_srng_desc : void pointer to the WBM Release Ring descriptor
  217. * @ buf_addr_info : void pointer to the buffer_addr_info
  218. *
  219. * Return: void
  220. */
  221. static inline void hal_rx_mon_msdu_link_desc_set(struct hal_soc *soc,
  222. void *src_srng_desc, void *buf_addr_info)
  223. {
  224. struct buffer_addr_info *wbm_srng_buffer_addr_info =
  225. (struct buffer_addr_info *)src_srng_desc;
  226. uint64_t paddr;
  227. struct buffer_addr_info *p_buffer_addr_info =
  228. (struct buffer_addr_info *)buf_addr_info;
  229. paddr =
  230. (HAL_RX_BUFFER_ADDR_31_0_GET(buf_addr_info) |
  231. ((uint64_t)
  232. (HAL_RX_BUFFER_ADDR_39_32_GET(buf_addr_info)) << 32));
  233. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  234. "[%s][%d] src_srng_desc=%p, buf_addr=0x%llx, cookie=0x%llx\n",
  235. __func__, __LINE__, src_srng_desc, (unsigned long long)paddr,
  236. (unsigned long long)p_buffer_addr_info->sw_buffer_cookie);
  237. /* Structure copy !!! */
  238. *wbm_srng_buffer_addr_info =
  239. *((struct buffer_addr_info *)buf_addr_info);
  240. }
  241. static inline
  242. uint32 hal_get_rx_msdu_link_desc_size(void)
  243. {
  244. return sizeof(struct rx_msdu_link);
  245. }
  246. enum {
  247. HAL_PKT_TYPE_OFDM = 0,
  248. HAL_PKT_TYPE_CCK,
  249. HAL_PKT_TYPE_HT,
  250. HAL_PKT_TYPE_VHT,
  251. HAL_PKT_TYPE_HE,
  252. };
  253. enum {
  254. HAL_SGI_0_8_US,
  255. HAL_SGI_0_4_US,
  256. HAL_SGI_1_6_US,
  257. HAL_SGI_3_2_US,
  258. };
  259. enum {
  260. HAL_FULL_RX_BW_20,
  261. HAL_FULL_RX_BW_40,
  262. HAL_FULL_RX_BW_80,
  263. HAL_FULL_RX_BW_160,
  264. };
  265. enum {
  266. HAL_RX_TYPE_SU,
  267. HAL_RX_TYPE_MU_MIMO,
  268. HAL_RX_TYPE_MU_OFDMA,
  269. HAL_RX_TYPE_MU_OFDMA_MIMO,
  270. };
  271. /**
  272. * hal_rx_mon_hw_desc_get_mpdu_status: Retrieve MPDU status
  273. *
  274. * @ hw_desc_addr: Start address of Rx HW TLVs
  275. * @ rs: Status for monitor mode
  276. *
  277. * Return: void
  278. */
  279. static inline
  280. void hal_rx_mon_hw_desc_get_mpdu_status(void *hw_desc_addr,
  281. struct mon_rx_status *rs)
  282. {
  283. struct rx_msdu_start *rx_msdu_start;
  284. struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)hw_desc_addr;
  285. uint32_t reg_value;
  286. static uint32_t sgi_hw_to_cdp[] = {
  287. CDP_SGI_0_8_US,
  288. CDP_SGI_0_4_US,
  289. CDP_SGI_1_6_US,
  290. CDP_SGI_3_2_US,
  291. };
  292. rx_msdu_start = &rx_desc->msdu_start_tlv.rx_msdu_start;
  293. rs->ant_signal_db = HAL_RX_GET(rx_msdu_start,
  294. RX_MSDU_START_5, USER_RSSI);
  295. rs->mcs = HAL_RX_GET(rx_msdu_start,
  296. RX_MSDU_START_5, RATE_MCS);
  297. rs->is_stbc = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, STBC);
  298. reg_value = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, SGI);
  299. rs->sgi = sgi_hw_to_cdp[reg_value];
  300. rs->nr_ant = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, NSS);
  301. reg_value = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, PKT_TYPE);
  302. switch (reg_value) {
  303. case HAL_RX_PKT_TYPE_11AC:
  304. rs->vht_flags = 1;
  305. reg_value = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5,
  306. RECEIVE_BANDWIDTH);
  307. rs->vht_flag_values2 = 0x01 << reg_value;
  308. rs->vht_flag_values3[0] = rs->mcs << 4;
  309. break;
  310. case HAL_RX_PKT_TYPE_11AX:
  311. rs->he_flags = 1;
  312. break;
  313. default:
  314. break;
  315. }
  316. reg_value = HAL_RX_GET(rx_msdu_start, RX_MSDU_START_5, RECEPTION_TYPE);
  317. rs->beamformed = (reg_value == HAL_RX_RECEPTION_TYPE_MU_MIMO) ? 1 : 0;
  318. /* TODO: rs->beamformed should be set for SU beamforming also */
  319. }
  320. struct hal_rx_ppdu_user_info {
  321. };
  322. struct hal_rx_ppdu_common_info {
  323. uint32_t ppdu_id;
  324. uint32_t ppdu_timestamp;
  325. };
  326. struct hal_rx_ppdu_info {
  327. struct hal_rx_ppdu_common_info com_info;
  328. struct hal_rx_ppdu_user_info user_info[HAL_MAX_UL_MU_USERS];
  329. struct mon_rx_status rx_status;
  330. };
  331. static inline uint32_t
  332. hal_get_rx_status_buf_size(void) {
  333. /* RX status buffer size is hard coded for now */
  334. return 2048;
  335. }
  336. static inline uint8_t*
  337. hal_rx_status_get_next_tlv(uint8_t *rx_tlv) {
  338. uint32_t tlv_len, tlv_tag;
  339. tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv);
  340. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv);
  341. /* The actual length of PPDU_END is the combined lenght of many PHY
  342. * TLVs that follow. Skip the TLV header and
  343. * rx_rxpcu_classification_overview that follows the header to get to
  344. * next TLV.
  345. */
  346. if (tlv_tag == WIFIRX_PPDU_END_E)
  347. tlv_len = sizeof(struct rx_rxpcu_classification_overview);
  348. return (uint8_t *)(((unsigned long)(rx_tlv + tlv_len +
  349. HAL_RX_TLV32_HDR_SIZE + 3)) & (~((unsigned long)3)));
  350. }
  351. static inline uint32_t
  352. hal_rx_status_get_tlv_info(void *rx_tlv, struct hal_rx_ppdu_info *ppdu_info)
  353. {
  354. uint32_t tlv_tag, user_id, tlv_len, value;
  355. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv);
  356. user_id = HAL_RX_GET_USER_TLV32_USERID(rx_tlv);
  357. tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv);
  358. rx_tlv = (uint8_t *) rx_tlv + HAL_RX_TLV32_HDR_SIZE;
  359. switch (tlv_tag) {
  360. case WIFIRX_PPDU_START_E:
  361. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
  362. "[%s][%d] ppdu_start_e len=%d\n",
  363. __func__, __LINE__, tlv_len);
  364. ppdu_info->com_info.ppdu_id =
  365. HAL_RX_GET(rx_tlv, RX_PPDU_START_0,
  366. PHY_PPDU_ID);
  367. /* TODO: Ensure channel number is set in PHY meta data */
  368. ppdu_info->rx_status.chan_freq =
  369. HAL_RX_GET(rx_tlv, RX_PPDU_START_1,
  370. SW_PHY_META_DATA);
  371. ppdu_info->com_info.ppdu_timestamp =
  372. HAL_RX_GET(rx_tlv, RX_PPDU_START_2,
  373. PPDU_START_TIMESTAMP);
  374. break;
  375. case WIFIRX_PPDU_START_USER_INFO_E:
  376. break;
  377. case WIFIRX_PPDU_END_E:
  378. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
  379. "[%s][%d] ppdu_end_e len=%d\n",
  380. __func__, __LINE__, tlv_len);
  381. /* This is followed by sub-TLVs of PPDU_END */
  382. ppdu_info->rx_status.duration =
  383. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_8,
  384. RX_PPDU_DURATION);
  385. break;
  386. case WIFIRXPCU_PPDU_END_INFO_E:
  387. ppdu_info->rx_status.tsft =
  388. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_1,
  389. WB_TIMESTAMP_UPPER_32);
  390. ppdu_info->rx_status.tsft = (ppdu_info->rx_status.tsft << 32) |
  391. HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_0,
  392. WB_TIMESTAMP_LOWER_32);
  393. break;
  394. case WIFIRX_PPDU_END_USER_STATS_E:
  395. {
  396. unsigned long tid = 0;
  397. ppdu_info->rx_status.ast_index =
  398. HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4,
  399. AST_INDEX);
  400. tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12,
  401. RECEIVED_QOS_DATA_TID_BITMAP);
  402. ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, sizeof(tid)*8);
  403. ppdu_info->rx_status.mcs =
  404. HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1,
  405. MCS);
  406. ppdu_info->rx_status.nss =
  407. HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_1,
  408. NSS);
  409. ppdu_info->rx_status.first_data_seq_ctrl =
  410. HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
  411. DATA_SEQUENCE_CONTROL_INFO_VALID);
  412. break;
  413. }
  414. case WIFIRX_PPDU_END_USER_STATS_EXT_E:
  415. break;
  416. case WIFIRX_PPDU_END_STATUS_DONE_E:
  417. return HAL_TLV_STATUS_PPDU_DONE;
  418. case WIFIDUMMY_E:
  419. return HAL_TLV_STATUS_PPDU_DONE;
  420. case WIFIPHYRX_HT_SIG_E:
  421. {
  422. uint8_t *ht_sig_info = (uint8_t *)rx_tlv +
  423. HAL_RX_OFFSET(PHYRX_HT_SIG_0,
  424. HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS);
  425. value = HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1,
  426. FEC_CODING);
  427. ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
  428. 1 : 0;
  429. break;
  430. }
  431. case WIFIPHYRX_VHT_SIG_A_E:
  432. {
  433. uint8_t *vht_sig_a_info = (uint8_t *)rx_tlv +
  434. HAL_RX_OFFSET(PHYRX_VHT_SIG_A_0,
  435. VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS);
  436. value = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1,
  437. SU_MU_CODING);
  438. ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
  439. 1 : 0;
  440. break;
  441. }
  442. case WIFIPHYRX_HE_SIG_A_SU_E:
  443. ppdu_info->rx_status.he_sig_A1 =
  444. *((uint32_t *)((uint8_t *)rx_tlv +
  445. HAL_RX_OFFSET(PHYRX_HE_SIG_A_SU_0,
  446. HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS)));
  447. ppdu_info->rx_status.he_sig_A1 |=
  448. QDF_MON_STATUS_HE_SIG_A1_HE_FORMAT_SU;
  449. /* TODO: Enabling all known bits. Check if this should be
  450. * enabled selectively
  451. */
  452. ppdu_info->rx_status.he_sig_A1_known =
  453. QDF_MON_STATUS_HE_SIG_A1_SU_KNOWN_ALL;
  454. ppdu_info->rx_status.he_sig_A2 =
  455. *((uint32_t *)((uint8_t *)rx_tlv +
  456. HAL_RX_OFFSET(PHYRX_HE_SIG_A_SU_1,
  457. HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS)));
  458. ppdu_info->rx_status.he_sig_A2_known =
  459. QDF_MON_STATUS_HE_SIG_A2_SU_KNOWN_ALL;
  460. break;
  461. case WIFIPHYRX_HE_SIG_A_MU_DL_E:
  462. ppdu_info->rx_status.he_sig_A1 =
  463. *((uint32_t *)((uint8_t *)rx_tlv +
  464. HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_DL_0,
  465. HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS)));
  466. ppdu_info->rx_status.he_sig_A1 |=
  467. QDF_MON_STATUS_HE_SIG_A1_HE_FORMAT_MU;
  468. ppdu_info->rx_status.he_sig_A1_known =
  469. QDF_MON_STATUS_HE_SIG_A1_MU_KNOWN_ALL;
  470. ppdu_info->rx_status.he_sig_A2 =
  471. *((uint32_t *)((uint8_t *)rx_tlv +
  472. HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_DL_1,
  473. HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS)));
  474. ppdu_info->rx_status.he_sig_A2_known =
  475. QDF_MON_STATUS_HE_SIG_A2_MU_KNOWN_ALL;
  476. break;
  477. case WIFIPHYRX_HE_SIG_B1_MU_E:
  478. {
  479. uint8_t *he_sig_b1_mu_info = (uint8_t *)rx_tlv +
  480. *((uint32_t *)((uint8_t *)rx_tlv +
  481. HAL_RX_OFFSET(PHYRX_HE_SIG_B1_MU_0,
  482. HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS)));
  483. ppdu_info->rx_status.he_sig_b_common_RU[0] =
  484. HAL_RX_GET(he_sig_b1_mu_info, HE_SIG_B1_MU_INFO_0,
  485. RU_ALLOCATION);
  486. ppdu_info->rx_status.he_sig_b_common_known =
  487. QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU0;
  488. /* TODO: Check on the availability of other fields in
  489. * sig_b_common
  490. */
  491. break;
  492. }
  493. case WIFIPHYRX_HE_SIG_B2_MU_E:
  494. ppdu_info->rx_status.he_sig_b_user =
  495. *((uint32_t *)((uint8_t *)rx_tlv +
  496. HAL_RX_OFFSET(PHYRX_HE_SIG_B2_MU_0,
  497. HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS)));
  498. ppdu_info->rx_status.he_sig_b_user_known =
  499. QDF_MON_STATUS_HE_SIG_B_USER_KNOWN_SIG_B_ALL;
  500. break;
  501. case WIFIPHYRX_HE_SIG_B2_OFDMA_E:
  502. ppdu_info->rx_status.he_sig_b_user =
  503. *((uint32_t *)((uint8_t *)rx_tlv +
  504. HAL_RX_OFFSET(PHYRX_HE_SIG_B2_OFDMA_0,
  505. HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS)));
  506. ppdu_info->rx_status.he_sig_b_user_known =
  507. QDF_MON_STATUS_HE_SIG_B_USER_KNOWN_SIG_B_ALL;
  508. break;
  509. case WIFIPHYRX_RSSI_LEGACY_E:
  510. {
  511. uint8_t *rssi_info_tlv = (uint8_t *)rx_tlv +
  512. HAL_RX_OFFSET(PHYRX_RSSI_LEGACY_3,
  513. RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS);
  514. ppdu_info->rx_status.rssi_comb = HAL_RX_GET(rssi_info_tlv,
  515. PHYRX_RSSI_LEGACY_35, RSSI_COMB);
  516. ppdu_info->rx_status.bw = HAL_RX_GET(rssi_info_tlv,
  517. PHYRX_RSSI_LEGACY_35, RECEIVE_BANDWIDTH);
  518. ppdu_info->rx_status.preamble_type = HAL_RX_GET(rssi_info_tlv,
  519. PHYRX_RSSI_LEGACY_0, RECEPTION_TYPE);
  520. ppdu_info->rx_status.he_re = 0;
  521. value = HAL_RX_GET(rssi_info_tlv,
  522. RECEIVE_RSSI_INFO_0, RSSI_PRI20_CHAIN0);
  523. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  524. "RSSI_PRI20_CHAIN0: %d\n", value);
  525. value = HAL_RX_GET(rssi_info_tlv,
  526. RECEIVE_RSSI_INFO_0, RSSI_EXT20_CHAIN0);
  527. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  528. "RSSI_EXT20_CHAIN0: %d\n", value);
  529. value = HAL_RX_GET(rssi_info_tlv,
  530. RECEIVE_RSSI_INFO_0, RSSI_EXT40_LOW20_CHAIN0);
  531. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  532. "RSSI_EXT40_LOW20_CHAIN0: %d\n", value);
  533. value = HAL_RX_GET(rssi_info_tlv,
  534. RECEIVE_RSSI_INFO_0, RSSI_EXT40_HIGH20_CHAIN0);
  535. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  536. "RSSI_EXT40_HIGH20_CHAIN0: %d\n", value);
  537. value = HAL_RX_GET(rssi_info_tlv,
  538. RECEIVE_RSSI_INFO_1, RSSI_EXT80_LOW20_CHAIN0);
  539. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  540. "RSSI_EXT80_LOW20_CHAIN0: %d\n", value);
  541. value = HAL_RX_GET(rssi_info_tlv,
  542. RECEIVE_RSSI_INFO_1, RSSI_EXT80_LOW_HIGH20_CHAIN0);
  543. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  544. "RSSI_EXT80_LOW_HIGH20_CHAIN0: %d\n", value);
  545. value = HAL_RX_GET(rssi_info_tlv,
  546. RECEIVE_RSSI_INFO_1, RSSI_EXT80_HIGH_LOW20_CHAIN0);
  547. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  548. "RSSI_EXT80_HIGH_LOW20_CHAIN0: %d\n", value);
  549. value = HAL_RX_GET(rssi_info_tlv,
  550. RECEIVE_RSSI_INFO_1, RSSI_EXT80_HIGH20_CHAIN0);
  551. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
  552. "RSSI_EXT80_HIGH20_CHAIN0: %d\n", value);
  553. break;
  554. }
  555. case 0:
  556. return HAL_TLV_STATUS_PPDU_DONE;
  557. default:
  558. break;
  559. }
  560. QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_INFO,
  561. "%s TLV type: %d, TLV len:%d\n",
  562. __func__, tlv_tag, tlv_len);
  563. return HAL_TLV_STATUS_PPDU_NOT_DONE;
  564. }
  565. static inline
  566. uint32_t hal_get_rx_status_done_tlv_size(void *hal_soc)
  567. {
  568. return HAL_RX_TLV32_HDR_SIZE;
  569. }
  570. static inline QDF_STATUS
  571. hal_get_rx_status_done(uint8_t *rx_tlv)
  572. {
  573. uint32_t tlv_tag;
  574. tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv);
  575. if (tlv_tag == WIFIRX_STATUS_BUFFER_DONE_E)
  576. return QDF_STATUS_SUCCESS;
  577. else
  578. return QDF_STATUS_E_EMPTY;
  579. }
  580. static inline QDF_STATUS
  581. hal_clear_rx_status_done(uint8_t *rx_tlv)
  582. {
  583. *(uint32_t *)rx_tlv = 0;
  584. return QDF_STATUS_SUCCESS;
  585. }
  586. #endif