1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. 5 */ 6 7 #include <linux/types.h> 8 #include <linux/bitops.h> 9 #include <linux/bitfield.h> 10 11 #include "debug.h" 12 #include "core.h" 13 #include "ce.h" 14 #include "hw.h" 15 #include "mhi.h" 16 #include "dp_rx.h" 17 18 static const guid_t wcn7850_uuid = GUID_INIT(0xf634f534, 0x6147, 0x11ec, 19 0x90, 0xd6, 0x02, 0x42, 20 0xac, 0x12, 0x00, 0x03); 21 22 static u8 ath12k_hw_qcn9274_mac_from_pdev_id(int pdev_idx) 23 { 24 return pdev_idx; 25 } 26 27 static int ath12k_hw_mac_id_to_pdev_id_qcn9274(const struct ath12k_hw_params *hw, 28 int mac_id) 29 { 30 return mac_id; 31 } 32 33 static int ath12k_hw_mac_id_to_srng_id_qcn9274(const struct ath12k_hw_params *hw, 34 int mac_id) 35 { 36 return 0; 37 } 38 39 static u8 ath12k_hw_get_ring_selector_qcn9274(struct sk_buff *skb) 40 { 41 return smp_processor_id(); 42 } 43 44 static bool ath12k_dp_srng_is_comp_ring_qcn9274(int ring_num) 45 { 46 if (ring_num < 3 || ring_num == 4) 47 return true; 48 49 return false; 50 } 51 52 static int ath12k_hw_mac_id_to_pdev_id_wcn7850(const struct ath12k_hw_params *hw, 53 int mac_id) 54 { 55 return 0; 56 } 57 58 static int ath12k_hw_mac_id_to_srng_id_wcn7850(const struct ath12k_hw_params *hw, 59 int mac_id) 60 { 61 return mac_id; 62 } 63 64 static u8 ath12k_hw_get_ring_selector_wcn7850(struct sk_buff *skb) 65 { 66 return skb_get_queue_mapping(skb); 67 } 68 69 static bool ath12k_dp_srng_is_comp_ring_wcn7850(int ring_num) 70 { 71 if (ring_num == 0 || ring_num == 2 || ring_num == 4) 72 return true; 73 74 return false; 75 } 76 77 static const struct ath12k_hw_ops qcn9274_ops = { 78 .get_hw_mac_from_pdev_id = ath12k_hw_qcn9274_mac_from_pdev_id, 79 .mac_id_to_pdev_id = ath12k_hw_mac_id_to_pdev_id_qcn9274, 80 .mac_id_to_srng_id = ath12k_hw_mac_id_to_srng_id_qcn9274, 81 .rxdma_ring_sel_config = ath12k_dp_rxdma_ring_sel_config_qcn9274, 82 .get_ring_selector = ath12k_hw_get_ring_selector_qcn9274, 83 .dp_srng_is_tx_comp_ring = ath12k_dp_srng_is_comp_ring_qcn9274, 84 }; 85 86 static const struct ath12k_hw_ops wcn7850_ops = { 87 .get_hw_mac_from_pdev_id = ath12k_hw_qcn9274_mac_from_pdev_id, 88 .mac_id_to_pdev_id = ath12k_hw_mac_id_to_pdev_id_wcn7850, 89 .mac_id_to_srng_id = ath12k_hw_mac_id_to_srng_id_wcn7850, 90 .rxdma_ring_sel_config = ath12k_dp_rxdma_ring_sel_config_wcn7850, 91 .get_ring_selector = ath12k_hw_get_ring_selector_wcn7850, 92 .dp_srng_is_tx_comp_ring = ath12k_dp_srng_is_comp_ring_wcn7850, 93 }; 94 95 #define ATH12K_TX_RING_MASK_0 0x1 96 #define ATH12K_TX_RING_MASK_1 0x2 97 #define ATH12K_TX_RING_MASK_2 0x4 98 #define ATH12K_TX_RING_MASK_3 0x8 99 #define ATH12K_TX_RING_MASK_4 0x10 100 101 #define ATH12K_RX_RING_MASK_0 0x1 102 #define ATH12K_RX_RING_MASK_1 0x2 103 #define ATH12K_RX_RING_MASK_2 0x4 104 #define ATH12K_RX_RING_MASK_3 0x8 105 106 #define ATH12K_RX_ERR_RING_MASK_0 0x1 107 108 #define ATH12K_RX_WBM_REL_RING_MASK_0 0x1 109 110 #define ATH12K_REO_STATUS_RING_MASK_0 0x1 111 112 #define ATH12K_HOST2RXDMA_RING_MASK_0 0x1 113 114 #define ATH12K_RX_MON_RING_MASK_0 0x1 115 #define ATH12K_RX_MON_RING_MASK_1 0x2 116 #define ATH12K_RX_MON_RING_MASK_2 0x4 117 118 #define ATH12K_TX_MON_RING_MASK_0 0x1 119 #define ATH12K_TX_MON_RING_MASK_1 0x2 120 121 /* Target firmware's Copy Engine configuration. */ 122 static const struct ce_pipe_config ath12k_target_ce_config_wlan_qcn9274[] = { 123 /* CE0: host->target HTC control and raw streams */ 124 { 125 .pipenum = __cpu_to_le32(0), 126 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 127 .nentries = __cpu_to_le32(32), 128 .nbytes_max = __cpu_to_le32(2048), 129 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 130 .reserved = __cpu_to_le32(0), 131 }, 132 133 /* CE1: target->host HTT + HTC control */ 134 { 135 .pipenum = __cpu_to_le32(1), 136 .pipedir = __cpu_to_le32(PIPEDIR_IN), 137 .nentries = __cpu_to_le32(32), 138 .nbytes_max = __cpu_to_le32(2048), 139 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 140 .reserved = __cpu_to_le32(0), 141 }, 142 143 /* CE2: target->host WMI */ 144 { 145 .pipenum = __cpu_to_le32(2), 146 .pipedir = __cpu_to_le32(PIPEDIR_IN), 147 .nentries = __cpu_to_le32(32), 148 .nbytes_max = __cpu_to_le32(2048), 149 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 150 .reserved = __cpu_to_le32(0), 151 }, 152 153 /* CE3: host->target WMI (mac0) */ 154 { 155 .pipenum = __cpu_to_le32(3), 156 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 157 .nentries = __cpu_to_le32(32), 158 .nbytes_max = __cpu_to_le32(2048), 159 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 160 .reserved = __cpu_to_le32(0), 161 }, 162 163 /* CE4: host->target HTT */ 164 { 165 .pipenum = __cpu_to_le32(4), 166 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 167 .nentries = __cpu_to_le32(256), 168 .nbytes_max = __cpu_to_le32(256), 169 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), 170 .reserved = __cpu_to_le32(0), 171 }, 172 173 /* CE5: target->host Pktlog */ 174 { 175 .pipenum = __cpu_to_le32(5), 176 .pipedir = __cpu_to_le32(PIPEDIR_IN), 177 .nentries = __cpu_to_le32(32), 178 .nbytes_max = __cpu_to_le32(2048), 179 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 180 .reserved = __cpu_to_le32(0), 181 }, 182 183 /* CE6: Reserved for target autonomous hif_memcpy */ 184 { 185 .pipenum = __cpu_to_le32(6), 186 .pipedir = __cpu_to_le32(PIPEDIR_INOUT), 187 .nentries = __cpu_to_le32(32), 188 .nbytes_max = __cpu_to_le32(16384), 189 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 190 .reserved = __cpu_to_le32(0), 191 }, 192 193 /* CE7: host->target WMI (mac1) */ 194 { 195 .pipenum = __cpu_to_le32(7), 196 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 197 .nentries = __cpu_to_le32(32), 198 .nbytes_max = __cpu_to_le32(2048), 199 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 200 .reserved = __cpu_to_le32(0), 201 }, 202 203 /* CE8: Reserved for target autonomous hif_memcpy */ 204 { 205 .pipenum = __cpu_to_le32(8), 206 .pipedir = __cpu_to_le32(PIPEDIR_INOUT), 207 .nentries = __cpu_to_le32(32), 208 .nbytes_max = __cpu_to_le32(16384), 209 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 210 .reserved = __cpu_to_le32(0), 211 }, 212 213 /* CE9, 10 and 11: Reserved for MHI */ 214 215 /* CE12: Target CV prefetch */ 216 { 217 .pipenum = __cpu_to_le32(12), 218 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 219 .nentries = __cpu_to_le32(32), 220 .nbytes_max = __cpu_to_le32(2048), 221 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 222 .reserved = __cpu_to_le32(0), 223 }, 224 225 /* CE13: Target CV prefetch */ 226 { 227 .pipenum = __cpu_to_le32(13), 228 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 229 .nentries = __cpu_to_le32(32), 230 .nbytes_max = __cpu_to_le32(2048), 231 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 232 .reserved = __cpu_to_le32(0), 233 }, 234 235 /* CE14: WMI logging/CFR/Spectral/Radar */ 236 { 237 .pipenum = __cpu_to_le32(14), 238 .pipedir = __cpu_to_le32(PIPEDIR_IN), 239 .nentries = __cpu_to_le32(32), 240 .nbytes_max = __cpu_to_le32(2048), 241 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 242 .reserved = __cpu_to_le32(0), 243 }, 244 245 /* CE15: Reserved */ 246 }; 247 248 /* Target firmware's Copy Engine configuration. */ 249 static const struct ce_pipe_config ath12k_target_ce_config_wlan_wcn7850[] = { 250 /* CE0: host->target HTC control and raw streams */ 251 { 252 .pipenum = __cpu_to_le32(0), 253 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 254 .nentries = __cpu_to_le32(32), 255 .nbytes_max = __cpu_to_le32(2048), 256 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 257 .reserved = __cpu_to_le32(0), 258 }, 259 260 /* CE1: target->host HTT + HTC control */ 261 { 262 .pipenum = __cpu_to_le32(1), 263 .pipedir = __cpu_to_le32(PIPEDIR_IN), 264 .nentries = __cpu_to_le32(32), 265 .nbytes_max = __cpu_to_le32(2048), 266 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 267 .reserved = __cpu_to_le32(0), 268 }, 269 270 /* CE2: target->host WMI */ 271 { 272 .pipenum = __cpu_to_le32(2), 273 .pipedir = __cpu_to_le32(PIPEDIR_IN), 274 .nentries = __cpu_to_le32(32), 275 .nbytes_max = __cpu_to_le32(2048), 276 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 277 .reserved = __cpu_to_le32(0), 278 }, 279 280 /* CE3: host->target WMI */ 281 { 282 .pipenum = __cpu_to_le32(3), 283 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 284 .nentries = __cpu_to_le32(32), 285 .nbytes_max = __cpu_to_le32(2048), 286 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 287 .reserved = __cpu_to_le32(0), 288 }, 289 290 /* CE4: host->target HTT */ 291 { 292 .pipenum = __cpu_to_le32(4), 293 .pipedir = __cpu_to_le32(PIPEDIR_OUT), 294 .nentries = __cpu_to_le32(256), 295 .nbytes_max = __cpu_to_le32(256), 296 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), 297 .reserved = __cpu_to_le32(0), 298 }, 299 300 /* CE5: target->host Pktlog */ 301 { 302 .pipenum = __cpu_to_le32(5), 303 .pipedir = __cpu_to_le32(PIPEDIR_IN), 304 .nentries = __cpu_to_le32(32), 305 .nbytes_max = __cpu_to_le32(2048), 306 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 307 .reserved = __cpu_to_le32(0), 308 }, 309 310 /* CE6: Reserved for target autonomous hif_memcpy */ 311 { 312 .pipenum = __cpu_to_le32(6), 313 .pipedir = __cpu_to_le32(PIPEDIR_INOUT), 314 .nentries = __cpu_to_le32(32), 315 .nbytes_max = __cpu_to_le32(16384), 316 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 317 .reserved = __cpu_to_le32(0), 318 }, 319 320 /* CE7 used only by Host */ 321 { 322 .pipenum = __cpu_to_le32(7), 323 .pipedir = __cpu_to_le32(PIPEDIR_INOUT_H2H), 324 .nentries = __cpu_to_le32(0), 325 .nbytes_max = __cpu_to_le32(0), 326 .flags = __cpu_to_le32(CE_ATTR_FLAGS | CE_ATTR_DIS_INTR), 327 .reserved = __cpu_to_le32(0), 328 }, 329 330 /* CE8 target->host used only by IPA */ 331 { 332 .pipenum = __cpu_to_le32(8), 333 .pipedir = __cpu_to_le32(PIPEDIR_INOUT), 334 .nentries = __cpu_to_le32(32), 335 .nbytes_max = __cpu_to_le32(16384), 336 .flags = __cpu_to_le32(CE_ATTR_FLAGS), 337 .reserved = __cpu_to_le32(0), 338 }, 339 /* CE 9, 10, 11 are used by MHI driver */ 340 }; 341 342 /* Map from service/endpoint to Copy Engine. 343 * This table is derived from the CE_PCI TABLE, above. 344 * It is passed to the Target at startup for use by firmware. 345 */ 346 static const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_qcn9274[] = { 347 { 348 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), 349 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 350 __cpu_to_le32(3), 351 }, 352 { 353 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), 354 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 355 __cpu_to_le32(2), 356 }, 357 { 358 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), 359 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 360 __cpu_to_le32(3), 361 }, 362 { 363 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), 364 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 365 __cpu_to_le32(2), 366 }, 367 { 368 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), 369 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 370 __cpu_to_le32(3), 371 }, 372 { 373 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), 374 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 375 __cpu_to_le32(2), 376 }, 377 { 378 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), 379 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 380 __cpu_to_le32(3), 381 }, 382 { 383 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), 384 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 385 __cpu_to_le32(2), 386 }, 387 { 388 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL), 389 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 390 __cpu_to_le32(3), 391 }, 392 { 393 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL), 394 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 395 __cpu_to_le32(2), 396 }, 397 { 398 __cpu_to_le32(ATH12K_HTC_SVC_ID_RSVD_CTRL), 399 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 400 __cpu_to_le32(0), 401 }, 402 { 403 __cpu_to_le32(ATH12K_HTC_SVC_ID_RSVD_CTRL), 404 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 405 __cpu_to_le32(1), 406 }, 407 { 408 __cpu_to_le32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS), 409 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 410 __cpu_to_le32(0), 411 }, 412 { 413 __cpu_to_le32(ATH12K_HTC_SVC_ID_TEST_RAW_STREAMS), 414 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 415 __cpu_to_le32(1), 416 }, 417 { 418 __cpu_to_le32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), 419 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 420 __cpu_to_le32(4), 421 }, 422 { 423 __cpu_to_le32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), 424 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 425 __cpu_to_le32(1), 426 }, 427 { 428 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC1), 429 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 430 __cpu_to_le32(7), 431 }, 432 { 433 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL_MAC1), 434 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 435 __cpu_to_le32(2), 436 }, 437 { 438 __cpu_to_le32(ATH12K_HTC_SVC_ID_PKT_LOG), 439 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 440 __cpu_to_le32(5), 441 }, 442 { 443 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL_DIAG), 444 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 445 __cpu_to_le32(14), 446 }, 447 448 /* (Additions here) */ 449 450 { /* must be last */ 451 __cpu_to_le32(0), 452 __cpu_to_le32(0), 453 __cpu_to_le32(0), 454 }, 455 }; 456 457 static const struct service_to_pipe ath12k_target_service_to_ce_map_wlan_wcn7850[] = { 458 { 459 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), 460 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 461 __cpu_to_le32(3), 462 }, 463 { 464 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VO), 465 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 466 __cpu_to_le32(2), 467 }, 468 { 469 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), 470 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 471 __cpu_to_le32(3), 472 }, 473 { 474 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BK), 475 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 476 __cpu_to_le32(2), 477 }, 478 { 479 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), 480 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 481 __cpu_to_le32(3), 482 }, 483 { 484 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_BE), 485 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 486 __cpu_to_le32(2), 487 }, 488 { 489 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), 490 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 491 __cpu_to_le32(3), 492 }, 493 { 494 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_DATA_VI), 495 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 496 __cpu_to_le32(2), 497 }, 498 { 499 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL), 500 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 501 __cpu_to_le32(3), 502 }, 503 { 504 __cpu_to_le32(ATH12K_HTC_SVC_ID_WMI_CONTROL), 505 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 506 __cpu_to_le32(2), 507 }, 508 { 509 __cpu_to_le32(ATH12K_HTC_SVC_ID_RSVD_CTRL), 510 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 511 __cpu_to_le32(0), 512 }, 513 { 514 __cpu_to_le32(ATH12K_HTC_SVC_ID_RSVD_CTRL), 515 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 516 __cpu_to_le32(2), 517 }, 518 { 519 __cpu_to_le32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), 520 __cpu_to_le32(PIPEDIR_OUT), /* out = UL = host -> target */ 521 __cpu_to_le32(4), 522 }, 523 { 524 __cpu_to_le32(ATH12K_HTC_SVC_ID_HTT_DATA_MSG), 525 __cpu_to_le32(PIPEDIR_IN), /* in = DL = target -> host */ 526 __cpu_to_le32(1), 527 }, 528 529 /* (Additions here) */ 530 531 { /* must be last */ 532 __cpu_to_le32(0), 533 __cpu_to_le32(0), 534 __cpu_to_le32(0), 535 }, 536 }; 537 538 static const struct ath12k_hw_ring_mask ath12k_hw_ring_mask_qcn9274 = { 539 .tx = { 540 ATH12K_TX_RING_MASK_0, 541 ATH12K_TX_RING_MASK_1, 542 ATH12K_TX_RING_MASK_2, 543 ATH12K_TX_RING_MASK_3, 544 }, 545 .rx_mon_dest = { 546 0, 0, 0, 547 }, 548 .rx = { 549 0, 0, 0, 0, 550 ATH12K_RX_RING_MASK_0, 551 ATH12K_RX_RING_MASK_1, 552 ATH12K_RX_RING_MASK_2, 553 ATH12K_RX_RING_MASK_3, 554 }, 555 .rx_err = { 556 0, 0, 0, 557 ATH12K_RX_ERR_RING_MASK_0, 558 }, 559 .rx_wbm_rel = { 560 0, 0, 0, 561 ATH12K_RX_WBM_REL_RING_MASK_0, 562 }, 563 .reo_status = { 564 0, 0, 0, 565 ATH12K_REO_STATUS_RING_MASK_0, 566 }, 567 .host2rxdma = { 568 0, 0, 0, 569 ATH12K_HOST2RXDMA_RING_MASK_0, 570 }, 571 .tx_mon_dest = { 572 0, 0, 0, 573 }, 574 }; 575 576 static const struct ath12k_hw_ring_mask ath12k_hw_ring_mask_wcn7850 = { 577 .tx = { 578 ATH12K_TX_RING_MASK_0, 579 ATH12K_TX_RING_MASK_1, 580 ATH12K_TX_RING_MASK_2, 581 }, 582 .rx_mon_dest = { 583 }, 584 .rx = { 585 0, 0, 0, 586 ATH12K_RX_RING_MASK_0, 587 ATH12K_RX_RING_MASK_1, 588 ATH12K_RX_RING_MASK_2, 589 ATH12K_RX_RING_MASK_3, 590 }, 591 .rx_err = { 592 ATH12K_RX_ERR_RING_MASK_0, 593 }, 594 .rx_wbm_rel = { 595 ATH12K_RX_WBM_REL_RING_MASK_0, 596 }, 597 .reo_status = { 598 ATH12K_REO_STATUS_RING_MASK_0, 599 }, 600 .host2rxdma = { 601 }, 602 .tx_mon_dest = { 603 }, 604 }; 605 606 static const struct ath12k_hw_regs qcn9274_v1_regs = { 607 /* SW2TCL(x) R0 ring configuration address */ 608 .hal_tcl1_ring_id = 0x00000908, 609 .hal_tcl1_ring_misc = 0x00000910, 610 .hal_tcl1_ring_tp_addr_lsb = 0x0000091c, 611 .hal_tcl1_ring_tp_addr_msb = 0x00000920, 612 .hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000930, 613 .hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000934, 614 .hal_tcl1_ring_msi1_base_lsb = 0x00000948, 615 .hal_tcl1_ring_msi1_base_msb = 0x0000094c, 616 .hal_tcl1_ring_msi1_data = 0x00000950, 617 .hal_tcl_ring_base_lsb = 0x00000b58, 618 619 /* TCL STATUS ring address */ 620 .hal_tcl_status_ring_base_lsb = 0x00000d38, 621 622 .hal_wbm_idle_ring_base_lsb = 0x00000d0c, 623 .hal_wbm_idle_ring_misc_addr = 0x00000d1c, 624 .hal_wbm_r0_idle_list_cntl_addr = 0x00000210, 625 .hal_wbm_r0_idle_list_size_addr = 0x00000214, 626 .hal_wbm_scattered_ring_base_lsb = 0x00000220, 627 .hal_wbm_scattered_ring_base_msb = 0x00000224, 628 .hal_wbm_scattered_desc_head_info_ix0 = 0x00000230, 629 .hal_wbm_scattered_desc_head_info_ix1 = 0x00000234, 630 .hal_wbm_scattered_desc_tail_info_ix0 = 0x00000240, 631 .hal_wbm_scattered_desc_tail_info_ix1 = 0x00000244, 632 .hal_wbm_scattered_desc_ptr_hp_addr = 0x0000024c, 633 634 .hal_wbm_sw_release_ring_base_lsb = 0x0000034c, 635 .hal_wbm_sw1_release_ring_base_lsb = 0x000003c4, 636 .hal_wbm0_release_ring_base_lsb = 0x00000dd8, 637 .hal_wbm1_release_ring_base_lsb = 0x00000e50, 638 639 /* PCIe base address */ 640 .pcie_qserdes_sysclk_en_sel = 0x01e0c0a8, 641 .pcie_pcs_osc_dtct_config_base = 0x01e0d45c, 642 643 /* PPE release ring address */ 644 .hal_ppe_rel_ring_base = 0x0000043c, 645 646 /* REO DEST ring address */ 647 .hal_reo2_ring_base = 0x0000055c, 648 .hal_reo1_misc_ctrl_addr = 0x00000b7c, 649 .hal_reo1_sw_cookie_cfg0 = 0x00000050, 650 .hal_reo1_sw_cookie_cfg1 = 0x00000054, 651 .hal_reo1_qdesc_lut_base0 = 0x00000058, 652 .hal_reo1_qdesc_lut_base1 = 0x0000005c, 653 .hal_reo1_ring_base_lsb = 0x000004e4, 654 .hal_reo1_ring_base_msb = 0x000004e8, 655 .hal_reo1_ring_id = 0x000004ec, 656 .hal_reo1_ring_misc = 0x000004f4, 657 .hal_reo1_ring_hp_addr_lsb = 0x000004f8, 658 .hal_reo1_ring_hp_addr_msb = 0x000004fc, 659 .hal_reo1_ring_producer_int_setup = 0x00000508, 660 .hal_reo1_ring_msi1_base_lsb = 0x0000052C, 661 .hal_reo1_ring_msi1_base_msb = 0x00000530, 662 .hal_reo1_ring_msi1_data = 0x00000534, 663 .hal_reo1_aging_thres_ix0 = 0x00000b08, 664 .hal_reo1_aging_thres_ix1 = 0x00000b0c, 665 .hal_reo1_aging_thres_ix2 = 0x00000b10, 666 .hal_reo1_aging_thres_ix3 = 0x00000b14, 667 668 /* REO Exception ring address */ 669 .hal_reo2_sw0_ring_base = 0x000008a4, 670 671 /* REO Reinject ring address */ 672 .hal_sw2reo_ring_base = 0x00000304, 673 .hal_sw2reo1_ring_base = 0x0000037c, 674 675 /* REO cmd ring address */ 676 .hal_reo_cmd_ring_base = 0x0000028c, 677 678 /* REO status ring address */ 679 .hal_reo_status_ring_base = 0x00000a84, 680 }; 681 682 static const struct ath12k_hw_regs qcn9274_v2_regs = { 683 /* SW2TCL(x) R0 ring configuration address */ 684 .hal_tcl1_ring_id = 0x00000908, 685 .hal_tcl1_ring_misc = 0x00000910, 686 .hal_tcl1_ring_tp_addr_lsb = 0x0000091c, 687 .hal_tcl1_ring_tp_addr_msb = 0x00000920, 688 .hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000930, 689 .hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000934, 690 .hal_tcl1_ring_msi1_base_lsb = 0x00000948, 691 .hal_tcl1_ring_msi1_base_msb = 0x0000094c, 692 .hal_tcl1_ring_msi1_data = 0x00000950, 693 .hal_tcl_ring_base_lsb = 0x00000b58, 694 695 /* TCL STATUS ring address */ 696 .hal_tcl_status_ring_base_lsb = 0x00000d38, 697 698 /* WBM idle link ring address */ 699 .hal_wbm_idle_ring_base_lsb = 0x00000d3c, 700 .hal_wbm_idle_ring_misc_addr = 0x00000d4c, 701 .hal_wbm_r0_idle_list_cntl_addr = 0x00000240, 702 .hal_wbm_r0_idle_list_size_addr = 0x00000244, 703 .hal_wbm_scattered_ring_base_lsb = 0x00000250, 704 .hal_wbm_scattered_ring_base_msb = 0x00000254, 705 .hal_wbm_scattered_desc_head_info_ix0 = 0x00000260, 706 .hal_wbm_scattered_desc_head_info_ix1 = 0x00000264, 707 .hal_wbm_scattered_desc_tail_info_ix0 = 0x00000270, 708 .hal_wbm_scattered_desc_tail_info_ix1 = 0x00000274, 709 .hal_wbm_scattered_desc_ptr_hp_addr = 0x0000027c, 710 711 /* SW2WBM release ring address */ 712 .hal_wbm_sw_release_ring_base_lsb = 0x0000037c, 713 .hal_wbm_sw1_release_ring_base_lsb = 0x000003f4, 714 715 /* WBM2SW release ring address */ 716 .hal_wbm0_release_ring_base_lsb = 0x00000e08, 717 .hal_wbm1_release_ring_base_lsb = 0x00000e80, 718 719 /* PCIe base address */ 720 .pcie_qserdes_sysclk_en_sel = 0x01e0c0a8, 721 .pcie_pcs_osc_dtct_config_base = 0x01e0d45c, 722 723 /* PPE release ring address */ 724 .hal_ppe_rel_ring_base = 0x0000046c, 725 726 /* REO DEST ring address */ 727 .hal_reo2_ring_base = 0x00000578, 728 .hal_reo1_misc_ctrl_addr = 0x00000b9c, 729 .hal_reo1_sw_cookie_cfg0 = 0x0000006c, 730 .hal_reo1_sw_cookie_cfg1 = 0x00000070, 731 .hal_reo1_qdesc_lut_base0 = 0x00000074, 732 .hal_reo1_qdesc_lut_base1 = 0x00000078, 733 .hal_reo1_ring_base_lsb = 0x00000500, 734 .hal_reo1_ring_base_msb = 0x00000504, 735 .hal_reo1_ring_id = 0x00000508, 736 .hal_reo1_ring_misc = 0x00000510, 737 .hal_reo1_ring_hp_addr_lsb = 0x00000514, 738 .hal_reo1_ring_hp_addr_msb = 0x00000518, 739 .hal_reo1_ring_producer_int_setup = 0x00000524, 740 .hal_reo1_ring_msi1_base_lsb = 0x00000548, 741 .hal_reo1_ring_msi1_base_msb = 0x0000054C, 742 .hal_reo1_ring_msi1_data = 0x00000550, 743 .hal_reo1_aging_thres_ix0 = 0x00000B28, 744 .hal_reo1_aging_thres_ix1 = 0x00000B2C, 745 .hal_reo1_aging_thres_ix2 = 0x00000B30, 746 .hal_reo1_aging_thres_ix3 = 0x00000B34, 747 748 /* REO Exception ring address */ 749 .hal_reo2_sw0_ring_base = 0x000008c0, 750 751 /* REO Reinject ring address */ 752 .hal_sw2reo_ring_base = 0x00000320, 753 .hal_sw2reo1_ring_base = 0x00000398, 754 755 /* REO cmd ring address */ 756 .hal_reo_cmd_ring_base = 0x000002A8, 757 758 /* REO status ring address */ 759 .hal_reo_status_ring_base = 0x00000aa0, 760 }; 761 762 static const struct ath12k_hw_regs wcn7850_regs = { 763 /* SW2TCL(x) R0 ring configuration address */ 764 .hal_tcl1_ring_id = 0x00000908, 765 .hal_tcl1_ring_misc = 0x00000910, 766 .hal_tcl1_ring_tp_addr_lsb = 0x0000091c, 767 .hal_tcl1_ring_tp_addr_msb = 0x00000920, 768 .hal_tcl1_ring_consumer_int_setup_ix0 = 0x00000930, 769 .hal_tcl1_ring_consumer_int_setup_ix1 = 0x00000934, 770 .hal_tcl1_ring_msi1_base_lsb = 0x00000948, 771 .hal_tcl1_ring_msi1_base_msb = 0x0000094c, 772 .hal_tcl1_ring_msi1_data = 0x00000950, 773 .hal_tcl_ring_base_lsb = 0x00000b58, 774 775 /* TCL STATUS ring address */ 776 .hal_tcl_status_ring_base_lsb = 0x00000d38, 777 778 .hal_wbm_idle_ring_base_lsb = 0x00000d3c, 779 .hal_wbm_idle_ring_misc_addr = 0x00000d4c, 780 .hal_wbm_r0_idle_list_cntl_addr = 0x00000240, 781 .hal_wbm_r0_idle_list_size_addr = 0x00000244, 782 .hal_wbm_scattered_ring_base_lsb = 0x00000250, 783 .hal_wbm_scattered_ring_base_msb = 0x00000254, 784 .hal_wbm_scattered_desc_head_info_ix0 = 0x00000260, 785 .hal_wbm_scattered_desc_head_info_ix1 = 0x00000264, 786 .hal_wbm_scattered_desc_tail_info_ix0 = 0x00000270, 787 .hal_wbm_scattered_desc_tail_info_ix1 = 0x00000274, 788 .hal_wbm_scattered_desc_ptr_hp_addr = 0x00000027c, 789 790 .hal_wbm_sw_release_ring_base_lsb = 0x0000037c, 791 .hal_wbm_sw1_release_ring_base_lsb = 0x00000284, 792 .hal_wbm0_release_ring_base_lsb = 0x00000e08, 793 .hal_wbm1_release_ring_base_lsb = 0x00000e80, 794 795 /* PCIe base address */ 796 .pcie_qserdes_sysclk_en_sel = 0x01e0e0a8, 797 .pcie_pcs_osc_dtct_config_base = 0x01e0f45c, 798 799 /* PPE release ring address */ 800 .hal_ppe_rel_ring_base = 0x0000043c, 801 802 /* REO DEST ring address */ 803 .hal_reo2_ring_base = 0x0000055c, 804 .hal_reo1_misc_ctrl_addr = 0x00000b7c, 805 .hal_reo1_sw_cookie_cfg0 = 0x00000050, 806 .hal_reo1_sw_cookie_cfg1 = 0x00000054, 807 .hal_reo1_qdesc_lut_base0 = 0x00000058, 808 .hal_reo1_qdesc_lut_base1 = 0x0000005c, 809 .hal_reo1_ring_base_lsb = 0x000004e4, 810 .hal_reo1_ring_base_msb = 0x000004e8, 811 .hal_reo1_ring_id = 0x000004ec, 812 .hal_reo1_ring_misc = 0x000004f4, 813 .hal_reo1_ring_hp_addr_lsb = 0x000004f8, 814 .hal_reo1_ring_hp_addr_msb = 0x000004fc, 815 .hal_reo1_ring_producer_int_setup = 0x00000508, 816 .hal_reo1_ring_msi1_base_lsb = 0x0000052C, 817 .hal_reo1_ring_msi1_base_msb = 0x00000530, 818 .hal_reo1_ring_msi1_data = 0x00000534, 819 .hal_reo1_aging_thres_ix0 = 0x00000b08, 820 .hal_reo1_aging_thres_ix1 = 0x00000b0c, 821 .hal_reo1_aging_thres_ix2 = 0x00000b10, 822 .hal_reo1_aging_thres_ix3 = 0x00000b14, 823 824 /* REO Exception ring address */ 825 .hal_reo2_sw0_ring_base = 0x000008a4, 826 827 /* REO Reinject ring address */ 828 .hal_sw2reo_ring_base = 0x00000304, 829 .hal_sw2reo1_ring_base = 0x0000037c, 830 831 /* REO cmd ring address */ 832 .hal_reo_cmd_ring_base = 0x0000028c, 833 834 /* REO status ring address */ 835 .hal_reo_status_ring_base = 0x00000a84, 836 }; 837 838 static const struct ath12k_hw_hal_params ath12k_hw_hal_params_qcn9274 = { 839 .rx_buf_rbm = HAL_RX_BUF_RBM_SW3_BM, 840 .wbm2sw_cc_enable = HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW0_EN | 841 HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW1_EN | 842 HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW2_EN | 843 HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW3_EN | 844 HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW4_EN, 845 }; 846 847 static const struct ath12k_hw_hal_params ath12k_hw_hal_params_wcn7850 = { 848 .rx_buf_rbm = HAL_RX_BUF_RBM_SW1_BM, 849 .wbm2sw_cc_enable = HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW0_EN | 850 HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW2_EN | 851 HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW3_EN | 852 HAL_WBM_SW_COOKIE_CONV_CFG_WBM2SW4_EN, 853 }; 854 855 static const struct ath12k_hw_params ath12k_hw_params[] = { 856 { 857 .name = "qcn9274 hw1.0", 858 .hw_rev = ATH12K_HW_QCN9274_HW10, 859 .fw = { 860 .dir = "QCN9274/hw1.0", 861 .board_size = 256 * 1024, 862 .cal_offset = 128 * 1024, 863 }, 864 .max_radios = 1, 865 .single_pdev_only = false, 866 .qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9274, 867 .internal_sleep_clock = false, 868 869 .hw_ops = &qcn9274_ops, 870 .ring_mask = &ath12k_hw_ring_mask_qcn9274, 871 .regs = &qcn9274_v1_regs, 872 873 .host_ce_config = ath12k_host_ce_config_qcn9274, 874 .ce_count = 16, 875 .target_ce_config = ath12k_target_ce_config_wlan_qcn9274, 876 .target_ce_count = 12, 877 .svc_to_ce_map = ath12k_target_service_to_ce_map_wlan_qcn9274, 878 .svc_to_ce_map_len = 18, 879 880 .hal_params = &ath12k_hw_hal_params_qcn9274, 881 882 .rxdma1_enable = false, 883 .num_rxdma_per_pdev = 1, 884 .num_rxdma_dst_ring = 0, 885 .rx_mac_buf_ring = false, 886 .vdev_start_delay = false, 887 888 .interface_modes = BIT(NL80211_IFTYPE_STATION) | 889 BIT(NL80211_IFTYPE_AP) | 890 BIT(NL80211_IFTYPE_MESH_POINT) | 891 BIT(NL80211_IFTYPE_AP_VLAN), 892 .supports_monitor = false, 893 894 .idle_ps = false, 895 .download_calib = true, 896 .supports_suspend = false, 897 .tcl_ring_retry = true, 898 .reoq_lut_support = false, 899 .supports_shadow_regs = false, 900 901 .num_tcl_banks = 48, 902 .max_tx_ring = 4, 903 904 .mhi_config = &ath12k_mhi_config_qcn9274, 905 906 .wmi_init = ath12k_wmi_init_qcn9274, 907 908 .hal_ops = &hal_qcn9274_ops, 909 910 .qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01), 911 912 .rfkill_pin = 0, 913 .rfkill_cfg = 0, 914 .rfkill_on_level = 0, 915 916 .rddm_size = 0, 917 918 .def_num_link = 0, 919 .max_mlo_peer = 256, 920 921 .otp_board_id_register = QCN9274_QFPROM_RAW_RFA_PDET_ROW13_LSB, 922 923 .supports_sta_ps = false, 924 925 .acpi_guid = NULL, 926 .supports_dynamic_smps_6ghz = true, 927 928 .iova_mask = 0, 929 }, 930 { 931 .name = "wcn7850 hw2.0", 932 .hw_rev = ATH12K_HW_WCN7850_HW20, 933 934 .fw = { 935 .dir = "WCN7850/hw2.0", 936 .board_size = 256 * 1024, 937 .cal_offset = 256 * 1024, 938 }, 939 940 .max_radios = 1, 941 .single_pdev_only = true, 942 .qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_WCN7850, 943 .internal_sleep_clock = true, 944 945 .hw_ops = &wcn7850_ops, 946 .ring_mask = &ath12k_hw_ring_mask_wcn7850, 947 .regs = &wcn7850_regs, 948 949 .host_ce_config = ath12k_host_ce_config_wcn7850, 950 .ce_count = 9, 951 .target_ce_config = ath12k_target_ce_config_wlan_wcn7850, 952 .target_ce_count = 9, 953 .svc_to_ce_map = ath12k_target_service_to_ce_map_wlan_wcn7850, 954 .svc_to_ce_map_len = 14, 955 956 .hal_params = &ath12k_hw_hal_params_wcn7850, 957 958 .rxdma1_enable = false, 959 .num_rxdma_per_pdev = 2, 960 .num_rxdma_dst_ring = 1, 961 .rx_mac_buf_ring = true, 962 .vdev_start_delay = true, 963 964 .interface_modes = BIT(NL80211_IFTYPE_STATION) | 965 BIT(NL80211_IFTYPE_AP) | 966 BIT(NL80211_IFTYPE_P2P_DEVICE) | 967 BIT(NL80211_IFTYPE_P2P_CLIENT) | 968 BIT(NL80211_IFTYPE_P2P_GO), 969 .supports_monitor = false, 970 971 .idle_ps = true, 972 .download_calib = false, 973 .supports_suspend = true, 974 .tcl_ring_retry = false, 975 .reoq_lut_support = false, 976 .supports_shadow_regs = true, 977 978 .num_tcl_banks = 7, 979 .max_tx_ring = 3, 980 981 .mhi_config = &ath12k_mhi_config_wcn7850, 982 983 .wmi_init = ath12k_wmi_init_wcn7850, 984 985 .hal_ops = &hal_wcn7850_ops, 986 987 .qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01) | 988 BIT(CNSS_PCIE_PERST_NO_PULL_V01), 989 990 .rfkill_pin = 48, 991 .rfkill_cfg = 0, 992 .rfkill_on_level = 1, 993 994 .rddm_size = 0x780000, 995 996 .def_num_link = 2, 997 .max_mlo_peer = 32, 998 999 .otp_board_id_register = 0, 1000 1001 .supports_sta_ps = true, 1002 1003 .acpi_guid = &wcn7850_uuid, 1004 .supports_dynamic_smps_6ghz = false, 1005 1006 .iova_mask = ATH12K_PCIE_MAX_PAYLOAD_SIZE - 1, 1007 }, 1008 { 1009 .name = "qcn9274 hw2.0", 1010 .hw_rev = ATH12K_HW_QCN9274_HW20, 1011 .fw = { 1012 .dir = "QCN9274/hw2.0", 1013 .board_size = 256 * 1024, 1014 .cal_offset = 128 * 1024, 1015 }, 1016 .max_radios = 2, 1017 .single_pdev_only = false, 1018 .qmi_service_ins_id = ATH12K_QMI_WLFW_SERVICE_INS_ID_V01_QCN9274, 1019 .internal_sleep_clock = false, 1020 1021 .hw_ops = &qcn9274_ops, 1022 .ring_mask = &ath12k_hw_ring_mask_qcn9274, 1023 .regs = &qcn9274_v2_regs, 1024 1025 .host_ce_config = ath12k_host_ce_config_qcn9274, 1026 .ce_count = 16, 1027 .target_ce_config = ath12k_target_ce_config_wlan_qcn9274, 1028 .target_ce_count = 12, 1029 .svc_to_ce_map = ath12k_target_service_to_ce_map_wlan_qcn9274, 1030 .svc_to_ce_map_len = 18, 1031 1032 .hal_params = &ath12k_hw_hal_params_qcn9274, 1033 1034 .rxdma1_enable = false, 1035 .num_rxdma_per_pdev = 1, 1036 .num_rxdma_dst_ring = 0, 1037 .rx_mac_buf_ring = false, 1038 .vdev_start_delay = false, 1039 1040 .interface_modes = BIT(NL80211_IFTYPE_STATION) | 1041 BIT(NL80211_IFTYPE_AP) | 1042 BIT(NL80211_IFTYPE_MESH_POINT) | 1043 BIT(NL80211_IFTYPE_AP_VLAN), 1044 .supports_monitor = false, 1045 1046 .idle_ps = false, 1047 .download_calib = true, 1048 .supports_suspend = false, 1049 .tcl_ring_retry = true, 1050 .reoq_lut_support = false, 1051 .supports_shadow_regs = false, 1052 1053 .num_tcl_banks = 48, 1054 .max_tx_ring = 4, 1055 1056 .mhi_config = &ath12k_mhi_config_qcn9274, 1057 1058 .wmi_init = ath12k_wmi_init_qcn9274, 1059 1060 .hal_ops = &hal_qcn9274_ops, 1061 1062 .qmi_cnss_feature_bitmap = BIT(CNSS_QDSS_CFG_MISS_V01), 1063 1064 .rfkill_pin = 0, 1065 .rfkill_cfg = 0, 1066 .rfkill_on_level = 0, 1067 1068 .rddm_size = 0, 1069 1070 .def_num_link = 0, 1071 .max_mlo_peer = 256, 1072 1073 .otp_board_id_register = QCN9274_QFPROM_RAW_RFA_PDET_ROW13_LSB, 1074 1075 .supports_sta_ps = false, 1076 1077 .acpi_guid = NULL, 1078 .supports_dynamic_smps_6ghz = true, 1079 1080 .iova_mask = 0, 1081 }, 1082 }; 1083 1084 int ath12k_hw_init(struct ath12k_base *ab) 1085 { 1086 const struct ath12k_hw_params *hw_params = NULL; 1087 int i; 1088 1089 for (i = 0; i < ARRAY_SIZE(ath12k_hw_params); i++) { 1090 hw_params = &ath12k_hw_params[i]; 1091 1092 if (hw_params->hw_rev == ab->hw_rev) 1093 break; 1094 } 1095 1096 if (i == ARRAY_SIZE(ath12k_hw_params)) { 1097 ath12k_err(ab, "Unsupported hardware version: 0x%x\n", ab->hw_rev); 1098 return -EINVAL; 1099 } 1100 1101 ab->hw_params = hw_params; 1102 1103 ath12k_info(ab, "Hardware name: %s\n", ab->hw_params->name); 1104 1105 return 0; 1106 } 1107