1 // SPDX-License-Identifier: BSD-3-Clause-Clear 2 /* 3 * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 4 * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. 5 */ 6 7 #include <linux/elf.h> 8 9 #include "qmi.h" 10 #include "core.h" 11 #include "debug.h" 12 #include <linux/of.h> 13 #include <linux/firmware.h> 14 15 #define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02 16 #define HOST_CSTATE_BIT 0x04 17 #define PLATFORM_CAP_PCIE_GLOBAL_RESET 0x08 18 #define ATH12K_QMI_MAX_CHUNK_SIZE 2097152 19 20 static struct qmi_elem_info wlfw_host_mlo_chip_info_s_v01_ei[] = { 21 { 22 .data_type = QMI_UNSIGNED_1_BYTE, 23 .elem_len = 1, 24 .elem_size = sizeof(u8), 25 .array_type = NO_ARRAY, 26 .tlv_type = 0, 27 .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 28 chip_id), 29 }, 30 { 31 .data_type = QMI_UNSIGNED_1_BYTE, 32 .elem_len = 1, 33 .elem_size = sizeof(u8), 34 .array_type = NO_ARRAY, 35 .tlv_type = 0, 36 .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 37 num_local_links), 38 }, 39 { 40 .data_type = QMI_UNSIGNED_1_BYTE, 41 .elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01, 42 .elem_size = sizeof(u8), 43 .array_type = STATIC_ARRAY, 44 .tlv_type = 0, 45 .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 46 hw_link_id), 47 }, 48 { 49 .data_type = QMI_UNSIGNED_1_BYTE, 50 .elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01, 51 .elem_size = sizeof(u8), 52 .array_type = STATIC_ARRAY, 53 .tlv_type = 0, 54 .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 55 valid_mlo_link_id), 56 }, 57 { 58 .data_type = QMI_EOTI, 59 .array_type = NO_ARRAY, 60 .tlv_type = QMI_COMMON_TLV_TYPE, 61 }, 62 }; 63 64 static struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = { 65 { 66 .data_type = QMI_OPT_FLAG, 67 .elem_len = 1, 68 .elem_size = sizeof(u8), 69 .array_type = NO_ARRAY, 70 .tlv_type = 0x10, 71 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 72 num_clients_valid), 73 }, 74 { 75 .data_type = QMI_UNSIGNED_4_BYTE, 76 .elem_len = 1, 77 .elem_size = sizeof(u32), 78 .array_type = NO_ARRAY, 79 .tlv_type = 0x10, 80 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 81 num_clients), 82 }, 83 { 84 .data_type = QMI_OPT_FLAG, 85 .elem_len = 1, 86 .elem_size = sizeof(u8), 87 .array_type = NO_ARRAY, 88 .tlv_type = 0x11, 89 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 90 wake_msi_valid), 91 }, 92 { 93 .data_type = QMI_UNSIGNED_4_BYTE, 94 .elem_len = 1, 95 .elem_size = sizeof(u32), 96 .array_type = NO_ARRAY, 97 .tlv_type = 0x11, 98 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 99 wake_msi), 100 }, 101 { 102 .data_type = QMI_OPT_FLAG, 103 .elem_len = 1, 104 .elem_size = sizeof(u8), 105 .array_type = NO_ARRAY, 106 .tlv_type = 0x12, 107 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 108 gpios_valid), 109 }, 110 { 111 .data_type = QMI_DATA_LEN, 112 .elem_len = 1, 113 .elem_size = sizeof(u8), 114 .array_type = NO_ARRAY, 115 .tlv_type = 0x12, 116 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 117 gpios_len), 118 }, 119 { 120 .data_type = QMI_UNSIGNED_4_BYTE, 121 .elem_len = QMI_WLFW_MAX_NUM_GPIO_V01, 122 .elem_size = sizeof(u32), 123 .array_type = VAR_LEN_ARRAY, 124 .tlv_type = 0x12, 125 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 126 gpios), 127 }, 128 { 129 .data_type = QMI_OPT_FLAG, 130 .elem_len = 1, 131 .elem_size = sizeof(u8), 132 .array_type = NO_ARRAY, 133 .tlv_type = 0x13, 134 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 135 nm_modem_valid), 136 }, 137 { 138 .data_type = QMI_UNSIGNED_1_BYTE, 139 .elem_len = 1, 140 .elem_size = sizeof(u8), 141 .array_type = NO_ARRAY, 142 .tlv_type = 0x13, 143 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 144 nm_modem), 145 }, 146 { 147 .data_type = QMI_OPT_FLAG, 148 .elem_len = 1, 149 .elem_size = sizeof(u8), 150 .array_type = NO_ARRAY, 151 .tlv_type = 0x14, 152 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 153 bdf_support_valid), 154 }, 155 { 156 .data_type = QMI_UNSIGNED_1_BYTE, 157 .elem_len = 1, 158 .elem_size = sizeof(u8), 159 .array_type = NO_ARRAY, 160 .tlv_type = 0x14, 161 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 162 bdf_support), 163 }, 164 { 165 .data_type = QMI_OPT_FLAG, 166 .elem_len = 1, 167 .elem_size = sizeof(u8), 168 .array_type = NO_ARRAY, 169 .tlv_type = 0x15, 170 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 171 bdf_cache_support_valid), 172 }, 173 { 174 .data_type = QMI_UNSIGNED_1_BYTE, 175 .elem_len = 1, 176 .elem_size = sizeof(u8), 177 .array_type = NO_ARRAY, 178 .tlv_type = 0x15, 179 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 180 bdf_cache_support), 181 }, 182 { 183 .data_type = QMI_OPT_FLAG, 184 .elem_len = 1, 185 .elem_size = sizeof(u8), 186 .array_type = NO_ARRAY, 187 .tlv_type = 0x16, 188 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 189 m3_support_valid), 190 }, 191 { 192 .data_type = QMI_UNSIGNED_1_BYTE, 193 .elem_len = 1, 194 .elem_size = sizeof(u8), 195 .array_type = NO_ARRAY, 196 .tlv_type = 0x16, 197 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 198 m3_support), 199 }, 200 { 201 .data_type = QMI_OPT_FLAG, 202 .elem_len = 1, 203 .elem_size = sizeof(u8), 204 .array_type = NO_ARRAY, 205 .tlv_type = 0x17, 206 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 207 m3_cache_support_valid), 208 }, 209 { 210 .data_type = QMI_UNSIGNED_1_BYTE, 211 .elem_len = 1, 212 .elem_size = sizeof(u8), 213 .array_type = NO_ARRAY, 214 .tlv_type = 0x17, 215 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 216 m3_cache_support), 217 }, 218 { 219 .data_type = QMI_OPT_FLAG, 220 .elem_len = 1, 221 .elem_size = sizeof(u8), 222 .array_type = NO_ARRAY, 223 .tlv_type = 0x18, 224 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 225 cal_filesys_support_valid), 226 }, 227 { 228 .data_type = QMI_UNSIGNED_1_BYTE, 229 .elem_len = 1, 230 .elem_size = sizeof(u8), 231 .array_type = NO_ARRAY, 232 .tlv_type = 0x18, 233 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 234 cal_filesys_support), 235 }, 236 { 237 .data_type = QMI_OPT_FLAG, 238 .elem_len = 1, 239 .elem_size = sizeof(u8), 240 .array_type = NO_ARRAY, 241 .tlv_type = 0x19, 242 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 243 cal_cache_support_valid), 244 }, 245 { 246 .data_type = QMI_UNSIGNED_1_BYTE, 247 .elem_len = 1, 248 .elem_size = sizeof(u8), 249 .array_type = NO_ARRAY, 250 .tlv_type = 0x19, 251 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 252 cal_cache_support), 253 }, 254 { 255 .data_type = QMI_OPT_FLAG, 256 .elem_len = 1, 257 .elem_size = sizeof(u8), 258 .array_type = NO_ARRAY, 259 .tlv_type = 0x1A, 260 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 261 cal_done_valid), 262 }, 263 { 264 .data_type = QMI_UNSIGNED_1_BYTE, 265 .elem_len = 1, 266 .elem_size = sizeof(u8), 267 .array_type = NO_ARRAY, 268 .tlv_type = 0x1A, 269 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 270 cal_done), 271 }, 272 { 273 .data_type = QMI_OPT_FLAG, 274 .elem_len = 1, 275 .elem_size = sizeof(u8), 276 .array_type = NO_ARRAY, 277 .tlv_type = 0x1B, 278 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 279 mem_bucket_valid), 280 }, 281 { 282 .data_type = QMI_UNSIGNED_4_BYTE, 283 .elem_len = 1, 284 .elem_size = sizeof(u32), 285 .array_type = NO_ARRAY, 286 .tlv_type = 0x1B, 287 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 288 mem_bucket), 289 }, 290 { 291 .data_type = QMI_OPT_FLAG, 292 .elem_len = 1, 293 .elem_size = sizeof(u8), 294 .array_type = NO_ARRAY, 295 .tlv_type = 0x1C, 296 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 297 mem_cfg_mode_valid), 298 }, 299 { 300 .data_type = QMI_UNSIGNED_1_BYTE, 301 .elem_len = 1, 302 .elem_size = sizeof(u8), 303 .array_type = NO_ARRAY, 304 .tlv_type = 0x1C, 305 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 306 mem_cfg_mode), 307 }, 308 { 309 .data_type = QMI_OPT_FLAG, 310 .elem_len = 1, 311 .elem_size = sizeof(u8), 312 .array_type = NO_ARRAY, 313 .tlv_type = 0x1D, 314 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 315 cal_duration_valid), 316 }, 317 { 318 .data_type = QMI_UNSIGNED_2_BYTE, 319 .elem_len = 1, 320 .elem_size = sizeof(u16), 321 .array_type = NO_ARRAY, 322 .tlv_type = 0x1D, 323 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 324 cal_duraiton), 325 }, 326 { 327 .data_type = QMI_OPT_FLAG, 328 .elem_len = 1, 329 .elem_size = sizeof(u8), 330 .array_type = NO_ARRAY, 331 .tlv_type = 0x1E, 332 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 333 platform_name_valid), 334 }, 335 { 336 .data_type = QMI_STRING, 337 .elem_len = QMI_WLANFW_MAX_PLATFORM_NAME_LEN_V01 + 1, 338 .elem_size = sizeof(char), 339 .array_type = NO_ARRAY, 340 .tlv_type = 0x1E, 341 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 342 platform_name), 343 }, 344 { 345 .data_type = QMI_OPT_FLAG, 346 .elem_len = 1, 347 .elem_size = sizeof(u8), 348 .array_type = NO_ARRAY, 349 .tlv_type = 0x1F, 350 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 351 ddr_range_valid), 352 }, 353 { 354 .data_type = QMI_STRUCT, 355 .elem_len = QMI_WLANFW_MAX_HOST_DDR_RANGE_SIZE_V01, 356 .elem_size = sizeof(struct qmi_wlanfw_host_ddr_range), 357 .array_type = STATIC_ARRAY, 358 .tlv_type = 0x1F, 359 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 360 ddr_range), 361 }, 362 { 363 .data_type = QMI_OPT_FLAG, 364 .elem_len = 1, 365 .elem_size = sizeof(u8), 366 .array_type = NO_ARRAY, 367 .tlv_type = 0x20, 368 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 369 host_build_type_valid), 370 }, 371 { 372 .data_type = QMI_SIGNED_4_BYTE_ENUM, 373 .elem_len = 1, 374 .elem_size = sizeof(enum qmi_wlanfw_host_build_type), 375 .array_type = NO_ARRAY, 376 .tlv_type = 0x20, 377 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 378 host_build_type), 379 }, 380 { 381 .data_type = QMI_OPT_FLAG, 382 .elem_len = 1, 383 .elem_size = sizeof(u8), 384 .array_type = NO_ARRAY, 385 .tlv_type = 0x21, 386 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 387 mlo_capable_valid), 388 }, 389 { 390 .data_type = QMI_UNSIGNED_1_BYTE, 391 .elem_len = 1, 392 .elem_size = sizeof(u8), 393 .array_type = NO_ARRAY, 394 .tlv_type = 0x21, 395 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 396 mlo_capable), 397 }, 398 { 399 .data_type = QMI_OPT_FLAG, 400 .elem_len = 1, 401 .elem_size = sizeof(u8), 402 .array_type = NO_ARRAY, 403 .tlv_type = 0x22, 404 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 405 mlo_chip_id_valid), 406 }, 407 { 408 .data_type = QMI_UNSIGNED_2_BYTE, 409 .elem_len = 1, 410 .elem_size = sizeof(u16), 411 .array_type = NO_ARRAY, 412 .tlv_type = 0x22, 413 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 414 mlo_chip_id), 415 }, 416 { 417 .data_type = QMI_OPT_FLAG, 418 .elem_len = 1, 419 .elem_size = sizeof(u8), 420 .array_type = NO_ARRAY, 421 .tlv_type = 0x23, 422 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 423 mlo_group_id_valid), 424 }, 425 { 426 .data_type = QMI_UNSIGNED_1_BYTE, 427 .elem_len = 1, 428 .elem_size = sizeof(u8), 429 .array_type = NO_ARRAY, 430 .tlv_type = 0x23, 431 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 432 mlo_group_id), 433 }, 434 { 435 .data_type = QMI_OPT_FLAG, 436 .elem_len = 1, 437 .elem_size = sizeof(u8), 438 .array_type = NO_ARRAY, 439 .tlv_type = 0x24, 440 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 441 max_mlo_peer_valid), 442 }, 443 { 444 .data_type = QMI_UNSIGNED_2_BYTE, 445 .elem_len = 1, 446 .elem_size = sizeof(u16), 447 .array_type = NO_ARRAY, 448 .tlv_type = 0x24, 449 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 450 max_mlo_peer), 451 }, 452 { 453 .data_type = QMI_OPT_FLAG, 454 .elem_len = 1, 455 .elem_size = sizeof(u8), 456 .array_type = NO_ARRAY, 457 .tlv_type = 0x25, 458 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 459 mlo_num_chips_valid), 460 }, 461 { 462 .data_type = QMI_UNSIGNED_1_BYTE, 463 .elem_len = 1, 464 .elem_size = sizeof(u8), 465 .array_type = NO_ARRAY, 466 .tlv_type = 0x25, 467 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 468 mlo_num_chips), 469 }, 470 { 471 .data_type = QMI_OPT_FLAG, 472 .elem_len = 1, 473 .elem_size = sizeof(u8), 474 .array_type = NO_ARRAY, 475 .tlv_type = 0x26, 476 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 477 mlo_chip_info_valid), 478 }, 479 { 480 .data_type = QMI_STRUCT, 481 .elem_len = QMI_WLFW_MAX_NUM_MLO_CHIPS_V01, 482 .elem_size = sizeof(struct wlfw_host_mlo_chip_info_s_v01), 483 .array_type = STATIC_ARRAY, 484 .tlv_type = 0x26, 485 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 486 mlo_chip_info), 487 .ei_array = wlfw_host_mlo_chip_info_s_v01_ei, 488 }, 489 { 490 .data_type = QMI_OPT_FLAG, 491 .elem_len = 1, 492 .elem_size = sizeof(u8), 493 .array_type = NO_ARRAY, 494 .tlv_type = 0x27, 495 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 496 feature_list_valid), 497 }, 498 { 499 .data_type = QMI_UNSIGNED_8_BYTE, 500 .elem_len = 1, 501 .elem_size = sizeof(u64), 502 .array_type = NO_ARRAY, 503 .tlv_type = 0x27, 504 .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 505 feature_list), 506 }, 507 { 508 .data_type = QMI_EOTI, 509 .array_type = NO_ARRAY, 510 .tlv_type = QMI_COMMON_TLV_TYPE, 511 }, 512 }; 513 514 static struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = { 515 { 516 .data_type = QMI_STRUCT, 517 .elem_len = 1, 518 .elem_size = sizeof(struct qmi_response_type_v01), 519 .array_type = NO_ARRAY, 520 .tlv_type = 0x02, 521 .offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp), 522 .ei_array = qmi_response_type_v01_ei, 523 }, 524 { 525 .data_type = QMI_EOTI, 526 .array_type = NO_ARRAY, 527 .tlv_type = QMI_COMMON_TLV_TYPE, 528 }, 529 }; 530 531 static struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = { 532 { 533 .data_type = QMI_OPT_FLAG, 534 .elem_len = 1, 535 .elem_size = sizeof(u8), 536 .array_type = NO_ARRAY, 537 .tlv_type = 0x10, 538 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 539 fw_ready_enable_valid), 540 }, 541 { 542 .data_type = QMI_UNSIGNED_1_BYTE, 543 .elem_len = 1, 544 .elem_size = sizeof(u8), 545 .array_type = NO_ARRAY, 546 .tlv_type = 0x10, 547 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 548 fw_ready_enable), 549 }, 550 { 551 .data_type = QMI_OPT_FLAG, 552 .elem_len = 1, 553 .elem_size = sizeof(u8), 554 .array_type = NO_ARRAY, 555 .tlv_type = 0x11, 556 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 557 initiate_cal_download_enable_valid), 558 }, 559 { 560 .data_type = QMI_UNSIGNED_1_BYTE, 561 .elem_len = 1, 562 .elem_size = sizeof(u8), 563 .array_type = NO_ARRAY, 564 .tlv_type = 0x11, 565 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 566 initiate_cal_download_enable), 567 }, 568 { 569 .data_type = QMI_OPT_FLAG, 570 .elem_len = 1, 571 .elem_size = sizeof(u8), 572 .array_type = NO_ARRAY, 573 .tlv_type = 0x12, 574 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 575 initiate_cal_update_enable_valid), 576 }, 577 { 578 .data_type = QMI_UNSIGNED_1_BYTE, 579 .elem_len = 1, 580 .elem_size = sizeof(u8), 581 .array_type = NO_ARRAY, 582 .tlv_type = 0x12, 583 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 584 initiate_cal_update_enable), 585 }, 586 { 587 .data_type = QMI_OPT_FLAG, 588 .elem_len = 1, 589 .elem_size = sizeof(u8), 590 .array_type = NO_ARRAY, 591 .tlv_type = 0x13, 592 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 593 msa_ready_enable_valid), 594 }, 595 { 596 .data_type = QMI_UNSIGNED_1_BYTE, 597 .elem_len = 1, 598 .elem_size = sizeof(u8), 599 .array_type = NO_ARRAY, 600 .tlv_type = 0x13, 601 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 602 msa_ready_enable), 603 }, 604 { 605 .data_type = QMI_OPT_FLAG, 606 .elem_len = 1, 607 .elem_size = sizeof(u8), 608 .array_type = NO_ARRAY, 609 .tlv_type = 0x14, 610 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 611 pin_connect_result_enable_valid), 612 }, 613 { 614 .data_type = QMI_UNSIGNED_1_BYTE, 615 .elem_len = 1, 616 .elem_size = sizeof(u8), 617 .array_type = NO_ARRAY, 618 .tlv_type = 0x14, 619 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 620 pin_connect_result_enable), 621 }, 622 { 623 .data_type = QMI_OPT_FLAG, 624 .elem_len = 1, 625 .elem_size = sizeof(u8), 626 .array_type = NO_ARRAY, 627 .tlv_type = 0x15, 628 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 629 client_id_valid), 630 }, 631 { 632 .data_type = QMI_UNSIGNED_4_BYTE, 633 .elem_len = 1, 634 .elem_size = sizeof(u32), 635 .array_type = NO_ARRAY, 636 .tlv_type = 0x15, 637 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 638 client_id), 639 }, 640 { 641 .data_type = QMI_OPT_FLAG, 642 .elem_len = 1, 643 .elem_size = sizeof(u8), 644 .array_type = NO_ARRAY, 645 .tlv_type = 0x16, 646 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 647 request_mem_enable_valid), 648 }, 649 { 650 .data_type = QMI_UNSIGNED_1_BYTE, 651 .elem_len = 1, 652 .elem_size = sizeof(u8), 653 .array_type = NO_ARRAY, 654 .tlv_type = 0x16, 655 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 656 request_mem_enable), 657 }, 658 { 659 .data_type = QMI_OPT_FLAG, 660 .elem_len = 1, 661 .elem_size = sizeof(u8), 662 .array_type = NO_ARRAY, 663 .tlv_type = 0x17, 664 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 665 fw_mem_ready_enable_valid), 666 }, 667 { 668 .data_type = QMI_UNSIGNED_1_BYTE, 669 .elem_len = 1, 670 .elem_size = sizeof(u8), 671 .array_type = NO_ARRAY, 672 .tlv_type = 0x17, 673 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 674 fw_mem_ready_enable), 675 }, 676 { 677 .data_type = QMI_OPT_FLAG, 678 .elem_len = 1, 679 .elem_size = sizeof(u8), 680 .array_type = NO_ARRAY, 681 .tlv_type = 0x18, 682 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 683 fw_init_done_enable_valid), 684 }, 685 { 686 .data_type = QMI_UNSIGNED_1_BYTE, 687 .elem_len = 1, 688 .elem_size = sizeof(u8), 689 .array_type = NO_ARRAY, 690 .tlv_type = 0x18, 691 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 692 fw_init_done_enable), 693 }, 694 695 { 696 .data_type = QMI_OPT_FLAG, 697 .elem_len = 1, 698 .elem_size = sizeof(u8), 699 .array_type = NO_ARRAY, 700 .tlv_type = 0x19, 701 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 702 rejuvenate_enable_valid), 703 }, 704 { 705 .data_type = QMI_UNSIGNED_1_BYTE, 706 .elem_len = 1, 707 .elem_size = sizeof(u8), 708 .array_type = NO_ARRAY, 709 .tlv_type = 0x19, 710 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 711 rejuvenate_enable), 712 }, 713 { 714 .data_type = QMI_OPT_FLAG, 715 .elem_len = 1, 716 .elem_size = sizeof(u8), 717 .array_type = NO_ARRAY, 718 .tlv_type = 0x1A, 719 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 720 xo_cal_enable_valid), 721 }, 722 { 723 .data_type = QMI_UNSIGNED_1_BYTE, 724 .elem_len = 1, 725 .elem_size = sizeof(u8), 726 .array_type = NO_ARRAY, 727 .tlv_type = 0x1A, 728 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 729 xo_cal_enable), 730 }, 731 { 732 .data_type = QMI_OPT_FLAG, 733 .elem_len = 1, 734 .elem_size = sizeof(u8), 735 .array_type = NO_ARRAY, 736 .tlv_type = 0x1B, 737 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 738 cal_done_enable_valid), 739 }, 740 { 741 .data_type = QMI_UNSIGNED_1_BYTE, 742 .elem_len = 1, 743 .elem_size = sizeof(u8), 744 .array_type = NO_ARRAY, 745 .tlv_type = 0x1B, 746 .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 747 cal_done_enable), 748 }, 749 { 750 .data_type = QMI_EOTI, 751 .array_type = NO_ARRAY, 752 .tlv_type = QMI_COMMON_TLV_TYPE, 753 }, 754 }; 755 756 static struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = { 757 { 758 .data_type = QMI_STRUCT, 759 .elem_len = 1, 760 .elem_size = sizeof(struct qmi_response_type_v01), 761 .array_type = NO_ARRAY, 762 .tlv_type = 0x02, 763 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 764 resp), 765 .ei_array = qmi_response_type_v01_ei, 766 }, 767 { 768 .data_type = QMI_OPT_FLAG, 769 .elem_len = 1, 770 .elem_size = sizeof(u8), 771 .array_type = NO_ARRAY, 772 .tlv_type = 0x10, 773 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 774 fw_status_valid), 775 }, 776 { 777 .data_type = QMI_UNSIGNED_8_BYTE, 778 .elem_len = 1, 779 .elem_size = sizeof(u64), 780 .array_type = NO_ARRAY, 781 .tlv_type = 0x10, 782 .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 783 fw_status), 784 }, 785 { 786 .data_type = QMI_EOTI, 787 .array_type = NO_ARRAY, 788 .tlv_type = QMI_COMMON_TLV_TYPE, 789 }, 790 }; 791 792 static struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = { 793 { 794 .data_type = QMI_UNSIGNED_8_BYTE, 795 .elem_len = 1, 796 .elem_size = sizeof(u64), 797 .array_type = NO_ARRAY, 798 .tlv_type = 0, 799 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset), 800 }, 801 { 802 .data_type = QMI_UNSIGNED_4_BYTE, 803 .elem_len = 1, 804 .elem_size = sizeof(u32), 805 .array_type = NO_ARRAY, 806 .tlv_type = 0, 807 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size), 808 }, 809 { 810 .data_type = QMI_UNSIGNED_1_BYTE, 811 .elem_len = 1, 812 .elem_size = sizeof(u8), 813 .array_type = NO_ARRAY, 814 .tlv_type = 0, 815 .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag), 816 }, 817 { 818 .data_type = QMI_EOTI, 819 .array_type = NO_ARRAY, 820 .tlv_type = QMI_COMMON_TLV_TYPE, 821 }, 822 }; 823 824 static struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = { 825 { 826 .data_type = QMI_UNSIGNED_4_BYTE, 827 .elem_len = 1, 828 .elem_size = sizeof(u32), 829 .array_type = NO_ARRAY, 830 .tlv_type = 0, 831 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, 832 size), 833 }, 834 { 835 .data_type = QMI_SIGNED_4_BYTE_ENUM, 836 .elem_len = 1, 837 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01), 838 .array_type = NO_ARRAY, 839 .tlv_type = 0, 840 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type), 841 }, 842 { 843 .data_type = QMI_DATA_LEN, 844 .elem_len = 1, 845 .elem_size = sizeof(u8), 846 .array_type = NO_ARRAY, 847 .tlv_type = 0, 848 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len), 849 }, 850 { 851 .data_type = QMI_STRUCT, 852 .elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01, 853 .elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01), 854 .array_type = VAR_LEN_ARRAY, 855 .tlv_type = 0, 856 .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg), 857 .ei_array = qmi_wlanfw_mem_cfg_s_v01_ei, 858 }, 859 { 860 .data_type = QMI_EOTI, 861 .array_type = NO_ARRAY, 862 .tlv_type = QMI_COMMON_TLV_TYPE, 863 }, 864 }; 865 866 static struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = { 867 { 868 .data_type = QMI_DATA_LEN, 869 .elem_len = 1, 870 .elem_size = sizeof(u8), 871 .array_type = NO_ARRAY, 872 .tlv_type = 0x01, 873 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01, 874 mem_seg_len), 875 }, 876 { 877 .data_type = QMI_STRUCT, 878 .elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01, 879 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01), 880 .array_type = VAR_LEN_ARRAY, 881 .tlv_type = 0x01, 882 .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01, 883 mem_seg), 884 .ei_array = qmi_wlanfw_mem_seg_s_v01_ei, 885 }, 886 { 887 .data_type = QMI_EOTI, 888 .array_type = NO_ARRAY, 889 .tlv_type = QMI_COMMON_TLV_TYPE, 890 }, 891 }; 892 893 static struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = { 894 { 895 .data_type = QMI_UNSIGNED_8_BYTE, 896 .elem_len = 1, 897 .elem_size = sizeof(u64), 898 .array_type = NO_ARRAY, 899 .tlv_type = 0, 900 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr), 901 }, 902 { 903 .data_type = QMI_UNSIGNED_4_BYTE, 904 .elem_len = 1, 905 .elem_size = sizeof(u32), 906 .array_type = NO_ARRAY, 907 .tlv_type = 0, 908 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size), 909 }, 910 { 911 .data_type = QMI_SIGNED_4_BYTE_ENUM, 912 .elem_len = 1, 913 .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01), 914 .array_type = NO_ARRAY, 915 .tlv_type = 0, 916 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type), 917 }, 918 { 919 .data_type = QMI_UNSIGNED_1_BYTE, 920 .elem_len = 1, 921 .elem_size = sizeof(u8), 922 .array_type = NO_ARRAY, 923 .tlv_type = 0, 924 .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore), 925 }, 926 { 927 .data_type = QMI_EOTI, 928 .array_type = NO_ARRAY, 929 .tlv_type = QMI_COMMON_TLV_TYPE, 930 }, 931 }; 932 933 static struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = { 934 { 935 .data_type = QMI_DATA_LEN, 936 .elem_len = 1, 937 .elem_size = sizeof(u8), 938 .array_type = NO_ARRAY, 939 .tlv_type = 0x01, 940 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01, 941 mem_seg_len), 942 }, 943 { 944 .data_type = QMI_STRUCT, 945 .elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01, 946 .elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01), 947 .array_type = VAR_LEN_ARRAY, 948 .tlv_type = 0x01, 949 .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01, 950 mem_seg), 951 .ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei, 952 }, 953 { 954 .data_type = QMI_EOTI, 955 .array_type = NO_ARRAY, 956 .tlv_type = QMI_COMMON_TLV_TYPE, 957 }, 958 }; 959 960 static struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = { 961 { 962 .data_type = QMI_STRUCT, 963 .elem_len = 1, 964 .elem_size = sizeof(struct qmi_response_type_v01), 965 .array_type = NO_ARRAY, 966 .tlv_type = 0x02, 967 .offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01, 968 resp), 969 .ei_array = qmi_response_type_v01_ei, 970 }, 971 { 972 .data_type = QMI_EOTI, 973 .array_type = NO_ARRAY, 974 .tlv_type = QMI_COMMON_TLV_TYPE, 975 }, 976 }; 977 978 static struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = { 979 { 980 .data_type = QMI_EOTI, 981 .array_type = NO_ARRAY, 982 .tlv_type = QMI_COMMON_TLV_TYPE, 983 }, 984 }; 985 986 static struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = { 987 { 988 .data_type = QMI_UNSIGNED_4_BYTE, 989 .elem_len = 1, 990 .elem_size = sizeof(u32), 991 .array_type = NO_ARRAY, 992 .tlv_type = 0, 993 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01, 994 chip_id), 995 }, 996 { 997 .data_type = QMI_UNSIGNED_4_BYTE, 998 .elem_len = 1, 999 .elem_size = sizeof(u32), 1000 .array_type = NO_ARRAY, 1001 .tlv_type = 0, 1002 .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01, 1003 chip_family), 1004 }, 1005 { 1006 .data_type = QMI_EOTI, 1007 .array_type = NO_ARRAY, 1008 .tlv_type = QMI_COMMON_TLV_TYPE, 1009 }, 1010 }; 1011 1012 static struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = { 1013 { 1014 .data_type = QMI_UNSIGNED_4_BYTE, 1015 .elem_len = 1, 1016 .elem_size = sizeof(u32), 1017 .array_type = NO_ARRAY, 1018 .tlv_type = 0, 1019 .offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01, 1020 board_id), 1021 }, 1022 { 1023 .data_type = QMI_EOTI, 1024 .array_type = NO_ARRAY, 1025 .tlv_type = QMI_COMMON_TLV_TYPE, 1026 }, 1027 }; 1028 1029 static struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = { 1030 { 1031 .data_type = QMI_UNSIGNED_4_BYTE, 1032 .elem_len = 1, 1033 .elem_size = sizeof(u32), 1034 .array_type = NO_ARRAY, 1035 .tlv_type = 0, 1036 .offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id), 1037 }, 1038 { 1039 .data_type = QMI_EOTI, 1040 .array_type = NO_ARRAY, 1041 .tlv_type = QMI_COMMON_TLV_TYPE, 1042 }, 1043 }; 1044 1045 static struct qmi_elem_info qmi_wlanfw_dev_mem_info_s_v01_ei[] = { 1046 { 1047 .data_type = QMI_UNSIGNED_8_BYTE, 1048 .elem_len = 1, 1049 .elem_size = sizeof(u64), 1050 .array_type = NO_ARRAY, 1051 .tlv_type = 0, 1052 .offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01, 1053 start), 1054 }, 1055 { 1056 .data_type = QMI_UNSIGNED_8_BYTE, 1057 .elem_len = 1, 1058 .elem_size = sizeof(u64), 1059 .array_type = NO_ARRAY, 1060 .tlv_type = 0, 1061 .offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01, 1062 size), 1063 }, 1064 { 1065 .data_type = QMI_EOTI, 1066 .array_type = NO_ARRAY, 1067 .tlv_type = QMI_COMMON_TLV_TYPE, 1068 }, 1069 }; 1070 1071 static struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = { 1072 { 1073 .data_type = QMI_UNSIGNED_4_BYTE, 1074 .elem_len = 1, 1075 .elem_size = sizeof(u32), 1076 .array_type = NO_ARRAY, 1077 .tlv_type = 0, 1078 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01, 1079 fw_version), 1080 }, 1081 { 1082 .data_type = QMI_STRING, 1083 .elem_len = ATH12K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1, 1084 .elem_size = sizeof(char), 1085 .array_type = NO_ARRAY, 1086 .tlv_type = 0, 1087 .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01, 1088 fw_build_timestamp), 1089 }, 1090 { 1091 .data_type = QMI_EOTI, 1092 .array_type = NO_ARRAY, 1093 .tlv_type = QMI_COMMON_TLV_TYPE, 1094 }, 1095 }; 1096 1097 static struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = { 1098 { 1099 .data_type = QMI_STRUCT, 1100 .elem_len = 1, 1101 .elem_size = sizeof(struct qmi_response_type_v01), 1102 .array_type = NO_ARRAY, 1103 .tlv_type = 0x02, 1104 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp), 1105 .ei_array = qmi_response_type_v01_ei, 1106 }, 1107 { 1108 .data_type = QMI_OPT_FLAG, 1109 .elem_len = 1, 1110 .elem_size = sizeof(u8), 1111 .array_type = NO_ARRAY, 1112 .tlv_type = 0x10, 1113 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1114 chip_info_valid), 1115 }, 1116 { 1117 .data_type = QMI_STRUCT, 1118 .elem_len = 1, 1119 .elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01), 1120 .array_type = NO_ARRAY, 1121 .tlv_type = 0x10, 1122 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1123 chip_info), 1124 .ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei, 1125 }, 1126 { 1127 .data_type = QMI_OPT_FLAG, 1128 .elem_len = 1, 1129 .elem_size = sizeof(u8), 1130 .array_type = NO_ARRAY, 1131 .tlv_type = 0x11, 1132 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1133 board_info_valid), 1134 }, 1135 { 1136 .data_type = QMI_STRUCT, 1137 .elem_len = 1, 1138 .elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01), 1139 .array_type = NO_ARRAY, 1140 .tlv_type = 0x11, 1141 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1142 board_info), 1143 .ei_array = qmi_wlanfw_rf_board_info_s_v01_ei, 1144 }, 1145 { 1146 .data_type = QMI_OPT_FLAG, 1147 .elem_len = 1, 1148 .elem_size = sizeof(u8), 1149 .array_type = NO_ARRAY, 1150 .tlv_type = 0x12, 1151 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1152 soc_info_valid), 1153 }, 1154 { 1155 .data_type = QMI_STRUCT, 1156 .elem_len = 1, 1157 .elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01), 1158 .array_type = NO_ARRAY, 1159 .tlv_type = 0x12, 1160 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1161 soc_info), 1162 .ei_array = qmi_wlanfw_soc_info_s_v01_ei, 1163 }, 1164 { 1165 .data_type = QMI_OPT_FLAG, 1166 .elem_len = 1, 1167 .elem_size = sizeof(u8), 1168 .array_type = NO_ARRAY, 1169 .tlv_type = 0x13, 1170 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1171 fw_version_info_valid), 1172 }, 1173 { 1174 .data_type = QMI_STRUCT, 1175 .elem_len = 1, 1176 .elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01), 1177 .array_type = NO_ARRAY, 1178 .tlv_type = 0x13, 1179 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1180 fw_version_info), 1181 .ei_array = qmi_wlanfw_fw_version_info_s_v01_ei, 1182 }, 1183 { 1184 .data_type = QMI_OPT_FLAG, 1185 .elem_len = 1, 1186 .elem_size = sizeof(u8), 1187 .array_type = NO_ARRAY, 1188 .tlv_type = 0x14, 1189 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1190 fw_build_id_valid), 1191 }, 1192 { 1193 .data_type = QMI_STRING, 1194 .elem_len = ATH12K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1, 1195 .elem_size = sizeof(char), 1196 .array_type = NO_ARRAY, 1197 .tlv_type = 0x14, 1198 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1199 fw_build_id), 1200 }, 1201 { 1202 .data_type = QMI_OPT_FLAG, 1203 .elem_len = 1, 1204 .elem_size = sizeof(u8), 1205 .array_type = NO_ARRAY, 1206 .tlv_type = 0x15, 1207 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1208 num_macs_valid), 1209 }, 1210 { 1211 .data_type = QMI_UNSIGNED_1_BYTE, 1212 .elem_len = 1, 1213 .elem_size = sizeof(u8), 1214 .array_type = NO_ARRAY, 1215 .tlv_type = 0x15, 1216 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1217 num_macs), 1218 }, 1219 { 1220 .data_type = QMI_OPT_FLAG, 1221 .elem_len = 1, 1222 .elem_size = sizeof(u8), 1223 .array_type = NO_ARRAY, 1224 .tlv_type = 0x16, 1225 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1226 voltage_mv_valid), 1227 }, 1228 { 1229 .data_type = QMI_UNSIGNED_4_BYTE, 1230 .elem_len = 1, 1231 .elem_size = sizeof(u32), 1232 .array_type = NO_ARRAY, 1233 .tlv_type = 0x16, 1234 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1235 voltage_mv), 1236 }, 1237 { 1238 .data_type = QMI_OPT_FLAG, 1239 .elem_len = 1, 1240 .elem_size = sizeof(u8), 1241 .array_type = NO_ARRAY, 1242 .tlv_type = 0x17, 1243 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1244 time_freq_hz_valid), 1245 }, 1246 { 1247 .data_type = QMI_UNSIGNED_4_BYTE, 1248 .elem_len = 1, 1249 .elem_size = sizeof(u32), 1250 .array_type = NO_ARRAY, 1251 .tlv_type = 0x17, 1252 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1253 time_freq_hz), 1254 }, 1255 { 1256 .data_type = QMI_OPT_FLAG, 1257 .elem_len = 1, 1258 .elem_size = sizeof(u8), 1259 .array_type = NO_ARRAY, 1260 .tlv_type = 0x18, 1261 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1262 otp_version_valid), 1263 }, 1264 { 1265 .data_type = QMI_UNSIGNED_4_BYTE, 1266 .elem_len = 1, 1267 .elem_size = sizeof(u32), 1268 .array_type = NO_ARRAY, 1269 .tlv_type = 0x18, 1270 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1271 otp_version), 1272 }, 1273 { 1274 .data_type = QMI_OPT_FLAG, 1275 .elem_len = 1, 1276 .elem_size = sizeof(u8), 1277 .array_type = NO_ARRAY, 1278 .tlv_type = 0x19, 1279 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1280 eeprom_caldata_read_timeout_valid), 1281 }, 1282 { 1283 .data_type = QMI_UNSIGNED_4_BYTE, 1284 .elem_len = 1, 1285 .elem_size = sizeof(u32), 1286 .array_type = NO_ARRAY, 1287 .tlv_type = 0x19, 1288 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1289 eeprom_caldata_read_timeout), 1290 }, 1291 { 1292 .data_type = QMI_OPT_FLAG, 1293 .elem_len = 1, 1294 .elem_size = sizeof(u8), 1295 .array_type = NO_ARRAY, 1296 .tlv_type = 0x1A, 1297 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1298 fw_caps_valid), 1299 }, 1300 { 1301 .data_type = QMI_UNSIGNED_8_BYTE, 1302 .elem_len = 1, 1303 .elem_size = sizeof(u64), 1304 .array_type = NO_ARRAY, 1305 .tlv_type = 0x1A, 1306 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, fw_caps), 1307 }, 1308 { 1309 .data_type = QMI_OPT_FLAG, 1310 .elem_len = 1, 1311 .elem_size = sizeof(u8), 1312 .array_type = NO_ARRAY, 1313 .tlv_type = 0x1B, 1314 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1315 rd_card_chain_cap_valid), 1316 }, 1317 { 1318 .data_type = QMI_UNSIGNED_4_BYTE, 1319 .elem_len = 1, 1320 .elem_size = sizeof(u32), 1321 .array_type = NO_ARRAY, 1322 .tlv_type = 0x1B, 1323 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1324 rd_card_chain_cap), 1325 }, 1326 { 1327 .data_type = QMI_OPT_FLAG, 1328 .elem_len = 1, 1329 .elem_size = sizeof(u8), 1330 .array_type = NO_ARRAY, 1331 .tlv_type = 0x1C, 1332 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1333 dev_mem_info_valid), 1334 }, 1335 { 1336 .data_type = QMI_STRUCT, 1337 .elem_len = ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01, 1338 .elem_size = sizeof(struct qmi_wlanfw_dev_mem_info_s_v01), 1339 .array_type = STATIC_ARRAY, 1340 .tlv_type = 0x1C, 1341 .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, dev_mem), 1342 .ei_array = qmi_wlanfw_dev_mem_info_s_v01_ei, 1343 }, 1344 { 1345 .data_type = QMI_EOTI, 1346 .array_type = NO_ARRAY, 1347 .tlv_type = QMI_COMMON_TLV_TYPE, 1348 }, 1349 }; 1350 1351 static struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = { 1352 { 1353 .data_type = QMI_UNSIGNED_1_BYTE, 1354 .elem_len = 1, 1355 .elem_size = sizeof(u8), 1356 .array_type = NO_ARRAY, 1357 .tlv_type = 0x01, 1358 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1359 valid), 1360 }, 1361 { 1362 .data_type = QMI_OPT_FLAG, 1363 .elem_len = 1, 1364 .elem_size = sizeof(u8), 1365 .array_type = NO_ARRAY, 1366 .tlv_type = 0x10, 1367 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1368 file_id_valid), 1369 }, 1370 { 1371 .data_type = QMI_SIGNED_4_BYTE_ENUM, 1372 .elem_len = 1, 1373 .elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01), 1374 .array_type = NO_ARRAY, 1375 .tlv_type = 0x10, 1376 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1377 file_id), 1378 }, 1379 { 1380 .data_type = QMI_OPT_FLAG, 1381 .elem_len = 1, 1382 .elem_size = sizeof(u8), 1383 .array_type = NO_ARRAY, 1384 .tlv_type = 0x11, 1385 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1386 total_size_valid), 1387 }, 1388 { 1389 .data_type = QMI_UNSIGNED_4_BYTE, 1390 .elem_len = 1, 1391 .elem_size = sizeof(u32), 1392 .array_type = NO_ARRAY, 1393 .tlv_type = 0x11, 1394 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1395 total_size), 1396 }, 1397 { 1398 .data_type = QMI_OPT_FLAG, 1399 .elem_len = 1, 1400 .elem_size = sizeof(u8), 1401 .array_type = NO_ARRAY, 1402 .tlv_type = 0x12, 1403 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1404 seg_id_valid), 1405 }, 1406 { 1407 .data_type = QMI_UNSIGNED_4_BYTE, 1408 .elem_len = 1, 1409 .elem_size = sizeof(u32), 1410 .array_type = NO_ARRAY, 1411 .tlv_type = 0x12, 1412 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1413 seg_id), 1414 }, 1415 { 1416 .data_type = QMI_OPT_FLAG, 1417 .elem_len = 1, 1418 .elem_size = sizeof(u8), 1419 .array_type = NO_ARRAY, 1420 .tlv_type = 0x13, 1421 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1422 data_valid), 1423 }, 1424 { 1425 .data_type = QMI_DATA_LEN, 1426 .elem_len = 1, 1427 .elem_size = sizeof(u16), 1428 .array_type = NO_ARRAY, 1429 .tlv_type = 0x13, 1430 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1431 data_len), 1432 }, 1433 { 1434 .data_type = QMI_UNSIGNED_1_BYTE, 1435 .elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01, 1436 .elem_size = sizeof(u8), 1437 .array_type = VAR_LEN_ARRAY, 1438 .tlv_type = 0x13, 1439 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1440 data), 1441 }, 1442 { 1443 .data_type = QMI_OPT_FLAG, 1444 .elem_len = 1, 1445 .elem_size = sizeof(u8), 1446 .array_type = NO_ARRAY, 1447 .tlv_type = 0x14, 1448 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1449 end_valid), 1450 }, 1451 { 1452 .data_type = QMI_UNSIGNED_1_BYTE, 1453 .elem_len = 1, 1454 .elem_size = sizeof(u8), 1455 .array_type = NO_ARRAY, 1456 .tlv_type = 0x14, 1457 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1458 end), 1459 }, 1460 { 1461 .data_type = QMI_OPT_FLAG, 1462 .elem_len = 1, 1463 .elem_size = sizeof(u8), 1464 .array_type = NO_ARRAY, 1465 .tlv_type = 0x15, 1466 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1467 bdf_type_valid), 1468 }, 1469 { 1470 .data_type = QMI_UNSIGNED_1_BYTE, 1471 .elem_len = 1, 1472 .elem_size = sizeof(u8), 1473 .array_type = NO_ARRAY, 1474 .tlv_type = 0x15, 1475 .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1476 bdf_type), 1477 }, 1478 1479 { 1480 .data_type = QMI_EOTI, 1481 .array_type = NO_ARRAY, 1482 .tlv_type = QMI_COMMON_TLV_TYPE, 1483 }, 1484 }; 1485 1486 static struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = { 1487 { 1488 .data_type = QMI_STRUCT, 1489 .elem_len = 1, 1490 .elem_size = sizeof(struct qmi_response_type_v01), 1491 .array_type = NO_ARRAY, 1492 .tlv_type = 0x02, 1493 .offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01, 1494 resp), 1495 .ei_array = qmi_response_type_v01_ei, 1496 }, 1497 { 1498 .data_type = QMI_EOTI, 1499 .array_type = NO_ARRAY, 1500 .tlv_type = QMI_COMMON_TLV_TYPE, 1501 }, 1502 }; 1503 1504 static struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = { 1505 { 1506 .data_type = QMI_UNSIGNED_8_BYTE, 1507 .elem_len = 1, 1508 .elem_size = sizeof(u64), 1509 .array_type = NO_ARRAY, 1510 .tlv_type = 0x01, 1511 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr), 1512 }, 1513 { 1514 .data_type = QMI_UNSIGNED_4_BYTE, 1515 .elem_len = 1, 1516 .elem_size = sizeof(u32), 1517 .array_type = NO_ARRAY, 1518 .tlv_type = 0x02, 1519 .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size), 1520 }, 1521 { 1522 .data_type = QMI_EOTI, 1523 .array_type = NO_ARRAY, 1524 .tlv_type = QMI_COMMON_TLV_TYPE, 1525 }, 1526 }; 1527 1528 static struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = { 1529 { 1530 .data_type = QMI_STRUCT, 1531 .elem_len = 1, 1532 .elem_size = sizeof(struct qmi_response_type_v01), 1533 .array_type = NO_ARRAY, 1534 .tlv_type = 0x02, 1535 .offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp), 1536 .ei_array = qmi_response_type_v01_ei, 1537 }, 1538 { 1539 .data_type = QMI_EOTI, 1540 .array_type = NO_ARRAY, 1541 .tlv_type = QMI_COMMON_TLV_TYPE, 1542 }, 1543 }; 1544 1545 static struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = { 1546 { 1547 .data_type = QMI_UNSIGNED_4_BYTE, 1548 .elem_len = 1, 1549 .elem_size = sizeof(u32), 1550 .array_type = NO_ARRAY, 1551 .tlv_type = 0, 1552 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1553 pipe_num), 1554 }, 1555 { 1556 .data_type = QMI_SIGNED_4_BYTE_ENUM, 1557 .elem_len = 1, 1558 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01), 1559 .array_type = NO_ARRAY, 1560 .tlv_type = 0, 1561 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1562 pipe_dir), 1563 }, 1564 { 1565 .data_type = QMI_UNSIGNED_4_BYTE, 1566 .elem_len = 1, 1567 .elem_size = sizeof(u32), 1568 .array_type = NO_ARRAY, 1569 .tlv_type = 0, 1570 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1571 nentries), 1572 }, 1573 { 1574 .data_type = QMI_UNSIGNED_4_BYTE, 1575 .elem_len = 1, 1576 .elem_size = sizeof(u32), 1577 .array_type = NO_ARRAY, 1578 .tlv_type = 0, 1579 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1580 nbytes_max), 1581 }, 1582 { 1583 .data_type = QMI_UNSIGNED_4_BYTE, 1584 .elem_len = 1, 1585 .elem_size = sizeof(u32), 1586 .array_type = NO_ARRAY, 1587 .tlv_type = 0, 1588 .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1589 flags), 1590 }, 1591 { 1592 .data_type = QMI_EOTI, 1593 .array_type = NO_ARRAY, 1594 .tlv_type = QMI_COMMON_TLV_TYPE, 1595 }, 1596 }; 1597 1598 static struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = { 1599 { 1600 .data_type = QMI_UNSIGNED_4_BYTE, 1601 .elem_len = 1, 1602 .elem_size = sizeof(u32), 1603 .array_type = NO_ARRAY, 1604 .tlv_type = 0, 1605 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 1606 service_id), 1607 }, 1608 { 1609 .data_type = QMI_SIGNED_4_BYTE_ENUM, 1610 .elem_len = 1, 1611 .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01), 1612 .array_type = NO_ARRAY, 1613 .tlv_type = 0, 1614 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 1615 pipe_dir), 1616 }, 1617 { 1618 .data_type = QMI_UNSIGNED_4_BYTE, 1619 .elem_len = 1, 1620 .elem_size = sizeof(u32), 1621 .array_type = NO_ARRAY, 1622 .tlv_type = 0, 1623 .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 1624 pipe_num), 1625 }, 1626 { 1627 .data_type = QMI_EOTI, 1628 .array_type = NO_ARRAY, 1629 .tlv_type = QMI_COMMON_TLV_TYPE, 1630 }, 1631 }; 1632 1633 static struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = { 1634 { 1635 .data_type = QMI_UNSIGNED_2_BYTE, 1636 .elem_len = 1, 1637 .elem_size = sizeof(u16), 1638 .array_type = NO_ARRAY, 1639 .tlv_type = 0, 1640 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id), 1641 }, 1642 { 1643 .data_type = QMI_UNSIGNED_2_BYTE, 1644 .elem_len = 1, 1645 .elem_size = sizeof(u16), 1646 .array_type = NO_ARRAY, 1647 .tlv_type = 0, 1648 .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, 1649 offset), 1650 }, 1651 { 1652 .data_type = QMI_EOTI, 1653 .array_type = QMI_COMMON_TLV_TYPE, 1654 }, 1655 }; 1656 1657 static struct qmi_elem_info qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei[] = { 1658 { 1659 .data_type = QMI_UNSIGNED_4_BYTE, 1660 .elem_len = 1, 1661 .elem_size = sizeof(u32), 1662 .array_type = NO_ARRAY, 1663 .tlv_type = 0, 1664 .offset = offsetof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01, 1665 addr), 1666 }, 1667 { 1668 .data_type = QMI_EOTI, 1669 .array_type = NO_ARRAY, 1670 .tlv_type = QMI_COMMON_TLV_TYPE, 1671 }, 1672 }; 1673 1674 static struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = { 1675 { 1676 .data_type = QMI_UNSIGNED_4_BYTE, 1677 .elem_len = 1, 1678 .elem_size = sizeof(u32), 1679 .array_type = NO_ARRAY, 1680 .tlv_type = 0x01, 1681 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 1682 mode), 1683 }, 1684 { 1685 .data_type = QMI_OPT_FLAG, 1686 .elem_len = 1, 1687 .elem_size = sizeof(u8), 1688 .array_type = NO_ARRAY, 1689 .tlv_type = 0x10, 1690 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 1691 hw_debug_valid), 1692 }, 1693 { 1694 .data_type = QMI_UNSIGNED_1_BYTE, 1695 .elem_len = 1, 1696 .elem_size = sizeof(u8), 1697 .array_type = NO_ARRAY, 1698 .tlv_type = 0x10, 1699 .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 1700 hw_debug), 1701 }, 1702 { 1703 .data_type = QMI_EOTI, 1704 .array_type = NO_ARRAY, 1705 .tlv_type = QMI_COMMON_TLV_TYPE, 1706 }, 1707 }; 1708 1709 static struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = { 1710 { 1711 .data_type = QMI_STRUCT, 1712 .elem_len = 1, 1713 .elem_size = sizeof(struct qmi_response_type_v01), 1714 .array_type = NO_ARRAY, 1715 .tlv_type = 0x02, 1716 .offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01, 1717 resp), 1718 .ei_array = qmi_response_type_v01_ei, 1719 }, 1720 { 1721 .data_type = QMI_EOTI, 1722 .array_type = NO_ARRAY, 1723 .tlv_type = QMI_COMMON_TLV_TYPE, 1724 }, 1725 }; 1726 1727 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = { 1728 { 1729 .data_type = QMI_OPT_FLAG, 1730 .elem_len = 1, 1731 .elem_size = sizeof(u8), 1732 .array_type = NO_ARRAY, 1733 .tlv_type = 0x10, 1734 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1735 host_version_valid), 1736 }, 1737 { 1738 .data_type = QMI_STRING, 1739 .elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1, 1740 .elem_size = sizeof(char), 1741 .array_type = NO_ARRAY, 1742 .tlv_type = 0x10, 1743 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1744 host_version), 1745 }, 1746 { 1747 .data_type = QMI_OPT_FLAG, 1748 .elem_len = 1, 1749 .elem_size = sizeof(u8), 1750 .array_type = NO_ARRAY, 1751 .tlv_type = 0x11, 1752 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1753 tgt_cfg_valid), 1754 }, 1755 { 1756 .data_type = QMI_DATA_LEN, 1757 .elem_len = 1, 1758 .elem_size = sizeof(u8), 1759 .array_type = NO_ARRAY, 1760 .tlv_type = 0x11, 1761 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1762 tgt_cfg_len), 1763 }, 1764 { 1765 .data_type = QMI_STRUCT, 1766 .elem_len = QMI_WLANFW_MAX_NUM_CE_V01, 1767 .elem_size = sizeof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01), 1768 .array_type = VAR_LEN_ARRAY, 1769 .tlv_type = 0x11, 1770 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1771 tgt_cfg), 1772 .ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei, 1773 }, 1774 { 1775 .data_type = QMI_OPT_FLAG, 1776 .elem_len = 1, 1777 .elem_size = sizeof(u8), 1778 .array_type = NO_ARRAY, 1779 .tlv_type = 0x12, 1780 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1781 svc_cfg_valid), 1782 }, 1783 { 1784 .data_type = QMI_DATA_LEN, 1785 .elem_len = 1, 1786 .elem_size = sizeof(u8), 1787 .array_type = NO_ARRAY, 1788 .tlv_type = 0x12, 1789 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1790 svc_cfg_len), 1791 }, 1792 { 1793 .data_type = QMI_STRUCT, 1794 .elem_len = QMI_WLANFW_MAX_NUM_SVC_V01, 1795 .elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01), 1796 .array_type = VAR_LEN_ARRAY, 1797 .tlv_type = 0x12, 1798 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1799 svc_cfg), 1800 .ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei, 1801 }, 1802 { 1803 .data_type = QMI_OPT_FLAG, 1804 .elem_len = 1, 1805 .elem_size = sizeof(u8), 1806 .array_type = NO_ARRAY, 1807 .tlv_type = 0x13, 1808 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1809 shadow_reg_valid), 1810 }, 1811 { 1812 .data_type = QMI_DATA_LEN, 1813 .elem_len = 1, 1814 .elem_size = sizeof(u8), 1815 .array_type = NO_ARRAY, 1816 .tlv_type = 0x13, 1817 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1818 shadow_reg_len), 1819 }, 1820 { 1821 .data_type = QMI_STRUCT, 1822 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01, 1823 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01), 1824 .array_type = VAR_LEN_ARRAY, 1825 .tlv_type = 0x13, 1826 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1827 shadow_reg), 1828 .ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei, 1829 }, 1830 { 1831 .data_type = QMI_OPT_FLAG, 1832 .elem_len = 1, 1833 .elem_size = sizeof(u8), 1834 .array_type = NO_ARRAY, 1835 .tlv_type = 0x17, 1836 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1837 shadow_reg_v3_valid), 1838 }, 1839 { 1840 .data_type = QMI_DATA_LEN, 1841 .elem_len = 1, 1842 .elem_size = sizeof(u8), 1843 .array_type = NO_ARRAY, 1844 .tlv_type = 0x17, 1845 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1846 shadow_reg_v3_len), 1847 }, 1848 { 1849 .data_type = QMI_STRUCT, 1850 .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01, 1851 .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01), 1852 .array_type = VAR_LEN_ARRAY, 1853 .tlv_type = 0x17, 1854 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1855 shadow_reg_v3), 1856 .ei_array = qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei, 1857 }, 1858 { 1859 .data_type = QMI_EOTI, 1860 .array_type = NO_ARRAY, 1861 .tlv_type = QMI_COMMON_TLV_TYPE, 1862 }, 1863 }; 1864 1865 static struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = { 1866 { 1867 .data_type = QMI_STRUCT, 1868 .elem_len = 1, 1869 .elem_size = sizeof(struct qmi_response_type_v01), 1870 .array_type = NO_ARRAY, 1871 .tlv_type = 0x02, 1872 .offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp), 1873 .ei_array = qmi_response_type_v01_ei, 1874 }, 1875 { 1876 .data_type = QMI_EOTI, 1877 .array_type = NO_ARRAY, 1878 .tlv_type = QMI_COMMON_TLV_TYPE, 1879 }, 1880 }; 1881 1882 static struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = { 1883 { 1884 .data_type = QMI_EOTI, 1885 .array_type = NO_ARRAY, 1886 }, 1887 }; 1888 1889 static struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = { 1890 { 1891 .data_type = QMI_EOTI, 1892 .array_type = NO_ARRAY, 1893 }, 1894 }; 1895 1896 static void ath12k_host_cap_parse_mlo(struct qmi_wlanfw_host_cap_req_msg_v01 *req) 1897 { 1898 req->mlo_capable_valid = 1; 1899 req->mlo_capable = 1; 1900 req->mlo_chip_id_valid = 1; 1901 req->mlo_chip_id = 0; 1902 req->mlo_group_id_valid = 1; 1903 req->mlo_group_id = 0; 1904 req->max_mlo_peer_valid = 1; 1905 /* Max peer number generally won't change for the same device 1906 * but needs to be synced with host driver. 1907 */ 1908 req->max_mlo_peer = 32; 1909 req->mlo_num_chips_valid = 1; 1910 req->mlo_num_chips = 1; 1911 req->mlo_chip_info_valid = 1; 1912 req->mlo_chip_info[0].chip_id = 0; 1913 req->mlo_chip_info[0].num_local_links = 2; 1914 req->mlo_chip_info[0].hw_link_id[0] = 0; 1915 req->mlo_chip_info[0].hw_link_id[1] = 1; 1916 req->mlo_chip_info[0].valid_mlo_link_id[0] = 1; 1917 req->mlo_chip_info[0].valid_mlo_link_id[1] = 1; 1918 } 1919 1920 static int ath12k_qmi_host_cap_send(struct ath12k_base *ab) 1921 { 1922 struct qmi_wlanfw_host_cap_req_msg_v01 req; 1923 struct qmi_wlanfw_host_cap_resp_msg_v01 resp; 1924 struct qmi_txn txn = {}; 1925 int ret = 0; 1926 1927 memset(&req, 0, sizeof(req)); 1928 memset(&resp, 0, sizeof(resp)); 1929 1930 req.num_clients_valid = 1; 1931 req.num_clients = 1; 1932 req.mem_cfg_mode = ab->qmi.target_mem_mode; 1933 req.mem_cfg_mode_valid = 1; 1934 req.bdf_support_valid = 1; 1935 req.bdf_support = 1; 1936 1937 req.m3_support_valid = 1; 1938 req.m3_support = 1; 1939 req.m3_cache_support_valid = 1; 1940 req.m3_cache_support = 1; 1941 1942 req.cal_done_valid = 1; 1943 req.cal_done = ab->qmi.cal_done; 1944 1945 if (ab->hw_params->qmi_cnss_feature_bitmap) { 1946 req.feature_list_valid = 1; 1947 req.feature_list = ab->hw_params->qmi_cnss_feature_bitmap; 1948 } 1949 1950 /* BRINGUP: here we are piggybacking a lot of stuff using 1951 * internal_sleep_clock, should it be split? 1952 */ 1953 if (ab->hw_params->internal_sleep_clock) { 1954 req.nm_modem_valid = 1; 1955 1956 /* Notify firmware that this is non-qualcomm platform. */ 1957 req.nm_modem |= HOST_CSTATE_BIT; 1958 1959 /* Notify firmware about the sleep clock selection, 1960 * nm_modem_bit[1] is used for this purpose. Host driver on 1961 * non-qualcomm platforms should select internal sleep 1962 * clock. 1963 */ 1964 req.nm_modem |= SLEEP_CLOCK_SELECT_INTERNAL_BIT; 1965 req.nm_modem |= PLATFORM_CAP_PCIE_GLOBAL_RESET; 1966 1967 ath12k_host_cap_parse_mlo(&req); 1968 } 1969 1970 ret = qmi_txn_init(&ab->qmi.handle, &txn, 1971 qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp); 1972 if (ret < 0) 1973 goto out; 1974 1975 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 1976 QMI_WLANFW_HOST_CAP_REQ_V01, 1977 QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN, 1978 qmi_wlanfw_host_cap_req_msg_v01_ei, &req); 1979 if (ret < 0) { 1980 qmi_txn_cancel(&txn); 1981 ath12k_warn(ab, "Failed to send host capability request,err = %d\n", ret); 1982 goto out; 1983 } 1984 1985 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 1986 if (ret < 0) 1987 goto out; 1988 1989 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 1990 ath12k_warn(ab, "Host capability request failed, result: %d, err: %d\n", 1991 resp.resp.result, resp.resp.error); 1992 ret = -EINVAL; 1993 goto out; 1994 } 1995 1996 out: 1997 return ret; 1998 } 1999 2000 static int ath12k_qmi_fw_ind_register_send(struct ath12k_base *ab) 2001 { 2002 struct qmi_wlanfw_ind_register_req_msg_v01 *req; 2003 struct qmi_wlanfw_ind_register_resp_msg_v01 *resp; 2004 struct qmi_handle *handle = &ab->qmi.handle; 2005 struct qmi_txn txn; 2006 int ret; 2007 2008 req = kzalloc(sizeof(*req), GFP_KERNEL); 2009 if (!req) 2010 return -ENOMEM; 2011 2012 resp = kzalloc(sizeof(*resp), GFP_KERNEL); 2013 if (!resp) { 2014 ret = -ENOMEM; 2015 goto resp_out; 2016 } 2017 2018 req->client_id_valid = 1; 2019 req->client_id = QMI_WLANFW_CLIENT_ID; 2020 req->fw_ready_enable_valid = 1; 2021 req->fw_ready_enable = 1; 2022 req->request_mem_enable_valid = 1; 2023 req->request_mem_enable = 1; 2024 req->fw_mem_ready_enable_valid = 1; 2025 req->fw_mem_ready_enable = 1; 2026 req->cal_done_enable_valid = 1; 2027 req->cal_done_enable = 1; 2028 req->fw_init_done_enable_valid = 1; 2029 req->fw_init_done_enable = 1; 2030 2031 req->pin_connect_result_enable_valid = 0; 2032 req->pin_connect_result_enable = 0; 2033 2034 ret = qmi_txn_init(handle, &txn, 2035 qmi_wlanfw_ind_register_resp_msg_v01_ei, resp); 2036 if (ret < 0) 2037 goto out; 2038 2039 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2040 QMI_WLANFW_IND_REGISTER_REQ_V01, 2041 QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN, 2042 qmi_wlanfw_ind_register_req_msg_v01_ei, req); 2043 if (ret < 0) { 2044 qmi_txn_cancel(&txn); 2045 ath12k_warn(ab, "Failed to send indication register request, err = %d\n", 2046 ret); 2047 goto out; 2048 } 2049 2050 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2051 if (ret < 0) { 2052 ath12k_warn(ab, "failed to register fw indication %d\n", ret); 2053 goto out; 2054 } 2055 2056 if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { 2057 ath12k_warn(ab, "FW Ind register request failed, result: %d, err: %d\n", 2058 resp->resp.result, resp->resp.error); 2059 ret = -EINVAL; 2060 goto out; 2061 } 2062 2063 out: 2064 kfree(resp); 2065 resp_out: 2066 kfree(req); 2067 return ret; 2068 } 2069 2070 static int ath12k_qmi_respond_fw_mem_request(struct ath12k_base *ab) 2071 { 2072 struct qmi_wlanfw_respond_mem_req_msg_v01 *req; 2073 struct qmi_wlanfw_respond_mem_resp_msg_v01 resp; 2074 struct qmi_txn txn = {}; 2075 int ret = 0, i; 2076 bool delayed; 2077 2078 req = kzalloc(sizeof(*req), GFP_KERNEL); 2079 if (!req) 2080 return -ENOMEM; 2081 2082 memset(&resp, 0, sizeof(resp)); 2083 2084 /* Some targets by default request a block of big contiguous 2085 * DMA memory, it's hard to allocate from kernel. So host returns 2086 * failure to firmware and firmware then request multiple blocks of 2087 * small chunk size memory. 2088 */ 2089 if (ab->qmi.target_mem_delayed) { 2090 delayed = true; 2091 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi delays mem_request %d\n", 2092 ab->qmi.mem_seg_count); 2093 memset(req, 0, sizeof(*req)); 2094 } else { 2095 delayed = false; 2096 req->mem_seg_len = ab->qmi.mem_seg_count; 2097 for (i = 0; i < req->mem_seg_len ; i++) { 2098 req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr; 2099 req->mem_seg[i].size = ab->qmi.target_mem[i].size; 2100 req->mem_seg[i].type = ab->qmi.target_mem[i].type; 2101 ath12k_dbg(ab, ATH12K_DBG_QMI, 2102 "qmi req mem_seg[%d] %pad %u %u\n", i, 2103 &ab->qmi.target_mem[i].paddr, 2104 ab->qmi.target_mem[i].size, 2105 ab->qmi.target_mem[i].type); 2106 } 2107 } 2108 2109 ret = qmi_txn_init(&ab->qmi.handle, &txn, 2110 qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp); 2111 if (ret < 0) 2112 goto out; 2113 2114 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2115 QMI_WLANFW_RESPOND_MEM_REQ_V01, 2116 QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN, 2117 qmi_wlanfw_respond_mem_req_msg_v01_ei, req); 2118 if (ret < 0) { 2119 qmi_txn_cancel(&txn); 2120 ath12k_warn(ab, "qmi failed to respond memory request, err = %d\n", 2121 ret); 2122 goto out; 2123 } 2124 2125 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2126 if (ret < 0) { 2127 ath12k_warn(ab, "qmi failed memory request, err = %d\n", ret); 2128 goto out; 2129 } 2130 2131 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2132 /* the error response is expected when 2133 * target_mem_delayed is true. 2134 */ 2135 if (delayed && resp.resp.error == 0) 2136 goto out; 2137 2138 ath12k_warn(ab, "Respond mem req failed, result: %d, err: %d\n", 2139 resp.resp.result, resp.resp.error); 2140 ret = -EINVAL; 2141 goto out; 2142 } 2143 out: 2144 kfree(req); 2145 return ret; 2146 } 2147 2148 static void ath12k_qmi_free_target_mem_chunk(struct ath12k_base *ab) 2149 { 2150 int i; 2151 2152 for (i = 0; i < ab->qmi.mem_seg_count; i++) { 2153 if (!ab->qmi.target_mem[i].v.addr) 2154 continue; 2155 dma_free_coherent(ab->dev, 2156 ab->qmi.target_mem[i].size, 2157 ab->qmi.target_mem[i].v.addr, 2158 ab->qmi.target_mem[i].paddr); 2159 ab->qmi.target_mem[i].v.addr = NULL; 2160 } 2161 } 2162 2163 static int ath12k_qmi_alloc_target_mem_chunk(struct ath12k_base *ab) 2164 { 2165 int i; 2166 struct target_mem_chunk *chunk; 2167 2168 ab->qmi.target_mem_delayed = false; 2169 2170 for (i = 0; i < ab->qmi.mem_seg_count; i++) { 2171 chunk = &ab->qmi.target_mem[i]; 2172 2173 /* Allocate memory for the region and the functionality supported 2174 * on the host. For the non-supported memory region, host does not 2175 * allocate memory, assigns NULL and FW will handle this without crashing. 2176 */ 2177 switch (chunk->type) { 2178 case HOST_DDR_REGION_TYPE: 2179 case M3_DUMP_REGION_TYPE: 2180 case PAGEABLE_MEM_REGION_TYPE: 2181 case CALDB_MEM_REGION_TYPE: 2182 chunk->v.addr = dma_alloc_coherent(ab->dev, 2183 chunk->size, 2184 &chunk->paddr, 2185 GFP_KERNEL | __GFP_NOWARN); 2186 if (!chunk->v.addr) { 2187 if (chunk->size > ATH12K_QMI_MAX_CHUNK_SIZE) { 2188 ab->qmi.target_mem_delayed = true; 2189 ath12k_warn(ab, 2190 "qmi dma allocation failed (%d B type %u), will try later with small size\n", 2191 chunk->size, 2192 chunk->type); 2193 ath12k_qmi_free_target_mem_chunk(ab); 2194 return 0; 2195 } 2196 ath12k_warn(ab, "memory allocation failure for %u size: %d\n", 2197 chunk->type, chunk->size); 2198 return -ENOMEM; 2199 } 2200 break; 2201 default: 2202 ath12k_warn(ab, "memory type %u not supported\n", 2203 chunk->type); 2204 chunk->paddr = 0; 2205 chunk->v.addr = NULL; 2206 break; 2207 } 2208 } 2209 return 0; 2210 } 2211 2212 static int ath12k_qmi_request_target_cap(struct ath12k_base *ab) 2213 { 2214 struct qmi_wlanfw_cap_req_msg_v01 req; 2215 struct qmi_wlanfw_cap_resp_msg_v01 resp; 2216 struct qmi_txn txn = {}; 2217 unsigned int board_id = ATH12K_BOARD_ID_DEFAULT; 2218 int ret = 0; 2219 int i; 2220 2221 memset(&req, 0, sizeof(req)); 2222 memset(&resp, 0, sizeof(resp)); 2223 2224 ret = qmi_txn_init(&ab->qmi.handle, &txn, 2225 qmi_wlanfw_cap_resp_msg_v01_ei, &resp); 2226 if (ret < 0) 2227 goto out; 2228 2229 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2230 QMI_WLANFW_CAP_REQ_V01, 2231 QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN, 2232 qmi_wlanfw_cap_req_msg_v01_ei, &req); 2233 if (ret < 0) { 2234 qmi_txn_cancel(&txn); 2235 ath12k_warn(ab, "qmi failed to send target cap request, err = %d\n", 2236 ret); 2237 goto out; 2238 } 2239 2240 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2241 if (ret < 0) { 2242 ath12k_warn(ab, "qmi failed target cap request %d\n", ret); 2243 goto out; 2244 } 2245 2246 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2247 ath12k_warn(ab, "qmi targetcap req failed, result: %d, err: %d\n", 2248 resp.resp.result, resp.resp.error); 2249 ret = -EINVAL; 2250 goto out; 2251 } 2252 2253 if (resp.chip_info_valid) { 2254 ab->qmi.target.chip_id = resp.chip_info.chip_id; 2255 ab->qmi.target.chip_family = resp.chip_info.chip_family; 2256 } 2257 2258 if (resp.board_info_valid) 2259 ab->qmi.target.board_id = resp.board_info.board_id; 2260 else 2261 ab->qmi.target.board_id = board_id; 2262 2263 if (resp.soc_info_valid) 2264 ab->qmi.target.soc_id = resp.soc_info.soc_id; 2265 2266 if (resp.fw_version_info_valid) { 2267 ab->qmi.target.fw_version = resp.fw_version_info.fw_version; 2268 strscpy(ab->qmi.target.fw_build_timestamp, 2269 resp.fw_version_info.fw_build_timestamp, 2270 sizeof(ab->qmi.target.fw_build_timestamp)); 2271 } 2272 2273 if (resp.fw_build_id_valid) 2274 strscpy(ab->qmi.target.fw_build_id, resp.fw_build_id, 2275 sizeof(ab->qmi.target.fw_build_id)); 2276 2277 if (resp.dev_mem_info_valid) { 2278 for (i = 0; i < ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01; i++) { 2279 ab->qmi.dev_mem[i].start = 2280 resp.dev_mem[i].start; 2281 ab->qmi.dev_mem[i].size = 2282 resp.dev_mem[i].size; 2283 ath12k_dbg(ab, ATH12K_DBG_QMI, 2284 "devmem [%d] start ox%llx size %llu\n", i, 2285 ab->qmi.dev_mem[i].start, 2286 ab->qmi.dev_mem[i].size); 2287 } 2288 } 2289 2290 if (resp.eeprom_caldata_read_timeout_valid) { 2291 ab->qmi.target.eeprom_caldata = resp.eeprom_caldata_read_timeout; 2292 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi cal data supported from eeprom\n"); 2293 } 2294 2295 ath12k_info(ab, "chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x\n", 2296 ab->qmi.target.chip_id, ab->qmi.target.chip_family, 2297 ab->qmi.target.board_id, ab->qmi.target.soc_id); 2298 2299 ath12k_info(ab, "fw_version 0x%x fw_build_timestamp %s fw_build_id %s", 2300 ab->qmi.target.fw_version, 2301 ab->qmi.target.fw_build_timestamp, 2302 ab->qmi.target.fw_build_id); 2303 2304 out: 2305 return ret; 2306 } 2307 2308 static int ath12k_qmi_load_file_target_mem(struct ath12k_base *ab, 2309 const u8 *data, u32 len, u8 type) 2310 { 2311 struct qmi_wlanfw_bdf_download_req_msg_v01 *req; 2312 struct qmi_wlanfw_bdf_download_resp_msg_v01 resp; 2313 struct qmi_txn txn = {}; 2314 const u8 *temp = data; 2315 int ret = 0; 2316 u32 remaining = len; 2317 2318 req = kzalloc(sizeof(*req), GFP_KERNEL); 2319 if (!req) 2320 return -ENOMEM; 2321 memset(&resp, 0, sizeof(resp)); 2322 2323 while (remaining) { 2324 req->valid = 1; 2325 req->file_id_valid = 1; 2326 req->file_id = ab->qmi.target.board_id; 2327 req->total_size_valid = 1; 2328 req->total_size = remaining; 2329 req->seg_id_valid = 1; 2330 req->data_valid = 1; 2331 req->bdf_type = type; 2332 req->bdf_type_valid = 1; 2333 req->end_valid = 1; 2334 req->end = 0; 2335 2336 if (remaining > QMI_WLANFW_MAX_DATA_SIZE_V01) { 2337 req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01; 2338 } else { 2339 req->data_len = remaining; 2340 req->end = 1; 2341 } 2342 2343 if (type == ATH12K_QMI_FILE_TYPE_EEPROM) { 2344 req->data_valid = 0; 2345 req->end = 1; 2346 req->data_len = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE; 2347 } else { 2348 memcpy(req->data, temp, req->data_len); 2349 } 2350 2351 ret = qmi_txn_init(&ab->qmi.handle, &txn, 2352 qmi_wlanfw_bdf_download_resp_msg_v01_ei, 2353 &resp); 2354 if (ret < 0) 2355 goto out; 2356 2357 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf download req fixed addr type %d\n", 2358 type); 2359 2360 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2361 QMI_WLANFW_BDF_DOWNLOAD_REQ_V01, 2362 QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN, 2363 qmi_wlanfw_bdf_download_req_msg_v01_ei, req); 2364 if (ret < 0) { 2365 qmi_txn_cancel(&txn); 2366 goto out; 2367 } 2368 2369 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2370 if (ret < 0) 2371 goto out; 2372 2373 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2374 ath12k_warn(ab, "qmi BDF download failed, result: %d, err: %d\n", 2375 resp.resp.result, resp.resp.error); 2376 ret = -EINVAL; 2377 goto out; 2378 } 2379 2380 if (type == ATH12K_QMI_FILE_TYPE_EEPROM) { 2381 remaining = 0; 2382 } else { 2383 remaining -= req->data_len; 2384 temp += req->data_len; 2385 req->seg_id++; 2386 ath12k_dbg(ab, ATH12K_DBG_QMI, 2387 "qmi bdf download request remaining %i\n", 2388 remaining); 2389 } 2390 } 2391 2392 out: 2393 kfree(req); 2394 return ret; 2395 } 2396 2397 static int ath12k_qmi_load_bdf_qmi(struct ath12k_base *ab, 2398 enum ath12k_qmi_bdf_type type) 2399 { 2400 struct device *dev = ab->dev; 2401 char filename[ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE]; 2402 const struct firmware *fw_entry; 2403 struct ath12k_board_data bd; 2404 u32 fw_size, file_type; 2405 int ret = 0; 2406 const u8 *tmp; 2407 2408 memset(&bd, 0, sizeof(bd)); 2409 2410 switch (type) { 2411 case ATH12K_QMI_BDF_TYPE_ELF: 2412 ret = ath12k_core_fetch_bdf(ab, &bd); 2413 if (ret) { 2414 ath12k_warn(ab, "qmi failed to load bdf:\n"); 2415 goto out; 2416 } 2417 2418 if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0) 2419 type = ATH12K_QMI_BDF_TYPE_ELF; 2420 else 2421 type = ATH12K_QMI_BDF_TYPE_BIN; 2422 2423 break; 2424 case ATH12K_QMI_BDF_TYPE_REGDB: 2425 ret = ath12k_core_fetch_board_data_api_1(ab, &bd, 2426 ATH12K_REGDB_FILE_NAME); 2427 if (ret) { 2428 ath12k_warn(ab, "qmi failed to load regdb bin:\n"); 2429 goto out; 2430 } 2431 break; 2432 case ATH12K_QMI_BDF_TYPE_CALIBRATION: 2433 2434 if (ab->qmi.target.eeprom_caldata) { 2435 file_type = ATH12K_QMI_FILE_TYPE_EEPROM; 2436 tmp = filename; 2437 fw_size = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE; 2438 } else { 2439 file_type = ATH12K_QMI_FILE_TYPE_CALDATA; 2440 2441 /* cal-<bus>-<id>.bin */ 2442 snprintf(filename, sizeof(filename), "cal-%s-%s.bin", 2443 ath12k_bus_str(ab->hif.bus), dev_name(dev)); 2444 fw_entry = ath12k_core_firmware_request(ab, filename); 2445 if (!IS_ERR(fw_entry)) 2446 goto success; 2447 2448 fw_entry = ath12k_core_firmware_request(ab, 2449 ATH12K_DEFAULT_CAL_FILE); 2450 if (IS_ERR(fw_entry)) { 2451 ret = PTR_ERR(fw_entry); 2452 ath12k_warn(ab, 2453 "qmi failed to load CAL data file:%s\n", 2454 filename); 2455 goto out; 2456 } 2457 2458 success: 2459 fw_size = min_t(u32, ab->hw_params->fw.board_size, 2460 fw_entry->size); 2461 tmp = fw_entry->data; 2462 } 2463 ret = ath12k_qmi_load_file_target_mem(ab, tmp, fw_size, file_type); 2464 if (ret < 0) { 2465 ath12k_warn(ab, "qmi failed to load caldata\n"); 2466 goto out_qmi_cal; 2467 } 2468 2469 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi caldata downloaded: type: %u\n", 2470 file_type); 2471 2472 out_qmi_cal: 2473 if (!ab->qmi.target.eeprom_caldata) 2474 release_firmware(fw_entry); 2475 return ret; 2476 default: 2477 ath12k_warn(ab, "unknown file type for load %d", type); 2478 goto out; 2479 } 2480 2481 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf_type %d\n", type); 2482 2483 fw_size = min_t(u32, ab->hw_params->fw.board_size, bd.len); 2484 2485 ret = ath12k_qmi_load_file_target_mem(ab, bd.data, fw_size, type); 2486 if (ret < 0) 2487 ath12k_warn(ab, "qmi failed to load bdf file\n"); 2488 2489 out: 2490 ath12k_core_free_bdf(ab, &bd); 2491 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi BDF download sequence completed\n"); 2492 2493 return ret; 2494 } 2495 2496 static int ath12k_qmi_m3_load(struct ath12k_base *ab) 2497 { 2498 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 2499 const struct firmware *fw; 2500 char path[100]; 2501 int ret; 2502 2503 if (m3_mem->vaddr || m3_mem->size) 2504 return 0; 2505 2506 fw = ath12k_core_firmware_request(ab, ATH12K_M3_FILE); 2507 if (IS_ERR(fw)) { 2508 ret = PTR_ERR(fw); 2509 ath12k_core_create_firmware_path(ab, ATH12K_M3_FILE, 2510 path, sizeof(path)); 2511 ath12k_err(ab, "failed to load %s: %d\n", path, ret); 2512 return ret; 2513 } 2514 2515 m3_mem->vaddr = dma_alloc_coherent(ab->dev, 2516 fw->size, &m3_mem->paddr, 2517 GFP_KERNEL); 2518 if (!m3_mem->vaddr) { 2519 ath12k_err(ab, "failed to allocate memory for M3 with size %zu\n", 2520 fw->size); 2521 release_firmware(fw); 2522 return -ENOMEM; 2523 } 2524 2525 memcpy(m3_mem->vaddr, fw->data, fw->size); 2526 m3_mem->size = fw->size; 2527 release_firmware(fw); 2528 2529 return 0; 2530 } 2531 2532 static void ath12k_qmi_m3_free(struct ath12k_base *ab) 2533 { 2534 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 2535 2536 if (!m3_mem->vaddr) 2537 return; 2538 2539 dma_free_coherent(ab->dev, m3_mem->size, 2540 m3_mem->vaddr, m3_mem->paddr); 2541 m3_mem->vaddr = NULL; 2542 } 2543 2544 static int ath12k_qmi_wlanfw_m3_info_send(struct ath12k_base *ab) 2545 { 2546 struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 2547 struct qmi_wlanfw_m3_info_req_msg_v01 req; 2548 struct qmi_wlanfw_m3_info_resp_msg_v01 resp; 2549 struct qmi_txn txn = {}; 2550 int ret = 0; 2551 2552 memset(&req, 0, sizeof(req)); 2553 memset(&resp, 0, sizeof(resp)); 2554 2555 ret = ath12k_qmi_m3_load(ab); 2556 if (ret) { 2557 ath12k_err(ab, "failed to load m3 firmware: %d", ret); 2558 return ret; 2559 } 2560 2561 req.addr = m3_mem->paddr; 2562 req.size = m3_mem->size; 2563 2564 ret = qmi_txn_init(&ab->qmi.handle, &txn, 2565 qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp); 2566 if (ret < 0) 2567 goto out; 2568 2569 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2570 QMI_WLANFW_M3_INFO_REQ_V01, 2571 QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN, 2572 qmi_wlanfw_m3_info_req_msg_v01_ei, &req); 2573 if (ret < 0) { 2574 qmi_txn_cancel(&txn); 2575 ath12k_warn(ab, "qmi failed to send M3 information request, err = %d\n", 2576 ret); 2577 goto out; 2578 } 2579 2580 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2581 if (ret < 0) { 2582 ath12k_warn(ab, "qmi failed M3 information request %d\n", ret); 2583 goto out; 2584 } 2585 2586 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2587 ath12k_warn(ab, "qmi M3 info request failed, result: %d, err: %d\n", 2588 resp.resp.result, resp.resp.error); 2589 ret = -EINVAL; 2590 goto out; 2591 } 2592 out: 2593 return ret; 2594 } 2595 2596 static int ath12k_qmi_wlanfw_mode_send(struct ath12k_base *ab, 2597 u32 mode) 2598 { 2599 struct qmi_wlanfw_wlan_mode_req_msg_v01 req; 2600 struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp; 2601 struct qmi_txn txn = {}; 2602 int ret = 0; 2603 2604 memset(&req, 0, sizeof(req)); 2605 memset(&resp, 0, sizeof(resp)); 2606 2607 req.mode = mode; 2608 req.hw_debug_valid = 1; 2609 req.hw_debug = 0; 2610 2611 ret = qmi_txn_init(&ab->qmi.handle, &txn, 2612 qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp); 2613 if (ret < 0) 2614 goto out; 2615 2616 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2617 QMI_WLANFW_WLAN_MODE_REQ_V01, 2618 QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN, 2619 qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req); 2620 if (ret < 0) { 2621 qmi_txn_cancel(&txn); 2622 ath12k_warn(ab, "qmi failed to send mode request, mode: %d, err = %d\n", 2623 mode, ret); 2624 goto out; 2625 } 2626 2627 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2628 if (ret < 0) { 2629 if (mode == ATH12K_FIRMWARE_MODE_OFF && ret == -ENETRESET) { 2630 ath12k_warn(ab, "WLFW service is dis-connected\n"); 2631 return 0; 2632 } 2633 ath12k_warn(ab, "qmi failed set mode request, mode: %d, err = %d\n", 2634 mode, ret); 2635 goto out; 2636 } 2637 2638 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2639 ath12k_warn(ab, "Mode request failed, mode: %d, result: %d err: %d\n", 2640 mode, resp.resp.result, resp.resp.error); 2641 ret = -EINVAL; 2642 goto out; 2643 } 2644 2645 out: 2646 return ret; 2647 } 2648 2649 static int ath12k_qmi_wlanfw_wlan_cfg_send(struct ath12k_base *ab) 2650 { 2651 struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req; 2652 struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp; 2653 struct ce_pipe_config *ce_cfg; 2654 struct service_to_pipe *svc_cfg; 2655 struct qmi_txn txn = {}; 2656 int ret = 0, pipe_num; 2657 2658 ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce; 2659 svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map; 2660 2661 req = kzalloc(sizeof(*req), GFP_KERNEL); 2662 if (!req) 2663 return -ENOMEM; 2664 2665 memset(&resp, 0, sizeof(resp)); 2666 2667 req->host_version_valid = 1; 2668 strscpy(req->host_version, ATH12K_HOST_VERSION_STRING, 2669 sizeof(req->host_version)); 2670 2671 req->tgt_cfg_valid = 1; 2672 /* This is number of CE configs */ 2673 req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len; 2674 for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) { 2675 req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum; 2676 req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir; 2677 req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries; 2678 req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max; 2679 req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags; 2680 } 2681 2682 req->svc_cfg_valid = 1; 2683 /* This is number of Service/CE configs */ 2684 req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len; 2685 for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) { 2686 req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id; 2687 req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir; 2688 req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum; 2689 } 2690 2691 /* set shadow v3 configuration */ 2692 if (ab->hw_params->supports_shadow_regs) { 2693 req->shadow_reg_v3_valid = 1; 2694 req->shadow_reg_v3_len = min_t(u32, 2695 ab->qmi.ce_cfg.shadow_reg_v3_len, 2696 QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01); 2697 memcpy(&req->shadow_reg_v3, ab->qmi.ce_cfg.shadow_reg_v3, 2698 sizeof(u32) * req->shadow_reg_v3_len); 2699 } else { 2700 req->shadow_reg_v3_valid = 0; 2701 } 2702 2703 ret = qmi_txn_init(&ab->qmi.handle, &txn, 2704 qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp); 2705 if (ret < 0) 2706 goto out; 2707 2708 ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2709 QMI_WLANFW_WLAN_CFG_REQ_V01, 2710 QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN, 2711 qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req); 2712 if (ret < 0) { 2713 qmi_txn_cancel(&txn); 2714 ath12k_warn(ab, "qmi failed to send wlan config request, err = %d\n", 2715 ret); 2716 goto out; 2717 } 2718 2719 ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2720 if (ret < 0) { 2721 ath12k_warn(ab, "qmi failed wlan config request, err = %d\n", ret); 2722 goto out; 2723 } 2724 2725 if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2726 ath12k_warn(ab, "qmi wlan config request failed, result: %d, err: %d\n", 2727 resp.resp.result, resp.resp.error); 2728 ret = -EINVAL; 2729 goto out; 2730 } 2731 2732 out: 2733 kfree(req); 2734 return ret; 2735 } 2736 2737 void ath12k_qmi_firmware_stop(struct ath12k_base *ab) 2738 { 2739 int ret; 2740 2741 ret = ath12k_qmi_wlanfw_mode_send(ab, ATH12K_FIRMWARE_MODE_OFF); 2742 if (ret < 0) { 2743 ath12k_warn(ab, "qmi failed to send wlan mode off\n"); 2744 return; 2745 } 2746 } 2747 2748 int ath12k_qmi_firmware_start(struct ath12k_base *ab, 2749 u32 mode) 2750 { 2751 int ret; 2752 2753 ret = ath12k_qmi_wlanfw_wlan_cfg_send(ab); 2754 if (ret < 0) { 2755 ath12k_warn(ab, "qmi failed to send wlan cfg:%d\n", ret); 2756 return ret; 2757 } 2758 2759 ret = ath12k_qmi_wlanfw_mode_send(ab, mode); 2760 if (ret < 0) { 2761 ath12k_warn(ab, "qmi failed to send wlan fw mode:%d\n", ret); 2762 return ret; 2763 } 2764 2765 return 0; 2766 } 2767 2768 static int 2769 ath12k_qmi_driver_event_post(struct ath12k_qmi *qmi, 2770 enum ath12k_qmi_event_type type, 2771 void *data) 2772 { 2773 struct ath12k_qmi_driver_event *event; 2774 2775 event = kzalloc(sizeof(*event), GFP_ATOMIC); 2776 if (!event) 2777 return -ENOMEM; 2778 2779 event->type = type; 2780 event->data = data; 2781 2782 spin_lock(&qmi->event_lock); 2783 list_add_tail(&event->list, &qmi->event_list); 2784 spin_unlock(&qmi->event_lock); 2785 2786 queue_work(qmi->event_wq, &qmi->event_work); 2787 2788 return 0; 2789 } 2790 2791 static int ath12k_qmi_event_server_arrive(struct ath12k_qmi *qmi) 2792 { 2793 struct ath12k_base *ab = qmi->ab; 2794 int ret; 2795 2796 ret = ath12k_qmi_fw_ind_register_send(ab); 2797 if (ret < 0) { 2798 ath12k_warn(ab, "qmi failed to send FW indication QMI:%d\n", ret); 2799 return ret; 2800 } 2801 2802 ret = ath12k_qmi_host_cap_send(ab); 2803 if (ret < 0) { 2804 ath12k_warn(ab, "qmi failed to send host cap QMI:%d\n", ret); 2805 return ret; 2806 } 2807 2808 return ret; 2809 } 2810 2811 static int ath12k_qmi_event_mem_request(struct ath12k_qmi *qmi) 2812 { 2813 struct ath12k_base *ab = qmi->ab; 2814 int ret; 2815 2816 ret = ath12k_qmi_respond_fw_mem_request(ab); 2817 if (ret < 0) { 2818 ath12k_warn(ab, "qmi failed to respond fw mem req:%d\n", ret); 2819 return ret; 2820 } 2821 2822 return ret; 2823 } 2824 2825 static int ath12k_qmi_event_load_bdf(struct ath12k_qmi *qmi) 2826 { 2827 struct ath12k_base *ab = qmi->ab; 2828 int ret; 2829 2830 ret = ath12k_qmi_request_target_cap(ab); 2831 if (ret < 0) { 2832 ath12k_warn(ab, "qmi failed to req target capabilities:%d\n", ret); 2833 return ret; 2834 } 2835 2836 ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_REGDB); 2837 if (ret < 0) { 2838 ath12k_warn(ab, "qmi failed to load regdb file:%d\n", ret); 2839 return ret; 2840 } 2841 2842 ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_ELF); 2843 if (ret < 0) { 2844 ath12k_warn(ab, "qmi failed to load board data file:%d\n", ret); 2845 return ret; 2846 } 2847 2848 if (ab->hw_params->download_calib) { 2849 ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_CALIBRATION); 2850 if (ret < 0) 2851 ath12k_warn(ab, "qmi failed to load calibrated data :%d\n", ret); 2852 } 2853 2854 ret = ath12k_qmi_wlanfw_m3_info_send(ab); 2855 if (ret < 0) { 2856 ath12k_warn(ab, "qmi failed to send m3 info req:%d\n", ret); 2857 return ret; 2858 } 2859 2860 return ret; 2861 } 2862 2863 static void ath12k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl, 2864 struct sockaddr_qrtr *sq, 2865 struct qmi_txn *txn, 2866 const void *data) 2867 { 2868 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 2869 struct ath12k_base *ab = qmi->ab; 2870 const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data; 2871 int i, ret; 2872 2873 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware request memory request\n"); 2874 2875 if (msg->mem_seg_len == 0 || 2876 msg->mem_seg_len > ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01) 2877 ath12k_warn(ab, "Invalid memory segment length: %u\n", 2878 msg->mem_seg_len); 2879 2880 ab->qmi.mem_seg_count = msg->mem_seg_len; 2881 2882 for (i = 0; i < qmi->mem_seg_count ; i++) { 2883 ab->qmi.target_mem[i].type = msg->mem_seg[i].type; 2884 ab->qmi.target_mem[i].size = msg->mem_seg[i].size; 2885 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi mem seg type %d size %d\n", 2886 msg->mem_seg[i].type, msg->mem_seg[i].size); 2887 } 2888 2889 ret = ath12k_qmi_alloc_target_mem_chunk(ab); 2890 if (ret) { 2891 ath12k_warn(ab, "qmi failed to alloc target memory: %d\n", 2892 ret); 2893 return; 2894 } 2895 2896 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_REQUEST_MEM, NULL); 2897 } 2898 2899 static void ath12k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl, 2900 struct sockaddr_qrtr *sq, 2901 struct qmi_txn *txn, 2902 const void *decoded) 2903 { 2904 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 2905 struct ath12k_base *ab = qmi->ab; 2906 2907 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware memory ready indication\n"); 2908 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_MEM_READY, NULL); 2909 } 2910 2911 static void ath12k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl, 2912 struct sockaddr_qrtr *sq, 2913 struct qmi_txn *txn, 2914 const void *decoded) 2915 { 2916 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 2917 struct ath12k_base *ab = qmi->ab; 2918 2919 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware ready\n"); 2920 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_READY, NULL); 2921 } 2922 2923 static const struct qmi_msg_handler ath12k_qmi_msg_handlers[] = { 2924 { 2925 .type = QMI_INDICATION, 2926 .msg_id = QMI_WLFW_REQUEST_MEM_IND_V01, 2927 .ei = qmi_wlanfw_request_mem_ind_msg_v01_ei, 2928 .decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01), 2929 .fn = ath12k_qmi_msg_mem_request_cb, 2930 }, 2931 { 2932 .type = QMI_INDICATION, 2933 .msg_id = QMI_WLFW_FW_MEM_READY_IND_V01, 2934 .ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei, 2935 .decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01), 2936 .fn = ath12k_qmi_msg_mem_ready_cb, 2937 }, 2938 { 2939 .type = QMI_INDICATION, 2940 .msg_id = QMI_WLFW_FW_READY_IND_V01, 2941 .ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei, 2942 .decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01), 2943 .fn = ath12k_qmi_msg_fw_ready_cb, 2944 }, 2945 2946 /* end of list */ 2947 {}, 2948 }; 2949 2950 static int ath12k_qmi_ops_new_server(struct qmi_handle *qmi_hdl, 2951 struct qmi_service *service) 2952 { 2953 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 2954 struct ath12k_base *ab = qmi->ab; 2955 struct sockaddr_qrtr *sq = &qmi->sq; 2956 int ret; 2957 2958 sq->sq_family = AF_QIPCRTR; 2959 sq->sq_node = service->node; 2960 sq->sq_port = service->port; 2961 2962 ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq, 2963 sizeof(*sq), 0); 2964 if (ret) { 2965 ath12k_warn(ab, "qmi failed to connect to remote service %d\n", ret); 2966 return ret; 2967 } 2968 2969 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw qmi service connected\n"); 2970 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_ARRIVE, NULL); 2971 2972 return ret; 2973 } 2974 2975 static void ath12k_qmi_ops_del_server(struct qmi_handle *qmi_hdl, 2976 struct qmi_service *service) 2977 { 2978 struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 2979 struct ath12k_base *ab = qmi->ab; 2980 2981 ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw del server\n"); 2982 ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_EXIT, NULL); 2983 } 2984 2985 static const struct qmi_ops ath12k_qmi_ops = { 2986 .new_server = ath12k_qmi_ops_new_server, 2987 .del_server = ath12k_qmi_ops_del_server, 2988 }; 2989 2990 static void ath12k_qmi_driver_event_work(struct work_struct *work) 2991 { 2992 struct ath12k_qmi *qmi = container_of(work, struct ath12k_qmi, 2993 event_work); 2994 struct ath12k_qmi_driver_event *event; 2995 struct ath12k_base *ab = qmi->ab; 2996 int ret; 2997 2998 spin_lock(&qmi->event_lock); 2999 while (!list_empty(&qmi->event_list)) { 3000 event = list_first_entry(&qmi->event_list, 3001 struct ath12k_qmi_driver_event, list); 3002 list_del(&event->list); 3003 spin_unlock(&qmi->event_lock); 3004 3005 if (test_bit(ATH12K_FLAG_UNREGISTERING, &ab->dev_flags)) 3006 goto skip; 3007 3008 switch (event->type) { 3009 case ATH12K_QMI_EVENT_SERVER_ARRIVE: 3010 ret = ath12k_qmi_event_server_arrive(qmi); 3011 if (ret < 0) 3012 set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 3013 break; 3014 case ATH12K_QMI_EVENT_SERVER_EXIT: 3015 set_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags); 3016 set_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags); 3017 break; 3018 case ATH12K_QMI_EVENT_REQUEST_MEM: 3019 ret = ath12k_qmi_event_mem_request(qmi); 3020 if (ret < 0) 3021 set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 3022 break; 3023 case ATH12K_QMI_EVENT_FW_MEM_READY: 3024 ret = ath12k_qmi_event_load_bdf(qmi); 3025 if (ret < 0) 3026 set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 3027 break; 3028 case ATH12K_QMI_EVENT_FW_READY: 3029 clear_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 3030 if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags)) { 3031 ath12k_hal_dump_srng_stats(ab); 3032 queue_work(ab->workqueue, &ab->restart_work); 3033 break; 3034 } 3035 3036 clear_bit(ATH12K_FLAG_CRASH_FLUSH, 3037 &ab->dev_flags); 3038 clear_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags); 3039 ath12k_core_qmi_firmware_ready(ab); 3040 set_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags); 3041 3042 break; 3043 default: 3044 ath12k_warn(ab, "invalid event type: %d", event->type); 3045 break; 3046 } 3047 3048 skip: 3049 kfree(event); 3050 spin_lock(&qmi->event_lock); 3051 } 3052 spin_unlock(&qmi->event_lock); 3053 } 3054 3055 int ath12k_qmi_init_service(struct ath12k_base *ab) 3056 { 3057 int ret; 3058 3059 memset(&ab->qmi.target, 0, sizeof(struct target_info)); 3060 memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk)); 3061 ab->qmi.ab = ab; 3062 3063 ab->qmi.target_mem_mode = ATH12K_QMI_TARGET_MEM_MODE_DEFAULT; 3064 ret = qmi_handle_init(&ab->qmi.handle, ATH12K_QMI_RESP_LEN_MAX, 3065 &ath12k_qmi_ops, ath12k_qmi_msg_handlers); 3066 if (ret < 0) { 3067 ath12k_warn(ab, "failed to initialize qmi handle\n"); 3068 return ret; 3069 } 3070 3071 ab->qmi.event_wq = alloc_ordered_workqueue("ath12k_qmi_driver_event", 0); 3072 if (!ab->qmi.event_wq) { 3073 ath12k_err(ab, "failed to allocate workqueue\n"); 3074 return -EFAULT; 3075 } 3076 3077 INIT_LIST_HEAD(&ab->qmi.event_list); 3078 spin_lock_init(&ab->qmi.event_lock); 3079 INIT_WORK(&ab->qmi.event_work, ath12k_qmi_driver_event_work); 3080 3081 ret = qmi_add_lookup(&ab->qmi.handle, ATH12K_QMI_WLFW_SERVICE_ID_V01, 3082 ATH12K_QMI_WLFW_SERVICE_VERS_V01, 3083 ab->qmi.service_ins_id); 3084 if (ret < 0) { 3085 ath12k_warn(ab, "failed to add qmi lookup\n"); 3086 destroy_workqueue(ab->qmi.event_wq); 3087 return ret; 3088 } 3089 3090 return ret; 3091 } 3092 3093 void ath12k_qmi_deinit_service(struct ath12k_base *ab) 3094 { 3095 qmi_handle_release(&ab->qmi.handle); 3096 cancel_work_sync(&ab->qmi.event_work); 3097 destroy_workqueue(ab->qmi.event_wq); 3098 ath12k_qmi_m3_free(ab); 3099 ath12k_qmi_free_target_mem_chunk(ab); 3100 } 3101