1d8899132SKalle Valo // SPDX-License-Identifier: BSD-3-Clause-Clear 2d8899132SKalle Valo /* 3d8899132SKalle Valo * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved. 459cf57abSJeff Johnson * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. 5d8899132SKalle Valo */ 6d8899132SKalle Valo 7d8899132SKalle Valo #include <linux/elf.h> 8d8899132SKalle Valo 9d8899132SKalle Valo #include "qmi.h" 10d8899132SKalle Valo #include "core.h" 11d8899132SKalle Valo #include "debug.h" 12d8899132SKalle Valo #include <linux/of.h> 13d8899132SKalle Valo #include <linux/firmware.h> 14d8899132SKalle Valo 15d8899132SKalle Valo #define SLEEP_CLOCK_SELECT_INTERNAL_BIT 0x02 16d8899132SKalle Valo #define HOST_CSTATE_BIT 0x04 17d8899132SKalle Valo #define PLATFORM_CAP_PCIE_GLOBAL_RESET 0x08 18d8899132SKalle Valo #define ATH12K_QMI_MAX_CHUNK_SIZE 2097152 19d8899132SKalle Valo 20e7ab40b7SJeff Johnson static const struct qmi_elem_info wlfw_host_mlo_chip_info_s_v01_ei[] = { 21d8899132SKalle Valo { 22d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 23d8899132SKalle Valo .elem_len = 1, 24d8899132SKalle Valo .elem_size = sizeof(u8), 25d8899132SKalle Valo .array_type = NO_ARRAY, 26d8899132SKalle Valo .tlv_type = 0, 27d8899132SKalle Valo .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 28d8899132SKalle Valo chip_id), 29d8899132SKalle Valo }, 30d8899132SKalle Valo { 31d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 32d8899132SKalle Valo .elem_len = 1, 33d8899132SKalle Valo .elem_size = sizeof(u8), 34d8899132SKalle Valo .array_type = NO_ARRAY, 35d8899132SKalle Valo .tlv_type = 0, 36d8899132SKalle Valo .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 37d8899132SKalle Valo num_local_links), 38d8899132SKalle Valo }, 39d8899132SKalle Valo { 40d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 41d8899132SKalle Valo .elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01, 42d8899132SKalle Valo .elem_size = sizeof(u8), 43d8899132SKalle Valo .array_type = STATIC_ARRAY, 44d8899132SKalle Valo .tlv_type = 0, 45d8899132SKalle Valo .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 46d8899132SKalle Valo hw_link_id), 47d8899132SKalle Valo }, 48d8899132SKalle Valo { 49d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 50d8899132SKalle Valo .elem_len = QMI_WLFW_MAX_NUM_MLO_LINKS_PER_CHIP_V01, 51d8899132SKalle Valo .elem_size = sizeof(u8), 52d8899132SKalle Valo .array_type = STATIC_ARRAY, 53d8899132SKalle Valo .tlv_type = 0, 54d8899132SKalle Valo .offset = offsetof(struct wlfw_host_mlo_chip_info_s_v01, 55d8899132SKalle Valo valid_mlo_link_id), 56d8899132SKalle Valo }, 57d8899132SKalle Valo { 58d8899132SKalle Valo .data_type = QMI_EOTI, 59d8899132SKalle Valo .array_type = NO_ARRAY, 60d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 61d8899132SKalle Valo }, 62d8899132SKalle Valo }; 63d8899132SKalle Valo 64e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_host_cap_req_msg_v01_ei[] = { 65d8899132SKalle Valo { 66d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 67d8899132SKalle Valo .elem_len = 1, 68d8899132SKalle Valo .elem_size = sizeof(u8), 69d8899132SKalle Valo .array_type = NO_ARRAY, 70d8899132SKalle Valo .tlv_type = 0x10, 71d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 72d8899132SKalle Valo num_clients_valid), 73d8899132SKalle Valo }, 74d8899132SKalle Valo { 75d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 76d8899132SKalle Valo .elem_len = 1, 77d8899132SKalle Valo .elem_size = sizeof(u32), 78d8899132SKalle Valo .array_type = NO_ARRAY, 79d8899132SKalle Valo .tlv_type = 0x10, 80d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 81d8899132SKalle Valo num_clients), 82d8899132SKalle Valo }, 83d8899132SKalle Valo { 84d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 85d8899132SKalle Valo .elem_len = 1, 86d8899132SKalle Valo .elem_size = sizeof(u8), 87d8899132SKalle Valo .array_type = NO_ARRAY, 88d8899132SKalle Valo .tlv_type = 0x11, 89d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 90d8899132SKalle Valo wake_msi_valid), 91d8899132SKalle Valo }, 92d8899132SKalle Valo { 93d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 94d8899132SKalle Valo .elem_len = 1, 95d8899132SKalle Valo .elem_size = sizeof(u32), 96d8899132SKalle Valo .array_type = NO_ARRAY, 97d8899132SKalle Valo .tlv_type = 0x11, 98d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 99d8899132SKalle Valo wake_msi), 100d8899132SKalle Valo }, 101d8899132SKalle Valo { 102d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 103d8899132SKalle Valo .elem_len = 1, 104d8899132SKalle Valo .elem_size = sizeof(u8), 105d8899132SKalle Valo .array_type = NO_ARRAY, 106d8899132SKalle Valo .tlv_type = 0x12, 107d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 108d8899132SKalle Valo gpios_valid), 109d8899132SKalle Valo }, 110d8899132SKalle Valo { 111d8899132SKalle Valo .data_type = QMI_DATA_LEN, 112d8899132SKalle Valo .elem_len = 1, 113d8899132SKalle Valo .elem_size = sizeof(u8), 114d8899132SKalle Valo .array_type = NO_ARRAY, 115d8899132SKalle Valo .tlv_type = 0x12, 116d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 117d8899132SKalle Valo gpios_len), 118d8899132SKalle Valo }, 119d8899132SKalle Valo { 120d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 121d8899132SKalle Valo .elem_len = QMI_WLFW_MAX_NUM_GPIO_V01, 122d8899132SKalle Valo .elem_size = sizeof(u32), 123d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 124d8899132SKalle Valo .tlv_type = 0x12, 125d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 126d8899132SKalle Valo gpios), 127d8899132SKalle Valo }, 128d8899132SKalle Valo { 129d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 130d8899132SKalle Valo .elem_len = 1, 131d8899132SKalle Valo .elem_size = sizeof(u8), 132d8899132SKalle Valo .array_type = NO_ARRAY, 133d8899132SKalle Valo .tlv_type = 0x13, 134d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 135d8899132SKalle Valo nm_modem_valid), 136d8899132SKalle Valo }, 137d8899132SKalle Valo { 138d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 139d8899132SKalle Valo .elem_len = 1, 140d8899132SKalle Valo .elem_size = sizeof(u8), 141d8899132SKalle Valo .array_type = NO_ARRAY, 142d8899132SKalle Valo .tlv_type = 0x13, 143d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 144d8899132SKalle Valo nm_modem), 145d8899132SKalle Valo }, 146d8899132SKalle Valo { 147d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 148d8899132SKalle Valo .elem_len = 1, 149d8899132SKalle Valo .elem_size = sizeof(u8), 150d8899132SKalle Valo .array_type = NO_ARRAY, 151d8899132SKalle Valo .tlv_type = 0x14, 152d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 153d8899132SKalle Valo bdf_support_valid), 154d8899132SKalle Valo }, 155d8899132SKalle Valo { 156d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 157d8899132SKalle Valo .elem_len = 1, 158d8899132SKalle Valo .elem_size = sizeof(u8), 159d8899132SKalle Valo .array_type = NO_ARRAY, 160d8899132SKalle Valo .tlv_type = 0x14, 161d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 162d8899132SKalle Valo bdf_support), 163d8899132SKalle Valo }, 164d8899132SKalle Valo { 165d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 166d8899132SKalle Valo .elem_len = 1, 167d8899132SKalle Valo .elem_size = sizeof(u8), 168d8899132SKalle Valo .array_type = NO_ARRAY, 169d8899132SKalle Valo .tlv_type = 0x15, 170d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 171d8899132SKalle Valo bdf_cache_support_valid), 172d8899132SKalle Valo }, 173d8899132SKalle Valo { 174d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 175d8899132SKalle Valo .elem_len = 1, 176d8899132SKalle Valo .elem_size = sizeof(u8), 177d8899132SKalle Valo .array_type = NO_ARRAY, 178d8899132SKalle Valo .tlv_type = 0x15, 179d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 180d8899132SKalle Valo bdf_cache_support), 181d8899132SKalle Valo }, 182d8899132SKalle Valo { 183d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 184d8899132SKalle Valo .elem_len = 1, 185d8899132SKalle Valo .elem_size = sizeof(u8), 186d8899132SKalle Valo .array_type = NO_ARRAY, 187d8899132SKalle Valo .tlv_type = 0x16, 188d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 189d8899132SKalle Valo m3_support_valid), 190d8899132SKalle Valo }, 191d8899132SKalle Valo { 192d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 193d8899132SKalle Valo .elem_len = 1, 194d8899132SKalle Valo .elem_size = sizeof(u8), 195d8899132SKalle Valo .array_type = NO_ARRAY, 196d8899132SKalle Valo .tlv_type = 0x16, 197d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 198d8899132SKalle Valo m3_support), 199d8899132SKalle Valo }, 200d8899132SKalle Valo { 201d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 202d8899132SKalle Valo .elem_len = 1, 203d8899132SKalle Valo .elem_size = sizeof(u8), 204d8899132SKalle Valo .array_type = NO_ARRAY, 205d8899132SKalle Valo .tlv_type = 0x17, 206d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 207d8899132SKalle Valo m3_cache_support_valid), 208d8899132SKalle Valo }, 209d8899132SKalle Valo { 210d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 211d8899132SKalle Valo .elem_len = 1, 212d8899132SKalle Valo .elem_size = sizeof(u8), 213d8899132SKalle Valo .array_type = NO_ARRAY, 214d8899132SKalle Valo .tlv_type = 0x17, 215d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 216d8899132SKalle Valo m3_cache_support), 217d8899132SKalle Valo }, 218d8899132SKalle Valo { 219d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 220d8899132SKalle Valo .elem_len = 1, 221d8899132SKalle Valo .elem_size = sizeof(u8), 222d8899132SKalle Valo .array_type = NO_ARRAY, 223d8899132SKalle Valo .tlv_type = 0x18, 224d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 225d8899132SKalle Valo cal_filesys_support_valid), 226d8899132SKalle Valo }, 227d8899132SKalle Valo { 228d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 229d8899132SKalle Valo .elem_len = 1, 230d8899132SKalle Valo .elem_size = sizeof(u8), 231d8899132SKalle Valo .array_type = NO_ARRAY, 232d8899132SKalle Valo .tlv_type = 0x18, 233d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 234d8899132SKalle Valo cal_filesys_support), 235d8899132SKalle Valo }, 236d8899132SKalle Valo { 237d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 238d8899132SKalle Valo .elem_len = 1, 239d8899132SKalle Valo .elem_size = sizeof(u8), 240d8899132SKalle Valo .array_type = NO_ARRAY, 241d8899132SKalle Valo .tlv_type = 0x19, 242d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 243d8899132SKalle Valo cal_cache_support_valid), 244d8899132SKalle Valo }, 245d8899132SKalle Valo { 246d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 247d8899132SKalle Valo .elem_len = 1, 248d8899132SKalle Valo .elem_size = sizeof(u8), 249d8899132SKalle Valo .array_type = NO_ARRAY, 250d8899132SKalle Valo .tlv_type = 0x19, 251d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 252d8899132SKalle Valo cal_cache_support), 253d8899132SKalle Valo }, 254d8899132SKalle Valo { 255d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 256d8899132SKalle Valo .elem_len = 1, 257d8899132SKalle Valo .elem_size = sizeof(u8), 258d8899132SKalle Valo .array_type = NO_ARRAY, 259d8899132SKalle Valo .tlv_type = 0x1A, 260d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 261d8899132SKalle Valo cal_done_valid), 262d8899132SKalle Valo }, 263d8899132SKalle Valo { 264d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 265d8899132SKalle Valo .elem_len = 1, 266d8899132SKalle Valo .elem_size = sizeof(u8), 267d8899132SKalle Valo .array_type = NO_ARRAY, 268d8899132SKalle Valo .tlv_type = 0x1A, 269d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 270d8899132SKalle Valo cal_done), 271d8899132SKalle Valo }, 272d8899132SKalle Valo { 273d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 274d8899132SKalle Valo .elem_len = 1, 275d8899132SKalle Valo .elem_size = sizeof(u8), 276d8899132SKalle Valo .array_type = NO_ARRAY, 277d8899132SKalle Valo .tlv_type = 0x1B, 278d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 279d8899132SKalle Valo mem_bucket_valid), 280d8899132SKalle Valo }, 281d8899132SKalle Valo { 282d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 283d8899132SKalle Valo .elem_len = 1, 284d8899132SKalle Valo .elem_size = sizeof(u32), 285d8899132SKalle Valo .array_type = NO_ARRAY, 286d8899132SKalle Valo .tlv_type = 0x1B, 287d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 288d8899132SKalle Valo mem_bucket), 289d8899132SKalle Valo }, 290d8899132SKalle Valo { 291d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 292d8899132SKalle Valo .elem_len = 1, 293d8899132SKalle Valo .elem_size = sizeof(u8), 294d8899132SKalle Valo .array_type = NO_ARRAY, 295d8899132SKalle Valo .tlv_type = 0x1C, 296d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 297d8899132SKalle Valo mem_cfg_mode_valid), 298d8899132SKalle Valo }, 299d8899132SKalle Valo { 300d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 301d8899132SKalle Valo .elem_len = 1, 302d8899132SKalle Valo .elem_size = sizeof(u8), 303d8899132SKalle Valo .array_type = NO_ARRAY, 304d8899132SKalle Valo .tlv_type = 0x1C, 305d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 306d8899132SKalle Valo mem_cfg_mode), 307d8899132SKalle Valo }, 308d8899132SKalle Valo { 309d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 310d8899132SKalle Valo .elem_len = 1, 311d8899132SKalle Valo .elem_size = sizeof(u8), 312d8899132SKalle Valo .array_type = NO_ARRAY, 313d8899132SKalle Valo .tlv_type = 0x1D, 314d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 315d8899132SKalle Valo cal_duration_valid), 316d8899132SKalle Valo }, 317d8899132SKalle Valo { 318d8899132SKalle Valo .data_type = QMI_UNSIGNED_2_BYTE, 319d8899132SKalle Valo .elem_len = 1, 320d8899132SKalle Valo .elem_size = sizeof(u16), 321d8899132SKalle Valo .array_type = NO_ARRAY, 322d8899132SKalle Valo .tlv_type = 0x1D, 323d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 324d8899132SKalle Valo cal_duraiton), 325d8899132SKalle Valo }, 326d8899132SKalle Valo { 327d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 328d8899132SKalle Valo .elem_len = 1, 329d8899132SKalle Valo .elem_size = sizeof(u8), 330d8899132SKalle Valo .array_type = NO_ARRAY, 331d8899132SKalle Valo .tlv_type = 0x1E, 332d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 333d8899132SKalle Valo platform_name_valid), 334d8899132SKalle Valo }, 335d8899132SKalle Valo { 336d8899132SKalle Valo .data_type = QMI_STRING, 337d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_PLATFORM_NAME_LEN_V01 + 1, 338d8899132SKalle Valo .elem_size = sizeof(char), 339d8899132SKalle Valo .array_type = NO_ARRAY, 340d8899132SKalle Valo .tlv_type = 0x1E, 341d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 342d8899132SKalle Valo platform_name), 343d8899132SKalle Valo }, 344d8899132SKalle Valo { 345d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 346d8899132SKalle Valo .elem_len = 1, 347d8899132SKalle Valo .elem_size = sizeof(u8), 348d8899132SKalle Valo .array_type = NO_ARRAY, 349d8899132SKalle Valo .tlv_type = 0x1F, 350d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 351d8899132SKalle Valo ddr_range_valid), 352d8899132SKalle Valo }, 353d8899132SKalle Valo { 354d8899132SKalle Valo .data_type = QMI_STRUCT, 355d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_HOST_DDR_RANGE_SIZE_V01, 356d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_host_ddr_range), 357d8899132SKalle Valo .array_type = STATIC_ARRAY, 358d8899132SKalle Valo .tlv_type = 0x1F, 359d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 360d8899132SKalle Valo ddr_range), 361d8899132SKalle Valo }, 362d8899132SKalle Valo { 363d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 364d8899132SKalle Valo .elem_len = 1, 365d8899132SKalle Valo .elem_size = sizeof(u8), 366d8899132SKalle Valo .array_type = NO_ARRAY, 367d8899132SKalle Valo .tlv_type = 0x20, 368d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 369d8899132SKalle Valo host_build_type_valid), 370d8899132SKalle Valo }, 371d8899132SKalle Valo { 372d8899132SKalle Valo .data_type = QMI_SIGNED_4_BYTE_ENUM, 373d8899132SKalle Valo .elem_len = 1, 374d8899132SKalle Valo .elem_size = sizeof(enum qmi_wlanfw_host_build_type), 375d8899132SKalle Valo .array_type = NO_ARRAY, 376d8899132SKalle Valo .tlv_type = 0x20, 377d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 378d8899132SKalle Valo host_build_type), 379d8899132SKalle Valo }, 380d8899132SKalle Valo { 381d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 382d8899132SKalle Valo .elem_len = 1, 383d8899132SKalle Valo .elem_size = sizeof(u8), 384d8899132SKalle Valo .array_type = NO_ARRAY, 385d8899132SKalle Valo .tlv_type = 0x21, 386d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 387d8899132SKalle Valo mlo_capable_valid), 388d8899132SKalle Valo }, 389d8899132SKalle Valo { 39015c8441dSWen Gong .data_type = QMI_UNSIGNED_1_BYTE, 391d8899132SKalle Valo .elem_len = 1, 392d8899132SKalle Valo .elem_size = sizeof(u8), 393d8899132SKalle Valo .array_type = NO_ARRAY, 394d8899132SKalle Valo .tlv_type = 0x21, 395d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 396d8899132SKalle Valo mlo_capable), 397d8899132SKalle Valo }, 398d8899132SKalle Valo { 399d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 400d8899132SKalle Valo .elem_len = 1, 401d8899132SKalle Valo .elem_size = sizeof(u8), 402d8899132SKalle Valo .array_type = NO_ARRAY, 403d8899132SKalle Valo .tlv_type = 0x22, 404d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 405d8899132SKalle Valo mlo_chip_id_valid), 406d8899132SKalle Valo }, 407d8899132SKalle Valo { 408d8899132SKalle Valo .data_type = QMI_UNSIGNED_2_BYTE, 409d8899132SKalle Valo .elem_len = 1, 410d8899132SKalle Valo .elem_size = sizeof(u16), 411d8899132SKalle Valo .array_type = NO_ARRAY, 412d8899132SKalle Valo .tlv_type = 0x22, 413d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 414d8899132SKalle Valo mlo_chip_id), 415d8899132SKalle Valo }, 416d8899132SKalle Valo { 417d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 418d8899132SKalle Valo .elem_len = 1, 419d8899132SKalle Valo .elem_size = sizeof(u8), 420d8899132SKalle Valo .array_type = NO_ARRAY, 421d8899132SKalle Valo .tlv_type = 0x23, 422d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 423d8899132SKalle Valo mlo_group_id_valid), 424d8899132SKalle Valo }, 425d8899132SKalle Valo { 426d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 427d8899132SKalle Valo .elem_len = 1, 428d8899132SKalle Valo .elem_size = sizeof(u8), 429d8899132SKalle Valo .array_type = NO_ARRAY, 430d8899132SKalle Valo .tlv_type = 0x23, 431d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 432d8899132SKalle Valo mlo_group_id), 433d8899132SKalle Valo }, 434d8899132SKalle Valo { 435d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 436d8899132SKalle Valo .elem_len = 1, 437d8899132SKalle Valo .elem_size = sizeof(u8), 438d8899132SKalle Valo .array_type = NO_ARRAY, 439d8899132SKalle Valo .tlv_type = 0x24, 440d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 441d8899132SKalle Valo max_mlo_peer_valid), 442d8899132SKalle Valo }, 443d8899132SKalle Valo { 444d8899132SKalle Valo .data_type = QMI_UNSIGNED_2_BYTE, 445d8899132SKalle Valo .elem_len = 1, 446d8899132SKalle Valo .elem_size = sizeof(u16), 447d8899132SKalle Valo .array_type = NO_ARRAY, 448d8899132SKalle Valo .tlv_type = 0x24, 449d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 450d8899132SKalle Valo max_mlo_peer), 451d8899132SKalle Valo }, 452d8899132SKalle Valo { 453d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 454d8899132SKalle Valo .elem_len = 1, 455d8899132SKalle Valo .elem_size = sizeof(u8), 456d8899132SKalle Valo .array_type = NO_ARRAY, 457d8899132SKalle Valo .tlv_type = 0x25, 458d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 459d8899132SKalle Valo mlo_num_chips_valid), 460d8899132SKalle Valo }, 461d8899132SKalle Valo { 462d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 463d8899132SKalle Valo .elem_len = 1, 464d8899132SKalle Valo .elem_size = sizeof(u8), 465d8899132SKalle Valo .array_type = NO_ARRAY, 466d8899132SKalle Valo .tlv_type = 0x25, 467d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 468d8899132SKalle Valo mlo_num_chips), 469d8899132SKalle Valo }, 470d8899132SKalle Valo { 471d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 472d8899132SKalle Valo .elem_len = 1, 473d8899132SKalle Valo .elem_size = sizeof(u8), 474d8899132SKalle Valo .array_type = NO_ARRAY, 475d8899132SKalle Valo .tlv_type = 0x26, 476d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 477d8899132SKalle Valo mlo_chip_info_valid), 478d8899132SKalle Valo }, 479d8899132SKalle Valo { 480d8899132SKalle Valo .data_type = QMI_STRUCT, 481d8899132SKalle Valo .elem_len = QMI_WLFW_MAX_NUM_MLO_CHIPS_V01, 482d8899132SKalle Valo .elem_size = sizeof(struct wlfw_host_mlo_chip_info_s_v01), 483d8899132SKalle Valo .array_type = STATIC_ARRAY, 484d8899132SKalle Valo .tlv_type = 0x26, 485d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 486d8899132SKalle Valo mlo_chip_info), 487d8899132SKalle Valo .ei_array = wlfw_host_mlo_chip_info_s_v01_ei, 488d8899132SKalle Valo }, 489d8899132SKalle Valo { 490d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 491d8899132SKalle Valo .elem_len = 1, 492d8899132SKalle Valo .elem_size = sizeof(u8), 493d8899132SKalle Valo .array_type = NO_ARRAY, 494d8899132SKalle Valo .tlv_type = 0x27, 495d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 496d8899132SKalle Valo feature_list_valid), 497d8899132SKalle Valo }, 498d8899132SKalle Valo { 499d8899132SKalle Valo .data_type = QMI_UNSIGNED_8_BYTE, 500d8899132SKalle Valo .elem_len = 1, 501d8899132SKalle Valo .elem_size = sizeof(u64), 502d8899132SKalle Valo .array_type = NO_ARRAY, 503d8899132SKalle Valo .tlv_type = 0x27, 504d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_req_msg_v01, 505d8899132SKalle Valo feature_list), 506d8899132SKalle Valo }, 507d8899132SKalle Valo { 508d8899132SKalle Valo .data_type = QMI_EOTI, 509d8899132SKalle Valo .array_type = NO_ARRAY, 510d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 511d8899132SKalle Valo }, 512d8899132SKalle Valo }; 513d8899132SKalle Valo 514e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_host_cap_resp_msg_v01_ei[] = { 515d8899132SKalle Valo { 516d8899132SKalle Valo .data_type = QMI_STRUCT, 517d8899132SKalle Valo .elem_len = 1, 518d8899132SKalle Valo .elem_size = sizeof(struct qmi_response_type_v01), 519d8899132SKalle Valo .array_type = NO_ARRAY, 520d8899132SKalle Valo .tlv_type = 0x02, 521d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_host_cap_resp_msg_v01, resp), 522d8899132SKalle Valo .ei_array = qmi_response_type_v01_ei, 523d8899132SKalle Valo }, 524d8899132SKalle Valo { 525d8899132SKalle Valo .data_type = QMI_EOTI, 526d8899132SKalle Valo .array_type = NO_ARRAY, 527d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 528d8899132SKalle Valo }, 529d8899132SKalle Valo }; 530d8899132SKalle Valo 53153a65445SKarthikeyan Periyasamy static const struct qmi_elem_info qmi_wlanfw_phy_cap_req_msg_v01_ei[] = { 53253a65445SKarthikeyan Periyasamy { 53353a65445SKarthikeyan Periyasamy .data_type = QMI_EOTI, 53453a65445SKarthikeyan Periyasamy .array_type = NO_ARRAY, 53553a65445SKarthikeyan Periyasamy .tlv_type = QMI_COMMON_TLV_TYPE, 53653a65445SKarthikeyan Periyasamy }, 53753a65445SKarthikeyan Periyasamy }; 53853a65445SKarthikeyan Periyasamy 53953a65445SKarthikeyan Periyasamy static const struct qmi_elem_info qmi_wlanfw_phy_cap_resp_msg_v01_ei[] = { 54053a65445SKarthikeyan Periyasamy { 54153a65445SKarthikeyan Periyasamy .data_type = QMI_STRUCT, 54253a65445SKarthikeyan Periyasamy .elem_len = 1, 54353a65445SKarthikeyan Periyasamy .elem_size = sizeof(struct qmi_response_type_v01), 54453a65445SKarthikeyan Periyasamy .array_type = NO_ARRAY, 54553a65445SKarthikeyan Periyasamy .tlv_type = 0x02, 54653a65445SKarthikeyan Periyasamy .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01, resp), 54753a65445SKarthikeyan Periyasamy .ei_array = qmi_response_type_v01_ei, 54853a65445SKarthikeyan Periyasamy }, 54953a65445SKarthikeyan Periyasamy { 55053a65445SKarthikeyan Periyasamy .data_type = QMI_OPT_FLAG, 55153a65445SKarthikeyan Periyasamy .elem_len = 1, 55253a65445SKarthikeyan Periyasamy .elem_size = sizeof(u8), 55353a65445SKarthikeyan Periyasamy .array_type = NO_ARRAY, 55453a65445SKarthikeyan Periyasamy .tlv_type = 0x10, 55553a65445SKarthikeyan Periyasamy .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01, 55653a65445SKarthikeyan Periyasamy num_phy_valid), 55753a65445SKarthikeyan Periyasamy }, 55853a65445SKarthikeyan Periyasamy { 55953a65445SKarthikeyan Periyasamy .data_type = QMI_UNSIGNED_1_BYTE, 56053a65445SKarthikeyan Periyasamy .elem_len = 1, 56153a65445SKarthikeyan Periyasamy .elem_size = sizeof(u8), 56253a65445SKarthikeyan Periyasamy .array_type = NO_ARRAY, 56353a65445SKarthikeyan Periyasamy .tlv_type = 0x10, 56453a65445SKarthikeyan Periyasamy .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01, 56553a65445SKarthikeyan Periyasamy num_phy), 56653a65445SKarthikeyan Periyasamy }, 56753a65445SKarthikeyan Periyasamy { 56853a65445SKarthikeyan Periyasamy .data_type = QMI_OPT_FLAG, 56953a65445SKarthikeyan Periyasamy .elem_len = 1, 57053a65445SKarthikeyan Periyasamy .elem_size = sizeof(u8), 57153a65445SKarthikeyan Periyasamy .array_type = NO_ARRAY, 57253a65445SKarthikeyan Periyasamy .tlv_type = 0x11, 57353a65445SKarthikeyan Periyasamy .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01, 57453a65445SKarthikeyan Periyasamy board_id_valid), 57553a65445SKarthikeyan Periyasamy }, 57653a65445SKarthikeyan Periyasamy { 57753a65445SKarthikeyan Periyasamy .data_type = QMI_UNSIGNED_4_BYTE, 57853a65445SKarthikeyan Periyasamy .elem_len = 1, 57953a65445SKarthikeyan Periyasamy .elem_size = sizeof(u32), 58053a65445SKarthikeyan Periyasamy .array_type = NO_ARRAY, 58153a65445SKarthikeyan Periyasamy .tlv_type = 0x11, 58253a65445SKarthikeyan Periyasamy .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01, 58353a65445SKarthikeyan Periyasamy board_id), 58453a65445SKarthikeyan Periyasamy }, 58553a65445SKarthikeyan Periyasamy { 586ae6ec4a3SRaj Kumar Bhagat .data_type = QMI_OPT_FLAG, 587ae6ec4a3SRaj Kumar Bhagat .elem_len = 1, 588ae6ec4a3SRaj Kumar Bhagat .elem_size = sizeof(u8), 589ae6ec4a3SRaj Kumar Bhagat .array_type = NO_ARRAY, 590ae6ec4a3SRaj Kumar Bhagat .tlv_type = 0x13, 591ae6ec4a3SRaj Kumar Bhagat .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01, 592ae6ec4a3SRaj Kumar Bhagat single_chip_mlo_support_valid), 593ae6ec4a3SRaj Kumar Bhagat }, 594ae6ec4a3SRaj Kumar Bhagat { 595ae6ec4a3SRaj Kumar Bhagat .data_type = QMI_UNSIGNED_1_BYTE, 596ae6ec4a3SRaj Kumar Bhagat .elem_len = 1, 597ae6ec4a3SRaj Kumar Bhagat .elem_size = sizeof(u8), 598ae6ec4a3SRaj Kumar Bhagat .array_type = NO_ARRAY, 599ae6ec4a3SRaj Kumar Bhagat .tlv_type = 0x13, 600ae6ec4a3SRaj Kumar Bhagat .offset = offsetof(struct qmi_wlanfw_phy_cap_resp_msg_v01, 601ae6ec4a3SRaj Kumar Bhagat single_chip_mlo_support), 602ae6ec4a3SRaj Kumar Bhagat }, 603ae6ec4a3SRaj Kumar Bhagat { 60453a65445SKarthikeyan Periyasamy .data_type = QMI_EOTI, 60553a65445SKarthikeyan Periyasamy .array_type = NO_ARRAY, 60653a65445SKarthikeyan Periyasamy .tlv_type = QMI_COMMON_TLV_TYPE, 60753a65445SKarthikeyan Periyasamy }, 60853a65445SKarthikeyan Periyasamy }; 60953a65445SKarthikeyan Periyasamy 610e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_ind_register_req_msg_v01_ei[] = { 611d8899132SKalle Valo { 612d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 613d8899132SKalle Valo .elem_len = 1, 614d8899132SKalle Valo .elem_size = sizeof(u8), 615d8899132SKalle Valo .array_type = NO_ARRAY, 616d8899132SKalle Valo .tlv_type = 0x10, 617d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 618d8899132SKalle Valo fw_ready_enable_valid), 619d8899132SKalle Valo }, 620d8899132SKalle Valo { 621d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 622d8899132SKalle Valo .elem_len = 1, 623d8899132SKalle Valo .elem_size = sizeof(u8), 624d8899132SKalle Valo .array_type = NO_ARRAY, 625d8899132SKalle Valo .tlv_type = 0x10, 626d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 627d8899132SKalle Valo fw_ready_enable), 628d8899132SKalle Valo }, 629d8899132SKalle Valo { 630d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 631d8899132SKalle Valo .elem_len = 1, 632d8899132SKalle Valo .elem_size = sizeof(u8), 633d8899132SKalle Valo .array_type = NO_ARRAY, 634d8899132SKalle Valo .tlv_type = 0x11, 635d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 636d8899132SKalle Valo initiate_cal_download_enable_valid), 637d8899132SKalle Valo }, 638d8899132SKalle Valo { 639d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 640d8899132SKalle Valo .elem_len = 1, 641d8899132SKalle Valo .elem_size = sizeof(u8), 642d8899132SKalle Valo .array_type = NO_ARRAY, 643d8899132SKalle Valo .tlv_type = 0x11, 644d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 645d8899132SKalle Valo initiate_cal_download_enable), 646d8899132SKalle Valo }, 647d8899132SKalle Valo { 648d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 649d8899132SKalle Valo .elem_len = 1, 650d8899132SKalle Valo .elem_size = sizeof(u8), 651d8899132SKalle Valo .array_type = NO_ARRAY, 652d8899132SKalle Valo .tlv_type = 0x12, 653d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 654d8899132SKalle Valo initiate_cal_update_enable_valid), 655d8899132SKalle Valo }, 656d8899132SKalle Valo { 657d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 658d8899132SKalle Valo .elem_len = 1, 659d8899132SKalle Valo .elem_size = sizeof(u8), 660d8899132SKalle Valo .array_type = NO_ARRAY, 661d8899132SKalle Valo .tlv_type = 0x12, 662d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 663d8899132SKalle Valo initiate_cal_update_enable), 664d8899132SKalle Valo }, 665d8899132SKalle Valo { 666d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 667d8899132SKalle Valo .elem_len = 1, 668d8899132SKalle Valo .elem_size = sizeof(u8), 669d8899132SKalle Valo .array_type = NO_ARRAY, 670d8899132SKalle Valo .tlv_type = 0x13, 671d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 672d8899132SKalle Valo msa_ready_enable_valid), 673d8899132SKalle Valo }, 674d8899132SKalle Valo { 675d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 676d8899132SKalle Valo .elem_len = 1, 677d8899132SKalle Valo .elem_size = sizeof(u8), 678d8899132SKalle Valo .array_type = NO_ARRAY, 679d8899132SKalle Valo .tlv_type = 0x13, 680d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 681d8899132SKalle Valo msa_ready_enable), 682d8899132SKalle Valo }, 683d8899132SKalle Valo { 684d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 685d8899132SKalle Valo .elem_len = 1, 686d8899132SKalle Valo .elem_size = sizeof(u8), 687d8899132SKalle Valo .array_type = NO_ARRAY, 688d8899132SKalle Valo .tlv_type = 0x14, 689d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 690d8899132SKalle Valo pin_connect_result_enable_valid), 691d8899132SKalle Valo }, 692d8899132SKalle Valo { 693d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 694d8899132SKalle Valo .elem_len = 1, 695d8899132SKalle Valo .elem_size = sizeof(u8), 696d8899132SKalle Valo .array_type = NO_ARRAY, 697d8899132SKalle Valo .tlv_type = 0x14, 698d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 699d8899132SKalle Valo pin_connect_result_enable), 700d8899132SKalle Valo }, 701d8899132SKalle Valo { 702d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 703d8899132SKalle Valo .elem_len = 1, 704d8899132SKalle Valo .elem_size = sizeof(u8), 705d8899132SKalle Valo .array_type = NO_ARRAY, 706d8899132SKalle Valo .tlv_type = 0x15, 707d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 708d8899132SKalle Valo client_id_valid), 709d8899132SKalle Valo }, 710d8899132SKalle Valo { 711d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 712d8899132SKalle Valo .elem_len = 1, 713d8899132SKalle Valo .elem_size = sizeof(u32), 714d8899132SKalle Valo .array_type = NO_ARRAY, 715d8899132SKalle Valo .tlv_type = 0x15, 716d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 717d8899132SKalle Valo client_id), 718d8899132SKalle Valo }, 719d8899132SKalle Valo { 720d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 721d8899132SKalle Valo .elem_len = 1, 722d8899132SKalle Valo .elem_size = sizeof(u8), 723d8899132SKalle Valo .array_type = NO_ARRAY, 724d8899132SKalle Valo .tlv_type = 0x16, 725d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 726d8899132SKalle Valo request_mem_enable_valid), 727d8899132SKalle Valo }, 728d8899132SKalle Valo { 729d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 730d8899132SKalle Valo .elem_len = 1, 731d8899132SKalle Valo .elem_size = sizeof(u8), 732d8899132SKalle Valo .array_type = NO_ARRAY, 733d8899132SKalle Valo .tlv_type = 0x16, 734d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 735d8899132SKalle Valo request_mem_enable), 736d8899132SKalle Valo }, 737d8899132SKalle Valo { 738d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 739d8899132SKalle Valo .elem_len = 1, 740d8899132SKalle Valo .elem_size = sizeof(u8), 741d8899132SKalle Valo .array_type = NO_ARRAY, 742d8899132SKalle Valo .tlv_type = 0x17, 743d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 744d8899132SKalle Valo fw_mem_ready_enable_valid), 745d8899132SKalle Valo }, 746d8899132SKalle Valo { 747d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 748d8899132SKalle Valo .elem_len = 1, 749d8899132SKalle Valo .elem_size = sizeof(u8), 750d8899132SKalle Valo .array_type = NO_ARRAY, 751d8899132SKalle Valo .tlv_type = 0x17, 752d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 753d8899132SKalle Valo fw_mem_ready_enable), 754d8899132SKalle Valo }, 755d8899132SKalle Valo { 756d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 757d8899132SKalle Valo .elem_len = 1, 758d8899132SKalle Valo .elem_size = sizeof(u8), 759d8899132SKalle Valo .array_type = NO_ARRAY, 760d8899132SKalle Valo .tlv_type = 0x18, 761d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 762d8899132SKalle Valo fw_init_done_enable_valid), 763d8899132SKalle Valo }, 764d8899132SKalle Valo { 765d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 766d8899132SKalle Valo .elem_len = 1, 767d8899132SKalle Valo .elem_size = sizeof(u8), 768d8899132SKalle Valo .array_type = NO_ARRAY, 769d8899132SKalle Valo .tlv_type = 0x18, 770d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 771d8899132SKalle Valo fw_init_done_enable), 772d8899132SKalle Valo }, 773d8899132SKalle Valo 774d8899132SKalle Valo { 775d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 776d8899132SKalle Valo .elem_len = 1, 777d8899132SKalle Valo .elem_size = sizeof(u8), 778d8899132SKalle Valo .array_type = NO_ARRAY, 779d8899132SKalle Valo .tlv_type = 0x19, 780d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 781d8899132SKalle Valo rejuvenate_enable_valid), 782d8899132SKalle Valo }, 783d8899132SKalle Valo { 784d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 785d8899132SKalle Valo .elem_len = 1, 786d8899132SKalle Valo .elem_size = sizeof(u8), 787d8899132SKalle Valo .array_type = NO_ARRAY, 788d8899132SKalle Valo .tlv_type = 0x19, 789d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 790d8899132SKalle Valo rejuvenate_enable), 791d8899132SKalle Valo }, 792d8899132SKalle Valo { 793d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 794d8899132SKalle Valo .elem_len = 1, 795d8899132SKalle Valo .elem_size = sizeof(u8), 796d8899132SKalle Valo .array_type = NO_ARRAY, 797d8899132SKalle Valo .tlv_type = 0x1A, 798d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 799d8899132SKalle Valo xo_cal_enable_valid), 800d8899132SKalle Valo }, 801d8899132SKalle Valo { 802d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 803d8899132SKalle Valo .elem_len = 1, 804d8899132SKalle Valo .elem_size = sizeof(u8), 805d8899132SKalle Valo .array_type = NO_ARRAY, 806d8899132SKalle Valo .tlv_type = 0x1A, 807d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 808d8899132SKalle Valo xo_cal_enable), 809d8899132SKalle Valo }, 810d8899132SKalle Valo { 811d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 812d8899132SKalle Valo .elem_len = 1, 813d8899132SKalle Valo .elem_size = sizeof(u8), 814d8899132SKalle Valo .array_type = NO_ARRAY, 815d8899132SKalle Valo .tlv_type = 0x1B, 816d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 817d8899132SKalle Valo cal_done_enable_valid), 818d8899132SKalle Valo }, 819d8899132SKalle Valo { 820d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 821d8899132SKalle Valo .elem_len = 1, 822d8899132SKalle Valo .elem_size = sizeof(u8), 823d8899132SKalle Valo .array_type = NO_ARRAY, 824d8899132SKalle Valo .tlv_type = 0x1B, 825d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_req_msg_v01, 826d8899132SKalle Valo cal_done_enable), 827d8899132SKalle Valo }, 828d8899132SKalle Valo { 829d8899132SKalle Valo .data_type = QMI_EOTI, 830d8899132SKalle Valo .array_type = NO_ARRAY, 831d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 832d8899132SKalle Valo }, 833d8899132SKalle Valo }; 834d8899132SKalle Valo 835e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_ind_register_resp_msg_v01_ei[] = { 836d8899132SKalle Valo { 837d8899132SKalle Valo .data_type = QMI_STRUCT, 838d8899132SKalle Valo .elem_len = 1, 839d8899132SKalle Valo .elem_size = sizeof(struct qmi_response_type_v01), 840d8899132SKalle Valo .array_type = NO_ARRAY, 841d8899132SKalle Valo .tlv_type = 0x02, 842d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 843d8899132SKalle Valo resp), 844d8899132SKalle Valo .ei_array = qmi_response_type_v01_ei, 845d8899132SKalle Valo }, 846d8899132SKalle Valo { 847d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 848d8899132SKalle Valo .elem_len = 1, 849d8899132SKalle Valo .elem_size = sizeof(u8), 850d8899132SKalle Valo .array_type = NO_ARRAY, 851d8899132SKalle Valo .tlv_type = 0x10, 852d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 853d8899132SKalle Valo fw_status_valid), 854d8899132SKalle Valo }, 855d8899132SKalle Valo { 856d8899132SKalle Valo .data_type = QMI_UNSIGNED_8_BYTE, 857d8899132SKalle Valo .elem_len = 1, 858d8899132SKalle Valo .elem_size = sizeof(u64), 859d8899132SKalle Valo .array_type = NO_ARRAY, 860d8899132SKalle Valo .tlv_type = 0x10, 861d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ind_register_resp_msg_v01, 862d8899132SKalle Valo fw_status), 863d8899132SKalle Valo }, 864d8899132SKalle Valo { 865d8899132SKalle Valo .data_type = QMI_EOTI, 866d8899132SKalle Valo .array_type = NO_ARRAY, 867d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 868d8899132SKalle Valo }, 869d8899132SKalle Valo }; 870d8899132SKalle Valo 871e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_mem_cfg_s_v01_ei[] = { 872d8899132SKalle Valo { 873d8899132SKalle Valo .data_type = QMI_UNSIGNED_8_BYTE, 874d8899132SKalle Valo .elem_len = 1, 875d8899132SKalle Valo .elem_size = sizeof(u64), 876d8899132SKalle Valo .array_type = NO_ARRAY, 877d8899132SKalle Valo .tlv_type = 0, 878d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, offset), 879d8899132SKalle Valo }, 880d8899132SKalle Valo { 881d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 882d8899132SKalle Valo .elem_len = 1, 883d8899132SKalle Valo .elem_size = sizeof(u32), 884d8899132SKalle Valo .array_type = NO_ARRAY, 885d8899132SKalle Valo .tlv_type = 0, 886d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, size), 887d8899132SKalle Valo }, 888d8899132SKalle Valo { 889d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 890d8899132SKalle Valo .elem_len = 1, 891d8899132SKalle Valo .elem_size = sizeof(u8), 892d8899132SKalle Valo .array_type = NO_ARRAY, 893d8899132SKalle Valo .tlv_type = 0, 894d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_cfg_s_v01, secure_flag), 895d8899132SKalle Valo }, 896d8899132SKalle Valo { 897d8899132SKalle Valo .data_type = QMI_EOTI, 898d8899132SKalle Valo .array_type = NO_ARRAY, 899d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 900d8899132SKalle Valo }, 901d8899132SKalle Valo }; 902d8899132SKalle Valo 903e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_mem_seg_s_v01_ei[] = { 904d8899132SKalle Valo { 905d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 906d8899132SKalle Valo .elem_len = 1, 907d8899132SKalle Valo .elem_size = sizeof(u32), 908d8899132SKalle Valo .array_type = NO_ARRAY, 909d8899132SKalle Valo .tlv_type = 0, 910d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, 911d8899132SKalle Valo size), 912d8899132SKalle Valo }, 913d8899132SKalle Valo { 914d8899132SKalle Valo .data_type = QMI_SIGNED_4_BYTE_ENUM, 915d8899132SKalle Valo .elem_len = 1, 916d8899132SKalle Valo .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01), 917d8899132SKalle Valo .array_type = NO_ARRAY, 918d8899132SKalle Valo .tlv_type = 0, 919d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, type), 920d8899132SKalle Valo }, 921d8899132SKalle Valo { 922d8899132SKalle Valo .data_type = QMI_DATA_LEN, 923d8899132SKalle Valo .elem_len = 1, 924d8899132SKalle Valo .elem_size = sizeof(u8), 925d8899132SKalle Valo .array_type = NO_ARRAY, 926d8899132SKalle Valo .tlv_type = 0, 927d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg_len), 928d8899132SKalle Valo }, 929d8899132SKalle Valo { 930d8899132SKalle Valo .data_type = QMI_STRUCT, 931d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_NUM_MEM_CFG_V01, 932d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_mem_cfg_s_v01), 933d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 934d8899132SKalle Valo .tlv_type = 0, 935d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_seg_s_v01, mem_cfg), 936d8899132SKalle Valo .ei_array = qmi_wlanfw_mem_cfg_s_v01_ei, 937d8899132SKalle Valo }, 938d8899132SKalle Valo { 939d8899132SKalle Valo .data_type = QMI_EOTI, 940d8899132SKalle Valo .array_type = NO_ARRAY, 941d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 942d8899132SKalle Valo }, 943d8899132SKalle Valo }; 944d8899132SKalle Valo 945e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_request_mem_ind_msg_v01_ei[] = { 946d8899132SKalle Valo { 947d8899132SKalle Valo .data_type = QMI_DATA_LEN, 948d8899132SKalle Valo .elem_len = 1, 949d8899132SKalle Valo .elem_size = sizeof(u8), 950d8899132SKalle Valo .array_type = NO_ARRAY, 951d8899132SKalle Valo .tlv_type = 0x01, 952d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01, 953d8899132SKalle Valo mem_seg_len), 954d8899132SKalle Valo }, 955d8899132SKalle Valo { 956d8899132SKalle Valo .data_type = QMI_STRUCT, 957d8899132SKalle Valo .elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01, 958d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_mem_seg_s_v01), 959d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 960d8899132SKalle Valo .tlv_type = 0x01, 961d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_request_mem_ind_msg_v01, 962d8899132SKalle Valo mem_seg), 963d8899132SKalle Valo .ei_array = qmi_wlanfw_mem_seg_s_v01_ei, 964d8899132SKalle Valo }, 965d8899132SKalle Valo { 966d8899132SKalle Valo .data_type = QMI_EOTI, 967d8899132SKalle Valo .array_type = NO_ARRAY, 968d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 969d8899132SKalle Valo }, 970d8899132SKalle Valo }; 971d8899132SKalle Valo 972e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_mem_seg_resp_s_v01_ei[] = { 973d8899132SKalle Valo { 974d8899132SKalle Valo .data_type = QMI_UNSIGNED_8_BYTE, 975d8899132SKalle Valo .elem_len = 1, 976d8899132SKalle Valo .elem_size = sizeof(u64), 977d8899132SKalle Valo .array_type = NO_ARRAY, 978d8899132SKalle Valo .tlv_type = 0, 979d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, addr), 980d8899132SKalle Valo }, 981d8899132SKalle Valo { 982d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 983d8899132SKalle Valo .elem_len = 1, 984d8899132SKalle Valo .elem_size = sizeof(u32), 985d8899132SKalle Valo .array_type = NO_ARRAY, 986d8899132SKalle Valo .tlv_type = 0, 987d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, size), 988d8899132SKalle Valo }, 989d8899132SKalle Valo { 990d8899132SKalle Valo .data_type = QMI_SIGNED_4_BYTE_ENUM, 991d8899132SKalle Valo .elem_len = 1, 992d8899132SKalle Valo .elem_size = sizeof(enum qmi_wlanfw_mem_type_enum_v01), 993d8899132SKalle Valo .array_type = NO_ARRAY, 994d8899132SKalle Valo .tlv_type = 0, 995d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, type), 996d8899132SKalle Valo }, 997d8899132SKalle Valo { 998d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 999d8899132SKalle Valo .elem_len = 1, 1000d8899132SKalle Valo .elem_size = sizeof(u8), 1001d8899132SKalle Valo .array_type = NO_ARRAY, 1002d8899132SKalle Valo .tlv_type = 0, 1003d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_mem_seg_resp_s_v01, restore), 1004d8899132SKalle Valo }, 1005d8899132SKalle Valo { 1006d8899132SKalle Valo .data_type = QMI_EOTI, 1007d8899132SKalle Valo .array_type = NO_ARRAY, 1008d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1009d8899132SKalle Valo }, 1010d8899132SKalle Valo }; 1011d8899132SKalle Valo 1012e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_respond_mem_req_msg_v01_ei[] = { 1013d8899132SKalle Valo { 1014d8899132SKalle Valo .data_type = QMI_DATA_LEN, 1015d8899132SKalle Valo .elem_len = 1, 1016d8899132SKalle Valo .elem_size = sizeof(u8), 1017d8899132SKalle Valo .array_type = NO_ARRAY, 1018d8899132SKalle Valo .tlv_type = 0x01, 1019d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01, 1020d8899132SKalle Valo mem_seg_len), 1021d8899132SKalle Valo }, 1022d8899132SKalle Valo { 1023d8899132SKalle Valo .data_type = QMI_STRUCT, 1024d8899132SKalle Valo .elem_len = ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01, 1025d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_mem_seg_resp_s_v01), 1026d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 1027d8899132SKalle Valo .tlv_type = 0x01, 1028d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_respond_mem_req_msg_v01, 1029d8899132SKalle Valo mem_seg), 1030d8899132SKalle Valo .ei_array = qmi_wlanfw_mem_seg_resp_s_v01_ei, 1031d8899132SKalle Valo }, 1032d8899132SKalle Valo { 1033d8899132SKalle Valo .data_type = QMI_EOTI, 1034d8899132SKalle Valo .array_type = NO_ARRAY, 1035d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1036d8899132SKalle Valo }, 1037d8899132SKalle Valo }; 1038d8899132SKalle Valo 1039e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_respond_mem_resp_msg_v01_ei[] = { 1040d8899132SKalle Valo { 1041d8899132SKalle Valo .data_type = QMI_STRUCT, 1042d8899132SKalle Valo .elem_len = 1, 1043d8899132SKalle Valo .elem_size = sizeof(struct qmi_response_type_v01), 1044d8899132SKalle Valo .array_type = NO_ARRAY, 1045d8899132SKalle Valo .tlv_type = 0x02, 1046d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_respond_mem_resp_msg_v01, 1047d8899132SKalle Valo resp), 1048d8899132SKalle Valo .ei_array = qmi_response_type_v01_ei, 1049d8899132SKalle Valo }, 1050d8899132SKalle Valo { 1051d8899132SKalle Valo .data_type = QMI_EOTI, 1052d8899132SKalle Valo .array_type = NO_ARRAY, 1053d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1054d8899132SKalle Valo }, 1055d8899132SKalle Valo }; 1056d8899132SKalle Valo 1057e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_cap_req_msg_v01_ei[] = { 1058d8899132SKalle Valo { 1059d8899132SKalle Valo .data_type = QMI_EOTI, 1060d8899132SKalle Valo .array_type = NO_ARRAY, 1061d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1062d8899132SKalle Valo }, 1063d8899132SKalle Valo }; 1064d8899132SKalle Valo 1065e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_rf_chip_info_s_v01_ei[] = { 1066d8899132SKalle Valo { 1067d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1068d8899132SKalle Valo .elem_len = 1, 1069d8899132SKalle Valo .elem_size = sizeof(u32), 1070d8899132SKalle Valo .array_type = NO_ARRAY, 1071d8899132SKalle Valo .tlv_type = 0, 1072d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01, 1073d8899132SKalle Valo chip_id), 1074d8899132SKalle Valo }, 1075d8899132SKalle Valo { 1076d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1077d8899132SKalle Valo .elem_len = 1, 1078d8899132SKalle Valo .elem_size = sizeof(u32), 1079d8899132SKalle Valo .array_type = NO_ARRAY, 1080d8899132SKalle Valo .tlv_type = 0, 1081d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_rf_chip_info_s_v01, 1082d8899132SKalle Valo chip_family), 1083d8899132SKalle Valo }, 1084d8899132SKalle Valo { 1085d8899132SKalle Valo .data_type = QMI_EOTI, 1086d8899132SKalle Valo .array_type = NO_ARRAY, 1087d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1088d8899132SKalle Valo }, 1089d8899132SKalle Valo }; 1090d8899132SKalle Valo 1091e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_rf_board_info_s_v01_ei[] = { 1092d8899132SKalle Valo { 1093d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1094d8899132SKalle Valo .elem_len = 1, 1095d8899132SKalle Valo .elem_size = sizeof(u32), 1096d8899132SKalle Valo .array_type = NO_ARRAY, 1097d8899132SKalle Valo .tlv_type = 0, 1098d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_rf_board_info_s_v01, 1099d8899132SKalle Valo board_id), 1100d8899132SKalle Valo }, 1101d8899132SKalle Valo { 1102d8899132SKalle Valo .data_type = QMI_EOTI, 1103d8899132SKalle Valo .array_type = NO_ARRAY, 1104d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1105d8899132SKalle Valo }, 1106d8899132SKalle Valo }; 1107d8899132SKalle Valo 1108e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_soc_info_s_v01_ei[] = { 1109d8899132SKalle Valo { 1110d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1111d8899132SKalle Valo .elem_len = 1, 1112d8899132SKalle Valo .elem_size = sizeof(u32), 1113d8899132SKalle Valo .array_type = NO_ARRAY, 1114d8899132SKalle Valo .tlv_type = 0, 1115d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_soc_info_s_v01, soc_id), 1116d8899132SKalle Valo }, 1117d8899132SKalle Valo { 1118d8899132SKalle Valo .data_type = QMI_EOTI, 1119d8899132SKalle Valo .array_type = NO_ARRAY, 1120d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1121d8899132SKalle Valo }, 1122d8899132SKalle Valo }; 1123d8899132SKalle Valo 1124e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_dev_mem_info_s_v01_ei[] = { 1125d8899132SKalle Valo { 1126d8899132SKalle Valo .data_type = QMI_UNSIGNED_8_BYTE, 1127d8899132SKalle Valo .elem_len = 1, 1128d8899132SKalle Valo .elem_size = sizeof(u64), 1129d8899132SKalle Valo .array_type = NO_ARRAY, 1130d8899132SKalle Valo .tlv_type = 0, 1131d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01, 1132d8899132SKalle Valo start), 1133d8899132SKalle Valo }, 1134d8899132SKalle Valo { 1135d8899132SKalle Valo .data_type = QMI_UNSIGNED_8_BYTE, 1136d8899132SKalle Valo .elem_len = 1, 1137d8899132SKalle Valo .elem_size = sizeof(u64), 1138d8899132SKalle Valo .array_type = NO_ARRAY, 1139d8899132SKalle Valo .tlv_type = 0, 1140d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_dev_mem_info_s_v01, 1141d8899132SKalle Valo size), 1142d8899132SKalle Valo }, 1143d8899132SKalle Valo { 1144d8899132SKalle Valo .data_type = QMI_EOTI, 1145d8899132SKalle Valo .array_type = NO_ARRAY, 1146d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1147d8899132SKalle Valo }, 1148d8899132SKalle Valo }; 1149d8899132SKalle Valo 1150e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_fw_version_info_s_v01_ei[] = { 1151d8899132SKalle Valo { 1152d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1153d8899132SKalle Valo .elem_len = 1, 1154d8899132SKalle Valo .elem_size = sizeof(u32), 1155d8899132SKalle Valo .array_type = NO_ARRAY, 1156d8899132SKalle Valo .tlv_type = 0, 1157d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01, 1158d8899132SKalle Valo fw_version), 1159d8899132SKalle Valo }, 1160d8899132SKalle Valo { 1161d8899132SKalle Valo .data_type = QMI_STRING, 1162d8899132SKalle Valo .elem_len = ATH12K_QMI_WLANFW_MAX_TIMESTAMP_LEN_V01 + 1, 1163d8899132SKalle Valo .elem_size = sizeof(char), 1164d8899132SKalle Valo .array_type = NO_ARRAY, 1165d8899132SKalle Valo .tlv_type = 0, 1166d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_fw_version_info_s_v01, 1167d8899132SKalle Valo fw_build_timestamp), 1168d8899132SKalle Valo }, 1169d8899132SKalle Valo { 1170d8899132SKalle Valo .data_type = QMI_EOTI, 1171d8899132SKalle Valo .array_type = NO_ARRAY, 1172d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1173d8899132SKalle Valo }, 1174d8899132SKalle Valo }; 1175d8899132SKalle Valo 1176e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_cap_resp_msg_v01_ei[] = { 1177d8899132SKalle Valo { 1178d8899132SKalle Valo .data_type = QMI_STRUCT, 1179d8899132SKalle Valo .elem_len = 1, 1180d8899132SKalle Valo .elem_size = sizeof(struct qmi_response_type_v01), 1181d8899132SKalle Valo .array_type = NO_ARRAY, 1182d8899132SKalle Valo .tlv_type = 0x02, 1183d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, resp), 1184d8899132SKalle Valo .ei_array = qmi_response_type_v01_ei, 1185d8899132SKalle Valo }, 1186d8899132SKalle Valo { 1187d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1188d8899132SKalle Valo .elem_len = 1, 1189d8899132SKalle Valo .elem_size = sizeof(u8), 1190d8899132SKalle Valo .array_type = NO_ARRAY, 1191d8899132SKalle Valo .tlv_type = 0x10, 1192d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1193d8899132SKalle Valo chip_info_valid), 1194d8899132SKalle Valo }, 1195d8899132SKalle Valo { 1196d8899132SKalle Valo .data_type = QMI_STRUCT, 1197d8899132SKalle Valo .elem_len = 1, 1198d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_rf_chip_info_s_v01), 1199d8899132SKalle Valo .array_type = NO_ARRAY, 1200d8899132SKalle Valo .tlv_type = 0x10, 1201d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1202d8899132SKalle Valo chip_info), 1203d8899132SKalle Valo .ei_array = qmi_wlanfw_rf_chip_info_s_v01_ei, 1204d8899132SKalle Valo }, 1205d8899132SKalle Valo { 1206d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1207d8899132SKalle Valo .elem_len = 1, 1208d8899132SKalle Valo .elem_size = sizeof(u8), 1209d8899132SKalle Valo .array_type = NO_ARRAY, 1210d8899132SKalle Valo .tlv_type = 0x11, 1211d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1212d8899132SKalle Valo board_info_valid), 1213d8899132SKalle Valo }, 1214d8899132SKalle Valo { 1215d8899132SKalle Valo .data_type = QMI_STRUCT, 1216d8899132SKalle Valo .elem_len = 1, 1217d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_rf_board_info_s_v01), 1218d8899132SKalle Valo .array_type = NO_ARRAY, 1219d8899132SKalle Valo .tlv_type = 0x11, 1220d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1221d8899132SKalle Valo board_info), 1222d8899132SKalle Valo .ei_array = qmi_wlanfw_rf_board_info_s_v01_ei, 1223d8899132SKalle Valo }, 1224d8899132SKalle Valo { 1225d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1226d8899132SKalle Valo .elem_len = 1, 1227d8899132SKalle Valo .elem_size = sizeof(u8), 1228d8899132SKalle Valo .array_type = NO_ARRAY, 1229d8899132SKalle Valo .tlv_type = 0x12, 1230d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1231d8899132SKalle Valo soc_info_valid), 1232d8899132SKalle Valo }, 1233d8899132SKalle Valo { 1234d8899132SKalle Valo .data_type = QMI_STRUCT, 1235d8899132SKalle Valo .elem_len = 1, 1236d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_soc_info_s_v01), 1237d8899132SKalle Valo .array_type = NO_ARRAY, 1238d8899132SKalle Valo .tlv_type = 0x12, 1239d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1240d8899132SKalle Valo soc_info), 1241d8899132SKalle Valo .ei_array = qmi_wlanfw_soc_info_s_v01_ei, 1242d8899132SKalle Valo }, 1243d8899132SKalle Valo { 1244d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1245d8899132SKalle Valo .elem_len = 1, 1246d8899132SKalle Valo .elem_size = sizeof(u8), 1247d8899132SKalle Valo .array_type = NO_ARRAY, 1248d8899132SKalle Valo .tlv_type = 0x13, 1249d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1250d8899132SKalle Valo fw_version_info_valid), 1251d8899132SKalle Valo }, 1252d8899132SKalle Valo { 1253d8899132SKalle Valo .data_type = QMI_STRUCT, 1254d8899132SKalle Valo .elem_len = 1, 1255d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_fw_version_info_s_v01), 1256d8899132SKalle Valo .array_type = NO_ARRAY, 1257d8899132SKalle Valo .tlv_type = 0x13, 1258d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1259d8899132SKalle Valo fw_version_info), 1260d8899132SKalle Valo .ei_array = qmi_wlanfw_fw_version_info_s_v01_ei, 1261d8899132SKalle Valo }, 1262d8899132SKalle Valo { 1263d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1264d8899132SKalle Valo .elem_len = 1, 1265d8899132SKalle Valo .elem_size = sizeof(u8), 1266d8899132SKalle Valo .array_type = NO_ARRAY, 1267d8899132SKalle Valo .tlv_type = 0x14, 1268d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1269d8899132SKalle Valo fw_build_id_valid), 1270d8899132SKalle Valo }, 1271d8899132SKalle Valo { 1272d8899132SKalle Valo .data_type = QMI_STRING, 1273d8899132SKalle Valo .elem_len = ATH12K_QMI_WLANFW_MAX_BUILD_ID_LEN_V01 + 1, 1274d8899132SKalle Valo .elem_size = sizeof(char), 1275d8899132SKalle Valo .array_type = NO_ARRAY, 1276d8899132SKalle Valo .tlv_type = 0x14, 1277d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1278d8899132SKalle Valo fw_build_id), 1279d8899132SKalle Valo }, 1280d8899132SKalle Valo { 1281d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1282d8899132SKalle Valo .elem_len = 1, 1283d8899132SKalle Valo .elem_size = sizeof(u8), 1284d8899132SKalle Valo .array_type = NO_ARRAY, 1285d8899132SKalle Valo .tlv_type = 0x15, 1286d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1287d8899132SKalle Valo num_macs_valid), 1288d8899132SKalle Valo }, 1289d8899132SKalle Valo { 1290d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 1291d8899132SKalle Valo .elem_len = 1, 1292d8899132SKalle Valo .elem_size = sizeof(u8), 1293d8899132SKalle Valo .array_type = NO_ARRAY, 1294d8899132SKalle Valo .tlv_type = 0x15, 1295d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1296d8899132SKalle Valo num_macs), 1297d8899132SKalle Valo }, 1298d8899132SKalle Valo { 1299d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1300d8899132SKalle Valo .elem_len = 1, 1301d8899132SKalle Valo .elem_size = sizeof(u8), 1302d8899132SKalle Valo .array_type = NO_ARRAY, 1303d8899132SKalle Valo .tlv_type = 0x16, 1304d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1305d8899132SKalle Valo voltage_mv_valid), 1306d8899132SKalle Valo }, 1307d8899132SKalle Valo { 1308d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1309d8899132SKalle Valo .elem_len = 1, 1310d8899132SKalle Valo .elem_size = sizeof(u32), 1311d8899132SKalle Valo .array_type = NO_ARRAY, 1312d8899132SKalle Valo .tlv_type = 0x16, 1313d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1314d8899132SKalle Valo voltage_mv), 1315d8899132SKalle Valo }, 1316d8899132SKalle Valo { 1317d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1318d8899132SKalle Valo .elem_len = 1, 1319d8899132SKalle Valo .elem_size = sizeof(u8), 1320d8899132SKalle Valo .array_type = NO_ARRAY, 1321d8899132SKalle Valo .tlv_type = 0x17, 1322d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1323d8899132SKalle Valo time_freq_hz_valid), 1324d8899132SKalle Valo }, 1325d8899132SKalle Valo { 1326d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1327d8899132SKalle Valo .elem_len = 1, 1328d8899132SKalle Valo .elem_size = sizeof(u32), 1329d8899132SKalle Valo .array_type = NO_ARRAY, 1330d8899132SKalle Valo .tlv_type = 0x17, 1331d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1332d8899132SKalle Valo time_freq_hz), 1333d8899132SKalle Valo }, 1334d8899132SKalle Valo { 1335d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1336d8899132SKalle Valo .elem_len = 1, 1337d8899132SKalle Valo .elem_size = sizeof(u8), 1338d8899132SKalle Valo .array_type = NO_ARRAY, 1339d8899132SKalle Valo .tlv_type = 0x18, 1340d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1341d8899132SKalle Valo otp_version_valid), 1342d8899132SKalle Valo }, 1343d8899132SKalle Valo { 1344d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1345d8899132SKalle Valo .elem_len = 1, 1346d8899132SKalle Valo .elem_size = sizeof(u32), 1347d8899132SKalle Valo .array_type = NO_ARRAY, 1348d8899132SKalle Valo .tlv_type = 0x18, 1349d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1350d8899132SKalle Valo otp_version), 1351d8899132SKalle Valo }, 1352d8899132SKalle Valo { 1353d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1354d8899132SKalle Valo .elem_len = 1, 1355d8899132SKalle Valo .elem_size = sizeof(u8), 1356d8899132SKalle Valo .array_type = NO_ARRAY, 1357d8899132SKalle Valo .tlv_type = 0x19, 1358d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1359d8899132SKalle Valo eeprom_caldata_read_timeout_valid), 1360d8899132SKalle Valo }, 1361d8899132SKalle Valo { 1362d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1363d8899132SKalle Valo .elem_len = 1, 1364d8899132SKalle Valo .elem_size = sizeof(u32), 1365d8899132SKalle Valo .array_type = NO_ARRAY, 1366d8899132SKalle Valo .tlv_type = 0x19, 1367d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1368d8899132SKalle Valo eeprom_caldata_read_timeout), 1369d8899132SKalle Valo }, 1370d8899132SKalle Valo { 1371d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1372d8899132SKalle Valo .elem_len = 1, 1373d8899132SKalle Valo .elem_size = sizeof(u8), 1374d8899132SKalle Valo .array_type = NO_ARRAY, 1375d8899132SKalle Valo .tlv_type = 0x1A, 1376d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1377d8899132SKalle Valo fw_caps_valid), 1378d8899132SKalle Valo }, 1379d8899132SKalle Valo { 1380d8899132SKalle Valo .data_type = QMI_UNSIGNED_8_BYTE, 1381d8899132SKalle Valo .elem_len = 1, 1382d8899132SKalle Valo .elem_size = sizeof(u64), 1383d8899132SKalle Valo .array_type = NO_ARRAY, 1384d8899132SKalle Valo .tlv_type = 0x1A, 1385d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, fw_caps), 1386d8899132SKalle Valo }, 1387d8899132SKalle Valo { 1388d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1389d8899132SKalle Valo .elem_len = 1, 1390d8899132SKalle Valo .elem_size = sizeof(u8), 1391d8899132SKalle Valo .array_type = NO_ARRAY, 1392d8899132SKalle Valo .tlv_type = 0x1B, 1393d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1394d8899132SKalle Valo rd_card_chain_cap_valid), 1395d8899132SKalle Valo }, 1396d8899132SKalle Valo { 1397d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1398d8899132SKalle Valo .elem_len = 1, 1399d8899132SKalle Valo .elem_size = sizeof(u32), 1400d8899132SKalle Valo .array_type = NO_ARRAY, 1401d8899132SKalle Valo .tlv_type = 0x1B, 1402d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1403d8899132SKalle Valo rd_card_chain_cap), 1404d8899132SKalle Valo }, 1405d8899132SKalle Valo { 1406d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1407d8899132SKalle Valo .elem_len = 1, 1408d8899132SKalle Valo .elem_size = sizeof(u8), 1409d8899132SKalle Valo .array_type = NO_ARRAY, 1410d8899132SKalle Valo .tlv_type = 0x1C, 1411d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, 1412d8899132SKalle Valo dev_mem_info_valid), 1413d8899132SKalle Valo }, 1414d8899132SKalle Valo { 1415d8899132SKalle Valo .data_type = QMI_STRUCT, 1416d8899132SKalle Valo .elem_len = ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01, 1417d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_dev_mem_info_s_v01), 1418d8899132SKalle Valo .array_type = STATIC_ARRAY, 1419d8899132SKalle Valo .tlv_type = 0x1C, 1420d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_cap_resp_msg_v01, dev_mem), 1421d8899132SKalle Valo .ei_array = qmi_wlanfw_dev_mem_info_s_v01_ei, 1422d8899132SKalle Valo }, 1423d8899132SKalle Valo { 1424d8899132SKalle Valo .data_type = QMI_EOTI, 1425d8899132SKalle Valo .array_type = NO_ARRAY, 1426d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1427d8899132SKalle Valo }, 1428d8899132SKalle Valo }; 1429d8899132SKalle Valo 1430e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_bdf_download_req_msg_v01_ei[] = { 1431d8899132SKalle Valo { 1432d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 1433d8899132SKalle Valo .elem_len = 1, 1434d8899132SKalle Valo .elem_size = sizeof(u8), 1435d8899132SKalle Valo .array_type = NO_ARRAY, 1436d8899132SKalle Valo .tlv_type = 0x01, 1437d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1438d8899132SKalle Valo valid), 1439d8899132SKalle Valo }, 1440d8899132SKalle Valo { 1441d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1442d8899132SKalle Valo .elem_len = 1, 1443d8899132SKalle Valo .elem_size = sizeof(u8), 1444d8899132SKalle Valo .array_type = NO_ARRAY, 1445d8899132SKalle Valo .tlv_type = 0x10, 1446d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1447d8899132SKalle Valo file_id_valid), 1448d8899132SKalle Valo }, 1449d8899132SKalle Valo { 1450d8899132SKalle Valo .data_type = QMI_SIGNED_4_BYTE_ENUM, 1451d8899132SKalle Valo .elem_len = 1, 1452d8899132SKalle Valo .elem_size = sizeof(enum qmi_wlanfw_cal_temp_id_enum_v01), 1453d8899132SKalle Valo .array_type = NO_ARRAY, 1454d8899132SKalle Valo .tlv_type = 0x10, 1455d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1456d8899132SKalle Valo file_id), 1457d8899132SKalle Valo }, 1458d8899132SKalle Valo { 1459d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1460d8899132SKalle Valo .elem_len = 1, 1461d8899132SKalle Valo .elem_size = sizeof(u8), 1462d8899132SKalle Valo .array_type = NO_ARRAY, 1463d8899132SKalle Valo .tlv_type = 0x11, 1464d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1465d8899132SKalle Valo total_size_valid), 1466d8899132SKalle Valo }, 1467d8899132SKalle Valo { 1468d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1469d8899132SKalle Valo .elem_len = 1, 1470d8899132SKalle Valo .elem_size = sizeof(u32), 1471d8899132SKalle Valo .array_type = NO_ARRAY, 1472d8899132SKalle Valo .tlv_type = 0x11, 1473d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1474d8899132SKalle Valo total_size), 1475d8899132SKalle Valo }, 1476d8899132SKalle Valo { 1477d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1478d8899132SKalle Valo .elem_len = 1, 1479d8899132SKalle Valo .elem_size = sizeof(u8), 1480d8899132SKalle Valo .array_type = NO_ARRAY, 1481d8899132SKalle Valo .tlv_type = 0x12, 1482d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1483d8899132SKalle Valo seg_id_valid), 1484d8899132SKalle Valo }, 1485d8899132SKalle Valo { 1486d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1487d8899132SKalle Valo .elem_len = 1, 1488d8899132SKalle Valo .elem_size = sizeof(u32), 1489d8899132SKalle Valo .array_type = NO_ARRAY, 1490d8899132SKalle Valo .tlv_type = 0x12, 1491d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1492d8899132SKalle Valo seg_id), 1493d8899132SKalle Valo }, 1494d8899132SKalle Valo { 1495d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1496d8899132SKalle Valo .elem_len = 1, 1497d8899132SKalle Valo .elem_size = sizeof(u8), 1498d8899132SKalle Valo .array_type = NO_ARRAY, 1499d8899132SKalle Valo .tlv_type = 0x13, 1500d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1501d8899132SKalle Valo data_valid), 1502d8899132SKalle Valo }, 1503d8899132SKalle Valo { 1504d8899132SKalle Valo .data_type = QMI_DATA_LEN, 1505d8899132SKalle Valo .elem_len = 1, 1506d8899132SKalle Valo .elem_size = sizeof(u16), 1507d8899132SKalle Valo .array_type = NO_ARRAY, 1508d8899132SKalle Valo .tlv_type = 0x13, 1509d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1510d8899132SKalle Valo data_len), 1511d8899132SKalle Valo }, 1512d8899132SKalle Valo { 1513d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 1514d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_DATA_SIZE_V01, 1515d8899132SKalle Valo .elem_size = sizeof(u8), 1516d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 1517d8899132SKalle Valo .tlv_type = 0x13, 1518d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1519d8899132SKalle Valo data), 1520d8899132SKalle Valo }, 1521d8899132SKalle Valo { 1522d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1523d8899132SKalle Valo .elem_len = 1, 1524d8899132SKalle Valo .elem_size = sizeof(u8), 1525d8899132SKalle Valo .array_type = NO_ARRAY, 1526d8899132SKalle Valo .tlv_type = 0x14, 1527d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1528d8899132SKalle Valo end_valid), 1529d8899132SKalle Valo }, 1530d8899132SKalle Valo { 1531d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 1532d8899132SKalle Valo .elem_len = 1, 1533d8899132SKalle Valo .elem_size = sizeof(u8), 1534d8899132SKalle Valo .array_type = NO_ARRAY, 1535d8899132SKalle Valo .tlv_type = 0x14, 1536d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1537d8899132SKalle Valo end), 1538d8899132SKalle Valo }, 1539d8899132SKalle Valo { 1540d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1541d8899132SKalle Valo .elem_len = 1, 1542d8899132SKalle Valo .elem_size = sizeof(u8), 1543d8899132SKalle Valo .array_type = NO_ARRAY, 1544d8899132SKalle Valo .tlv_type = 0x15, 1545d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1546d8899132SKalle Valo bdf_type_valid), 1547d8899132SKalle Valo }, 1548d8899132SKalle Valo { 1549d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 1550d8899132SKalle Valo .elem_len = 1, 1551d8899132SKalle Valo .elem_size = sizeof(u8), 1552d8899132SKalle Valo .array_type = NO_ARRAY, 1553d8899132SKalle Valo .tlv_type = 0x15, 1554d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_req_msg_v01, 1555d8899132SKalle Valo bdf_type), 1556d8899132SKalle Valo }, 1557d8899132SKalle Valo 1558d8899132SKalle Valo { 1559d8899132SKalle Valo .data_type = QMI_EOTI, 1560d8899132SKalle Valo .array_type = NO_ARRAY, 1561d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1562d8899132SKalle Valo }, 1563d8899132SKalle Valo }; 1564d8899132SKalle Valo 1565e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_bdf_download_resp_msg_v01_ei[] = { 1566d8899132SKalle Valo { 1567d8899132SKalle Valo .data_type = QMI_STRUCT, 1568d8899132SKalle Valo .elem_len = 1, 1569d8899132SKalle Valo .elem_size = sizeof(struct qmi_response_type_v01), 1570d8899132SKalle Valo .array_type = NO_ARRAY, 1571d8899132SKalle Valo .tlv_type = 0x02, 1572d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_bdf_download_resp_msg_v01, 1573d8899132SKalle Valo resp), 1574d8899132SKalle Valo .ei_array = qmi_response_type_v01_ei, 1575d8899132SKalle Valo }, 1576d8899132SKalle Valo { 1577d8899132SKalle Valo .data_type = QMI_EOTI, 1578d8899132SKalle Valo .array_type = NO_ARRAY, 1579d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1580d8899132SKalle Valo }, 1581d8899132SKalle Valo }; 1582d8899132SKalle Valo 1583e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_m3_info_req_msg_v01_ei[] = { 1584d8899132SKalle Valo { 1585d8899132SKalle Valo .data_type = QMI_UNSIGNED_8_BYTE, 1586d8899132SKalle Valo .elem_len = 1, 1587d8899132SKalle Valo .elem_size = sizeof(u64), 1588d8899132SKalle Valo .array_type = NO_ARRAY, 1589d8899132SKalle Valo .tlv_type = 0x01, 1590d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, addr), 1591d8899132SKalle Valo }, 1592d8899132SKalle Valo { 1593d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1594d8899132SKalle Valo .elem_len = 1, 1595d8899132SKalle Valo .elem_size = sizeof(u32), 1596d8899132SKalle Valo .array_type = NO_ARRAY, 1597d8899132SKalle Valo .tlv_type = 0x02, 1598d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_m3_info_req_msg_v01, size), 1599d8899132SKalle Valo }, 1600d8899132SKalle Valo { 1601d8899132SKalle Valo .data_type = QMI_EOTI, 1602d8899132SKalle Valo .array_type = NO_ARRAY, 1603d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1604d8899132SKalle Valo }, 1605d8899132SKalle Valo }; 1606d8899132SKalle Valo 1607e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_m3_info_resp_msg_v01_ei[] = { 1608d8899132SKalle Valo { 1609d8899132SKalle Valo .data_type = QMI_STRUCT, 1610d8899132SKalle Valo .elem_len = 1, 1611d8899132SKalle Valo .elem_size = sizeof(struct qmi_response_type_v01), 1612d8899132SKalle Valo .array_type = NO_ARRAY, 1613d8899132SKalle Valo .tlv_type = 0x02, 1614d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_m3_info_resp_msg_v01, resp), 1615d8899132SKalle Valo .ei_array = qmi_response_type_v01_ei, 1616d8899132SKalle Valo }, 1617d8899132SKalle Valo { 1618d8899132SKalle Valo .data_type = QMI_EOTI, 1619d8899132SKalle Valo .array_type = NO_ARRAY, 1620d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1621d8899132SKalle Valo }, 1622d8899132SKalle Valo }; 1623d8899132SKalle Valo 1624e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei[] = { 1625d8899132SKalle Valo { 1626d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1627d8899132SKalle Valo .elem_len = 1, 1628d8899132SKalle Valo .elem_size = sizeof(u32), 1629d8899132SKalle Valo .array_type = NO_ARRAY, 1630d8899132SKalle Valo .tlv_type = 0, 1631d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1632d8899132SKalle Valo pipe_num), 1633d8899132SKalle Valo }, 1634d8899132SKalle Valo { 1635d8899132SKalle Valo .data_type = QMI_SIGNED_4_BYTE_ENUM, 1636d8899132SKalle Valo .elem_len = 1, 1637d8899132SKalle Valo .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01), 1638d8899132SKalle Valo .array_type = NO_ARRAY, 1639d8899132SKalle Valo .tlv_type = 0, 1640d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1641d8899132SKalle Valo pipe_dir), 1642d8899132SKalle Valo }, 1643d8899132SKalle Valo { 1644d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1645d8899132SKalle Valo .elem_len = 1, 1646d8899132SKalle Valo .elem_size = sizeof(u32), 1647d8899132SKalle Valo .array_type = NO_ARRAY, 1648d8899132SKalle Valo .tlv_type = 0, 1649d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1650d8899132SKalle Valo nentries), 1651d8899132SKalle Valo }, 1652d8899132SKalle Valo { 1653d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1654d8899132SKalle Valo .elem_len = 1, 1655d8899132SKalle Valo .elem_size = sizeof(u32), 1656d8899132SKalle Valo .array_type = NO_ARRAY, 1657d8899132SKalle Valo .tlv_type = 0, 1658d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1659d8899132SKalle Valo nbytes_max), 1660d8899132SKalle Valo }, 1661d8899132SKalle Valo { 1662d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1663d8899132SKalle Valo .elem_len = 1, 1664d8899132SKalle Valo .elem_size = sizeof(u32), 1665d8899132SKalle Valo .array_type = NO_ARRAY, 1666d8899132SKalle Valo .tlv_type = 0, 1667d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01, 1668d8899132SKalle Valo flags), 1669d8899132SKalle Valo }, 1670d8899132SKalle Valo { 1671d8899132SKalle Valo .data_type = QMI_EOTI, 1672d8899132SKalle Valo .array_type = NO_ARRAY, 1673d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1674d8899132SKalle Valo }, 1675d8899132SKalle Valo }; 1676d8899132SKalle Valo 1677e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei[] = { 1678d8899132SKalle Valo { 1679d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1680d8899132SKalle Valo .elem_len = 1, 1681d8899132SKalle Valo .elem_size = sizeof(u32), 1682d8899132SKalle Valo .array_type = NO_ARRAY, 1683d8899132SKalle Valo .tlv_type = 0, 1684d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 1685d8899132SKalle Valo service_id), 1686d8899132SKalle Valo }, 1687d8899132SKalle Valo { 1688d8899132SKalle Valo .data_type = QMI_SIGNED_4_BYTE_ENUM, 1689d8899132SKalle Valo .elem_len = 1, 1690d8899132SKalle Valo .elem_size = sizeof(enum qmi_wlanfw_pipedir_enum_v01), 1691d8899132SKalle Valo .array_type = NO_ARRAY, 1692d8899132SKalle Valo .tlv_type = 0, 1693d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 1694d8899132SKalle Valo pipe_dir), 1695d8899132SKalle Valo }, 1696d8899132SKalle Valo { 1697d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1698d8899132SKalle Valo .elem_len = 1, 1699d8899132SKalle Valo .elem_size = sizeof(u32), 1700d8899132SKalle Valo .array_type = NO_ARRAY, 1701d8899132SKalle Valo .tlv_type = 0, 1702d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01, 1703d8899132SKalle Valo pipe_num), 1704d8899132SKalle Valo }, 1705d8899132SKalle Valo { 1706d8899132SKalle Valo .data_type = QMI_EOTI, 1707d8899132SKalle Valo .array_type = NO_ARRAY, 1708d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1709d8899132SKalle Valo }, 1710d8899132SKalle Valo }; 1711d8899132SKalle Valo 1712e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_shadow_reg_cfg_s_v01_ei[] = { 1713d8899132SKalle Valo { 1714d8899132SKalle Valo .data_type = QMI_UNSIGNED_2_BYTE, 1715d8899132SKalle Valo .elem_len = 1, 1716d8899132SKalle Valo .elem_size = sizeof(u16), 1717d8899132SKalle Valo .array_type = NO_ARRAY, 1718d8899132SKalle Valo .tlv_type = 0, 1719d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, id), 1720d8899132SKalle Valo }, 1721d8899132SKalle Valo { 1722d8899132SKalle Valo .data_type = QMI_UNSIGNED_2_BYTE, 1723d8899132SKalle Valo .elem_len = 1, 1724d8899132SKalle Valo .elem_size = sizeof(u16), 1725d8899132SKalle Valo .array_type = NO_ARRAY, 1726d8899132SKalle Valo .tlv_type = 0, 1727d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_shadow_reg_cfg_s_v01, 1728d8899132SKalle Valo offset), 1729d8899132SKalle Valo }, 1730d8899132SKalle Valo { 1731d8899132SKalle Valo .data_type = QMI_EOTI, 1732d8899132SKalle Valo .array_type = QMI_COMMON_TLV_TYPE, 1733d8899132SKalle Valo }, 1734d8899132SKalle Valo }; 1735d8899132SKalle Valo 1736e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei[] = { 1737d8899132SKalle Valo { 1738d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1739d8899132SKalle Valo .elem_len = 1, 1740d8899132SKalle Valo .elem_size = sizeof(u32), 1741d8899132SKalle Valo .array_type = NO_ARRAY, 1742d8899132SKalle Valo .tlv_type = 0, 1743d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01, 1744d8899132SKalle Valo addr), 1745d8899132SKalle Valo }, 1746d8899132SKalle Valo { 1747d8899132SKalle Valo .data_type = QMI_EOTI, 1748d8899132SKalle Valo .array_type = NO_ARRAY, 1749d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1750d8899132SKalle Valo }, 1751d8899132SKalle Valo }; 1752d8899132SKalle Valo 1753e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_wlan_mode_req_msg_v01_ei[] = { 1754d8899132SKalle Valo { 1755d8899132SKalle Valo .data_type = QMI_UNSIGNED_4_BYTE, 1756d8899132SKalle Valo .elem_len = 1, 1757d8899132SKalle Valo .elem_size = sizeof(u32), 1758d8899132SKalle Valo .array_type = NO_ARRAY, 1759d8899132SKalle Valo .tlv_type = 0x01, 1760d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 1761d8899132SKalle Valo mode), 1762d8899132SKalle Valo }, 1763d8899132SKalle Valo { 1764d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1765d8899132SKalle Valo .elem_len = 1, 1766d8899132SKalle Valo .elem_size = sizeof(u8), 1767d8899132SKalle Valo .array_type = NO_ARRAY, 1768d8899132SKalle Valo .tlv_type = 0x10, 1769d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 1770d8899132SKalle Valo hw_debug_valid), 1771d8899132SKalle Valo }, 1772d8899132SKalle Valo { 1773d8899132SKalle Valo .data_type = QMI_UNSIGNED_1_BYTE, 1774d8899132SKalle Valo .elem_len = 1, 1775d8899132SKalle Valo .elem_size = sizeof(u8), 1776d8899132SKalle Valo .array_type = NO_ARRAY, 1777d8899132SKalle Valo .tlv_type = 0x10, 1778d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_mode_req_msg_v01, 1779d8899132SKalle Valo hw_debug), 1780d8899132SKalle Valo }, 1781d8899132SKalle Valo { 1782d8899132SKalle Valo .data_type = QMI_EOTI, 1783d8899132SKalle Valo .array_type = NO_ARRAY, 1784d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1785d8899132SKalle Valo }, 1786d8899132SKalle Valo }; 1787d8899132SKalle Valo 1788e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_wlan_mode_resp_msg_v01_ei[] = { 1789d8899132SKalle Valo { 1790d8899132SKalle Valo .data_type = QMI_STRUCT, 1791d8899132SKalle Valo .elem_len = 1, 1792d8899132SKalle Valo .elem_size = sizeof(struct qmi_response_type_v01), 1793d8899132SKalle Valo .array_type = NO_ARRAY, 1794d8899132SKalle Valo .tlv_type = 0x02, 1795d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_mode_resp_msg_v01, 1796d8899132SKalle Valo resp), 1797d8899132SKalle Valo .ei_array = qmi_response_type_v01_ei, 1798d8899132SKalle Valo }, 1799d8899132SKalle Valo { 1800d8899132SKalle Valo .data_type = QMI_EOTI, 1801d8899132SKalle Valo .array_type = NO_ARRAY, 1802d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1803d8899132SKalle Valo }, 1804d8899132SKalle Valo }; 1805d8899132SKalle Valo 1806e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_wlan_cfg_req_msg_v01_ei[] = { 1807d8899132SKalle Valo { 1808d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1809d8899132SKalle Valo .elem_len = 1, 1810d8899132SKalle Valo .elem_size = sizeof(u8), 1811d8899132SKalle Valo .array_type = NO_ARRAY, 1812d8899132SKalle Valo .tlv_type = 0x10, 1813d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1814d8899132SKalle Valo host_version_valid), 1815d8899132SKalle Valo }, 1816d8899132SKalle Valo { 1817d8899132SKalle Valo .data_type = QMI_STRING, 1818d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_STR_LEN_V01 + 1, 1819d8899132SKalle Valo .elem_size = sizeof(char), 1820d8899132SKalle Valo .array_type = NO_ARRAY, 1821d8899132SKalle Valo .tlv_type = 0x10, 1822d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1823d8899132SKalle Valo host_version), 1824d8899132SKalle Valo }, 1825d8899132SKalle Valo { 1826d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1827d8899132SKalle Valo .elem_len = 1, 1828d8899132SKalle Valo .elem_size = sizeof(u8), 1829d8899132SKalle Valo .array_type = NO_ARRAY, 1830d8899132SKalle Valo .tlv_type = 0x11, 1831d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1832d8899132SKalle Valo tgt_cfg_valid), 1833d8899132SKalle Valo }, 1834d8899132SKalle Valo { 1835d8899132SKalle Valo .data_type = QMI_DATA_LEN, 1836d8899132SKalle Valo .elem_len = 1, 1837d8899132SKalle Valo .elem_size = sizeof(u8), 1838d8899132SKalle Valo .array_type = NO_ARRAY, 1839d8899132SKalle Valo .tlv_type = 0x11, 1840d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1841d8899132SKalle Valo tgt_cfg_len), 1842d8899132SKalle Valo }, 1843d8899132SKalle Valo { 1844d8899132SKalle Valo .data_type = QMI_STRUCT, 1845d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_NUM_CE_V01, 1846d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_ce_tgt_pipe_cfg_s_v01), 1847d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 1848d8899132SKalle Valo .tlv_type = 0x11, 1849d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1850d8899132SKalle Valo tgt_cfg), 1851d8899132SKalle Valo .ei_array = qmi_wlanfw_ce_tgt_pipe_cfg_s_v01_ei, 1852d8899132SKalle Valo }, 1853d8899132SKalle Valo { 1854d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1855d8899132SKalle Valo .elem_len = 1, 1856d8899132SKalle Valo .elem_size = sizeof(u8), 1857d8899132SKalle Valo .array_type = NO_ARRAY, 1858d8899132SKalle Valo .tlv_type = 0x12, 1859d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1860d8899132SKalle Valo svc_cfg_valid), 1861d8899132SKalle Valo }, 1862d8899132SKalle Valo { 1863d8899132SKalle Valo .data_type = QMI_DATA_LEN, 1864d8899132SKalle Valo .elem_len = 1, 1865d8899132SKalle Valo .elem_size = sizeof(u8), 1866d8899132SKalle Valo .array_type = NO_ARRAY, 1867d8899132SKalle Valo .tlv_type = 0x12, 1868d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1869d8899132SKalle Valo svc_cfg_len), 1870d8899132SKalle Valo }, 1871d8899132SKalle Valo { 1872d8899132SKalle Valo .data_type = QMI_STRUCT, 1873d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_NUM_SVC_V01, 1874d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_ce_svc_pipe_cfg_s_v01), 1875d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 1876d8899132SKalle Valo .tlv_type = 0x12, 1877d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1878d8899132SKalle Valo svc_cfg), 1879d8899132SKalle Valo .ei_array = qmi_wlanfw_ce_svc_pipe_cfg_s_v01_ei, 1880d8899132SKalle Valo }, 1881d8899132SKalle Valo { 1882d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1883d8899132SKalle Valo .elem_len = 1, 1884d8899132SKalle Valo .elem_size = sizeof(u8), 1885d8899132SKalle Valo .array_type = NO_ARRAY, 1886d8899132SKalle Valo .tlv_type = 0x13, 1887d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1888d8899132SKalle Valo shadow_reg_valid), 1889d8899132SKalle Valo }, 1890d8899132SKalle Valo { 1891d8899132SKalle Valo .data_type = QMI_DATA_LEN, 1892d8899132SKalle Valo .elem_len = 1, 1893d8899132SKalle Valo .elem_size = sizeof(u8), 1894d8899132SKalle Valo .array_type = NO_ARRAY, 1895d8899132SKalle Valo .tlv_type = 0x13, 1896d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1897d8899132SKalle Valo shadow_reg_len), 1898d8899132SKalle Valo }, 1899d8899132SKalle Valo { 1900d8899132SKalle Valo .data_type = QMI_STRUCT, 1901d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V01, 1902d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_cfg_s_v01), 1903d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 1904d8899132SKalle Valo .tlv_type = 0x13, 1905d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1906d8899132SKalle Valo shadow_reg), 1907d8899132SKalle Valo .ei_array = qmi_wlanfw_shadow_reg_cfg_s_v01_ei, 1908d8899132SKalle Valo }, 1909d8899132SKalle Valo { 1910d8899132SKalle Valo .data_type = QMI_OPT_FLAG, 1911d8899132SKalle Valo .elem_len = 1, 1912d8899132SKalle Valo .elem_size = sizeof(u8), 1913d8899132SKalle Valo .array_type = NO_ARRAY, 1914d8899132SKalle Valo .tlv_type = 0x17, 1915d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1916d8899132SKalle Valo shadow_reg_v3_valid), 1917d8899132SKalle Valo }, 1918d8899132SKalle Valo { 1919d8899132SKalle Valo .data_type = QMI_DATA_LEN, 1920d8899132SKalle Valo .elem_len = 1, 1921d8899132SKalle Valo .elem_size = sizeof(u8), 1922d8899132SKalle Valo .array_type = NO_ARRAY, 1923d8899132SKalle Valo .tlv_type = 0x17, 1924d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1925d8899132SKalle Valo shadow_reg_v3_len), 1926d8899132SKalle Valo }, 1927d8899132SKalle Valo { 1928d8899132SKalle Valo .data_type = QMI_STRUCT, 1929d8899132SKalle Valo .elem_len = QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01, 1930d8899132SKalle Valo .elem_size = sizeof(struct qmi_wlanfw_shadow_reg_v3_cfg_s_v01), 1931d8899132SKalle Valo .array_type = VAR_LEN_ARRAY, 1932d8899132SKalle Valo .tlv_type = 0x17, 1933d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_req_msg_v01, 1934d8899132SKalle Valo shadow_reg_v3), 1935d8899132SKalle Valo .ei_array = qmi_wlanfw_shadow_reg_v3_cfg_s_v01_ei, 1936d8899132SKalle Valo }, 1937d8899132SKalle Valo { 1938d8899132SKalle Valo .data_type = QMI_EOTI, 1939d8899132SKalle Valo .array_type = NO_ARRAY, 1940d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1941d8899132SKalle Valo }, 1942d8899132SKalle Valo }; 1943d8899132SKalle Valo 1944e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_wlan_cfg_resp_msg_v01_ei[] = { 1945d8899132SKalle Valo { 1946d8899132SKalle Valo .data_type = QMI_STRUCT, 1947d8899132SKalle Valo .elem_len = 1, 1948d8899132SKalle Valo .elem_size = sizeof(struct qmi_response_type_v01), 1949d8899132SKalle Valo .array_type = NO_ARRAY, 1950d8899132SKalle Valo .tlv_type = 0x02, 1951d8899132SKalle Valo .offset = offsetof(struct qmi_wlanfw_wlan_cfg_resp_msg_v01, resp), 1952d8899132SKalle Valo .ei_array = qmi_response_type_v01_ei, 1953d8899132SKalle Valo }, 1954d8899132SKalle Valo { 1955d8899132SKalle Valo .data_type = QMI_EOTI, 1956d8899132SKalle Valo .array_type = NO_ARRAY, 1957d8899132SKalle Valo .tlv_type = QMI_COMMON_TLV_TYPE, 1958d8899132SKalle Valo }, 1959d8899132SKalle Valo }; 1960d8899132SKalle Valo 1961e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_mem_ready_ind_msg_v01_ei[] = { 1962d8899132SKalle Valo { 1963d8899132SKalle Valo .data_type = QMI_EOTI, 1964d8899132SKalle Valo .array_type = NO_ARRAY, 1965d8899132SKalle Valo }, 1966d8899132SKalle Valo }; 1967d8899132SKalle Valo 1968e7ab40b7SJeff Johnson static const struct qmi_elem_info qmi_wlanfw_fw_ready_ind_msg_v01_ei[] = { 1969d8899132SKalle Valo { 1970d8899132SKalle Valo .data_type = QMI_EOTI, 1971d8899132SKalle Valo .array_type = NO_ARRAY, 1972d8899132SKalle Valo }, 1973d8899132SKalle Valo }; 1974d8899132SKalle Valo 19759f9df1a2SBaochen Qiang static const struct qmi_elem_info qmi_wlanfw_wlan_ini_req_msg_v01_ei[] = { 19769f9df1a2SBaochen Qiang { 19779f9df1a2SBaochen Qiang .data_type = QMI_OPT_FLAG, 19789f9df1a2SBaochen Qiang .elem_len = 1, 19799f9df1a2SBaochen Qiang .elem_size = sizeof(u8), 19809f9df1a2SBaochen Qiang .array_type = NO_ARRAY, 19819f9df1a2SBaochen Qiang .tlv_type = 0x10, 19829f9df1a2SBaochen Qiang .offset = offsetof(struct qmi_wlanfw_wlan_ini_req_msg_v01, 19839f9df1a2SBaochen Qiang enable_fwlog_valid), 19849f9df1a2SBaochen Qiang }, 19859f9df1a2SBaochen Qiang { 19869f9df1a2SBaochen Qiang .data_type = QMI_UNSIGNED_1_BYTE, 19879f9df1a2SBaochen Qiang .elem_len = 1, 19889f9df1a2SBaochen Qiang .elem_size = sizeof(u8), 19899f9df1a2SBaochen Qiang .array_type = NO_ARRAY, 19909f9df1a2SBaochen Qiang .tlv_type = 0x10, 19919f9df1a2SBaochen Qiang .offset = offsetof(struct qmi_wlanfw_wlan_ini_req_msg_v01, 19929f9df1a2SBaochen Qiang enable_fwlog), 19939f9df1a2SBaochen Qiang }, 19949f9df1a2SBaochen Qiang { 19959f9df1a2SBaochen Qiang .data_type = QMI_EOTI, 19969f9df1a2SBaochen Qiang .array_type = NO_ARRAY, 19979f9df1a2SBaochen Qiang .tlv_type = QMI_COMMON_TLV_TYPE, 19989f9df1a2SBaochen Qiang }, 19999f9df1a2SBaochen Qiang }; 20009f9df1a2SBaochen Qiang 20019f9df1a2SBaochen Qiang static const struct qmi_elem_info qmi_wlanfw_wlan_ini_resp_msg_v01_ei[] = { 20029f9df1a2SBaochen Qiang { 20039f9df1a2SBaochen Qiang .data_type = QMI_STRUCT, 20049f9df1a2SBaochen Qiang .elem_len = 1, 20059f9df1a2SBaochen Qiang .elem_size = sizeof(struct qmi_response_type_v01), 20069f9df1a2SBaochen Qiang .array_type = NO_ARRAY, 20079f9df1a2SBaochen Qiang .tlv_type = 0x02, 20089f9df1a2SBaochen Qiang .offset = offsetof(struct qmi_wlanfw_wlan_ini_resp_msg_v01, 20099f9df1a2SBaochen Qiang resp), 20109f9df1a2SBaochen Qiang .ei_array = qmi_response_type_v01_ei, 20119f9df1a2SBaochen Qiang }, 20129f9df1a2SBaochen Qiang { 20139f9df1a2SBaochen Qiang .data_type = QMI_EOTI, 20149f9df1a2SBaochen Qiang .array_type = NO_ARRAY, 20159f9df1a2SBaochen Qiang .tlv_type = QMI_COMMON_TLV_TYPE, 20169f9df1a2SBaochen Qiang }, 20179f9df1a2SBaochen Qiang }; 20189f9df1a2SBaochen Qiang 201976fece36SKarthikeyan Periyasamy static void ath12k_host_cap_parse_mlo(struct ath12k_base *ab, 202076fece36SKarthikeyan Periyasamy struct qmi_wlanfw_host_cap_req_msg_v01 *req) 2021d8899132SKalle Valo { 202276fece36SKarthikeyan Periyasamy struct wlfw_host_mlo_chip_info_s_v01 *info; 202376fece36SKarthikeyan Periyasamy u8 hw_link_id = 0; 202476fece36SKarthikeyan Periyasamy int i; 202576fece36SKarthikeyan Periyasamy 2026da3cbd88SRaj Kumar Bhagat if (!(ab->mlo_capable_flags & ATH12K_INTRA_DEVICE_MLO_SUPPORT)) { 2027da3cbd88SRaj Kumar Bhagat ath12k_dbg(ab, ATH12K_DBG_QMI, 2028da3cbd88SRaj Kumar Bhagat "intra device MLO is disabled hence skip QMI MLO cap"); 2029da3cbd88SRaj Kumar Bhagat return; 2030da3cbd88SRaj Kumar Bhagat } 2031da3cbd88SRaj Kumar Bhagat 203253a65445SKarthikeyan Periyasamy if (!ab->qmi.num_radios || ab->qmi.num_radios == U8_MAX) { 2033b34389c3SKarthikeyan Periyasamy ab->mlo_capable_flags = 0; 2034b34389c3SKarthikeyan Periyasamy 203553a65445SKarthikeyan Periyasamy ath12k_dbg(ab, ATH12K_DBG_QMI, 203653a65445SKarthikeyan Periyasamy "skip QMI MLO cap due to invalid num_radio %d\n", 203753a65445SKarthikeyan Periyasamy ab->qmi.num_radios); 203876fece36SKarthikeyan Periyasamy return; 203953a65445SKarthikeyan Periyasamy } 204076fece36SKarthikeyan Periyasamy 2041d8899132SKalle Valo req->mlo_capable_valid = 1; 2042d8899132SKalle Valo req->mlo_capable = 1; 2043d8899132SKalle Valo req->mlo_chip_id_valid = 1; 2044b2d54ca7SKarthikeyan Periyasamy req->mlo_chip_id = ab->device_id; 2045d8899132SKalle Valo req->mlo_group_id_valid = 1; 2046d8899132SKalle Valo req->mlo_group_id = 0; 2047d8899132SKalle Valo req->max_mlo_peer_valid = 1; 2048d8899132SKalle Valo /* Max peer number generally won't change for the same device 2049d8899132SKalle Valo * but needs to be synced with host driver. 2050d8899132SKalle Valo */ 205176fece36SKarthikeyan Periyasamy req->max_mlo_peer = ab->hw_params->max_mlo_peer; 2052d8899132SKalle Valo req->mlo_num_chips_valid = 1; 2053d8899132SKalle Valo req->mlo_num_chips = 1; 205476fece36SKarthikeyan Periyasamy 205576fece36SKarthikeyan Periyasamy info = &req->mlo_chip_info[0]; 2056b2d54ca7SKarthikeyan Periyasamy info->chip_id = ab->device_id; 205753a65445SKarthikeyan Periyasamy info->num_local_links = ab->qmi.num_radios; 205876fece36SKarthikeyan Periyasamy 205976fece36SKarthikeyan Periyasamy for (i = 0; i < info->num_local_links; i++) { 206076fece36SKarthikeyan Periyasamy info->hw_link_id[i] = hw_link_id; 206176fece36SKarthikeyan Periyasamy info->valid_mlo_link_id[i] = 1; 206276fece36SKarthikeyan Periyasamy 206376fece36SKarthikeyan Periyasamy hw_link_id++; 206476fece36SKarthikeyan Periyasamy } 206576fece36SKarthikeyan Periyasamy 2066d8899132SKalle Valo req->mlo_chip_info_valid = 1; 2067d8899132SKalle Valo } 2068d8899132SKalle Valo 2069d8899132SKalle Valo static int ath12k_qmi_host_cap_send(struct ath12k_base *ab) 2070d8899132SKalle Valo { 20716d2b0a06SJeff Johnson struct qmi_wlanfw_host_cap_req_msg_v01 req = {}; 20726d2b0a06SJeff Johnson struct qmi_wlanfw_host_cap_resp_msg_v01 resp = {}; 207359cf57abSJeff Johnson struct qmi_txn txn; 2074d8899132SKalle Valo int ret = 0; 2075d8899132SKalle Valo 2076d8899132SKalle Valo req.num_clients_valid = 1; 2077d8899132SKalle Valo req.num_clients = 1; 2078d8899132SKalle Valo req.mem_cfg_mode = ab->qmi.target_mem_mode; 2079d8899132SKalle Valo req.mem_cfg_mode_valid = 1; 2080d8899132SKalle Valo req.bdf_support_valid = 1; 2081d8899132SKalle Valo req.bdf_support = 1; 2082d8899132SKalle Valo 2083d8899132SKalle Valo req.m3_support_valid = 1; 2084d8899132SKalle Valo req.m3_support = 1; 2085d8899132SKalle Valo req.m3_cache_support_valid = 1; 2086d8899132SKalle Valo req.m3_cache_support = 1; 2087d8899132SKalle Valo 2088d8899132SKalle Valo req.cal_done_valid = 1; 2089d8899132SKalle Valo req.cal_done = ab->qmi.cal_done; 2090d8899132SKalle Valo 20919981a3acSCarl Huang if (ab->hw_params->qmi_cnss_feature_bitmap) { 2092d8899132SKalle Valo req.feature_list_valid = 1; 20939981a3acSCarl Huang req.feature_list = ab->hw_params->qmi_cnss_feature_bitmap; 20949981a3acSCarl Huang } 2095d8899132SKalle Valo 2096d8899132SKalle Valo /* BRINGUP: here we are piggybacking a lot of stuff using 2097d8899132SKalle Valo * internal_sleep_clock, should it be split? 2098d8899132SKalle Valo */ 2099d8899132SKalle Valo if (ab->hw_params->internal_sleep_clock) { 2100d8899132SKalle Valo req.nm_modem_valid = 1; 2101d8899132SKalle Valo 2102d8899132SKalle Valo /* Notify firmware that this is non-qualcomm platform. */ 2103d8899132SKalle Valo req.nm_modem |= HOST_CSTATE_BIT; 2104d8899132SKalle Valo 2105d8899132SKalle Valo /* Notify firmware about the sleep clock selection, 2106d8899132SKalle Valo * nm_modem_bit[1] is used for this purpose. Host driver on 2107d8899132SKalle Valo * non-qualcomm platforms should select internal sleep 2108d8899132SKalle Valo * clock. 2109d8899132SKalle Valo */ 2110d8899132SKalle Valo req.nm_modem |= SLEEP_CLOCK_SELECT_INTERNAL_BIT; 2111d8899132SKalle Valo req.nm_modem |= PLATFORM_CAP_PCIE_GLOBAL_RESET; 2112d8899132SKalle Valo } 2113d8899132SKalle Valo 211476fece36SKarthikeyan Periyasamy ath12k_host_cap_parse_mlo(ab, &req); 211576fece36SKarthikeyan Periyasamy 2116d8899132SKalle Valo ret = qmi_txn_init(&ab->qmi.handle, &txn, 2117d8899132SKalle Valo qmi_wlanfw_host_cap_resp_msg_v01_ei, &resp); 2118d8899132SKalle Valo if (ret < 0) 2119d8899132SKalle Valo goto out; 2120d8899132SKalle Valo 2121d8899132SKalle Valo ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2122d8899132SKalle Valo QMI_WLANFW_HOST_CAP_REQ_V01, 2123d8899132SKalle Valo QMI_WLANFW_HOST_CAP_REQ_MSG_V01_MAX_LEN, 2124d8899132SKalle Valo qmi_wlanfw_host_cap_req_msg_v01_ei, &req); 2125d8899132SKalle Valo if (ret < 0) { 21262e82b5f0SJeff Johnson qmi_txn_cancel(&txn); 2127d8899132SKalle Valo ath12k_warn(ab, "Failed to send host capability request,err = %d\n", ret); 2128d8899132SKalle Valo goto out; 2129d8899132SKalle Valo } 2130d8899132SKalle Valo 2131d8899132SKalle Valo ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2132d8899132SKalle Valo if (ret < 0) 2133d8899132SKalle Valo goto out; 2134d8899132SKalle Valo 2135d8899132SKalle Valo if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2136d8899132SKalle Valo ath12k_warn(ab, "Host capability request failed, result: %d, err: %d\n", 2137d8899132SKalle Valo resp.resp.result, resp.resp.error); 2138d8899132SKalle Valo ret = -EINVAL; 2139d8899132SKalle Valo goto out; 2140d8899132SKalle Valo } 2141d8899132SKalle Valo 2142d8899132SKalle Valo out: 2143d8899132SKalle Valo return ret; 2144d8899132SKalle Valo } 2145d8899132SKalle Valo 214653a65445SKarthikeyan Periyasamy static void ath12k_qmi_phy_cap_send(struct ath12k_base *ab) 214753a65445SKarthikeyan Periyasamy { 214853a65445SKarthikeyan Periyasamy struct qmi_wlanfw_phy_cap_req_msg_v01 req = {}; 214953a65445SKarthikeyan Periyasamy struct qmi_wlanfw_phy_cap_resp_msg_v01 resp = {}; 215053a65445SKarthikeyan Periyasamy struct qmi_txn txn; 215153a65445SKarthikeyan Periyasamy int ret; 215253a65445SKarthikeyan Periyasamy 215353a65445SKarthikeyan Periyasamy ret = qmi_txn_init(&ab->qmi.handle, &txn, 215453a65445SKarthikeyan Periyasamy qmi_wlanfw_phy_cap_resp_msg_v01_ei, &resp); 215553a65445SKarthikeyan Periyasamy if (ret < 0) 215653a65445SKarthikeyan Periyasamy goto out; 215753a65445SKarthikeyan Periyasamy 215853a65445SKarthikeyan Periyasamy ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 215953a65445SKarthikeyan Periyasamy QMI_WLANFW_PHY_CAP_REQ_V01, 216053a65445SKarthikeyan Periyasamy QMI_WLANFW_PHY_CAP_REQ_MSG_V01_MAX_LEN, 216153a65445SKarthikeyan Periyasamy qmi_wlanfw_phy_cap_req_msg_v01_ei, &req); 216253a65445SKarthikeyan Periyasamy if (ret < 0) { 216353a65445SKarthikeyan Periyasamy qmi_txn_cancel(&txn); 216453a65445SKarthikeyan Periyasamy ath12k_warn(ab, "failed to send phy capability request: %d\n", ret); 216553a65445SKarthikeyan Periyasamy goto out; 216653a65445SKarthikeyan Periyasamy } 216753a65445SKarthikeyan Periyasamy 216853a65445SKarthikeyan Periyasamy ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 216953a65445SKarthikeyan Periyasamy if (ret < 0) 217053a65445SKarthikeyan Periyasamy goto out; 217153a65445SKarthikeyan Periyasamy 217253a65445SKarthikeyan Periyasamy if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 217353a65445SKarthikeyan Periyasamy ret = -EOPNOTSUPP; 217453a65445SKarthikeyan Periyasamy goto out; 217553a65445SKarthikeyan Periyasamy } 217653a65445SKarthikeyan Periyasamy 2177da3cbd88SRaj Kumar Bhagat if (resp.single_chip_mlo_support_valid) { 2178da3cbd88SRaj Kumar Bhagat if (resp.single_chip_mlo_support) 2179da3cbd88SRaj Kumar Bhagat ab->mlo_capable_flags |= ATH12K_INTRA_DEVICE_MLO_SUPPORT; 2180da3cbd88SRaj Kumar Bhagat else 2181da3cbd88SRaj Kumar Bhagat ab->mlo_capable_flags &= ~ATH12K_INTRA_DEVICE_MLO_SUPPORT; 2182da3cbd88SRaj Kumar Bhagat } 2183da3cbd88SRaj Kumar Bhagat 218453a65445SKarthikeyan Periyasamy if (!resp.num_phy_valid) { 218553a65445SKarthikeyan Periyasamy ret = -ENODATA; 218653a65445SKarthikeyan Periyasamy goto out; 218753a65445SKarthikeyan Periyasamy } 218853a65445SKarthikeyan Periyasamy 218953a65445SKarthikeyan Periyasamy ab->qmi.num_radios = resp.num_phy; 219053a65445SKarthikeyan Periyasamy 2191ae6ec4a3SRaj Kumar Bhagat ath12k_dbg(ab, ATH12K_DBG_QMI, 2192ae6ec4a3SRaj Kumar Bhagat "phy capability resp valid %d num_phy %d valid %d board_id %d valid %d single_chip_mlo_support %d\n", 219353a65445SKarthikeyan Periyasamy resp.num_phy_valid, resp.num_phy, 2194ae6ec4a3SRaj Kumar Bhagat resp.board_id_valid, resp.board_id, 2195ae6ec4a3SRaj Kumar Bhagat resp.single_chip_mlo_support_valid, resp.single_chip_mlo_support); 219653a65445SKarthikeyan Periyasamy 219753a65445SKarthikeyan Periyasamy return; 219853a65445SKarthikeyan Periyasamy 219953a65445SKarthikeyan Periyasamy out: 220053a65445SKarthikeyan Periyasamy /* If PHY capability not advertised then rely on default num link */ 220153a65445SKarthikeyan Periyasamy ab->qmi.num_radios = ab->hw_params->def_num_link; 220253a65445SKarthikeyan Periyasamy 220353a65445SKarthikeyan Periyasamy ath12k_dbg(ab, ATH12K_DBG_QMI, 220453a65445SKarthikeyan Periyasamy "no valid response from PHY capability, choose default num_phy %d\n", 220553a65445SKarthikeyan Periyasamy ab->qmi.num_radios); 220653a65445SKarthikeyan Periyasamy } 220753a65445SKarthikeyan Periyasamy 2208d8899132SKalle Valo static int ath12k_qmi_fw_ind_register_send(struct ath12k_base *ab) 2209d8899132SKalle Valo { 2210d8899132SKalle Valo struct qmi_wlanfw_ind_register_req_msg_v01 *req; 2211d8899132SKalle Valo struct qmi_wlanfw_ind_register_resp_msg_v01 *resp; 2212d8899132SKalle Valo struct qmi_handle *handle = &ab->qmi.handle; 2213d8899132SKalle Valo struct qmi_txn txn; 2214d8899132SKalle Valo int ret; 2215d8899132SKalle Valo 2216d8899132SKalle Valo req = kzalloc(sizeof(*req), GFP_KERNEL); 2217d8899132SKalle Valo if (!req) 2218d8899132SKalle Valo return -ENOMEM; 2219d8899132SKalle Valo 2220d8899132SKalle Valo resp = kzalloc(sizeof(*resp), GFP_KERNEL); 2221d8899132SKalle Valo if (!resp) { 2222d8899132SKalle Valo ret = -ENOMEM; 2223d8899132SKalle Valo goto resp_out; 2224d8899132SKalle Valo } 2225d8899132SKalle Valo 2226d8899132SKalle Valo req->client_id_valid = 1; 2227d8899132SKalle Valo req->client_id = QMI_WLANFW_CLIENT_ID; 2228d8899132SKalle Valo req->fw_ready_enable_valid = 1; 2229d8899132SKalle Valo req->fw_ready_enable = 1; 2230d8899132SKalle Valo req->request_mem_enable_valid = 1; 2231d8899132SKalle Valo req->request_mem_enable = 1; 2232d8899132SKalle Valo req->fw_mem_ready_enable_valid = 1; 2233d8899132SKalle Valo req->fw_mem_ready_enable = 1; 2234d8899132SKalle Valo req->cal_done_enable_valid = 1; 2235d8899132SKalle Valo req->cal_done_enable = 1; 2236d8899132SKalle Valo req->fw_init_done_enable_valid = 1; 2237d8899132SKalle Valo req->fw_init_done_enable = 1; 2238d8899132SKalle Valo 2239d8899132SKalle Valo req->pin_connect_result_enable_valid = 0; 2240d8899132SKalle Valo req->pin_connect_result_enable = 0; 2241d8899132SKalle Valo 2242d8899132SKalle Valo ret = qmi_txn_init(handle, &txn, 2243d8899132SKalle Valo qmi_wlanfw_ind_register_resp_msg_v01_ei, resp); 2244d8899132SKalle Valo if (ret < 0) 2245d8899132SKalle Valo goto out; 2246d8899132SKalle Valo 2247d8899132SKalle Valo ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2248d8899132SKalle Valo QMI_WLANFW_IND_REGISTER_REQ_V01, 2249d8899132SKalle Valo QMI_WLANFW_IND_REGISTER_REQ_MSG_V01_MAX_LEN, 2250d8899132SKalle Valo qmi_wlanfw_ind_register_req_msg_v01_ei, req); 2251d8899132SKalle Valo if (ret < 0) { 22522e82b5f0SJeff Johnson qmi_txn_cancel(&txn); 2253d8899132SKalle Valo ath12k_warn(ab, "Failed to send indication register request, err = %d\n", 2254d8899132SKalle Valo ret); 2255d8899132SKalle Valo goto out; 2256d8899132SKalle Valo } 2257d8899132SKalle Valo 2258d8899132SKalle Valo ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2259d8899132SKalle Valo if (ret < 0) { 2260d8899132SKalle Valo ath12k_warn(ab, "failed to register fw indication %d\n", ret); 2261d8899132SKalle Valo goto out; 2262d8899132SKalle Valo } 2263d8899132SKalle Valo 2264d8899132SKalle Valo if (resp->resp.result != QMI_RESULT_SUCCESS_V01) { 2265d8899132SKalle Valo ath12k_warn(ab, "FW Ind register request failed, result: %d, err: %d\n", 2266d8899132SKalle Valo resp->resp.result, resp->resp.error); 2267d8899132SKalle Valo ret = -EINVAL; 2268d8899132SKalle Valo goto out; 2269d8899132SKalle Valo } 2270d8899132SKalle Valo 2271d8899132SKalle Valo out: 2272d8899132SKalle Valo kfree(resp); 2273d8899132SKalle Valo resp_out: 2274d8899132SKalle Valo kfree(req); 2275d8899132SKalle Valo return ret; 2276d8899132SKalle Valo } 2277d8899132SKalle Valo 2278d8899132SKalle Valo static int ath12k_qmi_respond_fw_mem_request(struct ath12k_base *ab) 2279d8899132SKalle Valo { 2280d8899132SKalle Valo struct qmi_wlanfw_respond_mem_req_msg_v01 *req; 22816d2b0a06SJeff Johnson struct qmi_wlanfw_respond_mem_resp_msg_v01 resp = {}; 228259cf57abSJeff Johnson struct qmi_txn txn; 2283d8899132SKalle Valo int ret = 0, i; 2284d8899132SKalle Valo bool delayed; 2285d8899132SKalle Valo 2286d8899132SKalle Valo req = kzalloc(sizeof(*req), GFP_KERNEL); 2287d8899132SKalle Valo if (!req) 2288d8899132SKalle Valo return -ENOMEM; 2289d8899132SKalle Valo 2290d8899132SKalle Valo /* Some targets by default request a block of big contiguous 2291d8899132SKalle Valo * DMA memory, it's hard to allocate from kernel. So host returns 2292d8899132SKalle Valo * failure to firmware and firmware then request multiple blocks of 2293d8899132SKalle Valo * small chunk size memory. 2294d8899132SKalle Valo */ 2295d8899132SKalle Valo if (ab->qmi.target_mem_delayed) { 2296d8899132SKalle Valo delayed = true; 2297d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi delays mem_request %d\n", 2298d8899132SKalle Valo ab->qmi.mem_seg_count); 2299d8899132SKalle Valo } else { 2300d8899132SKalle Valo delayed = false; 2301d8899132SKalle Valo req->mem_seg_len = ab->qmi.mem_seg_count; 2302d8899132SKalle Valo for (i = 0; i < req->mem_seg_len ; i++) { 2303d8899132SKalle Valo req->mem_seg[i].addr = ab->qmi.target_mem[i].paddr; 2304d8899132SKalle Valo req->mem_seg[i].size = ab->qmi.target_mem[i].size; 2305d8899132SKalle Valo req->mem_seg[i].type = ab->qmi.target_mem[i].type; 2306d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, 2307d8899132SKalle Valo "qmi req mem_seg[%d] %pad %u %u\n", i, 2308d8899132SKalle Valo &ab->qmi.target_mem[i].paddr, 2309d8899132SKalle Valo ab->qmi.target_mem[i].size, 2310d8899132SKalle Valo ab->qmi.target_mem[i].type); 2311d8899132SKalle Valo } 2312d8899132SKalle Valo } 2313d8899132SKalle Valo 2314d8899132SKalle Valo ret = qmi_txn_init(&ab->qmi.handle, &txn, 2315d8899132SKalle Valo qmi_wlanfw_respond_mem_resp_msg_v01_ei, &resp); 2316d8899132SKalle Valo if (ret < 0) 2317d8899132SKalle Valo goto out; 2318d8899132SKalle Valo 2319d8899132SKalle Valo ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2320d8899132SKalle Valo QMI_WLANFW_RESPOND_MEM_REQ_V01, 2321d8899132SKalle Valo QMI_WLANFW_RESPOND_MEM_REQ_MSG_V01_MAX_LEN, 2322d8899132SKalle Valo qmi_wlanfw_respond_mem_req_msg_v01_ei, req); 2323d8899132SKalle Valo if (ret < 0) { 23242e82b5f0SJeff Johnson qmi_txn_cancel(&txn); 2325d8899132SKalle Valo ath12k_warn(ab, "qmi failed to respond memory request, err = %d\n", 2326d8899132SKalle Valo ret); 2327d8899132SKalle Valo goto out; 2328d8899132SKalle Valo } 2329d8899132SKalle Valo 2330d8899132SKalle Valo ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2331d8899132SKalle Valo if (ret < 0) { 2332d8899132SKalle Valo ath12k_warn(ab, "qmi failed memory request, err = %d\n", ret); 2333d8899132SKalle Valo goto out; 2334d8899132SKalle Valo } 2335d8899132SKalle Valo 2336d8899132SKalle Valo if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2337d8899132SKalle Valo /* the error response is expected when 2338d8899132SKalle Valo * target_mem_delayed is true. 2339d8899132SKalle Valo */ 2340d8899132SKalle Valo if (delayed && resp.resp.error == 0) 2341d8899132SKalle Valo goto out; 2342d8899132SKalle Valo 2343d8899132SKalle Valo ath12k_warn(ab, "Respond mem req failed, result: %d, err: %d\n", 2344d8899132SKalle Valo resp.resp.result, resp.resp.error); 2345d8899132SKalle Valo ret = -EINVAL; 2346d8899132SKalle Valo goto out; 2347d8899132SKalle Valo } 2348d8899132SKalle Valo out: 2349d8899132SKalle Valo kfree(req); 2350d8899132SKalle Valo return ret; 2351d8899132SKalle Valo } 2352d8899132SKalle Valo 2353d8899132SKalle Valo static void ath12k_qmi_free_target_mem_chunk(struct ath12k_base *ab) 2354d8899132SKalle Valo { 2355d8899132SKalle Valo int i; 2356d8899132SKalle Valo 2357d8899132SKalle Valo for (i = 0; i < ab->qmi.mem_seg_count; i++) { 2358d8899132SKalle Valo if (!ab->qmi.target_mem[i].v.addr) 2359d8899132SKalle Valo continue; 2360303c0178SBaochen Qiang 2361d8899132SKalle Valo dma_free_coherent(ab->dev, 2362303c0178SBaochen Qiang ab->qmi.target_mem[i].prev_size, 2363d8899132SKalle Valo ab->qmi.target_mem[i].v.addr, 2364d8899132SKalle Valo ab->qmi.target_mem[i].paddr); 2365d8899132SKalle Valo ab->qmi.target_mem[i].v.addr = NULL; 2366d8899132SKalle Valo } 2367d8899132SKalle Valo } 2368d8899132SKalle Valo 2369d8899132SKalle Valo static int ath12k_qmi_alloc_target_mem_chunk(struct ath12k_base *ab) 2370d8899132SKalle Valo { 2371d8899132SKalle Valo int i; 2372d8899132SKalle Valo struct target_mem_chunk *chunk; 2373d8899132SKalle Valo 2374d8899132SKalle Valo ab->qmi.target_mem_delayed = false; 2375d8899132SKalle Valo 2376d8899132SKalle Valo for (i = 0; i < ab->qmi.mem_seg_count; i++) { 2377d8899132SKalle Valo chunk = &ab->qmi.target_mem[i]; 2378d8899132SKalle Valo 2379d8899132SKalle Valo /* Allocate memory for the region and the functionality supported 2380d8899132SKalle Valo * on the host. For the non-supported memory region, host does not 2381d8899132SKalle Valo * allocate memory, assigns NULL and FW will handle this without crashing. 2382d8899132SKalle Valo */ 2383d8899132SKalle Valo switch (chunk->type) { 2384d8899132SKalle Valo case HOST_DDR_REGION_TYPE: 2385d8899132SKalle Valo case M3_DUMP_REGION_TYPE: 2386d8899132SKalle Valo case PAGEABLE_MEM_REGION_TYPE: 2387d8899132SKalle Valo case CALDB_MEM_REGION_TYPE: 2388303c0178SBaochen Qiang /* Firmware reloads in recovery/resume. 2389303c0178SBaochen Qiang * In such cases, no need to allocate memory for FW again. 2390303c0178SBaochen Qiang */ 2391303c0178SBaochen Qiang if (chunk->v.addr) { 2392303c0178SBaochen Qiang if (chunk->prev_type == chunk->type && 2393303c0178SBaochen Qiang chunk->prev_size == chunk->size) 2394303c0178SBaochen Qiang goto this_chunk_done; 2395303c0178SBaochen Qiang 2396303c0178SBaochen Qiang /* cannot reuse the existing chunk */ 2397303c0178SBaochen Qiang dma_free_coherent(ab->dev, chunk->prev_size, 2398303c0178SBaochen Qiang chunk->v.addr, chunk->paddr); 2399303c0178SBaochen Qiang chunk->v.addr = NULL; 2400303c0178SBaochen Qiang } 2401303c0178SBaochen Qiang 2402d8899132SKalle Valo chunk->v.addr = dma_alloc_coherent(ab->dev, 2403d8899132SKalle Valo chunk->size, 2404d8899132SKalle Valo &chunk->paddr, 2405d8899132SKalle Valo GFP_KERNEL | __GFP_NOWARN); 2406d8899132SKalle Valo if (!chunk->v.addr) { 2407d8899132SKalle Valo if (chunk->size > ATH12K_QMI_MAX_CHUNK_SIZE) { 2408d8899132SKalle Valo ab->qmi.target_mem_delayed = true; 2409d8899132SKalle Valo ath12k_warn(ab, 2410d8899132SKalle Valo "qmi dma allocation failed (%d B type %u), will try later with small size\n", 2411d8899132SKalle Valo chunk->size, 2412d8899132SKalle Valo chunk->type); 2413d8899132SKalle Valo ath12k_qmi_free_target_mem_chunk(ab); 2414d8899132SKalle Valo return 0; 2415d8899132SKalle Valo } 2416d8899132SKalle Valo ath12k_warn(ab, "memory allocation failure for %u size: %d\n", 2417d8899132SKalle Valo chunk->type, chunk->size); 2418d8899132SKalle Valo return -ENOMEM; 2419d8899132SKalle Valo } 2420303c0178SBaochen Qiang 2421303c0178SBaochen Qiang chunk->prev_type = chunk->type; 2422303c0178SBaochen Qiang chunk->prev_size = chunk->size; 2423303c0178SBaochen Qiang this_chunk_done: 2424d8899132SKalle Valo break; 2425d8899132SKalle Valo default: 2426d8899132SKalle Valo ath12k_warn(ab, "memory type %u not supported\n", 2427d8899132SKalle Valo chunk->type); 2428d8899132SKalle Valo chunk->paddr = 0; 2429d8899132SKalle Valo chunk->v.addr = NULL; 2430d8899132SKalle Valo break; 2431d8899132SKalle Valo } 2432d8899132SKalle Valo } 2433d8899132SKalle Valo return 0; 2434d8899132SKalle Valo } 2435d8899132SKalle Valo 2436d8899132SKalle Valo static int ath12k_qmi_request_target_cap(struct ath12k_base *ab) 2437d8899132SKalle Valo { 24386d2b0a06SJeff Johnson struct qmi_wlanfw_cap_req_msg_v01 req = {}; 24396d2b0a06SJeff Johnson struct qmi_wlanfw_cap_resp_msg_v01 resp = {}; 244059cf57abSJeff Johnson struct qmi_txn txn; 2441d8899132SKalle Valo unsigned int board_id = ATH12K_BOARD_ID_DEFAULT; 2442d8899132SKalle Valo int ret = 0; 24437d9832e3SWen Gong int r; 2444d8899132SKalle Valo int i; 2445d8899132SKalle Valo 2446d8899132SKalle Valo ret = qmi_txn_init(&ab->qmi.handle, &txn, 2447d8899132SKalle Valo qmi_wlanfw_cap_resp_msg_v01_ei, &resp); 2448d8899132SKalle Valo if (ret < 0) 2449d8899132SKalle Valo goto out; 2450d8899132SKalle Valo 2451d8899132SKalle Valo ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2452d8899132SKalle Valo QMI_WLANFW_CAP_REQ_V01, 2453d8899132SKalle Valo QMI_WLANFW_CAP_REQ_MSG_V01_MAX_LEN, 2454d8899132SKalle Valo qmi_wlanfw_cap_req_msg_v01_ei, &req); 2455d8899132SKalle Valo if (ret < 0) { 24562e82b5f0SJeff Johnson qmi_txn_cancel(&txn); 2457d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send target cap request, err = %d\n", 2458d8899132SKalle Valo ret); 2459d8899132SKalle Valo goto out; 2460d8899132SKalle Valo } 2461d8899132SKalle Valo 2462d8899132SKalle Valo ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2463d8899132SKalle Valo if (ret < 0) { 2464d8899132SKalle Valo ath12k_warn(ab, "qmi failed target cap request %d\n", ret); 2465d8899132SKalle Valo goto out; 2466d8899132SKalle Valo } 2467d8899132SKalle Valo 2468d8899132SKalle Valo if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2469d8899132SKalle Valo ath12k_warn(ab, "qmi targetcap req failed, result: %d, err: %d\n", 2470d8899132SKalle Valo resp.resp.result, resp.resp.error); 2471d8899132SKalle Valo ret = -EINVAL; 2472d8899132SKalle Valo goto out; 2473d8899132SKalle Valo } 2474d8899132SKalle Valo 2475d8899132SKalle Valo if (resp.chip_info_valid) { 2476d8899132SKalle Valo ab->qmi.target.chip_id = resp.chip_info.chip_id; 2477d8899132SKalle Valo ab->qmi.target.chip_family = resp.chip_info.chip_family; 2478d8899132SKalle Valo } 2479d8899132SKalle Valo 2480d8899132SKalle Valo if (resp.board_info_valid) 2481d8899132SKalle Valo ab->qmi.target.board_id = resp.board_info.board_id; 2482d8899132SKalle Valo else 2483d8899132SKalle Valo ab->qmi.target.board_id = board_id; 2484d8899132SKalle Valo 2485d8899132SKalle Valo if (resp.soc_info_valid) 2486d8899132SKalle Valo ab->qmi.target.soc_id = resp.soc_info.soc_id; 2487d8899132SKalle Valo 2488d8899132SKalle Valo if (resp.fw_version_info_valid) { 2489d8899132SKalle Valo ab->qmi.target.fw_version = resp.fw_version_info.fw_version; 2490d8899132SKalle Valo strscpy(ab->qmi.target.fw_build_timestamp, 2491d8899132SKalle Valo resp.fw_version_info.fw_build_timestamp, 2492d8899132SKalle Valo sizeof(ab->qmi.target.fw_build_timestamp)); 2493d8899132SKalle Valo } 2494d8899132SKalle Valo 2495d8899132SKalle Valo if (resp.fw_build_id_valid) 2496d8899132SKalle Valo strscpy(ab->qmi.target.fw_build_id, resp.fw_build_id, 2497d8899132SKalle Valo sizeof(ab->qmi.target.fw_build_id)); 2498d8899132SKalle Valo 2499d8899132SKalle Valo if (resp.dev_mem_info_valid) { 2500d8899132SKalle Valo for (i = 0; i < ATH12K_QMI_WLFW_MAX_DEV_MEM_NUM_V01; i++) { 2501d8899132SKalle Valo ab->qmi.dev_mem[i].start = 2502d8899132SKalle Valo resp.dev_mem[i].start; 2503d8899132SKalle Valo ab->qmi.dev_mem[i].size = 2504d8899132SKalle Valo resp.dev_mem[i].size; 2505d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, 2506*af69d862SJeff Johnson "devmem [%d] start 0x%llx size %llu\n", i, 2507d8899132SKalle Valo ab->qmi.dev_mem[i].start, 2508d8899132SKalle Valo ab->qmi.dev_mem[i].size); 2509d8899132SKalle Valo } 2510d8899132SKalle Valo } 2511d8899132SKalle Valo 2512d8899132SKalle Valo if (resp.eeprom_caldata_read_timeout_valid) { 2513d8899132SKalle Valo ab->qmi.target.eeprom_caldata = resp.eeprom_caldata_read_timeout; 2514d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi cal data supported from eeprom\n"); 2515d8899132SKalle Valo } 2516d8899132SKalle Valo 2517d8899132SKalle Valo ath12k_info(ab, "chip_id 0x%x chip_family 0x%x board_id 0x%x soc_id 0x%x\n", 2518d8899132SKalle Valo ab->qmi.target.chip_id, ab->qmi.target.chip_family, 2519d8899132SKalle Valo ab->qmi.target.board_id, ab->qmi.target.soc_id); 2520d8899132SKalle Valo 2521d8899132SKalle Valo ath12k_info(ab, "fw_version 0x%x fw_build_timestamp %s fw_build_id %s", 2522d8899132SKalle Valo ab->qmi.target.fw_version, 2523d8899132SKalle Valo ab->qmi.target.fw_build_timestamp, 2524d8899132SKalle Valo ab->qmi.target.fw_build_id); 2525d8899132SKalle Valo 25267d9832e3SWen Gong r = ath12k_core_check_smbios(ab); 25277d9832e3SWen Gong if (r) 25287d9832e3SWen Gong ath12k_dbg(ab, ATH12K_DBG_QMI, "SMBIOS bdf variant name not set.\n"); 25297d9832e3SWen Gong 2530d8899132SKalle Valo out: 2531d8899132SKalle Valo return ret; 2532d8899132SKalle Valo } 2533d8899132SKalle Valo 2534d8899132SKalle Valo static int ath12k_qmi_load_file_target_mem(struct ath12k_base *ab, 2535d8899132SKalle Valo const u8 *data, u32 len, u8 type) 2536d8899132SKalle Valo { 2537d8899132SKalle Valo struct qmi_wlanfw_bdf_download_req_msg_v01 *req; 25386d2b0a06SJeff Johnson struct qmi_wlanfw_bdf_download_resp_msg_v01 resp = {}; 253959cf57abSJeff Johnson struct qmi_txn txn; 2540d8899132SKalle Valo const u8 *temp = data; 2541bb0b0a6bSJeff Johnson int ret = 0; 2542d8899132SKalle Valo u32 remaining = len; 2543d8899132SKalle Valo 2544d8899132SKalle Valo req = kzalloc(sizeof(*req), GFP_KERNEL); 2545d8899132SKalle Valo if (!req) 2546d8899132SKalle Valo return -ENOMEM; 2547d8899132SKalle Valo 2548d8899132SKalle Valo while (remaining) { 2549d8899132SKalle Valo req->valid = 1; 2550d8899132SKalle Valo req->file_id_valid = 1; 2551d8899132SKalle Valo req->file_id = ab->qmi.target.board_id; 2552d8899132SKalle Valo req->total_size_valid = 1; 2553d8899132SKalle Valo req->total_size = remaining; 2554d8899132SKalle Valo req->seg_id_valid = 1; 2555d8899132SKalle Valo req->data_valid = 1; 2556d8899132SKalle Valo req->bdf_type = type; 2557d8899132SKalle Valo req->bdf_type_valid = 1; 2558d8899132SKalle Valo req->end_valid = 1; 2559d8899132SKalle Valo req->end = 0; 2560d8899132SKalle Valo 2561d8899132SKalle Valo if (remaining > QMI_WLANFW_MAX_DATA_SIZE_V01) { 2562d8899132SKalle Valo req->data_len = QMI_WLANFW_MAX_DATA_SIZE_V01; 2563d8899132SKalle Valo } else { 2564d8899132SKalle Valo req->data_len = remaining; 2565d8899132SKalle Valo req->end = 1; 2566d8899132SKalle Valo } 2567d8899132SKalle Valo 2568d8899132SKalle Valo if (type == ATH12K_QMI_FILE_TYPE_EEPROM) { 2569d8899132SKalle Valo req->data_valid = 0; 2570d8899132SKalle Valo req->end = 1; 2571d8899132SKalle Valo req->data_len = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE; 2572d8899132SKalle Valo } else { 2573d8899132SKalle Valo memcpy(req->data, temp, req->data_len); 2574d8899132SKalle Valo } 2575d8899132SKalle Valo 2576d8899132SKalle Valo ret = qmi_txn_init(&ab->qmi.handle, &txn, 2577d8899132SKalle Valo qmi_wlanfw_bdf_download_resp_msg_v01_ei, 2578d8899132SKalle Valo &resp); 2579d8899132SKalle Valo if (ret < 0) 2580d8899132SKalle Valo goto out; 2581d8899132SKalle Valo 2582d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf download req fixed addr type %d\n", 2583d8899132SKalle Valo type); 2584d8899132SKalle Valo 2585d8899132SKalle Valo ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2586d8899132SKalle Valo QMI_WLANFW_BDF_DOWNLOAD_REQ_V01, 2587d8899132SKalle Valo QMI_WLANFW_BDF_DOWNLOAD_REQ_MSG_V01_MAX_LEN, 2588d8899132SKalle Valo qmi_wlanfw_bdf_download_req_msg_v01_ei, req); 2589d8899132SKalle Valo if (ret < 0) { 2590d8899132SKalle Valo qmi_txn_cancel(&txn); 2591d8899132SKalle Valo goto out; 2592d8899132SKalle Valo } 2593d8899132SKalle Valo 2594d8899132SKalle Valo ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2595d8899132SKalle Valo if (ret < 0) 2596d8899132SKalle Valo goto out; 2597d8899132SKalle Valo 2598d8899132SKalle Valo if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2599d8899132SKalle Valo ath12k_warn(ab, "qmi BDF download failed, result: %d, err: %d\n", 2600d8899132SKalle Valo resp.resp.result, resp.resp.error); 2601d8899132SKalle Valo ret = -EINVAL; 2602d8899132SKalle Valo goto out; 2603d8899132SKalle Valo } 2604d8899132SKalle Valo 2605801fc159SDinesh Karthikeyan if (type == ATH12K_QMI_FILE_TYPE_EEPROM) { 2606801fc159SDinesh Karthikeyan remaining = 0; 2607801fc159SDinesh Karthikeyan } else { 2608d8899132SKalle Valo remaining -= req->data_len; 2609d8899132SKalle Valo temp += req->data_len; 2610d8899132SKalle Valo req->seg_id++; 2611d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, 2612d8899132SKalle Valo "qmi bdf download request remaining %i\n", 2613d8899132SKalle Valo remaining); 2614d8899132SKalle Valo } 2615801fc159SDinesh Karthikeyan } 2616d8899132SKalle Valo 2617d8899132SKalle Valo out: 2618d8899132SKalle Valo kfree(req); 2619d8899132SKalle Valo return ret; 2620d8899132SKalle Valo } 2621d8899132SKalle Valo 2622d8899132SKalle Valo static int ath12k_qmi_load_bdf_qmi(struct ath12k_base *ab, 2623d8899132SKalle Valo enum ath12k_qmi_bdf_type type) 2624d8899132SKalle Valo { 2625d8899132SKalle Valo struct device *dev = ab->dev; 2626d8899132SKalle Valo char filename[ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE]; 2627d8899132SKalle Valo const struct firmware *fw_entry; 2628d8899132SKalle Valo struct ath12k_board_data bd; 2629d8899132SKalle Valo u32 fw_size, file_type; 2630d8899132SKalle Valo int ret = 0; 2631d8899132SKalle Valo const u8 *tmp; 2632d8899132SKalle Valo 2633d8899132SKalle Valo memset(&bd, 0, sizeof(bd)); 2634d8899132SKalle Valo 2635d8899132SKalle Valo switch (type) { 2636d8899132SKalle Valo case ATH12K_QMI_BDF_TYPE_ELF: 2637d8899132SKalle Valo ret = ath12k_core_fetch_bdf(ab, &bd); 2638d8899132SKalle Valo if (ret) { 2639d8899132SKalle Valo ath12k_warn(ab, "qmi failed to load bdf:\n"); 2640d8899132SKalle Valo goto out; 2641d8899132SKalle Valo } 2642d8899132SKalle Valo 2643d8899132SKalle Valo if (bd.len >= SELFMAG && memcmp(bd.data, ELFMAG, SELFMAG) == 0) 2644d8899132SKalle Valo type = ATH12K_QMI_BDF_TYPE_ELF; 2645d8899132SKalle Valo else 2646d8899132SKalle Valo type = ATH12K_QMI_BDF_TYPE_BIN; 2647d8899132SKalle Valo 2648d8899132SKalle Valo break; 2649d8899132SKalle Valo case ATH12K_QMI_BDF_TYPE_REGDB: 265051120745SWen Gong ret = ath12k_core_fetch_regdb(ab, &bd); 2651d8899132SKalle Valo if (ret) { 2652d8899132SKalle Valo ath12k_warn(ab, "qmi failed to load regdb bin:\n"); 2653d8899132SKalle Valo goto out; 2654d8899132SKalle Valo } 2655d8899132SKalle Valo break; 265642982259SDinesh Karthikeyan case ATH12K_QMI_BDF_TYPE_CALIBRATION: 2657d8899132SKalle Valo 2658d8899132SKalle Valo if (ab->qmi.target.eeprom_caldata) { 2659801fc159SDinesh Karthikeyan file_type = ATH12K_QMI_FILE_TYPE_EEPROM; 2660d8899132SKalle Valo tmp = filename; 2661d8899132SKalle Valo fw_size = ATH12K_QMI_MAX_BDF_FILE_NAME_SIZE; 2662d8899132SKalle Valo } else { 2663d8899132SKalle Valo file_type = ATH12K_QMI_FILE_TYPE_CALDATA; 2664d8899132SKalle Valo 2665d8899132SKalle Valo /* cal-<bus>-<id>.bin */ 2666d8899132SKalle Valo snprintf(filename, sizeof(filename), "cal-%s-%s.bin", 2667d8899132SKalle Valo ath12k_bus_str(ab->hif.bus), dev_name(dev)); 2668d8899132SKalle Valo fw_entry = ath12k_core_firmware_request(ab, filename); 2669d8899132SKalle Valo if (!IS_ERR(fw_entry)) 2670d8899132SKalle Valo goto success; 2671d8899132SKalle Valo 267242982259SDinesh Karthikeyan fw_entry = ath12k_core_firmware_request(ab, 267342982259SDinesh Karthikeyan ATH12K_DEFAULT_CAL_FILE); 2674d8899132SKalle Valo if (IS_ERR(fw_entry)) { 2675d8899132SKalle Valo ret = PTR_ERR(fw_entry); 2676d8899132SKalle Valo ath12k_warn(ab, 2677d8899132SKalle Valo "qmi failed to load CAL data file:%s\n", 2678d8899132SKalle Valo filename); 2679d8899132SKalle Valo goto out; 2680d8899132SKalle Valo } 2681d8899132SKalle Valo 2682d8899132SKalle Valo success: 268342982259SDinesh Karthikeyan fw_size = min_t(u32, ab->hw_params->fw.board_size, 268442982259SDinesh Karthikeyan fw_entry->size); 2685d8899132SKalle Valo tmp = fw_entry->data; 2686d8899132SKalle Valo } 2687d8899132SKalle Valo ret = ath12k_qmi_load_file_target_mem(ab, tmp, fw_size, file_type); 2688d8899132SKalle Valo if (ret < 0) { 2689d8899132SKalle Valo ath12k_warn(ab, "qmi failed to load caldata\n"); 2690d8899132SKalle Valo goto out_qmi_cal; 2691d8899132SKalle Valo } 2692d8899132SKalle Valo 2693d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi caldata downloaded: type: %u\n", 2694d8899132SKalle Valo file_type); 2695d8899132SKalle Valo 2696d8899132SKalle Valo out_qmi_cal: 2697d8899132SKalle Valo if (!ab->qmi.target.eeprom_caldata) 2698d8899132SKalle Valo release_firmware(fw_entry); 269942982259SDinesh Karthikeyan return ret; 270042982259SDinesh Karthikeyan default: 270142982259SDinesh Karthikeyan ath12k_warn(ab, "unknown file type for load %d", type); 270242982259SDinesh Karthikeyan goto out; 270342982259SDinesh Karthikeyan } 270442982259SDinesh Karthikeyan 270542982259SDinesh Karthikeyan ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi bdf_type %d\n", type); 270642982259SDinesh Karthikeyan 270742982259SDinesh Karthikeyan fw_size = min_t(u32, ab->hw_params->fw.board_size, bd.len); 270842982259SDinesh Karthikeyan 270942982259SDinesh Karthikeyan ret = ath12k_qmi_load_file_target_mem(ab, bd.data, fw_size, type); 271042982259SDinesh Karthikeyan if (ret < 0) 271142982259SDinesh Karthikeyan ath12k_warn(ab, "qmi failed to load bdf file\n"); 271242982259SDinesh Karthikeyan 2713d8899132SKalle Valo out: 2714d8899132SKalle Valo ath12k_core_free_bdf(ab, &bd); 2715d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi BDF download sequence completed\n"); 2716d8899132SKalle Valo 2717d8899132SKalle Valo return ret; 2718d8899132SKalle Valo } 2719d8899132SKalle Valo 272005090ae8SBaochen Qiang static void ath12k_qmi_m3_free(struct ath12k_base *ab) 272105090ae8SBaochen Qiang { 272205090ae8SBaochen Qiang struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 272305090ae8SBaochen Qiang 272405090ae8SBaochen Qiang if (!m3_mem->vaddr) 272505090ae8SBaochen Qiang return; 272605090ae8SBaochen Qiang 272705090ae8SBaochen Qiang dma_free_coherent(ab->dev, m3_mem->size, 272805090ae8SBaochen Qiang m3_mem->vaddr, m3_mem->paddr); 272905090ae8SBaochen Qiang m3_mem->vaddr = NULL; 273005090ae8SBaochen Qiang m3_mem->size = 0; 273105090ae8SBaochen Qiang } 273205090ae8SBaochen Qiang 2733d8899132SKalle Valo static int ath12k_qmi_m3_load(struct ath12k_base *ab) 2734d8899132SKalle Valo { 2735d8899132SKalle Valo struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 273612f491cdSRaj Kumar Bhagat const struct firmware *fw = NULL; 273712f491cdSRaj Kumar Bhagat const void *m3_data; 2738d8899132SKalle Valo char path[100]; 273912f491cdSRaj Kumar Bhagat size_t m3_len; 2740d8899132SKalle Valo int ret; 2741d8899132SKalle Valo 274212f491cdSRaj Kumar Bhagat if (ab->fw.m3_data && ab->fw.m3_len > 0) { 274312f491cdSRaj Kumar Bhagat /* firmware-N.bin had a m3 firmware file so use that */ 274412f491cdSRaj Kumar Bhagat m3_data = ab->fw.m3_data; 274512f491cdSRaj Kumar Bhagat m3_len = ab->fw.m3_len; 274612f491cdSRaj Kumar Bhagat } else { 274712f491cdSRaj Kumar Bhagat /* No m3 file in firmware-N.bin so try to request old 274812f491cdSRaj Kumar Bhagat * separate m3.bin. 274912f491cdSRaj Kumar Bhagat */ 2750d8899132SKalle Valo fw = ath12k_core_firmware_request(ab, ATH12K_M3_FILE); 2751d8899132SKalle Valo if (IS_ERR(fw)) { 2752d8899132SKalle Valo ret = PTR_ERR(fw); 2753d8899132SKalle Valo ath12k_core_create_firmware_path(ab, ATH12K_M3_FILE, 2754d8899132SKalle Valo path, sizeof(path)); 2755d8899132SKalle Valo ath12k_err(ab, "failed to load %s: %d\n", path, ret); 2756d8899132SKalle Valo return ret; 2757d8899132SKalle Valo } 2758d8899132SKalle Valo 275912f491cdSRaj Kumar Bhagat m3_data = fw->data; 276012f491cdSRaj Kumar Bhagat m3_len = fw->size; 276112f491cdSRaj Kumar Bhagat } 276212f491cdSRaj Kumar Bhagat 276305090ae8SBaochen Qiang /* In recovery/resume cases, M3 buffer is not freed, try to reuse that */ 276405090ae8SBaochen Qiang if (m3_mem->vaddr) { 276505090ae8SBaochen Qiang if (m3_mem->size >= m3_len) 2766303c0178SBaochen Qiang goto skip_m3_alloc; 2767303c0178SBaochen Qiang 276805090ae8SBaochen Qiang /* Old buffer is too small, free and reallocate */ 276905090ae8SBaochen Qiang ath12k_qmi_m3_free(ab); 277005090ae8SBaochen Qiang } 277105090ae8SBaochen Qiang 2772d8899132SKalle Valo m3_mem->vaddr = dma_alloc_coherent(ab->dev, 277312f491cdSRaj Kumar Bhagat m3_len, &m3_mem->paddr, 2774d8899132SKalle Valo GFP_KERNEL); 2775d8899132SKalle Valo if (!m3_mem->vaddr) { 2776d8899132SKalle Valo ath12k_err(ab, "failed to allocate memory for M3 with size %zu\n", 2777d8899132SKalle Valo fw->size); 277812f491cdSRaj Kumar Bhagat ret = -ENOMEM; 277912f491cdSRaj Kumar Bhagat goto out; 2780d8899132SKalle Valo } 2781d8899132SKalle Valo 2782303c0178SBaochen Qiang skip_m3_alloc: 278312f491cdSRaj Kumar Bhagat memcpy(m3_mem->vaddr, m3_data, m3_len); 278412f491cdSRaj Kumar Bhagat m3_mem->size = m3_len; 278512f491cdSRaj Kumar Bhagat 278612f491cdSRaj Kumar Bhagat ret = 0; 278712f491cdSRaj Kumar Bhagat 278812f491cdSRaj Kumar Bhagat out: 2789d8899132SKalle Valo release_firmware(fw); 2790d8899132SKalle Valo 279112f491cdSRaj Kumar Bhagat return ret; 2792d8899132SKalle Valo } 2793d8899132SKalle Valo 2794d8899132SKalle Valo static int ath12k_qmi_wlanfw_m3_info_send(struct ath12k_base *ab) 2795d8899132SKalle Valo { 2796d8899132SKalle Valo struct m3_mem_region *m3_mem = &ab->qmi.m3_mem; 27976d2b0a06SJeff Johnson struct qmi_wlanfw_m3_info_req_msg_v01 req = {}; 27986d2b0a06SJeff Johnson struct qmi_wlanfw_m3_info_resp_msg_v01 resp = {}; 279959cf57abSJeff Johnson struct qmi_txn txn; 2800d8899132SKalle Valo int ret = 0; 2801d8899132SKalle Valo 2802d8899132SKalle Valo ret = ath12k_qmi_m3_load(ab); 2803d8899132SKalle Valo if (ret) { 2804d8899132SKalle Valo ath12k_err(ab, "failed to load m3 firmware: %d", ret); 2805d8899132SKalle Valo return ret; 2806d8899132SKalle Valo } 2807d8899132SKalle Valo 2808d8899132SKalle Valo req.addr = m3_mem->paddr; 2809d8899132SKalle Valo req.size = m3_mem->size; 2810d8899132SKalle Valo 2811d8899132SKalle Valo ret = qmi_txn_init(&ab->qmi.handle, &txn, 2812d8899132SKalle Valo qmi_wlanfw_m3_info_resp_msg_v01_ei, &resp); 2813d8899132SKalle Valo if (ret < 0) 2814d8899132SKalle Valo goto out; 2815d8899132SKalle Valo 2816d8899132SKalle Valo ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2817d8899132SKalle Valo QMI_WLANFW_M3_INFO_REQ_V01, 2818d8899132SKalle Valo QMI_WLANFW_M3_INFO_REQ_MSG_V01_MAX_MSG_LEN, 2819d8899132SKalle Valo qmi_wlanfw_m3_info_req_msg_v01_ei, &req); 2820d8899132SKalle Valo if (ret < 0) { 28212e82b5f0SJeff Johnson qmi_txn_cancel(&txn); 2822d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send M3 information request, err = %d\n", 2823d8899132SKalle Valo ret); 2824d8899132SKalle Valo goto out; 2825d8899132SKalle Valo } 2826d8899132SKalle Valo 2827d8899132SKalle Valo ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2828d8899132SKalle Valo if (ret < 0) { 2829d8899132SKalle Valo ath12k_warn(ab, "qmi failed M3 information request %d\n", ret); 2830d8899132SKalle Valo goto out; 2831d8899132SKalle Valo } 2832d8899132SKalle Valo 2833d8899132SKalle Valo if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2834d8899132SKalle Valo ath12k_warn(ab, "qmi M3 info request failed, result: %d, err: %d\n", 2835d8899132SKalle Valo resp.resp.result, resp.resp.error); 2836d8899132SKalle Valo ret = -EINVAL; 2837d8899132SKalle Valo goto out; 2838d8899132SKalle Valo } 2839d8899132SKalle Valo out: 2840d8899132SKalle Valo return ret; 2841d8899132SKalle Valo } 2842d8899132SKalle Valo 2843d8899132SKalle Valo static int ath12k_qmi_wlanfw_mode_send(struct ath12k_base *ab, 2844d8899132SKalle Valo u32 mode) 2845d8899132SKalle Valo { 28466d2b0a06SJeff Johnson struct qmi_wlanfw_wlan_mode_req_msg_v01 req = {}; 28476d2b0a06SJeff Johnson struct qmi_wlanfw_wlan_mode_resp_msg_v01 resp = {}; 284859cf57abSJeff Johnson struct qmi_txn txn; 2849d8899132SKalle Valo int ret = 0; 2850d8899132SKalle Valo 2851d8899132SKalle Valo req.mode = mode; 2852d8899132SKalle Valo req.hw_debug_valid = 1; 2853d8899132SKalle Valo req.hw_debug = 0; 2854d8899132SKalle Valo 2855d8899132SKalle Valo ret = qmi_txn_init(&ab->qmi.handle, &txn, 2856d8899132SKalle Valo qmi_wlanfw_wlan_mode_resp_msg_v01_ei, &resp); 2857d8899132SKalle Valo if (ret < 0) 2858d8899132SKalle Valo goto out; 2859d8899132SKalle Valo 2860d8899132SKalle Valo ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2861d8899132SKalle Valo QMI_WLANFW_WLAN_MODE_REQ_V01, 2862d8899132SKalle Valo QMI_WLANFW_WLAN_MODE_REQ_MSG_V01_MAX_LEN, 2863d8899132SKalle Valo qmi_wlanfw_wlan_mode_req_msg_v01_ei, &req); 2864d8899132SKalle Valo if (ret < 0) { 28652e82b5f0SJeff Johnson qmi_txn_cancel(&txn); 2866d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send mode request, mode: %d, err = %d\n", 2867d8899132SKalle Valo mode, ret); 2868d8899132SKalle Valo goto out; 2869d8899132SKalle Valo } 2870d8899132SKalle Valo 2871d8899132SKalle Valo ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2872d8899132SKalle Valo if (ret < 0) { 2873d8899132SKalle Valo if (mode == ATH12K_FIRMWARE_MODE_OFF && ret == -ENETRESET) { 2874d8899132SKalle Valo ath12k_warn(ab, "WLFW service is dis-connected\n"); 2875d8899132SKalle Valo return 0; 2876d8899132SKalle Valo } 2877d8899132SKalle Valo ath12k_warn(ab, "qmi failed set mode request, mode: %d, err = %d\n", 2878d8899132SKalle Valo mode, ret); 2879d8899132SKalle Valo goto out; 2880d8899132SKalle Valo } 2881d8899132SKalle Valo 2882d8899132SKalle Valo if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2883d8899132SKalle Valo ath12k_warn(ab, "Mode request failed, mode: %d, result: %d err: %d\n", 2884d8899132SKalle Valo mode, resp.resp.result, resp.resp.error); 2885d8899132SKalle Valo ret = -EINVAL; 2886d8899132SKalle Valo goto out; 2887d8899132SKalle Valo } 2888d8899132SKalle Valo 2889d8899132SKalle Valo out: 2890d8899132SKalle Valo return ret; 2891d8899132SKalle Valo } 2892d8899132SKalle Valo 2893d8899132SKalle Valo static int ath12k_qmi_wlanfw_wlan_cfg_send(struct ath12k_base *ab) 2894d8899132SKalle Valo { 2895d8899132SKalle Valo struct qmi_wlanfw_wlan_cfg_req_msg_v01 *req; 28966d2b0a06SJeff Johnson struct qmi_wlanfw_wlan_cfg_resp_msg_v01 resp = {}; 2897d8899132SKalle Valo struct ce_pipe_config *ce_cfg; 2898d8899132SKalle Valo struct service_to_pipe *svc_cfg; 289959cf57abSJeff Johnson struct qmi_txn txn; 2900d8899132SKalle Valo int ret = 0, pipe_num; 2901d8899132SKalle Valo 2902d8899132SKalle Valo ce_cfg = (struct ce_pipe_config *)ab->qmi.ce_cfg.tgt_ce; 2903d8899132SKalle Valo svc_cfg = (struct service_to_pipe *)ab->qmi.ce_cfg.svc_to_ce_map; 2904d8899132SKalle Valo 2905d8899132SKalle Valo req = kzalloc(sizeof(*req), GFP_KERNEL); 2906d8899132SKalle Valo if (!req) 2907d8899132SKalle Valo return -ENOMEM; 2908d8899132SKalle Valo 2909d8899132SKalle Valo req->host_version_valid = 1; 2910d8899132SKalle Valo strscpy(req->host_version, ATH12K_HOST_VERSION_STRING, 2911d8899132SKalle Valo sizeof(req->host_version)); 2912d8899132SKalle Valo 2913d8899132SKalle Valo req->tgt_cfg_valid = 1; 2914d8899132SKalle Valo /* This is number of CE configs */ 2915d8899132SKalle Valo req->tgt_cfg_len = ab->qmi.ce_cfg.tgt_ce_len; 2916d8899132SKalle Valo for (pipe_num = 0; pipe_num < req->tgt_cfg_len ; pipe_num++) { 2917d8899132SKalle Valo req->tgt_cfg[pipe_num].pipe_num = ce_cfg[pipe_num].pipenum; 2918d8899132SKalle Valo req->tgt_cfg[pipe_num].pipe_dir = ce_cfg[pipe_num].pipedir; 2919d8899132SKalle Valo req->tgt_cfg[pipe_num].nentries = ce_cfg[pipe_num].nentries; 2920d8899132SKalle Valo req->tgt_cfg[pipe_num].nbytes_max = ce_cfg[pipe_num].nbytes_max; 2921d8899132SKalle Valo req->tgt_cfg[pipe_num].flags = ce_cfg[pipe_num].flags; 2922d8899132SKalle Valo } 2923d8899132SKalle Valo 2924d8899132SKalle Valo req->svc_cfg_valid = 1; 2925d8899132SKalle Valo /* This is number of Service/CE configs */ 2926d8899132SKalle Valo req->svc_cfg_len = ab->qmi.ce_cfg.svc_to_ce_map_len; 2927d8899132SKalle Valo for (pipe_num = 0; pipe_num < req->svc_cfg_len; pipe_num++) { 2928d8899132SKalle Valo req->svc_cfg[pipe_num].service_id = svc_cfg[pipe_num].service_id; 2929d8899132SKalle Valo req->svc_cfg[pipe_num].pipe_dir = svc_cfg[pipe_num].pipedir; 2930d8899132SKalle Valo req->svc_cfg[pipe_num].pipe_num = svc_cfg[pipe_num].pipenum; 2931d8899132SKalle Valo } 2932d8899132SKalle Valo 2933d8899132SKalle Valo /* set shadow v3 configuration */ 2934d8899132SKalle Valo if (ab->hw_params->supports_shadow_regs) { 2935d8899132SKalle Valo req->shadow_reg_v3_valid = 1; 2936d8899132SKalle Valo req->shadow_reg_v3_len = min_t(u32, 2937d8899132SKalle Valo ab->qmi.ce_cfg.shadow_reg_v3_len, 2938d8899132SKalle Valo QMI_WLANFW_MAX_NUM_SHADOW_REG_V3_V01); 2939d8899132SKalle Valo memcpy(&req->shadow_reg_v3, ab->qmi.ce_cfg.shadow_reg_v3, 2940d8899132SKalle Valo sizeof(u32) * req->shadow_reg_v3_len); 2941d8899132SKalle Valo } else { 2942d8899132SKalle Valo req->shadow_reg_v3_valid = 0; 2943d8899132SKalle Valo } 2944d8899132SKalle Valo 2945d8899132SKalle Valo ret = qmi_txn_init(&ab->qmi.handle, &txn, 2946d8899132SKalle Valo qmi_wlanfw_wlan_cfg_resp_msg_v01_ei, &resp); 2947d8899132SKalle Valo if (ret < 0) 2948d8899132SKalle Valo goto out; 2949d8899132SKalle Valo 2950d8899132SKalle Valo ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 2951d8899132SKalle Valo QMI_WLANFW_WLAN_CFG_REQ_V01, 2952d8899132SKalle Valo QMI_WLANFW_WLAN_CFG_REQ_MSG_V01_MAX_LEN, 2953d8899132SKalle Valo qmi_wlanfw_wlan_cfg_req_msg_v01_ei, req); 2954d8899132SKalle Valo if (ret < 0) { 29552e82b5f0SJeff Johnson qmi_txn_cancel(&txn); 2956d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send wlan config request, err = %d\n", 2957d8899132SKalle Valo ret); 2958d8899132SKalle Valo goto out; 2959d8899132SKalle Valo } 2960d8899132SKalle Valo 2961d8899132SKalle Valo ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 2962d8899132SKalle Valo if (ret < 0) { 2963d8899132SKalle Valo ath12k_warn(ab, "qmi failed wlan config request, err = %d\n", ret); 2964d8899132SKalle Valo goto out; 2965d8899132SKalle Valo } 2966d8899132SKalle Valo 2967d8899132SKalle Valo if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 2968d8899132SKalle Valo ath12k_warn(ab, "qmi wlan config request failed, result: %d, err: %d\n", 2969d8899132SKalle Valo resp.resp.result, resp.resp.error); 2970d8899132SKalle Valo ret = -EINVAL; 2971d8899132SKalle Valo goto out; 2972d8899132SKalle Valo } 2973d8899132SKalle Valo 2974d8899132SKalle Valo out: 2975d8899132SKalle Valo kfree(req); 2976d8899132SKalle Valo return ret; 2977d8899132SKalle Valo } 2978d8899132SKalle Valo 29799f9df1a2SBaochen Qiang static int ath12k_qmi_wlanfw_wlan_ini_send(struct ath12k_base *ab) 29809f9df1a2SBaochen Qiang { 29819f9df1a2SBaochen Qiang struct qmi_wlanfw_wlan_ini_resp_msg_v01 resp = {}; 29829f9df1a2SBaochen Qiang struct qmi_wlanfw_wlan_ini_req_msg_v01 req = {}; 29839f9df1a2SBaochen Qiang struct qmi_txn txn; 29849f9df1a2SBaochen Qiang int ret; 29859f9df1a2SBaochen Qiang 29869f9df1a2SBaochen Qiang req.enable_fwlog_valid = true; 29879f9df1a2SBaochen Qiang req.enable_fwlog = 1; 29889f9df1a2SBaochen Qiang 29899f9df1a2SBaochen Qiang ret = qmi_txn_init(&ab->qmi.handle, &txn, 29909f9df1a2SBaochen Qiang qmi_wlanfw_wlan_ini_resp_msg_v01_ei, &resp); 29919f9df1a2SBaochen Qiang if (ret < 0) 29929f9df1a2SBaochen Qiang goto out; 29939f9df1a2SBaochen Qiang 29949f9df1a2SBaochen Qiang ret = qmi_send_request(&ab->qmi.handle, NULL, &txn, 29959f9df1a2SBaochen Qiang ATH12K_QMI_WLANFW_WLAN_INI_REQ_V01, 29969f9df1a2SBaochen Qiang QMI_WLANFW_WLAN_INI_REQ_MSG_V01_MAX_LEN, 29979f9df1a2SBaochen Qiang qmi_wlanfw_wlan_ini_req_msg_v01_ei, &req); 29989f9df1a2SBaochen Qiang if (ret < 0) { 29999f9df1a2SBaochen Qiang qmi_txn_cancel(&txn); 30009f9df1a2SBaochen Qiang ath12k_warn(ab, "failed to send QMI wlan ini request: %d\n", 30019f9df1a2SBaochen Qiang ret); 30029f9df1a2SBaochen Qiang goto out; 30039f9df1a2SBaochen Qiang } 30049f9df1a2SBaochen Qiang 30059f9df1a2SBaochen Qiang ret = qmi_txn_wait(&txn, msecs_to_jiffies(ATH12K_QMI_WLANFW_TIMEOUT_MS)); 30069f9df1a2SBaochen Qiang if (ret < 0) { 30079f9df1a2SBaochen Qiang ath12k_warn(ab, "failed to receive QMI wlan ini request: %d\n", ret); 30089f9df1a2SBaochen Qiang goto out; 30099f9df1a2SBaochen Qiang } 30109f9df1a2SBaochen Qiang 30119f9df1a2SBaochen Qiang if (resp.resp.result != QMI_RESULT_SUCCESS_V01) { 30129f9df1a2SBaochen Qiang ath12k_warn(ab, "QMI wlan ini response failure: %d %d\n", 30139f9df1a2SBaochen Qiang resp.resp.result, resp.resp.error); 30149f9df1a2SBaochen Qiang ret = -EINVAL; 30159f9df1a2SBaochen Qiang goto out; 30169f9df1a2SBaochen Qiang } 30179f9df1a2SBaochen Qiang 30189f9df1a2SBaochen Qiang out: 30199f9df1a2SBaochen Qiang return ret; 30209f9df1a2SBaochen Qiang } 30219f9df1a2SBaochen Qiang 3022d8899132SKalle Valo void ath12k_qmi_firmware_stop(struct ath12k_base *ab) 3023d8899132SKalle Valo { 3024d8899132SKalle Valo int ret; 3025d8899132SKalle Valo 3026d8899132SKalle Valo ret = ath12k_qmi_wlanfw_mode_send(ab, ATH12K_FIRMWARE_MODE_OFF); 3027d8899132SKalle Valo if (ret < 0) { 3028d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send wlan mode off\n"); 3029d8899132SKalle Valo return; 3030d8899132SKalle Valo } 3031d8899132SKalle Valo } 3032d8899132SKalle Valo 3033d8899132SKalle Valo int ath12k_qmi_firmware_start(struct ath12k_base *ab, 3034d8899132SKalle Valo u32 mode) 3035d8899132SKalle Valo { 3036d8899132SKalle Valo int ret; 3037d8899132SKalle Valo 30389f9df1a2SBaochen Qiang ret = ath12k_qmi_wlanfw_wlan_ini_send(ab); 30399f9df1a2SBaochen Qiang if (ret < 0) { 30409f9df1a2SBaochen Qiang ath12k_warn(ab, "qmi failed to send wlan fw ini: %d\n", ret); 30419f9df1a2SBaochen Qiang return ret; 30429f9df1a2SBaochen Qiang } 30439f9df1a2SBaochen Qiang 3044d8899132SKalle Valo ret = ath12k_qmi_wlanfw_wlan_cfg_send(ab); 3045d8899132SKalle Valo if (ret < 0) { 3046d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send wlan cfg:%d\n", ret); 3047d8899132SKalle Valo return ret; 3048d8899132SKalle Valo } 3049d8899132SKalle Valo 3050d8899132SKalle Valo ret = ath12k_qmi_wlanfw_mode_send(ab, mode); 3051d8899132SKalle Valo if (ret < 0) { 3052d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send wlan fw mode:%d\n", ret); 3053d8899132SKalle Valo return ret; 3054d8899132SKalle Valo } 3055d8899132SKalle Valo 3056d8899132SKalle Valo return 0; 3057d8899132SKalle Valo } 3058d8899132SKalle Valo 3059d8899132SKalle Valo static int 3060d8899132SKalle Valo ath12k_qmi_driver_event_post(struct ath12k_qmi *qmi, 3061d8899132SKalle Valo enum ath12k_qmi_event_type type, 3062d8899132SKalle Valo void *data) 3063d8899132SKalle Valo { 3064d8899132SKalle Valo struct ath12k_qmi_driver_event *event; 3065d8899132SKalle Valo 3066d8899132SKalle Valo event = kzalloc(sizeof(*event), GFP_ATOMIC); 3067d8899132SKalle Valo if (!event) 3068d8899132SKalle Valo return -ENOMEM; 3069d8899132SKalle Valo 3070d8899132SKalle Valo event->type = type; 3071d8899132SKalle Valo event->data = data; 3072d8899132SKalle Valo 3073d8899132SKalle Valo spin_lock(&qmi->event_lock); 3074d8899132SKalle Valo list_add_tail(&event->list, &qmi->event_list); 3075d8899132SKalle Valo spin_unlock(&qmi->event_lock); 3076d8899132SKalle Valo 3077d8899132SKalle Valo queue_work(qmi->event_wq, &qmi->event_work); 3078d8899132SKalle Valo 3079d8899132SKalle Valo return 0; 3080d8899132SKalle Valo } 3081d8899132SKalle Valo 3082d8899132SKalle Valo static int ath12k_qmi_event_server_arrive(struct ath12k_qmi *qmi) 3083d8899132SKalle Valo { 3084d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3085d8899132SKalle Valo int ret; 3086d8899132SKalle Valo 308753a65445SKarthikeyan Periyasamy ath12k_qmi_phy_cap_send(ab); 308853a65445SKarthikeyan Periyasamy 3089d8899132SKalle Valo ret = ath12k_qmi_fw_ind_register_send(ab); 3090d8899132SKalle Valo if (ret < 0) { 3091d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send FW indication QMI:%d\n", ret); 3092d8899132SKalle Valo return ret; 3093d8899132SKalle Valo } 3094d8899132SKalle Valo 3095d8899132SKalle Valo ret = ath12k_qmi_host_cap_send(ab); 3096d8899132SKalle Valo if (ret < 0) { 3097d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send host cap QMI:%d\n", ret); 3098d8899132SKalle Valo return ret; 3099d8899132SKalle Valo } 3100d8899132SKalle Valo 3101d8899132SKalle Valo return ret; 3102d8899132SKalle Valo } 3103d8899132SKalle Valo 3104d8899132SKalle Valo static int ath12k_qmi_event_mem_request(struct ath12k_qmi *qmi) 3105d8899132SKalle Valo { 3106d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3107d8899132SKalle Valo int ret; 3108d8899132SKalle Valo 3109d8899132SKalle Valo ret = ath12k_qmi_respond_fw_mem_request(ab); 3110d8899132SKalle Valo if (ret < 0) { 3111d8899132SKalle Valo ath12k_warn(ab, "qmi failed to respond fw mem req:%d\n", ret); 3112d8899132SKalle Valo return ret; 3113d8899132SKalle Valo } 3114d8899132SKalle Valo 3115d8899132SKalle Valo return ret; 3116d8899132SKalle Valo } 3117d8899132SKalle Valo 3118d8899132SKalle Valo static int ath12k_qmi_event_load_bdf(struct ath12k_qmi *qmi) 3119d8899132SKalle Valo { 3120d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3121d8899132SKalle Valo int ret; 3122d8899132SKalle Valo 3123d8899132SKalle Valo ret = ath12k_qmi_request_target_cap(ab); 3124d8899132SKalle Valo if (ret < 0) { 3125d8899132SKalle Valo ath12k_warn(ab, "qmi failed to req target capabilities:%d\n", ret); 3126d8899132SKalle Valo return ret; 3127d8899132SKalle Valo } 3128d8899132SKalle Valo 3129d8899132SKalle Valo ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_REGDB); 3130d8899132SKalle Valo if (ret < 0) { 3131d8899132SKalle Valo ath12k_warn(ab, "qmi failed to load regdb file:%d\n", ret); 3132d8899132SKalle Valo return ret; 3133d8899132SKalle Valo } 3134d8899132SKalle Valo 3135d8899132SKalle Valo ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_ELF); 3136d8899132SKalle Valo if (ret < 0) { 3137d8899132SKalle Valo ath12k_warn(ab, "qmi failed to load board data file:%d\n", ret); 3138d8899132SKalle Valo return ret; 3139d8899132SKalle Valo } 3140d8899132SKalle Valo 314142982259SDinesh Karthikeyan if (ab->hw_params->download_calib) { 314242982259SDinesh Karthikeyan ret = ath12k_qmi_load_bdf_qmi(ab, ATH12K_QMI_BDF_TYPE_CALIBRATION); 314342982259SDinesh Karthikeyan if (ret < 0) 314442982259SDinesh Karthikeyan ath12k_warn(ab, "qmi failed to load calibrated data :%d\n", ret); 314542982259SDinesh Karthikeyan } 314642982259SDinesh Karthikeyan 3147d8899132SKalle Valo ret = ath12k_qmi_wlanfw_m3_info_send(ab); 3148d8899132SKalle Valo if (ret < 0) { 3149d8899132SKalle Valo ath12k_warn(ab, "qmi failed to send m3 info req:%d\n", ret); 3150d8899132SKalle Valo return ret; 3151d8899132SKalle Valo } 3152d8899132SKalle Valo 3153d8899132SKalle Valo return ret; 3154d8899132SKalle Valo } 3155d8899132SKalle Valo 3156d8899132SKalle Valo static void ath12k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl, 3157d8899132SKalle Valo struct sockaddr_qrtr *sq, 3158d8899132SKalle Valo struct qmi_txn *txn, 3159d8899132SKalle Valo const void *data) 3160d8899132SKalle Valo { 3161d8899132SKalle Valo struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 3162d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3163d8899132SKalle Valo const struct qmi_wlanfw_request_mem_ind_msg_v01 *msg = data; 3164d8899132SKalle Valo int i, ret; 3165d8899132SKalle Valo 3166d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware request memory request\n"); 3167d8899132SKalle Valo 3168d8899132SKalle Valo if (msg->mem_seg_len == 0 || 3169d8899132SKalle Valo msg->mem_seg_len > ATH12K_QMI_WLANFW_MAX_NUM_MEM_SEG_V01) 3170d8899132SKalle Valo ath12k_warn(ab, "Invalid memory segment length: %u\n", 3171d8899132SKalle Valo msg->mem_seg_len); 3172d8899132SKalle Valo 3173d8899132SKalle Valo ab->qmi.mem_seg_count = msg->mem_seg_len; 3174d8899132SKalle Valo 3175d8899132SKalle Valo for (i = 0; i < qmi->mem_seg_count ; i++) { 3176d8899132SKalle Valo ab->qmi.target_mem[i].type = msg->mem_seg[i].type; 3177d8899132SKalle Valo ab->qmi.target_mem[i].size = msg->mem_seg[i].size; 3178d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi mem seg type %d size %d\n", 3179d8899132SKalle Valo msg->mem_seg[i].type, msg->mem_seg[i].size); 3180d8899132SKalle Valo } 3181d8899132SKalle Valo 3182d8899132SKalle Valo ret = ath12k_qmi_alloc_target_mem_chunk(ab); 3183d8899132SKalle Valo if (ret) { 3184d8899132SKalle Valo ath12k_warn(ab, "qmi failed to alloc target memory: %d\n", 3185d8899132SKalle Valo ret); 3186d8899132SKalle Valo return; 3187d8899132SKalle Valo } 3188d8899132SKalle Valo 3189d8899132SKalle Valo ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_REQUEST_MEM, NULL); 3190d8899132SKalle Valo } 3191d8899132SKalle Valo 3192d8899132SKalle Valo static void ath12k_qmi_msg_mem_ready_cb(struct qmi_handle *qmi_hdl, 3193d8899132SKalle Valo struct sockaddr_qrtr *sq, 3194d8899132SKalle Valo struct qmi_txn *txn, 3195d8899132SKalle Valo const void *decoded) 3196d8899132SKalle Valo { 3197d8899132SKalle Valo struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 3198d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3199d8899132SKalle Valo 3200d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware memory ready indication\n"); 3201d8899132SKalle Valo ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_MEM_READY, NULL); 3202d8899132SKalle Valo } 3203d8899132SKalle Valo 3204d8899132SKalle Valo static void ath12k_qmi_msg_fw_ready_cb(struct qmi_handle *qmi_hdl, 3205d8899132SKalle Valo struct sockaddr_qrtr *sq, 3206d8899132SKalle Valo struct qmi_txn *txn, 3207d8899132SKalle Valo const void *decoded) 3208d8899132SKalle Valo { 3209d8899132SKalle Valo struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 3210d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3211d8899132SKalle Valo 3212d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi firmware ready\n"); 3213d8899132SKalle Valo ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_FW_READY, NULL); 3214d8899132SKalle Valo } 3215d8899132SKalle Valo 3216d8899132SKalle Valo static const struct qmi_msg_handler ath12k_qmi_msg_handlers[] = { 3217d8899132SKalle Valo { 3218d8899132SKalle Valo .type = QMI_INDICATION, 3219d8899132SKalle Valo .msg_id = QMI_WLFW_REQUEST_MEM_IND_V01, 3220d8899132SKalle Valo .ei = qmi_wlanfw_request_mem_ind_msg_v01_ei, 3221d8899132SKalle Valo .decoded_size = sizeof(struct qmi_wlanfw_request_mem_ind_msg_v01), 3222d8899132SKalle Valo .fn = ath12k_qmi_msg_mem_request_cb, 3223d8899132SKalle Valo }, 3224d8899132SKalle Valo { 3225d8899132SKalle Valo .type = QMI_INDICATION, 3226d8899132SKalle Valo .msg_id = QMI_WLFW_FW_MEM_READY_IND_V01, 3227d8899132SKalle Valo .ei = qmi_wlanfw_mem_ready_ind_msg_v01_ei, 3228d8899132SKalle Valo .decoded_size = sizeof(struct qmi_wlanfw_fw_mem_ready_ind_msg_v01), 3229d8899132SKalle Valo .fn = ath12k_qmi_msg_mem_ready_cb, 3230d8899132SKalle Valo }, 3231d8899132SKalle Valo { 3232d8899132SKalle Valo .type = QMI_INDICATION, 3233d8899132SKalle Valo .msg_id = QMI_WLFW_FW_READY_IND_V01, 3234d8899132SKalle Valo .ei = qmi_wlanfw_fw_ready_ind_msg_v01_ei, 3235d8899132SKalle Valo .decoded_size = sizeof(struct qmi_wlanfw_fw_ready_ind_msg_v01), 3236d8899132SKalle Valo .fn = ath12k_qmi_msg_fw_ready_cb, 3237d8899132SKalle Valo }, 3238e1bdff48SKarthikeyan Kathirvel 3239e1bdff48SKarthikeyan Kathirvel /* end of list */ 3240e1bdff48SKarthikeyan Kathirvel {}, 3241d8899132SKalle Valo }; 3242d8899132SKalle Valo 3243d8899132SKalle Valo static int ath12k_qmi_ops_new_server(struct qmi_handle *qmi_hdl, 3244d8899132SKalle Valo struct qmi_service *service) 3245d8899132SKalle Valo { 3246d8899132SKalle Valo struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 3247d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3248d8899132SKalle Valo struct sockaddr_qrtr *sq = &qmi->sq; 3249d8899132SKalle Valo int ret; 3250d8899132SKalle Valo 3251d8899132SKalle Valo sq->sq_family = AF_QIPCRTR; 3252d8899132SKalle Valo sq->sq_node = service->node; 3253d8899132SKalle Valo sq->sq_port = service->port; 3254d8899132SKalle Valo 3255d8899132SKalle Valo ret = kernel_connect(qmi_hdl->sock, (struct sockaddr *)sq, 3256d8899132SKalle Valo sizeof(*sq), 0); 3257d8899132SKalle Valo if (ret) { 3258d8899132SKalle Valo ath12k_warn(ab, "qmi failed to connect to remote service %d\n", ret); 3259d8899132SKalle Valo return ret; 3260d8899132SKalle Valo } 3261d8899132SKalle Valo 3262d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw qmi service connected\n"); 3263d8899132SKalle Valo ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_ARRIVE, NULL); 3264d8899132SKalle Valo 3265d8899132SKalle Valo return ret; 3266d8899132SKalle Valo } 3267d8899132SKalle Valo 3268d8899132SKalle Valo static void ath12k_qmi_ops_del_server(struct qmi_handle *qmi_hdl, 3269d8899132SKalle Valo struct qmi_service *service) 3270d8899132SKalle Valo { 3271d8899132SKalle Valo struct ath12k_qmi *qmi = container_of(qmi_hdl, struct ath12k_qmi, handle); 3272d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3273d8899132SKalle Valo 3274d8899132SKalle Valo ath12k_dbg(ab, ATH12K_DBG_QMI, "qmi wifi fw del server\n"); 3275d8899132SKalle Valo ath12k_qmi_driver_event_post(qmi, ATH12K_QMI_EVENT_SERVER_EXIT, NULL); 3276d8899132SKalle Valo } 3277d8899132SKalle Valo 3278d8899132SKalle Valo static const struct qmi_ops ath12k_qmi_ops = { 3279d8899132SKalle Valo .new_server = ath12k_qmi_ops_new_server, 3280d8899132SKalle Valo .del_server = ath12k_qmi_ops_del_server, 3281d8899132SKalle Valo }; 3282d8899132SKalle Valo 3283d8899132SKalle Valo static void ath12k_qmi_driver_event_work(struct work_struct *work) 3284d8899132SKalle Valo { 3285d8899132SKalle Valo struct ath12k_qmi *qmi = container_of(work, struct ath12k_qmi, 3286d8899132SKalle Valo event_work); 3287d8899132SKalle Valo struct ath12k_qmi_driver_event *event; 3288d8899132SKalle Valo struct ath12k_base *ab = qmi->ab; 3289d8899132SKalle Valo int ret; 3290d8899132SKalle Valo 3291d8899132SKalle Valo spin_lock(&qmi->event_lock); 3292d8899132SKalle Valo while (!list_empty(&qmi->event_list)) { 3293d8899132SKalle Valo event = list_first_entry(&qmi->event_list, 3294d8899132SKalle Valo struct ath12k_qmi_driver_event, list); 3295d8899132SKalle Valo list_del(&event->list); 3296d8899132SKalle Valo spin_unlock(&qmi->event_lock); 3297d8899132SKalle Valo 3298d8899132SKalle Valo if (test_bit(ATH12K_FLAG_UNREGISTERING, &ab->dev_flags)) 3299960412beSRajat Soni goto skip; 3300d8899132SKalle Valo 3301d8899132SKalle Valo switch (event->type) { 3302d8899132SKalle Valo case ATH12K_QMI_EVENT_SERVER_ARRIVE: 3303d8899132SKalle Valo ret = ath12k_qmi_event_server_arrive(qmi); 3304d8899132SKalle Valo if (ret < 0) 3305d8899132SKalle Valo set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 3306d8899132SKalle Valo break; 3307d8899132SKalle Valo case ATH12K_QMI_EVENT_SERVER_EXIT: 3308d8899132SKalle Valo set_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags); 3309d8899132SKalle Valo set_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags); 3310d8899132SKalle Valo break; 3311d8899132SKalle Valo case ATH12K_QMI_EVENT_REQUEST_MEM: 3312d8899132SKalle Valo ret = ath12k_qmi_event_mem_request(qmi); 3313d8899132SKalle Valo if (ret < 0) 3314d8899132SKalle Valo set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 3315d8899132SKalle Valo break; 3316d8899132SKalle Valo case ATH12K_QMI_EVENT_FW_MEM_READY: 3317d8899132SKalle Valo ret = ath12k_qmi_event_load_bdf(qmi); 3318d8899132SKalle Valo if (ret < 0) 3319d8899132SKalle Valo set_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 3320d8899132SKalle Valo break; 3321d8899132SKalle Valo case ATH12K_QMI_EVENT_FW_READY: 3322d8899132SKalle Valo clear_bit(ATH12K_FLAG_QMI_FAIL, &ab->dev_flags); 3323d8899132SKalle Valo if (test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags)) { 33248591b2baSBaochen Qiang if (ab->is_reset) 3325d8899132SKalle Valo ath12k_hal_dump_srng_stats(ab); 3326d8899132SKalle Valo queue_work(ab->workqueue, &ab->restart_work); 3327d8899132SKalle Valo break; 3328d8899132SKalle Valo } 3329d8899132SKalle Valo 3330d8899132SKalle Valo clear_bit(ATH12K_FLAG_CRASH_FLUSH, 3331d8899132SKalle Valo &ab->dev_flags); 3332d8899132SKalle Valo clear_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags); 3333d8899132SKalle Valo ath12k_core_qmi_firmware_ready(ab); 3334d8899132SKalle Valo set_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags); 3335d8899132SKalle Valo 3336d8899132SKalle Valo break; 3337d8899132SKalle Valo default: 3338d8899132SKalle Valo ath12k_warn(ab, "invalid event type: %d", event->type); 3339d8899132SKalle Valo break; 3340d8899132SKalle Valo } 3341960412beSRajat Soni 3342960412beSRajat Soni skip: 3343d8899132SKalle Valo kfree(event); 3344d8899132SKalle Valo spin_lock(&qmi->event_lock); 3345d8899132SKalle Valo } 3346d8899132SKalle Valo spin_unlock(&qmi->event_lock); 3347d8899132SKalle Valo } 3348d8899132SKalle Valo 3349d8899132SKalle Valo int ath12k_qmi_init_service(struct ath12k_base *ab) 3350d8899132SKalle Valo { 3351d8899132SKalle Valo int ret; 3352d8899132SKalle Valo 3353d8899132SKalle Valo memset(&ab->qmi.target, 0, sizeof(struct target_info)); 3354d8899132SKalle Valo memset(&ab->qmi.target_mem, 0, sizeof(struct target_mem_chunk)); 3355d8899132SKalle Valo ab->qmi.ab = ab; 3356d8899132SKalle Valo 3357d8899132SKalle Valo ab->qmi.target_mem_mode = ATH12K_QMI_TARGET_MEM_MODE_DEFAULT; 3358d8899132SKalle Valo ret = qmi_handle_init(&ab->qmi.handle, ATH12K_QMI_RESP_LEN_MAX, 3359d8899132SKalle Valo &ath12k_qmi_ops, ath12k_qmi_msg_handlers); 3360d8899132SKalle Valo if (ret < 0) { 3361d8899132SKalle Valo ath12k_warn(ab, "failed to initialize qmi handle\n"); 3362d8899132SKalle Valo return ret; 3363d8899132SKalle Valo } 3364d8899132SKalle Valo 33651e80449eSTejun Heo ab->qmi.event_wq = alloc_ordered_workqueue("ath12k_qmi_driver_event", 0); 3366d8899132SKalle Valo if (!ab->qmi.event_wq) { 3367d8899132SKalle Valo ath12k_err(ab, "failed to allocate workqueue\n"); 3368d8899132SKalle Valo return -EFAULT; 3369d8899132SKalle Valo } 3370d8899132SKalle Valo 3371d8899132SKalle Valo INIT_LIST_HEAD(&ab->qmi.event_list); 3372d8899132SKalle Valo spin_lock_init(&ab->qmi.event_lock); 3373d8899132SKalle Valo INIT_WORK(&ab->qmi.event_work, ath12k_qmi_driver_event_work); 3374d8899132SKalle Valo 3375d8899132SKalle Valo ret = qmi_add_lookup(&ab->qmi.handle, ATH12K_QMI_WLFW_SERVICE_ID_V01, 3376d8899132SKalle Valo ATH12K_QMI_WLFW_SERVICE_VERS_V01, 3377d8899132SKalle Valo ab->qmi.service_ins_id); 3378d8899132SKalle Valo if (ret < 0) { 3379d8899132SKalle Valo ath12k_warn(ab, "failed to add qmi lookup\n"); 3380d8899132SKalle Valo destroy_workqueue(ab->qmi.event_wq); 3381d8899132SKalle Valo return ret; 3382d8899132SKalle Valo } 3383d8899132SKalle Valo 3384d8899132SKalle Valo return ret; 3385d8899132SKalle Valo } 3386d8899132SKalle Valo 3387d8899132SKalle Valo void ath12k_qmi_deinit_service(struct ath12k_base *ab) 3388d8899132SKalle Valo { 3389d8899132SKalle Valo qmi_handle_release(&ab->qmi.handle); 3390d8899132SKalle Valo cancel_work_sync(&ab->qmi.event_work); 3391d8899132SKalle Valo destroy_workqueue(ab->qmi.event_wq); 3392d8899132SKalle Valo ath12k_qmi_m3_free(ab); 3393d8899132SKalle Valo ath12k_qmi_free_target_mem_chunk(ab); 3394d8899132SKalle Valo } 339592448f87SWen Gong 339692448f87SWen Gong void ath12k_qmi_free_resource(struct ath12k_base *ab) 339792448f87SWen Gong { 339892448f87SWen Gong ath12k_qmi_free_target_mem_chunk(ab); 339992448f87SWen Gong ath12k_qmi_m3_free(ab); 340092448f87SWen Gong } 3401