blob: 514abd7ea157c80a9c0c215ccdaae9bc15b233c3 [file] [log] [blame]
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301/*
Mohit Khanna5f263482019-02-14 18:42:20 -08002 * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05303 *
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_GENERIC_API_H_
19#define _HAL_GENERIC_API_H_
20
21#define HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr) \
22 ((struct rx_msdu_desc_info *) \
23 _OFFSET_TO_BYTE_PTR(msdu_details_ptr, \
24UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET))
25/**
26 * hal_rx_msdu_desc_info_get_ptr_generic() - Get msdu desc info ptr
27 * @msdu_details_ptr - Pointer to msdu_details_ptr
28 * Return - Pointer to rx_msdu_desc_info structure.
29 *
30 */
31static void *hal_rx_msdu_desc_info_get_ptr_generic(void *msdu_details_ptr)
32{
33 return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr);
34}
35
36
37#define HAL_RX_LINK_DESC_MSDU0_PTR(link_desc) \
38 ((struct rx_msdu_details *) \
39 _OFFSET_TO_BYTE_PTR((link_desc),\
40 UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET))
41/**
42 * hal_rx_link_desc_msdu0_ptr_generic - Get pointer to rx_msdu details
43 * @link_desc - Pointer to link desc
44 * Return - Pointer to rx_msdu_details structure
45 *
46 */
47
48static void *hal_rx_link_desc_msdu0_ptr_generic(void *link_desc)
49{
50 return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc);
51}
52
53/**
54 * hal_tx_comp_get_status() - TQM Release reason
55 * @hal_desc: completion ring Tx status
56 *
57 * This function will parse the WBM completion descriptor and populate in
58 * HAL structure
59 *
60 * Return: none
61 */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +053062static inline
63void hal_tx_comp_get_status_generic(void *desc,
64 void *ts1,
65 struct hal_soc *hal)
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +053066{
67 uint8_t rate_stats_valid = 0;
68 uint32_t rate_stats = 0;
69 struct hal_tx_completion_status *ts =
70 (struct hal_tx_completion_status *)ts1;
71
72 ts->ppdu_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3,
73 TQM_STATUS_NUMBER);
74 ts->ack_frame_rssi = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
75 ACK_FRAME_RSSI);
76 ts->first_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, FIRST_MSDU);
77 ts->last_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, LAST_MSDU);
78 ts->msdu_part_of_amsdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4,
79 MSDU_PART_OF_AMSDU);
80
81 ts->peer_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, SW_PEER_ID);
82 ts->tid = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, TID);
83 ts->transmit_cnt = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3,
84 TRANSMIT_COUNT);
85
86 rate_stats = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_5,
87 TX_RATE_STATS);
88
89 rate_stats_valid = HAL_TX_MS(TX_RATE_STATS_INFO_0,
90 TX_RATE_STATS_INFO_VALID, rate_stats);
91
92 ts->valid = rate_stats_valid;
93
94 if (rate_stats_valid) {
95 ts->bw = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_BW,
96 rate_stats);
97 ts->pkt_type = HAL_TX_MS(TX_RATE_STATS_INFO_0,
98 TRANSMIT_PKT_TYPE, rate_stats);
99 ts->stbc = HAL_TX_MS(TX_RATE_STATS_INFO_0,
100 TRANSMIT_STBC, rate_stats);
101 ts->ldpc = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_LDPC,
102 rate_stats);
103 ts->sgi = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_SGI,
104 rate_stats);
105 ts->mcs = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_MCS,
106 rate_stats);
107 ts->ofdma = HAL_TX_MS(TX_RATE_STATS_INFO_0, OFDMA_TRANSMISSION,
108 rate_stats);
109 ts->tones_in_ru = HAL_TX_MS(TX_RATE_STATS_INFO_0, TONES_IN_RU,
110 rate_stats);
111 }
112
113 ts->release_src = hal_tx_comp_get_buffer_source(desc);
Akshay Kosigi8eda31c2019-07-10 14:42:42 +0530114 ts->status = hal_tx_comp_get_release_reason(
115 desc,
116 hal_soc_to_hal_soc_handle(hal));
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530117
118 ts->tsf = HAL_TX_DESC_GET(desc, UNIFIED_WBM_RELEASE_RING_6,
119 TX_RATE_STATS_INFO_TX_RATE_STATS);
120}
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530121
122/**
123 * hal_tx_desc_set_buf_addr - Fill Buffer Address information in Tx Descriptor
124 * @desc: Handle to Tx Descriptor
125 * @paddr: Physical Address
126 * @pool_id: Return Buffer Manager ID
127 * @desc_id: Descriptor ID
128 * @type: 0 - Address points to a MSDU buffer
129 * 1 - Address points to MSDU extension descriptor
130 *
131 * Return: void
132 */
133static inline void hal_tx_desc_set_buf_addr_generic(void *desc,
134 dma_addr_t paddr, uint8_t pool_id,
135 uint32_t desc_id, uint8_t type)
136{
137 /* Set buffer_addr_info.buffer_addr_31_0 */
138 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_0, BUFFER_ADDR_INFO_BUF_ADDR_INFO) =
139 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_0, BUFFER_ADDR_31_0, paddr);
140
141 /* Set buffer_addr_info.buffer_addr_39_32 */
142 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
143 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
144 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, BUFFER_ADDR_39_32,
145 (((uint64_t) paddr) >> 32));
146
147 /* Set buffer_addr_info.return_buffer_manager = pool id */
148 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
149 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
150 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1,
151 RETURN_BUFFER_MANAGER, (pool_id + HAL_WBM_SW0_BM_ID));
152
153 /* Set buffer_addr_info.sw_buffer_cookie = desc_id */
154 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1,
155 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |=
156 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, SW_BUFFER_COOKIE, desc_id);
157
158 /* Set Buffer or Ext Descriptor Type */
159 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_2,
160 BUF_OR_EXT_DESC_TYPE) |=
161 HAL_TX_SM(UNIFIED_TCL_DATA_CMD_2, BUF_OR_EXT_DESC_TYPE, type);
162}
163
Vevek Venkatesan735d9fe2019-06-06 19:21:25 +0530164#if defined(QCA_WIFI_QCA6290_11AX_MU_UL) && defined(QCA_WIFI_QCA6290_11AX)
chenguof51e9222018-04-20 14:34:25 +0800165/**
166 * hal_rx_handle_other_tlvs() - handle special TLVs like MU_UL
167 * tlv_tag: Taf of the TLVs
168 * rx_tlv: the pointer to the TLVs
169 * @ppdu_info: pointer to ppdu_info
170 *
171 * Return: true if the tlv is handled, false if not
172 */
173static inline bool
174hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
175 struct hal_rx_ppdu_info *ppdu_info)
176{
177 uint32_t value;
178
179 switch (tlv_tag) {
180 case WIFIPHYRX_HE_SIG_A_MU_UL_E:
181 {
182 uint8_t *he_sig_a_mu_ul_info =
183 (uint8_t *)rx_tlv +
184 HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_UL_0,
185 HE_SIG_A_MU_UL_INFO_PHYRX_HE_SIG_A_MU_UL_INFO_DETAILS);
186 ppdu_info->rx_status.he_flags = 1;
187
188 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0,
189 FORMAT_INDICATION);
190 if (value == 0) {
191 ppdu_info->rx_status.he_data1 =
192 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
193 } else {
194 ppdu_info->rx_status.he_data1 =
195 QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
196 }
chenguo35695dd2018-09-17 15:09:06 +0800197
198 /* data1 */
199 ppdu_info->rx_status.he_data1 |=
200 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
201 QDF_MON_STATUS_HE_DL_UL_KNOWN |
202 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN;
203
204 /* data2 */
205 ppdu_info->rx_status.he_data2 |=
206 QDF_MON_STATUS_TXOP_KNOWN;
207
208 /*data3*/
209 value = HAL_RX_GET(he_sig_a_mu_ul_info,
210 HE_SIG_A_MU_UL_INFO_0, BSS_COLOR_ID);
211 ppdu_info->rx_status.he_data3 = value;
212 /* 1 for UL and 0 for DL */
213 value = 1;
214 value = value << QDF_MON_STATUS_DL_UL_SHIFT;
215 ppdu_info->rx_status.he_data3 |= value;
216
217 /*data4*/
218 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0,
219 SPATIAL_REUSE);
220 ppdu_info->rx_status.he_data4 = value;
221
222 /*data5*/
223 value = HAL_RX_GET(he_sig_a_mu_ul_info,
224 HE_SIG_A_MU_UL_INFO_0, TRANSMIT_BW);
225 ppdu_info->rx_status.he_data5 = value;
226 ppdu_info->rx_status.bw = value;
227
228 /*data6*/
229 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_1,
230 TXOP_DURATION);
231 value = value << QDF_MON_STATUS_TXOP_SHIFT;
232 ppdu_info->rx_status.he_data6 |= value;
chenguof51e9222018-04-20 14:34:25 +0800233 return true;
234 }
235 default:
236 return false;
237 }
238}
239#else
240static inline bool
241hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv,
242 struct hal_rx_ppdu_info *ppdu_info)
243{
244 return false;
245}
Vevek Venkatesan735d9fe2019-06-06 19:21:25 +0530246#endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */
chenguof51e9222018-04-20 14:34:25 +0800247
Kai Chen93f7e1b2019-07-10 16:13:48 -0700248#if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) && \
249defined(RX_PPDU_END_USER_STATS_22_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET)
250
Kai Chen52ef33f2019-03-05 18:33:40 -0800251static inline void
252hal_rx_handle_ofdma_info(
253 void *rx_tlv,
254 struct mon_rx_user_status *mon_rx_user_status)
255{
Kai Chen93f7e1b2019-07-10 16:13:48 -0700256 mon_rx_user_status->ul_ofdma_user_v0_word0 =
257 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11,
258 SW_RESPONSE_REFERENCE_PTR);
259
260 mon_rx_user_status->ul_ofdma_user_v0_word1 =
261 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22,
262 SW_RESPONSE_REFERENCE_PTR_EXT);
Kai Chen52ef33f2019-03-05 18:33:40 -0800263}
Kai Chen93f7e1b2019-07-10 16:13:48 -0700264
nobelj14531642019-06-25 17:41:55 -0700265static inline void
nobelja310bf42019-08-12 10:27:31 +0530266hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
267 struct mon_rx_user_status *mon_rx_user_status)
268{
269 uint32_t mpdu_ok_byte_count;
270 uint32_t mpdu_err_byte_count;
271
272 mpdu_ok_byte_count = HAL_RX_GET(rx_tlv,
273 RX_PPDU_END_USER_STATS_17,
274 MPDU_OK_BYTE_COUNT);
275 mpdu_err_byte_count = HAL_RX_GET(rx_tlv,
276 RX_PPDU_END_USER_STATS_19,
277 MPDU_ERR_BYTE_COUNT);
278
279 mon_rx_user_status->mpdu_ok_byte_count = mpdu_ok_byte_count;
280 mon_rx_user_status->mpdu_err_byte_count = mpdu_err_byte_count;
281}
282#else
283static inline void
284hal_rx_handle_ofdma_info(void *rx_tlv,
285 struct mon_rx_user_status *mon_rx_user_status)
286{
287}
288
289static inline void
290hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo,
291 struct mon_rx_user_status *mon_rx_user_status)
292{
293 struct hal_rx_ppdu_info *ppdu_info =
294 (struct hal_rx_ppdu_info *)ppduinfo;
295
296 /* HKV1: doesn't support mpdu byte count */
297 mon_rx_user_status->mpdu_ok_byte_count = ppdu_info->rx_status.ppdu_len;
298 mon_rx_user_status->mpdu_err_byte_count = 0;
299}
300#endif
301
302static inline void
nobelj14531642019-06-25 17:41:55 -0700303hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo,
304 struct mon_rx_user_status *mon_rx_user_status)
305{
306 struct hal_rx_ppdu_info *ppdu_info =
307 (struct hal_rx_ppdu_info *)ppduinfo;
nobelj14531642019-06-25 17:41:55 -0700308
309 mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index;
310 mon_rx_user_status->tid = ppdu_info->rx_status.tid;
311 mon_rx_user_status->tcp_msdu_count =
312 ppdu_info->rx_status.tcp_msdu_count;
313 mon_rx_user_status->udp_msdu_count =
314 ppdu_info->rx_status.udp_msdu_count;
315 mon_rx_user_status->other_msdu_count =
316 ppdu_info->rx_status.other_msdu_count;
317 mon_rx_user_status->frame_control = ppdu_info->rx_status.frame_control;
318 mon_rx_user_status->frame_control_info_valid =
319 ppdu_info->rx_status.frame_control_info_valid;
320 mon_rx_user_status->data_sequence_control_info_valid =
321 ppdu_info->rx_status.data_sequence_control_info_valid;
322 mon_rx_user_status->first_data_seq_ctrl =
323 ppdu_info->rx_status.first_data_seq_ctrl;
324 mon_rx_user_status->preamble_type = ppdu_info->rx_status.preamble_type;
325 mon_rx_user_status->ht_flags = ppdu_info->rx_status.ht_flags;
326 mon_rx_user_status->rtap_flags = ppdu_info->rx_status.rtap_flags;
327 mon_rx_user_status->vht_flags = ppdu_info->rx_status.vht_flags;
328 mon_rx_user_status->he_flags = ppdu_info->rx_status.he_flags;
329 mon_rx_user_status->rs_flags = ppdu_info->rx_status.rs_flags;
330
331 mon_rx_user_status->mpdu_cnt_fcs_ok =
332 ppdu_info->com_info.mpdu_cnt_fcs_ok;
333 mon_rx_user_status->mpdu_cnt_fcs_err =
334 ppdu_info->com_info.mpdu_cnt_fcs_err;
Chaithanya Garrepalli1f89b972019-07-31 12:33:53 +0530335 qdf_mem_copy(&mon_rx_user_status->mpdu_fcs_ok_bitmap,
336 &ppdu_info->com_info.mpdu_fcs_ok_bitmap,
337 HAL_RX_NUM_WORDS_PER_PPDU_BITMAP *
338 sizeof(ppdu_info->com_info.mpdu_fcs_ok_bitmap[0]));
nobelj14531642019-06-25 17:41:55 -0700339
nobelja310bf42019-08-12 10:27:31 +0530340 hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status);
nobelj14531642019-06-25 17:41:55 -0700341}
342
Amir Patel1d4ac982019-04-25 11:49:01 +0530343#define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \
344 ppdu_info, rssi_info_tlv) \
345 { \
346 ppdu_info->rx_status.rssi_chain[chain][0] = \
347 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
348 RSSI_PRI20_CHAIN##chain); \
349 ppdu_info->rx_status.rssi_chain[chain][1] = \
350 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
351 RSSI_EXT20_CHAIN##chain); \
352 ppdu_info->rx_status.rssi_chain[chain][2] = \
353 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
354 RSSI_EXT40_LOW20_CHAIN##chain); \
355 ppdu_info->rx_status.rssi_chain[chain][3] = \
356 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\
357 RSSI_EXT40_HIGH20_CHAIN##chain); \
358 ppdu_info->rx_status.rssi_chain[chain][4] = \
359 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
360 RSSI_EXT80_LOW20_CHAIN##chain); \
361 ppdu_info->rx_status.rssi_chain[chain][5] = \
362 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
363 RSSI_EXT80_LOW_HIGH20_CHAIN##chain); \
364 ppdu_info->rx_status.rssi_chain[chain][6] = \
365 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
366 RSSI_EXT80_HIGH_LOW20_CHAIN##chain); \
367 ppdu_info->rx_status.rssi_chain[chain][7] = \
368 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\
369 RSSI_EXT80_HIGH20_CHAIN##chain); \
370 } \
371
372#define HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) \
373 {HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(0, 0, 1, ppdu_info, rssi_info_tlv) \
374 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(1, 2, 3, ppdu_info, rssi_info_tlv) \
375 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(2, 4, 5, ppdu_info, rssi_info_tlv) \
376 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(3, 6, 7, ppdu_info, rssi_info_tlv) \
377 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(4, 8, 9, ppdu_info, rssi_info_tlv) \
378 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(5, 10, 11, ppdu_info, rssi_info_tlv) \
379 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(6, 12, 13, ppdu_info, rssi_info_tlv) \
380 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(7, 14, 15, ppdu_info, rssi_info_tlv)} \
381
382static inline uint32_t
383hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info,
384 uint8_t *rssi_info_tlv)
385{
386 HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv)
387 return 0;
388}
389
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530390/**
391 * hal_rx_status_get_tlv_info() - process receive info TLV
392 * @rx_tlv_hdr: pointer to TLV header
393 * @ppdu_info: pointer to ppdu_info
394 *
395 * Return: HAL_TLV_STATUS_PPDU_NOT_DONE or HAL_TLV_STATUS_PPDU_DONE from tlv
396 */
397static inline uint32_t
398hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo,
Akshay Kosigi6a206752019-06-10 23:14:52 +0530399 hal_soc_handle_t hal_soc_hdl,
400 qdf_nbuf_t nbuf)
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530401{
Akshay Kosigi6a206752019-06-10 23:14:52 +0530402 struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530403 uint32_t tlv_tag, user_id, tlv_len, value;
404 uint8_t group_id = 0;
405 uint8_t he_dcm = 0;
406 uint8_t he_stbc = 0;
407 uint16_t he_gi = 0;
408 uint16_t he_ltf = 0;
409 void *rx_tlv;
410 bool unhandled = false;
Kai Chen52ef33f2019-03-05 18:33:40 -0800411 struct mon_rx_user_status *mon_rx_user_status;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530412 struct hal_rx_ppdu_info *ppdu_info =
413 (struct hal_rx_ppdu_info *)ppduinfo;
414
415 tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr);
416 user_id = HAL_RX_GET_USER_TLV32_USERID(rx_tlv_hdr);
417 tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr);
418
419 rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE;
Kai Chen52ef33f2019-03-05 18:33:40 -0800420
421 qdf_trace_hex_dump(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
422 rx_tlv, tlv_len);
423
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530424 switch (tlv_tag) {
425
426 case WIFIRX_PPDU_START_E:
Amir Patel57e7e052019-05-15 20:49:57 +0530427 {
428 struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info;
429
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530430 ppdu_info->com_info.ppdu_id =
431 HAL_RX_GET(rx_tlv, RX_PPDU_START_0,
432 PHY_PPDU_ID);
433 /* channel number is set in PHY meta data */
434 ppdu_info->rx_status.chan_num =
435 HAL_RX_GET(rx_tlv, RX_PPDU_START_1,
436 SW_PHY_META_DATA);
437 ppdu_info->com_info.ppdu_timestamp =
438 HAL_RX_GET(rx_tlv, RX_PPDU_START_2,
439 PPDU_START_TIMESTAMP);
Adil Saeed Musthafaae6a73d2018-10-30 16:24:18 -0700440 ppdu_info->rx_status.ppdu_timestamp =
441 ppdu_info->com_info.ppdu_timestamp;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530442 ppdu_info->rx_state = HAL_RX_MON_PPDU_START;
Amir Patel57e7e052019-05-15 20:49:57 +0530443
444 /* If last ppdu_id doesn't match new ppdu_id,
445 * 1. reset mpdu_cnt
446 * 2. update last_ppdu_id with new
Amir Patel44bd8072019-08-05 11:36:17 +0530447 * 3. reset mpdu fcs bitmap
Amir Patel57e7e052019-05-15 20:49:57 +0530448 */
449 if (com_info->ppdu_id != com_info->last_ppdu_id) {
450 com_info->mpdu_cnt = 0;
451 com_info->last_ppdu_id =
452 com_info->ppdu_id;
nobelj14531642019-06-25 17:41:55 -0700453 com_info->num_users = 0;
Amir Patel44bd8072019-08-05 11:36:17 +0530454 qdf_mem_zero(&com_info->mpdu_fcs_ok_bitmap,
455 HAL_RX_NUM_WORDS_PER_PPDU_BITMAP *
456 sizeof(com_info->mpdu_fcs_ok_bitmap[0]));
Amir Patel57e7e052019-05-15 20:49:57 +0530457 }
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530458 break;
Amir Patel57e7e052019-05-15 20:49:57 +0530459 }
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530460
461 case WIFIRX_PPDU_START_USER_INFO_E:
462 break;
463
464 case WIFIRX_PPDU_END_E:
465 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
466 "[%s][%d] ppdu_end_e len=%d",
467 __func__, __LINE__, tlv_len);
468 /* This is followed by sub-TLVs of PPDU_END */
469 ppdu_info->rx_state = HAL_RX_MON_PPDU_END;
470 break;
471
472 case WIFIRXPCU_PPDU_END_INFO_E:
Amir Patel5a8bbbe2019-07-17 21:59:39 +0530473 ppdu_info->rx_status.rx_antenna =
474 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2, RX_ANTENNA);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530475 ppdu_info->rx_status.tsft =
476 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_1,
477 WB_TIMESTAMP_UPPER_32);
478 ppdu_info->rx_status.tsft = (ppdu_info->rx_status.tsft << 32) |
479 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_0,
480 WB_TIMESTAMP_LOWER_32);
481 ppdu_info->rx_status.duration =
482 HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_8,
483 RX_PPDU_DURATION);
484 break;
485
nobelj14531642019-06-25 17:41:55 -0700486 /*
487 * WIFIRX_PPDU_END_USER_STATS_E comes for each user received.
488 * for MU, based on num users we see this tlv that many times.
489 */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530490 case WIFIRX_PPDU_END_USER_STATS_E:
491 {
492 unsigned long tid = 0;
493 uint16_t seq = 0;
494
495 ppdu_info->rx_status.ast_index =
496 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4,
497 AST_INDEX);
498
499 tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12,
500 RECEIVED_QOS_DATA_TID_BITMAP);
501 ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, sizeof(tid)*8);
502
503 if (ppdu_info->rx_status.tid == (sizeof(tid) * 8))
504 ppdu_info->rx_status.tid = HAL_TID_INVALID;
505
506 ppdu_info->rx_status.tcp_msdu_count =
507 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9,
508 TCP_MSDU_COUNT) +
509 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
510 TCP_ACK_MSDU_COUNT);
511 ppdu_info->rx_status.udp_msdu_count =
512 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9,
513 UDP_MSDU_COUNT);
514 ppdu_info->rx_status.other_msdu_count =
515 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10,
516 OTHER_MSDU_COUNT);
517
518 ppdu_info->rx_status.frame_control_info_valid =
519 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
Anish Natarajeb30aa72018-09-20 16:34:01 +0530520 FRAME_CONTROL_INFO_VALID);
521
522 if (ppdu_info->rx_status.frame_control_info_valid)
523 ppdu_info->rx_status.frame_control =
524 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4,
525 FRAME_CONTROL_FIELD);
526
527 ppdu_info->rx_status.data_sequence_control_info_valid =
528 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
529 DATA_SEQUENCE_CONTROL_INFO_VALID);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530530
531 seq = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_5,
Anish Natarajeb30aa72018-09-20 16:34:01 +0530532 FIRST_DATA_SEQ_CTRL);
533 if (ppdu_info->rx_status.data_sequence_control_info_valid)
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530534 ppdu_info->rx_status.first_data_seq_ctrl = seq;
535
536 ppdu_info->rx_status.preamble_type =
537 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
538 HT_CONTROL_FIELD_PKT_TYPE);
539 switch (ppdu_info->rx_status.preamble_type) {
540 case HAL_RX_PKT_TYPE_11N:
541 ppdu_info->rx_status.ht_flags = 1;
542 ppdu_info->rx_status.rtap_flags |= HT_SGI_PRESENT;
543 break;
544 case HAL_RX_PKT_TYPE_11AC:
545 ppdu_info->rx_status.vht_flags = 1;
546 break;
547 case HAL_RX_PKT_TYPE_11AX:
548 ppdu_info->rx_status.he_flags = 1;
549 break;
550 default:
551 break;
552 }
Kai Chen52ef33f2019-03-05 18:33:40 -0800553
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530554 ppdu_info->com_info.mpdu_cnt_fcs_ok =
555 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3,
556 MPDU_CNT_FCS_OK);
557 ppdu_info->com_info.mpdu_cnt_fcs_err =
558 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2,
559 MPDU_CNT_FCS_ERR);
560 if ((ppdu_info->com_info.mpdu_cnt_fcs_ok |
561 ppdu_info->com_info.mpdu_cnt_fcs_err) > 1)
562 ppdu_info->rx_status.rs_flags |= IEEE80211_AMPDU_FLAG;
563 else
564 ppdu_info->rx_status.rs_flags &=
565 (~IEEE80211_AMPDU_FLAG);
Amir Patel57e7e052019-05-15 20:49:57 +0530566
Chaithanya Garrepalli1f89b972019-07-31 12:33:53 +0530567 ppdu_info->com_info.mpdu_fcs_ok_bitmap[0] =
568 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_7,
569 FCS_OK_BITMAP_31_0);
Amir Patel57e7e052019-05-15 20:49:57 +0530570
Chaithanya Garrepalli1f89b972019-07-31 12:33:53 +0530571 ppdu_info->com_info.mpdu_fcs_ok_bitmap[1] =
572 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_8,
573 FCS_OK_BITMAP_63_32);
Amir Patel57e7e052019-05-15 20:49:57 +0530574
nobelj14531642019-06-25 17:41:55 -0700575 if (user_id < HAL_MAX_UL_MU_USERS) {
576 mon_rx_user_status =
577 &ppdu_info->rx_user_status[user_id];
578
579 hal_rx_handle_ofdma_info(rx_tlv, mon_rx_user_status);
580
581 ppdu_info->com_info.num_users++;
582
583 hal_rx_populate_mu_user_info(rx_tlv, ppdu_info,
584 mon_rx_user_status);
585 }
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530586 break;
587 }
588
589 case WIFIRX_PPDU_END_USER_STATS_EXT_E:
Chaithanya Garrepalli1f89b972019-07-31 12:33:53 +0530590 ppdu_info->com_info.mpdu_fcs_ok_bitmap[2] =
591 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_1,
592 FCS_OK_BITMAP_95_64);
593
594 ppdu_info->com_info.mpdu_fcs_ok_bitmap[3] =
595 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_2,
596 FCS_OK_BITMAP_127_96);
597
598 ppdu_info->com_info.mpdu_fcs_ok_bitmap[4] =
599 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_3,
600 FCS_OK_BITMAP_159_128);
601
602 ppdu_info->com_info.mpdu_fcs_ok_bitmap[5] =
603 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_4,
604 FCS_OK_BITMAP_191_160);
605
606 ppdu_info->com_info.mpdu_fcs_ok_bitmap[6] =
607 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_5,
608 FCS_OK_BITMAP_223_192);
609
610 ppdu_info->com_info.mpdu_fcs_ok_bitmap[7] =
611 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_6,
612 FCS_OK_BITMAP_255_224);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530613 break;
614
615 case WIFIRX_PPDU_END_STATUS_DONE_E:
616 return HAL_TLV_STATUS_PPDU_DONE;
617
618 case WIFIDUMMY_E:
619 return HAL_TLV_STATUS_BUF_DONE;
620
621 case WIFIPHYRX_HT_SIG_E:
622 {
623 uint8_t *ht_sig_info = (uint8_t *)rx_tlv +
624 HAL_RX_OFFSET(UNIFIED_PHYRX_HT_SIG_0,
625 HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS);
626 value = HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1,
627 FEC_CODING);
628 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
629 1 : 0;
630 ppdu_info->rx_status.mcs = HAL_RX_GET(ht_sig_info,
631 HT_SIG_INFO_0, MCS);
Keyur Parekhf72cbe52018-11-15 15:56:07 -0800632 ppdu_info->rx_status.ht_mcs = ppdu_info->rx_status.mcs;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530633 ppdu_info->rx_status.bw = HAL_RX_GET(ht_sig_info,
634 HT_SIG_INFO_0, CBW);
635 ppdu_info->rx_status.sgi = HAL_RX_GET(ht_sig_info,
636 HT_SIG_INFO_1, SHORT_GI);
Keyur Parekhba758572018-08-06 15:00:40 -0700637 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
Keyur Parekhf72cbe52018-11-15 15:56:07 -0800638 ppdu_info->rx_status.nss = ((ppdu_info->rx_status.mcs) >>
639 HT_SIG_SU_NSS_SHIFT) + 1;
640 ppdu_info->rx_status.mcs &= ((1 << HT_SIG_SU_NSS_SHIFT) - 1);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530641 break;
642 }
643
644 case WIFIPHYRX_L_SIG_B_E:
645 {
646 uint8_t *l_sig_b_info = (uint8_t *)rx_tlv +
647 HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_B_0,
648 L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS);
649
650 value = HAL_RX_GET(l_sig_b_info, L_SIG_B_INFO_0, RATE);
Adil Saeed Musthafaae6a73d2018-10-30 16:24:18 -0700651 ppdu_info->rx_status.l_sig_b_info = *((uint32_t *)l_sig_b_info);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530652 switch (value) {
653 case 1:
654 ppdu_info->rx_status.rate = HAL_11B_RATE_3MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700655 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530656 break;
657 case 2:
658 ppdu_info->rx_status.rate = HAL_11B_RATE_2MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700659 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530660 break;
661 case 3:
662 ppdu_info->rx_status.rate = HAL_11B_RATE_1MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700663 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530664 break;
665 case 4:
666 ppdu_info->rx_status.rate = HAL_11B_RATE_0MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700667 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530668 break;
669 case 5:
670 ppdu_info->rx_status.rate = HAL_11B_RATE_6MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700671 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530672 break;
673 case 6:
674 ppdu_info->rx_status.rate = HAL_11B_RATE_5MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700675 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530676 break;
677 case 7:
678 ppdu_info->rx_status.rate = HAL_11B_RATE_4MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700679 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530680 break;
681 default:
682 break;
683 }
684 ppdu_info->rx_status.cck_flag = 1;
Keyur Parekhba758572018-08-06 15:00:40 -0700685 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530686 break;
687 }
688
689 case WIFIPHYRX_L_SIG_A_E:
690 {
691 uint8_t *l_sig_a_info = (uint8_t *)rx_tlv +
692 HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_A_0,
693 L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS);
694
695 value = HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, RATE);
Adil Saeed Musthafaae6a73d2018-10-30 16:24:18 -0700696 ppdu_info->rx_status.l_sig_a_info = *((uint32_t *)l_sig_a_info);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530697 switch (value) {
698 case 8:
699 ppdu_info->rx_status.rate = HAL_11A_RATE_0MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700700 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530701 break;
702 case 9:
703 ppdu_info->rx_status.rate = HAL_11A_RATE_1MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700704 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530705 break;
706 case 10:
707 ppdu_info->rx_status.rate = HAL_11A_RATE_2MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700708 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530709 break;
710 case 11:
711 ppdu_info->rx_status.rate = HAL_11A_RATE_3MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700712 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530713 break;
714 case 12:
715 ppdu_info->rx_status.rate = HAL_11A_RATE_4MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700716 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530717 break;
718 case 13:
719 ppdu_info->rx_status.rate = HAL_11A_RATE_5MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700720 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530721 break;
722 case 14:
723 ppdu_info->rx_status.rate = HAL_11A_RATE_6MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700724 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530725 break;
726 case 15:
727 ppdu_info->rx_status.rate = HAL_11A_RATE_7MCS;
Keyur Parekh76eadf42018-08-23 12:00:20 -0700728 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS7;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530729 break;
730 default:
731 break;
732 }
733 ppdu_info->rx_status.ofdm_flag = 1;
Keyur Parekhba758572018-08-06 15:00:40 -0700734 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530735 break;
736 }
737
738 case WIFIPHYRX_VHT_SIG_A_E:
739 {
740 uint8_t *vht_sig_a_info = (uint8_t *)rx_tlv +
741 HAL_RX_OFFSET(UNIFIED_PHYRX_VHT_SIG_A_0,
742 VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS);
743
744 value = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1,
745 SU_MU_CODING);
746 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
747 1 : 0;
748 group_id = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0, GROUP_ID);
749 ppdu_info->rx_status.vht_flag_values5 = group_id;
750 ppdu_info->rx_status.mcs = HAL_RX_GET(vht_sig_a_info,
751 VHT_SIG_A_INFO_1, MCS);
752 ppdu_info->rx_status.sgi = HAL_RX_GET(vht_sig_a_info,
753 VHT_SIG_A_INFO_1, GI_SETTING);
754
755 switch (hal->target_type) {
756 case TARGET_TYPE_QCA8074:
757 case TARGET_TYPE_QCA8074V2:
Basamma Yakkanahalli5f7cfd42018-11-02 15:52:37 +0530758 case TARGET_TYPE_QCA6018:
Nandha Kishore Easwaran5d3475b2019-06-27 11:38:53 +0530759 case TARGET_TYPE_QCN9000:
Jinwei Chen49cd7b92019-06-21 17:56:14 +0800760#ifdef QCA_WIFI_QCA6390
761 case TARGET_TYPE_QCA6390:
762#endif
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530763 ppdu_info->rx_status.is_stbc =
764 HAL_RX_GET(vht_sig_a_info,
765 VHT_SIG_A_INFO_0, STBC);
766 value = HAL_RX_GET(vht_sig_a_info,
767 VHT_SIG_A_INFO_0, N_STS);
Viyom Mittal2d24c562019-07-01 17:12:27 +0530768 value = value & VHT_SIG_SU_NSS_MASK;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530769 if (ppdu_info->rx_status.is_stbc && (value > 0))
770 value = ((value + 1) >> 1) - 1;
771 ppdu_info->rx_status.nss =
772 ((value & VHT_SIG_SU_NSS_MASK) + 1);
773
774 break;
775 case TARGET_TYPE_QCA6290:
776#if !defined(QCA_WIFI_QCA6290_11AX)
777 ppdu_info->rx_status.is_stbc =
778 HAL_RX_GET(vht_sig_a_info,
779 VHT_SIG_A_INFO_0, STBC);
780 value = HAL_RX_GET(vht_sig_a_info,
781 VHT_SIG_A_INFO_0, N_STS);
Viyom Mittal2d24c562019-07-01 17:12:27 +0530782 value = value & VHT_SIG_SU_NSS_MASK;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530783 if (ppdu_info->rx_status.is_stbc && (value > 0))
784 value = ((value + 1) >> 1) - 1;
785 ppdu_info->rx_status.nss =
786 ((value & VHT_SIG_SU_NSS_MASK) + 1);
787#else
788 ppdu_info->rx_status.nss = 0;
789#endif
790 break;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530791 default:
792 break;
793 }
794 ppdu_info->rx_status.vht_flag_values3[0] =
795 (((ppdu_info->rx_status.mcs) << 4)
796 | ppdu_info->rx_status.nss);
797 ppdu_info->rx_status.bw = HAL_RX_GET(vht_sig_a_info,
798 VHT_SIG_A_INFO_0, BANDWIDTH);
799 ppdu_info->rx_status.vht_flag_values2 =
800 ppdu_info->rx_status.bw;
801 ppdu_info->rx_status.vht_flag_values4 =
802 HAL_RX_GET(vht_sig_a_info,
803 VHT_SIG_A_INFO_1, SU_MU_CODING);
804
805 ppdu_info->rx_status.beamformed = HAL_RX_GET(vht_sig_a_info,
806 VHT_SIG_A_INFO_1, BEAMFORMED);
Keyur Parekhba758572018-08-06 15:00:40 -0700807 if (group_id == 0 || group_id == 63)
808 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
809 else
810 ppdu_info->rx_status.reception_type =
811 HAL_RX_TYPE_MU_MIMO;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530812
813 break;
814 }
815 case WIFIPHYRX_HE_SIG_A_SU_E:
816 {
817 uint8_t *he_sig_a_su_info = (uint8_t *)rx_tlv +
818 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_SU_0,
819 HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS);
820 ppdu_info->rx_status.he_flags = 1;
821 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0,
822 FORMAT_INDICATION);
823 if (value == 0) {
824 ppdu_info->rx_status.he_data1 =
825 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
826 } else {
827 ppdu_info->rx_status.he_data1 =
828 QDF_MON_STATUS_HE_SU_FORMAT_TYPE;
829 }
830
831 /* data1 */
832 ppdu_info->rx_status.he_data1 |=
833 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
834 QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN |
835 QDF_MON_STATUS_HE_DL_UL_KNOWN |
836 QDF_MON_STATUS_HE_MCS_KNOWN |
837 QDF_MON_STATUS_HE_DCM_KNOWN |
838 QDF_MON_STATUS_HE_CODING_KNOWN |
839 QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN |
840 QDF_MON_STATUS_HE_STBC_KNOWN |
841 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN |
842 QDF_MON_STATUS_HE_DOPPLER_KNOWN;
843
844 /* data2 */
845 ppdu_info->rx_status.he_data2 =
846 QDF_MON_STATUS_HE_GI_KNOWN;
847 ppdu_info->rx_status.he_data2 |=
848 QDF_MON_STATUS_TXBF_KNOWN |
849 QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
850 QDF_MON_STATUS_TXOP_KNOWN |
851 QDF_MON_STATUS_LTF_SYMBOLS_KNOWN |
852 QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
853 QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
854
855 /* data3 */
856 value = HAL_RX_GET(he_sig_a_su_info,
857 HE_SIG_A_SU_INFO_0, BSS_COLOR_ID);
858 ppdu_info->rx_status.he_data3 = value;
859 value = HAL_RX_GET(he_sig_a_su_info,
860 HE_SIG_A_SU_INFO_0, BEAM_CHANGE);
861 value = value << QDF_MON_STATUS_BEAM_CHANGE_SHIFT;
862 ppdu_info->rx_status.he_data3 |= value;
863 value = HAL_RX_GET(he_sig_a_su_info,
864 HE_SIG_A_SU_INFO_0, DL_UL_FLAG);
865 value = value << QDF_MON_STATUS_DL_UL_SHIFT;
866 ppdu_info->rx_status.he_data3 |= value;
867
868 value = HAL_RX_GET(he_sig_a_su_info,
869 HE_SIG_A_SU_INFO_0, TRANSMIT_MCS);
870 ppdu_info->rx_status.mcs = value;
871 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
872 ppdu_info->rx_status.he_data3 |= value;
873
874 value = HAL_RX_GET(he_sig_a_su_info,
875 HE_SIG_A_SU_INFO_0, DCM);
876 he_dcm = value;
877 value = value << QDF_MON_STATUS_DCM_SHIFT;
878 ppdu_info->rx_status.he_data3 |= value;
879 value = HAL_RX_GET(he_sig_a_su_info,
880 HE_SIG_A_SU_INFO_1, CODING);
Keyur Parekh25ee3162019-02-08 23:01:39 -0800881 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ?
882 1 : 0;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530883 value = value << QDF_MON_STATUS_CODING_SHIFT;
884 ppdu_info->rx_status.he_data3 |= value;
885 value = HAL_RX_GET(he_sig_a_su_info,
886 HE_SIG_A_SU_INFO_1,
887 LDPC_EXTRA_SYMBOL);
888 value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT;
889 ppdu_info->rx_status.he_data3 |= value;
890 value = HAL_RX_GET(he_sig_a_su_info,
891 HE_SIG_A_SU_INFO_1, STBC);
892 he_stbc = value;
893 value = value << QDF_MON_STATUS_STBC_SHIFT;
894 ppdu_info->rx_status.he_data3 |= value;
895
896 /* data4 */
897 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0,
898 SPATIAL_REUSE);
899 ppdu_info->rx_status.he_data4 = value;
900
901 /* data5 */
902 value = HAL_RX_GET(he_sig_a_su_info,
903 HE_SIG_A_SU_INFO_0, TRANSMIT_BW);
904 ppdu_info->rx_status.he_data5 = value;
905 ppdu_info->rx_status.bw = value;
906 value = HAL_RX_GET(he_sig_a_su_info,
907 HE_SIG_A_SU_INFO_0, CP_LTF_SIZE);
908 switch (value) {
909 case 0:
910 he_gi = HE_GI_0_8;
911 he_ltf = HE_LTF_1_X;
912 break;
913 case 1:
914 he_gi = HE_GI_0_8;
915 he_ltf = HE_LTF_2_X;
916 break;
917 case 2:
918 he_gi = HE_GI_1_6;
919 he_ltf = HE_LTF_2_X;
920 break;
921 case 3:
922 if (he_dcm && he_stbc) {
923 he_gi = HE_GI_0_8;
924 he_ltf = HE_LTF_4_X;
925 } else {
926 he_gi = HE_GI_3_2;
927 he_ltf = HE_LTF_4_X;
928 }
929 break;
930 }
931 ppdu_info->rx_status.sgi = he_gi;
932 value = he_gi << QDF_MON_STATUS_GI_SHIFT;
933 ppdu_info->rx_status.he_data5 |= value;
934 value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT;
Keyur Parekh44d8f8f2019-03-12 12:39:41 -0700935 ppdu_info->rx_status.ltf_size = he_ltf;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530936 ppdu_info->rx_status.he_data5 |= value;
937
938 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS);
939 value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
940 ppdu_info->rx_status.he_data5 |= value;
941
942 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
943 PACKET_EXTENSION_A_FACTOR);
944 value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT;
945 ppdu_info->rx_status.he_data5 |= value;
946
947 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, TXBF);
948 value = value << QDF_MON_STATUS_TXBF_SHIFT;
949 ppdu_info->rx_status.he_data5 |= value;
950 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
951 PACKET_EXTENSION_PE_DISAMBIGUITY);
952 value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT;
953 ppdu_info->rx_status.he_data5 |= value;
954
955 /* data6 */
956 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS);
957 value++;
958 ppdu_info->rx_status.nss = value;
959 ppdu_info->rx_status.he_data6 = value;
960 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
961 DOPPLER_INDICATION);
962 value = value << QDF_MON_STATUS_DOPPLER_SHIFT;
963 ppdu_info->rx_status.he_data6 |= value;
964 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1,
965 TXOP_DURATION);
966 value = value << QDF_MON_STATUS_TXOP_SHIFT;
967 ppdu_info->rx_status.he_data6 |= value;
968
969 ppdu_info->rx_status.beamformed = HAL_RX_GET(he_sig_a_su_info,
970 HE_SIG_A_SU_INFO_1, TXBF);
Keyur Parekhba758572018-08-06 15:00:40 -0700971 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +0530972 break;
973 }
974 case WIFIPHYRX_HE_SIG_A_MU_DL_E:
975 {
976 uint8_t *he_sig_a_mu_dl_info = (uint8_t *)rx_tlv +
977 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_MU_DL_0,
978 HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS);
979
980 ppdu_info->rx_status.he_mu_flags = 1;
981
982 /* HE Flags */
983 /*data1*/
984 ppdu_info->rx_status.he_data1 =
985 QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
986 ppdu_info->rx_status.he_data1 |=
987 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN |
988 QDF_MON_STATUS_HE_DL_UL_KNOWN |
989 QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN |
990 QDF_MON_STATUS_HE_STBC_KNOWN |
991 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN |
992 QDF_MON_STATUS_HE_DOPPLER_KNOWN;
993
994 /* data2 */
995 ppdu_info->rx_status.he_data2 =
996 QDF_MON_STATUS_HE_GI_KNOWN;
997 ppdu_info->rx_status.he_data2 |=
998 QDF_MON_STATUS_LTF_SYMBOLS_KNOWN |
999 QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN |
1000 QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN |
1001 QDF_MON_STATUS_TXOP_KNOWN |
1002 QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN;
1003
1004 /*data3*/
1005 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1006 HE_SIG_A_MU_DL_INFO_0, BSS_COLOR_ID);
1007 ppdu_info->rx_status.he_data3 = value;
1008
1009 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1010 HE_SIG_A_MU_DL_INFO_0, DL_UL_FLAG);
1011 value = value << QDF_MON_STATUS_DL_UL_SHIFT;
1012 ppdu_info->rx_status.he_data3 |= value;
1013
1014 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1015 HE_SIG_A_MU_DL_INFO_1,
1016 LDPC_EXTRA_SYMBOL);
1017 value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT;
1018 ppdu_info->rx_status.he_data3 |= value;
1019
1020 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1021 HE_SIG_A_MU_DL_INFO_1, STBC);
1022 he_stbc = value;
1023 value = value << QDF_MON_STATUS_STBC_SHIFT;
1024 ppdu_info->rx_status.he_data3 |= value;
1025
1026 /*data4*/
1027 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0,
1028 SPATIAL_REUSE);
1029 ppdu_info->rx_status.he_data4 = value;
1030
1031 /*data5*/
1032 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1033 HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
1034 ppdu_info->rx_status.he_data5 = value;
1035 ppdu_info->rx_status.bw = value;
1036
1037 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1038 HE_SIG_A_MU_DL_INFO_0, CP_LTF_SIZE);
1039 switch (value) {
1040 case 0:
1041 he_gi = HE_GI_0_8;
1042 he_ltf = HE_LTF_4_X;
1043 break;
1044 case 1:
1045 he_gi = HE_GI_0_8;
1046 he_ltf = HE_LTF_2_X;
1047 break;
1048 case 2:
1049 he_gi = HE_GI_1_6;
1050 he_ltf = HE_LTF_2_X;
1051 break;
1052 case 3:
1053 he_gi = HE_GI_3_2;
1054 he_ltf = HE_LTF_4_X;
1055 break;
1056 }
1057 ppdu_info->rx_status.sgi = he_gi;
1058 value = he_gi << QDF_MON_STATUS_GI_SHIFT;
1059 ppdu_info->rx_status.he_data5 |= value;
1060
1061 value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT;
1062 ppdu_info->rx_status.he_data5 |= value;
1063
1064 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1065 HE_SIG_A_MU_DL_INFO_1, NUM_LTF_SYMBOLS);
1066 value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT);
1067 ppdu_info->rx_status.he_data5 |= value;
1068
1069 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1070 PACKET_EXTENSION_A_FACTOR);
1071 value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT;
1072 ppdu_info->rx_status.he_data5 |= value;
1073
1074
1075 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1076 PACKET_EXTENSION_PE_DISAMBIGUITY);
1077 value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT;
1078 ppdu_info->rx_status.he_data5 |= value;
1079
1080 /*data6*/
1081 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0,
1082 DOPPLER_INDICATION);
1083 value = value << QDF_MON_STATUS_DOPPLER_SHIFT;
1084 ppdu_info->rx_status.he_data6 |= value;
1085
1086 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1,
1087 TXOP_DURATION);
1088 value = value << QDF_MON_STATUS_TXOP_SHIFT;
1089 ppdu_info->rx_status.he_data6 |= value;
1090
1091 /* HE-MU Flags */
1092 /* HE-MU-flags1 */
1093 ppdu_info->rx_status.he_flags1 =
1094 QDF_MON_STATUS_SIG_B_MCS_KNOWN |
1095 QDF_MON_STATUS_SIG_B_DCM_KNOWN |
1096 QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN |
1097 QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN |
1098 QDF_MON_STATUS_RU_0_KNOWN;
1099
1100 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1101 HE_SIG_A_MU_DL_INFO_0, MCS_OF_SIG_B);
1102 ppdu_info->rx_status.he_flags1 |= value;
1103 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1104 HE_SIG_A_MU_DL_INFO_0, DCM_OF_SIG_B);
1105 value = value << QDF_MON_STATUS_DCM_FLAG_1_SHIFT;
1106 ppdu_info->rx_status.he_flags1 |= value;
1107
1108 /* HE-MU-flags2 */
1109 ppdu_info->rx_status.he_flags2 =
1110 QDF_MON_STATUS_BW_KNOWN;
1111
1112 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1113 HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW);
1114 ppdu_info->rx_status.he_flags2 |= value;
1115 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1116 HE_SIG_A_MU_DL_INFO_0, COMP_MODE_SIG_B);
1117 value = value << QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT;
1118 ppdu_info->rx_status.he_flags2 |= value;
1119 value = HAL_RX_GET(he_sig_a_mu_dl_info,
1120 HE_SIG_A_MU_DL_INFO_0, NUM_SIG_B_SYMBOLS);
1121 value = value - 1;
1122 value = value << QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT;
1123 ppdu_info->rx_status.he_flags2 |= value;
Keyur Parekhba758572018-08-06 15:00:40 -07001124 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301125 break;
1126 }
1127 case WIFIPHYRX_HE_SIG_B1_MU_E:
1128 {
1129
1130 uint8_t *he_sig_b1_mu_info = (uint8_t *)rx_tlv +
1131 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B1_MU_0,
1132 HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS);
1133
1134 ppdu_info->rx_status.he_sig_b_common_known |=
1135 QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU0;
1136 /* TODO: Check on the availability of other fields in
1137 * sig_b_common
1138 */
1139
1140 value = HAL_RX_GET(he_sig_b1_mu_info,
1141 HE_SIG_B1_MU_INFO_0, RU_ALLOCATION);
1142 ppdu_info->rx_status.he_RU[0] = value;
Keyur Parekhba758572018-08-06 15:00:40 -07001143 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301144 break;
1145 }
1146 case WIFIPHYRX_HE_SIG_B2_MU_E:
1147 {
1148 uint8_t *he_sig_b2_mu_info = (uint8_t *)rx_tlv +
1149 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_MU_0,
1150 HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS);
1151 /*
1152 * Not all "HE" fields can be updated from
1153 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E
1154 * to populate rest of the "HE" fields for MU scenarios.
1155 */
1156
1157 /* HE-data1 */
1158 ppdu_info->rx_status.he_data1 |=
1159 QDF_MON_STATUS_HE_MCS_KNOWN |
1160 QDF_MON_STATUS_HE_CODING_KNOWN;
1161
1162 /* HE-data2 */
1163
1164 /* HE-data3 */
1165 value = HAL_RX_GET(he_sig_b2_mu_info,
1166 HE_SIG_B2_MU_INFO_0, STA_MCS);
1167 ppdu_info->rx_status.mcs = value;
1168 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1169 ppdu_info->rx_status.he_data3 |= value;
1170
1171
1172 value = HAL_RX_GET(he_sig_b2_mu_info,
1173 HE_SIG_B2_MU_INFO_0, STA_CODING);
1174 value = value << QDF_MON_STATUS_CODING_SHIFT;
1175 ppdu_info->rx_status.he_data3 |= value;
1176
1177 /* HE-data4 */
1178 value = HAL_RX_GET(he_sig_b2_mu_info,
1179 HE_SIG_B2_MU_INFO_0, STA_ID);
1180 value = value << QDF_MON_STATUS_STA_ID_SHIFT;
1181 ppdu_info->rx_status.he_data4 |= value;
1182
1183 /* HE-data5 */
1184
1185 /* HE-data6 */
1186 value = HAL_RX_GET(he_sig_b2_mu_info,
1187 HE_SIG_B2_MU_INFO_0, NSTS);
1188 /* value n indicates n+1 spatial streams */
1189 value++;
1190 ppdu_info->rx_status.nss = value;
1191 ppdu_info->rx_status.he_data6 |= value;
1192
1193 break;
1194
1195 }
1196 case WIFIPHYRX_HE_SIG_B2_OFDMA_E:
1197 {
1198 uint8_t *he_sig_b2_ofdma_info =
1199 (uint8_t *)rx_tlv +
1200 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0,
1201 HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS);
1202
1203 /*
1204 * Not all "HE" fields can be updated from
1205 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E
1206 * to populate rest of "HE" fields for MU OFDMA scenarios.
1207 */
1208
1209 /* HE-data1 */
1210 ppdu_info->rx_status.he_data1 |=
1211 QDF_MON_STATUS_HE_MCS_KNOWN |
1212 QDF_MON_STATUS_HE_DCM_KNOWN |
1213 QDF_MON_STATUS_HE_CODING_KNOWN;
1214
1215 /* HE-data2 */
1216 ppdu_info->rx_status.he_data2 |=
1217 QDF_MON_STATUS_TXBF_KNOWN;
1218
1219 /* HE-data3 */
1220 value = HAL_RX_GET(he_sig_b2_ofdma_info,
1221 HE_SIG_B2_OFDMA_INFO_0, STA_MCS);
1222 ppdu_info->rx_status.mcs = value;
1223 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT;
1224 ppdu_info->rx_status.he_data3 |= value;
1225
1226 value = HAL_RX_GET(he_sig_b2_ofdma_info,
1227 HE_SIG_B2_OFDMA_INFO_0, STA_DCM);
1228 he_dcm = value;
1229 value = value << QDF_MON_STATUS_DCM_SHIFT;
1230 ppdu_info->rx_status.he_data3 |= value;
1231
1232 value = HAL_RX_GET(he_sig_b2_ofdma_info,
1233 HE_SIG_B2_OFDMA_INFO_0, STA_CODING);
1234 value = value << QDF_MON_STATUS_CODING_SHIFT;
1235 ppdu_info->rx_status.he_data3 |= value;
1236
1237 /* HE-data4 */
1238 value = HAL_RX_GET(he_sig_b2_ofdma_info,
1239 HE_SIG_B2_OFDMA_INFO_0, STA_ID);
1240 value = value << QDF_MON_STATUS_STA_ID_SHIFT;
1241 ppdu_info->rx_status.he_data4 |= value;
1242
1243 /* HE-data5 */
1244 value = HAL_RX_GET(he_sig_b2_ofdma_info,
1245 HE_SIG_B2_OFDMA_INFO_0, TXBF);
1246 value = value << QDF_MON_STATUS_TXBF_SHIFT;
1247 ppdu_info->rx_status.he_data5 |= value;
1248
1249 /* HE-data6 */
1250 value = HAL_RX_GET(he_sig_b2_ofdma_info,
1251 HE_SIG_B2_OFDMA_INFO_0, NSTS);
1252 /* value n indicates n+1 spatial streams */
1253 value++;
1254 ppdu_info->rx_status.nss = value;
1255 ppdu_info->rx_status.he_data6 |= value;
Keyur Parekhba758572018-08-06 15:00:40 -07001256 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301257 break;
1258 }
1259 case WIFIPHYRX_RSSI_LEGACY_E:
1260 {
chenguo33f505a2018-10-15 17:17:46 +08001261 uint8_t reception_type;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301262 uint8_t *rssi_info_tlv = (uint8_t *)rx_tlv +
Kai Chen52ef33f2019-03-05 18:33:40 -08001263 HAL_RX_OFFSET(UNIFIED_PHYRX_RSSI_LEGACY_19,
1264 RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301265
1266 ppdu_info->rx_status.rssi_comb = HAL_RX_GET(rx_tlv,
1267 PHYRX_RSSI_LEGACY_35, RSSI_COMB);
1268 ppdu_info->rx_status.bw = hal->ops->hal_rx_get_tlv(rx_tlv);
1269 ppdu_info->rx_status.he_re = 0;
1270
chenguo33f505a2018-10-15 17:17:46 +08001271 reception_type = HAL_RX_GET(rx_tlv,
1272 PHYRX_RSSI_LEGACY_0,
1273 RECEPTION_TYPE);
1274 switch (reception_type) {
1275 case QDF_RECEPTION_TYPE_ULOFMDA:
Kai Chen93f7e1b2019-07-10 16:13:48 -07001276 ppdu_info->rx_status.reception_type =
1277 HAL_RX_TYPE_MU_OFDMA;
chenguo33f505a2018-10-15 17:17:46 +08001278 ppdu_info->rx_status.ulofdma_flag = 1;
1279 ppdu_info->rx_status.he_data1 =
1280 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE;
1281 break;
1282 case QDF_RECEPTION_TYPE_ULMIMO:
Kai Chen93f7e1b2019-07-10 16:13:48 -07001283 ppdu_info->rx_status.reception_type =
1284 HAL_RX_TYPE_MU_MIMO;
chenguo33f505a2018-10-15 17:17:46 +08001285 ppdu_info->rx_status.he_data1 =
1286 QDF_MON_STATUS_HE_MU_FORMAT_TYPE;
1287 break;
1288 default:
nobelj14531642019-06-25 17:41:55 -07001289 ppdu_info->rx_status.reception_type =
1290 HAL_RX_TYPE_SU;
chenguo33f505a2018-10-15 17:17:46 +08001291 break;
1292 }
Amir Patel1d4ac982019-04-25 11:49:01 +05301293 hal_rx_update_rssi_chain(ppdu_info, rssi_info_tlv);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301294 value = HAL_RX_GET(rssi_info_tlv,
1295 RECEIVE_RSSI_INFO_0, RSSI_PRI20_CHAIN0);
Kai Chen52ef33f2019-03-05 18:33:40 -08001296 ppdu_info->rx_status.rssi[0] = value;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301297 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1298 "RSSI_PRI20_CHAIN0: %d\n", value);
1299
1300 value = HAL_RX_GET(rssi_info_tlv,
Kai Chen52ef33f2019-03-05 18:33:40 -08001301 RECEIVE_RSSI_INFO_2, RSSI_PRI20_CHAIN1);
1302 ppdu_info->rx_status.rssi[1] = value;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301303 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
Kai Chen52ef33f2019-03-05 18:33:40 -08001304 "RSSI_PRI20_CHAIN1: %d\n", value);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301305
1306 value = HAL_RX_GET(rssi_info_tlv,
Kai Chen52ef33f2019-03-05 18:33:40 -08001307 RECEIVE_RSSI_INFO_4, RSSI_PRI20_CHAIN2);
1308 ppdu_info->rx_status.rssi[2] = value;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301309 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
Kai Chen52ef33f2019-03-05 18:33:40 -08001310 "RSSI_PRI20_CHAIN2: %d\n", value);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301311
1312 value = HAL_RX_GET(rssi_info_tlv,
Kai Chen52ef33f2019-03-05 18:33:40 -08001313 RECEIVE_RSSI_INFO_6, RSSI_PRI20_CHAIN3);
1314 ppdu_info->rx_status.rssi[3] = value;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301315 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
Kai Chen52ef33f2019-03-05 18:33:40 -08001316 "RSSI_PRI20_CHAIN3: %d\n", value);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301317
1318 value = HAL_RX_GET(rssi_info_tlv,
Kai Chen52ef33f2019-03-05 18:33:40 -08001319 RECEIVE_RSSI_INFO_8, RSSI_PRI20_CHAIN4);
1320 ppdu_info->rx_status.rssi[4] = value;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301321 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
Kai Chen52ef33f2019-03-05 18:33:40 -08001322 "RSSI_PRI20_CHAIN4: %d\n", value);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301323
1324 value = HAL_RX_GET(rssi_info_tlv,
Kai Chen52ef33f2019-03-05 18:33:40 -08001325 RECEIVE_RSSI_INFO_10, RSSI_PRI20_CHAIN5);
1326 ppdu_info->rx_status.rssi[5] = value;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301327 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
Kai Chen52ef33f2019-03-05 18:33:40 -08001328 "RSSI_PRI20_CHAIN5: %d\n", value);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301329
1330 value = HAL_RX_GET(rssi_info_tlv,
Kai Chen52ef33f2019-03-05 18:33:40 -08001331 RECEIVE_RSSI_INFO_12, RSSI_PRI20_CHAIN6);
1332 ppdu_info->rx_status.rssi[6] = value;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301333 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
Kai Chen52ef33f2019-03-05 18:33:40 -08001334 "RSSI_PRI20_CHAIN1: %d\n", value);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301335
1336 value = HAL_RX_GET(rssi_info_tlv,
Kai Chen52ef33f2019-03-05 18:33:40 -08001337 RECEIVE_RSSI_INFO_14, RSSI_PRI20_CHAIN7);
1338 ppdu_info->rx_status.rssi[7] = value;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301339 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
Kai Chen52ef33f2019-03-05 18:33:40 -08001340 "RSSI_PRI20_CHAIN7: %d\n", value);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301341 break;
1342 }
1343 case WIFIPHYRX_OTHER_RECEIVE_INFO_E:
1344 hal_rx_proc_phyrx_other_receive_info_tlv(hal, rx_tlv_hdr,
1345 ppdu_info);
1346 break;
1347 case WIFIRX_HEADER_E:
Amir Patel57e7e052019-05-15 20:49:57 +05301348 {
1349 struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info;
1350 uint16_t mpdu_cnt = com_info->mpdu_cnt;
1351
Chaithanya Garrepalli1f89b972019-07-31 12:33:53 +05301352 if (mpdu_cnt >= HAL_RX_MAX_MPDU) {
1353 hal_alert("Number of MPDUs per PPDU exceeded");
1354 break;
1355 }
Amir Patel57e7e052019-05-15 20:49:57 +05301356 /* Update first_msdu_payload for every mpdu and increment
1357 * com_info->mpdu_cnt for every WIFIRX_HEADER_E TLV
1358 */
1359 ppdu_info->ppdu_msdu_info[mpdu_cnt].first_msdu_payload =
1360 rx_tlv;
1361 ppdu_info->ppdu_msdu_info[mpdu_cnt].payload_len = tlv_len;
1362 ppdu_info->ppdu_msdu_info[mpdu_cnt].nbuf = nbuf;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301363 ppdu_info->msdu_info.first_msdu_payload = rx_tlv;
1364 ppdu_info->msdu_info.payload_len = tlv_len;
Kai Chen52ef33f2019-03-05 18:33:40 -08001365 ppdu_info->user_id = user_id;
1366 ppdu_info->hdr_len = tlv_len;
1367 ppdu_info->data = rx_tlv;
1368 ppdu_info->data += 4;
Amir Patel57e7e052019-05-15 20:49:57 +05301369
1370 /* for every RX_HEADER TLV increment mpdu_cnt */
1371 com_info->mpdu_cnt++;
Kai Chen52ef33f2019-03-05 18:33:40 -08001372 return HAL_TLV_STATUS_HEADER;
Amir Patel57e7e052019-05-15 20:49:57 +05301373 }
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301374 case WIFIRX_MPDU_START_E:
1375 {
1376 uint8_t *rx_mpdu_start =
1377 (uint8_t *)rx_tlv + HAL_RX_OFFSET(UNIFIED_RX_MPDU_START_0,
1378 RX_MPDU_INFO_RX_MPDU_INFO_DETAILS);
1379 uint32_t ppdu_id = HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0,
1380 PHY_PPDU_ID);
sumedh baikady59a2d332018-05-22 01:50:38 -07001381 uint8_t filter_category = 0;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301382
1383 ppdu_info->nac_info.fc_valid =
1384 HAL_RX_GET(rx_mpdu_start,
1385 RX_MPDU_INFO_2,
1386 MPDU_FRAME_CONTROL_VALID);
1387
1388 ppdu_info->nac_info.to_ds_flag =
1389 HAL_RX_GET(rx_mpdu_start,
1390 RX_MPDU_INFO_2,
1391 TO_DS);
1392
Karunakar Dasineniacc8b562019-05-07 07:00:24 -07001393 ppdu_info->nac_info.frame_control =
1394 HAL_RX_GET(rx_mpdu_start,
1395 RX_MPDU_INFO_14,
1396 MPDU_FRAME_CONTROL_FIELD);
1397
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301398 ppdu_info->nac_info.mac_addr2_valid =
1399 HAL_RX_GET(rx_mpdu_start,
1400 RX_MPDU_INFO_2,
1401 MAC_ADDR_AD2_VALID);
1402
1403 *(uint16_t *)&ppdu_info->nac_info.mac_addr2[0] =
1404 HAL_RX_GET(rx_mpdu_start,
1405 RX_MPDU_INFO_16,
1406 MAC_ADDR_AD2_15_0);
1407
1408 *(uint32_t *)&ppdu_info->nac_info.mac_addr2[2] =
1409 HAL_RX_GET(rx_mpdu_start,
1410 RX_MPDU_INFO_17,
1411 MAC_ADDR_AD2_47_16);
1412
1413 if (ppdu_info->rx_status.prev_ppdu_id != ppdu_id) {
1414 ppdu_info->rx_status.prev_ppdu_id = ppdu_id;
1415 ppdu_info->rx_status.ppdu_len =
1416 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13,
1417 MPDU_LENGTH);
1418 } else {
1419 ppdu_info->rx_status.ppdu_len +=
1420 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13,
1421 MPDU_LENGTH);
1422 }
sumedh baikady59a2d332018-05-22 01:50:38 -07001423
1424 filter_category = HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_0,
1425 RXPCU_MPDU_FILTER_IN_CATEGORY);
Karunakar Dasineni142f9ba2019-03-19 23:04:59 -07001426
1427 if (filter_category == 0)
1428 ppdu_info->rx_status.rxpcu_filter_pass = 1;
1429 else if (filter_category == 1)
sumedh baikady59a2d332018-05-22 01:50:38 -07001430 ppdu_info->rx_status.monitor_direct_used = 1;
Karunakar Dasineni142f9ba2019-03-19 23:04:59 -07001431
nobelj14531642019-06-25 17:41:55 -07001432 ppdu_info->nac_info.mcast_bcast =
1433 HAL_RX_GET(rx_mpdu_start,
1434 RX_MPDU_INFO_13,
1435 MCAST_BCAST);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301436 break;
1437 }
Kai Chen52ef33f2019-03-05 18:33:40 -08001438 case WIFIRX_MPDU_END_E:
1439 ppdu_info->user_id = user_id;
1440 ppdu_info->fcs_err =
1441 HAL_RX_GET(rx_tlv, RX_MPDU_END_1,
1442 FCS_ERR);
1443 return HAL_TLV_STATUS_MPDU_END;
Karunakar Dasineniacc8b562019-05-07 07:00:24 -07001444 case WIFIRX_MSDU_END_E:
Chaithanya Garrepalli08b2c7a2019-06-27 14:35:48 +05301445 if (user_id < HAL_MAX_UL_MU_USERS) {
1446 ppdu_info->rx_msdu_info[user_id].cce_metadata =
1447 HAL_RX_MSDU_END_CCE_METADATA_GET(rx_tlv);
Sumeet Raoc4fa4df2019-07-05 02:11:19 -07001448 ppdu_info->rx_msdu_info[user_id].fse_metadata =
1449 HAL_RX_MSDU_END_FSE_METADATA_GET(rx_tlv);
1450 ppdu_info->rx_msdu_info[user_id].is_flow_idx_timeout =
1451 HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(rx_tlv);
1452 ppdu_info->rx_msdu_info[user_id].is_flow_idx_invalid =
1453 HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(rx_tlv);
1454 ppdu_info->rx_msdu_info[user_id].flow_idx =
1455 HAL_RX_MSDU_END_FLOW_IDX_GET(rx_tlv);
Chaithanya Garrepalli08b2c7a2019-06-27 14:35:48 +05301456 }
Karunakar Dasineniacc8b562019-05-07 07:00:24 -07001457 return HAL_TLV_STATUS_MSDU_END;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301458 case 0:
1459 return HAL_TLV_STATUS_PPDU_DONE;
1460
1461 default:
chenguof51e9222018-04-20 14:34:25 +08001462 if (hal_rx_handle_other_tlvs(tlv_tag, rx_tlv, ppdu_info))
1463 unhandled = false;
1464 else
1465 unhandled = true;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301466 break;
1467 }
1468
1469 if (!unhandled)
1470 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1471 "%s TLV type: %d, TLV len:%d %s",
1472 __func__, tlv_tag, tlv_len,
1473 unhandled == true ? "unhandled" : "");
1474
1475 qdf_trace_hex_dump(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG,
1476 rx_tlv, tlv_len);
1477
1478 return HAL_TLV_STATUS_PPDU_NOT_DONE;
1479}
1480/**
1481 * hal_reo_status_get_header_generic - Process reo desc info
1482 * @d - Pointer to reo descriptior
1483 * @b - tlv type info
1484 * @h1 - Pointer to hal_reo_status_header where info to be stored
1485 *
1486 * Return - none.
1487 *
1488 */
1489static void hal_reo_status_get_header_generic(uint32_t *d, int b, void *h1)
1490{
1491
1492 uint32_t val1 = 0;
1493 struct hal_reo_status_header *h =
1494 (struct hal_reo_status_header *)h1;
1495
1496 switch (b) {
1497 case HAL_REO_QUEUE_STATS_STATUS_TLV:
1498 val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_0,
1499 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1500 break;
1501 case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
1502 val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_0,
1503 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1504 break;
1505 case HAL_REO_FLUSH_CACHE_STATUS_TLV:
1506 val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_0,
1507 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1508 break;
1509 case HAL_REO_UNBLK_CACHE_STATUS_TLV:
1510 val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_0,
1511 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1512 break;
1513 case HAL_REO_TIMOUT_LIST_STATUS_TLV:
1514 val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_0,
1515 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1516 break;
1517 case HAL_REO_DESC_THRES_STATUS_TLV:
1518 val1 = d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_0,
1519 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1520 break;
1521 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
1522 val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_0,
1523 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)];
1524 break;
1525 default:
1526 pr_err("ERROR: Unknown tlv\n");
1527 break;
1528 }
1529 h->cmd_num =
1530 HAL_GET_FIELD(
1531 UNIFORM_REO_STATUS_HEADER_0, REO_STATUS_NUMBER,
1532 val1);
1533 h->exec_time =
1534 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0,
1535 CMD_EXECUTION_TIME, val1);
1536 h->status =
1537 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0,
1538 REO_CMD_EXECUTION_STATUS, val1);
1539 switch (b) {
1540 case HAL_REO_QUEUE_STATS_STATUS_TLV:
1541 val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_1,
1542 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1543 break;
1544 case HAL_REO_FLUSH_QUEUE_STATUS_TLV:
1545 val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_1,
1546 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1547 break;
1548 case HAL_REO_FLUSH_CACHE_STATUS_TLV:
1549 val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_1,
1550 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1551 break;
1552 case HAL_REO_UNBLK_CACHE_STATUS_TLV:
1553 val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_1,
1554 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1555 break;
1556 case HAL_REO_TIMOUT_LIST_STATUS_TLV:
1557 val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_1,
1558 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1559 break;
1560 case HAL_REO_DESC_THRES_STATUS_TLV:
1561 val1 = d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_1,
1562 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1563 break;
1564 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV:
1565 val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_1,
1566 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)];
1567 break;
1568 default:
1569 pr_err("ERROR: Unknown tlv\n");
1570 break;
1571 }
1572 h->tstamp =
1573 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_1, TIMESTAMP, val1);
1574}
1575
1576/**
1577 * hal_reo_setup - Initialize HW REO block
1578 *
1579 * @hal_soc: Opaque HAL SOC handle
1580 * @reo_params: parameters needed by HAL for REO config
1581 */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05301582static void hal_reo_setup_generic(struct hal_soc *soc,
1583 void *reoparams)
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301584{
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301585 uint32_t reg_val;
1586 struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams;
1587
1588 reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
1589 SEQ_WCSS_UMAC_REO_REG_OFFSET));
1590
1591 reg_val &= ~(HWIO_REO_R0_GENERAL_ENABLE_FRAGMENT_DEST_RING_BMSK |
1592 HWIO_REO_R0_GENERAL_ENABLE_AGING_LIST_ENABLE_BMSK |
1593 HWIO_REO_R0_GENERAL_ENABLE_AGING_FLUSH_ENABLE_BMSK);
1594
1595 reg_val |= HAL_SM(HWIO_REO_R0_GENERAL_ENABLE,
1596 FRAGMENT_DEST_RING, reo_params->frag_dst_ring) |
1597 HAL_SM(HWIO_REO_R0_GENERAL_ENABLE, AGING_LIST_ENABLE, 1) |
1598 HAL_SM(HWIO_REO_R0_GENERAL_ENABLE, AGING_FLUSH_ENABLE, 1);
1599
1600 HAL_REG_WRITE(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR(
1601 SEQ_WCSS_UMAC_REO_REG_OFFSET), reg_val);
1602
1603 /* Other ring enable bits and REO_ENABLE will be set by FW */
1604
1605 /* TODO: Setup destination ring mapping if enabled */
1606
1607 /* TODO: Error destination ring setting is left to default.
1608 * Default setting is to send all errors to release ring.
1609 */
1610
1611 HAL_REG_WRITE(soc,
1612 HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR(
1613 SEQ_WCSS_UMAC_REO_REG_OFFSET),
sumedh baikady3ee61002019-03-12 10:50:37 -07001614 HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301615
1616 HAL_REG_WRITE(soc,
1617 HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR(
1618 SEQ_WCSS_UMAC_REO_REG_OFFSET),
sumedh baikady3ee61002019-03-12 10:50:37 -07001619 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301620
1621 HAL_REG_WRITE(soc,
1622 HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR(
1623 SEQ_WCSS_UMAC_REO_REG_OFFSET),
sumedh baikady3ee61002019-03-12 10:50:37 -07001624 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000));
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301625
1626 HAL_REG_WRITE(soc,
1627 HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR(
1628 SEQ_WCSS_UMAC_REO_REG_OFFSET),
sumedh baikady3ee61002019-03-12 10:50:37 -07001629 (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000));
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301630
1631 /*
1632 * When hash based routing is enabled, routing of the rx packet
1633 * is done based on the following value: 1 _ _ _ _ The last 4
1634 * bits are based on hash[3:0]. This means the possible values
1635 * are 0x10 to 0x1f. This value is used to look-up the
1636 * ring ID configured in Destination_Ring_Ctrl_IX_* register.
1637 * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3
1638 * registers need to be configured to set-up the 16 entries to
1639 * map the hash values to a ring number. There are 3 bits per
1640 * hash entry – which are mapped as follows:
1641 * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI),
1642 * 7: NOT_USED.
1643 */
1644 if (reo_params->rx_hash_enabled) {
1645 HAL_REG_WRITE(soc,
1646 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
1647 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1648 reo_params->remap1);
1649
1650 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1651 FL("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x"),
1652 HAL_REG_READ(soc,
1653 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR(
1654 SEQ_WCSS_UMAC_REO_REG_OFFSET)));
1655
1656 HAL_REG_WRITE(soc,
1657 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
1658 SEQ_WCSS_UMAC_REO_REG_OFFSET),
1659 reo_params->remap2);
1660
1661 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_ERROR,
1662 FL("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x"),
1663 HAL_REG_READ(soc,
1664 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR(
1665 SEQ_WCSS_UMAC_REO_REG_OFFSET)));
1666 }
1667
1668
1669 /* TODO: Check if the following registers shoould be setup by host:
1670 * AGING_CONTROL
1671 * HIGH_MEMORY_THRESHOLD
1672 * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2]
1673 * GLOBAL_LINK_DESC_COUNT_CTRL
1674 */
1675}
1676
1677/**
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07001678 * hal_get_hw_hptp_generic() - Get HW head and tail pointer value for any ring
1679 * @hal_soc: Opaque HAL SOC handle
1680 * @hal_ring: Source ring pointer
1681 * @headp: Head Pointer
1682 * @tailp: Tail Pointer
1683 * @ring: Ring type
1684 *
1685 * Return: Update tail pointer and head pointer in arguments.
1686 */
1687static inline
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05301688void hal_get_hw_hptp_generic(struct hal_soc *hal_soc,
Akshay Kosigi0bca9fb2019-06-27 15:26:13 +05301689 hal_ring_handle_t hal_ring_hdl,
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07001690 uint32_t *headp, uint32_t *tailp,
1691 uint8_t ring)
1692{
Akshay Kosigi0bca9fb2019-06-27 15:26:13 +05301693 struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl;
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07001694 struct hal_hw_srng_config *ring_config;
1695 enum hal_ring_type ring_type = (enum hal_ring_type)ring;
1696
Akshay Kosigi6a206752019-06-10 23:14:52 +05301697 if (!hal_soc || !srng) {
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07001698 QDF_TRACE(QDF_MODULE_ID_HAL, QDF_TRACE_LEVEL_ERROR,
1699 "%s: Context is Null", __func__);
1700 return;
1701 }
1702
Akshay Kosigi6a206752019-06-10 23:14:52 +05301703 ring_config = HAL_SRNG_CONFIG(hal_soc, ring_type);
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07001704 if (!ring_config->lmac_ring) {
1705 if (srng->ring_dir == HAL_SRNG_SRC_RING) {
Rakesh Pillai56320c12019-06-05 00:25:48 +05301706 *headp = SRNG_SRC_REG_READ(srng, HP);
1707 *tailp = SRNG_SRC_REG_READ(srng, TP);
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07001708 } else {
Rakesh Pillai56320c12019-06-05 00:25:48 +05301709 *headp = SRNG_DST_REG_READ(srng, HP);
1710 *tailp = SRNG_DST_REG_READ(srng, TP);
Venkata Sharath Chandra Manchala443b9b42018-10-10 12:04:54 -07001711 }
1712 }
1713}
1714
1715/**
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301716 * hal_srng_src_hw_init - Private function to initialize SRNG
1717 * source ring HW
1718 * @hal_soc: HAL SOC handle
1719 * @srng: SRNG ring pointer
1720 */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05301721static inline
1722void hal_srng_src_hw_init_generic(struct hal_soc *hal,
1723 struct hal_srng *srng)
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301724{
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301725 uint32_t reg_val = 0;
1726 uint64_t tp_addr = 0;
1727
1728 HIF_DBG("%s: hw_init srng %d", __func__, srng->ring_id);
1729
1730 if (srng->flags & HAL_SRNG_MSI_INTR) {
1731 SRNG_SRC_REG_WRITE(srng, MSI1_BASE_LSB,
1732 srng->msi_addr & 0xffffffff);
1733 reg_val = SRNG_SM(SRNG_SRC_FLD(MSI1_BASE_MSB, ADDR),
1734 (uint64_t)(srng->msi_addr) >> 32) |
1735 SRNG_SM(SRNG_SRC_FLD(MSI1_BASE_MSB,
1736 MSI1_ENABLE), 1);
1737 SRNG_SRC_REG_WRITE(srng, MSI1_BASE_MSB, reg_val);
1738 SRNG_SRC_REG_WRITE(srng, MSI1_DATA, srng->msi_data);
1739 }
1740
1741 SRNG_SRC_REG_WRITE(srng, BASE_LSB, srng->ring_base_paddr & 0xffffffff);
1742 reg_val = SRNG_SM(SRNG_SRC_FLD(BASE_MSB, RING_BASE_ADDR_MSB),
1743 ((uint64_t)(srng->ring_base_paddr) >> 32)) |
1744 SRNG_SM(SRNG_SRC_FLD(BASE_MSB, RING_SIZE),
1745 srng->entry_size * srng->num_entries);
1746 SRNG_SRC_REG_WRITE(srng, BASE_MSB, reg_val);
1747
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301748 reg_val = SRNG_SM(SRNG_SRC_FLD(ID, ENTRY_SIZE), srng->entry_size);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301749 SRNG_SRC_REG_WRITE(srng, ID, reg_val);
1750
1751 /**
1752 * Interrupt setup:
1753 * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE
1754 * if level mode is required
1755 */
1756 reg_val = 0;
1757
1758 /*
1759 * WAR - Hawkeye v1 has a hardware bug which requires timer value to be
1760 * programmed in terms of 1us resolution instead of 8us resolution as
1761 * given in MLD.
1762 */
1763 if (srng->intr_timer_thres_us) {
1764 reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX0,
1765 INTERRUPT_TIMER_THRESHOLD),
1766 srng->intr_timer_thres_us);
1767 /* For HK v2 this should be (srng->intr_timer_thres_us >> 3) */
1768 }
1769
1770 if (srng->intr_batch_cntr_thres_entries) {
1771 reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX0,
1772 BATCH_COUNTER_THRESHOLD),
1773 srng->intr_batch_cntr_thres_entries *
1774 srng->entry_size);
1775 }
1776 SRNG_SRC_REG_WRITE(srng, CONSUMER_INT_SETUP_IX0, reg_val);
1777
1778 reg_val = 0;
1779 if (srng->flags & HAL_SRNG_LOW_THRES_INTR_ENABLE) {
1780 reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX1,
1781 LOW_THRESHOLD), srng->u.src_ring.low_threshold);
1782 }
1783
1784 SRNG_SRC_REG_WRITE(srng, CONSUMER_INT_SETUP_IX1, reg_val);
1785
1786 /* As per HW team, TP_ADDR and HP_ADDR for Idle link ring should
1787 * remain 0 to avoid some WBM stability issues. Remote head/tail
1788 * pointers are not required since this ring is completely managed
1789 * by WBM HW
1790 */
Mohit Khanna5f263482019-02-14 18:42:20 -08001791 reg_val = 0;
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301792 if (srng->ring_id != HAL_SRNG_WBM_IDLE_LINK) {
1793 tp_addr = (uint64_t)(hal->shadow_rdptr_mem_paddr +
1794 ((unsigned long)(srng->u.src_ring.tp_addr) -
1795 (unsigned long)(hal->shadow_rdptr_mem_vaddr)));
1796 SRNG_SRC_REG_WRITE(srng, TP_ADDR_LSB, tp_addr & 0xffffffff);
1797 SRNG_SRC_REG_WRITE(srng, TP_ADDR_MSB, tp_addr >> 32);
Mohit Khanna5f263482019-02-14 18:42:20 -08001798 } else {
1799 reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, RING_ID_DISABLE), 1);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301800 }
1801
1802 /* Initilaize head and tail pointers to indicate ring is empty */
1803 SRNG_SRC_REG_WRITE(srng, HP, 0);
1804 SRNG_SRC_REG_WRITE(srng, TP, 0);
1805 *(srng->u.src_ring.tp_addr) = 0;
1806
Mohit Khanna5f263482019-02-14 18:42:20 -08001807 reg_val |= ((srng->flags & HAL_SRNG_DATA_TLV_SWAP) ?
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301808 SRNG_SM(SRNG_SRC_FLD(MISC, DATA_TLV_SWAP_BIT), 1) : 0) |
1809 ((srng->flags & HAL_SRNG_RING_PTR_SWAP) ?
1810 SRNG_SM(SRNG_SRC_FLD(MISC, HOST_FW_SWAP_BIT), 1) : 0) |
1811 ((srng->flags & HAL_SRNG_MSI_SWAP) ?
1812 SRNG_SM(SRNG_SRC_FLD(MISC, MSI_SWAP_BIT), 1) : 0);
1813
1814 /* Loop count is not used for SRC rings */
1815 reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, LOOPCNT_DISABLE), 1);
1816
1817 /*
1818 * reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, SRNG_ENABLE), 1);
1819 * todo: update fw_api and replace with above line
1820 * (when SRNG_ENABLE field for the MISC register is available in fw_api)
1821 * (WCSS_UMAC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_MISC)
1822 */
1823 reg_val |= 0x40;
1824
1825 SRNG_SRC_REG_WRITE(srng, MISC, reg_val);
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301826}
1827
1828/**
1829 * hal_srng_dst_hw_init - Private function to initialize SRNG
1830 * destination ring HW
1831 * @hal_soc: HAL SOC handle
1832 * @srng: SRNG ring pointer
1833 */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05301834static inline
1835void hal_srng_dst_hw_init_generic(struct hal_soc *hal,
1836 struct hal_srng *srng)
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301837{
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +05301838 uint32_t reg_val = 0;
1839 uint64_t hp_addr = 0;
1840
1841 HIF_DBG("%s: hw_init srng %d", __func__, srng->ring_id);
1842
1843 if (srng->flags & HAL_SRNG_MSI_INTR) {
1844 SRNG_DST_REG_WRITE(srng, MSI1_BASE_LSB,
1845 srng->msi_addr & 0xffffffff);
1846 reg_val = SRNG_SM(SRNG_DST_FLD(MSI1_BASE_MSB, ADDR),
1847 (uint64_t)(srng->msi_addr) >> 32) |
1848 SRNG_SM(SRNG_DST_FLD(MSI1_BASE_MSB,
1849 MSI1_ENABLE), 1);
1850 SRNG_DST_REG_WRITE(srng, MSI1_BASE_MSB, reg_val);
1851 SRNG_DST_REG_WRITE(srng, MSI1_DATA, srng->msi_data);
1852 }
1853
1854 SRNG_DST_REG_WRITE(srng, BASE_LSB, srng->ring_base_paddr & 0xffffffff);
1855 reg_val = SRNG_SM(SRNG_DST_FLD(BASE_MSB, RING_BASE_ADDR_MSB),
1856 ((uint64_t)(srng->ring_base_paddr) >> 32)) |
1857 SRNG_SM(SRNG_DST_FLD(BASE_MSB, RING_SIZE),
1858 srng->entry_size * srng->num_entries);
1859 SRNG_DST_REG_WRITE(srng, BASE_MSB, reg_val);
1860
1861 reg_val = SRNG_SM(SRNG_DST_FLD(ID, RING_ID), srng->ring_id) |
1862 SRNG_SM(SRNG_DST_FLD(ID, ENTRY_SIZE), srng->entry_size);
1863 SRNG_DST_REG_WRITE(srng, ID, reg_val);
1864
1865
1866 /**
1867 * Interrupt setup:
1868 * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE
1869 * if level mode is required
1870 */
1871 reg_val = 0;
1872 if (srng->intr_timer_thres_us) {
1873 reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT_SETUP,
1874 INTERRUPT_TIMER_THRESHOLD),
1875 srng->intr_timer_thres_us >> 3);
1876 }
1877
1878 if (srng->intr_batch_cntr_thres_entries) {
1879 reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT_SETUP,
1880 BATCH_COUNTER_THRESHOLD),
1881 srng->intr_batch_cntr_thres_entries *
1882 srng->entry_size);
1883 }
1884
1885 SRNG_DST_REG_WRITE(srng, PRODUCER_INT_SETUP, reg_val);
1886 hp_addr = (uint64_t)(hal->shadow_rdptr_mem_paddr +
1887 ((unsigned long)(srng->u.dst_ring.hp_addr) -
1888 (unsigned long)(hal->shadow_rdptr_mem_vaddr)));
1889 SRNG_DST_REG_WRITE(srng, HP_ADDR_LSB, hp_addr & 0xffffffff);
1890 SRNG_DST_REG_WRITE(srng, HP_ADDR_MSB, hp_addr >> 32);
1891
1892 /* Initilaize head and tail pointers to indicate ring is empty */
1893 SRNG_DST_REG_WRITE(srng, HP, 0);
1894 SRNG_DST_REG_WRITE(srng, TP, 0);
1895 *(srng->u.dst_ring.hp_addr) = 0;
1896
1897 reg_val = ((srng->flags & HAL_SRNG_DATA_TLV_SWAP) ?
1898 SRNG_SM(SRNG_DST_FLD(MISC, DATA_TLV_SWAP_BIT), 1) : 0) |
1899 ((srng->flags & HAL_SRNG_RING_PTR_SWAP) ?
1900 SRNG_SM(SRNG_DST_FLD(MISC, HOST_FW_SWAP_BIT), 1) : 0) |
1901 ((srng->flags & HAL_SRNG_MSI_SWAP) ?
1902 SRNG_SM(SRNG_DST_FLD(MISC, MSI_SWAP_BIT), 1) : 0);
1903
1904 /*
1905 * reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, SRNG_ENABLE), 1);
1906 * todo: update fw_api and replace with above line
1907 * (when SRNG_ENABLE field for the MISC register is available in fw_api)
1908 * (WCSS_UMAC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_MISC)
1909 */
1910 reg_val |= 0x40;
1911
1912 SRNG_DST_REG_WRITE(srng, MISC, reg_val);
1913
1914}
Balamurugan Mahalingam764219e2018-09-17 15:34:25 +05301915
1916#define HAL_RX_WBM_ERR_SRC_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
1917 (WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_OFFSET >> 2))) & \
1918 WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_MASK) >> \
1919 WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_LSB)
1920
1921#define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
1922 (WBM_RELEASE_RING_2_REO_PUSH_REASON_OFFSET >> 2))) & \
1923 WBM_RELEASE_RING_2_REO_PUSH_REASON_MASK) >> \
1924 WBM_RELEASE_RING_2_REO_PUSH_REASON_LSB)
1925
1926#define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \
1927 (WBM_RELEASE_RING_2_REO_ERROR_CODE_OFFSET >> 2))) & \
1928 WBM_RELEASE_RING_2_REO_ERROR_CODE_MASK) >> \
1929 WBM_RELEASE_RING_2_REO_ERROR_CODE_LSB)
1930
1931#define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc) \
1932 (((*(((uint32_t *) wbm_desc) + \
1933 (WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_OFFSET >> 2))) & \
1934 WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_MASK) >> \
1935 WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_LSB)
1936
1937#define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc) \
1938 (((*(((uint32_t *) wbm_desc) + \
1939 (WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_OFFSET >> 2))) & \
1940 WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_MASK) >> \
1941 WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_LSB)
1942
1943/**
1944 * hal_rx_wbm_err_info_get_generic(): Retrieves WBM error code and reason and
1945 * save it to hal_wbm_err_desc_info structure passed by caller
1946 * @wbm_desc: wbm ring descriptor
1947 * @wbm_er_info1: hal_wbm_err_desc_info structure, output parameter.
1948 * Return: void
1949 */
1950static inline void hal_rx_wbm_err_info_get_generic(void *wbm_desc,
1951 void *wbm_er_info1)
1952{
1953 struct hal_wbm_err_desc_info *wbm_er_info =
1954 (struct hal_wbm_err_desc_info *)wbm_er_info1;
1955
1956 wbm_er_info->wbm_err_src = HAL_RX_WBM_ERR_SRC_GET(wbm_desc);
1957 wbm_er_info->reo_psh_rsn = HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc);
1958 wbm_er_info->reo_err_code = HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc);
1959 wbm_er_info->rxdma_psh_rsn = HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc);
1960 wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc);
1961}
1962
1963/**
1964 * hal_tx_comp_get_release_reason_generic() - TQM Release reason
1965 * @hal_desc: completion ring descriptor pointer
1966 *
1967 * This function will return the type of pointer - buffer or descriptor
1968 *
1969 * Return: buffer type
1970 */
1971static inline uint8_t hal_tx_comp_get_release_reason_generic(void *hal_desc)
1972{
1973 uint32_t comp_desc =
1974 *(uint32_t *) (((uint8_t *) hal_desc) +
1975 WBM_RELEASE_RING_2_TQM_RELEASE_REASON_OFFSET);
1976
1977 return (comp_desc & WBM_RELEASE_RING_2_TQM_RELEASE_REASON_MASK) >>
1978 WBM_RELEASE_RING_2_TQM_RELEASE_REASON_LSB;
1979}
1980
1981/**
1982 * hal_rx_dump_mpdu_start_tlv_generic: dump RX mpdu_start TLV in structured
1983 * human readable format.
1984 * @mpdu_start: pointer the rx_attention TLV in pkt.
1985 * @dbg_level: log level.
1986 *
1987 * Return: void
1988 */
1989static inline void hal_rx_dump_mpdu_start_tlv_generic(void *mpdustart,
1990 uint8_t dbg_level)
1991{
1992 struct rx_mpdu_start *mpdu_start = (struct rx_mpdu_start *)mpdustart;
1993 struct rx_mpdu_info *mpdu_info =
1994 (struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details;
1995
Krunal Soni9911b442019-02-22 15:39:03 -08001996 hal_verbose_debug(
1997 "rx_mpdu_start tlv (1/5) - "
1998 "rxpcu_mpdu_filter_in_category: %x "
1999 "sw_frame_group_id: %x "
2000 "ndp_frame: %x "
2001 "phy_err: %x "
2002 "phy_err_during_mpdu_header: %x "
2003 "protocol_version_err: %x "
2004 "ast_based_lookup_valid: %x "
2005 "phy_ppdu_id: %x "
2006 "ast_index: %x "
2007 "sw_peer_id: %x "
2008 "mpdu_frame_control_valid: %x "
2009 "mpdu_duration_valid: %x "
2010 "mac_addr_ad1_valid: %x "
2011 "mac_addr_ad2_valid: %x "
2012 "mac_addr_ad3_valid: %x "
2013 "mac_addr_ad4_valid: %x "
2014 "mpdu_sequence_control_valid: %x "
2015 "mpdu_qos_control_valid: %x "
2016 "mpdu_ht_control_valid: %x "
2017 "frame_encryption_info_valid: %x ",
2018 mpdu_info->rxpcu_mpdu_filter_in_category,
2019 mpdu_info->sw_frame_group_id,
2020 mpdu_info->ndp_frame,
2021 mpdu_info->phy_err,
2022 mpdu_info->phy_err_during_mpdu_header,
2023 mpdu_info->protocol_version_err,
2024 mpdu_info->ast_based_lookup_valid,
2025 mpdu_info->phy_ppdu_id,
2026 mpdu_info->ast_index,
2027 mpdu_info->sw_peer_id,
2028 mpdu_info->mpdu_frame_control_valid,
2029 mpdu_info->mpdu_duration_valid,
2030 mpdu_info->mac_addr_ad1_valid,
2031 mpdu_info->mac_addr_ad2_valid,
2032 mpdu_info->mac_addr_ad3_valid,
2033 mpdu_info->mac_addr_ad4_valid,
2034 mpdu_info->mpdu_sequence_control_valid,
2035 mpdu_info->mpdu_qos_control_valid,
2036 mpdu_info->mpdu_ht_control_valid,
2037 mpdu_info->frame_encryption_info_valid);
Mohit Khanna5868efa2018-12-18 16:50:20 -08002038
Krunal Soni9911b442019-02-22 15:39:03 -08002039 hal_verbose_debug(
2040 "rx_mpdu_start tlv (2/5) - "
2041 "fr_ds: %x "
2042 "to_ds: %x "
2043 "encrypted: %x "
2044 "mpdu_retry: %x "
2045 "mpdu_sequence_number: %x "
2046 "epd_en: %x "
2047 "all_frames_shall_be_encrypted: %x "
2048 "encrypt_type: %x "
2049 "mesh_sta: %x "
2050 "bssid_hit: %x "
2051 "bssid_number: %x "
2052 "tid: %x "
2053 "pn_31_0: %x "
2054 "pn_63_32: %x "
2055 "pn_95_64: %x "
2056 "pn_127_96: %x "
2057 "peer_meta_data: %x "
2058 "rxpt_classify_info.reo_destination_indication: %x "
2059 "rxpt_classify_info.use_flow_id_toeplitz_clfy: %x "
2060 "rx_reo_queue_desc_addr_31_0: %x ",
2061 mpdu_info->fr_ds,
2062 mpdu_info->to_ds,
2063 mpdu_info->encrypted,
2064 mpdu_info->mpdu_retry,
2065 mpdu_info->mpdu_sequence_number,
2066 mpdu_info->epd_en,
2067 mpdu_info->all_frames_shall_be_encrypted,
2068 mpdu_info->encrypt_type,
2069 mpdu_info->mesh_sta,
2070 mpdu_info->bssid_hit,
2071 mpdu_info->bssid_number,
2072 mpdu_info->tid,
2073 mpdu_info->pn_31_0,
2074 mpdu_info->pn_63_32,
2075 mpdu_info->pn_95_64,
2076 mpdu_info->pn_127_96,
2077 mpdu_info->peer_meta_data,
2078 mpdu_info->rxpt_classify_info_details.reo_destination_indication,
2079 mpdu_info->rxpt_classify_info_details.use_flow_id_toeplitz_clfy,
2080 mpdu_info->rx_reo_queue_desc_addr_31_0);
Mohit Khanna5868efa2018-12-18 16:50:20 -08002081
Krunal Soni9911b442019-02-22 15:39:03 -08002082 hal_verbose_debug(
2083 "rx_mpdu_start tlv (3/5) - "
2084 "rx_reo_queue_desc_addr_39_32: %x "
2085 "receive_queue_number: %x "
2086 "pre_delim_err_warning: %x "
2087 "first_delim_err: %x "
2088 "key_id_octet: %x "
2089 "new_peer_entry: %x "
2090 "decrypt_needed: %x "
2091 "decap_type: %x "
2092 "rx_insert_vlan_c_tag_padding: %x "
2093 "rx_insert_vlan_s_tag_padding: %x "
2094 "strip_vlan_c_tag_decap: %x "
2095 "strip_vlan_s_tag_decap: %x "
2096 "pre_delim_count: %x "
2097 "ampdu_flag: %x "
2098 "bar_frame: %x "
2099 "mpdu_length: %x "
2100 "first_mpdu: %x "
2101 "mcast_bcast: %x "
2102 "ast_index_not_found: %x "
2103 "ast_index_timeout: %x ",
2104 mpdu_info->rx_reo_queue_desc_addr_39_32,
2105 mpdu_info->receive_queue_number,
2106 mpdu_info->pre_delim_err_warning,
2107 mpdu_info->first_delim_err,
2108 mpdu_info->key_id_octet,
2109 mpdu_info->new_peer_entry,
2110 mpdu_info->decrypt_needed,
2111 mpdu_info->decap_type,
2112 mpdu_info->rx_insert_vlan_c_tag_padding,
2113 mpdu_info->rx_insert_vlan_s_tag_padding,
2114 mpdu_info->strip_vlan_c_tag_decap,
2115 mpdu_info->strip_vlan_s_tag_decap,
2116 mpdu_info->pre_delim_count,
2117 mpdu_info->ampdu_flag,
2118 mpdu_info->bar_frame,
2119 mpdu_info->mpdu_length,
2120 mpdu_info->first_mpdu,
2121 mpdu_info->mcast_bcast,
2122 mpdu_info->ast_index_not_found,
2123 mpdu_info->ast_index_timeout);
Mohit Khanna5868efa2018-12-18 16:50:20 -08002124
Krunal Soni9911b442019-02-22 15:39:03 -08002125 hal_verbose_debug(
2126 "rx_mpdu_start tlv (4/5) - "
2127 "power_mgmt: %x "
2128 "non_qos: %x "
2129 "null_data: %x "
2130 "mgmt_type: %x "
2131 "ctrl_type: %x "
2132 "more_data: %x "
2133 "eosp: %x "
2134 "fragment_flag: %x "
2135 "order: %x "
2136 "u_apsd_trigger: %x "
2137 "encrypt_required: %x "
2138 "directed: %x "
2139 "mpdu_frame_control_field: %x "
2140 "mpdu_duration_field: %x "
2141 "mac_addr_ad1_31_0: %x "
2142 "mac_addr_ad1_47_32: %x "
2143 "mac_addr_ad2_15_0: %x "
2144 "mac_addr_ad2_47_16: %x "
2145 "mac_addr_ad3_31_0: %x "
2146 "mac_addr_ad3_47_32: %x ",
2147 mpdu_info->power_mgmt,
2148 mpdu_info->non_qos,
2149 mpdu_info->null_data,
2150 mpdu_info->mgmt_type,
2151 mpdu_info->ctrl_type,
2152 mpdu_info->more_data,
2153 mpdu_info->eosp,
2154 mpdu_info->fragment_flag,
2155 mpdu_info->order,
2156 mpdu_info->u_apsd_trigger,
2157 mpdu_info->encrypt_required,
2158 mpdu_info->directed,
2159 mpdu_info->mpdu_frame_control_field,
2160 mpdu_info->mpdu_duration_field,
2161 mpdu_info->mac_addr_ad1_31_0,
2162 mpdu_info->mac_addr_ad1_47_32,
2163 mpdu_info->mac_addr_ad2_15_0,
2164 mpdu_info->mac_addr_ad2_47_16,
2165 mpdu_info->mac_addr_ad3_31_0,
2166 mpdu_info->mac_addr_ad3_47_32);
Mohit Khanna5868efa2018-12-18 16:50:20 -08002167
Krunal Soni9911b442019-02-22 15:39:03 -08002168 hal_verbose_debug(
2169 "rx_mpdu_start tlv (5/5) - "
2170 "mpdu_sequence_control_field: %x "
2171 "mac_addr_ad4_31_0: %x "
2172 "mac_addr_ad4_47_32: %x "
2173 "mpdu_qos_control_field: %x "
2174 "mpdu_ht_control_field: %x ",
2175 mpdu_info->mpdu_sequence_control_field,
2176 mpdu_info->mac_addr_ad4_31_0,
2177 mpdu_info->mac_addr_ad4_47_32,
2178 mpdu_info->mpdu_qos_control_field,
2179 mpdu_info->mpdu_ht_control_field);
Balamurugan Mahalingam764219e2018-09-17 15:34:25 +05302180}
Chaithanya Garrepalli710e2952018-09-12 00:44:27 +05302181
2182/**
2183 * hal_tx_desc_set_search_type - Set the search type value
2184 * @desc: Handle to Tx Descriptor
2185 * @search_type: search type
2186 * 0 – Normal search
2187 * 1 – Index based address search
2188 * 2 – Index based flow search
2189 *
2190 * Return: void
2191 */
2192#ifdef TCL_DATA_CMD_2_SEARCH_TYPE_OFFSET
2193static void hal_tx_desc_set_search_type_generic(void *desc,
2194 uint8_t search_type)
2195{
2196 HAL_SET_FLD(desc, TCL_DATA_CMD_2, SEARCH_TYPE) |=
2197 HAL_TX_SM(TCL_DATA_CMD_2, SEARCH_TYPE, search_type);
2198}
2199#else
2200static void hal_tx_desc_set_search_type_generic(void *desc,
2201 uint8_t search_type)
2202{
2203}
2204
2205#endif
2206
2207/**
2208 * hal_tx_desc_set_search_index - Set the search index value
2209 * @desc: Handle to Tx Descriptor
2210 * @search_index: The index that will be used for index based address or
2211 * flow search. The field is valid when 'search_type' is
2212 * 1 0r 2
2213 *
2214 * Return: void
2215 */
2216#ifdef TCL_DATA_CMD_5_SEARCH_INDEX_OFFSET
2217static void hal_tx_desc_set_search_index_generic(void *desc,
2218 uint32_t search_index)
2219{
2220 HAL_SET_FLD(desc, TCL_DATA_CMD_5, SEARCH_INDEX) |=
2221 HAL_TX_SM(TCL_DATA_CMD_5, SEARCH_INDEX, search_index);
2222}
2223#else
2224static void hal_tx_desc_set_search_index_generic(void *desc,
2225 uint32_t search_index)
2226{
2227}
2228#endif
Debasis Dasc39a68d2019-01-28 17:02:06 +05302229
2230/**
2231 * hal_tx_set_pcp_tid_map_generic() - Configure default PCP to TID map table
2232 * @soc: HAL SoC context
2233 * @map: PCP-TID mapping table
2234 *
2235 * PCP are mapped to 8 TID values using TID values programmed
2236 * in one set of mapping registers PCP_TID_MAP_<0 to 6>
2237 * The mapping register has TID mapping for 8 PCP values
2238 *
2239 * Return: none
2240 */
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05302241static void hal_tx_set_pcp_tid_map_generic(struct hal_soc *soc, uint8_t *map)
Debasis Dasc39a68d2019-01-28 17:02:06 +05302242{
2243 uint32_t addr, value;
2244
Debasis Dasc39a68d2019-01-28 17:02:06 +05302245 addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR(
2246 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2247
2248 value = (map[0] |
2249 (map[1] << HWIO_TCL_R0_PCP_TID_MAP_PCP_1_SHFT) |
2250 (map[2] << HWIO_TCL_R0_PCP_TID_MAP_PCP_2_SHFT) |
2251 (map[3] << HWIO_TCL_R0_PCP_TID_MAP_PCP_3_SHFT) |
2252 (map[4] << HWIO_TCL_R0_PCP_TID_MAP_PCP_4_SHFT) |
2253 (map[5] << HWIO_TCL_R0_PCP_TID_MAP_PCP_5_SHFT) |
2254 (map[6] << HWIO_TCL_R0_PCP_TID_MAP_PCP_6_SHFT) |
2255 (map[7] << HWIO_TCL_R0_PCP_TID_MAP_PCP_7_SHFT));
2256
2257 HAL_REG_WRITE(soc, addr, (value & HWIO_TCL_R0_PCP_TID_MAP_RMSK));
2258}
2259
2260/**
2261 * hal_tx_update_pcp_tid_generic() - Update the pcp tid map table with
2262 * value received from user-space
2263 * @soc: HAL SoC context
2264 * @pcp: pcp value
2265 * @tid : tid value
2266 *
2267 * Return: void
2268 */
2269static
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05302270void hal_tx_update_pcp_tid_generic(struct hal_soc *soc,
2271 uint8_t pcp, uint8_t tid)
Debasis Dasc39a68d2019-01-28 17:02:06 +05302272{
2273 uint32_t addr, value, regval;
2274
Debasis Dasc39a68d2019-01-28 17:02:06 +05302275 addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR(
2276 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2277
2278 value = (uint32_t)tid << (HAL_TX_BITS_PER_TID * pcp);
2279
2280 /* Read back previous PCP TID config and update
2281 * with new config.
2282 */
2283 regval = HAL_REG_READ(soc, addr);
2284 regval &= ~(HAL_TX_TID_BITS_MASK << (HAL_TX_BITS_PER_TID * pcp));
2285 regval |= value;
2286
2287 HAL_REG_WRITE(soc, addr,
2288 (regval & HWIO_TCL_R0_PCP_TID_MAP_RMSK));
2289}
2290
2291/**
2292 * hal_tx_update_tidmap_prty_generic() - Update the tid map priority
2293 * @soc: HAL SoC context
2294 * @val: priority value
2295 *
2296 * Return: void
2297 */
2298static
Akshay Kosigi8eda31c2019-07-10 14:42:42 +05302299void hal_tx_update_tidmap_prty_generic(struct hal_soc *soc, uint8_t value)
Debasis Dasc39a68d2019-01-28 17:02:06 +05302300{
2301 uint32_t addr;
2302
Debasis Dasc39a68d2019-01-28 17:02:06 +05302303 addr = HWIO_TCL_R0_TID_MAP_PRTY_ADDR(
2304 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET);
2305
2306 HAL_REG_WRITE(soc, addr,
2307 (value & HWIO_TCL_R0_TID_MAP_PRTY_RMSK));
2308}
2309#endif /* _HAL_GENERIC_API_H_ */