1 /* 2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for 6 * any purpose with or without fee is hereby granted, provided that the 7 * above copyright notice and this permission notice appear in all 8 * copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 11 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 12 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 13 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 14 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 15 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 16 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 17 * PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #ifndef _HAL_LI_GENERIC_API_H_ 21 #define _HAL_LI_GENERIC_API_H_ 22 23 #include "hal_tx.h" 24 #include "hal_li_tx.h" 25 #include "hal_li_rx.h" 26 27 #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) \ 28 (_HAL_MS((*_OFFSET_TO_WORD_PTR(wbm_desc, \ 29 WBM_RELEASE_RING_2_REO_PUSH_REASON_OFFSET)), \ 30 WBM_RELEASE_RING_2_REO_PUSH_REASON_MASK, \ 31 WBM_RELEASE_RING_2_REO_PUSH_REASON_LSB)) 32 33 #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) \ 34 (_HAL_MS((*_OFFSET_TO_WORD_PTR(wbm_desc, \ 35 WBM_RELEASE_RING_2_REO_ERROR_CODE_OFFSET)), \ 36 WBM_RELEASE_RING_2_REO_ERROR_CODE_MASK, \ 37 WBM_RELEASE_RING_2_REO_ERROR_CODE_LSB)) 38 39 #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc) \ 40 (((*(((uint32_t *)wbm_desc) + \ 41 (WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_OFFSET >> 2))) & \ 42 WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_MASK) >> \ 43 WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_LSB) 44 45 #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc) \ 46 (((*(((uint32_t *)wbm_desc) + \ 47 (WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_OFFSET >> 2))) & \ 48 WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_MASK) >> \ 49 WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_LSB) 50 51 /** 52 * hal_rx_wbm_err_info_get_generic_li() - Retrieves WBM error code and 53 * reason and save it to hal_wbm_err_desc_info structure passed 54 * by caller 55 * @wbm_desc: wbm ring descriptor 56 * @wbm_er_info1: hal_wbm_err_desc_info structure, output parameter. 57 * 58 * Return: void 59 */ 60 static inline hal_rx_wbm_err_info_get_generic_li(void * wbm_desc,void * wbm_er_info1)61 void hal_rx_wbm_err_info_get_generic_li(void *wbm_desc, 62 void *wbm_er_info1) 63 { 64 struct hal_wbm_err_desc_info *wbm_er_info = 65 (struct hal_wbm_err_desc_info *)wbm_er_info1; 66 67 wbm_er_info->wbm_err_src = HAL_WBM2SW_RELEASE_SRC_GET(wbm_desc); 68 wbm_er_info->reo_psh_rsn = HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc); 69 wbm_er_info->reo_err_code = HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc); 70 wbm_er_info->rxdma_psh_rsn = HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc); 71 wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc); 72 } 73 74 #if defined(WLAN_FEATURE_TSF_AUTO_REPORT) || defined(WLAN_CONFIG_TX_DELAY) 75 static inline void hal_tx_comp_get_buffer_timestamp_li(void * desc,struct hal_tx_completion_status * ts)76 hal_tx_comp_get_buffer_timestamp_li(void *desc, 77 struct hal_tx_completion_status *ts) 78 { 79 ts->buffer_timestamp = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, 80 BUFFER_TIMESTAMP); 81 } 82 #else /* !(WLAN_FEATURE_TSF_AUTO_REPORT || WLAN_CONFIG_TX_DELAY) */ 83 static inline void hal_tx_comp_get_buffer_timestamp_li(void * desc,struct hal_tx_completion_status * ts)84 hal_tx_comp_get_buffer_timestamp_li(void *desc, 85 struct hal_tx_completion_status *ts) 86 { 87 } 88 #endif /* WLAN_FEATURE_TSF_AUTO_REPORT || WLAN_CONFIG_TX_DELAY */ 89 90 #ifdef QCA_UNDECODED_METADATA_SUPPORT 91 static inline void hal_rx_get_phyrx_abort(struct hal_soc * hal,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)92 hal_rx_get_phyrx_abort(struct hal_soc *hal, void *rx_tlv, 93 struct hal_rx_ppdu_info *ppdu_info){ 94 switch (hal->target_type) { 95 case TARGET_TYPE_QCN9000: 96 case TARGET_TYPE_QCN9160: 97 ppdu_info->rx_status.phyrx_abort = 98 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2, 99 PHYRX_ABORT_REQUEST_INFO_VALID); 100 ppdu_info->rx_status.phyrx_abort_reason = 101 HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_11, 102 PHYRX_ABORT_REQUEST_INFO_DETAILS_PHYRX_ABORT_REASON); 103 break; 104 default: 105 break; 106 } 107 } 108 109 static inline void hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * ht_sig_info)110 hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info *ppdu_info, 111 uint8_t *ht_sig_info) 112 { 113 ppdu_info->rx_status.ht_length = 114 HAL_RX_GET(ht_sig_info, HT_SIG_INFO_0, LENGTH); 115 ppdu_info->rx_status.smoothing = 116 HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, SMOOTHING); 117 ppdu_info->rx_status.not_sounding = 118 HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, NOT_SOUNDING); 119 ppdu_info->rx_status.aggregation = 120 HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, AGGREGATION); 121 ppdu_info->rx_status.ht_stbc = 122 HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, STBC); 123 ppdu_info->rx_status.ht_crc = 124 HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, CRC); 125 } 126 127 static inline void hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * l_sig_a_info)128 hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info *ppdu_info, 129 uint8_t *l_sig_a_info) 130 { 131 ppdu_info->rx_status.l_sig_length = 132 HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, LENGTH); 133 ppdu_info->rx_status.l_sig_a_parity = 134 HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, PARITY); 135 ppdu_info->rx_status.l_sig_a_pkt_type = 136 HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, PKT_TYPE); 137 ppdu_info->rx_status.l_sig_a_implicit_sounding = 138 HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, 139 CAPTURED_IMPLICIT_SOUNDING); 140 } 141 142 static inline void hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * vht_sig_a_info)143 hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info *ppdu_info, 144 uint8_t *vht_sig_a_info) 145 { 146 ppdu_info->rx_status.vht_no_txop_ps = 147 HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0, 148 TXOP_PS_NOT_ALLOWED); 149 ppdu_info->rx_status.vht_crc = 150 HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1, CRC); 151 } 152 153 static inline void hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * he_sig_a_su_info)154 hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info *ppdu_info, 155 uint8_t *he_sig_a_su_info) { 156 ppdu_info->rx_status.he_crc = 157 HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, CRC); 158 } 159 160 static inline void hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * he_sig_a_mu_dl_info)161 hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info *ppdu_info, 162 uint8_t *he_sig_a_mu_dl_info) { 163 ppdu_info->rx_status.he_crc = 164 HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, CRC); 165 } 166 #else 167 static inline void hal_rx_get_phyrx_abort(struct hal_soc * hal,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)168 hal_rx_get_phyrx_abort(struct hal_soc *hal, void *rx_tlv, 169 struct hal_rx_ppdu_info *ppdu_info) 170 { 171 } 172 173 static inline void hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * ht_sig_info)174 hal_rx_get_ht_sig_info(struct hal_rx_ppdu_info *ppdu_info, 175 uint8_t *ht_sig_info) 176 { 177 } 178 179 static inline void hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * l_sig_a_info)180 hal_rx_get_l_sig_a_info(struct hal_rx_ppdu_info *ppdu_info, 181 uint8_t *l_sig_a_info) 182 { 183 } 184 185 static inline void hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * vht_sig_a_info)186 hal_rx_get_vht_sig_a_info(struct hal_rx_ppdu_info *ppdu_info, 187 uint8_t *vht_sig_a_info) 188 { 189 } 190 191 static inline void hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * he_sig_a_su_info)192 hal_rx_get_crc_he_sig_a_su_info(struct hal_rx_ppdu_info *ppdu_info, 193 uint8_t *he_sig_a_su_info) 194 { 195 } 196 197 static inline void hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info * ppdu_info,uint8_t * he_sig_a_mu_dl_info)198 hal_rx_get_crc_he_sig_a_mu_dl_info(struct hal_rx_ppdu_info *ppdu_info, 199 uint8_t *he_sig_a_mu_dl_info) 200 { 201 } 202 #endif /* QCA_UNDECODED_METADATA_SUPPORT */ 203 204 /** 205 * hal_tx_comp_get_status_generic_li() - Get tx completion status 206 * @desc: tx descriptor 207 * @ts1: completion ring Tx status 208 * @hal: hal_soc object 209 * 210 * This function will parse the WBM completion descriptor and populate in 211 * HAL structure 212 * 213 * Return: none 214 */ 215 static inline void hal_tx_comp_get_status_generic_li(void * desc,void * ts1,struct hal_soc * hal)216 hal_tx_comp_get_status_generic_li(void *desc, void *ts1, 217 struct hal_soc *hal) 218 { 219 uint8_t rate_stats_valid = 0; 220 uint32_t rate_stats = 0; 221 struct hal_tx_completion_status *ts = 222 (struct hal_tx_completion_status *)ts1; 223 224 ts->ppdu_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3, 225 TQM_STATUS_NUMBER); 226 ts->ack_frame_rssi = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, 227 ACK_FRAME_RSSI); 228 ts->first_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, FIRST_MSDU); 229 ts->last_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, LAST_MSDU); 230 ts->msdu_part_of_amsdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, 231 MSDU_PART_OF_AMSDU); 232 233 ts->peer_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, SW_PEER_ID); 234 ts->tid = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, TID); 235 ts->transmit_cnt = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3, 236 TRANSMIT_COUNT); 237 238 rate_stats = HAL_TX_DESC_GET(desc, HAL_TX_COMP, TX_RATE_STATS); 239 240 rate_stats_valid = HAL_TX_MS(TX_RATE_STATS_INFO_0, 241 TX_RATE_STATS_INFO_VALID, rate_stats); 242 243 ts->valid = rate_stats_valid; 244 245 if (rate_stats_valid) { 246 ts->bw = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_BW, 247 rate_stats); 248 ts->pkt_type = HAL_TX_MS(TX_RATE_STATS_INFO_0, 249 TRANSMIT_PKT_TYPE, rate_stats); 250 ts->stbc = HAL_TX_MS(TX_RATE_STATS_INFO_0, 251 TRANSMIT_STBC, rate_stats); 252 ts->ldpc = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_LDPC, 253 rate_stats); 254 ts->sgi = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_SGI, 255 rate_stats); 256 ts->mcs = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_MCS, 257 rate_stats); 258 ts->ofdma = HAL_TX_MS(TX_RATE_STATS_INFO_0, OFDMA_TRANSMISSION, 259 rate_stats); 260 ts->tones_in_ru = HAL_TX_MS(TX_RATE_STATS_INFO_0, TONES_IN_RU, 261 rate_stats); 262 } 263 264 ts->release_src = hal_tx_comp_get_buffer_source( 265 hal_soc_to_hal_soc_handle(hal), 266 desc); 267 ts->status = hal_tx_comp_get_release_reason( 268 desc, 269 hal_soc_to_hal_soc_handle(hal)); 270 271 ts->tsf = HAL_TX_DESC_GET(desc, UNIFIED_WBM_RELEASE_RING_6, 272 TX_RATE_STATS_INFO_TX_RATE_STATS); 273 274 hal_tx_comp_get_buffer_timestamp_li(desc, ts); 275 } 276 277 /** 278 * hal_tx_desc_set_buf_addr_generic_li() - Fill Buffer Address 279 * information in Tx Descriptor 280 * @desc: Handle to Tx Descriptor 281 * @paddr: Physical Address 282 * @rbm_id: Return Buffer Manager ID 283 * @desc_id: Descriptor ID 284 * @type: 0 - Address points to a MSDU buffer 285 * 1 - Address points to MSDU extension descriptor 286 * 287 * Return: void 288 */ 289 static inline void hal_tx_desc_set_buf_addr_generic_li(void * desc,dma_addr_t paddr,uint8_t rbm_id,uint32_t desc_id,uint8_t type)290 hal_tx_desc_set_buf_addr_generic_li(void *desc, dma_addr_t paddr, 291 uint8_t rbm_id, uint32_t desc_id, 292 uint8_t type) 293 { 294 /* Set buffer_addr_info.buffer_addr_31_0 */ 295 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_0, 296 BUFFER_ADDR_INFO_BUF_ADDR_INFO) = 297 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_0, BUFFER_ADDR_31_0, paddr); 298 299 /* Set buffer_addr_info.buffer_addr_39_32 */ 300 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1, 301 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |= 302 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, BUFFER_ADDR_39_32, 303 (((uint64_t)paddr) >> 32)); 304 305 /* Set buffer_addr_info.return_buffer_manager = rbm id */ 306 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1, 307 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |= 308 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, 309 RETURN_BUFFER_MANAGER, rbm_id); 310 311 /* Set buffer_addr_info.sw_buffer_cookie = desc_id */ 312 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1, 313 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |= 314 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, SW_BUFFER_COOKIE, 315 desc_id); 316 317 /* Set Buffer or Ext Descriptor Type */ 318 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_2, 319 BUF_OR_EXT_DESC_TYPE) |= 320 HAL_TX_SM(UNIFIED_TCL_DATA_CMD_2, BUF_OR_EXT_DESC_TYPE, type); 321 } 322 323 #if defined(QCA_WIFI_QCA6290_11AX_MU_UL) && defined(QCA_WIFI_QCA6290_11AX) 324 /** 325 * hal_rx_handle_other_tlvs() - handle special TLVs like MU_UL 326 * @tlv_tag: Tag of the TLVs 327 * @rx_tlv: the pointer to the TLVs 328 * @ppdu_info: pointer to ppdu_info 329 * 330 * Return: true if the tlv is handled, false if not 331 */ 332 static inline bool hal_rx_handle_other_tlvs(uint32_t tlv_tag,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)333 hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv, 334 struct hal_rx_ppdu_info *ppdu_info) 335 { 336 uint32_t value; 337 338 switch (tlv_tag) { 339 case WIFIPHYRX_HE_SIG_A_MU_UL_E: 340 { 341 uint8_t *he_sig_a_mu_ul_info = 342 (uint8_t *)rx_tlv + 343 HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_UL_0, 344 HE_SIG_A_MU_UL_INFO_PHYRX_HE_SIG_A_MU_UL_INFO_DETAILS); 345 ppdu_info->rx_status.he_flags = 1; 346 347 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0, 348 FORMAT_INDICATION); 349 if (value == 0) { 350 ppdu_info->rx_status.he_data1 = 351 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE; 352 } else { 353 ppdu_info->rx_status.he_data1 = 354 QDF_MON_STATUS_HE_SU_FORMAT_TYPE; 355 } 356 357 /* data1 */ 358 ppdu_info->rx_status.he_data1 |= 359 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN | 360 QDF_MON_STATUS_HE_DL_UL_KNOWN | 361 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN; 362 363 /* data2 */ 364 ppdu_info->rx_status.he_data2 |= 365 QDF_MON_STATUS_TXOP_KNOWN; 366 367 /*data3*/ 368 value = HAL_RX_GET(he_sig_a_mu_ul_info, 369 HE_SIG_A_MU_UL_INFO_0, BSS_COLOR_ID); 370 ppdu_info->rx_status.he_data3 = value; 371 /* 1 for UL and 0 for DL */ 372 value = 1; 373 value = value << QDF_MON_STATUS_DL_UL_SHIFT; 374 ppdu_info->rx_status.he_data3 |= value; 375 376 /*data4*/ 377 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0, 378 SPATIAL_REUSE); 379 ppdu_info->rx_status.he_data4 = value; 380 381 /*data5*/ 382 value = HAL_RX_GET(he_sig_a_mu_ul_info, 383 HE_SIG_A_MU_UL_INFO_0, TRANSMIT_BW); 384 ppdu_info->rx_status.he_data5 = value; 385 ppdu_info->rx_status.bw = value; 386 387 /*data6*/ 388 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_1, 389 TXOP_DURATION); 390 value = value << QDF_MON_STATUS_TXOP_SHIFT; 391 ppdu_info->rx_status.he_data6 |= value; 392 return true; 393 } 394 default: 395 return false; 396 } 397 } 398 #else 399 static inline bool hal_rx_handle_other_tlvs(uint32_t tlv_tag,void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)400 hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv, 401 struct hal_rx_ppdu_info *ppdu_info) 402 { 403 return false; 404 } 405 #endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */ 406 407 #if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) && \ 408 defined(RX_PPDU_END_USER_STATS_22_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET) 409 410 static inline void hal_rx_handle_mu_ul_info(void * rx_tlv,struct mon_rx_user_status * mon_rx_user_status)411 hal_rx_handle_mu_ul_info(void *rx_tlv, 412 struct mon_rx_user_status *mon_rx_user_status) 413 { 414 mon_rx_user_status->mu_ul_user_v0_word0 = 415 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11, 416 SW_RESPONSE_REFERENCE_PTR); 417 418 mon_rx_user_status->mu_ul_user_v0_word1 = 419 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22, 420 SW_RESPONSE_REFERENCE_PTR_EXT); 421 } 422 423 static inline void hal_rx_populate_byte_count(void * rx_tlv,void * ppduinfo,struct mon_rx_user_status * mon_rx_user_status)424 hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo, 425 struct mon_rx_user_status *mon_rx_user_status) 426 { 427 uint32_t mpdu_ok_byte_count; 428 uint32_t mpdu_err_byte_count; 429 430 mpdu_ok_byte_count = HAL_RX_GET(rx_tlv, 431 RX_PPDU_END_USER_STATS_17, 432 MPDU_OK_BYTE_COUNT); 433 mpdu_err_byte_count = HAL_RX_GET(rx_tlv, 434 RX_PPDU_END_USER_STATS_19, 435 MPDU_ERR_BYTE_COUNT); 436 437 mon_rx_user_status->mpdu_ok_byte_count = mpdu_ok_byte_count; 438 mon_rx_user_status->mpdu_err_byte_count = mpdu_err_byte_count; 439 } 440 #else 441 static inline void hal_rx_handle_mu_ul_info(void * rx_tlv,struct mon_rx_user_status * mon_rx_user_status)442 hal_rx_handle_mu_ul_info(void *rx_tlv, 443 struct mon_rx_user_status *mon_rx_user_status) 444 { 445 } 446 447 static inline void hal_rx_populate_byte_count(void * rx_tlv,void * ppduinfo,struct mon_rx_user_status * mon_rx_user_status)448 hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo, 449 struct mon_rx_user_status *mon_rx_user_status) 450 { 451 struct hal_rx_ppdu_info *ppdu_info = 452 (struct hal_rx_ppdu_info *)ppduinfo; 453 454 /* HKV1: doesn't support mpdu byte count */ 455 mon_rx_user_status->mpdu_ok_byte_count = ppdu_info->rx_status.ppdu_len; 456 mon_rx_user_status->mpdu_err_byte_count = 0; 457 } 458 #endif 459 460 static inline void hal_rx_populate_mu_user_info(void * rx_tlv,void * ppduinfo,uint32_t user_id,struct mon_rx_user_status * mon_rx_user_status)461 hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, uint32_t user_id, 462 struct mon_rx_user_status *mon_rx_user_status) 463 { 464 struct mon_rx_info *mon_rx_info; 465 struct mon_rx_user_info *mon_rx_user_info; 466 struct hal_rx_ppdu_info *ppdu_info = 467 (struct hal_rx_ppdu_info *)ppduinfo; 468 469 mon_rx_info = &ppdu_info->rx_info; 470 mon_rx_user_info = &ppdu_info->rx_user_info[user_id]; 471 mon_rx_user_info->qos_control_info_valid = 472 mon_rx_info->qos_control_info_valid; 473 mon_rx_user_info->qos_control = mon_rx_info->qos_control; 474 475 mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index; 476 mon_rx_user_status->tid = ppdu_info->rx_status.tid; 477 mon_rx_user_status->tcp_msdu_count = 478 ppdu_info->rx_status.tcp_msdu_count; 479 mon_rx_user_status->udp_msdu_count = 480 ppdu_info->rx_status.udp_msdu_count; 481 mon_rx_user_status->other_msdu_count = 482 ppdu_info->rx_status.other_msdu_count; 483 mon_rx_user_status->frame_control = ppdu_info->rx_status.frame_control; 484 mon_rx_user_status->frame_control_info_valid = 485 ppdu_info->rx_status.frame_control_info_valid; 486 mon_rx_user_status->data_sequence_control_info_valid = 487 ppdu_info->rx_status.data_sequence_control_info_valid; 488 mon_rx_user_status->first_data_seq_ctrl = 489 ppdu_info->rx_status.first_data_seq_ctrl; 490 mon_rx_user_status->preamble_type = ppdu_info->rx_status.preamble_type; 491 mon_rx_user_status->ht_flags = ppdu_info->rx_status.ht_flags; 492 mon_rx_user_status->rtap_flags = ppdu_info->rx_status.rtap_flags; 493 mon_rx_user_status->vht_flags = ppdu_info->rx_status.vht_flags; 494 mon_rx_user_status->he_flags = ppdu_info->rx_status.he_flags; 495 mon_rx_user_status->rs_flags = ppdu_info->rx_status.rs_flags; 496 497 mon_rx_user_status->mpdu_cnt_fcs_ok = 498 ppdu_info->com_info.mpdu_cnt_fcs_ok; 499 mon_rx_user_status->mpdu_cnt_fcs_err = 500 ppdu_info->com_info.mpdu_cnt_fcs_err; 501 qdf_mem_copy(&mon_rx_user_status->mpdu_fcs_ok_bitmap, 502 &ppdu_info->com_info.mpdu_fcs_ok_bitmap, 503 HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * 504 sizeof(ppdu_info->com_info.mpdu_fcs_ok_bitmap[0])); 505 506 hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status); 507 } 508 509 #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \ 510 ppdu_info, rssi_info_tlv) \ 511 { \ 512 ppdu_info->rx_status.rssi_chain[chain][0] = \ 513 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ 514 RSSI_PRI20_CHAIN##chain); \ 515 ppdu_info->rx_status.rssi_chain[chain][1] = \ 516 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ 517 RSSI_EXT20_CHAIN##chain); \ 518 ppdu_info->rx_status.rssi_chain[chain][2] = \ 519 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ 520 RSSI_EXT40_LOW20_CHAIN##chain); \ 521 ppdu_info->rx_status.rssi_chain[chain][3] = \ 522 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ 523 RSSI_EXT40_HIGH20_CHAIN##chain); \ 524 ppdu_info->rx_status.rssi_chain[chain][4] = \ 525 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ 526 RSSI_EXT80_LOW20_CHAIN##chain); \ 527 ppdu_info->rx_status.rssi_chain[chain][5] = \ 528 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ 529 RSSI_EXT80_LOW_HIGH20_CHAIN##chain); \ 530 ppdu_info->rx_status.rssi_chain[chain][6] = \ 531 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ 532 RSSI_EXT80_HIGH_LOW20_CHAIN##chain); \ 533 ppdu_info->rx_status.rssi_chain[chain][7] = \ 534 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ 535 RSSI_EXT80_HIGH20_CHAIN##chain); \ 536 } \ 537 538 #define HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) \ 539 {HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(0, 0, 1, ppdu_info, rssi_info_tlv) \ 540 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(1, 2, 3, ppdu_info, rssi_info_tlv) \ 541 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(2, 4, 5, ppdu_info, rssi_info_tlv) \ 542 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(3, 6, 7, ppdu_info, rssi_info_tlv) \ 543 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(4, 8, 9, ppdu_info, rssi_info_tlv) \ 544 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(5, 10, 11, ppdu_info, rssi_info_tlv) \ 545 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(6, 12, 13, ppdu_info, rssi_info_tlv) \ 546 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(7, 14, 15, ppdu_info, rssi_info_tlv)} \ 547 548 static inline uint32_t hal_rx_update_rssi_chain(struct hal_rx_ppdu_info * ppdu_info,uint8_t * rssi_info_tlv)549 hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info, 550 uint8_t *rssi_info_tlv) 551 { 552 HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) 553 return 0; 554 } 555 556 #ifdef WLAN_TX_PKT_CAPTURE_ENH 557 static inline void hal_get_qos_control(void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)558 hal_get_qos_control(void *rx_tlv, 559 struct hal_rx_ppdu_info *ppdu_info) 560 { 561 ppdu_info->rx_info.qos_control_info_valid = 562 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 563 QOS_CONTROL_INFO_VALID); 564 565 if (ppdu_info->rx_info.qos_control_info_valid) 566 ppdu_info->rx_info.qos_control = 567 HAL_RX_GET(rx_tlv, 568 RX_PPDU_END_USER_STATS_5, 569 QOS_CONTROL_FIELD); 570 } 571 572 static inline void hal_get_mac_addr1(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)573 hal_get_mac_addr1(uint8_t *rx_mpdu_start, 574 struct hal_rx_ppdu_info *ppdu_info) 575 { 576 if ((ppdu_info->sw_frame_group_id 577 == HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ) || 578 (ppdu_info->sw_frame_group_id == 579 HAL_MPDU_SW_FRAME_GROUP_CTRL_RTS)) { 580 ppdu_info->rx_info.mac_addr1_valid = 581 HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start); 582 583 *(uint32_t *)&ppdu_info->rx_info.mac_addr1[0] = 584 HAL_RX_GET(rx_mpdu_start, 585 RX_MPDU_INFO_15, 586 MAC_ADDR_AD1_31_0); 587 if (ppdu_info->sw_frame_group_id == 588 HAL_MPDU_SW_FRAME_GROUP_CTRL_RTS) { 589 *(uint16_t *)&ppdu_info->rx_info.mac_addr1[4] = 590 HAL_RX_GET(rx_mpdu_start, 591 RX_MPDU_INFO_16, 592 MAC_ADDR_AD1_47_32); 593 } 594 } 595 } 596 #else 597 static inline void hal_get_qos_control(void * rx_tlv,struct hal_rx_ppdu_info * ppdu_info)598 hal_get_qos_control(void *rx_tlv, 599 struct hal_rx_ppdu_info *ppdu_info) 600 { 601 } 602 603 static inline void hal_get_mac_addr1(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)604 hal_get_mac_addr1(uint8_t *rx_mpdu_start, 605 struct hal_rx_ppdu_info *ppdu_info) 606 { 607 } 608 #endif 609 610 #ifdef QCA_SUPPORT_SCAN_SPCL_VAP_STATS 611 static inline void hal_update_frame_type_cnt(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)612 hal_update_frame_type_cnt(uint8_t *rx_mpdu_start, 613 struct hal_rx_ppdu_info *ppdu_info) 614 { 615 uint16_t frame_ctrl; 616 uint8_t fc_type; 617 618 if (HAL_RX_GET_FC_VALID(rx_mpdu_start)) { 619 frame_ctrl = HAL_RX_GET(rx_mpdu_start, 620 RX_MPDU_INFO_14, 621 MPDU_FRAME_CONTROL_FIELD); 622 fc_type = HAL_RX_GET_FRAME_CTRL_TYPE(frame_ctrl); 623 if (fc_type == HAL_RX_FRAME_CTRL_TYPE_MGMT) 624 ppdu_info->frm_type_info.rx_mgmt_cnt++; 625 else if (fc_type == HAL_RX_FRAME_CTRL_TYPE_CTRL) 626 ppdu_info->frm_type_info.rx_ctrl_cnt++; 627 else if (fc_type == HAL_RX_FRAME_CTRL_TYPE_DATA) 628 ppdu_info->frm_type_info.rx_data_cnt++; 629 } 630 } 631 #else 632 static inline void hal_update_frame_type_cnt(uint8_t * rx_mpdu_start,struct hal_rx_ppdu_info * ppdu_info)633 hal_update_frame_type_cnt(uint8_t *rx_mpdu_start, 634 struct hal_rx_ppdu_info *ppdu_info) 635 { 636 } 637 #endif 638 639 #ifdef WLAN_SUPPORT_CTRL_FRAME_STATS 640 static inline void hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info * ppdu_info,uint32_t user_id)641 hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info *ppdu_info, 642 uint32_t user_id) 643 { 644 uint16_t fc = ppdu_info->nac_info.frame_control; 645 646 if (HAL_RX_GET_FRAME_CTRL_TYPE(fc) == HAL_RX_FRAME_CTRL_TYPE_CTRL) { 647 if ((fc & QDF_IEEE80211_FC0_SUBTYPE_MASK) == 648 QDF_IEEE80211_FC0_SUBTYPE_VHT_NDP_AN) 649 ppdu_info->ctrl_frm_info[user_id].ndpa = 1; 650 if ((fc & QDF_IEEE80211_FC0_SUBTYPE_MASK) == 651 QDF_IEEE80211_FC0_SUBTYPE_BAR) 652 ppdu_info->ctrl_frm_info[user_id].bar = 1; 653 } 654 } 655 #else 656 static inline void hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info * ppdu_info,uint32_t user_id)657 hal_update_rx_ctrl_frame_stats(struct hal_rx_ppdu_info *ppdu_info, 658 uint32_t user_id) 659 { 660 } 661 #endif /* WLAN_SUPPORT_CTRL_FRAME_STATS */ 662 663 /** 664 * hal_rx_status_get_tlv_info_generic_li() - process receive info TLV 665 * @rx_tlv_hdr: pointer to TLV header 666 * @ppduinfo: pointer to ppdu_info 667 * @hal_soc_hdl: hal_soc handle 668 * @nbuf: pointer the pkt buffer. 669 * 670 * Return: HAL_TLV_STATUS_PPDU_NOT_DONE or HAL_TLV_STATUS_PPDU_DONE from tlv 671 */ 672 static inline uint32_t hal_rx_status_get_tlv_info_generic_li(void * rx_tlv_hdr,void * ppduinfo,hal_soc_handle_t hal_soc_hdl,qdf_nbuf_t nbuf)673 hal_rx_status_get_tlv_info_generic_li(void *rx_tlv_hdr, void *ppduinfo, 674 hal_soc_handle_t hal_soc_hdl, 675 qdf_nbuf_t nbuf) 676 { 677 struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl; 678 uint32_t tlv_tag, user_id, tlv_len, value; 679 uint8_t group_id = 0; 680 uint8_t he_dcm = 0; 681 uint8_t he_stbc = 0; 682 uint16_t he_gi = 0; 683 uint16_t he_ltf = 0; 684 void *rx_tlv; 685 bool unhandled = false; 686 struct mon_rx_user_status *mon_rx_user_status; 687 struct hal_rx_ppdu_info *ppdu_info = 688 (struct hal_rx_ppdu_info *)ppduinfo; 689 690 tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr); 691 user_id = HAL_RX_GET_USER_TLV32_USERID(rx_tlv_hdr); 692 tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr); 693 694 rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE; 695 696 switch (tlv_tag) { 697 case WIFIRX_PPDU_START_E: 698 { 699 if (qdf_unlikely(ppdu_info->com_info.last_ppdu_id == 700 HAL_RX_GET(rx_tlv, RX_PPDU_START_0, PHY_PPDU_ID))) 701 hal_err("Matching ppdu_id(%u) detected", 702 ppdu_info->com_info.last_ppdu_id); 703 704 /* Reset ppdu_info before processing the ppdu */ 705 qdf_mem_zero(ppdu_info, 706 sizeof(struct hal_rx_ppdu_info)); 707 708 ppdu_info->com_info.last_ppdu_id = 709 ppdu_info->com_info.ppdu_id = 710 HAL_RX_GET(rx_tlv, RX_PPDU_START_0, 711 PHY_PPDU_ID); 712 713 /* channel number is set in PHY meta data */ 714 ppdu_info->rx_status.chan_num = 715 (HAL_RX_GET(rx_tlv, RX_PPDU_START_1, 716 SW_PHY_META_DATA) & 0x0000FFFF); 717 ppdu_info->rx_status.chan_freq = 718 (HAL_RX_GET(rx_tlv, RX_PPDU_START_1, 719 SW_PHY_META_DATA) & 0xFFFF0000) >> 16; 720 if (ppdu_info->rx_status.chan_num) { 721 ppdu_info->rx_status.chan_freq = 722 hal_rx_radiotap_num_to_freq( 723 ppdu_info->rx_status.chan_num, 724 ppdu_info->rx_status.chan_freq); 725 } 726 ppdu_info->com_info.ppdu_timestamp = 727 HAL_RX_GET(rx_tlv, RX_PPDU_START_2, 728 PPDU_START_TIMESTAMP); 729 ppdu_info->rx_status.ppdu_timestamp = 730 ppdu_info->com_info.ppdu_timestamp; 731 ppdu_info->rx_state = HAL_RX_MON_PPDU_START; 732 733 break; 734 } 735 736 case WIFIRX_PPDU_START_USER_INFO_E: 737 break; 738 739 case WIFIRX_PPDU_END_E: 740 dp_nofl_debug("[%s][%d] ppdu_end_e len=%d", 741 __func__, __LINE__, tlv_len); 742 /* This is followed by sub-TLVs of PPDU_END */ 743 ppdu_info->rx_state = HAL_RX_MON_PPDU_END; 744 break; 745 746 case WIFIPHYRX_PKT_END_E: 747 hal_rx_get_rtt_info(hal_soc_hdl, rx_tlv, ppdu_info); 748 break; 749 750 case WIFIRXPCU_PPDU_END_INFO_E: 751 ppdu_info->rx_status.rx_antenna = 752 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2, RX_ANTENNA); 753 ppdu_info->rx_status.tsft = 754 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_1, 755 WB_TIMESTAMP_UPPER_32); 756 ppdu_info->rx_status.tsft = (ppdu_info->rx_status.tsft << 32) | 757 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_0, 758 WB_TIMESTAMP_LOWER_32); 759 ppdu_info->rx_status.duration = 760 HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_8, 761 RX_PPDU_DURATION); 762 hal_rx_get_bb_info(hal_soc_hdl, rx_tlv, ppdu_info); 763 hal_rx_get_phyrx_abort(hal, rx_tlv, ppdu_info); 764 break; 765 766 /* 767 * WIFIRX_PPDU_END_USER_STATS_E comes for each user received. 768 * for MU, based on num users we see this tlv that many times. 769 */ 770 case WIFIRX_PPDU_END_USER_STATS_E: 771 { 772 unsigned long tid = 0; 773 uint16_t seq = 0; 774 775 ppdu_info->rx_status.ast_index = 776 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4, 777 AST_INDEX); 778 779 tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12, 780 RECEIVED_QOS_DATA_TID_BITMAP); 781 ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, 782 sizeof(tid) * 8); 783 784 if (ppdu_info->rx_status.tid == (sizeof(tid) * 8)) 785 ppdu_info->rx_status.tid = HAL_TID_INVALID; 786 787 ppdu_info->rx_status.tcp_msdu_count = 788 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9, 789 TCP_MSDU_COUNT) + 790 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10, 791 TCP_ACK_MSDU_COUNT); 792 ppdu_info->rx_status.udp_msdu_count = 793 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9, 794 UDP_MSDU_COUNT); 795 ppdu_info->rx_status.other_msdu_count = 796 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10, 797 OTHER_MSDU_COUNT); 798 799 if (ppdu_info->sw_frame_group_id 800 != HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) { 801 ppdu_info->rx_status.frame_control_info_valid = 802 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 803 FRAME_CONTROL_INFO_VALID); 804 805 if (ppdu_info->rx_status.frame_control_info_valid) 806 ppdu_info->rx_status.frame_control = 807 HAL_RX_GET(rx_tlv, 808 RX_PPDU_END_USER_STATS_4, 809 FRAME_CONTROL_FIELD); 810 811 hal_get_qos_control(rx_tlv, ppdu_info); 812 } 813 814 ppdu_info->rx_status.data_sequence_control_info_valid = 815 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 816 DATA_SEQUENCE_CONTROL_INFO_VALID); 817 818 seq = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_5, 819 FIRST_DATA_SEQ_CTRL); 820 if (ppdu_info->rx_status.data_sequence_control_info_valid) 821 ppdu_info->rx_status.first_data_seq_ctrl = seq; 822 823 ppdu_info->rx_status.preamble_type = 824 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 825 HT_CONTROL_FIELD_PKT_TYPE); 826 switch (ppdu_info->rx_status.preamble_type) { 827 case HAL_RX_PKT_TYPE_11N: 828 ppdu_info->rx_status.ht_flags = 1; 829 ppdu_info->rx_status.rtap_flags |= HT_SGI_PRESENT; 830 break; 831 case HAL_RX_PKT_TYPE_11AC: 832 ppdu_info->rx_status.vht_flags = 1; 833 break; 834 case HAL_RX_PKT_TYPE_11AX: 835 ppdu_info->rx_status.he_flags = 1; 836 break; 837 default: 838 break; 839 } 840 841 ppdu_info->com_info.mpdu_cnt_fcs_ok = 842 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 843 MPDU_CNT_FCS_OK); 844 ppdu_info->com_info.mpdu_cnt_fcs_err = 845 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2, 846 MPDU_CNT_FCS_ERR); 847 if ((ppdu_info->com_info.mpdu_cnt_fcs_ok | 848 ppdu_info->com_info.mpdu_cnt_fcs_err) > 1) 849 ppdu_info->rx_status.rs_flags |= IEEE80211_AMPDU_FLAG; 850 else 851 ppdu_info->rx_status.rs_flags &= 852 (~IEEE80211_AMPDU_FLAG); 853 854 ppdu_info->com_info.mpdu_fcs_ok_bitmap[0] = 855 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_7, 856 FCS_OK_BITMAP_31_0); 857 858 ppdu_info->com_info.mpdu_fcs_ok_bitmap[1] = 859 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_8, 860 FCS_OK_BITMAP_63_32); 861 862 if (user_id < HAL_MAX_UL_MU_USERS) { 863 mon_rx_user_status = 864 &ppdu_info->rx_user_status[user_id]; 865 866 hal_rx_handle_mu_ul_info(rx_tlv, mon_rx_user_status); 867 868 ppdu_info->com_info.num_users++; 869 870 hal_rx_populate_mu_user_info(rx_tlv, ppdu_info, 871 user_id, 872 mon_rx_user_status); 873 } 874 break; 875 } 876 877 case WIFIRX_PPDU_END_USER_STATS_EXT_E: 878 ppdu_info->com_info.mpdu_fcs_ok_bitmap[2] = 879 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_1, 880 FCS_OK_BITMAP_95_64); 881 882 ppdu_info->com_info.mpdu_fcs_ok_bitmap[3] = 883 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_2, 884 FCS_OK_BITMAP_127_96); 885 886 ppdu_info->com_info.mpdu_fcs_ok_bitmap[4] = 887 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_3, 888 FCS_OK_BITMAP_159_128); 889 890 ppdu_info->com_info.mpdu_fcs_ok_bitmap[5] = 891 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_4, 892 FCS_OK_BITMAP_191_160); 893 894 ppdu_info->com_info.mpdu_fcs_ok_bitmap[6] = 895 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_5, 896 FCS_OK_BITMAP_223_192); 897 898 ppdu_info->com_info.mpdu_fcs_ok_bitmap[7] = 899 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_6, 900 FCS_OK_BITMAP_255_224); 901 break; 902 903 case WIFIRX_PPDU_END_STATUS_DONE_E: 904 return HAL_TLV_STATUS_PPDU_DONE; 905 906 case WIFIDUMMY_E: 907 return HAL_TLV_STATUS_BUF_DONE; 908 909 case WIFIPHYRX_HT_SIG_E: 910 { 911 uint8_t *ht_sig_info = (uint8_t *)rx_tlv + 912 HAL_RX_OFFSET(UNIFIED_PHYRX_HT_SIG_0, 913 HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS); 914 value = HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, 915 FEC_CODING); 916 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ? 917 1 : 0; 918 ppdu_info->rx_status.mcs = HAL_RX_GET(ht_sig_info, 919 HT_SIG_INFO_0, MCS); 920 ppdu_info->rx_status.ht_mcs = ppdu_info->rx_status.mcs; 921 ppdu_info->rx_status.bw = HAL_RX_GET(ht_sig_info, 922 HT_SIG_INFO_0, CBW); 923 ppdu_info->rx_status.sgi = HAL_RX_GET(ht_sig_info, 924 HT_SIG_INFO_1, SHORT_GI); 925 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 926 ppdu_info->rx_status.nss = ((ppdu_info->rx_status.mcs) >> 927 HT_SIG_SU_NSS_SHIFT) + 1; 928 ppdu_info->rx_status.mcs &= ((1 << HT_SIG_SU_NSS_SHIFT) - 1); 929 hal_rx_get_ht_sig_info(ppdu_info, ht_sig_info); 930 break; 931 } 932 933 case WIFIPHYRX_L_SIG_B_E: 934 { 935 uint8_t *l_sig_b_info = (uint8_t *)rx_tlv + 936 HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_B_0, 937 L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS); 938 939 value = HAL_RX_GET(l_sig_b_info, L_SIG_B_INFO_0, RATE); 940 ppdu_info->rx_status.l_sig_b_info = *((uint32_t *)l_sig_b_info); 941 switch (value) { 942 case 1: 943 ppdu_info->rx_status.rate = HAL_11B_RATE_3MCS; 944 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3; 945 break; 946 case 2: 947 ppdu_info->rx_status.rate = HAL_11B_RATE_2MCS; 948 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2; 949 break; 950 case 3: 951 ppdu_info->rx_status.rate = HAL_11B_RATE_1MCS; 952 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1; 953 break; 954 case 4: 955 ppdu_info->rx_status.rate = HAL_11B_RATE_0MCS; 956 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0; 957 break; 958 case 5: 959 ppdu_info->rx_status.rate = HAL_11B_RATE_6MCS; 960 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6; 961 break; 962 case 6: 963 ppdu_info->rx_status.rate = HAL_11B_RATE_5MCS; 964 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5; 965 break; 966 case 7: 967 ppdu_info->rx_status.rate = HAL_11B_RATE_4MCS; 968 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4; 969 break; 970 default: 971 break; 972 } 973 ppdu_info->rx_status.cck_flag = 1; 974 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 975 break; 976 } 977 978 case WIFIPHYRX_L_SIG_A_E: 979 { 980 uint8_t *l_sig_a_info = (uint8_t *)rx_tlv + 981 HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_A_0, 982 L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS); 983 984 value = HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, RATE); 985 ppdu_info->rx_status.l_sig_a_info = *((uint32_t *)l_sig_a_info); 986 switch (value) { 987 case 8: 988 ppdu_info->rx_status.rate = HAL_11A_RATE_0MCS; 989 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0; 990 break; 991 case 9: 992 ppdu_info->rx_status.rate = HAL_11A_RATE_1MCS; 993 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1; 994 break; 995 case 10: 996 ppdu_info->rx_status.rate = HAL_11A_RATE_2MCS; 997 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2; 998 break; 999 case 11: 1000 ppdu_info->rx_status.rate = HAL_11A_RATE_3MCS; 1001 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3; 1002 break; 1003 case 12: 1004 ppdu_info->rx_status.rate = HAL_11A_RATE_4MCS; 1005 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4; 1006 break; 1007 case 13: 1008 ppdu_info->rx_status.rate = HAL_11A_RATE_5MCS; 1009 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5; 1010 break; 1011 case 14: 1012 ppdu_info->rx_status.rate = HAL_11A_RATE_6MCS; 1013 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6; 1014 break; 1015 case 15: 1016 ppdu_info->rx_status.rate = HAL_11A_RATE_7MCS; 1017 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS7; 1018 break; 1019 default: 1020 break; 1021 } 1022 ppdu_info->rx_status.ofdm_flag = 1; 1023 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 1024 hal_rx_get_l_sig_a_info(ppdu_info, l_sig_a_info); 1025 break; 1026 } 1027 1028 case WIFIPHYRX_VHT_SIG_A_E: 1029 { 1030 uint8_t *vht_sig_a_info = (uint8_t *)rx_tlv + 1031 HAL_RX_OFFSET(UNIFIED_PHYRX_VHT_SIG_A_0, 1032 VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS); 1033 1034 value = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1, 1035 SU_MU_CODING); 1036 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ? 1037 1 : 0; 1038 group_id = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0, 1039 GROUP_ID); 1040 ppdu_info->rx_status.vht_flag_values5 = group_id; 1041 ppdu_info->rx_status.mcs = HAL_RX_GET(vht_sig_a_info, 1042 VHT_SIG_A_INFO_1, MCS); 1043 ppdu_info->rx_status.sgi = HAL_RX_GET(vht_sig_a_info, 1044 VHT_SIG_A_INFO_1, GI_SETTING); 1045 1046 switch (hal->target_type) { 1047 case TARGET_TYPE_QCA8074: 1048 case TARGET_TYPE_QCA8074V2: 1049 case TARGET_TYPE_QCA6018: 1050 case TARGET_TYPE_QCA5018: 1051 case TARGET_TYPE_QCN9000: 1052 case TARGET_TYPE_QCN6122: 1053 case TARGET_TYPE_QCN9160: 1054 #ifdef QCA_WIFI_QCA6390 1055 case TARGET_TYPE_QCA6390: 1056 #endif 1057 case TARGET_TYPE_QCA6490: 1058 ppdu_info->rx_status.is_stbc = 1059 HAL_RX_GET(vht_sig_a_info, 1060 VHT_SIG_A_INFO_0, STBC); 1061 value = HAL_RX_GET(vht_sig_a_info, 1062 VHT_SIG_A_INFO_0, N_STS); 1063 value = value & VHT_SIG_SU_NSS_MASK; 1064 if (ppdu_info->rx_status.is_stbc && (value > 0)) 1065 value = ((value + 1) >> 1) - 1; 1066 ppdu_info->rx_status.nss = 1067 ((value & VHT_SIG_SU_NSS_MASK) + 1); 1068 1069 break; 1070 case TARGET_TYPE_QCA6290: 1071 #if !defined(QCA_WIFI_QCA6290_11AX) 1072 ppdu_info->rx_status.is_stbc = 1073 HAL_RX_GET(vht_sig_a_info, 1074 VHT_SIG_A_INFO_0, STBC); 1075 value = HAL_RX_GET(vht_sig_a_info, 1076 VHT_SIG_A_INFO_0, N_STS); 1077 value = value & VHT_SIG_SU_NSS_MASK; 1078 if (ppdu_info->rx_status.is_stbc && (value > 0)) 1079 value = ((value + 1) >> 1) - 1; 1080 ppdu_info->rx_status.nss = 1081 ((value & VHT_SIG_SU_NSS_MASK) + 1); 1082 #else 1083 ppdu_info->rx_status.nss = 0; 1084 #endif 1085 break; 1086 case TARGET_TYPE_QCA6750: 1087 ppdu_info->rx_status.nss = 0; 1088 break; 1089 default: 1090 break; 1091 } 1092 ppdu_info->rx_status.vht_flag_values3[0] = 1093 (((ppdu_info->rx_status.mcs) << 4) 1094 | ppdu_info->rx_status.nss); 1095 ppdu_info->rx_status.bw = HAL_RX_GET(vht_sig_a_info, 1096 VHT_SIG_A_INFO_0, BANDWIDTH); 1097 ppdu_info->rx_status.vht_flag_values2 = 1098 ppdu_info->rx_status.bw; 1099 ppdu_info->rx_status.vht_flag_values4 = 1100 HAL_RX_GET(vht_sig_a_info, 1101 VHT_SIG_A_INFO_1, SU_MU_CODING); 1102 1103 ppdu_info->rx_status.beamformed = HAL_RX_GET(vht_sig_a_info, 1104 VHT_SIG_A_INFO_1, BEAMFORMED); 1105 if (group_id == 0 || group_id == 63) 1106 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 1107 else 1108 ppdu_info->rx_status.reception_type = 1109 HAL_RX_TYPE_MU_MIMO; 1110 1111 hal_rx_get_vht_sig_a_info(ppdu_info, vht_sig_a_info); 1112 break; 1113 } 1114 case WIFIPHYRX_HE_SIG_A_SU_E: 1115 { 1116 uint8_t *he_sig_a_su_info = (uint8_t *)rx_tlv + 1117 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_SU_0, 1118 HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS); 1119 ppdu_info->rx_status.he_flags = 1; 1120 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, 1121 FORMAT_INDICATION); 1122 if (value == 0) { 1123 ppdu_info->rx_status.he_data1 = 1124 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE; 1125 } else { 1126 ppdu_info->rx_status.he_data1 = 1127 QDF_MON_STATUS_HE_SU_FORMAT_TYPE; 1128 } 1129 1130 /* data1 */ 1131 ppdu_info->rx_status.he_data1 |= 1132 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN | 1133 QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN | 1134 QDF_MON_STATUS_HE_DL_UL_KNOWN | 1135 QDF_MON_STATUS_HE_MCS_KNOWN | 1136 QDF_MON_STATUS_HE_DCM_KNOWN | 1137 QDF_MON_STATUS_HE_CODING_KNOWN | 1138 QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN | 1139 QDF_MON_STATUS_HE_STBC_KNOWN | 1140 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN | 1141 QDF_MON_STATUS_HE_DOPPLER_KNOWN; 1142 1143 /* data2 */ 1144 ppdu_info->rx_status.he_data2 = 1145 QDF_MON_STATUS_HE_GI_KNOWN; 1146 ppdu_info->rx_status.he_data2 |= 1147 QDF_MON_STATUS_TXBF_KNOWN | 1148 QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN | 1149 QDF_MON_STATUS_TXOP_KNOWN | 1150 QDF_MON_STATUS_LTF_SYMBOLS_KNOWN | 1151 QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN | 1152 QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN; 1153 1154 /* data3 */ 1155 value = HAL_RX_GET(he_sig_a_su_info, 1156 HE_SIG_A_SU_INFO_0, BSS_COLOR_ID); 1157 ppdu_info->rx_status.he_data3 = value; 1158 value = HAL_RX_GET(he_sig_a_su_info, 1159 HE_SIG_A_SU_INFO_0, BEAM_CHANGE); 1160 value = value << QDF_MON_STATUS_BEAM_CHANGE_SHIFT; 1161 ppdu_info->rx_status.he_data3 |= value; 1162 value = HAL_RX_GET(he_sig_a_su_info, 1163 HE_SIG_A_SU_INFO_0, DL_UL_FLAG); 1164 value = value << QDF_MON_STATUS_DL_UL_SHIFT; 1165 ppdu_info->rx_status.he_data3 |= value; 1166 1167 value = HAL_RX_GET(he_sig_a_su_info, 1168 HE_SIG_A_SU_INFO_0, TRANSMIT_MCS); 1169 ppdu_info->rx_status.mcs = value; 1170 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT; 1171 ppdu_info->rx_status.he_data3 |= value; 1172 1173 value = HAL_RX_GET(he_sig_a_su_info, 1174 HE_SIG_A_SU_INFO_0, DCM); 1175 he_dcm = value; 1176 value = value << QDF_MON_STATUS_DCM_SHIFT; 1177 ppdu_info->rx_status.he_data3 |= value; 1178 value = HAL_RX_GET(he_sig_a_su_info, 1179 HE_SIG_A_SU_INFO_1, CODING); 1180 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ? 1181 1 : 0; 1182 value = value << QDF_MON_STATUS_CODING_SHIFT; 1183 ppdu_info->rx_status.he_data3 |= value; 1184 value = HAL_RX_GET(he_sig_a_su_info, 1185 HE_SIG_A_SU_INFO_1, 1186 LDPC_EXTRA_SYMBOL); 1187 value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT; 1188 ppdu_info->rx_status.he_data3 |= value; 1189 value = HAL_RX_GET(he_sig_a_su_info, 1190 HE_SIG_A_SU_INFO_1, STBC); 1191 he_stbc = value; 1192 value = value << QDF_MON_STATUS_STBC_SHIFT; 1193 ppdu_info->rx_status.he_data3 |= value; 1194 1195 /* data4 */ 1196 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, 1197 SPATIAL_REUSE); 1198 ppdu_info->rx_status.he_data4 = value; 1199 1200 /* data5 */ 1201 value = HAL_RX_GET(he_sig_a_su_info, 1202 HE_SIG_A_SU_INFO_0, TRANSMIT_BW); 1203 ppdu_info->rx_status.he_data5 = value; 1204 ppdu_info->rx_status.bw = value; 1205 value = HAL_RX_GET(he_sig_a_su_info, 1206 HE_SIG_A_SU_INFO_0, CP_LTF_SIZE); 1207 switch (value) { 1208 case 0: 1209 he_gi = HE_GI_0_8; 1210 he_ltf = HE_LTF_1_X; 1211 break; 1212 case 1: 1213 he_gi = HE_GI_0_8; 1214 he_ltf = HE_LTF_2_X; 1215 break; 1216 case 2: 1217 he_gi = HE_GI_1_6; 1218 he_ltf = HE_LTF_2_X; 1219 break; 1220 case 3: 1221 if (he_dcm && he_stbc) { 1222 he_gi = HE_GI_0_8; 1223 he_ltf = HE_LTF_4_X; 1224 } else { 1225 he_gi = HE_GI_3_2; 1226 he_ltf = HE_LTF_4_X; 1227 } 1228 break; 1229 } 1230 ppdu_info->rx_status.sgi = he_gi; 1231 ppdu_info->rx_status.ltf_size = he_ltf; 1232 hal_get_radiotap_he_gi_ltf(&he_gi, &he_ltf); 1233 value = he_gi << QDF_MON_STATUS_GI_SHIFT; 1234 ppdu_info->rx_status.he_data5 |= value; 1235 value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT; 1236 ppdu_info->rx_status.he_data5 |= value; 1237 1238 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS); 1239 value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT); 1240 ppdu_info->rx_status.he_data5 |= value; 1241 1242 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, 1243 PACKET_EXTENSION_A_FACTOR); 1244 value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT; 1245 ppdu_info->rx_status.he_data5 |= value; 1246 1247 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, TXBF); 1248 value = value << QDF_MON_STATUS_TXBF_SHIFT; 1249 ppdu_info->rx_status.he_data5 |= value; 1250 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, 1251 PACKET_EXTENSION_PE_DISAMBIGUITY); 1252 value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT; 1253 ppdu_info->rx_status.he_data5 |= value; 1254 1255 /* data6 */ 1256 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS); 1257 value++; 1258 ppdu_info->rx_status.nss = value; 1259 ppdu_info->rx_status.he_data6 = value; 1260 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, 1261 DOPPLER_INDICATION); 1262 value = value << QDF_MON_STATUS_DOPPLER_SHIFT; 1263 ppdu_info->rx_status.he_data6 |= value; 1264 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, 1265 TXOP_DURATION); 1266 value = value << QDF_MON_STATUS_TXOP_SHIFT; 1267 ppdu_info->rx_status.he_data6 |= value; 1268 1269 ppdu_info->rx_status.beamformed = HAL_RX_GET(he_sig_a_su_info, 1270 HE_SIG_A_SU_INFO_1, TXBF); 1271 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 1272 hal_rx_get_crc_he_sig_a_su_info(ppdu_info, he_sig_a_su_info); 1273 break; 1274 } 1275 case WIFIPHYRX_HE_SIG_A_MU_DL_E: 1276 { 1277 uint8_t *he_sig_a_mu_dl_info = (uint8_t *)rx_tlv + 1278 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_MU_DL_0, 1279 HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS); 1280 1281 ppdu_info->rx_status.he_mu_flags = 1; 1282 1283 /* HE Flags */ 1284 /*data1*/ 1285 ppdu_info->rx_status.he_data1 = 1286 QDF_MON_STATUS_HE_MU_FORMAT_TYPE; 1287 ppdu_info->rx_status.he_data1 |= 1288 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN | 1289 QDF_MON_STATUS_HE_DL_UL_KNOWN | 1290 QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN | 1291 QDF_MON_STATUS_HE_STBC_KNOWN | 1292 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN | 1293 QDF_MON_STATUS_HE_DOPPLER_KNOWN; 1294 1295 /* data2 */ 1296 ppdu_info->rx_status.he_data2 = 1297 QDF_MON_STATUS_HE_GI_KNOWN; 1298 ppdu_info->rx_status.he_data2 |= 1299 QDF_MON_STATUS_LTF_SYMBOLS_KNOWN | 1300 QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN | 1301 QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN | 1302 QDF_MON_STATUS_TXOP_KNOWN | 1303 QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN; 1304 1305 /*data3*/ 1306 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1307 HE_SIG_A_MU_DL_INFO_0, BSS_COLOR_ID); 1308 ppdu_info->rx_status.he_data3 = value; 1309 1310 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1311 HE_SIG_A_MU_DL_INFO_0, DL_UL_FLAG); 1312 value = value << QDF_MON_STATUS_DL_UL_SHIFT; 1313 ppdu_info->rx_status.he_data3 |= value; 1314 1315 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1316 HE_SIG_A_MU_DL_INFO_1, 1317 LDPC_EXTRA_SYMBOL); 1318 value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT; 1319 ppdu_info->rx_status.he_data3 |= value; 1320 1321 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1322 HE_SIG_A_MU_DL_INFO_1, STBC); 1323 he_stbc = value; 1324 value = value << QDF_MON_STATUS_STBC_SHIFT; 1325 ppdu_info->rx_status.he_data3 |= value; 1326 1327 /*data4*/ 1328 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0, 1329 SPATIAL_REUSE); 1330 ppdu_info->rx_status.he_data4 = value; 1331 1332 /*data5*/ 1333 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1334 HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW); 1335 ppdu_info->rx_status.he_data5 = value; 1336 ppdu_info->rx_status.bw = value; 1337 1338 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1339 HE_SIG_A_MU_DL_INFO_0, CP_LTF_SIZE); 1340 switch (value) { 1341 case 0: 1342 he_gi = HE_GI_0_8; 1343 he_ltf = HE_LTF_4_X; 1344 break; 1345 case 1: 1346 he_gi = HE_GI_0_8; 1347 he_ltf = HE_LTF_2_X; 1348 break; 1349 case 2: 1350 he_gi = HE_GI_1_6; 1351 he_ltf = HE_LTF_2_X; 1352 break; 1353 case 3: 1354 he_gi = HE_GI_3_2; 1355 he_ltf = HE_LTF_4_X; 1356 break; 1357 } 1358 ppdu_info->rx_status.sgi = he_gi; 1359 ppdu_info->rx_status.ltf_size = he_ltf; 1360 hal_get_radiotap_he_gi_ltf(&he_gi, &he_ltf); 1361 value = he_gi << QDF_MON_STATUS_GI_SHIFT; 1362 ppdu_info->rx_status.he_data5 |= value; 1363 1364 value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT; 1365 ppdu_info->rx_status.he_data5 |= value; 1366 1367 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1368 HE_SIG_A_MU_DL_INFO_1, NUM_LTF_SYMBOLS); 1369 value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT); 1370 ppdu_info->rx_status.he_data5 |= value; 1371 1372 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, 1373 PACKET_EXTENSION_A_FACTOR); 1374 value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT; 1375 ppdu_info->rx_status.he_data5 |= value; 1376 1377 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, 1378 PACKET_EXTENSION_PE_DISAMBIGUITY); 1379 value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT; 1380 ppdu_info->rx_status.he_data5 |= value; 1381 1382 /*data6*/ 1383 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0, 1384 DOPPLER_INDICATION); 1385 value = value << QDF_MON_STATUS_DOPPLER_SHIFT; 1386 ppdu_info->rx_status.he_data6 |= value; 1387 1388 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, 1389 TXOP_DURATION); 1390 value = value << QDF_MON_STATUS_TXOP_SHIFT; 1391 ppdu_info->rx_status.he_data6 |= value; 1392 1393 /* HE-MU Flags */ 1394 /* HE-MU-flags1 */ 1395 ppdu_info->rx_status.he_flags1 = 1396 QDF_MON_STATUS_SIG_B_MCS_KNOWN | 1397 QDF_MON_STATUS_SIG_B_DCM_KNOWN | 1398 QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN | 1399 QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN | 1400 QDF_MON_STATUS_RU_0_KNOWN; 1401 1402 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1403 HE_SIG_A_MU_DL_INFO_0, MCS_OF_SIG_B); 1404 ppdu_info->rx_status.he_flags1 |= value; 1405 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1406 HE_SIG_A_MU_DL_INFO_0, DCM_OF_SIG_B); 1407 value = value << QDF_MON_STATUS_DCM_FLAG_1_SHIFT; 1408 ppdu_info->rx_status.he_flags1 |= value; 1409 1410 /* HE-MU-flags2 */ 1411 ppdu_info->rx_status.he_flags2 = 1412 QDF_MON_STATUS_BW_KNOWN; 1413 1414 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1415 HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW); 1416 ppdu_info->rx_status.he_flags2 |= value; 1417 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1418 HE_SIG_A_MU_DL_INFO_0, COMP_MODE_SIG_B); 1419 value = value << QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT; 1420 ppdu_info->rx_status.he_flags2 |= value; 1421 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1422 HE_SIG_A_MU_DL_INFO_0, NUM_SIG_B_SYMBOLS); 1423 value = value - 1; 1424 value = value << QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT; 1425 ppdu_info->rx_status.he_flags2 |= value; 1426 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO; 1427 hal_rx_get_crc_he_sig_a_mu_dl_info(ppdu_info, 1428 he_sig_a_mu_dl_info); 1429 break; 1430 } 1431 case WIFIPHYRX_HE_SIG_B1_MU_E: 1432 { 1433 uint8_t *he_sig_b1_mu_info = (uint8_t *)rx_tlv + 1434 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B1_MU_0, 1435 HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS); 1436 1437 ppdu_info->rx_status.he_sig_b_common_known |= 1438 QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU0; 1439 /* TODO: Check on the availability of other fields in 1440 * sig_b_common 1441 */ 1442 1443 value = HAL_RX_GET(he_sig_b1_mu_info, 1444 HE_SIG_B1_MU_INFO_0, RU_ALLOCATION); 1445 ppdu_info->rx_status.he_RU[0] = value; 1446 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO; 1447 break; 1448 } 1449 case WIFIPHYRX_HE_SIG_B2_MU_E: 1450 { 1451 uint8_t *he_sig_b2_mu_info = (uint8_t *)rx_tlv + 1452 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_MU_0, 1453 HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS); 1454 /* 1455 * Not all "HE" fields can be updated from 1456 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E 1457 * to populate rest of the "HE" fields for MU scenarios. 1458 */ 1459 1460 /* HE-data1 */ 1461 ppdu_info->rx_status.he_data1 |= 1462 QDF_MON_STATUS_HE_MCS_KNOWN | 1463 QDF_MON_STATUS_HE_CODING_KNOWN; 1464 1465 /* HE-data2 */ 1466 1467 /* HE-data3 */ 1468 value = HAL_RX_GET(he_sig_b2_mu_info, 1469 HE_SIG_B2_MU_INFO_0, STA_MCS); 1470 ppdu_info->rx_status.mcs = value; 1471 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT; 1472 ppdu_info->rx_status.he_data3 |= value; 1473 1474 value = HAL_RX_GET(he_sig_b2_mu_info, 1475 HE_SIG_B2_MU_INFO_0, STA_CODING); 1476 value = value << QDF_MON_STATUS_CODING_SHIFT; 1477 ppdu_info->rx_status.he_data3 |= value; 1478 1479 /* HE-data4 */ 1480 value = HAL_RX_GET(he_sig_b2_mu_info, 1481 HE_SIG_B2_MU_INFO_0, STA_ID); 1482 value = value << QDF_MON_STATUS_STA_ID_SHIFT; 1483 ppdu_info->rx_status.he_data4 |= value; 1484 1485 /* HE-data5 */ 1486 1487 /* HE-data6 */ 1488 value = HAL_RX_GET(he_sig_b2_mu_info, 1489 HE_SIG_B2_MU_INFO_0, NSTS); 1490 /* value n indicates n+1 spatial streams */ 1491 value++; 1492 ppdu_info->rx_status.nss = value; 1493 ppdu_info->rx_status.he_data6 |= value; 1494 1495 break; 1496 } 1497 case WIFIPHYRX_HE_SIG_B2_OFDMA_E: 1498 { 1499 uint8_t *he_sig_b2_ofdma_info = 1500 (uint8_t *)rx_tlv + 1501 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0, 1502 HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS); 1503 1504 /* 1505 * Not all "HE" fields can be updated from 1506 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E 1507 * to populate rest of "HE" fields for MU OFDMA scenarios. 1508 */ 1509 1510 /* HE-data1 */ 1511 ppdu_info->rx_status.he_data1 |= 1512 QDF_MON_STATUS_HE_MCS_KNOWN | 1513 QDF_MON_STATUS_HE_DCM_KNOWN | 1514 QDF_MON_STATUS_HE_CODING_KNOWN; 1515 1516 /* HE-data2 */ 1517 ppdu_info->rx_status.he_data2 |= 1518 QDF_MON_STATUS_TXBF_KNOWN; 1519 1520 /* HE-data3 */ 1521 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1522 HE_SIG_B2_OFDMA_INFO_0, STA_MCS); 1523 ppdu_info->rx_status.mcs = value; 1524 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT; 1525 ppdu_info->rx_status.he_data3 |= value; 1526 1527 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1528 HE_SIG_B2_OFDMA_INFO_0, STA_DCM); 1529 he_dcm = value; 1530 value = value << QDF_MON_STATUS_DCM_SHIFT; 1531 ppdu_info->rx_status.he_data3 |= value; 1532 1533 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1534 HE_SIG_B2_OFDMA_INFO_0, STA_CODING); 1535 value = value << QDF_MON_STATUS_CODING_SHIFT; 1536 ppdu_info->rx_status.he_data3 |= value; 1537 1538 /* HE-data4 */ 1539 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1540 HE_SIG_B2_OFDMA_INFO_0, STA_ID); 1541 value = value << QDF_MON_STATUS_STA_ID_SHIFT; 1542 ppdu_info->rx_status.he_data4 |= value; 1543 1544 /* HE-data5 */ 1545 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1546 HE_SIG_B2_OFDMA_INFO_0, TXBF); 1547 value = value << QDF_MON_STATUS_TXBF_SHIFT; 1548 ppdu_info->rx_status.he_data5 |= value; 1549 1550 /* HE-data6 */ 1551 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1552 HE_SIG_B2_OFDMA_INFO_0, NSTS); 1553 /* value n indicates n+1 spatial streams */ 1554 value++; 1555 ppdu_info->rx_status.nss = value; 1556 ppdu_info->rx_status.he_data6 |= value; 1557 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA; 1558 break; 1559 } 1560 case WIFIPHYRX_RSSI_LEGACY_E: 1561 { 1562 uint8_t reception_type; 1563 int8_t rssi_value; 1564 uint8_t *rssi_info_tlv = (uint8_t *)rx_tlv + 1565 HAL_RX_OFFSET(UNIFIED_PHYRX_RSSI_LEGACY_19, 1566 RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS); 1567 1568 ppdu_info->rx_status.rssi_comb = 1569 hal_rx_phy_legacy_get_rssi(hal_soc_hdl, rx_tlv); 1570 ppdu_info->rx_status.bw = hal->ops->hal_rx_get_tlv(rx_tlv); 1571 ppdu_info->rx_status.he_re = 0; 1572 1573 reception_type = HAL_RX_GET(rx_tlv, 1574 PHYRX_RSSI_LEGACY_0, 1575 RECEPTION_TYPE); 1576 switch (reception_type) { 1577 case QDF_RECEPTION_TYPE_ULOFMDA: 1578 ppdu_info->rx_status.reception_type = 1579 HAL_RX_TYPE_MU_OFDMA; 1580 ppdu_info->rx_status.ulofdma_flag = 1; 1581 ppdu_info->rx_status.he_data1 = 1582 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE; 1583 break; 1584 case QDF_RECEPTION_TYPE_ULMIMO: 1585 ppdu_info->rx_status.reception_type = 1586 HAL_RX_TYPE_MU_MIMO; 1587 ppdu_info->rx_status.he_data1 = 1588 QDF_MON_STATUS_HE_MU_FORMAT_TYPE; 1589 break; 1590 default: 1591 ppdu_info->rx_status.reception_type = 1592 HAL_RX_TYPE_SU; 1593 break; 1594 } 1595 hal_rx_update_rssi_chain(ppdu_info, rssi_info_tlv); 1596 rssi_value = HAL_RX_GET(rssi_info_tlv, 1597 RECEIVE_RSSI_INFO_0, RSSI_PRI20_CHAIN0); 1598 ppdu_info->rx_status.rssi[0] = rssi_value; 1599 dp_nofl_debug("RSSI_PRI20_CHAIN0: %d\n", rssi_value); 1600 1601 rssi_value = HAL_RX_GET(rssi_info_tlv, 1602 RECEIVE_RSSI_INFO_2, RSSI_PRI20_CHAIN1); 1603 ppdu_info->rx_status.rssi[1] = rssi_value; 1604 dp_nofl_debug("RSSI_PRI20_CHAIN1: %d\n", rssi_value); 1605 1606 rssi_value = HAL_RX_GET(rssi_info_tlv, 1607 RECEIVE_RSSI_INFO_4, RSSI_PRI20_CHAIN2); 1608 ppdu_info->rx_status.rssi[2] = rssi_value; 1609 dp_nofl_debug("RSSI_PRI20_CHAIN2: %d\n", rssi_value); 1610 1611 rssi_value = HAL_RX_GET(rssi_info_tlv, 1612 RECEIVE_RSSI_INFO_6, RSSI_PRI20_CHAIN3); 1613 ppdu_info->rx_status.rssi[3] = rssi_value; 1614 dp_nofl_debug("RSSI_PRI20_CHAIN3: %d\n", rssi_value); 1615 1616 rssi_value = HAL_RX_GET(rssi_info_tlv, 1617 RECEIVE_RSSI_INFO_8, RSSI_PRI20_CHAIN4); 1618 ppdu_info->rx_status.rssi[4] = rssi_value; 1619 dp_nofl_debug("RSSI_PRI20_CHAIN4: %d\n", rssi_value); 1620 1621 rssi_value = HAL_RX_GET(rssi_info_tlv, 1622 RECEIVE_RSSI_INFO_10, 1623 RSSI_PRI20_CHAIN5); 1624 ppdu_info->rx_status.rssi[5] = rssi_value; 1625 dp_nofl_debug("RSSI_PRI20_CHAIN5: %d\n", rssi_value); 1626 1627 rssi_value = HAL_RX_GET(rssi_info_tlv, 1628 RECEIVE_RSSI_INFO_12, 1629 RSSI_PRI20_CHAIN6); 1630 ppdu_info->rx_status.rssi[6] = rssi_value; 1631 dp_nofl_debug("RSSI_PRI20_CHAIN6: %d\n", rssi_value); 1632 1633 rssi_value = HAL_RX_GET(rssi_info_tlv, 1634 RECEIVE_RSSI_INFO_14, 1635 RSSI_PRI20_CHAIN7); 1636 ppdu_info->rx_status.rssi[7] = rssi_value; 1637 dp_nofl_debug("RSSI_PRI20_CHAIN7: %d\n", rssi_value); 1638 break; 1639 } 1640 case WIFIPHYRX_OTHER_RECEIVE_INFO_E: 1641 hal_rx_proc_phyrx_other_receive_info_tlv(hal, rx_tlv_hdr, 1642 ppdu_info); 1643 break; 1644 case WIFIRX_HEADER_E: 1645 { 1646 struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info; 1647 1648 if (ppdu_info->fcs_ok_cnt >= 1649 HAL_RX_MAX_MPDU_H_PER_STATUS_BUFFER) { 1650 hal_err("Number of MPDUs(%d) per status buff exceeded", 1651 ppdu_info->fcs_ok_cnt); 1652 break; 1653 } 1654 1655 /* Update first_msdu_payload for every mpdu and increment 1656 * com_info->mpdu_cnt for every WIFIRX_HEADER_E TLV 1657 */ 1658 ppdu_info->ppdu_msdu_info[ppdu_info->fcs_ok_cnt].first_msdu_payload = 1659 rx_tlv; 1660 ppdu_info->ppdu_msdu_info[ppdu_info->fcs_ok_cnt].payload_len = tlv_len; 1661 ppdu_info->msdu_info.first_msdu_payload = rx_tlv; 1662 ppdu_info->msdu_info.payload_len = tlv_len; 1663 ppdu_info->user_id = user_id; 1664 ppdu_info->hdr_len = tlv_len; 1665 ppdu_info->data = rx_tlv; 1666 ppdu_info->data += 4; 1667 1668 /* for every RX_HEADER TLV increment mpdu_cnt */ 1669 com_info->mpdu_cnt++; 1670 return HAL_TLV_STATUS_HEADER; 1671 } 1672 case WIFIRX_MPDU_START_E: 1673 { 1674 uint8_t *rx_mpdu_start = (uint8_t *)rx_tlv; 1675 uint32_t ppdu_id = HAL_RX_GET_PPDU_ID(rx_mpdu_start); 1676 uint8_t filter_category = 0; 1677 1678 hal_update_frame_type_cnt(rx_mpdu_start, ppdu_info); 1679 1680 ppdu_info->nac_info.fc_valid = 1681 HAL_RX_GET_FC_VALID(rx_mpdu_start); 1682 1683 ppdu_info->nac_info.to_ds_flag = 1684 HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start); 1685 1686 ppdu_info->nac_info.frame_control = 1687 HAL_RX_GET(rx_mpdu_start, 1688 RX_MPDU_INFO_14, 1689 MPDU_FRAME_CONTROL_FIELD); 1690 1691 ppdu_info->sw_frame_group_id = 1692 HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start); 1693 1694 ppdu_info->rx_user_status[user_id].sw_peer_id = 1695 HAL_RX_GET_SW_PEER_ID(rx_mpdu_start); 1696 1697 hal_update_rx_ctrl_frame_stats(ppdu_info, user_id); 1698 1699 if (ppdu_info->sw_frame_group_id == 1700 HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) { 1701 ppdu_info->rx_status.frame_control_info_valid = 1702 ppdu_info->nac_info.fc_valid; 1703 ppdu_info->rx_status.frame_control = 1704 ppdu_info->nac_info.frame_control; 1705 } 1706 1707 hal_get_mac_addr1(rx_mpdu_start, 1708 ppdu_info); 1709 1710 ppdu_info->nac_info.mac_addr2_valid = 1711 HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start); 1712 1713 *(uint16_t *)&ppdu_info->nac_info.mac_addr2[0] = 1714 HAL_RX_GET(rx_mpdu_start, 1715 RX_MPDU_INFO_16, 1716 MAC_ADDR_AD2_15_0); 1717 1718 *(uint32_t *)&ppdu_info->nac_info.mac_addr2[2] = 1719 HAL_RX_GET(rx_mpdu_start, 1720 RX_MPDU_INFO_17, 1721 MAC_ADDR_AD2_47_16); 1722 1723 if (ppdu_info->rx_status.prev_ppdu_id != ppdu_id) { 1724 ppdu_info->rx_status.prev_ppdu_id = ppdu_id; 1725 ppdu_info->rx_status.ppdu_len = 1726 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13, 1727 MPDU_LENGTH); 1728 } else { 1729 ppdu_info->rx_status.ppdu_len += 1730 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13, 1731 MPDU_LENGTH); 1732 } 1733 1734 filter_category = 1735 HAL_RX_GET_FILTER_CATEGORY(rx_mpdu_start); 1736 1737 if (filter_category == 0) 1738 ppdu_info->rx_status.rxpcu_filter_pass = 1; 1739 else if (filter_category == 1) 1740 ppdu_info->rx_status.monitor_direct_used = 1; 1741 1742 ppdu_info->nac_info.mcast_bcast = 1743 HAL_RX_GET(rx_mpdu_start, 1744 RX_MPDU_INFO_13, 1745 MCAST_BCAST); 1746 break; 1747 } 1748 case WIFIRX_MPDU_END_E: 1749 ppdu_info->user_id = user_id; 1750 ppdu_info->fcs_err = 1751 HAL_RX_GET(rx_tlv, RX_MPDU_END_1, 1752 FCS_ERR); 1753 return HAL_TLV_STATUS_MPDU_END; 1754 case WIFIRX_MSDU_END_E: 1755 if (user_id < HAL_MAX_UL_MU_USERS) { 1756 ppdu_info->rx_msdu_info[user_id].cce_metadata = 1757 HAL_RX_MSDU_END_CCE_METADATA_GET(rx_tlv); 1758 ppdu_info->rx_msdu_info[user_id].fse_metadata = 1759 HAL_RX_MSDU_END_FSE_METADATA_GET(rx_tlv); 1760 ppdu_info->rx_msdu_info[user_id].is_flow_idx_timeout = 1761 HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(rx_tlv); 1762 ppdu_info->rx_msdu_info[user_id].is_flow_idx_invalid = 1763 HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(rx_tlv); 1764 ppdu_info->rx_msdu_info[user_id].flow_idx = 1765 HAL_RX_MSDU_END_FLOW_IDX_GET(rx_tlv); 1766 } 1767 return HAL_TLV_STATUS_MSDU_END; 1768 case 0: 1769 return HAL_TLV_STATUS_PPDU_DONE; 1770 1771 default: 1772 if (hal_rx_handle_other_tlvs(tlv_tag, rx_tlv, ppdu_info)) 1773 unhandled = false; 1774 else 1775 unhandled = true; 1776 break; 1777 } 1778 1779 if (!unhandled) 1780 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1781 "%s TLV type: %d, TLV len:%d %s", 1782 __func__, tlv_tag, tlv_len, 1783 unhandled == true ? "unhandled" : ""); 1784 1785 return HAL_TLV_STATUS_PPDU_NOT_DONE; 1786 } 1787 1788 /** 1789 * hal_tx_comp_get_release_reason_generic_li() - TQM Release reason 1790 * @hal_desc: completion ring descriptor pointer 1791 * 1792 * This function will return the type of pointer - buffer or descriptor 1793 * 1794 * Return: buffer type 1795 */ hal_tx_comp_get_release_reason_generic_li(void * hal_desc)1796 static inline uint8_t hal_tx_comp_get_release_reason_generic_li(void *hal_desc) 1797 { 1798 uint32_t comp_desc = 1799 *(uint32_t *)(((uint8_t *)hal_desc) + 1800 WBM_RELEASE_RING_2_TQM_RELEASE_REASON_OFFSET); 1801 1802 return (comp_desc & WBM_RELEASE_RING_2_TQM_RELEASE_REASON_MASK) >> 1803 WBM_RELEASE_RING_2_TQM_RELEASE_REASON_LSB; 1804 } 1805 1806 /** 1807 * hal_get_wbm_internal_error_generic_li() - is WBM internal error 1808 * @hal_desc: completion ring descriptor pointer 1809 * 1810 * This function will return 0 or 1 - is it WBM internal error or not 1811 * 1812 * Return: uint8_t 1813 */ hal_get_wbm_internal_error_generic_li(void * hal_desc)1814 static inline uint8_t hal_get_wbm_internal_error_generic_li(void *hal_desc) 1815 { 1816 uint32_t comp_desc = 1817 *(uint32_t *)(((uint8_t *)hal_desc) + 1818 HAL_WBM_INTERNAL_ERROR_OFFSET); 1819 1820 return (comp_desc & HAL_WBM_INTERNAL_ERROR_MASK) >> 1821 HAL_WBM_INTERNAL_ERROR_LSB; 1822 } 1823 1824 /** 1825 * hal_rx_dump_rx_attention_tlv_generic_li() - dump RX attention TLV in 1826 * structured humman readable 1827 * format. 1828 * @pkttlvs: pointer the pkt tlv struct. 1829 * @dbg_level: log level. 1830 * 1831 * Return: void 1832 */ 1833 static inline hal_rx_dump_rx_attention_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)1834 void hal_rx_dump_rx_attention_tlv_generic_li(void *pkttlvs, 1835 uint8_t dbg_level) 1836 { 1837 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs; 1838 struct rx_attention *rx_attn = &pkt_tlvs->attn_tlv.rx_attn; 1839 1840 hal_verbose_debug("rx_attention tlv (1/2) - " 1841 "rxpcu_mpdu_filter_in_category: %x " 1842 "sw_frame_group_id: %x " 1843 "reserved_0: %x " 1844 "phy_ppdu_id: %x " 1845 "first_mpdu : %x " 1846 "reserved_1a: %x " 1847 "mcast_bcast: %x " 1848 "ast_index_not_found: %x " 1849 "ast_index_timeout: %x " 1850 "power_mgmt: %x " 1851 "non_qos: %x " 1852 "null_data: %x " 1853 "mgmt_type: %x " 1854 "ctrl_type: %x " 1855 "more_data: %x " 1856 "eosp: %x " 1857 "a_msdu_error: %x " 1858 "fragment_flag: %x " 1859 "order: %x " 1860 "cce_match: %x " 1861 "overflow_err: %x " 1862 "msdu_length_err: %x " 1863 "tcp_udp_chksum_fail: %x " 1864 "ip_chksum_fail: %x " 1865 "sa_idx_invalid: %x " 1866 "da_idx_invalid: %x " 1867 "reserved_1b: %x " 1868 "rx_in_tx_decrypt_byp: %x ", 1869 rx_attn->rxpcu_mpdu_filter_in_category, 1870 rx_attn->sw_frame_group_id, 1871 rx_attn->reserved_0, 1872 rx_attn->phy_ppdu_id, 1873 rx_attn->first_mpdu, 1874 rx_attn->reserved_1a, 1875 rx_attn->mcast_bcast, 1876 rx_attn->ast_index_not_found, 1877 rx_attn->ast_index_timeout, 1878 rx_attn->power_mgmt, 1879 rx_attn->non_qos, 1880 rx_attn->null_data, 1881 rx_attn->mgmt_type, 1882 rx_attn->ctrl_type, 1883 rx_attn->more_data, 1884 rx_attn->eosp, 1885 rx_attn->a_msdu_error, 1886 rx_attn->fragment_flag, 1887 rx_attn->order, 1888 rx_attn->cce_match, 1889 rx_attn->overflow_err, 1890 rx_attn->msdu_length_err, 1891 rx_attn->tcp_udp_chksum_fail, 1892 rx_attn->ip_chksum_fail, 1893 rx_attn->sa_idx_invalid, 1894 rx_attn->da_idx_invalid, 1895 rx_attn->reserved_1b, 1896 rx_attn->rx_in_tx_decrypt_byp); 1897 1898 hal_verbose_debug("rx_attention tlv (2/2) - " 1899 "encrypt_required: %x " 1900 "directed: %x " 1901 "buffer_fragment: %x " 1902 "mpdu_length_err: %x " 1903 "tkip_mic_err: %x " 1904 "decrypt_err: %x " 1905 "unencrypted_frame_err: %x " 1906 "fcs_err: %x " 1907 "flow_idx_timeout: %x " 1908 "flow_idx_invalid: %x " 1909 "wifi_parser_error: %x " 1910 "amsdu_parser_error: %x " 1911 "sa_idx_timeout: %x " 1912 "da_idx_timeout: %x " 1913 "msdu_limit_error: %x " 1914 "da_is_valid: %x " 1915 "da_is_mcbc: %x " 1916 "sa_is_valid: %x " 1917 "decrypt_status_code: %x " 1918 "rx_bitmap_not_updated: %x " 1919 "reserved_2: %x " 1920 "msdu_done: %x ", 1921 rx_attn->encrypt_required, 1922 rx_attn->directed, 1923 rx_attn->buffer_fragment, 1924 rx_attn->mpdu_length_err, 1925 rx_attn->tkip_mic_err, 1926 rx_attn->decrypt_err, 1927 rx_attn->unencrypted_frame_err, 1928 rx_attn->fcs_err, 1929 rx_attn->flow_idx_timeout, 1930 rx_attn->flow_idx_invalid, 1931 rx_attn->wifi_parser_error, 1932 rx_attn->amsdu_parser_error, 1933 rx_attn->sa_idx_timeout, 1934 rx_attn->da_idx_timeout, 1935 rx_attn->msdu_limit_error, 1936 rx_attn->da_is_valid, 1937 rx_attn->da_is_mcbc, 1938 rx_attn->sa_is_valid, 1939 rx_attn->decrypt_status_code, 1940 rx_attn->rx_bitmap_not_updated, 1941 rx_attn->reserved_2, 1942 rx_attn->msdu_done); 1943 } 1944 1945 /** 1946 * hal_rx_dump_mpdu_end_tlv_generic_li() - dump RX mpdu_end TLV in structured 1947 * human readable format. 1948 * @pkttlvs: pointer the pkt tlv struct. 1949 * @dbg_level: log level. 1950 * 1951 * Return: void 1952 */ 1953 static inline hal_rx_dump_mpdu_end_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)1954 void hal_rx_dump_mpdu_end_tlv_generic_li(void *pkttlvs, 1955 uint8_t dbg_level) 1956 { 1957 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs; 1958 struct rx_mpdu_end *mpdu_end = &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end; 1959 1960 hal_verbose_debug("rx_mpdu_end tlv - " 1961 "rxpcu_mpdu_filter_in_category: %x " 1962 "sw_frame_group_id: %x " 1963 "phy_ppdu_id: %x " 1964 "unsup_ktype_short_frame: %x " 1965 "rx_in_tx_decrypt_byp: %x " 1966 "overflow_err: %x " 1967 "mpdu_length_err: %x " 1968 "tkip_mic_err: %x " 1969 "decrypt_err: %x " 1970 "unencrypted_frame_err: %x " 1971 "pn_fields_contain_valid_info: %x " 1972 "fcs_err: %x " 1973 "msdu_length_err: %x " 1974 "rxdma0_destination_ring: %x " 1975 "rxdma1_destination_ring: %x " 1976 "decrypt_status_code: %x " 1977 "rx_bitmap_not_updated: %x ", 1978 mpdu_end->rxpcu_mpdu_filter_in_category, 1979 mpdu_end->sw_frame_group_id, 1980 mpdu_end->phy_ppdu_id, 1981 mpdu_end->unsup_ktype_short_frame, 1982 mpdu_end->rx_in_tx_decrypt_byp, 1983 mpdu_end->overflow_err, 1984 mpdu_end->mpdu_length_err, 1985 mpdu_end->tkip_mic_err, 1986 mpdu_end->decrypt_err, 1987 mpdu_end->unencrypted_frame_err, 1988 mpdu_end->pn_fields_contain_valid_info, 1989 mpdu_end->fcs_err, 1990 mpdu_end->msdu_length_err, 1991 mpdu_end->rxdma0_destination_ring, 1992 mpdu_end->rxdma1_destination_ring, 1993 mpdu_end->decrypt_status_code, 1994 mpdu_end->rx_bitmap_not_updated); 1995 } 1996 1997 #ifdef NO_RX_PKT_HDR_TLV 1998 static inline hal_rx_dump_pkt_hdr_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)1999 void hal_rx_dump_pkt_hdr_tlv_generic_li(void *pkttlvs, 2000 uint8_t dbg_level) 2001 { 2002 } 2003 #else 2004 /** 2005 * hal_rx_dump_pkt_hdr_tlv_generic_li() - dump RX pkt header TLV in hex format 2006 * @pkttlvs: pointer the pkt tlv struct. 2007 * @dbg_level: log level. 2008 * 2009 * Return: void 2010 */ 2011 static inline hal_rx_dump_pkt_hdr_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)2012 void hal_rx_dump_pkt_hdr_tlv_generic_li(void *pkttlvs, 2013 uint8_t dbg_level) 2014 { 2015 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs; 2016 struct rx_pkt_hdr_tlv *pkt_hdr_tlv = &pkt_tlvs->pkt_hdr_tlv; 2017 2018 hal_verbose_debug("\n---------------\nrx_pkt_hdr_tlv" 2019 "\n---------------\nphy_ppdu_id %d ", 2020 pkt_hdr_tlv->phy_ppdu_id); 2021 hal_verbose_hex_dump(pkt_hdr_tlv->rx_pkt_hdr, 128); 2022 } 2023 #endif 2024 2025 /** 2026 * hal_rx_tlv_decrypt_err_get_li() - API to get the Decrypt ERR 2027 * from rx_mpdu_end TLV 2028 * 2029 * @buf: pointer to the start of RX PKT TLV headers 2030 * Return: uint32_t(decrypt_err) 2031 */ 2032 static inline uint32_t hal_rx_tlv_decrypt_err_get_li(uint8_t * buf)2033 hal_rx_tlv_decrypt_err_get_li(uint8_t *buf) 2034 { 2035 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2036 struct rx_mpdu_end *mpdu_end = 2037 &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end; 2038 uint32_t decrypt_err; 2039 2040 decrypt_err = HAL_RX_MPDU_END_DECRYPT_ERR_GET(mpdu_end); 2041 2042 return decrypt_err; 2043 } 2044 2045 /** 2046 * hal_rx_tlv_mic_err_get_li() - API to get the MIC ERR 2047 * from rx_mpdu_end TLV 2048 * 2049 * @buf: pointer to the start of RX PKT TLV headers 2050 * Return: uint32_t(mic_err) 2051 */ 2052 static inline uint32_t hal_rx_tlv_mic_err_get_li(uint8_t * buf)2053 hal_rx_tlv_mic_err_get_li(uint8_t *buf) 2054 { 2055 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2056 struct rx_mpdu_end *mpdu_end = 2057 &pkt_tlvs->mpdu_end_tlv.rx_mpdu_end; 2058 uint32_t mic_err; 2059 2060 mic_err = HAL_RX_MPDU_END_MIC_ERR_GET(mpdu_end); 2061 2062 return mic_err; 2063 } 2064 2065 static hal_rx_tlv_get_pkt_capture_flags_li(uint8_t * rx_tlv_pkt_hdr,struct hal_rx_pkt_capture_flags * flags)2066 void hal_rx_tlv_get_pkt_capture_flags_li(uint8_t *rx_tlv_pkt_hdr, 2067 struct hal_rx_pkt_capture_flags *flags) 2068 { 2069 struct rx_pkt_tlvs *rx_tlv_hdr = (struct rx_pkt_tlvs *)rx_tlv_pkt_hdr; 2070 struct rx_attention *rx_attn = &rx_tlv_hdr->attn_tlv.rx_attn; 2071 struct rx_mpdu_start *mpdu_start = 2072 &rx_tlv_hdr->mpdu_start_tlv.rx_mpdu_start; 2073 struct rx_mpdu_end *mpdu_end = &rx_tlv_hdr->mpdu_end_tlv.rx_mpdu_end; 2074 struct rx_msdu_start *msdu_start = 2075 &rx_tlv_hdr->msdu_start_tlv.rx_msdu_start; 2076 2077 flags->encrypt_type = mpdu_start->rx_mpdu_info_details.encrypt_type; 2078 flags->fcs_err = mpdu_end->fcs_err; 2079 flags->fragment_flag = rx_attn->fragment_flag; 2080 flags->chan_freq = HAL_RX_MSDU_START_FREQ_GET(msdu_start); 2081 flags->rssi_comb = HAL_RX_MSDU_START_RSSI_GET(msdu_start); 2082 flags->tsft = msdu_start->ppdu_start_timestamp; 2083 } 2084 2085 static inline bool hal_rx_mpdu_info_ampdu_flag_get_li(uint8_t * buf)2086 hal_rx_mpdu_info_ampdu_flag_get_li(uint8_t *buf) 2087 { 2088 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2089 struct rx_mpdu_start *mpdu_start = 2090 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 2091 2092 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 2093 bool ampdu_flag; 2094 2095 ampdu_flag = HAL_RX_MPDU_INFO_AMPDU_FLAG_GET(mpdu_info); 2096 2097 return ampdu_flag; 2098 } 2099 2100 /** 2101 * hal_rx_tlv_get_pn_num_li() - Get packet number from RX TLV 2102 * @buf: rx tlv address 2103 * @pn_num: buffer to store packet number 2104 * 2105 * Return: None 2106 */ hal_rx_tlv_get_pn_num_li(uint8_t * buf,uint64_t * pn_num)2107 static inline void hal_rx_tlv_get_pn_num_li(uint8_t *buf, uint64_t *pn_num) 2108 { 2109 struct rx_pkt_tlvs *rx_pkt_tlv = 2110 (struct rx_pkt_tlvs *)buf; 2111 struct rx_mpdu_info *rx_mpdu_info_details = 2112 &rx_pkt_tlv->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; 2113 2114 pn_num[0] = rx_mpdu_info_details->pn_31_0; 2115 pn_num[0] |= 2116 ((uint64_t)rx_mpdu_info_details->pn_63_32 << 32); 2117 pn_num[1] = rx_mpdu_info_details->pn_95_64; 2118 pn_num[1] |= 2119 ((uint64_t)rx_mpdu_info_details->pn_127_96 << 32); 2120 } 2121 2122 /** 2123 * hal_rx_dump_mpdu_start_tlv_generic_li() - dump RX mpdu_start TLV in 2124 * structured human readable 2125 * format. 2126 * @pkttlvs: pointer to the pkttlvs. 2127 * @dbg_level: log level. 2128 * 2129 * Return: void 2130 */ 2131 static inline hal_rx_dump_mpdu_start_tlv_generic_li(void * pkttlvs,uint8_t dbg_level)2132 void hal_rx_dump_mpdu_start_tlv_generic_li(void *pkttlvs, 2133 uint8_t dbg_level) 2134 { 2135 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)pkttlvs; 2136 struct rx_mpdu_start *mpdu_start = 2137 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 2138 struct rx_mpdu_info *mpdu_info = 2139 (struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details; 2140 2141 hal_verbose_debug( 2142 "rx_mpdu_start tlv (1/5) - " 2143 "rxpcu_mpdu_filter_in_category: %x " 2144 "sw_frame_group_id: %x " 2145 "ndp_frame: %x " 2146 "phy_err: %x " 2147 "phy_err_during_mpdu_header: %x " 2148 "protocol_version_err: %x " 2149 "ast_based_lookup_valid: %x " 2150 "phy_ppdu_id: %x " 2151 "ast_index: %x " 2152 "sw_peer_id: %x " 2153 "mpdu_frame_control_valid: %x " 2154 "mpdu_duration_valid: %x " 2155 "mac_addr_ad1_valid: %x " 2156 "mac_addr_ad2_valid: %x " 2157 "mac_addr_ad3_valid: %x " 2158 "mac_addr_ad4_valid: %x " 2159 "mpdu_sequence_control_valid: %x " 2160 "mpdu_qos_control_valid: %x " 2161 "mpdu_ht_control_valid: %x " 2162 "frame_encryption_info_valid: %x ", 2163 mpdu_info->rxpcu_mpdu_filter_in_category, 2164 mpdu_info->sw_frame_group_id, 2165 mpdu_info->ndp_frame, 2166 mpdu_info->phy_err, 2167 mpdu_info->phy_err_during_mpdu_header, 2168 mpdu_info->protocol_version_err, 2169 mpdu_info->ast_based_lookup_valid, 2170 mpdu_info->phy_ppdu_id, 2171 mpdu_info->ast_index, 2172 mpdu_info->sw_peer_id, 2173 mpdu_info->mpdu_frame_control_valid, 2174 mpdu_info->mpdu_duration_valid, 2175 mpdu_info->mac_addr_ad1_valid, 2176 mpdu_info->mac_addr_ad2_valid, 2177 mpdu_info->mac_addr_ad3_valid, 2178 mpdu_info->mac_addr_ad4_valid, 2179 mpdu_info->mpdu_sequence_control_valid, 2180 mpdu_info->mpdu_qos_control_valid, 2181 mpdu_info->mpdu_ht_control_valid, 2182 mpdu_info->frame_encryption_info_valid); 2183 2184 hal_verbose_debug( 2185 "rx_mpdu_start tlv (2/5) - " 2186 "fr_ds: %x " 2187 "to_ds: %x " 2188 "encrypted: %x " 2189 "mpdu_retry: %x " 2190 "mpdu_sequence_number: %x " 2191 "epd_en: %x " 2192 "all_frames_shall_be_encrypted: %x " 2193 "encrypt_type: %x " 2194 "mesh_sta: %x " 2195 "bssid_hit: %x " 2196 "bssid_number: %x " 2197 "tid: %x " 2198 "pn_31_0: %x " 2199 "pn_63_32: %x " 2200 "pn_95_64: %x " 2201 "pn_127_96: %x " 2202 "peer_meta_data: %x " 2203 "rxpt_classify_info.reo_destination_indication: %x " 2204 "rxpt_classify_info.use_flow_id_toeplitz_clfy: %x " 2205 "rx_reo_queue_desc_addr_31_0: %x ", 2206 mpdu_info->fr_ds, 2207 mpdu_info->to_ds, 2208 mpdu_info->encrypted, 2209 mpdu_info->mpdu_retry, 2210 mpdu_info->mpdu_sequence_number, 2211 mpdu_info->epd_en, 2212 mpdu_info->all_frames_shall_be_encrypted, 2213 mpdu_info->encrypt_type, 2214 mpdu_info->mesh_sta, 2215 mpdu_info->bssid_hit, 2216 mpdu_info->bssid_number, 2217 mpdu_info->tid, 2218 mpdu_info->pn_31_0, 2219 mpdu_info->pn_63_32, 2220 mpdu_info->pn_95_64, 2221 mpdu_info->pn_127_96, 2222 mpdu_info->peer_meta_data, 2223 mpdu_info->rxpt_classify_info_details.reo_destination_indication, 2224 mpdu_info->rxpt_classify_info_details.use_flow_id_toeplitz_clfy, 2225 mpdu_info->rx_reo_queue_desc_addr_31_0); 2226 2227 hal_verbose_debug( 2228 "rx_mpdu_start tlv (3/5) - " 2229 "rx_reo_queue_desc_addr_39_32: %x " 2230 "receive_queue_number: %x " 2231 "pre_delim_err_warning: %x " 2232 "first_delim_err: %x " 2233 "key_id_octet: %x " 2234 "new_peer_entry: %x " 2235 "decrypt_needed: %x " 2236 "decap_type: %x " 2237 "rx_insert_vlan_c_tag_padding: %x " 2238 "rx_insert_vlan_s_tag_padding: %x " 2239 "strip_vlan_c_tag_decap: %x " 2240 "strip_vlan_s_tag_decap: %x " 2241 "pre_delim_count: %x " 2242 "ampdu_flag: %x " 2243 "bar_frame: %x " 2244 "mpdu_length: %x " 2245 "first_mpdu: %x " 2246 "mcast_bcast: %x " 2247 "ast_index_not_found: %x " 2248 "ast_index_timeout: %x ", 2249 mpdu_info->rx_reo_queue_desc_addr_39_32, 2250 mpdu_info->receive_queue_number, 2251 mpdu_info->pre_delim_err_warning, 2252 mpdu_info->first_delim_err, 2253 mpdu_info->key_id_octet, 2254 mpdu_info->new_peer_entry, 2255 mpdu_info->decrypt_needed, 2256 mpdu_info->decap_type, 2257 mpdu_info->rx_insert_vlan_c_tag_padding, 2258 mpdu_info->rx_insert_vlan_s_tag_padding, 2259 mpdu_info->strip_vlan_c_tag_decap, 2260 mpdu_info->strip_vlan_s_tag_decap, 2261 mpdu_info->pre_delim_count, 2262 mpdu_info->ampdu_flag, 2263 mpdu_info->bar_frame, 2264 mpdu_info->mpdu_length, 2265 mpdu_info->first_mpdu, 2266 mpdu_info->mcast_bcast, 2267 mpdu_info->ast_index_not_found, 2268 mpdu_info->ast_index_timeout); 2269 2270 hal_verbose_debug( 2271 "rx_mpdu_start tlv (4/5) - " 2272 "power_mgmt: %x " 2273 "non_qos: %x " 2274 "null_data: %x " 2275 "mgmt_type: %x " 2276 "ctrl_type: %x " 2277 "more_data: %x " 2278 "eosp: %x " 2279 "fragment_flag: %x " 2280 "order: %x " 2281 "u_apsd_trigger: %x " 2282 "encrypt_required: %x " 2283 "directed: %x " 2284 "mpdu_frame_control_field: %x " 2285 "mpdu_duration_field: %x " 2286 "mac_addr_ad1_31_0: %x " 2287 "mac_addr_ad1_47_32: %x " 2288 "mac_addr_ad2_15_0: %x " 2289 "mac_addr_ad2_47_16: %x " 2290 "mac_addr_ad3_31_0: %x " 2291 "mac_addr_ad3_47_32: %x ", 2292 mpdu_info->power_mgmt, 2293 mpdu_info->non_qos, 2294 mpdu_info->null_data, 2295 mpdu_info->mgmt_type, 2296 mpdu_info->ctrl_type, 2297 mpdu_info->more_data, 2298 mpdu_info->eosp, 2299 mpdu_info->fragment_flag, 2300 mpdu_info->order, 2301 mpdu_info->u_apsd_trigger, 2302 mpdu_info->encrypt_required, 2303 mpdu_info->directed, 2304 mpdu_info->mpdu_frame_control_field, 2305 mpdu_info->mpdu_duration_field, 2306 mpdu_info->mac_addr_ad1_31_0, 2307 mpdu_info->mac_addr_ad1_47_32, 2308 mpdu_info->mac_addr_ad2_15_0, 2309 mpdu_info->mac_addr_ad2_47_16, 2310 mpdu_info->mac_addr_ad3_31_0, 2311 mpdu_info->mac_addr_ad3_47_32); 2312 2313 hal_verbose_debug( 2314 "rx_mpdu_start tlv (5/5) - " 2315 "mpdu_sequence_control_field: %x " 2316 "mac_addr_ad4_31_0: %x " 2317 "mac_addr_ad4_47_32: %x " 2318 "mpdu_qos_control_field: %x " 2319 "mpdu_ht_control_field: %x ", 2320 mpdu_info->mpdu_sequence_control_field, 2321 mpdu_info->mac_addr_ad4_31_0, 2322 mpdu_info->mac_addr_ad4_47_32, 2323 mpdu_info->mpdu_qos_control_field, 2324 mpdu_info->mpdu_ht_control_field); 2325 } 2326 2327 /** 2328 * hal_tx_set_pcp_tid_map_generic_li() - Configure default PCP to TID map table 2329 * @soc: HAL SoC context 2330 * @map: PCP-TID mapping table 2331 * 2332 * PCP are mapped to 8 TID values using TID values programmed 2333 * in one set of mapping registers PCP_TID_MAP_<0 to 6> 2334 * The mapping register has TID mapping for 8 PCP values 2335 * 2336 * Return: none 2337 */ hal_tx_set_pcp_tid_map_generic_li(struct hal_soc * soc,uint8_t * map)2338 static void hal_tx_set_pcp_tid_map_generic_li(struct hal_soc *soc, uint8_t *map) 2339 { 2340 uint32_t addr, value; 2341 2342 addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR( 2343 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 2344 2345 value = (map[0] | 2346 (map[1] << HWIO_TCL_R0_PCP_TID_MAP_PCP_1_SHFT) | 2347 (map[2] << HWIO_TCL_R0_PCP_TID_MAP_PCP_2_SHFT) | 2348 (map[3] << HWIO_TCL_R0_PCP_TID_MAP_PCP_3_SHFT) | 2349 (map[4] << HWIO_TCL_R0_PCP_TID_MAP_PCP_4_SHFT) | 2350 (map[5] << HWIO_TCL_R0_PCP_TID_MAP_PCP_5_SHFT) | 2351 (map[6] << HWIO_TCL_R0_PCP_TID_MAP_PCP_6_SHFT) | 2352 (map[7] << HWIO_TCL_R0_PCP_TID_MAP_PCP_7_SHFT)); 2353 2354 HAL_REG_WRITE(soc, addr, (value & HWIO_TCL_R0_PCP_TID_MAP_RMSK)); 2355 } 2356 2357 /** 2358 * hal_tx_update_pcp_tid_generic_li() - Update the pcp tid map table with 2359 * value received from user-space 2360 * @soc: HAL SoC context 2361 * @pcp: pcp value 2362 * @tid : tid value 2363 * 2364 * Return: void 2365 */ 2366 static void hal_tx_update_pcp_tid_generic_li(struct hal_soc * soc,uint8_t pcp,uint8_t tid)2367 hal_tx_update_pcp_tid_generic_li(struct hal_soc *soc, 2368 uint8_t pcp, uint8_t tid) 2369 { 2370 uint32_t addr, value, regval; 2371 2372 addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR( 2373 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 2374 2375 value = (uint32_t)tid << (HAL_TX_BITS_PER_TID * pcp); 2376 2377 /* Read back previous PCP TID config and update 2378 * with new config. 2379 */ 2380 regval = HAL_REG_READ(soc, addr); 2381 regval &= ~(HAL_TX_TID_BITS_MASK << (HAL_TX_BITS_PER_TID * pcp)); 2382 regval |= value; 2383 2384 HAL_REG_WRITE(soc, addr, 2385 (regval & HWIO_TCL_R0_PCP_TID_MAP_RMSK)); 2386 } 2387 2388 /** 2389 * hal_tx_update_tidmap_prty_generic_li() - Update the tid map priority 2390 * @soc: HAL SoC context 2391 * @value: priority value 2392 * 2393 * Return: void 2394 */ 2395 static hal_tx_update_tidmap_prty_generic_li(struct hal_soc * soc,uint8_t value)2396 void hal_tx_update_tidmap_prty_generic_li(struct hal_soc *soc, uint8_t value) 2397 { 2398 uint32_t addr; 2399 2400 addr = HWIO_TCL_R0_TID_MAP_PRTY_ADDR( 2401 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 2402 2403 HAL_REG_WRITE(soc, addr, 2404 (value & HWIO_TCL_R0_TID_MAP_PRTY_RMSK)); 2405 } 2406 2407 /** 2408 * hal_rx_msdu_packet_metadata_get_generic_li() - API to get the msdu 2409 * information from 2410 * rx_msdu_end TLV 2411 * @buf: pointer to the start of RX PKT TLV headers 2412 * @pkt_msdu_metadata: pointer to the msdu info structure 2413 */ 2414 static void hal_rx_msdu_packet_metadata_get_generic_li(uint8_t * buf,void * pkt_msdu_metadata)2415 hal_rx_msdu_packet_metadata_get_generic_li(uint8_t *buf, 2416 void *pkt_msdu_metadata) 2417 { 2418 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2419 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 2420 struct hal_rx_msdu_metadata *msdu_metadata = 2421 (struct hal_rx_msdu_metadata *)pkt_msdu_metadata; 2422 2423 msdu_metadata->l3_hdr_pad = 2424 HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end); 2425 msdu_metadata->sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end); 2426 msdu_metadata->da_idx = HAL_RX_MSDU_END_DA_IDX_GET(msdu_end); 2427 msdu_metadata->sa_sw_peer_id = 2428 HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end); 2429 } 2430 2431 /** 2432 * hal_rx_msdu_end_offset_get_generic() - API to get the 2433 * msdu_end structure offset rx_pkt_tlv structure 2434 * 2435 * NOTE: API returns offset of msdu_end TLV from structure 2436 * rx_pkt_tlvs 2437 */ hal_rx_msdu_end_offset_get_generic(void)2438 static uint32_t hal_rx_msdu_end_offset_get_generic(void) 2439 { 2440 return RX_PKT_TLV_OFFSET(msdu_end_tlv); 2441 } 2442 2443 /** 2444 * hal_rx_attn_offset_get_generic() - API to get the 2445 * msdu_end structure offset rx_pkt_tlv structure 2446 * 2447 * NOTE: API returns offset of attn TLV from structure 2448 * rx_pkt_tlvs 2449 */ hal_rx_attn_offset_get_generic(void)2450 static uint32_t hal_rx_attn_offset_get_generic(void) 2451 { 2452 return RX_PKT_TLV_OFFSET(attn_tlv); 2453 } 2454 2455 /** 2456 * hal_rx_msdu_start_offset_get_generic() - API to get the 2457 * msdu_start structure offset rx_pkt_tlv structure 2458 * 2459 * NOTE: API returns offset of attn TLV from structure 2460 * rx_pkt_tlvs 2461 */ hal_rx_msdu_start_offset_get_generic(void)2462 static uint32_t hal_rx_msdu_start_offset_get_generic(void) 2463 { 2464 return RX_PKT_TLV_OFFSET(msdu_start_tlv); 2465 } 2466 2467 /** 2468 * hal_rx_mpdu_start_offset_get_generic() - API to get the 2469 * mpdu_start structure offset rx_pkt_tlv structure 2470 * 2471 * NOTE: API returns offset of attn TLV from structure 2472 * rx_pkt_tlvs 2473 */ hal_rx_mpdu_start_offset_get_generic(void)2474 static uint32_t hal_rx_mpdu_start_offset_get_generic(void) 2475 { 2476 return RX_PKT_TLV_OFFSET(mpdu_start_tlv); 2477 } 2478 2479 /** 2480 * hal_rx_mpdu_end_offset_get_generic() - API to get the 2481 * mpdu_end structure offset rx_pkt_tlv structure 2482 * 2483 * NOTE: API returns offset of attn TLV from structure 2484 * rx_pkt_tlvs 2485 */ hal_rx_mpdu_end_offset_get_generic(void)2486 static uint32_t hal_rx_mpdu_end_offset_get_generic(void) 2487 { 2488 return RX_PKT_TLV_OFFSET(mpdu_end_tlv); 2489 } 2490 2491 #ifndef NO_RX_PKT_HDR_TLV hal_rx_pkt_tlv_offset_get_generic(void)2492 static uint32_t hal_rx_pkt_tlv_offset_get_generic(void) 2493 { 2494 return RX_PKT_TLV_OFFSET(pkt_hdr_tlv); 2495 } 2496 #endif 2497 2498 #if defined(QDF_BIG_ENDIAN_MACHINE) 2499 /** 2500 * hal_setup_reo_swap() - Set the swap flag for big endian machines 2501 * @soc: HAL soc handle 2502 * 2503 * Return: None 2504 */ hal_setup_reo_swap(struct hal_soc * soc)2505 static inline void hal_setup_reo_swap(struct hal_soc *soc) 2506 { 2507 uint32_t reg_val; 2508 2509 reg_val = HAL_REG_READ(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR( 2510 SEQ_WCSS_UMAC_REO_REG_OFFSET)); 2511 2512 reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, WRITE_STRUCT_SWAP, 1); 2513 reg_val |= HAL_SM(HWIO_REO_R0_CACHE_CTL_CONFIG, READ_STRUCT_SWAP, 1); 2514 2515 HAL_REG_WRITE(soc, HWIO_REO_R0_CACHE_CTL_CONFIG_ADDR( 2516 SEQ_WCSS_UMAC_REO_REG_OFFSET), reg_val); 2517 } 2518 #else hal_setup_reo_swap(struct hal_soc * soc)2519 static inline void hal_setup_reo_swap(struct hal_soc *soc) 2520 { 2521 } 2522 #endif 2523 2524 /** 2525 * hal_reo_setup_generic_li() - Initialize HW REO block 2526 * @soc: Opaque HAL SOC handle 2527 * @reoparams: parameters needed by HAL for REO config 2528 * @qref_reset: reset qref 2529 */ 2530 static hal_reo_setup_generic_li(struct hal_soc * soc,void * reoparams,int qref_reset)2531 void hal_reo_setup_generic_li(struct hal_soc *soc, void *reoparams, 2532 int qref_reset) 2533 { 2534 uint32_t reg_val; 2535 struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams; 2536 2537 reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR( 2538 SEQ_WCSS_UMAC_REO_REG_OFFSET)); 2539 2540 hal_reo_config(soc, reg_val, reo_params); 2541 /* Other ring enable bits and REO_ENABLE will be set by FW */ 2542 2543 /* TODO: Setup destination ring mapping if enabled */ 2544 2545 /* TODO: Error destination ring setting is left to default. 2546 * Default setting is to send all errors to release ring. 2547 */ 2548 2549 /* Set the reo descriptor swap bits in case of BIG endian platform */ 2550 hal_setup_reo_swap(soc); 2551 2552 HAL_REG_WRITE(soc, 2553 HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR( 2554 SEQ_WCSS_UMAC_REO_REG_OFFSET), 2555 HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000); 2556 2557 HAL_REG_WRITE(soc, 2558 HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR( 2559 SEQ_WCSS_UMAC_REO_REG_OFFSET), 2560 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000)); 2561 2562 HAL_REG_WRITE(soc, 2563 HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR( 2564 SEQ_WCSS_UMAC_REO_REG_OFFSET), 2565 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000)); 2566 2567 HAL_REG_WRITE(soc, 2568 HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR( 2569 SEQ_WCSS_UMAC_REO_REG_OFFSET), 2570 (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000)); 2571 2572 /* 2573 * When hash based routing is enabled, routing of the rx packet 2574 * is done based on the following value: 1 _ _ _ _ The last 4 2575 * bits are based on hash[3:0]. This means the possible values 2576 * are 0x10 to 0x1f. This value is used to look-up the 2577 * ring ID configured in Destination_Ring_Ctrl_IX_* register. 2578 * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3 2579 * registers need to be configured to set-up the 16 entries to 2580 * map the hash values to a ring number. There are 3 bits per 2581 * hash entry – which are mapped as follows: 2582 * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI), 2583 * 7: NOT_USED. 2584 */ 2585 if (reo_params->rx_hash_enabled) { 2586 if (reo_params->remap0) 2587 HAL_REG_WRITE(soc, 2588 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR( 2589 SEQ_WCSS_UMAC_REO_REG_OFFSET), 2590 reo_params->remap0); 2591 2592 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR 0x%x", 2593 HAL_REG_READ(soc, 2594 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_0_ADDR( 2595 SEQ_WCSS_UMAC_REO_REG_OFFSET))); 2596 2597 HAL_REG_WRITE(soc, 2598 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR( 2599 SEQ_WCSS_UMAC_REO_REG_OFFSET), 2600 reo_params->remap1); 2601 2602 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x", 2603 HAL_REG_READ(soc, 2604 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR( 2605 SEQ_WCSS_UMAC_REO_REG_OFFSET))); 2606 2607 HAL_REG_WRITE(soc, 2608 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR( 2609 SEQ_WCSS_UMAC_REO_REG_OFFSET), 2610 reo_params->remap2); 2611 2612 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x", 2613 HAL_REG_READ(soc, 2614 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR( 2615 SEQ_WCSS_UMAC_REO_REG_OFFSET))); 2616 } 2617 2618 /* TODO: Check if the following registers shoould be setup by host: 2619 * AGING_CONTROL 2620 * HIGH_MEMORY_THRESHOLD 2621 * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2] 2622 * GLOBAL_LINK_DESC_COUNT_CTRL 2623 */ 2624 } 2625 2626 /** 2627 * hal_setup_link_idle_list_generic_li() - Setup scattered idle list 2628 * using the buffer list provided 2629 * @soc: Opaque HAL SOC handle 2630 * @scatter_bufs_base_paddr: Array of physical base addresses 2631 * @scatter_bufs_base_vaddr: Array of virtual base addresses 2632 * @num_scatter_bufs: Number of scatter buffers in the above lists 2633 * @scatter_buf_size: Size of each scatter buffer 2634 * @last_buf_end_offset: Offset to the last entry 2635 * @num_entries: Total entries of all scatter bufs 2636 * 2637 * Return: None 2638 */ 2639 static void hal_setup_link_idle_list_generic_li(struct hal_soc * soc,qdf_dma_addr_t scatter_bufs_base_paddr[],void * scatter_bufs_base_vaddr[],uint32_t num_scatter_bufs,uint32_t scatter_buf_size,uint32_t last_buf_end_offset,uint32_t num_entries)2640 hal_setup_link_idle_list_generic_li(struct hal_soc *soc, 2641 qdf_dma_addr_t scatter_bufs_base_paddr[], 2642 void *scatter_bufs_base_vaddr[], 2643 uint32_t num_scatter_bufs, 2644 uint32_t scatter_buf_size, 2645 uint32_t last_buf_end_offset, 2646 uint32_t num_entries) 2647 { 2648 int i; 2649 uint32_t *prev_buf_link_ptr = NULL; 2650 uint32_t reg_scatter_buf_size, reg_tot_scatter_buf_size; 2651 uint32_t val; 2652 2653 /* Link the scatter buffers */ 2654 for (i = 0; i < num_scatter_bufs; i++) { 2655 if (i > 0) { 2656 prev_buf_link_ptr[0] = 2657 scatter_bufs_base_paddr[i] & 0xffffffff; 2658 prev_buf_link_ptr[1] = HAL_SM( 2659 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB, 2660 BASE_ADDRESS_39_32, 2661 ((uint64_t)(scatter_bufs_base_paddr[i]) 2662 >> 32)) | HAL_SM( 2663 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB, 2664 ADDRESS_MATCH_TAG, 2665 ADDRESS_MATCH_TAG_VAL); 2666 } 2667 prev_buf_link_ptr = (uint32_t *)(scatter_bufs_base_vaddr[i] + 2668 scatter_buf_size - WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE); 2669 } 2670 2671 /* TBD: Register programming partly based on MLD & the rest based on 2672 * inputs from HW team. Not complete yet. 2673 */ 2674 2675 reg_scatter_buf_size = (scatter_buf_size - 2676 WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) / 64; 2677 reg_tot_scatter_buf_size = ((scatter_buf_size - 2678 WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) * num_scatter_bufs) / 64; 2679 2680 HAL_REG_WRITE(soc, 2681 HWIO_WBM_R0_IDLE_LIST_CONTROL_ADDR 2682 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2683 HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, 2684 SCATTER_BUFFER_SIZE, 2685 reg_scatter_buf_size) | 2686 HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, 2687 LINK_DESC_IDLE_LIST_MODE, 0x1)); 2688 2689 HAL_REG_WRITE(soc, 2690 HWIO_WBM_R0_IDLE_LIST_SIZE_ADDR 2691 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2692 HAL_SM(HWIO_WBM_R0_IDLE_LIST_SIZE, 2693 SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST, 2694 reg_tot_scatter_buf_size)); 2695 2696 HAL_REG_WRITE(soc, 2697 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_LSB_ADDR 2698 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2699 scatter_bufs_base_paddr[0] & 0xffffffff); 2700 2701 HAL_REG_WRITE(soc, 2702 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR 2703 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2704 ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32) & 2705 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_BASE_ADDRESS_39_32_BMSK); 2706 2707 HAL_REG_WRITE(soc, 2708 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR 2709 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2710 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB, 2711 BASE_ADDRESS_39_32, 2712 ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32)) | 2713 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB, 2714 ADDRESS_MATCH_TAG, ADDRESS_MATCH_TAG_VAL)); 2715 2716 /* ADDRESS_MATCH_TAG field in the above register is expected to match 2717 * with the upper bits of link pointer. The above write sets this field 2718 * to zero and we are also setting the upper bits of link pointers to 2719 * zero while setting up the link list of scatter buffers above 2720 */ 2721 2722 /* Setup head and tail pointers for the idle list */ 2723 HAL_REG_WRITE(soc, 2724 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR 2725 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2726 scatter_bufs_base_paddr[num_scatter_bufs - 1] & 2727 0xffffffff); 2728 HAL_REG_WRITE(soc, 2729 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1_ADDR 2730 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2731 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1, 2732 BUFFER_ADDRESS_39_32, 2733 ((uint64_t)(scatter_bufs_base_paddr 2734 [num_scatter_bufs - 1]) >> 32)) | 2735 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1, 2736 HEAD_POINTER_OFFSET, last_buf_end_offset >> 2)); 2737 2738 HAL_REG_WRITE(soc, 2739 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR 2740 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2741 scatter_bufs_base_paddr[0] & 0xffffffff); 2742 2743 HAL_REG_WRITE(soc, 2744 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX0_ADDR 2745 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2746 scatter_bufs_base_paddr[0] & 0xffffffff); 2747 HAL_REG_WRITE(soc, 2748 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1_ADDR 2749 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2750 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1, 2751 BUFFER_ADDRESS_39_32, 2752 ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32)) | 2753 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1, 2754 TAIL_POINTER_OFFSET, 0)); 2755 2756 HAL_REG_WRITE(soc, 2757 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HP_ADDR 2758 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2 * num_entries); 2759 2760 /* Set RING_ID_DISABLE */ 2761 val = HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, RING_ID_DISABLE, 1); 2762 2763 /* 2764 * SRNG_ENABLE bit is not available in HWK v1 (QCA8074v1). Hence 2765 * check the presence of the bit before toggling it. 2766 */ 2767 #ifdef HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE_BMSK 2768 val |= HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, SRNG_ENABLE, 1); 2769 #endif 2770 HAL_REG_WRITE(soc, 2771 HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_ADDR 2772 (SEQ_WCSS_UMAC_WBM_REG_OFFSET), 2773 val); 2774 } 2775 2776 #ifdef TCL_DATA_CMD_2_SEARCH_TYPE_OFFSET 2777 /** 2778 * hal_tx_desc_set_search_type_generic_li() - Set the search type value 2779 * @desc: Handle to Tx Descriptor 2780 * @search_type: search type 2781 * 0 – Normal search 2782 * 1 – Index based address search 2783 * 2 – Index based flow search 2784 * 2785 * Return: void 2786 */ 2787 static inline hal_tx_desc_set_search_type_generic_li(void * desc,uint8_t search_type)2788 void hal_tx_desc_set_search_type_generic_li(void *desc, uint8_t search_type) 2789 { 2790 HAL_SET_FLD(desc, TCL_DATA_CMD_2, SEARCH_TYPE) |= 2791 HAL_TX_SM(TCL_DATA_CMD_2, SEARCH_TYPE, search_type); 2792 } 2793 #else 2794 static inline hal_tx_desc_set_search_type_generic_li(void * desc,uint8_t search_type)2795 void hal_tx_desc_set_search_type_generic_li(void *desc, uint8_t search_type) 2796 { 2797 } 2798 2799 #endif 2800 2801 #ifdef TCL_DATA_CMD_5_SEARCH_INDEX_OFFSET 2802 /** 2803 * hal_tx_desc_set_search_index_generic_li() - Set the search index value 2804 * @desc: Handle to Tx Descriptor 2805 * @search_index: The index that will be used for index based address or 2806 * flow search. The field is valid when 'search_type' is 2807 * 1 0r 2 2808 * 2809 * Return: void 2810 */ 2811 static inline hal_tx_desc_set_search_index_generic_li(void * desc,uint32_t search_index)2812 void hal_tx_desc_set_search_index_generic_li(void *desc, uint32_t search_index) 2813 { 2814 HAL_SET_FLD(desc, TCL_DATA_CMD_5, SEARCH_INDEX) |= 2815 HAL_TX_SM(TCL_DATA_CMD_5, SEARCH_INDEX, search_index); 2816 } 2817 #else 2818 static inline hal_tx_desc_set_search_index_generic_li(void * desc,uint32_t search_index)2819 void hal_tx_desc_set_search_index_generic_li(void *desc, uint32_t search_index) 2820 { 2821 } 2822 #endif 2823 2824 #ifdef TCL_DATA_CMD_5_CACHE_SET_NUM_OFFSET 2825 /** 2826 * hal_tx_desc_set_cache_set_num_generic_li() - Set the cache-set-num value 2827 * @desc: Handle to Tx Descriptor 2828 * @cache_num: Cache set number that should be used to cache the index 2829 * based search results, for address and flow search. 2830 * This value should be equal to LSB four bits of the hash value 2831 * of match data, in case of search index points to an entry 2832 * which may be used in content based search also. The value can 2833 * be anything when the entry pointed by search index will not be 2834 * used for content based search. 2835 * 2836 * Return: void 2837 */ 2838 static inline hal_tx_desc_set_cache_set_num_generic_li(void * desc,uint8_t cache_num)2839 void hal_tx_desc_set_cache_set_num_generic_li(void *desc, uint8_t cache_num) 2840 { 2841 HAL_SET_FLD(desc, TCL_DATA_CMD_5, CACHE_SET_NUM) |= 2842 HAL_TX_SM(TCL_DATA_CMD_5, CACHE_SET_NUM, cache_num); 2843 } 2844 #else 2845 static inline hal_tx_desc_set_cache_set_num_generic_li(void * desc,uint8_t cache_num)2846 void hal_tx_desc_set_cache_set_num_generic_li(void *desc, uint8_t cache_num) 2847 { 2848 } 2849 #endif 2850 2851 #ifdef WLAN_SUPPORT_RX_FISA 2852 /** 2853 * hal_rx_flow_get_tuple_info_li() - Setup a flow search entry in HW FST 2854 * @rx_fst: Pointer to the Rx Flow Search Table 2855 * @hal_hash: HAL 5 tuple hash 2856 * @flow_tuple_info: 5-tuple info of the flow returned to the caller 2857 * 2858 * Return: Success/Failure 2859 */ 2860 static void * hal_rx_flow_get_tuple_info_li(uint8_t * rx_fst,uint32_t hal_hash,uint8_t * flow_tuple_info)2861 hal_rx_flow_get_tuple_info_li(uint8_t *rx_fst, uint32_t hal_hash, 2862 uint8_t *flow_tuple_info) 2863 { 2864 struct hal_rx_fst *fst = (struct hal_rx_fst *)rx_fst; 2865 void *hal_fse = NULL; 2866 struct hal_flow_tuple_info *tuple_info 2867 = (struct hal_flow_tuple_info *)flow_tuple_info; 2868 2869 hal_fse = (uint8_t *)fst->base_vaddr + 2870 (hal_hash * HAL_RX_FST_ENTRY_SIZE); 2871 2872 if (!hal_fse || !tuple_info) 2873 return NULL; 2874 2875 if (!HAL_GET_FLD(hal_fse, RX_FLOW_SEARCH_ENTRY_9, VALID)) 2876 return NULL; 2877 2878 tuple_info->src_ip_127_96 = 2879 qdf_ntohl(HAL_GET_FLD(hal_fse, 2880 RX_FLOW_SEARCH_ENTRY_0, 2881 SRC_IP_127_96)); 2882 tuple_info->src_ip_95_64 = 2883 qdf_ntohl(HAL_GET_FLD(hal_fse, 2884 RX_FLOW_SEARCH_ENTRY_1, 2885 SRC_IP_95_64)); 2886 tuple_info->src_ip_63_32 = 2887 qdf_ntohl(HAL_GET_FLD(hal_fse, 2888 RX_FLOW_SEARCH_ENTRY_2, 2889 SRC_IP_63_32)); 2890 tuple_info->src_ip_31_0 = 2891 qdf_ntohl(HAL_GET_FLD(hal_fse, 2892 RX_FLOW_SEARCH_ENTRY_3, 2893 SRC_IP_31_0)); 2894 tuple_info->dest_ip_127_96 = 2895 qdf_ntohl(HAL_GET_FLD(hal_fse, 2896 RX_FLOW_SEARCH_ENTRY_4, 2897 DEST_IP_127_96)); 2898 tuple_info->dest_ip_95_64 = 2899 qdf_ntohl(HAL_GET_FLD(hal_fse, 2900 RX_FLOW_SEARCH_ENTRY_5, 2901 DEST_IP_95_64)); 2902 tuple_info->dest_ip_63_32 = 2903 qdf_ntohl(HAL_GET_FLD(hal_fse, 2904 RX_FLOW_SEARCH_ENTRY_6, 2905 DEST_IP_63_32)); 2906 tuple_info->dest_ip_31_0 = 2907 qdf_ntohl(HAL_GET_FLD(hal_fse, 2908 RX_FLOW_SEARCH_ENTRY_7, 2909 DEST_IP_31_0)); 2910 tuple_info->dest_port = HAL_GET_FLD(hal_fse, 2911 RX_FLOW_SEARCH_ENTRY_8, 2912 DEST_PORT); 2913 tuple_info->src_port = HAL_GET_FLD(hal_fse, 2914 RX_FLOW_SEARCH_ENTRY_8, 2915 SRC_PORT); 2916 tuple_info->l4_protocol = HAL_GET_FLD(hal_fse, 2917 RX_FLOW_SEARCH_ENTRY_9, 2918 L4_PROTOCOL); 2919 2920 return hal_fse; 2921 } 2922 2923 /** 2924 * hal_rx_flow_delete_entry_li() - Setup a flow search entry in HW FST 2925 * @rx_fst: Pointer to the Rx Flow Search Table 2926 * @hal_rx_fse: Pointer to the Rx Flow that is to be deleted from the FST 2927 * 2928 * Return: Success/Failure 2929 */ 2930 static QDF_STATUS hal_rx_flow_delete_entry_li(uint8_t * rx_fst,void * hal_rx_fse)2931 hal_rx_flow_delete_entry_li(uint8_t *rx_fst, void *hal_rx_fse) 2932 { 2933 uint8_t *fse = (uint8_t *)hal_rx_fse; 2934 2935 if (!HAL_GET_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID)) 2936 return QDF_STATUS_E_NOENT; 2937 2938 HAL_CLR_FLD(fse, RX_FLOW_SEARCH_ENTRY_9, VALID); 2939 2940 return QDF_STATUS_SUCCESS; 2941 } 2942 2943 /** 2944 * hal_rx_fst_get_fse_size_li() - Retrieve the size of each entry 2945 * 2946 * Return: size of each entry/flow in Rx FST 2947 */ 2948 static inline uint32_t hal_rx_fst_get_fse_size_li(void)2949 hal_rx_fst_get_fse_size_li(void) 2950 { 2951 return HAL_RX_FST_ENTRY_SIZE; 2952 } 2953 #else 2954 static inline void * hal_rx_flow_get_tuple_info_li(uint8_t * rx_fst,uint32_t hal_hash,uint8_t * flow_tuple_info)2955 hal_rx_flow_get_tuple_info_li(uint8_t *rx_fst, uint32_t hal_hash, 2956 uint8_t *flow_tuple_info) 2957 { 2958 return NULL; 2959 } 2960 2961 static inline QDF_STATUS hal_rx_flow_delete_entry_li(uint8_t * rx_fst,void * hal_rx_fse)2962 hal_rx_flow_delete_entry_li(uint8_t *rx_fst, void *hal_rx_fse) 2963 { 2964 return QDF_STATUS_SUCCESS; 2965 } 2966 2967 static inline uint32_t hal_rx_fst_get_fse_size_li(void)2968 hal_rx_fst_get_fse_size_li(void) 2969 { 2970 return 0; 2971 } 2972 #endif /* WLAN_SUPPORT_RX_FISA */ 2973 2974 /** 2975 * hal_rx_get_frame_ctrl_field_li() - Function to retrieve frame control field 2976 * @buf: Network buffer 2977 * 2978 * Return: rx more fragment bit 2979 */ hal_rx_get_frame_ctrl_field_li(uint8_t * buf)2980 static uint16_t hal_rx_get_frame_ctrl_field_li(uint8_t *buf) 2981 { 2982 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf); 2983 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs); 2984 uint16_t frame_ctrl = 0; 2985 2986 frame_ctrl = HAL_RX_MPDU_GET_FRAME_CONTROL_FIELD(rx_mpdu_info); 2987 2988 return frame_ctrl; 2989 } 2990 #endif /* _HAL_LI_GENERIC_API_H_ */ 2991