1 /* 2 * Copyright (c) 2016-2021 The Linux Foundation. All rights reserved. 3 * Copyright (c) 2021-2022 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 #include "qdf_types.h" 20 #include "qdf_util.h" 21 #include "qdf_types.h" 22 #include "qdf_lock.h" 23 #include "qdf_mem.h" 24 #include "qdf_nbuf.h" 25 #include "hal_li_hw_headers.h" 26 #include "hal_internal.h" 27 #include "hal_api.h" 28 #include "target_type.h" 29 #include "wcss_version.h" 30 #include "qdf_module.h" 31 32 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET \ 33 RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_OFFSET 34 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK \ 35 RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_MASK 36 #define UNIFIED_RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB \ 37 RXPCU_PPDU_END_INFO_8_RX_PPDU_DURATION_LSB 38 #define UNIFIED_PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET \ 39 PHYRX_HT_SIG_0_HT_SIG_INFO_PHYRX_HT_SIG_INFO_DETAILS_OFFSET 40 #define UNIFIED_PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET \ 41 PHYRX_L_SIG_B_0_L_SIG_B_INFO_PHYRX_L_SIG_B_INFO_DETAILS_OFFSET 42 #define UNIFIED_PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET \ 43 PHYRX_L_SIG_A_0_L_SIG_A_INFO_PHYRX_L_SIG_A_INFO_DETAILS_OFFSET 44 #define UNIFIED_PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET \ 45 PHYRX_VHT_SIG_A_0_VHT_SIG_A_INFO_PHYRX_VHT_SIG_A_INFO_DETAILS_OFFSET 46 #define UNIFIED_PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET \ 47 PHYRX_HE_SIG_A_SU_0_HE_SIG_A_SU_INFO_PHYRX_HE_SIG_A_SU_INFO_DETAILS_OFFSET 48 #define UNIFIED_PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET \ 49 PHYRX_HE_SIG_A_MU_DL_0_HE_SIG_A_MU_DL_INFO_PHYRX_HE_SIG_A_MU_DL_INFO_DETAILS_OFFSET 50 #define UNIFIED_PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET \ 51 PHYRX_HE_SIG_B1_MU_0_HE_SIG_B1_MU_INFO_PHYRX_HE_SIG_B1_MU_INFO_DETAILS_OFFSET 52 #define UNIFIED_PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET \ 53 PHYRX_HE_SIG_B2_MU_0_HE_SIG_B2_MU_INFO_PHYRX_HE_SIG_B2_MU_INFO_DETAILS_OFFSET 54 #define UNIFIED_PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET \ 55 PHYRX_HE_SIG_B2_OFDMA_0_HE_SIG_B2_OFDMA_INFO_PHYRX_HE_SIG_B2_OFDMA_INFO_DETAILS_OFFSET 56 #define UNIFIED_PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET \ 57 PHYRX_RSSI_LEGACY_3_RECEIVE_RSSI_INFO_PRE_RSSI_INFO_DETAILS_OFFSET 58 #define UNIFIED_PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET \ 59 PHYRX_RSSI_LEGACY_19_RECEIVE_RSSI_INFO_PREAMBLE_RSSI_INFO_DETAILS_OFFSET 60 #define UNIFIED_RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET \ 61 RX_MPDU_START_0_RX_MPDU_INFO_RX_MPDU_INFO_DETAILS_OFFSET 62 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \ 63 RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET 64 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \ 65 RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET 66 #define UNIFIED_RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \ 67 RX_MPDU_DETAILS_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET 68 #define UNIFIED_REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET \ 69 REO_DESTINATION_RING_2_RX_MPDU_DESC_INFO_RX_MPDU_DESC_INFO_DETAILS_OFFSET 70 #define UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC \ 71 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER 72 #define UNIFIED_RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET \ 73 RX_MSDU_DETAILS_2_RX_MSDU_DESC_INFO_RX_MSDU_DESC_INFO_DETAILS_OFFSET 74 #define UNIFIED_RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET \ 75 RX_MSDU_LINK_8_RX_MSDU_DETAILS_MSDU_0_OFFSET 76 #define UNIFIED_TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \ 77 TCL_DATA_CMD_0_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET 78 #define UNIFIED_TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET \ 79 TCL_DATA_CMD_1_BUFFER_ADDR_INFO_BUF_ADDR_INFO_OFFSET 80 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET \ 81 TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_OFFSET 82 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB \ 83 BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_LSB 84 #define UNIFIED_BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK \ 85 BUFFER_ADDR_INFO_0_BUFFER_ADDR_31_0_MASK 86 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB \ 87 BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_LSB 88 #define UNIFIED_BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK \ 89 BUFFER_ADDR_INFO_1_BUFFER_ADDR_39_32_MASK 90 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB \ 91 BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_LSB 92 #define UNIFIED_BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK \ 93 BUFFER_ADDR_INFO_1_RETURN_BUFFER_MANAGER_MASK 94 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB \ 95 BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_LSB 96 #define UNIFIED_BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK \ 97 BUFFER_ADDR_INFO_1_SW_BUFFER_COOKIE_MASK 98 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB \ 99 TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_LSB 100 #define UNIFIED_TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK \ 101 TCL_DATA_CMD_2_BUF_OR_EXT_DESC_TYPE_MASK 102 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK \ 103 WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_MASK 104 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET \ 105 WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_OFFSET 106 #define UNIFIED_WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB \ 107 WBM_RELEASE_RING_6_TX_RATE_STATS_INFO_TX_RATE_STATS_LSB 108 109 #include "hal_6390_tx.h" 110 #include "hal_6390_rx.h" 111 #include <hal_generic_api.h> 112 #include "hal_li_rx.h" 113 #include "hal_li_api.h" 114 #include "hal_li_generic_api.h" 115 116 /** 117 * hal_rx_get_rx_fragment_number_6390(): Function to retrieve rx fragment number 118 * 119 * @nbuf: Network buffer 120 * Returns: rx fragment number 121 */ 122 static 123 uint8_t hal_rx_get_rx_fragment_number_6390(uint8_t *buf) 124 { 125 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf); 126 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs); 127 128 /* Return first 4 bits as fragment number */ 129 return (HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info) & 130 DOT11_SEQ_FRAG_MASK); 131 } 132 133 /** 134 * hal_rx_msdu_end_da_is_mcbc_get_6390(): API to check if pkt is MCBC 135 * from rx_msdu_end TLV 136 * 137 * @ buf: pointer to the start of RX PKT TLV headers 138 * Return: da_is_mcbc 139 */ 140 static uint8_t 141 hal_rx_msdu_end_da_is_mcbc_get_6390(uint8_t *buf) 142 { 143 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 144 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 145 146 return HAL_RX_MSDU_END_DA_IS_MCBC_GET(msdu_end); 147 } 148 149 /** 150 * hal_rx_msdu_end_sa_is_valid_get_6390(): API to get_6390 the 151 * sa_is_valid bit from rx_msdu_end TLV 152 * 153 * @ buf: pointer to the start of RX PKT TLV headers 154 * Return: sa_is_valid bit 155 */ 156 static uint8_t 157 hal_rx_msdu_end_sa_is_valid_get_6390(uint8_t *buf) 158 { 159 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 160 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 161 uint8_t sa_is_valid; 162 163 sa_is_valid = HAL_RX_MSDU_END_SA_IS_VALID_GET(msdu_end); 164 165 return sa_is_valid; 166 } 167 168 /** 169 * hal_rx_msdu_end_sa_idx_get_6390(): API to get_6390 the 170 * sa_idx from rx_msdu_end TLV 171 * 172 * @ buf: pointer to the start of RX PKT TLV headers 173 * Return: sa_idx (SA AST index) 174 */ 175 static 176 uint16_t hal_rx_msdu_end_sa_idx_get_6390(uint8_t *buf) 177 { 178 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 179 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 180 uint16_t sa_idx; 181 182 sa_idx = HAL_RX_MSDU_END_SA_IDX_GET(msdu_end); 183 184 return sa_idx; 185 } 186 187 /** 188 * hal_rx_desc_is_first_msdu_6390() - Check if first msdu 189 * 190 * @hal_soc_hdl: hal_soc handle 191 * @hw_desc_addr: hardware descriptor address 192 * 193 * Return: 0 - success/ non-zero failure 194 */ 195 static uint32_t hal_rx_desc_is_first_msdu_6390(void *hw_desc_addr) 196 { 197 struct rx_pkt_tlvs *rx_tlvs = (struct rx_pkt_tlvs *)hw_desc_addr; 198 struct rx_msdu_end *msdu_end = &rx_tlvs->msdu_end_tlv.rx_msdu_end; 199 200 return HAL_RX_GET(msdu_end, RX_MSDU_END_5, FIRST_MSDU); 201 } 202 203 /** 204 * hal_rx_msdu_end_l3_hdr_padding_get_6390(): API to get_6390 the 205 * l3_header padding from rx_msdu_end TLV 206 * 207 * @ buf: pointer to the start of RX PKT TLV headers 208 * Return: number of l3 header padding bytes 209 */ 210 static uint32_t hal_rx_msdu_end_l3_hdr_padding_get_6390(uint8_t *buf) 211 { 212 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 213 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 214 uint32_t l3_header_padding; 215 216 l3_header_padding = HAL_RX_MSDU_END_L3_HEADER_PADDING_GET(msdu_end); 217 218 return l3_header_padding; 219 } 220 221 /* 222 * @ hal_rx_encryption_info_valid_6390: Returns encryption type. 223 * 224 * @ buf: rx_tlv_hdr of the received packet 225 * @ Return: encryption type 226 */ 227 static uint32_t hal_rx_encryption_info_valid_6390(uint8_t *buf) 228 { 229 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 230 struct rx_mpdu_start *mpdu_start = 231 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 232 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 233 uint32_t encryption_info = HAL_RX_MPDU_ENCRYPTION_INFO_VALID(mpdu_info); 234 235 return encryption_info; 236 } 237 238 /* 239 * @ hal_rx_print_pn_6390: Prints the PN of rx packet. 240 * 241 * @ buf: rx_tlv_hdr of the received packet 242 * @ Return: void 243 */ 244 static void hal_rx_print_pn_6390(uint8_t *buf) 245 { 246 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 247 struct rx_mpdu_start *mpdu_start = 248 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 249 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 250 251 uint32_t pn_31_0 = HAL_RX_MPDU_PN_31_0_GET(mpdu_info); 252 uint32_t pn_63_32 = HAL_RX_MPDU_PN_63_32_GET(mpdu_info); 253 uint32_t pn_95_64 = HAL_RX_MPDU_PN_95_64_GET(mpdu_info); 254 uint32_t pn_127_96 = HAL_RX_MPDU_PN_127_96_GET(mpdu_info); 255 256 hal_debug("PN number pn_127_96 0x%x pn_95_64 0x%x pn_63_32 0x%x pn_31_0 0x%x ", 257 pn_127_96, pn_95_64, pn_63_32, pn_31_0); 258 } 259 260 /** 261 * hal_rx_msdu_end_first_msduget_6390: API to get first msdu status 262 * from rx_msdu_end TLV 263 * 264 * @ buf: pointer to the start of RX PKT TLV headers 265 * Return: first_msdu 266 */ 267 static uint8_t hal_rx_msdu_end_first_msdu_get_6390(uint8_t *buf) 268 { 269 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 270 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 271 uint8_t first_msdu; 272 273 first_msdu = HAL_RX_MSDU_END_FIRST_MSDU_GET(msdu_end); 274 275 return first_msdu; 276 } 277 278 /** 279 * hal_rx_msdu_end_da_is_valid_get_6390: API to check if da is valid 280 * from rx_msdu_end TLV 281 * 282 * @ buf: pointer to the start of RX PKT TLV headers 283 * Return: da_is_valid 284 */ 285 static uint8_t hal_rx_msdu_end_da_is_valid_get_6390(uint8_t *buf) 286 { 287 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 288 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 289 uint8_t da_is_valid; 290 291 da_is_valid = HAL_RX_MSDU_END_DA_IS_VALID_GET(msdu_end); 292 293 return da_is_valid; 294 } 295 296 /** 297 * hal_rx_msdu_end_last_msdu_get_6390: API to get last msdu status 298 * from rx_msdu_end TLV 299 * 300 * @ buf: pointer to the start of RX PKT TLV headers 301 * Return: last_msdu 302 */ 303 static uint8_t hal_rx_msdu_end_last_msdu_get_6390(uint8_t *buf) 304 { 305 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 306 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 307 uint8_t last_msdu; 308 309 last_msdu = HAL_RX_MSDU_END_LAST_MSDU_GET(msdu_end); 310 311 return last_msdu; 312 } 313 314 /* 315 * hal_rx_get_mpdu_mac_ad4_valid_6390(): Retrieves if mpdu 4th addr is valid 316 * 317 * @nbuf: Network buffer 318 * Returns: value of mpdu 4th address valid field 319 */ 320 static bool hal_rx_get_mpdu_mac_ad4_valid_6390(uint8_t *buf) 321 { 322 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf); 323 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs); 324 bool ad4_valid = 0; 325 326 ad4_valid = HAL_RX_MPDU_GET_MAC_AD4_VALID(rx_mpdu_info); 327 328 return ad4_valid; 329 } 330 331 /** 332 * hal_rx_mpdu_start_sw_peer_id_get_6390: Retrieve sw peer_id 333 * @buf: network buffer 334 * 335 * Return: sw peer_id 336 */ 337 static uint32_t hal_rx_mpdu_start_sw_peer_id_get_6390(uint8_t *buf) 338 { 339 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 340 struct rx_mpdu_start *mpdu_start = 341 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 342 343 return HAL_RX_MPDU_INFO_SW_PEER_ID_GET( 344 &mpdu_start->rx_mpdu_info_details); 345 } 346 347 /* 348 * hal_rx_mpdu_get_to_ds_6390(): API to get the tods info 349 * from rx_mpdu_start 350 * 351 * @buf: pointer to the start of RX PKT TLV header 352 * Return: uint32_t(to_ds) 353 */ 354 static uint32_t hal_rx_mpdu_get_to_ds_6390(uint8_t *buf) 355 { 356 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 357 struct rx_mpdu_start *mpdu_start = 358 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 359 360 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 361 362 return HAL_RX_MPDU_GET_TODS(mpdu_info); 363 } 364 365 /* 366 * hal_rx_mpdu_get_fr_ds_6390(): API to get the from ds info 367 * from rx_mpdu_start 368 * 369 * @buf: pointer to the start of RX PKT TLV header 370 * Return: uint32_t(fr_ds) 371 */ 372 static uint32_t hal_rx_mpdu_get_fr_ds_6390(uint8_t *buf) 373 { 374 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 375 struct rx_mpdu_start *mpdu_start = 376 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 377 378 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 379 380 return HAL_RX_MPDU_GET_FROMDS(mpdu_info); 381 } 382 383 /* 384 * hal_rx_get_mpdu_frame_control_valid_6390(): Retrieves mpdu 385 * frame control valid 386 * 387 * @nbuf: Network buffer 388 * Returns: value of frame control valid field 389 */ 390 static uint8_t hal_rx_get_mpdu_frame_control_valid_6390(uint8_t *buf) 391 { 392 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf); 393 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs); 394 395 return HAL_RX_MPDU_GET_FRAME_CONTROL_VALID(rx_mpdu_info); 396 } 397 398 /* 399 * hal_rx_mpdu_get_addr1_6390(): API to check get address1 of the mpdu 400 * 401 * @buf: pointer to the start of RX PKT TLV headera 402 * @mac_addr: pointer to mac address 403 * Return: success/failure 404 */ 405 static QDF_STATUS hal_rx_mpdu_get_addr1_6390(uint8_t *buf, uint8_t *mac_addr) 406 { 407 struct __attribute__((__packed__)) hal_addr1 { 408 uint32_t ad1_31_0; 409 uint16_t ad1_47_32; 410 }; 411 412 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 413 struct rx_mpdu_start *mpdu_start = 414 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 415 416 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 417 struct hal_addr1 *addr = (struct hal_addr1 *)mac_addr; 418 uint32_t mac_addr_ad1_valid; 419 420 mac_addr_ad1_valid = HAL_RX_MPDU_MAC_ADDR_AD1_VALID_GET(mpdu_info); 421 422 if (mac_addr_ad1_valid) { 423 addr->ad1_31_0 = HAL_RX_MPDU_AD1_31_0_GET(mpdu_info); 424 addr->ad1_47_32 = HAL_RX_MPDU_AD1_47_32_GET(mpdu_info); 425 return QDF_STATUS_SUCCESS; 426 } 427 428 return QDF_STATUS_E_FAILURE; 429 } 430 431 /* 432 * hal_rx_mpdu_get_addr2_6390(): API to check get address2 of the mpdu 433 * in the packet 434 * 435 * @buf: pointer to the start of RX PKT TLV header 436 * @mac_addr: pointer to mac address 437 * Return: success/failure 438 */ 439 static QDF_STATUS hal_rx_mpdu_get_addr2_6390(uint8_t *buf, 440 uint8_t *mac_addr) 441 { 442 struct __attribute__((__packed__)) hal_addr2 { 443 uint16_t ad2_15_0; 444 uint32_t ad2_47_16; 445 }; 446 447 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 448 struct rx_mpdu_start *mpdu_start = 449 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 450 451 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 452 struct hal_addr2 *addr = (struct hal_addr2 *)mac_addr; 453 uint32_t mac_addr_ad2_valid; 454 455 mac_addr_ad2_valid = HAL_RX_MPDU_MAC_ADDR_AD2_VALID_GET(mpdu_info); 456 457 if (mac_addr_ad2_valid) { 458 addr->ad2_15_0 = HAL_RX_MPDU_AD2_15_0_GET(mpdu_info); 459 addr->ad2_47_16 = HAL_RX_MPDU_AD2_47_16_GET(mpdu_info); 460 return QDF_STATUS_SUCCESS; 461 } 462 463 return QDF_STATUS_E_FAILURE; 464 } 465 466 /* 467 * hal_rx_mpdu_get_addr3_6390(): API to get address3 of the mpdu 468 * in the packet 469 * 470 * @buf: pointer to the start of RX PKT TLV header 471 * @mac_addr: pointer to mac address 472 * Return: success/failure 473 */ 474 static QDF_STATUS hal_rx_mpdu_get_addr3_6390(uint8_t *buf, uint8_t *mac_addr) 475 { 476 struct __attribute__((__packed__)) hal_addr3 { 477 uint32_t ad3_31_0; 478 uint16_t ad3_47_32; 479 }; 480 481 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 482 struct rx_mpdu_start *mpdu_start = 483 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 484 485 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 486 struct hal_addr3 *addr = (struct hal_addr3 *)mac_addr; 487 uint32_t mac_addr_ad3_valid; 488 489 mac_addr_ad3_valid = HAL_RX_MPDU_MAC_ADDR_AD3_VALID_GET(mpdu_info); 490 491 if (mac_addr_ad3_valid) { 492 addr->ad3_31_0 = HAL_RX_MPDU_AD3_31_0_GET(mpdu_info); 493 addr->ad3_47_32 = HAL_RX_MPDU_AD3_47_32_GET(mpdu_info); 494 return QDF_STATUS_SUCCESS; 495 } 496 497 return QDF_STATUS_E_FAILURE; 498 } 499 500 /* 501 * hal_rx_mpdu_get_addr4_6390(): API to get address4 of the mpdu 502 * in the packet 503 * 504 * @buf: pointer to the start of RX PKT TLV header 505 * @mac_addr: pointer to mac address 506 * Return: success/failure 507 */ 508 static QDF_STATUS hal_rx_mpdu_get_addr4_6390(uint8_t *buf, uint8_t *mac_addr) 509 { 510 struct __attribute__((__packed__)) hal_addr4 { 511 uint32_t ad4_31_0; 512 uint16_t ad4_47_32; 513 }; 514 515 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 516 struct rx_mpdu_start *mpdu_start = 517 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 518 519 struct rx_mpdu_info *mpdu_info = &mpdu_start->rx_mpdu_info_details; 520 struct hal_addr4 *addr = (struct hal_addr4 *)mac_addr; 521 uint32_t mac_addr_ad4_valid; 522 523 mac_addr_ad4_valid = HAL_RX_MPDU_MAC_ADDR_AD4_VALID_GET(mpdu_info); 524 525 if (mac_addr_ad4_valid) { 526 addr->ad4_31_0 = HAL_RX_MPDU_AD4_31_0_GET(mpdu_info); 527 addr->ad4_47_32 = HAL_RX_MPDU_AD4_47_32_GET(mpdu_info); 528 return QDF_STATUS_SUCCESS; 529 } 530 531 return QDF_STATUS_E_FAILURE; 532 } 533 534 /* 535 * hal_rx_get_mpdu_sequence_control_valid_6390(): Get mpdu 536 * sequence control valid 537 * 538 * @nbuf: Network buffer 539 * Returns: value of sequence control valid field 540 */ 541 static uint8_t hal_rx_get_mpdu_sequence_control_valid_6390(uint8_t *buf) 542 { 543 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf); 544 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs); 545 546 return HAL_RX_MPDU_GET_SEQUENCE_CONTROL_VALID(rx_mpdu_info); 547 } 548 549 /** 550 * hal_rx_is_unicast_6390: check packet is unicast frame or not. 551 * 552 * @ buf: pointer to rx pkt TLV. 553 * 554 * Return: true on unicast. 555 */ 556 static bool hal_rx_is_unicast_6390(uint8_t *buf) 557 { 558 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 559 struct rx_mpdu_start *mpdu_start = 560 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 561 uint32_t grp_id; 562 uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details; 563 564 grp_id = (_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info), 565 RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_OFFSET)), 566 RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_MASK, 567 RX_MPDU_INFO_0_SW_FRAME_GROUP_ID_LSB)); 568 569 return (HAL_MPDU_SW_FRAME_GROUP_UNICAST_DATA == grp_id) ? true : false; 570 } 571 572 /** 573 * hal_rx_tid_get_6390: get tid based on qos control valid. 574 * @hal_soc_hdl: hal soc handle 575 * @buf: pointer to rx pkt TLV. 576 * 577 * Return: tid 578 */ 579 static uint32_t hal_rx_tid_get_6390(hal_soc_handle_t hal_soc_hdl, uint8_t *buf) 580 { 581 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 582 struct rx_mpdu_start *mpdu_start = 583 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 584 uint8_t *rx_mpdu_info = (uint8_t *)&mpdu_start->rx_mpdu_info_details; 585 uint8_t qos_control_valid = 586 (_HAL_MS((*_OFFSET_TO_WORD_PTR((rx_mpdu_info), 587 RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_OFFSET)), 588 RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_MASK, 589 RX_MPDU_INFO_2_MPDU_QOS_CONTROL_VALID_LSB)); 590 591 if (qos_control_valid) 592 return hal_rx_mpdu_start_tid_get_6390(buf); 593 594 return HAL_RX_NON_QOS_TID; 595 } 596 597 /** 598 * hal_rx_hw_desc_get_ppduid_get_6390(): retrieve ppdu id 599 * @rx_tlv_hdr: start address of rx_pkt_tlvs 600 * @rxdma_dst_ring_desc: Rx HW descriptor 601 * 602 * Return: ppdu id 603 */ 604 static uint32_t hal_rx_hw_desc_get_ppduid_get_6390(void *rx_tlv_hdr, 605 void *rxdma_dst_ring_desc) 606 { 607 struct rx_mpdu_info *rx_mpdu_info; 608 struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; 609 610 rx_mpdu_info = 611 &rx_desc->mpdu_start_tlv.rx_mpdu_start.rx_mpdu_info_details; 612 613 return HAL_RX_GET(rx_mpdu_info, RX_MPDU_INFO_0, PHY_PPDU_ID); 614 } 615 616 /** 617 * hal_reo_status_get_header_6390 - Process reo desc info 618 * @ring_desc: REO status ring descriptor 619 * @b - tlv type info 620 * @h1 - Pointer to hal_reo_status_header where info to be stored 621 * 622 * Return - none. 623 * 624 */ 625 static void hal_reo_status_get_header_6390(hal_ring_desc_t ring_desc, int b, 626 void *h1) 627 { 628 uint32_t *d = (uint32_t *)ring_desc; 629 uint32_t val1 = 0; 630 struct hal_reo_status_header *h = 631 (struct hal_reo_status_header *)h1; 632 633 /* Offsets of descriptor fields defined in HW headers start 634 * from the field after TLV header 635 */ 636 d += HAL_GET_NUM_DWORDS(sizeof(struct tlv_32_hdr)); 637 638 switch (b) { 639 case HAL_REO_QUEUE_STATS_STATUS_TLV: 640 val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_0, 641 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)]; 642 break; 643 case HAL_REO_FLUSH_QUEUE_STATUS_TLV: 644 val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_0, 645 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)]; 646 break; 647 case HAL_REO_FLUSH_CACHE_STATUS_TLV: 648 val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_0, 649 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)]; 650 break; 651 case HAL_REO_UNBLK_CACHE_STATUS_TLV: 652 val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_0, 653 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)]; 654 break; 655 case HAL_REO_TIMOUT_LIST_STATUS_TLV: 656 val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_0, 657 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)]; 658 break; 659 case HAL_REO_DESC_THRES_STATUS_TLV: 660 val1 = 661 d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_0, 662 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)]; 663 break; 664 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV: 665 val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_0, 666 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER)]; 667 break; 668 default: 669 qdf_nofl_err("ERROR: Unknown tlv\n"); 670 break; 671 } 672 h->cmd_num = 673 HAL_GET_FIELD( 674 UNIFORM_REO_STATUS_HEADER_0, REO_STATUS_NUMBER, 675 val1); 676 h->exec_time = 677 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0, 678 CMD_EXECUTION_TIME, val1); 679 h->status = 680 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_0, 681 REO_CMD_EXECUTION_STATUS, val1); 682 switch (b) { 683 case HAL_REO_QUEUE_STATS_STATUS_TLV: 684 val1 = d[HAL_OFFSET_DW(REO_GET_QUEUE_STATS_STATUS_1, 685 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)]; 686 break; 687 case HAL_REO_FLUSH_QUEUE_STATUS_TLV: 688 val1 = d[HAL_OFFSET_DW(REO_FLUSH_QUEUE_STATUS_1, 689 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)]; 690 break; 691 case HAL_REO_FLUSH_CACHE_STATUS_TLV: 692 val1 = d[HAL_OFFSET_DW(REO_FLUSH_CACHE_STATUS_1, 693 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)]; 694 break; 695 case HAL_REO_UNBLK_CACHE_STATUS_TLV: 696 val1 = d[HAL_OFFSET_DW(REO_UNBLOCK_CACHE_STATUS_1, 697 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)]; 698 break; 699 case HAL_REO_TIMOUT_LIST_STATUS_TLV: 700 val1 = d[HAL_OFFSET_DW(REO_FLUSH_TIMEOUT_LIST_STATUS_1, 701 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)]; 702 break; 703 case HAL_REO_DESC_THRES_STATUS_TLV: 704 val1 = 705 d[HAL_OFFSET_DW(REO_DESCRIPTOR_THRESHOLD_REACHED_STATUS_1, 706 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)]; 707 break; 708 case HAL_REO_UPDATE_RX_QUEUE_STATUS_TLV: 709 val1 = d[HAL_OFFSET_DW(REO_UPDATE_RX_REO_QUEUE_STATUS_1, 710 UNIFORM_REO_STATUS_HEADER_STATUS_HEADER_GENERIC)]; 711 break; 712 default: 713 qdf_nofl_err("ERROR: Unknown tlv\n"); 714 break; 715 } 716 h->tstamp = 717 HAL_GET_FIELD(UNIFORM_REO_STATUS_HEADER_1, TIMESTAMP, val1); 718 } 719 720 /** 721 * hal_rx_mpdu_start_mpdu_qos_control_valid_get_6390(): 722 * Retrieve qos control valid bit from the tlv. 723 * @buf: pointer to rx pkt TLV. 724 * 725 * Return: qos control value. 726 */ 727 static inline uint32_t 728 hal_rx_mpdu_start_mpdu_qos_control_valid_get_6390(uint8_t *buf) 729 { 730 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 731 struct rx_mpdu_start *mpdu_start = 732 &pkt_tlvs->mpdu_start_tlv.rx_mpdu_start; 733 734 return HAL_RX_MPDU_INFO_QOS_CONTROL_VALID_GET( 735 &mpdu_start->rx_mpdu_info_details); 736 } 737 738 /** 739 * hal_rx_msdu_end_sa_sw_peer_id_get_6390(): API to get the 740 * sa_sw_peer_id from rx_msdu_end TLV 741 * @buf: pointer to the start of RX PKT TLV headers 742 * 743 * Return: sa_sw_peer_id index 744 */ 745 static inline uint32_t 746 hal_rx_msdu_end_sa_sw_peer_id_get_6390(uint8_t *buf) 747 { 748 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 749 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 750 751 return HAL_RX_MSDU_END_SA_SW_PEER_ID_GET(msdu_end); 752 } 753 754 /** 755 * hal_tx_desc_set_mesh_en_6390 - Set mesh_enable flag in Tx descriptor 756 * @desc: Handle to Tx Descriptor 757 * @en: For raw WiFi frames, this indicates transmission to a mesh STA, 758 * enabling the interpretation of the 'Mesh Control Present' bit 759 * (bit 8) of QoS Control (otherwise this bit is ignored), 760 * For native WiFi frames, this indicates that a 'Mesh Control' field 761 * is present between the header and the LLC. 762 * 763 * Return: void 764 */ 765 static inline 766 void hal_tx_desc_set_mesh_en_6390(void *desc, uint8_t en) 767 { 768 HAL_SET_FLD(desc, TCL_DATA_CMD_4, MESH_ENABLE) |= 769 HAL_TX_SM(TCL_DATA_CMD_4, MESH_ENABLE, en); 770 } 771 772 static 773 void *hal_rx_msdu0_buffer_addr_lsb_6390(void *link_desc_va) 774 { 775 return (void *)HAL_RX_MSDU0_BUFFER_ADDR_LSB(link_desc_va); 776 } 777 778 static 779 void *hal_rx_msdu_desc_info_ptr_get_6390(void *msdu0) 780 { 781 return (void *)HAL_RX_MSDU_DESC_INFO_PTR_GET(msdu0); 782 } 783 784 static 785 void *hal_ent_mpdu_desc_info_6390(void *ent_ring_desc) 786 { 787 return (void *)HAL_ENT_MPDU_DESC_INFO(ent_ring_desc); 788 } 789 790 static 791 void *hal_dst_mpdu_desc_info_6390(void *dst_ring_desc) 792 { 793 return (void *)HAL_DST_MPDU_DESC_INFO(dst_ring_desc); 794 } 795 796 static 797 uint8_t hal_rx_get_fc_valid_6390(uint8_t *buf) 798 { 799 return HAL_RX_GET_FC_VALID(buf); 800 } 801 802 static uint8_t hal_rx_get_to_ds_flag_6390(uint8_t *buf) 803 { 804 return HAL_RX_GET_TO_DS_FLAG(buf); 805 } 806 807 static uint8_t hal_rx_get_mac_addr2_valid_6390(uint8_t *buf) 808 { 809 return HAL_RX_GET_MAC_ADDR2_VALID(buf); 810 } 811 812 static uint8_t hal_rx_get_filter_category_6390(uint8_t *buf) 813 { 814 return HAL_RX_GET_FILTER_CATEGORY(buf); 815 } 816 817 static uint32_t 818 hal_rx_get_ppdu_id_6390(uint8_t *buf) 819 { 820 return HAL_RX_GET_PPDU_ID(buf); 821 } 822 823 /** 824 * hal_reo_config_6390(): Set reo config parameters 825 * @soc: hal soc handle 826 * @reg_val: value to be set 827 * @reo_params: reo parameters 828 * 829 * Return: void 830 */ 831 static 832 void hal_reo_config_6390(struct hal_soc *soc, 833 uint32_t reg_val, 834 struct hal_reo_params *reo_params) 835 { 836 HAL_REO_R0_CONFIG(soc, reg_val, reo_params); 837 } 838 839 /** 840 * hal_rx_msdu_desc_info_get_ptr_6390() - Get msdu desc info ptr 841 * @msdu_details_ptr - Pointer to msdu_details_ptr 842 * Return - Pointer to rx_msdu_desc_info structure. 843 * 844 */ 845 static void *hal_rx_msdu_desc_info_get_ptr_6390(void *msdu_details_ptr) 846 { 847 return HAL_RX_MSDU_DESC_INFO_GET(msdu_details_ptr); 848 } 849 850 /** 851 * hal_rx_link_desc_msdu0_ptr_6390 - Get pointer to rx_msdu details 852 * @link_desc - Pointer to link desc 853 * Return - Pointer to rx_msdu_details structure 854 * 855 */ 856 static void *hal_rx_link_desc_msdu0_ptr_6390(void *link_desc) 857 { 858 return HAL_RX_LINK_DESC_MSDU0_PTR(link_desc); 859 } 860 861 /** 862 * hal_rx_msdu_flow_idx_get_6390: API to get flow index 863 * from rx_msdu_end TLV 864 * @buf: pointer to the start of RX PKT TLV headers 865 * 866 * Return: flow index value from MSDU END TLV 867 */ 868 static inline uint32_t hal_rx_msdu_flow_idx_get_6390(uint8_t *buf) 869 { 870 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 871 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 872 873 return HAL_RX_MSDU_END_FLOW_IDX_GET(msdu_end); 874 } 875 876 /** 877 * hal_rx_msdu_flow_idx_invalid_6390: API to get flow index invalid 878 * from rx_msdu_end TLV 879 * @buf: pointer to the start of RX PKT TLV headers 880 * 881 * Return: flow index invalid value from MSDU END TLV 882 */ 883 static bool hal_rx_msdu_flow_idx_invalid_6390(uint8_t *buf) 884 { 885 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 886 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 887 888 return HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(msdu_end); 889 } 890 891 /** 892 * hal_rx_msdu_flow_idx_timeout_6390: API to get flow index timeout 893 * from rx_msdu_end TLV 894 * @buf: pointer to the start of RX PKT TLV headers 895 * 896 * Return: flow index timeout value from MSDU END TLV 897 */ 898 static bool hal_rx_msdu_flow_idx_timeout_6390(uint8_t *buf) 899 { 900 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 901 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 902 903 return HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(msdu_end); 904 } 905 906 /** 907 * hal_rx_msdu_fse_metadata_get_6390: API to get FSE metadata 908 * from rx_msdu_end TLV 909 * @buf: pointer to the start of RX PKT TLV headers 910 * 911 * Return: fse metadata value from MSDU END TLV 912 */ 913 static uint32_t hal_rx_msdu_fse_metadata_get_6390(uint8_t *buf) 914 { 915 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 916 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 917 918 return HAL_RX_MSDU_END_FSE_METADATA_GET(msdu_end); 919 } 920 921 /** 922 * hal_rx_msdu_cce_metadata_get_6390: API to get CCE metadata 923 * from rx_msdu_end TLV 924 * @buf: pointer to the start of RX PKT TLV headers 925 * 926 * Return: cce metadata 927 */ 928 static uint16_t 929 hal_rx_msdu_cce_metadata_get_6390(uint8_t *buf) 930 { 931 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 932 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 933 934 return HAL_RX_MSDU_END_CCE_METADATA_GET(msdu_end); 935 } 936 937 /** 938 * hal_rx_msdu_get_flow_params_6390: API to get flow index, flow index invalid 939 * and flow index timeout from rx_msdu_end TLV 940 * @buf: pointer to the start of RX PKT TLV headers 941 * @flow_invalid: pointer to return value of flow_idx_valid 942 * @flow_timeout: pointer to return value of flow_idx_timeout 943 * @flow_index: pointer to return value of flow_idx 944 * 945 * Return: none 946 */ 947 static inline void 948 hal_rx_msdu_get_flow_params_6390(uint8_t *buf, 949 bool *flow_invalid, 950 bool *flow_timeout, 951 uint32_t *flow_index) 952 { 953 struct rx_pkt_tlvs *pkt_tlvs = (struct rx_pkt_tlvs *)buf; 954 struct rx_msdu_end *msdu_end = &pkt_tlvs->msdu_end_tlv.rx_msdu_end; 955 956 *flow_invalid = HAL_RX_MSDU_END_FLOW_IDX_INVALID_GET(msdu_end); 957 *flow_timeout = HAL_RX_MSDU_END_FLOW_IDX_TIMEOUT_GET(msdu_end); 958 *flow_index = HAL_RX_MSDU_END_FLOW_IDX_GET(msdu_end); 959 } 960 961 /** 962 * hal_rx_tlv_get_tcp_chksum_6390() - API to get tcp checksum 963 * @buf: rx_tlv_hdr 964 * 965 * Return: tcp checksum 966 */ 967 static uint16_t 968 hal_rx_tlv_get_tcp_chksum_6390(uint8_t *buf) 969 { 970 return HAL_RX_TLV_GET_TCP_CHKSUM(buf); 971 } 972 973 /** 974 * hal_rx_get_rx_sequence_6390(): Function to retrieve rx sequence number 975 * 976 * @nbuf: Network buffer 977 * Returns: rx sequence number 978 */ 979 static 980 uint16_t hal_rx_get_rx_sequence_6390(uint8_t *buf) 981 { 982 struct rx_pkt_tlvs *pkt_tlvs = hal_rx_get_pkt_tlvs(buf); 983 struct rx_mpdu_info *rx_mpdu_info = hal_rx_get_mpdu_info(pkt_tlvs); 984 985 return HAL_RX_MPDU_GET_SEQUENCE_NUMBER(rx_mpdu_info); 986 } 987 988 /** 989 * hal_rx_mpdu_start_tlv_tag_valid_6390 () - API to check if RX_MPDU_START 990 * tlv tag is valid 991 * 992 *@rx_tlv_hdr: start address of rx_pkt_tlvs 993 * 994 * Return: true if RX_MPDU_START is valid, else false. 995 */ 996 static uint8_t hal_rx_mpdu_start_tlv_tag_valid_6390(void *rx_tlv_hdr) 997 { 998 struct rx_pkt_tlvs *rx_desc = (struct rx_pkt_tlvs *)rx_tlv_hdr; 999 uint32_t tlv_tag; 1000 1001 tlv_tag = HAL_RX_GET_USER_TLV32_TYPE(&rx_desc->mpdu_start_tlv); 1002 1003 return tlv_tag == WIFIRX_MPDU_START_E ? true : false; 1004 } 1005 1006 /** 1007 * hal_get_window_address_6390(): Function to get hp/tp address 1008 * @hal_soc: Pointer to hal_soc 1009 * @addr: address offset of register 1010 * 1011 * Return: modified address offset of register 1012 */ 1013 static inline qdf_iomem_t hal_get_window_address_6390(struct hal_soc *hal_soc, 1014 qdf_iomem_t addr) 1015 { 1016 return addr; 1017 } 1018 1019 /** 1020 * hal_reo_set_err_dst_remap_6390(): Function to set REO error destination 1021 * ring remap register 1022 * @hal_soc: Pointer to hal_soc 1023 * 1024 * Return: none. 1025 */ 1026 static void 1027 hal_reo_set_err_dst_remap_6390(void *hal_soc) 1028 { 1029 /* 1030 * Set REO error 2k jump (error code 5) / OOR (error code 7) 1031 * frame routed to REO2TCL ring. 1032 */ 1033 uint32_t dst_remap_ix0 = 1034 HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 0) | 1035 HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 1) | 1036 HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 2) | 1037 HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 3) | 1038 HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 4) | 1039 HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 5) | 1040 HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 6) | 1041 HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 7) | 1042 HAL_REO_ERR_REMAP_IX0(REO_REMAP_TCL, 8) | 1043 HAL_REO_ERR_REMAP_IX0(REO_REMAP_RELEASE, 9); 1044 1045 HAL_REG_WRITE(hal_soc, 1046 HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0_ADDR( 1047 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1048 dst_remap_ix0); 1049 1050 hal_info("HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0 0x%x", 1051 HAL_REG_READ( 1052 hal_soc, 1053 HWIO_REO_R0_ERROR_DESTINATION_MAPPING_IX_0_ADDR( 1054 SEQ_WCSS_UMAC_REO_REG_OFFSET))); 1055 } 1056 1057 static 1058 void hal_compute_reo_remap_ix2_ix3_6390(uint32_t *ring, uint32_t num_rings, 1059 uint32_t *remap1, uint32_t *remap2) 1060 { 1061 switch (num_rings) { 1062 case 3: 1063 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 1064 HAL_REO_REMAP_IX2(ring[1], 17) | 1065 HAL_REO_REMAP_IX2(ring[2], 18) | 1066 HAL_REO_REMAP_IX2(ring[0], 19) | 1067 HAL_REO_REMAP_IX2(ring[1], 20) | 1068 HAL_REO_REMAP_IX2(ring[2], 21) | 1069 HAL_REO_REMAP_IX2(ring[0], 22) | 1070 HAL_REO_REMAP_IX2(ring[1], 23); 1071 1072 *remap2 = HAL_REO_REMAP_IX3(ring[2], 24) | 1073 HAL_REO_REMAP_IX3(ring[0], 25) | 1074 HAL_REO_REMAP_IX3(ring[1], 26) | 1075 HAL_REO_REMAP_IX3(ring[2], 27) | 1076 HAL_REO_REMAP_IX3(ring[0], 28) | 1077 HAL_REO_REMAP_IX3(ring[1], 29) | 1078 HAL_REO_REMAP_IX3(ring[2], 30) | 1079 HAL_REO_REMAP_IX3(ring[0], 31); 1080 break; 1081 case 4: 1082 *remap1 = HAL_REO_REMAP_IX2(ring[0], 16) | 1083 HAL_REO_REMAP_IX2(ring[1], 17) | 1084 HAL_REO_REMAP_IX2(ring[2], 18) | 1085 HAL_REO_REMAP_IX2(ring[3], 19) | 1086 HAL_REO_REMAP_IX2(ring[0], 20) | 1087 HAL_REO_REMAP_IX2(ring[1], 21) | 1088 HAL_REO_REMAP_IX2(ring[2], 22) | 1089 HAL_REO_REMAP_IX2(ring[3], 23); 1090 1091 *remap2 = HAL_REO_REMAP_IX3(ring[0], 24) | 1092 HAL_REO_REMAP_IX3(ring[1], 25) | 1093 HAL_REO_REMAP_IX3(ring[2], 26) | 1094 HAL_REO_REMAP_IX3(ring[3], 27) | 1095 HAL_REO_REMAP_IX3(ring[0], 28) | 1096 HAL_REO_REMAP_IX3(ring[1], 29) | 1097 HAL_REO_REMAP_IX3(ring[2], 30) | 1098 HAL_REO_REMAP_IX3(ring[3], 31); 1099 break; 1100 } 1101 } 1102 1103 static 1104 void hal_compute_reo_remap_ix0_6390(uint32_t *remap0) 1105 { 1106 *remap0 = HAL_REO_REMAP_IX0(REO_REMAP_SW1, 0) | 1107 HAL_REO_REMAP_IX0(REO_REMAP_SW1, 1) | 1108 HAL_REO_REMAP_IX0(REO_REMAP_SW2, 2) | 1109 HAL_REO_REMAP_IX0(REO_REMAP_SW3, 3) | 1110 HAL_REO_REMAP_IX0(REO_REMAP_SW2, 4) | 1111 HAL_REO_REMAP_IX0(REO_REMAP_RELEASE, 5) | 1112 HAL_REO_REMAP_IX0(REO_REMAP_FW, 6) | 1113 HAL_REO_REMAP_IX0(REO_REMAP_FW, 7); 1114 } 1115 1116 #ifdef WLAN_FEATURE_MARK_FIRST_WAKEUP_PACKET 1117 /** 1118 * hal_get_first_wow_wakeup_packet_6390(): Function to get if the buffer 1119 * is the first one that wakes up host from WoW. 1120 * 1121 * @buf: network buffer 1122 * 1123 * Dummy function for QCA6390 1124 * 1125 * Returns: 1 to indicate it is first packet received that wakes up host from 1126 * WoW. Otherwise 0 1127 */ 1128 static inline uint8_t hal_get_first_wow_wakeup_packet_6390(uint8_t *buf) 1129 { 1130 return 0; 1131 } 1132 #endif 1133 1134 static void hal_hw_txrx_ops_attach_qca6390(struct hal_soc *hal_soc) 1135 { 1136 /* init and setup */ 1137 hal_soc->ops->hal_srng_dst_hw_init = hal_srng_dst_hw_init_generic; 1138 hal_soc->ops->hal_srng_src_hw_init = hal_srng_src_hw_init_generic; 1139 hal_soc->ops->hal_get_hw_hptp = hal_get_hw_hptp_generic; 1140 hal_soc->ops->hal_reo_setup = hal_reo_setup_generic_li; 1141 hal_soc->ops->hal_get_window_address = hal_get_window_address_6390; 1142 hal_soc->ops->hal_reo_set_err_dst_remap = 1143 hal_reo_set_err_dst_remap_6390; 1144 1145 /* tx */ 1146 hal_soc->ops->hal_tx_desc_set_dscp_tid_table_id = 1147 hal_tx_desc_set_dscp_tid_table_id_6390; 1148 hal_soc->ops->hal_tx_set_dscp_tid_map = hal_tx_set_dscp_tid_map_6390; 1149 hal_soc->ops->hal_tx_update_dscp_tid = hal_tx_update_dscp_tid_6390; 1150 hal_soc->ops->hal_tx_desc_set_lmac_id = hal_tx_desc_set_lmac_id_6390; 1151 hal_soc->ops->hal_tx_desc_set_buf_addr = 1152 hal_tx_desc_set_buf_addr_generic_li; 1153 hal_soc->ops->hal_tx_desc_set_search_type = 1154 hal_tx_desc_set_search_type_generic_li; 1155 hal_soc->ops->hal_tx_desc_set_search_index = 1156 hal_tx_desc_set_search_index_generic_li; 1157 hal_soc->ops->hal_tx_desc_set_cache_set_num = 1158 hal_tx_desc_set_cache_set_num_generic_li; 1159 hal_soc->ops->hal_tx_comp_get_status = 1160 hal_tx_comp_get_status_generic_li; 1161 hal_soc->ops->hal_tx_comp_get_release_reason = 1162 hal_tx_comp_get_release_reason_generic_li; 1163 hal_soc->ops->hal_get_wbm_internal_error = 1164 hal_get_wbm_internal_error_generic_li; 1165 hal_soc->ops->hal_tx_desc_set_mesh_en = hal_tx_desc_set_mesh_en_6390; 1166 hal_soc->ops->hal_tx_init_cmd_credit_ring = 1167 hal_tx_init_cmd_credit_ring_6390; 1168 1169 /* rx */ 1170 hal_soc->ops->hal_rx_msdu_start_nss_get = 1171 hal_rx_msdu_start_nss_get_6390; 1172 hal_soc->ops->hal_rx_mon_hw_desc_get_mpdu_status = 1173 hal_rx_mon_hw_desc_get_mpdu_status_6390; 1174 hal_soc->ops->hal_rx_get_tlv = hal_rx_get_tlv_6390; 1175 hal_soc->ops->hal_rx_proc_phyrx_other_receive_info_tlv = 1176 hal_rx_proc_phyrx_other_receive_info_tlv_6390; 1177 hal_soc->ops->hal_rx_dump_msdu_start_tlv = 1178 hal_rx_dump_msdu_start_tlv_6390; 1179 hal_soc->ops->hal_rx_dump_msdu_end_tlv = hal_rx_dump_msdu_end_tlv_6390; 1180 hal_soc->ops->hal_get_link_desc_size = hal_get_link_desc_size_6390; 1181 hal_soc->ops->hal_rx_mpdu_start_tid_get = 1182 hal_rx_mpdu_start_tid_get_6390; 1183 hal_soc->ops->hal_rx_msdu_start_reception_type_get = 1184 hal_rx_msdu_start_reception_type_get_6390; 1185 hal_soc->ops->hal_rx_msdu_end_da_idx_get = 1186 hal_rx_msdu_end_da_idx_get_6390; 1187 hal_soc->ops->hal_rx_msdu_desc_info_get_ptr = 1188 hal_rx_msdu_desc_info_get_ptr_6390; 1189 hal_soc->ops->hal_rx_link_desc_msdu0_ptr = 1190 hal_rx_link_desc_msdu0_ptr_6390; 1191 hal_soc->ops->hal_reo_status_get_header = 1192 hal_reo_status_get_header_6390; 1193 hal_soc->ops->hal_rx_status_get_tlv_info = 1194 hal_rx_status_get_tlv_info_generic_li; 1195 hal_soc->ops->hal_rx_wbm_err_info_get = 1196 hal_rx_wbm_err_info_get_generic_li; 1197 hal_soc->ops->hal_rx_dump_mpdu_start_tlv = 1198 hal_rx_dump_mpdu_start_tlv_generic_li; 1199 1200 hal_soc->ops->hal_tx_set_pcp_tid_map = 1201 hal_tx_set_pcp_tid_map_generic_li; 1202 hal_soc->ops->hal_tx_update_pcp_tid_map = 1203 hal_tx_update_pcp_tid_generic_li; 1204 hal_soc->ops->hal_tx_set_tidmap_prty = 1205 hal_tx_update_tidmap_prty_generic_li; 1206 hal_soc->ops->hal_rx_get_rx_fragment_number = 1207 hal_rx_get_rx_fragment_number_6390; 1208 hal_soc->ops->hal_rx_msdu_end_da_is_mcbc_get = 1209 hal_rx_msdu_end_da_is_mcbc_get_6390; 1210 hal_soc->ops->hal_rx_msdu_end_sa_is_valid_get = 1211 hal_rx_msdu_end_sa_is_valid_get_6390; 1212 hal_soc->ops->hal_rx_msdu_end_sa_idx_get = 1213 hal_rx_msdu_end_sa_idx_get_6390; 1214 hal_soc->ops->hal_rx_desc_is_first_msdu = 1215 hal_rx_desc_is_first_msdu_6390; 1216 hal_soc->ops->hal_rx_msdu_end_l3_hdr_padding_get = 1217 hal_rx_msdu_end_l3_hdr_padding_get_6390; 1218 hal_soc->ops->hal_rx_encryption_info_valid = 1219 hal_rx_encryption_info_valid_6390; 1220 hal_soc->ops->hal_rx_print_pn = hal_rx_print_pn_6390; 1221 hal_soc->ops->hal_rx_msdu_end_first_msdu_get = 1222 hal_rx_msdu_end_first_msdu_get_6390; 1223 hal_soc->ops->hal_rx_msdu_end_da_is_valid_get = 1224 hal_rx_msdu_end_da_is_valid_get_6390; 1225 hal_soc->ops->hal_rx_msdu_end_last_msdu_get = 1226 hal_rx_msdu_end_last_msdu_get_6390; 1227 hal_soc->ops->hal_rx_get_mpdu_mac_ad4_valid = 1228 hal_rx_get_mpdu_mac_ad4_valid_6390; 1229 hal_soc->ops->hal_rx_mpdu_start_sw_peer_id_get = 1230 hal_rx_mpdu_start_sw_peer_id_get_6390; 1231 hal_soc->ops->hal_rx_tlv_peer_meta_data_get = 1232 hal_rx_mpdu_peer_meta_data_get_li; 1233 hal_soc->ops->hal_rx_mpdu_get_to_ds = hal_rx_mpdu_get_to_ds_6390; 1234 hal_soc->ops->hal_rx_mpdu_get_fr_ds = hal_rx_mpdu_get_fr_ds_6390; 1235 hal_soc->ops->hal_rx_get_mpdu_frame_control_valid = 1236 hal_rx_get_mpdu_frame_control_valid_6390; 1237 hal_soc->ops->hal_rx_get_frame_ctrl_field = 1238 hal_rx_get_frame_ctrl_field_li; 1239 hal_soc->ops->hal_rx_mpdu_get_addr1 = hal_rx_mpdu_get_addr1_6390; 1240 hal_soc->ops->hal_rx_mpdu_get_addr2 = hal_rx_mpdu_get_addr2_6390; 1241 hal_soc->ops->hal_rx_mpdu_get_addr3 = hal_rx_mpdu_get_addr3_6390; 1242 hal_soc->ops->hal_rx_mpdu_get_addr4 = hal_rx_mpdu_get_addr4_6390; 1243 hal_soc->ops->hal_rx_get_mpdu_sequence_control_valid = 1244 hal_rx_get_mpdu_sequence_control_valid_6390; 1245 hal_soc->ops->hal_rx_is_unicast = hal_rx_is_unicast_6390; 1246 hal_soc->ops->hal_rx_tid_get = hal_rx_tid_get_6390; 1247 hal_soc->ops->hal_rx_hw_desc_get_ppduid_get = 1248 hal_rx_hw_desc_get_ppduid_get_6390; 1249 hal_soc->ops->hal_rx_mpdu_start_mpdu_qos_control_valid_get = 1250 hal_rx_mpdu_start_mpdu_qos_control_valid_get_6390; 1251 hal_soc->ops->hal_rx_msdu_end_sa_sw_peer_id_get = 1252 hal_rx_msdu_end_sa_sw_peer_id_get_6390; 1253 hal_soc->ops->hal_rx_msdu0_buffer_addr_lsb = 1254 hal_rx_msdu0_buffer_addr_lsb_6390; 1255 hal_soc->ops->hal_rx_msdu_desc_info_ptr_get = 1256 hal_rx_msdu_desc_info_ptr_get_6390; 1257 hal_soc->ops->hal_ent_mpdu_desc_info = hal_ent_mpdu_desc_info_6390; 1258 hal_soc->ops->hal_dst_mpdu_desc_info = hal_dst_mpdu_desc_info_6390; 1259 hal_soc->ops->hal_rx_get_fc_valid = hal_rx_get_fc_valid_6390; 1260 hal_soc->ops->hal_rx_get_to_ds_flag = hal_rx_get_to_ds_flag_6390; 1261 hal_soc->ops->hal_rx_get_mac_addr2_valid = 1262 hal_rx_get_mac_addr2_valid_6390; 1263 hal_soc->ops->hal_rx_get_filter_category = 1264 hal_rx_get_filter_category_6390; 1265 hal_soc->ops->hal_rx_get_ppdu_id = hal_rx_get_ppdu_id_6390; 1266 hal_soc->ops->hal_reo_config = hal_reo_config_6390; 1267 hal_soc->ops->hal_rx_msdu_flow_idx_get = hal_rx_msdu_flow_idx_get_6390; 1268 hal_soc->ops->hal_rx_msdu_flow_idx_invalid = 1269 hal_rx_msdu_flow_idx_invalid_6390; 1270 hal_soc->ops->hal_rx_msdu_flow_idx_timeout = 1271 hal_rx_msdu_flow_idx_timeout_6390; 1272 hal_soc->ops->hal_rx_msdu_fse_metadata_get = 1273 hal_rx_msdu_fse_metadata_get_6390; 1274 hal_soc->ops->hal_rx_msdu_cce_match_get = 1275 hal_rx_msdu_cce_match_get_li; 1276 hal_soc->ops->hal_rx_msdu_cce_metadata_get = 1277 hal_rx_msdu_cce_metadata_get_6390; 1278 hal_soc->ops->hal_rx_msdu_get_flow_params = 1279 hal_rx_msdu_get_flow_params_6390; 1280 hal_soc->ops->hal_rx_tlv_get_tcp_chksum = 1281 hal_rx_tlv_get_tcp_chksum_6390; 1282 hal_soc->ops->hal_rx_get_rx_sequence = hal_rx_get_rx_sequence_6390; 1283 /* rx - msdu end fast path info fields */ 1284 hal_soc->ops->hal_rx_msdu_packet_metadata_get = 1285 hal_rx_msdu_packet_metadata_get_generic_li; 1286 hal_soc->ops->hal_rx_mpdu_start_tlv_tag_valid = 1287 hal_rx_mpdu_start_tlv_tag_valid_6390; 1288 1289 /* rx - TLV struct offsets */ 1290 hal_soc->ops->hal_rx_msdu_end_offset_get = 1291 hal_rx_msdu_end_offset_get_generic; 1292 hal_soc->ops->hal_rx_attn_offset_get = hal_rx_attn_offset_get_generic; 1293 hal_soc->ops->hal_rx_msdu_start_offset_get = 1294 hal_rx_msdu_start_offset_get_generic; 1295 hal_soc->ops->hal_rx_mpdu_start_offset_get = 1296 hal_rx_mpdu_start_offset_get_generic; 1297 hal_soc->ops->hal_rx_mpdu_end_offset_get = 1298 hal_rx_mpdu_end_offset_get_generic; 1299 #ifndef NO_RX_PKT_HDR_TLV 1300 hal_soc->ops->hal_rx_pkt_tlv_offset_get = 1301 hal_rx_pkt_tlv_offset_get_generic; 1302 #endif 1303 hal_soc->ops->hal_compute_reo_remap_ix2_ix3 = 1304 hal_compute_reo_remap_ix2_ix3_6390; 1305 hal_soc->ops->hal_setup_link_idle_list = 1306 hal_setup_link_idle_list_generic_li; 1307 #ifdef WLAN_FEATURE_MARK_FIRST_WAKEUP_PACKET 1308 hal_soc->ops->hal_get_first_wow_wakeup_packet = 1309 hal_get_first_wow_wakeup_packet_6390; 1310 #endif 1311 hal_soc->ops->hal_compute_reo_remap_ix0 = 1312 hal_compute_reo_remap_ix0_6390; 1313 }; 1314 1315 struct hal_hw_srng_config hw_srng_table_6390[] = { 1316 /* TODO: max_rings can populated by querying HW capabilities */ 1317 { /* REO_DST */ 1318 .start_ring_id = HAL_SRNG_REO2SW1, 1319 .max_rings = 4, 1320 .entry_size = sizeof(struct reo_destination_ring) >> 2, 1321 .lmac_ring = FALSE, 1322 .ring_dir = HAL_SRNG_DST_RING, 1323 .reg_start = { 1324 HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR( 1325 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1326 HWIO_REO_R2_REO2SW1_RING_HP_ADDR( 1327 SEQ_WCSS_UMAC_REO_REG_OFFSET) 1328 }, 1329 .reg_size = { 1330 HWIO_REO_R0_REO2SW2_RING_BASE_LSB_ADDR(0) - 1331 HWIO_REO_R0_REO2SW1_RING_BASE_LSB_ADDR(0), 1332 HWIO_REO_R2_REO2SW2_RING_HP_ADDR(0) - 1333 HWIO_REO_R2_REO2SW1_RING_HP_ADDR(0), 1334 }, 1335 .max_size = 1336 HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_BMSK >> 1337 HWIO_REO_R0_REO2SW1_RING_BASE_MSB_RING_SIZE_SHFT, 1338 }, 1339 { /* REO_EXCEPTION */ 1340 /* Designating REO2TCL ring as exception ring. This ring is 1341 * similar to other REO2SW rings though it is named as REO2TCL. 1342 * Any of theREO2SW rings can be used as exception ring. 1343 */ 1344 .start_ring_id = HAL_SRNG_REO2TCL, 1345 .max_rings = 1, 1346 .entry_size = sizeof(struct reo_destination_ring) >> 2, 1347 .lmac_ring = FALSE, 1348 .ring_dir = HAL_SRNG_DST_RING, 1349 .reg_start = { 1350 HWIO_REO_R0_REO2TCL_RING_BASE_LSB_ADDR( 1351 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1352 HWIO_REO_R2_REO2TCL_RING_HP_ADDR( 1353 SEQ_WCSS_UMAC_REO_REG_OFFSET) 1354 }, 1355 /* Single ring - provide ring size if multiple rings of this 1356 * type are supported 1357 */ 1358 .reg_size = {}, 1359 .max_size = 1360 HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_BMSK >> 1361 HWIO_REO_R0_REO2TCL_RING_BASE_MSB_RING_SIZE_SHFT, 1362 }, 1363 { /* REO_REINJECT */ 1364 .start_ring_id = HAL_SRNG_SW2REO, 1365 .max_rings = 1, 1366 .entry_size = sizeof(struct reo_entrance_ring) >> 2, 1367 .lmac_ring = FALSE, 1368 .ring_dir = HAL_SRNG_SRC_RING, 1369 .reg_start = { 1370 HWIO_REO_R0_SW2REO_RING_BASE_LSB_ADDR( 1371 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1372 HWIO_REO_R2_SW2REO_RING_HP_ADDR( 1373 SEQ_WCSS_UMAC_REO_REG_OFFSET) 1374 }, 1375 /* Single ring - provide ring size if multiple rings of this 1376 * type are supported 1377 */ 1378 .reg_size = {}, 1379 .max_size = HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_BMSK >> 1380 HWIO_REO_R0_SW2REO_RING_BASE_MSB_RING_SIZE_SHFT, 1381 }, 1382 { /* REO_CMD */ 1383 .start_ring_id = HAL_SRNG_REO_CMD, 1384 .max_rings = 1, 1385 .entry_size = (sizeof(struct tlv_32_hdr) + 1386 sizeof(struct reo_get_queue_stats)) >> 2, 1387 .lmac_ring = FALSE, 1388 .ring_dir = HAL_SRNG_SRC_RING, 1389 .reg_start = { 1390 HWIO_REO_R0_REO_CMD_RING_BASE_LSB_ADDR( 1391 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1392 HWIO_REO_R2_REO_CMD_RING_HP_ADDR( 1393 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1394 }, 1395 /* Single ring - provide ring size if multiple rings of this 1396 * type are supported 1397 */ 1398 .reg_size = {}, 1399 .max_size = 1400 HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_BMSK >> 1401 HWIO_REO_R0_REO_CMD_RING_BASE_MSB_RING_SIZE_SHFT, 1402 }, 1403 { /* REO_STATUS */ 1404 .start_ring_id = HAL_SRNG_REO_STATUS, 1405 .max_rings = 1, 1406 .entry_size = (sizeof(struct tlv_32_hdr) + 1407 sizeof(struct reo_get_queue_stats_status)) >> 2, 1408 .lmac_ring = FALSE, 1409 .ring_dir = HAL_SRNG_DST_RING, 1410 .reg_start = { 1411 HWIO_REO_R0_REO_STATUS_RING_BASE_LSB_ADDR( 1412 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1413 HWIO_REO_R2_REO_STATUS_RING_HP_ADDR( 1414 SEQ_WCSS_UMAC_REO_REG_OFFSET), 1415 }, 1416 /* Single ring - provide ring size if multiple rings of this 1417 * type are supported 1418 */ 1419 .reg_size = {}, 1420 .max_size = 1421 HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >> 1422 HWIO_REO_R0_REO_STATUS_RING_BASE_MSB_RING_SIZE_SHFT, 1423 }, 1424 { /* TCL_DATA */ 1425 .start_ring_id = HAL_SRNG_SW2TCL1, 1426 .max_rings = 3, 1427 .entry_size = (sizeof(struct tlv_32_hdr) + 1428 sizeof(struct tcl_data_cmd)) >> 2, 1429 .lmac_ring = FALSE, 1430 .ring_dir = HAL_SRNG_SRC_RING, 1431 .reg_start = { 1432 HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR( 1433 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET), 1434 HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR( 1435 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET), 1436 }, 1437 .reg_size = { 1438 HWIO_TCL_R0_SW2TCL2_RING_BASE_LSB_ADDR(0) - 1439 HWIO_TCL_R0_SW2TCL1_RING_BASE_LSB_ADDR(0), 1440 HWIO_TCL_R2_SW2TCL2_RING_HP_ADDR(0) - 1441 HWIO_TCL_R2_SW2TCL1_RING_HP_ADDR(0), 1442 }, 1443 .max_size = 1444 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_BMSK >> 1445 HWIO_TCL_R0_SW2TCL1_RING_BASE_MSB_RING_SIZE_SHFT, 1446 }, 1447 { /* TCL_CMD */ 1448 .start_ring_id = HAL_SRNG_SW2TCL_CMD, 1449 .max_rings = 1, 1450 .entry_size = (sizeof(struct tlv_32_hdr) + 1451 sizeof(struct tcl_gse_cmd)) >> 2, 1452 .lmac_ring = FALSE, 1453 .ring_dir = HAL_SRNG_SRC_RING, 1454 .reg_start = { 1455 HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_LSB_ADDR( 1456 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET), 1457 HWIO_TCL_R2_SW2TCL_CMD_RING_HP_ADDR( 1458 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET), 1459 }, 1460 /* Single ring - provide ring size if multiple rings of this 1461 * type are supported 1462 */ 1463 .reg_size = {}, 1464 .max_size = 1465 HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_BMSK >> 1466 HWIO_TCL_R0_SW2TCL_CMD_RING_BASE_MSB_RING_SIZE_SHFT, 1467 }, 1468 { /* TCL_STATUS */ 1469 .start_ring_id = HAL_SRNG_TCL_STATUS, 1470 .max_rings = 1, 1471 .entry_size = (sizeof(struct tlv_32_hdr) + 1472 sizeof(struct tcl_status_ring)) >> 2, 1473 .lmac_ring = FALSE, 1474 .ring_dir = HAL_SRNG_DST_RING, 1475 .reg_start = { 1476 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_LSB_ADDR( 1477 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET), 1478 HWIO_TCL_R2_TCL_STATUS1_RING_HP_ADDR( 1479 SEQ_WCSS_UMAC_MAC_TCL_REG_OFFSET), 1480 }, 1481 /* Single ring - provide ring size if multiple rings of this 1482 * type are supported 1483 */ 1484 .reg_size = {}, 1485 .max_size = 1486 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_BMSK >> 1487 HWIO_TCL_R0_TCL_STATUS1_RING_BASE_MSB_RING_SIZE_SHFT, 1488 }, 1489 { /* CE_SRC */ 1490 .start_ring_id = HAL_SRNG_CE_0_SRC, 1491 .max_rings = 12, 1492 .entry_size = sizeof(struct ce_src_desc) >> 2, 1493 .lmac_ring = FALSE, 1494 .ring_dir = HAL_SRNG_SRC_RING, 1495 .reg_start = { 1496 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR( 1497 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET), 1498 HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR( 1499 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET), 1500 }, 1501 .reg_size = { 1502 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET - 1503 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET, 1504 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_SRC_REG_OFFSET - 1505 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_SRC_REG_OFFSET, 1506 }, 1507 .max_size = 1508 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >> 1509 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT, 1510 }, 1511 { /* CE_DST */ 1512 .start_ring_id = HAL_SRNG_CE_0_DST, 1513 .max_rings = 12, 1514 .entry_size = 8 >> 2, 1515 /*TODO: entry_size above should actually be 1516 * sizeof(struct ce_dst_desc) >> 2, but couldn't find definition 1517 * of struct ce_dst_desc in HW header files 1518 */ 1519 .lmac_ring = FALSE, 1520 .ring_dir = HAL_SRNG_SRC_RING, 1521 .reg_start = { 1522 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_LSB_ADDR( 1523 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET), 1524 HWIO_WFSS_CE_CHANNEL_DST_R2_DEST_RING_HP_ADDR( 1525 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET), 1526 }, 1527 .reg_size = { 1528 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET - 1529 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET, 1530 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET - 1531 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET, 1532 }, 1533 .max_size = 1534 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_BMSK >> 1535 HWIO_WFSS_CE_CHANNEL_DST_R0_DEST_RING_BASE_MSB_RING_SIZE_SHFT, 1536 }, 1537 { /* CE_DST_STATUS */ 1538 .start_ring_id = HAL_SRNG_CE_0_DST_STATUS, 1539 .max_rings = 12, 1540 .entry_size = sizeof(struct ce_stat_desc) >> 2, 1541 .lmac_ring = FALSE, 1542 .ring_dir = HAL_SRNG_DST_RING, 1543 .reg_start = { 1544 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_LSB_ADDR( 1545 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET), 1546 HWIO_WFSS_CE_CHANNEL_DST_R2_STATUS_RING_HP_ADDR( 1547 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET), 1548 }, 1549 /* TODO: check destination status ring registers */ 1550 .reg_size = { 1551 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET - 1552 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET, 1553 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_1_CHANNEL_DST_REG_OFFSET - 1554 SEQ_WCSS_UMAC_WFSS_CE_0_REG_WFSS_CE_0_CHANNEL_DST_REG_OFFSET, 1555 }, 1556 .max_size = 1557 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_BMSK >> 1558 HWIO_WFSS_CE_CHANNEL_DST_R0_STATUS_RING_BASE_MSB_RING_SIZE_SHFT, 1559 }, 1560 { /* WBM_IDLE_LINK */ 1561 .start_ring_id = HAL_SRNG_WBM_IDLE_LINK, 1562 .max_rings = 1, 1563 .entry_size = sizeof(struct wbm_link_descriptor_ring) >> 2, 1564 .lmac_ring = FALSE, 1565 .ring_dir = HAL_SRNG_SRC_RING, 1566 .reg_start = { 1567 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET), 1568 HWIO_WBM_R2_WBM_IDLE_LINK_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET), 1569 }, 1570 /* Single ring - provide ring size if multiple rings of this 1571 * type are supported 1572 */ 1573 .reg_size = {}, 1574 .max_size = 1575 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_BMSK >> 1576 HWIO_WBM_R0_WBM_IDLE_LINK_RING_BASE_MSB_RING_SIZE_SHFT, 1577 }, 1578 { /* SW2WBM_RELEASE */ 1579 .start_ring_id = HAL_SRNG_WBM_SW_RELEASE, 1580 .max_rings = 1, 1581 .entry_size = sizeof(struct wbm_release_ring) >> 2, 1582 .lmac_ring = FALSE, 1583 .ring_dir = HAL_SRNG_SRC_RING, 1584 .reg_start = { 1585 HWIO_WBM_R0_SW_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET), 1586 HWIO_WBM_R2_SW_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET), 1587 }, 1588 /* Single ring - provide ring size if multiple rings of this 1589 * type are supported 1590 */ 1591 .reg_size = {}, 1592 .max_size = 1593 HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >> 1594 HWIO_WBM_R0_SW_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT, 1595 }, 1596 { /* WBM2SW_RELEASE */ 1597 .start_ring_id = HAL_SRNG_WBM2SW0_RELEASE, 1598 #ifdef IPA_WDI3_TX_TWO_PIPES 1599 .max_rings = 5, 1600 #else 1601 .max_rings = 4, 1602 #endif 1603 .entry_size = sizeof(struct wbm_release_ring) >> 2, 1604 .lmac_ring = FALSE, 1605 .ring_dir = HAL_SRNG_DST_RING, 1606 .reg_start = { 1607 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET), 1608 HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET), 1609 }, 1610 .reg_size = { 1611 HWIO_WBM_R0_WBM2SW1_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) - 1612 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_LSB_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET), 1613 HWIO_WBM_R2_WBM2SW1_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET) - 1614 HWIO_WBM_R2_WBM2SW0_RELEASE_RING_HP_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET), 1615 }, 1616 .max_size = 1617 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_BMSK >> 1618 HWIO_WBM_R0_WBM2SW0_RELEASE_RING_BASE_MSB_RING_SIZE_SHFT, 1619 }, 1620 { /* RXDMA_BUF */ 1621 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA0_BUF0, 1622 #ifdef IPA_OFFLOAD 1623 .max_rings = 3, 1624 #else 1625 .max_rings = 2, 1626 #endif 1627 .entry_size = sizeof(struct wbm_buffer_ring) >> 2, 1628 .lmac_ring = TRUE, 1629 .ring_dir = HAL_SRNG_SRC_RING, 1630 /* reg_start is not set because LMAC rings are not accessed 1631 * from host 1632 */ 1633 .reg_start = {}, 1634 .reg_size = {}, 1635 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1636 }, 1637 { /* RXDMA_DST */ 1638 .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW0, 1639 .max_rings = 1, 1640 .entry_size = sizeof(struct reo_entrance_ring) >> 2, 1641 .lmac_ring = TRUE, 1642 .ring_dir = HAL_SRNG_DST_RING, 1643 /* reg_start is not set because LMAC rings are not accessed 1644 * from host 1645 */ 1646 .reg_start = {}, 1647 .reg_size = {}, 1648 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1649 }, 1650 { /* RXDMA_MONITOR_BUF */ 1651 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA2_BUF, 1652 .max_rings = 1, 1653 .entry_size = sizeof(struct wbm_buffer_ring) >> 2, 1654 .lmac_ring = TRUE, 1655 .ring_dir = HAL_SRNG_SRC_RING, 1656 /* reg_start is not set because LMAC rings are not accessed 1657 * from host 1658 */ 1659 .reg_start = {}, 1660 .reg_size = {}, 1661 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1662 }, 1663 { /* RXDMA_MONITOR_STATUS */ 1664 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_STATBUF, 1665 .max_rings = 1, 1666 .entry_size = sizeof(struct wbm_buffer_ring) >> 2, 1667 .lmac_ring = TRUE, 1668 .ring_dir = HAL_SRNG_SRC_RING, 1669 /* reg_start is not set because LMAC rings are not accessed 1670 * from host 1671 */ 1672 .reg_start = {}, 1673 .reg_size = {}, 1674 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1675 }, 1676 { /* RXDMA_MONITOR_DST */ 1677 .start_ring_id = HAL_SRNG_WMAC1_RXDMA2SW1, 1678 .max_rings = 1, 1679 .entry_size = sizeof(struct reo_entrance_ring) >> 2, 1680 .lmac_ring = TRUE, 1681 .ring_dir = HAL_SRNG_DST_RING, 1682 /* reg_start is not set because LMAC rings are not accessed 1683 * from host 1684 */ 1685 .reg_start = {}, 1686 .reg_size = {}, 1687 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1688 }, 1689 { /* RXDMA_MONITOR_DESC */ 1690 .start_ring_id = HAL_SRNG_WMAC1_SW2RXDMA1_DESC, 1691 .max_rings = 1, 1692 .entry_size = sizeof(struct wbm_buffer_ring) >> 2, 1693 .lmac_ring = TRUE, 1694 .ring_dir = HAL_SRNG_SRC_RING, 1695 /* reg_start is not set because LMAC rings are not accessed 1696 * from host 1697 */ 1698 .reg_start = {}, 1699 .reg_size = {}, 1700 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1701 }, 1702 { /* DIR_BUF_RX_DMA_SRC */ 1703 .start_ring_id = HAL_SRNG_DIR_BUF_RX_SRC_DMA_RING, 1704 /* 1705 * one ring is for spectral scan 1706 * the other one is for cfr 1707 */ 1708 .max_rings = 2, 1709 .entry_size = 2, 1710 .lmac_ring = TRUE, 1711 .ring_dir = HAL_SRNG_SRC_RING, 1712 /* reg_start is not set because LMAC rings are not accessed 1713 * from host 1714 */ 1715 .reg_start = {}, 1716 .reg_size = {}, 1717 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1718 }, 1719 #ifdef WLAN_FEATURE_CIF_CFR 1720 { /* WIFI_POS_SRC */ 1721 .start_ring_id = HAL_SRNG_WIFI_POS_SRC_DMA_RING, 1722 .max_rings = 1, 1723 .entry_size = sizeof(wmi_oem_dma_buf_release_entry) >> 2, 1724 .lmac_ring = TRUE, 1725 .ring_dir = HAL_SRNG_SRC_RING, 1726 /* reg_start is not set because LMAC rings are not accessed 1727 * from host 1728 */ 1729 .reg_start = {}, 1730 .reg_size = {}, 1731 .max_size = HAL_RXDMA_MAX_RING_SIZE, 1732 }, 1733 #endif 1734 { /* REO2PPE */ 0}, 1735 { /* PPE2TCL */ 0}, 1736 { /* PPE_RELEASE */ 0}, 1737 { /* TX_MONITOR_BUF */ 0}, 1738 { /* TX_MONITOR_DST */ 0}, 1739 { /* SW2RXDMA_NEW */ 0}, 1740 }; 1741 1742 /** 1743 * hal_qca6390_attach() - Attach 6390 target specific hal_soc ops, 1744 * offset and srng table 1745 */ 1746 void hal_qca6390_attach(struct hal_soc *hal_soc) 1747 { 1748 hal_soc->hw_srng_table = hw_srng_table_6390; 1749 hal_srng_hw_reg_offset_init_generic(hal_soc); 1750 hal_hw_txrx_default_ops_attach_li(hal_soc); 1751 hal_hw_txrx_ops_attach_qca6390(hal_soc); 1752 } 1753