Linux Audio

Check our new training course

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