1 /* 2 * Copyright (c) 2016-2020 The Linux Foundation. All rights reserved. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for 5 * any purpose with or without fee is hereby granted, provided that the 6 * above copyright notice and this permission notice appear in all 7 * copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL 10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL 13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 16 * PERFORMANCE OF THIS SOFTWARE. 17 */ 18 #ifndef _HAL_GENERIC_API_H_ 19 #define _HAL_GENERIC_API_H_ 20 21 #include <hal_rx.h> 22 23 /** 24 * hal_tx_comp_get_status() - TQM Release reason 25 * @hal_desc: completion ring Tx status 26 * 27 * This function will parse the WBM completion descriptor and populate in 28 * HAL structure 29 * 30 * Return: none 31 */ 32 static inline 33 void hal_tx_comp_get_status_generic(void *desc, 34 void *ts1, 35 struct hal_soc *hal) 36 { 37 uint8_t rate_stats_valid = 0; 38 uint32_t rate_stats = 0; 39 struct hal_tx_completion_status *ts = 40 (struct hal_tx_completion_status *)ts1; 41 42 ts->ppdu_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3, 43 TQM_STATUS_NUMBER); 44 ts->ack_frame_rssi = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, 45 ACK_FRAME_RSSI); 46 ts->first_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, FIRST_MSDU); 47 ts->last_msdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, LAST_MSDU); 48 ts->msdu_part_of_amsdu = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_4, 49 MSDU_PART_OF_AMSDU); 50 51 ts->peer_id = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, SW_PEER_ID); 52 ts->tid = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_7, TID); 53 ts->transmit_cnt = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_3, 54 TRANSMIT_COUNT); 55 56 rate_stats = HAL_TX_DESC_GET(desc, WBM_RELEASE_RING_5, 57 TX_RATE_STATS); 58 59 rate_stats_valid = HAL_TX_MS(TX_RATE_STATS_INFO_0, 60 TX_RATE_STATS_INFO_VALID, rate_stats); 61 62 ts->valid = rate_stats_valid; 63 64 if (rate_stats_valid) { 65 ts->bw = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_BW, 66 rate_stats); 67 ts->pkt_type = HAL_TX_MS(TX_RATE_STATS_INFO_0, 68 TRANSMIT_PKT_TYPE, rate_stats); 69 ts->stbc = HAL_TX_MS(TX_RATE_STATS_INFO_0, 70 TRANSMIT_STBC, rate_stats); 71 ts->ldpc = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_LDPC, 72 rate_stats); 73 ts->sgi = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_SGI, 74 rate_stats); 75 ts->mcs = HAL_TX_MS(TX_RATE_STATS_INFO_0, TRANSMIT_MCS, 76 rate_stats); 77 ts->ofdma = HAL_TX_MS(TX_RATE_STATS_INFO_0, OFDMA_TRANSMISSION, 78 rate_stats); 79 ts->tones_in_ru = HAL_TX_MS(TX_RATE_STATS_INFO_0, TONES_IN_RU, 80 rate_stats); 81 } 82 83 ts->release_src = hal_tx_comp_get_buffer_source(desc); 84 ts->status = hal_tx_comp_get_release_reason( 85 desc, 86 hal_soc_to_hal_soc_handle(hal)); 87 88 ts->tsf = HAL_TX_DESC_GET(desc, UNIFIED_WBM_RELEASE_RING_6, 89 TX_RATE_STATS_INFO_TX_RATE_STATS); 90 } 91 92 /** 93 * hal_tx_desc_set_buf_addr - Fill Buffer Address information in Tx Descriptor 94 * @desc: Handle to Tx Descriptor 95 * @paddr: Physical Address 96 * @pool_id: Return Buffer Manager ID 97 * @desc_id: Descriptor ID 98 * @type: 0 - Address points to a MSDU buffer 99 * 1 - Address points to MSDU extension descriptor 100 * 101 * Return: void 102 */ 103 static inline void hal_tx_desc_set_buf_addr_generic(void *desc, 104 dma_addr_t paddr, uint8_t pool_id, 105 uint32_t desc_id, uint8_t type) 106 { 107 /* Set buffer_addr_info.buffer_addr_31_0 */ 108 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_0, BUFFER_ADDR_INFO_BUF_ADDR_INFO) = 109 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_0, BUFFER_ADDR_31_0, paddr); 110 111 /* Set buffer_addr_info.buffer_addr_39_32 */ 112 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1, 113 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |= 114 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, BUFFER_ADDR_39_32, 115 (((uint64_t) paddr) >> 32)); 116 117 /* Set buffer_addr_info.return_buffer_manager = pool id */ 118 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1, 119 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |= 120 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, 121 RETURN_BUFFER_MANAGER, (pool_id + HAL_WBM_SW0_BM_ID)); 122 123 /* Set buffer_addr_info.sw_buffer_cookie = desc_id */ 124 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_1, 125 BUFFER_ADDR_INFO_BUF_ADDR_INFO) |= 126 HAL_TX_SM(UNIFIED_BUFFER_ADDR_INFO_1, SW_BUFFER_COOKIE, desc_id); 127 128 /* Set Buffer or Ext Descriptor Type */ 129 HAL_SET_FLD(desc, UNIFIED_TCL_DATA_CMD_2, 130 BUF_OR_EXT_DESC_TYPE) |= 131 HAL_TX_SM(UNIFIED_TCL_DATA_CMD_2, BUF_OR_EXT_DESC_TYPE, type); 132 } 133 134 #if defined(QCA_WIFI_QCA6290_11AX_MU_UL) && defined(QCA_WIFI_QCA6290_11AX) 135 /** 136 * hal_rx_handle_other_tlvs() - handle special TLVs like MU_UL 137 * tlv_tag: Taf of the TLVs 138 * rx_tlv: the pointer to the TLVs 139 * @ppdu_info: pointer to ppdu_info 140 * 141 * Return: true if the tlv is handled, false if not 142 */ 143 static inline bool 144 hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv, 145 struct hal_rx_ppdu_info *ppdu_info) 146 { 147 uint32_t value; 148 149 switch (tlv_tag) { 150 case WIFIPHYRX_HE_SIG_A_MU_UL_E: 151 { 152 uint8_t *he_sig_a_mu_ul_info = 153 (uint8_t *)rx_tlv + 154 HAL_RX_OFFSET(PHYRX_HE_SIG_A_MU_UL_0, 155 HE_SIG_A_MU_UL_INFO_PHYRX_HE_SIG_A_MU_UL_INFO_DETAILS); 156 ppdu_info->rx_status.he_flags = 1; 157 158 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0, 159 FORMAT_INDICATION); 160 if (value == 0) { 161 ppdu_info->rx_status.he_data1 = 162 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE; 163 } else { 164 ppdu_info->rx_status.he_data1 = 165 QDF_MON_STATUS_HE_SU_FORMAT_TYPE; 166 } 167 168 /* data1 */ 169 ppdu_info->rx_status.he_data1 |= 170 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN | 171 QDF_MON_STATUS_HE_DL_UL_KNOWN | 172 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN; 173 174 /* data2 */ 175 ppdu_info->rx_status.he_data2 |= 176 QDF_MON_STATUS_TXOP_KNOWN; 177 178 /*data3*/ 179 value = HAL_RX_GET(he_sig_a_mu_ul_info, 180 HE_SIG_A_MU_UL_INFO_0, BSS_COLOR_ID); 181 ppdu_info->rx_status.he_data3 = value; 182 /* 1 for UL and 0 for DL */ 183 value = 1; 184 value = value << QDF_MON_STATUS_DL_UL_SHIFT; 185 ppdu_info->rx_status.he_data3 |= value; 186 187 /*data4*/ 188 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_0, 189 SPATIAL_REUSE); 190 ppdu_info->rx_status.he_data4 = value; 191 192 /*data5*/ 193 value = HAL_RX_GET(he_sig_a_mu_ul_info, 194 HE_SIG_A_MU_UL_INFO_0, TRANSMIT_BW); 195 ppdu_info->rx_status.he_data5 = value; 196 ppdu_info->rx_status.bw = value; 197 198 /*data6*/ 199 value = HAL_RX_GET(he_sig_a_mu_ul_info, HE_SIG_A_MU_UL_INFO_1, 200 TXOP_DURATION); 201 value = value << QDF_MON_STATUS_TXOP_SHIFT; 202 ppdu_info->rx_status.he_data6 |= value; 203 return true; 204 } 205 default: 206 return false; 207 } 208 } 209 #else 210 static inline bool 211 hal_rx_handle_other_tlvs(uint32_t tlv_tag, void *rx_tlv, 212 struct hal_rx_ppdu_info *ppdu_info) 213 { 214 return false; 215 } 216 #endif /* QCA_WIFI_QCA6290_11AX_MU_UL && QCA_WIFI_QCA6290_11AX */ 217 218 #if defined(RX_PPDU_END_USER_STATS_1_OFDMA_INFO_VALID_OFFSET) && \ 219 defined(RX_PPDU_END_USER_STATS_22_SW_RESPONSE_REFERENCE_PTR_EXT_OFFSET) 220 221 static inline void 222 hal_rx_handle_mu_ul_info( 223 void *rx_tlv, 224 struct mon_rx_user_status *mon_rx_user_status) 225 { 226 mon_rx_user_status->mu_ul_user_v0_word0 = 227 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_11, 228 SW_RESPONSE_REFERENCE_PTR); 229 230 mon_rx_user_status->mu_ul_user_v0_word1 = 231 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_22, 232 SW_RESPONSE_REFERENCE_PTR_EXT); 233 } 234 235 static inline void 236 hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo, 237 struct mon_rx_user_status *mon_rx_user_status) 238 { 239 uint32_t mpdu_ok_byte_count; 240 uint32_t mpdu_err_byte_count; 241 242 mpdu_ok_byte_count = HAL_RX_GET(rx_tlv, 243 RX_PPDU_END_USER_STATS_17, 244 MPDU_OK_BYTE_COUNT); 245 mpdu_err_byte_count = HAL_RX_GET(rx_tlv, 246 RX_PPDU_END_USER_STATS_19, 247 MPDU_ERR_BYTE_COUNT); 248 249 mon_rx_user_status->mpdu_ok_byte_count = mpdu_ok_byte_count; 250 mon_rx_user_status->mpdu_err_byte_count = mpdu_err_byte_count; 251 } 252 #else 253 static inline void 254 hal_rx_handle_mu_ul_info(void *rx_tlv, 255 struct mon_rx_user_status *mon_rx_user_status) 256 { 257 } 258 259 static inline void 260 hal_rx_populate_byte_count(void *rx_tlv, void *ppduinfo, 261 struct mon_rx_user_status *mon_rx_user_status) 262 { 263 struct hal_rx_ppdu_info *ppdu_info = 264 (struct hal_rx_ppdu_info *)ppduinfo; 265 266 /* HKV1: doesn't support mpdu byte count */ 267 mon_rx_user_status->mpdu_ok_byte_count = ppdu_info->rx_status.ppdu_len; 268 mon_rx_user_status->mpdu_err_byte_count = 0; 269 } 270 #endif 271 272 static inline void 273 hal_rx_populate_mu_user_info(void *rx_tlv, void *ppduinfo, 274 struct mon_rx_user_status *mon_rx_user_status) 275 { 276 struct hal_rx_ppdu_info *ppdu_info = 277 (struct hal_rx_ppdu_info *)ppduinfo; 278 279 mon_rx_user_status->ast_index = ppdu_info->rx_status.ast_index; 280 mon_rx_user_status->tid = ppdu_info->rx_status.tid; 281 mon_rx_user_status->tcp_msdu_count = 282 ppdu_info->rx_status.tcp_msdu_count; 283 mon_rx_user_status->udp_msdu_count = 284 ppdu_info->rx_status.udp_msdu_count; 285 mon_rx_user_status->other_msdu_count = 286 ppdu_info->rx_status.other_msdu_count; 287 mon_rx_user_status->frame_control = ppdu_info->rx_status.frame_control; 288 mon_rx_user_status->frame_control_info_valid = 289 ppdu_info->rx_status.frame_control_info_valid; 290 mon_rx_user_status->data_sequence_control_info_valid = 291 ppdu_info->rx_status.data_sequence_control_info_valid; 292 mon_rx_user_status->first_data_seq_ctrl = 293 ppdu_info->rx_status.first_data_seq_ctrl; 294 mon_rx_user_status->preamble_type = ppdu_info->rx_status.preamble_type; 295 mon_rx_user_status->ht_flags = ppdu_info->rx_status.ht_flags; 296 mon_rx_user_status->rtap_flags = ppdu_info->rx_status.rtap_flags; 297 mon_rx_user_status->vht_flags = ppdu_info->rx_status.vht_flags; 298 mon_rx_user_status->he_flags = ppdu_info->rx_status.he_flags; 299 mon_rx_user_status->rs_flags = ppdu_info->rx_status.rs_flags; 300 301 mon_rx_user_status->mpdu_cnt_fcs_ok = 302 ppdu_info->com_info.mpdu_cnt_fcs_ok; 303 mon_rx_user_status->mpdu_cnt_fcs_err = 304 ppdu_info->com_info.mpdu_cnt_fcs_err; 305 qdf_mem_copy(&mon_rx_user_status->mpdu_fcs_ok_bitmap, 306 &ppdu_info->com_info.mpdu_fcs_ok_bitmap, 307 HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * 308 sizeof(ppdu_info->com_info.mpdu_fcs_ok_bitmap[0])); 309 310 hal_rx_populate_byte_count(rx_tlv, ppdu_info, mon_rx_user_status); 311 } 312 313 #ifdef WLAN_TX_PKT_CAPTURE_ENH 314 static inline void 315 hal_rx_populate_tx_capture_user_info(void *ppduinfo, 316 uint32_t user_id) 317 { 318 struct hal_rx_ppdu_info *ppdu_info; 319 struct mon_rx_info *mon_rx_info; 320 struct mon_rx_user_info *mon_rx_user_info; 321 322 ppdu_info = (struct hal_rx_ppdu_info *)ppduinfo; 323 mon_rx_info = &ppdu_info->rx_info; 324 mon_rx_user_info = &ppdu_info->rx_user_info[user_id]; 325 mon_rx_user_info->qos_control_info_valid = 326 mon_rx_info->qos_control_info_valid; 327 mon_rx_user_info->qos_control = mon_rx_info->qos_control; 328 } 329 #else 330 static inline void 331 hal_rx_populate_tx_capture_user_info(void *ppduinfo, 332 uint32_t user_id) 333 { 334 } 335 #endif 336 337 #define HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(chain, word_1, word_2, \ 338 ppdu_info, rssi_info_tlv) \ 339 { \ 340 ppdu_info->rx_status.rssi_chain[chain][0] = \ 341 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ 342 RSSI_PRI20_CHAIN##chain); \ 343 ppdu_info->rx_status.rssi_chain[chain][1] = \ 344 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ 345 RSSI_EXT20_CHAIN##chain); \ 346 ppdu_info->rx_status.rssi_chain[chain][2] = \ 347 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ 348 RSSI_EXT40_LOW20_CHAIN##chain); \ 349 ppdu_info->rx_status.rssi_chain[chain][3] = \ 350 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_1,\ 351 RSSI_EXT40_HIGH20_CHAIN##chain); \ 352 ppdu_info->rx_status.rssi_chain[chain][4] = \ 353 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ 354 RSSI_EXT80_LOW20_CHAIN##chain); \ 355 ppdu_info->rx_status.rssi_chain[chain][5] = \ 356 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ 357 RSSI_EXT80_LOW_HIGH20_CHAIN##chain); \ 358 ppdu_info->rx_status.rssi_chain[chain][6] = \ 359 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ 360 RSSI_EXT80_HIGH_LOW20_CHAIN##chain); \ 361 ppdu_info->rx_status.rssi_chain[chain][7] = \ 362 HAL_RX_GET(rssi_info_tlv, RECEIVE_RSSI_INFO_##word_2,\ 363 RSSI_EXT80_HIGH20_CHAIN##chain); \ 364 } \ 365 366 #define HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) \ 367 {HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(0, 0, 1, ppdu_info, rssi_info_tlv) \ 368 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(1, 2, 3, ppdu_info, rssi_info_tlv) \ 369 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(2, 4, 5, ppdu_info, rssi_info_tlv) \ 370 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(3, 6, 7, ppdu_info, rssi_info_tlv) \ 371 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(4, 8, 9, ppdu_info, rssi_info_tlv) \ 372 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(5, 10, 11, ppdu_info, rssi_info_tlv) \ 373 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(6, 12, 13, ppdu_info, rssi_info_tlv) \ 374 HAL_RX_UPDATE_RSSI_PER_CHAIN_BW(7, 14, 15, ppdu_info, rssi_info_tlv)} \ 375 376 static inline uint32_t 377 hal_rx_update_rssi_chain(struct hal_rx_ppdu_info *ppdu_info, 378 uint8_t *rssi_info_tlv) 379 { 380 HAL_RX_PPDU_UPDATE_RSSI(ppdu_info, rssi_info_tlv) 381 return 0; 382 } 383 384 #ifdef WLAN_TX_PKT_CAPTURE_ENH 385 static inline void 386 hal_get_qos_control(void *rx_tlv, 387 struct hal_rx_ppdu_info *ppdu_info) 388 { 389 ppdu_info->rx_info.qos_control_info_valid = 390 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 391 QOS_CONTROL_INFO_VALID); 392 393 if (ppdu_info->rx_info.qos_control_info_valid) 394 ppdu_info->rx_info.qos_control = 395 HAL_RX_GET(rx_tlv, 396 RX_PPDU_END_USER_STATS_5, 397 QOS_CONTROL_FIELD); 398 } 399 400 static inline void 401 hal_get_mac_addr1(uint8_t *rx_mpdu_start, 402 struct hal_rx_ppdu_info *ppdu_info) 403 { 404 if (ppdu_info->sw_frame_group_id 405 == HAL_MPDU_SW_FRAME_GROUP_MGMT_PROBE_REQ) { 406 ppdu_info->rx_info.mac_addr1_valid = 407 HAL_RX_GET_MAC_ADDR1_VALID(rx_mpdu_start); 408 409 *(uint32_t *)&ppdu_info->rx_info.mac_addr1[0] = 410 HAL_RX_GET(rx_mpdu_start, 411 RX_MPDU_INFO_15, 412 MAC_ADDR_AD1_31_0); 413 } 414 } 415 #else 416 static inline void 417 hal_get_qos_control(void *rx_tlv, 418 struct hal_rx_ppdu_info *ppdu_info) 419 { 420 } 421 422 static inline void 423 hal_get_mac_addr1(uint8_t *rx_mpdu_start, 424 struct hal_rx_ppdu_info *ppdu_info) 425 { 426 } 427 #endif 428 /** 429 * hal_rx_status_get_tlv_info() - process receive info TLV 430 * @rx_tlv_hdr: pointer to TLV header 431 * @ppdu_info: pointer to ppdu_info 432 * 433 * Return: HAL_TLV_STATUS_PPDU_NOT_DONE or HAL_TLV_STATUS_PPDU_DONE from tlv 434 */ 435 static inline uint32_t 436 hal_rx_status_get_tlv_info_generic(void *rx_tlv_hdr, void *ppduinfo, 437 hal_soc_handle_t hal_soc_hdl, 438 qdf_nbuf_t nbuf) 439 { 440 struct hal_soc *hal = (struct hal_soc *)hal_soc_hdl; 441 uint32_t tlv_tag, user_id, tlv_len, value; 442 uint8_t group_id = 0; 443 uint8_t he_dcm = 0; 444 uint8_t he_stbc = 0; 445 uint16_t he_gi = 0; 446 uint16_t he_ltf = 0; 447 void *rx_tlv; 448 bool unhandled = false; 449 struct mon_rx_user_status *mon_rx_user_status; 450 struct hal_rx_ppdu_info *ppdu_info = 451 (struct hal_rx_ppdu_info *)ppduinfo; 452 453 tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(rx_tlv_hdr); 454 user_id = HAL_RX_GET_USER_TLV32_USERID(rx_tlv_hdr); 455 tlv_len = HAL_RX_GET_USER_TLV32_LEN(rx_tlv_hdr); 456 457 rx_tlv = (uint8_t *)rx_tlv_hdr + HAL_RX_TLV32_HDR_SIZE; 458 459 qdf_trace_hex_dump(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 460 rx_tlv, tlv_len); 461 462 switch (tlv_tag) { 463 464 case WIFIRX_PPDU_START_E: 465 { 466 struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info; 467 468 ppdu_info->com_info.ppdu_id = 469 HAL_RX_GET(rx_tlv, RX_PPDU_START_0, 470 PHY_PPDU_ID); 471 /* channel number is set in PHY meta data */ 472 ppdu_info->rx_status.chan_num = 473 (HAL_RX_GET(rx_tlv, RX_PPDU_START_1, 474 SW_PHY_META_DATA) & 0x0000FFFF); 475 ppdu_info->rx_status.chan_freq = 476 (HAL_RX_GET(rx_tlv, RX_PPDU_START_1, 477 SW_PHY_META_DATA) & 0xFFFF0000)>>16; 478 ppdu_info->com_info.ppdu_timestamp = 479 HAL_RX_GET(rx_tlv, RX_PPDU_START_2, 480 PPDU_START_TIMESTAMP); 481 ppdu_info->rx_status.ppdu_timestamp = 482 ppdu_info->com_info.ppdu_timestamp; 483 ppdu_info->rx_state = HAL_RX_MON_PPDU_START; 484 485 /* If last ppdu_id doesn't match new ppdu_id, 486 * 1. reset mpdu_cnt 487 * 2. update last_ppdu_id with new 488 * 3. reset mpdu fcs bitmap 489 */ 490 if (com_info->ppdu_id != com_info->last_ppdu_id) { 491 com_info->mpdu_cnt = 0; 492 com_info->last_ppdu_id = 493 com_info->ppdu_id; 494 com_info->num_users = 0; 495 qdf_mem_zero(&com_info->mpdu_fcs_ok_bitmap, 496 HAL_RX_NUM_WORDS_PER_PPDU_BITMAP * 497 sizeof(com_info->mpdu_fcs_ok_bitmap[0])); 498 } 499 break; 500 } 501 502 case WIFIRX_PPDU_START_USER_INFO_E: 503 break; 504 505 case WIFIRX_PPDU_END_E: 506 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 507 "[%s][%d] ppdu_end_e len=%d", 508 __func__, __LINE__, tlv_len); 509 /* This is followed by sub-TLVs of PPDU_END */ 510 ppdu_info->rx_state = HAL_RX_MON_PPDU_END; 511 break; 512 513 case WIFIPHYRX_PKT_END_E: 514 hal_rx_get_rtt_info(hal_soc_hdl, rx_tlv, ppdu_info); 515 break; 516 517 case WIFIRXPCU_PPDU_END_INFO_E: 518 ppdu_info->rx_status.rx_antenna = 519 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_2, RX_ANTENNA); 520 ppdu_info->rx_status.tsft = 521 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_1, 522 WB_TIMESTAMP_UPPER_32); 523 ppdu_info->rx_status.tsft = (ppdu_info->rx_status.tsft << 32) | 524 HAL_RX_GET(rx_tlv, RXPCU_PPDU_END_INFO_0, 525 WB_TIMESTAMP_LOWER_32); 526 ppdu_info->rx_status.duration = 527 HAL_RX_GET(rx_tlv, UNIFIED_RXPCU_PPDU_END_INFO_8, 528 RX_PPDU_DURATION); 529 hal_rx_get_bb_info(hal_soc_hdl, rx_tlv, ppdu_info); 530 break; 531 532 /* 533 * WIFIRX_PPDU_END_USER_STATS_E comes for each user received. 534 * for MU, based on num users we see this tlv that many times. 535 */ 536 case WIFIRX_PPDU_END_USER_STATS_E: 537 { 538 unsigned long tid = 0; 539 uint16_t seq = 0; 540 541 ppdu_info->rx_status.ast_index = 542 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_4, 543 AST_INDEX); 544 545 tid = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_12, 546 RECEIVED_QOS_DATA_TID_BITMAP); 547 ppdu_info->rx_status.tid = qdf_find_first_bit(&tid, sizeof(tid)*8); 548 549 if (ppdu_info->rx_status.tid == (sizeof(tid) * 8)) 550 ppdu_info->rx_status.tid = HAL_TID_INVALID; 551 552 ppdu_info->rx_status.tcp_msdu_count = 553 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9, 554 TCP_MSDU_COUNT) + 555 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10, 556 TCP_ACK_MSDU_COUNT); 557 ppdu_info->rx_status.udp_msdu_count = 558 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_9, 559 UDP_MSDU_COUNT); 560 ppdu_info->rx_status.other_msdu_count = 561 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_10, 562 OTHER_MSDU_COUNT); 563 564 if (ppdu_info->sw_frame_group_id 565 != HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) { 566 ppdu_info->rx_status.frame_control_info_valid = 567 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 568 FRAME_CONTROL_INFO_VALID); 569 570 if (ppdu_info->rx_status.frame_control_info_valid) 571 ppdu_info->rx_status.frame_control = 572 HAL_RX_GET(rx_tlv, 573 RX_PPDU_END_USER_STATS_4, 574 FRAME_CONTROL_FIELD); 575 576 hal_get_qos_control(rx_tlv, ppdu_info); 577 } 578 579 ppdu_info->rx_status.data_sequence_control_info_valid = 580 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 581 DATA_SEQUENCE_CONTROL_INFO_VALID); 582 583 seq = HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_5, 584 FIRST_DATA_SEQ_CTRL); 585 if (ppdu_info->rx_status.data_sequence_control_info_valid) 586 ppdu_info->rx_status.first_data_seq_ctrl = seq; 587 588 ppdu_info->rx_status.preamble_type = 589 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 590 HT_CONTROL_FIELD_PKT_TYPE); 591 switch (ppdu_info->rx_status.preamble_type) { 592 case HAL_RX_PKT_TYPE_11N: 593 ppdu_info->rx_status.ht_flags = 1; 594 ppdu_info->rx_status.rtap_flags |= HT_SGI_PRESENT; 595 break; 596 case HAL_RX_PKT_TYPE_11AC: 597 ppdu_info->rx_status.vht_flags = 1; 598 break; 599 case HAL_RX_PKT_TYPE_11AX: 600 ppdu_info->rx_status.he_flags = 1; 601 break; 602 default: 603 break; 604 } 605 606 ppdu_info->com_info.mpdu_cnt_fcs_ok = 607 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_3, 608 MPDU_CNT_FCS_OK); 609 ppdu_info->com_info.mpdu_cnt_fcs_err = 610 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_2, 611 MPDU_CNT_FCS_ERR); 612 if ((ppdu_info->com_info.mpdu_cnt_fcs_ok | 613 ppdu_info->com_info.mpdu_cnt_fcs_err) > 1) 614 ppdu_info->rx_status.rs_flags |= IEEE80211_AMPDU_FLAG; 615 else 616 ppdu_info->rx_status.rs_flags &= 617 (~IEEE80211_AMPDU_FLAG); 618 619 ppdu_info->com_info.mpdu_fcs_ok_bitmap[0] = 620 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_7, 621 FCS_OK_BITMAP_31_0); 622 623 ppdu_info->com_info.mpdu_fcs_ok_bitmap[1] = 624 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_8, 625 FCS_OK_BITMAP_63_32); 626 627 if (user_id < HAL_MAX_UL_MU_USERS) { 628 mon_rx_user_status = 629 &ppdu_info->rx_user_status[user_id]; 630 631 hal_rx_handle_mu_ul_info(rx_tlv, mon_rx_user_status); 632 633 ppdu_info->com_info.num_users++; 634 635 hal_rx_populate_mu_user_info(rx_tlv, ppdu_info, 636 mon_rx_user_status); 637 638 hal_rx_populate_tx_capture_user_info(ppdu_info, 639 user_id); 640 641 } 642 break; 643 } 644 645 case WIFIRX_PPDU_END_USER_STATS_EXT_E: 646 ppdu_info->com_info.mpdu_fcs_ok_bitmap[2] = 647 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_1, 648 FCS_OK_BITMAP_95_64); 649 650 ppdu_info->com_info.mpdu_fcs_ok_bitmap[3] = 651 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_2, 652 FCS_OK_BITMAP_127_96); 653 654 ppdu_info->com_info.mpdu_fcs_ok_bitmap[4] = 655 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_3, 656 FCS_OK_BITMAP_159_128); 657 658 ppdu_info->com_info.mpdu_fcs_ok_bitmap[5] = 659 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_4, 660 FCS_OK_BITMAP_191_160); 661 662 ppdu_info->com_info.mpdu_fcs_ok_bitmap[6] = 663 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_5, 664 FCS_OK_BITMAP_223_192); 665 666 ppdu_info->com_info.mpdu_fcs_ok_bitmap[7] = 667 HAL_RX_GET(rx_tlv, RX_PPDU_END_USER_STATS_EXT_6, 668 FCS_OK_BITMAP_255_224); 669 break; 670 671 case WIFIRX_PPDU_END_STATUS_DONE_E: 672 return HAL_TLV_STATUS_PPDU_DONE; 673 674 case WIFIDUMMY_E: 675 return HAL_TLV_STATUS_BUF_DONE; 676 677 case WIFIPHYRX_HT_SIG_E: 678 { 679 uint8_t *ht_sig_info = (uint8_t *)rx_tlv + 680 HAL_RX_OFFSET(UNIFIED_PHYRX_HT_SIG_0, 681 HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS); 682 value = HAL_RX_GET(ht_sig_info, HT_SIG_INFO_1, 683 FEC_CODING); 684 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ? 685 1 : 0; 686 ppdu_info->rx_status.mcs = HAL_RX_GET(ht_sig_info, 687 HT_SIG_INFO_0, MCS); 688 ppdu_info->rx_status.ht_mcs = ppdu_info->rx_status.mcs; 689 ppdu_info->rx_status.bw = HAL_RX_GET(ht_sig_info, 690 HT_SIG_INFO_0, CBW); 691 ppdu_info->rx_status.sgi = HAL_RX_GET(ht_sig_info, 692 HT_SIG_INFO_1, SHORT_GI); 693 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 694 ppdu_info->rx_status.nss = ((ppdu_info->rx_status.mcs) >> 695 HT_SIG_SU_NSS_SHIFT) + 1; 696 ppdu_info->rx_status.mcs &= ((1 << HT_SIG_SU_NSS_SHIFT) - 1); 697 break; 698 } 699 700 case WIFIPHYRX_L_SIG_B_E: 701 { 702 uint8_t *l_sig_b_info = (uint8_t *)rx_tlv + 703 HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_B_0, 704 L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS); 705 706 value = HAL_RX_GET(l_sig_b_info, L_SIG_B_INFO_0, RATE); 707 ppdu_info->rx_status.l_sig_b_info = *((uint32_t *)l_sig_b_info); 708 switch (value) { 709 case 1: 710 ppdu_info->rx_status.rate = HAL_11B_RATE_3MCS; 711 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3; 712 break; 713 case 2: 714 ppdu_info->rx_status.rate = HAL_11B_RATE_2MCS; 715 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2; 716 break; 717 case 3: 718 ppdu_info->rx_status.rate = HAL_11B_RATE_1MCS; 719 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1; 720 break; 721 case 4: 722 ppdu_info->rx_status.rate = HAL_11B_RATE_0MCS; 723 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0; 724 break; 725 case 5: 726 ppdu_info->rx_status.rate = HAL_11B_RATE_6MCS; 727 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6; 728 break; 729 case 6: 730 ppdu_info->rx_status.rate = HAL_11B_RATE_5MCS; 731 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5; 732 break; 733 case 7: 734 ppdu_info->rx_status.rate = HAL_11B_RATE_4MCS; 735 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4; 736 break; 737 default: 738 break; 739 } 740 ppdu_info->rx_status.cck_flag = 1; 741 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 742 break; 743 } 744 745 case WIFIPHYRX_L_SIG_A_E: 746 { 747 uint8_t *l_sig_a_info = (uint8_t *)rx_tlv + 748 HAL_RX_OFFSET(UNIFIED_PHYRX_L_SIG_A_0, 749 L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS); 750 751 value = HAL_RX_GET(l_sig_a_info, L_SIG_A_INFO_0, RATE); 752 ppdu_info->rx_status.l_sig_a_info = *((uint32_t *)l_sig_a_info); 753 switch (value) { 754 case 8: 755 ppdu_info->rx_status.rate = HAL_11A_RATE_0MCS; 756 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS0; 757 break; 758 case 9: 759 ppdu_info->rx_status.rate = HAL_11A_RATE_1MCS; 760 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS1; 761 break; 762 case 10: 763 ppdu_info->rx_status.rate = HAL_11A_RATE_2MCS; 764 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS2; 765 break; 766 case 11: 767 ppdu_info->rx_status.rate = HAL_11A_RATE_3MCS; 768 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS3; 769 break; 770 case 12: 771 ppdu_info->rx_status.rate = HAL_11A_RATE_4MCS; 772 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS4; 773 break; 774 case 13: 775 ppdu_info->rx_status.rate = HAL_11A_RATE_5MCS; 776 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS5; 777 break; 778 case 14: 779 ppdu_info->rx_status.rate = HAL_11A_RATE_6MCS; 780 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS6; 781 break; 782 case 15: 783 ppdu_info->rx_status.rate = HAL_11A_RATE_7MCS; 784 ppdu_info->rx_status.mcs = HAL_LEGACY_MCS7; 785 break; 786 default: 787 break; 788 } 789 ppdu_info->rx_status.ofdm_flag = 1; 790 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 791 break; 792 } 793 794 case WIFIPHYRX_VHT_SIG_A_E: 795 { 796 uint8_t *vht_sig_a_info = (uint8_t *)rx_tlv + 797 HAL_RX_OFFSET(UNIFIED_PHYRX_VHT_SIG_A_0, 798 VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS); 799 800 value = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_1, 801 SU_MU_CODING); 802 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ? 803 1 : 0; 804 group_id = HAL_RX_GET(vht_sig_a_info, VHT_SIG_A_INFO_0, GROUP_ID); 805 ppdu_info->rx_status.vht_flag_values5 = group_id; 806 ppdu_info->rx_status.mcs = HAL_RX_GET(vht_sig_a_info, 807 VHT_SIG_A_INFO_1, MCS); 808 ppdu_info->rx_status.sgi = HAL_RX_GET(vht_sig_a_info, 809 VHT_SIG_A_INFO_1, GI_SETTING); 810 811 switch (hal->target_type) { 812 case TARGET_TYPE_QCA8074: 813 case TARGET_TYPE_QCA8074V2: 814 case TARGET_TYPE_QCA6018: 815 case TARGET_TYPE_QCN9000: 816 #ifdef QCA_WIFI_QCA6390 817 case TARGET_TYPE_QCA6390: 818 #endif 819 ppdu_info->rx_status.is_stbc = 820 HAL_RX_GET(vht_sig_a_info, 821 VHT_SIG_A_INFO_0, STBC); 822 value = HAL_RX_GET(vht_sig_a_info, 823 VHT_SIG_A_INFO_0, N_STS); 824 value = value & VHT_SIG_SU_NSS_MASK; 825 if (ppdu_info->rx_status.is_stbc && (value > 0)) 826 value = ((value + 1) >> 1) - 1; 827 ppdu_info->rx_status.nss = 828 ((value & VHT_SIG_SU_NSS_MASK) + 1); 829 830 break; 831 case TARGET_TYPE_QCA6290: 832 #if !defined(QCA_WIFI_QCA6290_11AX) 833 ppdu_info->rx_status.is_stbc = 834 HAL_RX_GET(vht_sig_a_info, 835 VHT_SIG_A_INFO_0, STBC); 836 value = HAL_RX_GET(vht_sig_a_info, 837 VHT_SIG_A_INFO_0, N_STS); 838 value = value & VHT_SIG_SU_NSS_MASK; 839 if (ppdu_info->rx_status.is_stbc && (value > 0)) 840 value = ((value + 1) >> 1) - 1; 841 ppdu_info->rx_status.nss = 842 ((value & VHT_SIG_SU_NSS_MASK) + 1); 843 #else 844 ppdu_info->rx_status.nss = 0; 845 #endif 846 break; 847 case TARGET_TYPE_QCA6490: 848 case TARGET_TYPE_QCA6750: 849 ppdu_info->rx_status.nss = 0; 850 break; 851 default: 852 break; 853 } 854 ppdu_info->rx_status.vht_flag_values3[0] = 855 (((ppdu_info->rx_status.mcs) << 4) 856 | ppdu_info->rx_status.nss); 857 ppdu_info->rx_status.bw = HAL_RX_GET(vht_sig_a_info, 858 VHT_SIG_A_INFO_0, BANDWIDTH); 859 ppdu_info->rx_status.vht_flag_values2 = 860 ppdu_info->rx_status.bw; 861 ppdu_info->rx_status.vht_flag_values4 = 862 HAL_RX_GET(vht_sig_a_info, 863 VHT_SIG_A_INFO_1, SU_MU_CODING); 864 865 ppdu_info->rx_status.beamformed = HAL_RX_GET(vht_sig_a_info, 866 VHT_SIG_A_INFO_1, BEAMFORMED); 867 if (group_id == 0 || group_id == 63) 868 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 869 else 870 ppdu_info->rx_status.reception_type = 871 HAL_RX_TYPE_MU_MIMO; 872 873 break; 874 } 875 case WIFIPHYRX_HE_SIG_A_SU_E: 876 { 877 uint8_t *he_sig_a_su_info = (uint8_t *)rx_tlv + 878 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_SU_0, 879 HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS); 880 ppdu_info->rx_status.he_flags = 1; 881 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, 882 FORMAT_INDICATION); 883 if (value == 0) { 884 ppdu_info->rx_status.he_data1 = 885 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE; 886 } else { 887 ppdu_info->rx_status.he_data1 = 888 QDF_MON_STATUS_HE_SU_FORMAT_TYPE; 889 } 890 891 /* data1 */ 892 ppdu_info->rx_status.he_data1 |= 893 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN | 894 QDF_MON_STATUS_HE_BEAM_CHANGE_KNOWN | 895 QDF_MON_STATUS_HE_DL_UL_KNOWN | 896 QDF_MON_STATUS_HE_MCS_KNOWN | 897 QDF_MON_STATUS_HE_DCM_KNOWN | 898 QDF_MON_STATUS_HE_CODING_KNOWN | 899 QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN | 900 QDF_MON_STATUS_HE_STBC_KNOWN | 901 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN | 902 QDF_MON_STATUS_HE_DOPPLER_KNOWN; 903 904 /* data2 */ 905 ppdu_info->rx_status.he_data2 = 906 QDF_MON_STATUS_HE_GI_KNOWN; 907 ppdu_info->rx_status.he_data2 |= 908 QDF_MON_STATUS_TXBF_KNOWN | 909 QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN | 910 QDF_MON_STATUS_TXOP_KNOWN | 911 QDF_MON_STATUS_LTF_SYMBOLS_KNOWN | 912 QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN | 913 QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN; 914 915 /* data3 */ 916 value = HAL_RX_GET(he_sig_a_su_info, 917 HE_SIG_A_SU_INFO_0, BSS_COLOR_ID); 918 ppdu_info->rx_status.he_data3 = value; 919 value = HAL_RX_GET(he_sig_a_su_info, 920 HE_SIG_A_SU_INFO_0, BEAM_CHANGE); 921 value = value << QDF_MON_STATUS_BEAM_CHANGE_SHIFT; 922 ppdu_info->rx_status.he_data3 |= value; 923 value = HAL_RX_GET(he_sig_a_su_info, 924 HE_SIG_A_SU_INFO_0, DL_UL_FLAG); 925 value = value << QDF_MON_STATUS_DL_UL_SHIFT; 926 ppdu_info->rx_status.he_data3 |= value; 927 928 value = HAL_RX_GET(he_sig_a_su_info, 929 HE_SIG_A_SU_INFO_0, TRANSMIT_MCS); 930 ppdu_info->rx_status.mcs = value; 931 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT; 932 ppdu_info->rx_status.he_data3 |= value; 933 934 value = HAL_RX_GET(he_sig_a_su_info, 935 HE_SIG_A_SU_INFO_0, DCM); 936 he_dcm = value; 937 value = value << QDF_MON_STATUS_DCM_SHIFT; 938 ppdu_info->rx_status.he_data3 |= value; 939 value = HAL_RX_GET(he_sig_a_su_info, 940 HE_SIG_A_SU_INFO_1, CODING); 941 ppdu_info->rx_status.ldpc = (value == HAL_SU_MU_CODING_LDPC) ? 942 1 : 0; 943 value = value << QDF_MON_STATUS_CODING_SHIFT; 944 ppdu_info->rx_status.he_data3 |= value; 945 value = HAL_RX_GET(he_sig_a_su_info, 946 HE_SIG_A_SU_INFO_1, 947 LDPC_EXTRA_SYMBOL); 948 value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT; 949 ppdu_info->rx_status.he_data3 |= value; 950 value = HAL_RX_GET(he_sig_a_su_info, 951 HE_SIG_A_SU_INFO_1, STBC); 952 he_stbc = value; 953 value = value << QDF_MON_STATUS_STBC_SHIFT; 954 ppdu_info->rx_status.he_data3 |= value; 955 956 /* data4 */ 957 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, 958 SPATIAL_REUSE); 959 ppdu_info->rx_status.he_data4 = value; 960 961 /* data5 */ 962 value = HAL_RX_GET(he_sig_a_su_info, 963 HE_SIG_A_SU_INFO_0, TRANSMIT_BW); 964 ppdu_info->rx_status.he_data5 = value; 965 ppdu_info->rx_status.bw = value; 966 value = HAL_RX_GET(he_sig_a_su_info, 967 HE_SIG_A_SU_INFO_0, CP_LTF_SIZE); 968 switch (value) { 969 case 0: 970 he_gi = HE_GI_0_8; 971 he_ltf = HE_LTF_1_X; 972 break; 973 case 1: 974 he_gi = HE_GI_0_8; 975 he_ltf = HE_LTF_2_X; 976 break; 977 case 2: 978 he_gi = HE_GI_1_6; 979 he_ltf = HE_LTF_2_X; 980 break; 981 case 3: 982 if (he_dcm && he_stbc) { 983 he_gi = HE_GI_0_8; 984 he_ltf = HE_LTF_4_X; 985 } else { 986 he_gi = HE_GI_3_2; 987 he_ltf = HE_LTF_4_X; 988 } 989 break; 990 } 991 ppdu_info->rx_status.sgi = he_gi; 992 value = he_gi << QDF_MON_STATUS_GI_SHIFT; 993 ppdu_info->rx_status.he_data5 |= value; 994 value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT; 995 ppdu_info->rx_status.ltf_size = he_ltf; 996 ppdu_info->rx_status.he_data5 |= value; 997 998 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS); 999 value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT); 1000 ppdu_info->rx_status.he_data5 |= value; 1001 1002 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, 1003 PACKET_EXTENSION_A_FACTOR); 1004 value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT; 1005 ppdu_info->rx_status.he_data5 |= value; 1006 1007 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, TXBF); 1008 value = value << QDF_MON_STATUS_TXBF_SHIFT; 1009 ppdu_info->rx_status.he_data5 |= value; 1010 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, 1011 PACKET_EXTENSION_PE_DISAMBIGUITY); 1012 value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT; 1013 ppdu_info->rx_status.he_data5 |= value; 1014 1015 /* data6 */ 1016 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_0, NSTS); 1017 value++; 1018 ppdu_info->rx_status.nss = value; 1019 ppdu_info->rx_status.he_data6 = value; 1020 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, 1021 DOPPLER_INDICATION); 1022 value = value << QDF_MON_STATUS_DOPPLER_SHIFT; 1023 ppdu_info->rx_status.he_data6 |= value; 1024 value = HAL_RX_GET(he_sig_a_su_info, HE_SIG_A_SU_INFO_1, 1025 TXOP_DURATION); 1026 value = value << QDF_MON_STATUS_TXOP_SHIFT; 1027 ppdu_info->rx_status.he_data6 |= value; 1028 1029 ppdu_info->rx_status.beamformed = HAL_RX_GET(he_sig_a_su_info, 1030 HE_SIG_A_SU_INFO_1, TXBF); 1031 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_SU; 1032 break; 1033 } 1034 case WIFIPHYRX_HE_SIG_A_MU_DL_E: 1035 { 1036 uint8_t *he_sig_a_mu_dl_info = (uint8_t *)rx_tlv + 1037 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_A_MU_DL_0, 1038 HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS); 1039 1040 ppdu_info->rx_status.he_mu_flags = 1; 1041 1042 /* HE Flags */ 1043 /*data1*/ 1044 ppdu_info->rx_status.he_data1 = 1045 QDF_MON_STATUS_HE_MU_FORMAT_TYPE; 1046 ppdu_info->rx_status.he_data1 |= 1047 QDF_MON_STATUS_HE_BSS_COLOR_KNOWN | 1048 QDF_MON_STATUS_HE_DL_UL_KNOWN | 1049 QDF_MON_STATUS_HE_LDPC_EXTRA_SYMBOL_KNOWN | 1050 QDF_MON_STATUS_HE_STBC_KNOWN | 1051 QDF_MON_STATUS_HE_DATA_BW_RU_KNOWN | 1052 QDF_MON_STATUS_HE_DOPPLER_KNOWN; 1053 1054 /* data2 */ 1055 ppdu_info->rx_status.he_data2 = 1056 QDF_MON_STATUS_HE_GI_KNOWN; 1057 ppdu_info->rx_status.he_data2 |= 1058 QDF_MON_STATUS_LTF_SYMBOLS_KNOWN | 1059 QDF_MON_STATUS_PRE_FEC_PADDING_KNOWN | 1060 QDF_MON_STATUS_PE_DISAMBIGUITY_KNOWN | 1061 QDF_MON_STATUS_TXOP_KNOWN | 1062 QDF_MON_STATUS_MIDABLE_PERIODICITY_KNOWN; 1063 1064 /*data3*/ 1065 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1066 HE_SIG_A_MU_DL_INFO_0, BSS_COLOR_ID); 1067 ppdu_info->rx_status.he_data3 = value; 1068 1069 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1070 HE_SIG_A_MU_DL_INFO_0, DL_UL_FLAG); 1071 value = value << QDF_MON_STATUS_DL_UL_SHIFT; 1072 ppdu_info->rx_status.he_data3 |= value; 1073 1074 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1075 HE_SIG_A_MU_DL_INFO_1, 1076 LDPC_EXTRA_SYMBOL); 1077 value = value << QDF_MON_STATUS_LDPC_EXTRA_SYMBOL_SHIFT; 1078 ppdu_info->rx_status.he_data3 |= value; 1079 1080 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1081 HE_SIG_A_MU_DL_INFO_1, STBC); 1082 he_stbc = value; 1083 value = value << QDF_MON_STATUS_STBC_SHIFT; 1084 ppdu_info->rx_status.he_data3 |= value; 1085 1086 /*data4*/ 1087 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0, 1088 SPATIAL_REUSE); 1089 ppdu_info->rx_status.he_data4 = value; 1090 1091 /*data5*/ 1092 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1093 HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW); 1094 ppdu_info->rx_status.he_data5 = value; 1095 ppdu_info->rx_status.bw = value; 1096 1097 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1098 HE_SIG_A_MU_DL_INFO_0, CP_LTF_SIZE); 1099 switch (value) { 1100 case 0: 1101 he_gi = HE_GI_0_8; 1102 he_ltf = HE_LTF_4_X; 1103 break; 1104 case 1: 1105 he_gi = HE_GI_0_8; 1106 he_ltf = HE_LTF_2_X; 1107 break; 1108 case 2: 1109 he_gi = HE_GI_1_6; 1110 he_ltf = HE_LTF_2_X; 1111 break; 1112 case 3: 1113 he_gi = HE_GI_3_2; 1114 he_ltf = HE_LTF_4_X; 1115 break; 1116 } 1117 ppdu_info->rx_status.sgi = he_gi; 1118 value = he_gi << QDF_MON_STATUS_GI_SHIFT; 1119 ppdu_info->rx_status.he_data5 |= value; 1120 1121 value = he_ltf << QDF_MON_STATUS_HE_LTF_SIZE_SHIFT; 1122 ppdu_info->rx_status.he_data5 |= value; 1123 1124 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1125 HE_SIG_A_MU_DL_INFO_1, NUM_LTF_SYMBOLS); 1126 value = (value << QDF_MON_STATUS_HE_LTF_SYM_SHIFT); 1127 ppdu_info->rx_status.he_data5 |= value; 1128 1129 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, 1130 PACKET_EXTENSION_A_FACTOR); 1131 value = value << QDF_MON_STATUS_PRE_FEC_PAD_SHIFT; 1132 ppdu_info->rx_status.he_data5 |= value; 1133 1134 1135 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, 1136 PACKET_EXTENSION_PE_DISAMBIGUITY); 1137 value = value << QDF_MON_STATUS_PE_DISAMBIGUITY_SHIFT; 1138 ppdu_info->rx_status.he_data5 |= value; 1139 1140 /*data6*/ 1141 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_0, 1142 DOPPLER_INDICATION); 1143 value = value << QDF_MON_STATUS_DOPPLER_SHIFT; 1144 ppdu_info->rx_status.he_data6 |= value; 1145 1146 value = HAL_RX_GET(he_sig_a_mu_dl_info, HE_SIG_A_MU_DL_INFO_1, 1147 TXOP_DURATION); 1148 value = value << QDF_MON_STATUS_TXOP_SHIFT; 1149 ppdu_info->rx_status.he_data6 |= value; 1150 1151 /* HE-MU Flags */ 1152 /* HE-MU-flags1 */ 1153 ppdu_info->rx_status.he_flags1 = 1154 QDF_MON_STATUS_SIG_B_MCS_KNOWN | 1155 QDF_MON_STATUS_SIG_B_DCM_KNOWN | 1156 QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_1_KNOWN | 1157 QDF_MON_STATUS_SIG_B_SYM_NUM_KNOWN | 1158 QDF_MON_STATUS_RU_0_KNOWN; 1159 1160 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1161 HE_SIG_A_MU_DL_INFO_0, MCS_OF_SIG_B); 1162 ppdu_info->rx_status.he_flags1 |= value; 1163 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1164 HE_SIG_A_MU_DL_INFO_0, DCM_OF_SIG_B); 1165 value = value << QDF_MON_STATUS_DCM_FLAG_1_SHIFT; 1166 ppdu_info->rx_status.he_flags1 |= value; 1167 1168 /* HE-MU-flags2 */ 1169 ppdu_info->rx_status.he_flags2 = 1170 QDF_MON_STATUS_BW_KNOWN; 1171 1172 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1173 HE_SIG_A_MU_DL_INFO_0, TRANSMIT_BW); 1174 ppdu_info->rx_status.he_flags2 |= value; 1175 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1176 HE_SIG_A_MU_DL_INFO_0, COMP_MODE_SIG_B); 1177 value = value << QDF_MON_STATUS_SIG_B_COMPRESSION_FLAG_2_SHIFT; 1178 ppdu_info->rx_status.he_flags2 |= value; 1179 value = HAL_RX_GET(he_sig_a_mu_dl_info, 1180 HE_SIG_A_MU_DL_INFO_0, NUM_SIG_B_SYMBOLS); 1181 value = value - 1; 1182 value = value << QDF_MON_STATUS_NUM_SIG_B_SYMBOLS_SHIFT; 1183 ppdu_info->rx_status.he_flags2 |= value; 1184 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO; 1185 break; 1186 } 1187 case WIFIPHYRX_HE_SIG_B1_MU_E: 1188 { 1189 1190 uint8_t *he_sig_b1_mu_info = (uint8_t *)rx_tlv + 1191 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B1_MU_0, 1192 HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS); 1193 1194 ppdu_info->rx_status.he_sig_b_common_known |= 1195 QDF_MON_STATUS_HE_SIG_B_COMMON_KNOWN_RU0; 1196 /* TODO: Check on the availability of other fields in 1197 * sig_b_common 1198 */ 1199 1200 value = HAL_RX_GET(he_sig_b1_mu_info, 1201 HE_SIG_B1_MU_INFO_0, RU_ALLOCATION); 1202 ppdu_info->rx_status.he_RU[0] = value; 1203 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_MIMO; 1204 break; 1205 } 1206 case WIFIPHYRX_HE_SIG_B2_MU_E: 1207 { 1208 uint8_t *he_sig_b2_mu_info = (uint8_t *)rx_tlv + 1209 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_MU_0, 1210 HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS); 1211 /* 1212 * Not all "HE" fields can be updated from 1213 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E 1214 * to populate rest of the "HE" fields for MU scenarios. 1215 */ 1216 1217 /* HE-data1 */ 1218 ppdu_info->rx_status.he_data1 |= 1219 QDF_MON_STATUS_HE_MCS_KNOWN | 1220 QDF_MON_STATUS_HE_CODING_KNOWN; 1221 1222 /* HE-data2 */ 1223 1224 /* HE-data3 */ 1225 value = HAL_RX_GET(he_sig_b2_mu_info, 1226 HE_SIG_B2_MU_INFO_0, STA_MCS); 1227 ppdu_info->rx_status.mcs = value; 1228 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT; 1229 ppdu_info->rx_status.he_data3 |= value; 1230 1231 1232 value = HAL_RX_GET(he_sig_b2_mu_info, 1233 HE_SIG_B2_MU_INFO_0, STA_CODING); 1234 value = value << QDF_MON_STATUS_CODING_SHIFT; 1235 ppdu_info->rx_status.he_data3 |= value; 1236 1237 /* HE-data4 */ 1238 value = HAL_RX_GET(he_sig_b2_mu_info, 1239 HE_SIG_B2_MU_INFO_0, STA_ID); 1240 value = value << QDF_MON_STATUS_STA_ID_SHIFT; 1241 ppdu_info->rx_status.he_data4 |= value; 1242 1243 /* HE-data5 */ 1244 1245 /* HE-data6 */ 1246 value = HAL_RX_GET(he_sig_b2_mu_info, 1247 HE_SIG_B2_MU_INFO_0, NSTS); 1248 /* value n indicates n+1 spatial streams */ 1249 value++; 1250 ppdu_info->rx_status.nss = value; 1251 ppdu_info->rx_status.he_data6 |= value; 1252 1253 break; 1254 1255 } 1256 case WIFIPHYRX_HE_SIG_B2_OFDMA_E: 1257 { 1258 uint8_t *he_sig_b2_ofdma_info = 1259 (uint8_t *)rx_tlv + 1260 HAL_RX_OFFSET(UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0, 1261 HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS); 1262 1263 /* 1264 * Not all "HE" fields can be updated from 1265 * WIFIPHYRX_HE_SIG_A_MU_DL_E TLV. Use WIFIPHYRX_HE_SIG_B2_MU_E 1266 * to populate rest of "HE" fields for MU OFDMA scenarios. 1267 */ 1268 1269 /* HE-data1 */ 1270 ppdu_info->rx_status.he_data1 |= 1271 QDF_MON_STATUS_HE_MCS_KNOWN | 1272 QDF_MON_STATUS_HE_DCM_KNOWN | 1273 QDF_MON_STATUS_HE_CODING_KNOWN; 1274 1275 /* HE-data2 */ 1276 ppdu_info->rx_status.he_data2 |= 1277 QDF_MON_STATUS_TXBF_KNOWN; 1278 1279 /* HE-data3 */ 1280 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1281 HE_SIG_B2_OFDMA_INFO_0, STA_MCS); 1282 ppdu_info->rx_status.mcs = value; 1283 value = value << QDF_MON_STATUS_TRANSMIT_MCS_SHIFT; 1284 ppdu_info->rx_status.he_data3 |= value; 1285 1286 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1287 HE_SIG_B2_OFDMA_INFO_0, STA_DCM); 1288 he_dcm = value; 1289 value = value << QDF_MON_STATUS_DCM_SHIFT; 1290 ppdu_info->rx_status.he_data3 |= value; 1291 1292 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1293 HE_SIG_B2_OFDMA_INFO_0, STA_CODING); 1294 value = value << QDF_MON_STATUS_CODING_SHIFT; 1295 ppdu_info->rx_status.he_data3 |= value; 1296 1297 /* HE-data4 */ 1298 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1299 HE_SIG_B2_OFDMA_INFO_0, STA_ID); 1300 value = value << QDF_MON_STATUS_STA_ID_SHIFT; 1301 ppdu_info->rx_status.he_data4 |= value; 1302 1303 /* HE-data5 */ 1304 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1305 HE_SIG_B2_OFDMA_INFO_0, TXBF); 1306 value = value << QDF_MON_STATUS_TXBF_SHIFT; 1307 ppdu_info->rx_status.he_data5 |= value; 1308 1309 /* HE-data6 */ 1310 value = HAL_RX_GET(he_sig_b2_ofdma_info, 1311 HE_SIG_B2_OFDMA_INFO_0, NSTS); 1312 /* value n indicates n+1 spatial streams */ 1313 value++; 1314 ppdu_info->rx_status.nss = value; 1315 ppdu_info->rx_status.he_data6 |= value; 1316 ppdu_info->rx_status.reception_type = HAL_RX_TYPE_MU_OFDMA; 1317 break; 1318 } 1319 case WIFIPHYRX_RSSI_LEGACY_E: 1320 { 1321 uint8_t reception_type; 1322 int8_t rssi_value; 1323 uint8_t *rssi_info_tlv = (uint8_t *)rx_tlv + 1324 HAL_RX_OFFSET(UNIFIED_PHYRX_RSSI_LEGACY_19, 1325 RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS); 1326 1327 ppdu_info->rx_status.rssi_comb = HAL_RX_GET(rx_tlv, 1328 PHYRX_RSSI_LEGACY_35, RSSI_COMB); 1329 ppdu_info->rx_status.bw = hal->ops->hal_rx_get_tlv(rx_tlv); 1330 ppdu_info->rx_status.he_re = 0; 1331 1332 reception_type = HAL_RX_GET(rx_tlv, 1333 PHYRX_RSSI_LEGACY_0, 1334 RECEPTION_TYPE); 1335 switch (reception_type) { 1336 case QDF_RECEPTION_TYPE_ULOFMDA: 1337 ppdu_info->rx_status.reception_type = 1338 HAL_RX_TYPE_MU_OFDMA; 1339 ppdu_info->rx_status.ulofdma_flag = 1; 1340 ppdu_info->rx_status.he_data1 = 1341 QDF_MON_STATUS_HE_TRIG_FORMAT_TYPE; 1342 break; 1343 case QDF_RECEPTION_TYPE_ULMIMO: 1344 ppdu_info->rx_status.reception_type = 1345 HAL_RX_TYPE_MU_MIMO; 1346 ppdu_info->rx_status.he_data1 = 1347 QDF_MON_STATUS_HE_MU_FORMAT_TYPE; 1348 break; 1349 default: 1350 ppdu_info->rx_status.reception_type = 1351 HAL_RX_TYPE_SU; 1352 break; 1353 } 1354 hal_rx_update_rssi_chain(ppdu_info, rssi_info_tlv); 1355 rssi_value = HAL_RX_GET(rssi_info_tlv, 1356 RECEIVE_RSSI_INFO_0, RSSI_PRI20_CHAIN0); 1357 ppdu_info->rx_status.rssi[0] = rssi_value; 1358 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1359 "RSSI_PRI20_CHAIN0: %d\n", rssi_value); 1360 1361 rssi_value = HAL_RX_GET(rssi_info_tlv, 1362 RECEIVE_RSSI_INFO_2, RSSI_PRI20_CHAIN1); 1363 ppdu_info->rx_status.rssi[1] = rssi_value; 1364 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1365 "RSSI_PRI20_CHAIN1: %d\n", rssi_value); 1366 1367 rssi_value = HAL_RX_GET(rssi_info_tlv, 1368 RECEIVE_RSSI_INFO_4, RSSI_PRI20_CHAIN2); 1369 ppdu_info->rx_status.rssi[2] = rssi_value; 1370 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1371 "RSSI_PRI20_CHAIN2: %d\n", rssi_value); 1372 1373 rssi_value = HAL_RX_GET(rssi_info_tlv, 1374 RECEIVE_RSSI_INFO_6, RSSI_PRI20_CHAIN3); 1375 ppdu_info->rx_status.rssi[3] = rssi_value; 1376 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1377 "RSSI_PRI20_CHAIN3: %d\n", rssi_value); 1378 1379 rssi_value = HAL_RX_GET(rssi_info_tlv, 1380 RECEIVE_RSSI_INFO_8, RSSI_PRI20_CHAIN4); 1381 ppdu_info->rx_status.rssi[4] = rssi_value; 1382 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1383 "RSSI_PRI20_CHAIN4: %d\n", rssi_value); 1384 1385 rssi_value = HAL_RX_GET(rssi_info_tlv, 1386 RECEIVE_RSSI_INFO_10, 1387 RSSI_PRI20_CHAIN5); 1388 ppdu_info->rx_status.rssi[5] = rssi_value; 1389 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1390 "RSSI_PRI20_CHAIN5: %d\n", rssi_value); 1391 1392 rssi_value = HAL_RX_GET(rssi_info_tlv, 1393 RECEIVE_RSSI_INFO_12, 1394 RSSI_PRI20_CHAIN6); 1395 ppdu_info->rx_status.rssi[6] = rssi_value; 1396 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1397 "RSSI_PRI20_CHAIN6: %d\n", rssi_value); 1398 1399 rssi_value = HAL_RX_GET(rssi_info_tlv, 1400 RECEIVE_RSSI_INFO_14, 1401 RSSI_PRI20_CHAIN7); 1402 ppdu_info->rx_status.rssi[7] = rssi_value; 1403 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1404 "RSSI_PRI20_CHAIN7: %d\n", rssi_value); 1405 break; 1406 } 1407 case WIFIPHYRX_OTHER_RECEIVE_INFO_E: 1408 hal_rx_proc_phyrx_other_receive_info_tlv(hal, rx_tlv_hdr, 1409 ppdu_info); 1410 break; 1411 case WIFIRX_HEADER_E: 1412 { 1413 struct hal_rx_ppdu_common_info *com_info = &ppdu_info->com_info; 1414 uint16_t mpdu_cnt = com_info->mpdu_cnt; 1415 1416 if (mpdu_cnt >= HAL_RX_MAX_MPDU) { 1417 hal_alert("Number of MPDUs per PPDU exceeded"); 1418 break; 1419 } 1420 /* Update first_msdu_payload for every mpdu and increment 1421 * com_info->mpdu_cnt for every WIFIRX_HEADER_E TLV 1422 */ 1423 ppdu_info->ppdu_msdu_info[mpdu_cnt].first_msdu_payload = 1424 rx_tlv; 1425 ppdu_info->ppdu_msdu_info[mpdu_cnt].payload_len = tlv_len; 1426 ppdu_info->ppdu_msdu_info[mpdu_cnt].nbuf = nbuf; 1427 ppdu_info->msdu_info.first_msdu_payload = rx_tlv; 1428 ppdu_info->msdu_info.payload_len = tlv_len; 1429 ppdu_info->user_id = user_id; 1430 ppdu_info->hdr_len = tlv_len; 1431 ppdu_info->data = rx_tlv; 1432 ppdu_info->data += 4; 1433 1434 /* for every RX_HEADER TLV increment mpdu_cnt */ 1435 com_info->mpdu_cnt++; 1436 return HAL_TLV_STATUS_HEADER; 1437 } 1438 case WIFIRX_MPDU_START_E: 1439 { 1440 uint8_t *rx_mpdu_start = 1441 (uint8_t *)rx_tlv + HAL_RX_OFFSET(UNIFIED_RX_MPDU_START_0, 1442 RX_MPDU_INFO_RX_MPDU_INFO_DETAILS); 1443 uint32_t ppdu_id = 1444 HAL_RX_GET_PPDU_ID(rx_mpdu_start); 1445 uint8_t filter_category = 0; 1446 1447 ppdu_info->nac_info.fc_valid = 1448 HAL_RX_GET_FC_VALID(rx_mpdu_start); 1449 1450 ppdu_info->nac_info.to_ds_flag = 1451 HAL_RX_GET_TO_DS_FLAG(rx_mpdu_start); 1452 1453 ppdu_info->nac_info.frame_control = 1454 HAL_RX_GET(rx_mpdu_start, 1455 RX_MPDU_INFO_14, 1456 MPDU_FRAME_CONTROL_FIELD); 1457 1458 ppdu_info->sw_frame_group_id = 1459 HAL_RX_GET_SW_FRAME_GROUP_ID(rx_mpdu_start); 1460 1461 if (ppdu_info->sw_frame_group_id == 1462 HAL_MPDU_SW_FRAME_GROUP_NULL_DATA) { 1463 ppdu_info->rx_status.frame_control_info_valid = 1464 ppdu_info->nac_info.fc_valid; 1465 ppdu_info->rx_status.frame_control = 1466 ppdu_info->nac_info.frame_control; 1467 } 1468 1469 hal_get_mac_addr1(rx_mpdu_start, 1470 ppdu_info); 1471 1472 ppdu_info->nac_info.mac_addr2_valid = 1473 HAL_RX_GET_MAC_ADDR2_VALID(rx_mpdu_start); 1474 1475 *(uint16_t *)&ppdu_info->nac_info.mac_addr2[0] = 1476 HAL_RX_GET(rx_mpdu_start, 1477 RX_MPDU_INFO_16, 1478 MAC_ADDR_AD2_15_0); 1479 1480 *(uint32_t *)&ppdu_info->nac_info.mac_addr2[2] = 1481 HAL_RX_GET(rx_mpdu_start, 1482 RX_MPDU_INFO_17, 1483 MAC_ADDR_AD2_47_16); 1484 1485 if (ppdu_info->rx_status.prev_ppdu_id != ppdu_id) { 1486 ppdu_info->rx_status.prev_ppdu_id = ppdu_id; 1487 ppdu_info->rx_status.ppdu_len = 1488 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13, 1489 MPDU_LENGTH); 1490 } else { 1491 ppdu_info->rx_status.ppdu_len += 1492 HAL_RX_GET(rx_mpdu_start, RX_MPDU_INFO_13, 1493 MPDU_LENGTH); 1494 } 1495 1496 filter_category = 1497 HAL_RX_GET_FILTER_CATEGORY(rx_mpdu_start); 1498 1499 if (filter_category == 0) 1500 ppdu_info->rx_status.rxpcu_filter_pass = 1; 1501 else if (filter_category == 1) 1502 ppdu_info->rx_status.monitor_direct_used = 1; 1503 1504 ppdu_info->nac_info.mcast_bcast = 1505 HAL_RX_GET(rx_mpdu_start, 1506 RX_MPDU_INFO_13, 1507 MCAST_BCAST); 1508 break; 1509 } 1510 case WIFIRX_MPDU_END_E: 1511 ppdu_info->user_id = user_id; 1512 ppdu_info->fcs_err = 1513 HAL_RX_GET(rx_tlv, RX_MPDU_END_1, 1514 FCS_ERR); 1515 return HAL_TLV_STATUS_MPDU_END; 1516 case WIFIRX_MSDU_END_E: 1517 if (user_id < HAL_MAX_UL_MU_USERS) { 1518 ppdu_info->rx_msdu_info[user_id].cce_metadata = 1519 HAL_RX_MSDU_END_CCE_METADATA_GET(rx_tlv); 1520 ppdu_info->rx_msdu_info[user_id].fse_metadata = 1521 HAL_RX_MSDU_END_FSE_METADATA_GET(rx_tlv); 1522 ppdu_info->rx_msdu_info[user_id].is_flow_idx_timeout = 1523 HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(rx_tlv); 1524 ppdu_info->rx_msdu_info[user_id].is_flow_idx_invalid = 1525 HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(rx_tlv); 1526 ppdu_info->rx_msdu_info[user_id].flow_idx = 1527 HAL_RX_MSDU_END_FLOW_IDX_GET(rx_tlv); 1528 } 1529 return HAL_TLV_STATUS_MSDU_END; 1530 case 0: 1531 return HAL_TLV_STATUS_PPDU_DONE; 1532 1533 default: 1534 if (hal_rx_handle_other_tlvs(tlv_tag, rx_tlv, ppdu_info)) 1535 unhandled = false; 1536 else 1537 unhandled = true; 1538 break; 1539 } 1540 1541 if (!unhandled) 1542 QDF_TRACE(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1543 "%s TLV type: %d, TLV len:%d %s", 1544 __func__, tlv_tag, tlv_len, 1545 unhandled == true ? "unhandled" : ""); 1546 1547 qdf_trace_hex_dump(QDF_MODULE_ID_DP, QDF_TRACE_LEVEL_DEBUG, 1548 rx_tlv, tlv_len); 1549 1550 return HAL_TLV_STATUS_PPDU_NOT_DONE; 1551 } 1552 1553 /** 1554 * hal_reo_setup - Initialize HW REO block 1555 * 1556 * @hal_soc: Opaque HAL SOC handle 1557 * @reo_params: parameters needed by HAL for REO config 1558 */ 1559 static void hal_reo_setup_generic(struct hal_soc *soc, 1560 void *reoparams) 1561 { 1562 uint32_t reg_val; 1563 struct hal_reo_params *reo_params = (struct hal_reo_params *)reoparams; 1564 1565 reg_val = HAL_REG_READ(soc, HWIO_REO_R0_GENERAL_ENABLE_ADDR( 1566 SEQ_WCSS_UMAC_REO_REG_OFFSET)); 1567 1568 hal_reo_config(soc, reg_val, reo_params); 1569 /* Other ring enable bits and REO_ENABLE will be set by FW */ 1570 1571 /* TODO: Setup destination ring mapping if enabled */ 1572 1573 /* TODO: Error destination ring setting is left to default. 1574 * Default setting is to send all errors to release ring. 1575 */ 1576 1577 HAL_REG_WRITE(soc, 1578 HWIO_REO_R0_AGING_THRESHOLD_IX_0_ADDR( 1579 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1580 HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000); 1581 1582 HAL_REG_WRITE(soc, 1583 HWIO_REO_R0_AGING_THRESHOLD_IX_1_ADDR( 1584 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1585 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000)); 1586 1587 HAL_REG_WRITE(soc, 1588 HWIO_REO_R0_AGING_THRESHOLD_IX_2_ADDR( 1589 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1590 (HAL_DEFAULT_BE_BK_VI_REO_TIMEOUT_MS * 1000)); 1591 1592 HAL_REG_WRITE(soc, 1593 HWIO_REO_R0_AGING_THRESHOLD_IX_3_ADDR( 1594 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1595 (HAL_DEFAULT_VO_REO_TIMEOUT_MS * 1000)); 1596 1597 /* 1598 * When hash based routing is enabled, routing of the rx packet 1599 * is done based on the following value: 1 _ _ _ _ The last 4 1600 * bits are based on hash[3:0]. This means the possible values 1601 * are 0x10 to 0x1f. This value is used to look-up the 1602 * ring ID configured in Destination_Ring_Ctrl_IX_* register. 1603 * The Destination_Ring_Ctrl_IX_2 and Destination_Ring_Ctrl_IX_3 1604 * registers need to be configured to set-up the 16 entries to 1605 * map the hash values to a ring number. There are 3 bits per 1606 * hash entry which are mapped as follows: 1607 * 0: TCL, 1:SW1, 2:SW2, * 3:SW3, 4:SW4, 5:Release, 6:FW(WIFI), 1608 * 7: NOT_USED. 1609 */ 1610 if (reo_params->rx_hash_enabled) { 1611 HAL_REG_WRITE(soc, 1612 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR( 1613 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1614 reo_params->remap1); 1615 1616 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR 0x%x", 1617 HAL_REG_READ(soc, 1618 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_2_ADDR( 1619 SEQ_WCSS_UMAC_REO_REG_OFFSET))); 1620 1621 HAL_REG_WRITE(soc, 1622 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR( 1623 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1624 reo_params->remap2); 1625 1626 hal_debug("HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR 0x%x", 1627 HAL_REG_READ(soc, 1628 HWIO_REO_R0_DESTINATION_RING_CTRL_IX_3_ADDR( 1629 SEQ_WCSS_UMAC_REO_REG_OFFSET))); 1630 } 1631 1632 1633 /* TODO: Check if the following registers shoould be setup by host: 1634 * AGING_CONTROL 1635 * HIGH_MEMORY_THRESHOLD 1636 * GLOBAL_LINK_DESC_COUNT_THRESH_IX_0[1,2] 1637 * GLOBAL_LINK_DESC_COUNT_CTRL 1638 */ 1639 } 1640 1641 /** 1642 * hal_get_hw_hptp_generic() - Get HW head and tail pointer value for any ring 1643 * @hal_soc: Opaque HAL SOC handle 1644 * @hal_ring: Source ring pointer 1645 * @headp: Head Pointer 1646 * @tailp: Tail Pointer 1647 * @ring: Ring type 1648 * 1649 * Return: Update tail pointer and head pointer in arguments. 1650 */ 1651 static inline 1652 void hal_get_hw_hptp_generic(struct hal_soc *hal_soc, 1653 hal_ring_handle_t hal_ring_hdl, 1654 uint32_t *headp, uint32_t *tailp, 1655 uint8_t ring) 1656 { 1657 struct hal_srng *srng = (struct hal_srng *)hal_ring_hdl; 1658 struct hal_hw_srng_config *ring_config; 1659 enum hal_ring_type ring_type = (enum hal_ring_type)ring; 1660 1661 if (!hal_soc || !srng) { 1662 QDF_TRACE(QDF_MODULE_ID_HAL, QDF_TRACE_LEVEL_ERROR, 1663 "%s: Context is Null", __func__); 1664 return; 1665 } 1666 1667 ring_config = HAL_SRNG_CONFIG(hal_soc, ring_type); 1668 if (!ring_config->lmac_ring) { 1669 if (srng->ring_dir == HAL_SRNG_SRC_RING) { 1670 *headp = SRNG_SRC_REG_READ(srng, HP); 1671 *tailp = SRNG_SRC_REG_READ(srng, TP); 1672 } else { 1673 *headp = SRNG_DST_REG_READ(srng, HP); 1674 *tailp = SRNG_DST_REG_READ(srng, TP); 1675 } 1676 } 1677 } 1678 1679 /** 1680 * hal_srng_src_hw_init - Private function to initialize SRNG 1681 * source ring HW 1682 * @hal_soc: HAL SOC handle 1683 * @srng: SRNG ring pointer 1684 */ 1685 static inline 1686 void hal_srng_src_hw_init_generic(struct hal_soc *hal, 1687 struct hal_srng *srng) 1688 { 1689 uint32_t reg_val = 0; 1690 uint64_t tp_addr = 0; 1691 1692 hal_debug("hw_init srng %d", srng->ring_id); 1693 1694 if (srng->flags & HAL_SRNG_MSI_INTR) { 1695 SRNG_SRC_REG_WRITE(srng, MSI1_BASE_LSB, 1696 srng->msi_addr & 0xffffffff); 1697 reg_val = SRNG_SM(SRNG_SRC_FLD(MSI1_BASE_MSB, ADDR), 1698 (uint64_t)(srng->msi_addr) >> 32) | 1699 SRNG_SM(SRNG_SRC_FLD(MSI1_BASE_MSB, 1700 MSI1_ENABLE), 1); 1701 SRNG_SRC_REG_WRITE(srng, MSI1_BASE_MSB, reg_val); 1702 SRNG_SRC_REG_WRITE(srng, MSI1_DATA, srng->msi_data); 1703 } 1704 1705 SRNG_SRC_REG_WRITE(srng, BASE_LSB, srng->ring_base_paddr & 0xffffffff); 1706 reg_val = SRNG_SM(SRNG_SRC_FLD(BASE_MSB, RING_BASE_ADDR_MSB), 1707 ((uint64_t)(srng->ring_base_paddr) >> 32)) | 1708 SRNG_SM(SRNG_SRC_FLD(BASE_MSB, RING_SIZE), 1709 srng->entry_size * srng->num_entries); 1710 SRNG_SRC_REG_WRITE(srng, BASE_MSB, reg_val); 1711 1712 reg_val = SRNG_SM(SRNG_SRC_FLD(ID, ENTRY_SIZE), srng->entry_size); 1713 SRNG_SRC_REG_WRITE(srng, ID, reg_val); 1714 1715 /** 1716 * Interrupt setup: 1717 * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE 1718 * if level mode is required 1719 */ 1720 reg_val = 0; 1721 1722 /* 1723 * WAR - Hawkeye v1 has a hardware bug which requires timer value to be 1724 * programmed in terms of 1us resolution instead of 8us resolution as 1725 * given in MLD. 1726 */ 1727 if (srng->intr_timer_thres_us) { 1728 reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX0, 1729 INTERRUPT_TIMER_THRESHOLD), 1730 srng->intr_timer_thres_us); 1731 /* For HK v2 this should be (srng->intr_timer_thres_us >> 3) */ 1732 } 1733 1734 if (srng->intr_batch_cntr_thres_entries) { 1735 reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX0, 1736 BATCH_COUNTER_THRESHOLD), 1737 srng->intr_batch_cntr_thres_entries * 1738 srng->entry_size); 1739 } 1740 SRNG_SRC_REG_WRITE(srng, CONSUMER_INT_SETUP_IX0, reg_val); 1741 1742 reg_val = 0; 1743 if (srng->flags & HAL_SRNG_LOW_THRES_INTR_ENABLE) { 1744 reg_val |= SRNG_SM(SRNG_SRC_FLD(CONSUMER_INT_SETUP_IX1, 1745 LOW_THRESHOLD), srng->u.src_ring.low_threshold); 1746 } 1747 1748 SRNG_SRC_REG_WRITE(srng, CONSUMER_INT_SETUP_IX1, reg_val); 1749 1750 /* As per HW team, TP_ADDR and HP_ADDR for Idle link ring should 1751 * remain 0 to avoid some WBM stability issues. Remote head/tail 1752 * pointers are not required since this ring is completely managed 1753 * by WBM HW 1754 */ 1755 reg_val = 0; 1756 if (srng->ring_id != HAL_SRNG_WBM_IDLE_LINK) { 1757 tp_addr = (uint64_t)(hal->shadow_rdptr_mem_paddr + 1758 ((unsigned long)(srng->u.src_ring.tp_addr) - 1759 (unsigned long)(hal->shadow_rdptr_mem_vaddr))); 1760 SRNG_SRC_REG_WRITE(srng, TP_ADDR_LSB, tp_addr & 0xffffffff); 1761 SRNG_SRC_REG_WRITE(srng, TP_ADDR_MSB, tp_addr >> 32); 1762 } else { 1763 reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, RING_ID_DISABLE), 1); 1764 } 1765 1766 /* Initilaize head and tail pointers to indicate ring is empty */ 1767 SRNG_SRC_REG_WRITE(srng, HP, 0); 1768 SRNG_SRC_REG_WRITE(srng, TP, 0); 1769 *(srng->u.src_ring.tp_addr) = 0; 1770 1771 reg_val |= ((srng->flags & HAL_SRNG_DATA_TLV_SWAP) ? 1772 SRNG_SM(SRNG_SRC_FLD(MISC, DATA_TLV_SWAP_BIT), 1) : 0) | 1773 ((srng->flags & HAL_SRNG_RING_PTR_SWAP) ? 1774 SRNG_SM(SRNG_SRC_FLD(MISC, HOST_FW_SWAP_BIT), 1) : 0) | 1775 ((srng->flags & HAL_SRNG_MSI_SWAP) ? 1776 SRNG_SM(SRNG_SRC_FLD(MISC, MSI_SWAP_BIT), 1) : 0); 1777 1778 /* Loop count is not used for SRC rings */ 1779 reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, LOOPCNT_DISABLE), 1); 1780 1781 /* 1782 * reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, SRNG_ENABLE), 1); 1783 * todo: update fw_api and replace with above line 1784 * (when SRNG_ENABLE field for the MISC register is available in fw_api) 1785 * (WCSS_UMAC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_MISC) 1786 */ 1787 reg_val |= 0x40; 1788 1789 SRNG_SRC_REG_WRITE(srng, MISC, reg_val); 1790 } 1791 1792 /** 1793 * hal_srng_dst_hw_init - Private function to initialize SRNG 1794 * destination ring HW 1795 * @hal_soc: HAL SOC handle 1796 * @srng: SRNG ring pointer 1797 */ 1798 static inline 1799 void hal_srng_dst_hw_init_generic(struct hal_soc *hal, 1800 struct hal_srng *srng) 1801 { 1802 uint32_t reg_val = 0; 1803 uint64_t hp_addr = 0; 1804 1805 hal_debug("hw_init srng %d", srng->ring_id); 1806 1807 if (srng->flags & HAL_SRNG_MSI_INTR) { 1808 SRNG_DST_REG_WRITE(srng, MSI1_BASE_LSB, 1809 srng->msi_addr & 0xffffffff); 1810 reg_val = SRNG_SM(SRNG_DST_FLD(MSI1_BASE_MSB, ADDR), 1811 (uint64_t)(srng->msi_addr) >> 32) | 1812 SRNG_SM(SRNG_DST_FLD(MSI1_BASE_MSB, 1813 MSI1_ENABLE), 1); 1814 SRNG_DST_REG_WRITE(srng, MSI1_BASE_MSB, reg_val); 1815 SRNG_DST_REG_WRITE(srng, MSI1_DATA, srng->msi_data); 1816 } 1817 1818 SRNG_DST_REG_WRITE(srng, BASE_LSB, srng->ring_base_paddr & 0xffffffff); 1819 reg_val = SRNG_SM(SRNG_DST_FLD(BASE_MSB, RING_BASE_ADDR_MSB), 1820 ((uint64_t)(srng->ring_base_paddr) >> 32)) | 1821 SRNG_SM(SRNG_DST_FLD(BASE_MSB, RING_SIZE), 1822 srng->entry_size * srng->num_entries); 1823 SRNG_DST_REG_WRITE(srng, BASE_MSB, reg_val); 1824 1825 reg_val = SRNG_SM(SRNG_DST_FLD(ID, RING_ID), srng->ring_id) | 1826 SRNG_SM(SRNG_DST_FLD(ID, ENTRY_SIZE), srng->entry_size); 1827 SRNG_DST_REG_WRITE(srng, ID, reg_val); 1828 1829 1830 /** 1831 * Interrupt setup: 1832 * Default interrupt mode is 'pulse'. Need to setup SW_INTERRUPT_MODE 1833 * if level mode is required 1834 */ 1835 reg_val = 0; 1836 if (srng->intr_timer_thres_us) { 1837 reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT_SETUP, 1838 INTERRUPT_TIMER_THRESHOLD), 1839 srng->intr_timer_thres_us >> 3); 1840 } 1841 1842 if (srng->intr_batch_cntr_thres_entries) { 1843 reg_val |= SRNG_SM(SRNG_DST_FLD(PRODUCER_INT_SETUP, 1844 BATCH_COUNTER_THRESHOLD), 1845 srng->intr_batch_cntr_thres_entries * 1846 srng->entry_size); 1847 } 1848 1849 SRNG_DST_REG_WRITE(srng, PRODUCER_INT_SETUP, reg_val); 1850 hp_addr = (uint64_t)(hal->shadow_rdptr_mem_paddr + 1851 ((unsigned long)(srng->u.dst_ring.hp_addr) - 1852 (unsigned long)(hal->shadow_rdptr_mem_vaddr))); 1853 SRNG_DST_REG_WRITE(srng, HP_ADDR_LSB, hp_addr & 0xffffffff); 1854 SRNG_DST_REG_WRITE(srng, HP_ADDR_MSB, hp_addr >> 32); 1855 1856 /* Initilaize head and tail pointers to indicate ring is empty */ 1857 SRNG_DST_REG_WRITE(srng, HP, 0); 1858 SRNG_DST_REG_WRITE(srng, TP, 0); 1859 *(srng->u.dst_ring.hp_addr) = 0; 1860 1861 reg_val = ((srng->flags & HAL_SRNG_DATA_TLV_SWAP) ? 1862 SRNG_SM(SRNG_DST_FLD(MISC, DATA_TLV_SWAP_BIT), 1) : 0) | 1863 ((srng->flags & HAL_SRNG_RING_PTR_SWAP) ? 1864 SRNG_SM(SRNG_DST_FLD(MISC, HOST_FW_SWAP_BIT), 1) : 0) | 1865 ((srng->flags & HAL_SRNG_MSI_SWAP) ? 1866 SRNG_SM(SRNG_DST_FLD(MISC, MSI_SWAP_BIT), 1) : 0); 1867 1868 /* 1869 * reg_val |= SRNG_SM(SRNG_SRC_FLD(MISC, SRNG_ENABLE), 1); 1870 * todo: update fw_api and replace with above line 1871 * (when SRNG_ENABLE field for the MISC register is available in fw_api) 1872 * (WCSS_UMAC_CE_0_SRC_WFSS_CE_CHANNEL_SRC_R0_SRC_RING_MISC) 1873 */ 1874 reg_val |= 0x40; 1875 1876 SRNG_DST_REG_WRITE(srng, MISC, reg_val); 1877 1878 } 1879 1880 #define HAL_RX_WBM_ERR_SRC_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \ 1881 (WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_OFFSET >> 2))) & \ 1882 WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_MASK) >> \ 1883 WBM_RELEASE_RING_2_RELEASE_SOURCE_MODULE_LSB) 1884 1885 #define HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \ 1886 (WBM_RELEASE_RING_2_REO_PUSH_REASON_OFFSET >> 2))) & \ 1887 WBM_RELEASE_RING_2_REO_PUSH_REASON_MASK) >> \ 1888 WBM_RELEASE_RING_2_REO_PUSH_REASON_LSB) 1889 1890 #define HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc) (((*(((uint32_t *) wbm_desc)+ \ 1891 (WBM_RELEASE_RING_2_REO_ERROR_CODE_OFFSET >> 2))) & \ 1892 WBM_RELEASE_RING_2_REO_ERROR_CODE_MASK) >> \ 1893 WBM_RELEASE_RING_2_REO_ERROR_CODE_LSB) 1894 1895 #define HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc) \ 1896 (((*(((uint32_t *) wbm_desc) + \ 1897 (WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_OFFSET >> 2))) & \ 1898 WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_MASK) >> \ 1899 WBM_RELEASE_RING_2_RXDMA_PUSH_REASON_LSB) 1900 1901 #define HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc) \ 1902 (((*(((uint32_t *) wbm_desc) + \ 1903 (WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_OFFSET >> 2))) & \ 1904 WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_MASK) >> \ 1905 WBM_RELEASE_RING_2_RXDMA_ERROR_CODE_LSB) 1906 1907 /** 1908 * hal_rx_wbm_err_info_get_generic(): Retrieves WBM error code and reason and 1909 * save it to hal_wbm_err_desc_info structure passed by caller 1910 * @wbm_desc: wbm ring descriptor 1911 * @wbm_er_info1: hal_wbm_err_desc_info structure, output parameter. 1912 * Return: void 1913 */ 1914 static inline void hal_rx_wbm_err_info_get_generic(void *wbm_desc, 1915 void *wbm_er_info1) 1916 { 1917 struct hal_wbm_err_desc_info *wbm_er_info = 1918 (struct hal_wbm_err_desc_info *)wbm_er_info1; 1919 1920 wbm_er_info->wbm_err_src = HAL_RX_WBM_ERR_SRC_GET(wbm_desc); 1921 wbm_er_info->reo_psh_rsn = HAL_RX_WBM_REO_PUSH_REASON_GET(wbm_desc); 1922 wbm_er_info->reo_err_code = HAL_RX_WBM_REO_ERROR_CODE_GET(wbm_desc); 1923 wbm_er_info->rxdma_psh_rsn = HAL_RX_WBM_RXDMA_PUSH_REASON_GET(wbm_desc); 1924 wbm_er_info->rxdma_err_code = HAL_RX_WBM_RXDMA_ERROR_CODE_GET(wbm_desc); 1925 } 1926 1927 /** 1928 * hal_tx_comp_get_release_reason_generic() - TQM Release reason 1929 * @hal_desc: completion ring descriptor pointer 1930 * 1931 * This function will return the type of pointer - buffer or descriptor 1932 * 1933 * Return: buffer type 1934 */ 1935 static inline uint8_t hal_tx_comp_get_release_reason_generic(void *hal_desc) 1936 { 1937 uint32_t comp_desc = 1938 *(uint32_t *) (((uint8_t *) hal_desc) + 1939 WBM_RELEASE_RING_2_TQM_RELEASE_REASON_OFFSET); 1940 1941 return (comp_desc & WBM_RELEASE_RING_2_TQM_RELEASE_REASON_MASK) >> 1942 WBM_RELEASE_RING_2_TQM_RELEASE_REASON_LSB; 1943 } 1944 1945 /** 1946 * hal_get_wbm_internal_error_generic() - is WBM internal error 1947 * @hal_desc: completion ring descriptor pointer 1948 * 1949 * This function will return 0 or 1 - is it WBM internal error or not 1950 * 1951 * Return: uint8_t 1952 */ 1953 static inline uint8_t hal_get_wbm_internal_error_generic(void *hal_desc) 1954 { 1955 uint32_t comp_desc = 1956 *(uint32_t *)(((uint8_t *)hal_desc) + 1957 WBM_RELEASE_RING_2_WBM_INTERNAL_ERROR_OFFSET); 1958 1959 return (comp_desc & WBM_RELEASE_RING_2_WBM_INTERNAL_ERROR_MASK) >> 1960 WBM_RELEASE_RING_2_WBM_INTERNAL_ERROR_LSB; 1961 } 1962 1963 /** 1964 * hal_rx_dump_mpdu_start_tlv_generic: dump RX mpdu_start TLV in structured 1965 * human readable format. 1966 * @mpdu_start: pointer the rx_attention TLV in pkt. 1967 * @dbg_level: log level. 1968 * 1969 * Return: void 1970 */ 1971 static inline void hal_rx_dump_mpdu_start_tlv_generic(void *mpdustart, 1972 uint8_t dbg_level) 1973 { 1974 struct rx_mpdu_start *mpdu_start = (struct rx_mpdu_start *)mpdustart; 1975 struct rx_mpdu_info *mpdu_info = 1976 (struct rx_mpdu_info *)&mpdu_start->rx_mpdu_info_details; 1977 1978 hal_verbose_debug( 1979 "rx_mpdu_start tlv (1/5) - " 1980 "rxpcu_mpdu_filter_in_category: %x " 1981 "sw_frame_group_id: %x " 1982 "ndp_frame: %x " 1983 "phy_err: %x " 1984 "phy_err_during_mpdu_header: %x " 1985 "protocol_version_err: %x " 1986 "ast_based_lookup_valid: %x " 1987 "phy_ppdu_id: %x " 1988 "ast_index: %x " 1989 "sw_peer_id: %x " 1990 "mpdu_frame_control_valid: %x " 1991 "mpdu_duration_valid: %x " 1992 "mac_addr_ad1_valid: %x " 1993 "mac_addr_ad2_valid: %x " 1994 "mac_addr_ad3_valid: %x " 1995 "mac_addr_ad4_valid: %x " 1996 "mpdu_sequence_control_valid: %x " 1997 "mpdu_qos_control_valid: %x " 1998 "mpdu_ht_control_valid: %x " 1999 "frame_encryption_info_valid: %x ", 2000 mpdu_info->rxpcu_mpdu_filter_in_category, 2001 mpdu_info->sw_frame_group_id, 2002 mpdu_info->ndp_frame, 2003 mpdu_info->phy_err, 2004 mpdu_info->phy_err_during_mpdu_header, 2005 mpdu_info->protocol_version_err, 2006 mpdu_info->ast_based_lookup_valid, 2007 mpdu_info->phy_ppdu_id, 2008 mpdu_info->ast_index, 2009 mpdu_info->sw_peer_id, 2010 mpdu_info->mpdu_frame_control_valid, 2011 mpdu_info->mpdu_duration_valid, 2012 mpdu_info->mac_addr_ad1_valid, 2013 mpdu_info->mac_addr_ad2_valid, 2014 mpdu_info->mac_addr_ad3_valid, 2015 mpdu_info->mac_addr_ad4_valid, 2016 mpdu_info->mpdu_sequence_control_valid, 2017 mpdu_info->mpdu_qos_control_valid, 2018 mpdu_info->mpdu_ht_control_valid, 2019 mpdu_info->frame_encryption_info_valid); 2020 2021 hal_verbose_debug( 2022 "rx_mpdu_start tlv (2/5) - " 2023 "fr_ds: %x " 2024 "to_ds: %x " 2025 "encrypted: %x " 2026 "mpdu_retry: %x " 2027 "mpdu_sequence_number: %x " 2028 "epd_en: %x " 2029 "all_frames_shall_be_encrypted: %x " 2030 "encrypt_type: %x " 2031 "mesh_sta: %x " 2032 "bssid_hit: %x " 2033 "bssid_number: %x " 2034 "tid: %x " 2035 "pn_31_0: %x " 2036 "pn_63_32: %x " 2037 "pn_95_64: %x " 2038 "pn_127_96: %x " 2039 "peer_meta_data: %x " 2040 "rxpt_classify_info.reo_destination_indication: %x " 2041 "rxpt_classify_info.use_flow_id_toeplitz_clfy: %x " 2042 "rx_reo_queue_desc_addr_31_0: %x ", 2043 mpdu_info->fr_ds, 2044 mpdu_info->to_ds, 2045 mpdu_info->encrypted, 2046 mpdu_info->mpdu_retry, 2047 mpdu_info->mpdu_sequence_number, 2048 mpdu_info->epd_en, 2049 mpdu_info->all_frames_shall_be_encrypted, 2050 mpdu_info->encrypt_type, 2051 mpdu_info->mesh_sta, 2052 mpdu_info->bssid_hit, 2053 mpdu_info->bssid_number, 2054 mpdu_info->tid, 2055 mpdu_info->pn_31_0, 2056 mpdu_info->pn_63_32, 2057 mpdu_info->pn_95_64, 2058 mpdu_info->pn_127_96, 2059 mpdu_info->peer_meta_data, 2060 mpdu_info->rxpt_classify_info_details.reo_destination_indication, 2061 mpdu_info->rxpt_classify_info_details.use_flow_id_toeplitz_clfy, 2062 mpdu_info->rx_reo_queue_desc_addr_31_0); 2063 2064 hal_verbose_debug( 2065 "rx_mpdu_start tlv (3/5) - " 2066 "rx_reo_queue_desc_addr_39_32: %x " 2067 "receive_queue_number: %x " 2068 "pre_delim_err_warning: %x " 2069 "first_delim_err: %x " 2070 "key_id_octet: %x " 2071 "new_peer_entry: %x " 2072 "decrypt_needed: %x " 2073 "decap_type: %x " 2074 "rx_insert_vlan_c_tag_padding: %x " 2075 "rx_insert_vlan_s_tag_padding: %x " 2076 "strip_vlan_c_tag_decap: %x " 2077 "strip_vlan_s_tag_decap: %x " 2078 "pre_delim_count: %x " 2079 "ampdu_flag: %x " 2080 "bar_frame: %x " 2081 "mpdu_length: %x " 2082 "first_mpdu: %x " 2083 "mcast_bcast: %x " 2084 "ast_index_not_found: %x " 2085 "ast_index_timeout: %x ", 2086 mpdu_info->rx_reo_queue_desc_addr_39_32, 2087 mpdu_info->receive_queue_number, 2088 mpdu_info->pre_delim_err_warning, 2089 mpdu_info->first_delim_err, 2090 mpdu_info->key_id_octet, 2091 mpdu_info->new_peer_entry, 2092 mpdu_info->decrypt_needed, 2093 mpdu_info->decap_type, 2094 mpdu_info->rx_insert_vlan_c_tag_padding, 2095 mpdu_info->rx_insert_vlan_s_tag_padding, 2096 mpdu_info->strip_vlan_c_tag_decap, 2097 mpdu_info->strip_vlan_s_tag_decap, 2098 mpdu_info->pre_delim_count, 2099 mpdu_info->ampdu_flag, 2100 mpdu_info->bar_frame, 2101 mpdu_info->mpdu_length, 2102 mpdu_info->first_mpdu, 2103 mpdu_info->mcast_bcast, 2104 mpdu_info->ast_index_not_found, 2105 mpdu_info->ast_index_timeout); 2106 2107 hal_verbose_debug( 2108 "rx_mpdu_start tlv (4/5) - " 2109 "power_mgmt: %x " 2110 "non_qos: %x " 2111 "null_data: %x " 2112 "mgmt_type: %x " 2113 "ctrl_type: %x " 2114 "more_data: %x " 2115 "eosp: %x " 2116 "fragment_flag: %x " 2117 "order: %x " 2118 "u_apsd_trigger: %x " 2119 "encrypt_required: %x " 2120 "directed: %x " 2121 "mpdu_frame_control_field: %x " 2122 "mpdu_duration_field: %x " 2123 "mac_addr_ad1_31_0: %x " 2124 "mac_addr_ad1_47_32: %x " 2125 "mac_addr_ad2_15_0: %x " 2126 "mac_addr_ad2_47_16: %x " 2127 "mac_addr_ad3_31_0: %x " 2128 "mac_addr_ad3_47_32: %x ", 2129 mpdu_info->power_mgmt, 2130 mpdu_info->non_qos, 2131 mpdu_info->null_data, 2132 mpdu_info->mgmt_type, 2133 mpdu_info->ctrl_type, 2134 mpdu_info->more_data, 2135 mpdu_info->eosp, 2136 mpdu_info->fragment_flag, 2137 mpdu_info->order, 2138 mpdu_info->u_apsd_trigger, 2139 mpdu_info->encrypt_required, 2140 mpdu_info->directed, 2141 mpdu_info->mpdu_frame_control_field, 2142 mpdu_info->mpdu_duration_field, 2143 mpdu_info->mac_addr_ad1_31_0, 2144 mpdu_info->mac_addr_ad1_47_32, 2145 mpdu_info->mac_addr_ad2_15_0, 2146 mpdu_info->mac_addr_ad2_47_16, 2147 mpdu_info->mac_addr_ad3_31_0, 2148 mpdu_info->mac_addr_ad3_47_32); 2149 2150 hal_verbose_debug( 2151 "rx_mpdu_start tlv (5/5) - " 2152 "mpdu_sequence_control_field: %x " 2153 "mac_addr_ad4_31_0: %x " 2154 "mac_addr_ad4_47_32: %x " 2155 "mpdu_qos_control_field: %x " 2156 "mpdu_ht_control_field: %x ", 2157 mpdu_info->mpdu_sequence_control_field, 2158 mpdu_info->mac_addr_ad4_31_0, 2159 mpdu_info->mac_addr_ad4_47_32, 2160 mpdu_info->mpdu_qos_control_field, 2161 mpdu_info->mpdu_ht_control_field); 2162 } 2163 2164 /** 2165 * hal_tx_desc_set_search_type - Set the search type value 2166 * @desc: Handle to Tx Descriptor 2167 * @search_type: search type 2168 * 0 – Normal search 2169 * 1 – Index based address search 2170 * 2 – Index based flow search 2171 * 2172 * Return: void 2173 */ 2174 #ifdef TCL_DATA_CMD_2_SEARCH_TYPE_OFFSET 2175 static void hal_tx_desc_set_search_type_generic(void *desc, 2176 uint8_t search_type) 2177 { 2178 HAL_SET_FLD(desc, TCL_DATA_CMD_2, SEARCH_TYPE) |= 2179 HAL_TX_SM(TCL_DATA_CMD_2, SEARCH_TYPE, search_type); 2180 } 2181 #else 2182 static void hal_tx_desc_set_search_type_generic(void *desc, 2183 uint8_t search_type) 2184 { 2185 } 2186 2187 #endif 2188 2189 /** 2190 * hal_tx_desc_set_search_index - Set the search index value 2191 * @desc: Handle to Tx Descriptor 2192 * @search_index: The index that will be used for index based address or 2193 * flow search. The field is valid when 'search_type' is 2194 * 1 0r 2 2195 * 2196 * Return: void 2197 */ 2198 #ifdef TCL_DATA_CMD_5_SEARCH_INDEX_OFFSET 2199 static void hal_tx_desc_set_search_index_generic(void *desc, 2200 uint32_t search_index) 2201 { 2202 HAL_SET_FLD(desc, TCL_DATA_CMD_5, SEARCH_INDEX) |= 2203 HAL_TX_SM(TCL_DATA_CMD_5, SEARCH_INDEX, search_index); 2204 } 2205 #else 2206 static void hal_tx_desc_set_search_index_generic(void *desc, 2207 uint32_t search_index) 2208 { 2209 } 2210 #endif 2211 2212 /** 2213 * hal_tx_desc_set_cache_set_num_generic - Set the cache-set-num value 2214 * @desc: Handle to Tx Descriptor 2215 * @cache_num: Cache set number that should be used to cache the index 2216 * based search results, for address and flow search. 2217 * This value should be equal to LSB four bits of the hash value 2218 * of match data, in case of search index points to an entry 2219 * which may be used in content based search also. The value can 2220 * be anything when the entry pointed by search index will not be 2221 * used for content based search. 2222 * 2223 * Return: void 2224 */ 2225 #ifdef TCL_DATA_CMD_5_CACHE_SET_NUM_OFFSET 2226 static void hal_tx_desc_set_cache_set_num_generic(void *desc, 2227 uint8_t cache_num) 2228 { 2229 HAL_SET_FLD(desc, TCL_DATA_CMD_5, CACHE_SET_NUM) |= 2230 HAL_TX_SM(TCL_DATA_CMD_5, CACHE_SET_NUM, cache_num); 2231 } 2232 #else 2233 static void hal_tx_desc_set_cache_set_num_generic(void *desc, 2234 uint8_t cache_num) 2235 { 2236 } 2237 #endif 2238 2239 /** 2240 * hal_tx_set_pcp_tid_map_generic() - Configure default PCP to TID map table 2241 * @soc: HAL SoC context 2242 * @map: PCP-TID mapping table 2243 * 2244 * PCP are mapped to 8 TID values using TID values programmed 2245 * in one set of mapping registers PCP_TID_MAP_<0 to 6> 2246 * The mapping register has TID mapping for 8 PCP values 2247 * 2248 * Return: none 2249 */ 2250 static void hal_tx_set_pcp_tid_map_generic(struct hal_soc *soc, uint8_t *map) 2251 { 2252 uint32_t addr, value; 2253 2254 addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR( 2255 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 2256 2257 value = (map[0] | 2258 (map[1] << HWIO_TCL_R0_PCP_TID_MAP_PCP_1_SHFT) | 2259 (map[2] << HWIO_TCL_R0_PCP_TID_MAP_PCP_2_SHFT) | 2260 (map[3] << HWIO_TCL_R0_PCP_TID_MAP_PCP_3_SHFT) | 2261 (map[4] << HWIO_TCL_R0_PCP_TID_MAP_PCP_4_SHFT) | 2262 (map[5] << HWIO_TCL_R0_PCP_TID_MAP_PCP_5_SHFT) | 2263 (map[6] << HWIO_TCL_R0_PCP_TID_MAP_PCP_6_SHFT) | 2264 (map[7] << HWIO_TCL_R0_PCP_TID_MAP_PCP_7_SHFT)); 2265 2266 HAL_REG_WRITE(soc, addr, (value & HWIO_TCL_R0_PCP_TID_MAP_RMSK)); 2267 } 2268 2269 /** 2270 * hal_tx_update_pcp_tid_generic() - Update the pcp tid map table with 2271 * value received from user-space 2272 * @soc: HAL SoC context 2273 * @pcp: pcp value 2274 * @tid : tid value 2275 * 2276 * Return: void 2277 */ 2278 static 2279 void hal_tx_update_pcp_tid_generic(struct hal_soc *soc, 2280 uint8_t pcp, uint8_t tid) 2281 { 2282 uint32_t addr, value, regval; 2283 2284 addr = HWIO_TCL_R0_PCP_TID_MAP_ADDR( 2285 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 2286 2287 value = (uint32_t)tid << (HAL_TX_BITS_PER_TID * pcp); 2288 2289 /* Read back previous PCP TID config and update 2290 * with new config. 2291 */ 2292 regval = HAL_REG_READ(soc, addr); 2293 regval &= ~(HAL_TX_TID_BITS_MASK << (HAL_TX_BITS_PER_TID * pcp)); 2294 regval |= value; 2295 2296 HAL_REG_WRITE(soc, addr, 2297 (regval & HWIO_TCL_R0_PCP_TID_MAP_RMSK)); 2298 } 2299 2300 /** 2301 * hal_tx_update_tidmap_prty_generic() - Update the tid map priority 2302 * @soc: HAL SoC context 2303 * @val: priority value 2304 * 2305 * Return: void 2306 */ 2307 static 2308 void hal_tx_update_tidmap_prty_generic(struct hal_soc *soc, uint8_t value) 2309 { 2310 uint32_t addr; 2311 2312 addr = HWIO_TCL_R0_TID_MAP_PRTY_ADDR( 2313 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET); 2314 2315 HAL_REG_WRITE(soc, addr, 2316 (value & HWIO_TCL_R0_TID_MAP_PRTY_RMSK)); 2317 } 2318 2319 /** 2320 * hal_rx_msdu_packet_metadata_get(): API to get the 2321 * msdu information from rx_msdu_end TLV 2322 * 2323 * @ buf: pointer to the start of RX PKT TLV headers 2324 * @ hal_rx_msdu_metadata: pointer to the msdu info structure 2325 */ 2326 static void 2327 hal_rx_msdu_packet_metadata_get_generic(uint8_t *buf, 2328 void *pkt_msdu_metadata) 2329 { 2330 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 2331 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 2332 struct hal_rx_msdu_metadata *msdu_metadata = 2333 (struct hal_rx_msdu_metadata *)pkt_msdu_metadata; 2334 2335 msdu_metadata->l3_hdr_pad = 2336 HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end); 2337 msdu_metadata->sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end); 2338 msdu_metadata->da_idx = HAL_RX_MSDU_END_DA_IDX_GET(msdu_end); 2339 msdu_metadata->sa_sw_peer_id = 2340 HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end); 2341 } 2342 #endif /* _HAL_GENERIC_API_H_ */ 2343