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