Linux Audio

Check our new training course

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