xref: /linux/drivers/net/wireless/ath/ath10k/core.c (revision ba95c7452439756d4f6dceb5a188b7c31dbbe5b6)
1 // SPDX-License-Identifier: ISC
2 /*
3  * Copyright (c) 2005-2011 Atheros Communications Inc.
4  * Copyright (c) 2011-2017 Qualcomm Atheros, Inc.
5  * Copyright (c) 2018, The Linux Foundation. All rights reserved.
6  */
7 
8 #include <linux/module.h>
9 #include <linux/firmware.h>
10 #include <linux/of.h>
11 #include <linux/property.h>
12 #include <linux/dmi.h>
13 #include <linux/ctype.h>
14 #include <asm/byteorder.h>
15 
16 #include "core.h"
17 #include "mac.h"
18 #include "htc.h"
19 #include "hif.h"
20 #include "wmi.h"
21 #include "bmi.h"
22 #include "debug.h"
23 #include "htt.h"
24 #include "testmode.h"
25 #include "wmi-ops.h"
26 #include "coredump.h"
27 
28 unsigned int ath10k_debug_mask;
29 static unsigned int ath10k_cryptmode_param;
30 static bool uart_print;
31 static bool skip_otp;
32 static bool rawmode;
33 
34 unsigned long ath10k_coredump_mask = BIT(ATH10K_FW_CRASH_DUMP_REGISTERS) |
35 				     BIT(ATH10K_FW_CRASH_DUMP_CE_DATA);
36 
37 /* FIXME: most of these should be readonly */
38 module_param_named(debug_mask, ath10k_debug_mask, uint, 0644);
39 module_param_named(cryptmode, ath10k_cryptmode_param, uint, 0644);
40 module_param(uart_print, bool, 0644);
41 module_param(skip_otp, bool, 0644);
42 module_param(rawmode, bool, 0644);
43 module_param_named(coredump_mask, ath10k_coredump_mask, ulong, 0444);
44 
45 MODULE_PARM_DESC(debug_mask, "Debugging mask");
46 MODULE_PARM_DESC(uart_print, "Uart target debugging");
47 MODULE_PARM_DESC(skip_otp, "Skip otp failure for calibration in testmode");
48 MODULE_PARM_DESC(cryptmode, "Crypto mode: 0-hardware, 1-software");
49 MODULE_PARM_DESC(rawmode, "Use raw 802.11 frame datapath");
50 MODULE_PARM_DESC(coredump_mask, "Bitfield of what to include in firmware crash file");
51 
52 static const struct ath10k_hw_params ath10k_hw_params_list[] = {
53 	{
54 		.id = QCA988X_HW_2_0_VERSION,
55 		.dev_id = QCA988X_2_0_DEVICE_ID,
56 		.bus = ATH10K_BUS_PCI,
57 		.name = "qca988x hw2.0",
58 		.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
59 		.uart_pin = 7,
60 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
61 		.otp_exe_param = 0,
62 		.channel_counters_freq_hz = 88000,
63 		.max_probe_resp_desc_thres = 0,
64 		.cal_data_len = 2116,
65 		.fw = {
66 			.dir = QCA988X_HW_2_0_FW_DIR,
67 			.board = QCA988X_HW_2_0_BOARD_DATA_FILE,
68 			.board_size = QCA988X_BOARD_DATA_SZ,
69 			.board_ext_size = QCA988X_BOARD_EXT_DATA_SZ,
70 		},
71 		.hw_ops = &qca988x_ops,
72 		.decap_align_bytes = 4,
73 		.spectral_bin_discard = 0,
74 		.spectral_bin_offset = 0,
75 		.vht160_mcs_rx_highest = 0,
76 		.vht160_mcs_tx_highest = 0,
77 		.n_cipher_suites = 8,
78 		.ast_skid_limit = 0x10,
79 		.num_wds_entries = 0x20,
80 		.target_64bit = false,
81 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
82 		.shadow_reg_support = false,
83 		.rri_on_ddr = false,
84 		.hw_filter_reset_required = true,
85 		.fw_diag_ce_download = false,
86 	},
87 	{
88 		.id = QCA988X_HW_2_0_VERSION,
89 		.dev_id = QCA988X_2_0_DEVICE_ID_UBNT,
90 		.name = "qca988x hw2.0 ubiquiti",
91 		.patch_load_addr = QCA988X_HW_2_0_PATCH_LOAD_ADDR,
92 		.uart_pin = 7,
93 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
94 		.otp_exe_param = 0,
95 		.channel_counters_freq_hz = 88000,
96 		.max_probe_resp_desc_thres = 0,
97 		.cal_data_len = 2116,
98 		.fw = {
99 			.dir = QCA988X_HW_2_0_FW_DIR,
100 			.board = QCA988X_HW_2_0_BOARD_DATA_FILE,
101 			.board_size = QCA988X_BOARD_DATA_SZ,
102 			.board_ext_size = QCA988X_BOARD_EXT_DATA_SZ,
103 		},
104 		.hw_ops = &qca988x_ops,
105 		.decap_align_bytes = 4,
106 		.spectral_bin_discard = 0,
107 		.spectral_bin_offset = 0,
108 		.vht160_mcs_rx_highest = 0,
109 		.vht160_mcs_tx_highest = 0,
110 		.n_cipher_suites = 8,
111 		.ast_skid_limit = 0x10,
112 		.num_wds_entries = 0x20,
113 		.target_64bit = false,
114 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
115 		.per_ce_irq = false,
116 		.shadow_reg_support = false,
117 		.rri_on_ddr = false,
118 		.hw_filter_reset_required = true,
119 		.fw_diag_ce_download = false,
120 	},
121 	{
122 		.id = QCA9887_HW_1_0_VERSION,
123 		.dev_id = QCA9887_1_0_DEVICE_ID,
124 		.bus = ATH10K_BUS_PCI,
125 		.name = "qca9887 hw1.0",
126 		.patch_load_addr = QCA9887_HW_1_0_PATCH_LOAD_ADDR,
127 		.uart_pin = 7,
128 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_ALL,
129 		.otp_exe_param = 0,
130 		.channel_counters_freq_hz = 88000,
131 		.max_probe_resp_desc_thres = 0,
132 		.cal_data_len = 2116,
133 		.fw = {
134 			.dir = QCA9887_HW_1_0_FW_DIR,
135 			.board = QCA9887_HW_1_0_BOARD_DATA_FILE,
136 			.board_size = QCA9887_BOARD_DATA_SZ,
137 			.board_ext_size = QCA9887_BOARD_EXT_DATA_SZ,
138 		},
139 		.hw_ops = &qca988x_ops,
140 		.decap_align_bytes = 4,
141 		.spectral_bin_discard = 0,
142 		.spectral_bin_offset = 0,
143 		.vht160_mcs_rx_highest = 0,
144 		.vht160_mcs_tx_highest = 0,
145 		.n_cipher_suites = 8,
146 		.ast_skid_limit = 0x10,
147 		.num_wds_entries = 0x20,
148 		.target_64bit = false,
149 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
150 		.per_ce_irq = false,
151 		.shadow_reg_support = false,
152 		.rri_on_ddr = false,
153 		.hw_filter_reset_required = true,
154 		.fw_diag_ce_download = false,
155 	},
156 	{
157 		.id = QCA6174_HW_3_2_VERSION,
158 		.dev_id = QCA6174_3_2_DEVICE_ID,
159 		.bus = ATH10K_BUS_SDIO,
160 		.name = "qca6174 hw3.2 sdio",
161 		.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
162 		.uart_pin = 19,
163 		.otp_exe_param = 0,
164 		.channel_counters_freq_hz = 88000,
165 		.max_probe_resp_desc_thres = 0,
166 		.cal_data_len = 0,
167 		.fw = {
168 			.dir = QCA6174_HW_3_0_FW_DIR,
169 			.board = QCA6174_HW_3_0_BOARD_DATA_FILE,
170 			.board_size = QCA6174_BOARD_DATA_SZ,
171 			.board_ext_size = QCA6174_BOARD_EXT_DATA_SZ,
172 		},
173 		.hw_ops = &qca6174_ops,
174 		.hw_clk = qca6174_clk,
175 		.target_cpu_freq = 176000000,
176 		.decap_align_bytes = 4,
177 		.n_cipher_suites = 8,
178 		.num_peers = 10,
179 		.ast_skid_limit = 0x10,
180 		.num_wds_entries = 0x20,
181 		.uart_pin_workaround = true,
182 	},
183 	{
184 		.id = QCA6174_HW_2_1_VERSION,
185 		.dev_id = QCA6164_2_1_DEVICE_ID,
186 		.bus = ATH10K_BUS_PCI,
187 		.name = "qca6164 hw2.1",
188 		.patch_load_addr = QCA6174_HW_2_1_PATCH_LOAD_ADDR,
189 		.uart_pin = 6,
190 		.otp_exe_param = 0,
191 		.channel_counters_freq_hz = 88000,
192 		.max_probe_resp_desc_thres = 0,
193 		.cal_data_len = 8124,
194 		.fw = {
195 			.dir = QCA6174_HW_2_1_FW_DIR,
196 			.board = QCA6174_HW_2_1_BOARD_DATA_FILE,
197 			.board_size = QCA6174_BOARD_DATA_SZ,
198 			.board_ext_size = QCA6174_BOARD_EXT_DATA_SZ,
199 		},
200 		.hw_ops = &qca988x_ops,
201 		.decap_align_bytes = 4,
202 		.spectral_bin_discard = 0,
203 		.spectral_bin_offset = 0,
204 		.vht160_mcs_rx_highest = 0,
205 		.vht160_mcs_tx_highest = 0,
206 		.n_cipher_suites = 8,
207 		.ast_skid_limit = 0x10,
208 		.num_wds_entries = 0x20,
209 		.target_64bit = false,
210 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
211 		.per_ce_irq = false,
212 		.shadow_reg_support = false,
213 		.rri_on_ddr = false,
214 		.hw_filter_reset_required = true,
215 		.fw_diag_ce_download = false,
216 	},
217 	{
218 		.id = QCA6174_HW_2_1_VERSION,
219 		.dev_id = QCA6174_2_1_DEVICE_ID,
220 		.bus = ATH10K_BUS_PCI,
221 		.name = "qca6174 hw2.1",
222 		.patch_load_addr = QCA6174_HW_2_1_PATCH_LOAD_ADDR,
223 		.uart_pin = 6,
224 		.otp_exe_param = 0,
225 		.channel_counters_freq_hz = 88000,
226 		.max_probe_resp_desc_thres = 0,
227 		.cal_data_len = 8124,
228 		.fw = {
229 			.dir = QCA6174_HW_2_1_FW_DIR,
230 			.board = QCA6174_HW_2_1_BOARD_DATA_FILE,
231 			.board_size = QCA6174_BOARD_DATA_SZ,
232 			.board_ext_size = QCA6174_BOARD_EXT_DATA_SZ,
233 		},
234 		.hw_ops = &qca988x_ops,
235 		.decap_align_bytes = 4,
236 		.spectral_bin_discard = 0,
237 		.spectral_bin_offset = 0,
238 		.vht160_mcs_rx_highest = 0,
239 		.vht160_mcs_tx_highest = 0,
240 		.n_cipher_suites = 8,
241 		.ast_skid_limit = 0x10,
242 		.num_wds_entries = 0x20,
243 		.target_64bit = false,
244 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
245 		.per_ce_irq = false,
246 		.shadow_reg_support = false,
247 		.rri_on_ddr = false,
248 		.hw_filter_reset_required = true,
249 		.fw_diag_ce_download = false,
250 	},
251 	{
252 		.id = QCA6174_HW_3_0_VERSION,
253 		.dev_id = QCA6174_2_1_DEVICE_ID,
254 		.bus = ATH10K_BUS_PCI,
255 		.name = "qca6174 hw3.0",
256 		.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
257 		.uart_pin = 6,
258 		.otp_exe_param = 0,
259 		.channel_counters_freq_hz = 88000,
260 		.max_probe_resp_desc_thres = 0,
261 		.cal_data_len = 8124,
262 		.fw = {
263 			.dir = QCA6174_HW_3_0_FW_DIR,
264 			.board = QCA6174_HW_3_0_BOARD_DATA_FILE,
265 			.board_size = QCA6174_BOARD_DATA_SZ,
266 			.board_ext_size = QCA6174_BOARD_EXT_DATA_SZ,
267 		},
268 		.hw_ops = &qca988x_ops,
269 		.decap_align_bytes = 4,
270 		.spectral_bin_discard = 0,
271 		.spectral_bin_offset = 0,
272 		.vht160_mcs_rx_highest = 0,
273 		.vht160_mcs_tx_highest = 0,
274 		.n_cipher_suites = 8,
275 		.ast_skid_limit = 0x10,
276 		.num_wds_entries = 0x20,
277 		.target_64bit = false,
278 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
279 		.per_ce_irq = false,
280 		.shadow_reg_support = false,
281 		.rri_on_ddr = false,
282 		.hw_filter_reset_required = true,
283 		.fw_diag_ce_download = false,
284 	},
285 	{
286 		.id = QCA6174_HW_3_2_VERSION,
287 		.dev_id = QCA6174_2_1_DEVICE_ID,
288 		.bus = ATH10K_BUS_PCI,
289 		.name = "qca6174 hw3.2",
290 		.patch_load_addr = QCA6174_HW_3_0_PATCH_LOAD_ADDR,
291 		.uart_pin = 6,
292 		.otp_exe_param = 0,
293 		.channel_counters_freq_hz = 88000,
294 		.max_probe_resp_desc_thres = 0,
295 		.cal_data_len = 8124,
296 		.fw = {
297 			/* uses same binaries as hw3.0 */
298 			.dir = QCA6174_HW_3_0_FW_DIR,
299 			.board = QCA6174_HW_3_0_BOARD_DATA_FILE,
300 			.board_size = QCA6174_BOARD_DATA_SZ,
301 			.board_ext_size = QCA6174_BOARD_EXT_DATA_SZ,
302 		},
303 		.hw_ops = &qca6174_ops,
304 		.hw_clk = qca6174_clk,
305 		.target_cpu_freq = 176000000,
306 		.decap_align_bytes = 4,
307 		.spectral_bin_discard = 0,
308 		.spectral_bin_offset = 0,
309 		.vht160_mcs_rx_highest = 0,
310 		.vht160_mcs_tx_highest = 0,
311 		.n_cipher_suites = 8,
312 		.ast_skid_limit = 0x10,
313 		.num_wds_entries = 0x20,
314 		.target_64bit = false,
315 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
316 		.per_ce_irq = false,
317 		.shadow_reg_support = false,
318 		.rri_on_ddr = false,
319 		.hw_filter_reset_required = true,
320 		.fw_diag_ce_download = true,
321 	},
322 	{
323 		.id = QCA99X0_HW_2_0_DEV_VERSION,
324 		.dev_id = QCA99X0_2_0_DEVICE_ID,
325 		.bus = ATH10K_BUS_PCI,
326 		.name = "qca99x0 hw2.0",
327 		.patch_load_addr = QCA99X0_HW_2_0_PATCH_LOAD_ADDR,
328 		.uart_pin = 7,
329 		.otp_exe_param = 0x00000700,
330 		.continuous_frag_desc = true,
331 		.cck_rate_map_rev2 = true,
332 		.channel_counters_freq_hz = 150000,
333 		.max_probe_resp_desc_thres = 24,
334 		.tx_chain_mask = 0xf,
335 		.rx_chain_mask = 0xf,
336 		.max_spatial_stream = 4,
337 		.cal_data_len = 12064,
338 		.fw = {
339 			.dir = QCA99X0_HW_2_0_FW_DIR,
340 			.board = QCA99X0_HW_2_0_BOARD_DATA_FILE,
341 			.board_size = QCA99X0_BOARD_DATA_SZ,
342 			.board_ext_size = QCA99X0_BOARD_EXT_DATA_SZ,
343 		},
344 		.sw_decrypt_mcast_mgmt = true,
345 		.hw_ops = &qca99x0_ops,
346 		.decap_align_bytes = 1,
347 		.spectral_bin_discard = 4,
348 		.spectral_bin_offset = 0,
349 		.vht160_mcs_rx_highest = 0,
350 		.vht160_mcs_tx_highest = 0,
351 		.n_cipher_suites = 11,
352 		.ast_skid_limit = 0x10,
353 		.num_wds_entries = 0x20,
354 		.target_64bit = false,
355 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
356 		.per_ce_irq = false,
357 		.shadow_reg_support = false,
358 		.rri_on_ddr = false,
359 		.hw_filter_reset_required = true,
360 		.fw_diag_ce_download = false,
361 	},
362 	{
363 		.id = QCA9984_HW_1_0_DEV_VERSION,
364 		.dev_id = QCA9984_1_0_DEVICE_ID,
365 		.bus = ATH10K_BUS_PCI,
366 		.name = "qca9984/qca9994 hw1.0",
367 		.patch_load_addr = QCA9984_HW_1_0_PATCH_LOAD_ADDR,
368 		.uart_pin = 7,
369 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
370 		.otp_exe_param = 0x00000700,
371 		.continuous_frag_desc = true,
372 		.cck_rate_map_rev2 = true,
373 		.channel_counters_freq_hz = 150000,
374 		.max_probe_resp_desc_thres = 24,
375 		.tx_chain_mask = 0xf,
376 		.rx_chain_mask = 0xf,
377 		.max_spatial_stream = 4,
378 		.cal_data_len = 12064,
379 		.fw = {
380 			.dir = QCA9984_HW_1_0_FW_DIR,
381 			.board = QCA9984_HW_1_0_BOARD_DATA_FILE,
382 			.eboard = QCA9984_HW_1_0_EBOARD_DATA_FILE,
383 			.board_size = QCA99X0_BOARD_DATA_SZ,
384 			.board_ext_size = QCA99X0_BOARD_EXT_DATA_SZ,
385 			.ext_board_size = QCA99X0_EXT_BOARD_DATA_SZ,
386 		},
387 		.sw_decrypt_mcast_mgmt = true,
388 		.hw_ops = &qca99x0_ops,
389 		.decap_align_bytes = 1,
390 		.spectral_bin_discard = 12,
391 		.spectral_bin_offset = 8,
392 
393 		/* Can do only 2x2 VHT160 or 80+80. 1560Mbps is 4x4 80Mhz
394 		 * or 2x2 160Mhz, long-guard-interval.
395 		 */
396 		.vht160_mcs_rx_highest = 1560,
397 		.vht160_mcs_tx_highest = 1560,
398 		.n_cipher_suites = 11,
399 		.ast_skid_limit = 0x10,
400 		.num_wds_entries = 0x20,
401 		.target_64bit = false,
402 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
403 		.per_ce_irq = false,
404 		.shadow_reg_support = false,
405 		.rri_on_ddr = false,
406 		.hw_filter_reset_required = true,
407 		.fw_diag_ce_download = false,
408 	},
409 	{
410 		.id = QCA9888_HW_2_0_DEV_VERSION,
411 		.dev_id = QCA9888_2_0_DEVICE_ID,
412 		.bus = ATH10K_BUS_PCI,
413 		.name = "qca9888 hw2.0",
414 		.patch_load_addr = QCA9888_HW_2_0_PATCH_LOAD_ADDR,
415 		.uart_pin = 7,
416 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
417 		.otp_exe_param = 0x00000700,
418 		.continuous_frag_desc = true,
419 		.channel_counters_freq_hz = 150000,
420 		.max_probe_resp_desc_thres = 24,
421 		.tx_chain_mask = 3,
422 		.rx_chain_mask = 3,
423 		.max_spatial_stream = 2,
424 		.cal_data_len = 12064,
425 		.fw = {
426 			.dir = QCA9888_HW_2_0_FW_DIR,
427 			.board = QCA9888_HW_2_0_BOARD_DATA_FILE,
428 			.board_size = QCA99X0_BOARD_DATA_SZ,
429 			.board_ext_size = QCA99X0_BOARD_EXT_DATA_SZ,
430 		},
431 		.sw_decrypt_mcast_mgmt = true,
432 		.hw_ops = &qca99x0_ops,
433 		.decap_align_bytes = 1,
434 		.spectral_bin_discard = 12,
435 		.spectral_bin_offset = 8,
436 
437 		/* Can do only 1x1 VHT160 or 80+80. 780Mbps is 2x2 80Mhz or
438 		 * 1x1 160Mhz, long-guard-interval.
439 		 */
440 		.vht160_mcs_rx_highest = 780,
441 		.vht160_mcs_tx_highest = 780,
442 		.n_cipher_suites = 11,
443 		.ast_skid_limit = 0x10,
444 		.num_wds_entries = 0x20,
445 		.target_64bit = false,
446 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
447 		.per_ce_irq = false,
448 		.shadow_reg_support = false,
449 		.rri_on_ddr = false,
450 		.hw_filter_reset_required = true,
451 		.fw_diag_ce_download = false,
452 	},
453 	{
454 		.id = QCA9377_HW_1_0_DEV_VERSION,
455 		.dev_id = QCA9377_1_0_DEVICE_ID,
456 		.bus = ATH10K_BUS_PCI,
457 		.name = "qca9377 hw1.0",
458 		.patch_load_addr = QCA9377_HW_1_0_PATCH_LOAD_ADDR,
459 		.uart_pin = 6,
460 		.otp_exe_param = 0,
461 		.channel_counters_freq_hz = 88000,
462 		.max_probe_resp_desc_thres = 0,
463 		.cal_data_len = 8124,
464 		.fw = {
465 			.dir = QCA9377_HW_1_0_FW_DIR,
466 			.board = QCA9377_HW_1_0_BOARD_DATA_FILE,
467 			.board_size = QCA9377_BOARD_DATA_SZ,
468 			.board_ext_size = QCA9377_BOARD_EXT_DATA_SZ,
469 		},
470 		.hw_ops = &qca988x_ops,
471 		.decap_align_bytes = 4,
472 		.spectral_bin_discard = 0,
473 		.spectral_bin_offset = 0,
474 		.vht160_mcs_rx_highest = 0,
475 		.vht160_mcs_tx_highest = 0,
476 		.n_cipher_suites = 8,
477 		.ast_skid_limit = 0x10,
478 		.num_wds_entries = 0x20,
479 		.target_64bit = false,
480 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
481 		.per_ce_irq = false,
482 		.shadow_reg_support = false,
483 		.rri_on_ddr = false,
484 		.hw_filter_reset_required = true,
485 		.fw_diag_ce_download = false,
486 	},
487 	{
488 		.id = QCA9377_HW_1_1_DEV_VERSION,
489 		.dev_id = QCA9377_1_0_DEVICE_ID,
490 		.bus = ATH10K_BUS_PCI,
491 		.name = "qca9377 hw1.1",
492 		.patch_load_addr = QCA9377_HW_1_0_PATCH_LOAD_ADDR,
493 		.uart_pin = 6,
494 		.otp_exe_param = 0,
495 		.channel_counters_freq_hz = 88000,
496 		.max_probe_resp_desc_thres = 0,
497 		.cal_data_len = 8124,
498 		.fw = {
499 			.dir = QCA9377_HW_1_0_FW_DIR,
500 			.board = QCA9377_HW_1_0_BOARD_DATA_FILE,
501 			.board_size = QCA9377_BOARD_DATA_SZ,
502 			.board_ext_size = QCA9377_BOARD_EXT_DATA_SZ,
503 		},
504 		.hw_ops = &qca6174_ops,
505 		.hw_clk = qca6174_clk,
506 		.target_cpu_freq = 176000000,
507 		.decap_align_bytes = 4,
508 		.spectral_bin_discard = 0,
509 		.spectral_bin_offset = 0,
510 		.vht160_mcs_rx_highest = 0,
511 		.vht160_mcs_tx_highest = 0,
512 		.n_cipher_suites = 8,
513 		.ast_skid_limit = 0x10,
514 		.num_wds_entries = 0x20,
515 		.target_64bit = false,
516 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
517 		.per_ce_irq = false,
518 		.shadow_reg_support = false,
519 		.rri_on_ddr = false,
520 		.hw_filter_reset_required = true,
521 		.fw_diag_ce_download = true,
522 	},
523 	{
524 		.id = QCA4019_HW_1_0_DEV_VERSION,
525 		.dev_id = 0,
526 		.bus = ATH10K_BUS_AHB,
527 		.name = "qca4019 hw1.0",
528 		.patch_load_addr = QCA4019_HW_1_0_PATCH_LOAD_ADDR,
529 		.uart_pin = 7,
530 		.cc_wraparound_type = ATH10K_HW_CC_WRAP_SHIFTED_EACH,
531 		.otp_exe_param = 0x0010000,
532 		.continuous_frag_desc = true,
533 		.cck_rate_map_rev2 = true,
534 		.channel_counters_freq_hz = 125000,
535 		.max_probe_resp_desc_thres = 24,
536 		.tx_chain_mask = 0x3,
537 		.rx_chain_mask = 0x3,
538 		.max_spatial_stream = 2,
539 		.cal_data_len = 12064,
540 		.fw = {
541 			.dir = QCA4019_HW_1_0_FW_DIR,
542 			.board = QCA4019_HW_1_0_BOARD_DATA_FILE,
543 			.board_size = QCA4019_BOARD_DATA_SZ,
544 			.board_ext_size = QCA4019_BOARD_EXT_DATA_SZ,
545 		},
546 		.sw_decrypt_mcast_mgmt = true,
547 		.hw_ops = &qca99x0_ops,
548 		.decap_align_bytes = 1,
549 		.spectral_bin_discard = 4,
550 		.spectral_bin_offset = 0,
551 		.vht160_mcs_rx_highest = 0,
552 		.vht160_mcs_tx_highest = 0,
553 		.n_cipher_suites = 11,
554 		.ast_skid_limit = 0x10,
555 		.num_wds_entries = 0x20,
556 		.target_64bit = false,
557 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL,
558 		.per_ce_irq = false,
559 		.shadow_reg_support = false,
560 		.rri_on_ddr = false,
561 		.hw_filter_reset_required = true,
562 		.fw_diag_ce_download = false,
563 	},
564 	{
565 		.id = WCN3990_HW_1_0_DEV_VERSION,
566 		.dev_id = 0,
567 		.bus = ATH10K_BUS_SNOC,
568 		.name = "wcn3990 hw1.0",
569 		.continuous_frag_desc = true,
570 		.tx_chain_mask = 0x7,
571 		.rx_chain_mask = 0x7,
572 		.max_spatial_stream = 4,
573 		.fw = {
574 			.dir = WCN3990_HW_1_0_FW_DIR,
575 		},
576 		.sw_decrypt_mcast_mgmt = true,
577 		.hw_ops = &wcn3990_ops,
578 		.decap_align_bytes = 1,
579 		.num_peers = TARGET_HL_TLV_NUM_PEERS,
580 		.n_cipher_suites = 11,
581 		.ast_skid_limit = TARGET_HL_TLV_AST_SKID_LIMIT,
582 		.num_wds_entries = TARGET_HL_TLV_NUM_WDS_ENTRIES,
583 		.target_64bit = true,
584 		.rx_ring_fill_level = HTT_RX_RING_FILL_LEVEL_DUAL_MAC,
585 		.per_ce_irq = true,
586 		.shadow_reg_support = true,
587 		.rri_on_ddr = true,
588 		.hw_filter_reset_required = false,
589 		.fw_diag_ce_download = false,
590 	},
591 };
592 
593 static const char *const ath10k_core_fw_feature_str[] = {
594 	[ATH10K_FW_FEATURE_EXT_WMI_MGMT_RX] = "wmi-mgmt-rx",
595 	[ATH10K_FW_FEATURE_WMI_10X] = "wmi-10.x",
596 	[ATH10K_FW_FEATURE_HAS_WMI_MGMT_TX] = "has-wmi-mgmt-tx",
597 	[ATH10K_FW_FEATURE_NO_P2P] = "no-p2p",
598 	[ATH10K_FW_FEATURE_WMI_10_2] = "wmi-10.2",
599 	[ATH10K_FW_FEATURE_MULTI_VIF_PS_SUPPORT] = "multi-vif-ps",
600 	[ATH10K_FW_FEATURE_WOWLAN_SUPPORT] = "wowlan",
601 	[ATH10K_FW_FEATURE_IGNORE_OTP_RESULT] = "ignore-otp",
602 	[ATH10K_FW_FEATURE_NO_NWIFI_DECAP_4ADDR_PADDING] = "no-4addr-pad",
603 	[ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT] = "skip-clock-init",
604 	[ATH10K_FW_FEATURE_RAW_MODE_SUPPORT] = "raw-mode",
605 	[ATH10K_FW_FEATURE_SUPPORTS_ADAPTIVE_CCA] = "adaptive-cca",
606 	[ATH10K_FW_FEATURE_MFP_SUPPORT] = "mfp",
607 	[ATH10K_FW_FEATURE_PEER_FLOW_CONTROL] = "peer-flow-ctrl",
608 	[ATH10K_FW_FEATURE_BTCOEX_PARAM] = "btcoex-param",
609 	[ATH10K_FW_FEATURE_SKIP_NULL_FUNC_WAR] = "skip-null-func-war",
610 	[ATH10K_FW_FEATURE_ALLOWS_MESH_BCAST] = "allows-mesh-bcast",
611 	[ATH10K_FW_FEATURE_NO_PS] = "no-ps",
612 	[ATH10K_FW_FEATURE_MGMT_TX_BY_REF] = "mgmt-tx-by-reference",
613 	[ATH10K_FW_FEATURE_NON_BMI] = "non-bmi",
614 	[ATH10K_FW_FEATURE_SINGLE_CHAN_INFO_PER_CHANNEL] = "single-chan-info-per-channel",
615 };
616 
617 static unsigned int ath10k_core_get_fw_feature_str(char *buf,
618 						   size_t buf_len,
619 						   enum ath10k_fw_features feat)
620 {
621 	/* make sure that ath10k_core_fw_feature_str[] gets updated */
622 	BUILD_BUG_ON(ARRAY_SIZE(ath10k_core_fw_feature_str) !=
623 		     ATH10K_FW_FEATURE_COUNT);
624 
625 	if (feat >= ARRAY_SIZE(ath10k_core_fw_feature_str) ||
626 	    WARN_ON(!ath10k_core_fw_feature_str[feat])) {
627 		return scnprintf(buf, buf_len, "bit%d", feat);
628 	}
629 
630 	return scnprintf(buf, buf_len, "%s", ath10k_core_fw_feature_str[feat]);
631 }
632 
633 void ath10k_core_get_fw_features_str(struct ath10k *ar,
634 				     char *buf,
635 				     size_t buf_len)
636 {
637 	size_t len = 0;
638 	int i;
639 
640 	for (i = 0; i < ATH10K_FW_FEATURE_COUNT; i++) {
641 		if (test_bit(i, ar->normal_mode_fw.fw_file.fw_features)) {
642 			if (len > 0)
643 				len += scnprintf(buf + len, buf_len - len, ",");
644 
645 			len += ath10k_core_get_fw_feature_str(buf + len,
646 							      buf_len - len,
647 							      i);
648 		}
649 	}
650 }
651 
652 static void ath10k_send_suspend_complete(struct ath10k *ar)
653 {
654 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot suspend complete\n");
655 
656 	complete(&ar->target_suspend);
657 }
658 
659 static void ath10k_init_sdio(struct ath10k *ar, enum ath10k_firmware_mode mode)
660 {
661 	u32 param = 0;
662 
663 	ath10k_bmi_write32(ar, hi_mbox_io_block_sz, 256);
664 	ath10k_bmi_write32(ar, hi_mbox_isr_yield_limit, 99);
665 	ath10k_bmi_read32(ar, hi_acs_flags, &param);
666 
667 	/* Data transfer is not initiated, when reduced Tx completion
668 	 * is used for SDIO. disable it until fixed
669 	 */
670 	param &= ~HI_ACS_FLAGS_SDIO_REDUCE_TX_COMPL_SET;
671 
672 	/* Alternate credit size of 1544 as used by SDIO firmware is
673 	 * not big enough for mac80211 / native wifi frames. disable it
674 	 */
675 	param &= ~HI_ACS_FLAGS_ALT_DATA_CREDIT_SIZE;
676 
677 	if (mode == ATH10K_FIRMWARE_MODE_UTF)
678 		param &= ~HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_SET;
679 	else
680 		param |= HI_ACS_FLAGS_SDIO_SWAP_MAILBOX_SET;
681 
682 	ath10k_bmi_write32(ar, hi_acs_flags, param);
683 
684 	/* Explicitly set fwlog prints to zero as target may turn it on
685 	 * based on scratch registers.
686 	 */
687 	ath10k_bmi_read32(ar, hi_option_flag, &param);
688 	param |= HI_OPTION_DISABLE_DBGLOG;
689 	ath10k_bmi_write32(ar, hi_option_flag, param);
690 }
691 
692 static int ath10k_init_configure_target(struct ath10k *ar)
693 {
694 	u32 param_host;
695 	int ret;
696 
697 	/* tell target which HTC version it is used*/
698 	ret = ath10k_bmi_write32(ar, hi_app_host_interest,
699 				 HTC_PROTOCOL_VERSION);
700 	if (ret) {
701 		ath10k_err(ar, "settings HTC version failed\n");
702 		return ret;
703 	}
704 
705 	/* set the firmware mode to STA/IBSS/AP */
706 	ret = ath10k_bmi_read32(ar, hi_option_flag, &param_host);
707 	if (ret) {
708 		ath10k_err(ar, "setting firmware mode (1/2) failed\n");
709 		return ret;
710 	}
711 
712 	/* TODO following parameters need to be re-visited. */
713 	/* num_device */
714 	param_host |= (1 << HI_OPTION_NUM_DEV_SHIFT);
715 	/* Firmware mode */
716 	/* FIXME: Why FW_MODE_AP ??.*/
717 	param_host |= (HI_OPTION_FW_MODE_AP << HI_OPTION_FW_MODE_SHIFT);
718 	/* mac_addr_method */
719 	param_host |= (1 << HI_OPTION_MAC_ADDR_METHOD_SHIFT);
720 	/* firmware_bridge */
721 	param_host |= (0 << HI_OPTION_FW_BRIDGE_SHIFT);
722 	/* fwsubmode */
723 	param_host |= (0 << HI_OPTION_FW_SUBMODE_SHIFT);
724 
725 	ret = ath10k_bmi_write32(ar, hi_option_flag, param_host);
726 	if (ret) {
727 		ath10k_err(ar, "setting firmware mode (2/2) failed\n");
728 		return ret;
729 	}
730 
731 	/* We do all byte-swapping on the host */
732 	ret = ath10k_bmi_write32(ar, hi_be, 0);
733 	if (ret) {
734 		ath10k_err(ar, "setting host CPU BE mode failed\n");
735 		return ret;
736 	}
737 
738 	/* FW descriptor/Data swap flags */
739 	ret = ath10k_bmi_write32(ar, hi_fw_swap, 0);
740 
741 	if (ret) {
742 		ath10k_err(ar, "setting FW data/desc swap flags failed\n");
743 		return ret;
744 	}
745 
746 	/* Some devices have a special sanity check that verifies the PCI
747 	 * Device ID is written to this host interest var. It is known to be
748 	 * required to boot QCA6164.
749 	 */
750 	ret = ath10k_bmi_write32(ar, hi_hci_uart_pwr_mgmt_params_ext,
751 				 ar->dev_id);
752 	if (ret) {
753 		ath10k_err(ar, "failed to set pwr_mgmt_params: %d\n", ret);
754 		return ret;
755 	}
756 
757 	return 0;
758 }
759 
760 static const struct firmware *ath10k_fetch_fw_file(struct ath10k *ar,
761 						   const char *dir,
762 						   const char *file)
763 {
764 	char filename[100];
765 	const struct firmware *fw;
766 	int ret;
767 
768 	if (file == NULL)
769 		return ERR_PTR(-ENOENT);
770 
771 	if (dir == NULL)
772 		dir = ".";
773 
774 	snprintf(filename, sizeof(filename), "%s/%s", dir, file);
775 	ret = firmware_request_nowarn(&fw, filename, ar->dev);
776 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot fw request '%s': %d\n",
777 		   filename, ret);
778 
779 	if (ret)
780 		return ERR_PTR(ret);
781 
782 	return fw;
783 }
784 
785 static int ath10k_push_board_ext_data(struct ath10k *ar, const void *data,
786 				      size_t data_len)
787 {
788 	u32 board_data_size = ar->hw_params.fw.board_size;
789 	u32 board_ext_data_size = ar->hw_params.fw.board_ext_size;
790 	u32 board_ext_data_addr;
791 	int ret;
792 
793 	ret = ath10k_bmi_read32(ar, hi_board_ext_data, &board_ext_data_addr);
794 	if (ret) {
795 		ath10k_err(ar, "could not read board ext data addr (%d)\n",
796 			   ret);
797 		return ret;
798 	}
799 
800 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
801 		   "boot push board extended data addr 0x%x\n",
802 		   board_ext_data_addr);
803 
804 	if (board_ext_data_addr == 0)
805 		return 0;
806 
807 	if (data_len != (board_data_size + board_ext_data_size)) {
808 		ath10k_err(ar, "invalid board (ext) data sizes %zu != %d+%d\n",
809 			   data_len, board_data_size, board_ext_data_size);
810 		return -EINVAL;
811 	}
812 
813 	ret = ath10k_bmi_write_memory(ar, board_ext_data_addr,
814 				      data + board_data_size,
815 				      board_ext_data_size);
816 	if (ret) {
817 		ath10k_err(ar, "could not write board ext data (%d)\n", ret);
818 		return ret;
819 	}
820 
821 	ret = ath10k_bmi_write32(ar, hi_board_ext_data_config,
822 				 (board_ext_data_size << 16) | 1);
823 	if (ret) {
824 		ath10k_err(ar, "could not write board ext data bit (%d)\n",
825 			   ret);
826 		return ret;
827 	}
828 
829 	return 0;
830 }
831 
832 static int ath10k_core_get_board_id_from_otp(struct ath10k *ar)
833 {
834 	u32 result, address;
835 	u8 board_id, chip_id;
836 	bool ext_bid_support;
837 	int ret, bmi_board_id_param;
838 
839 	address = ar->hw_params.patch_load_addr;
840 
841 	if (!ar->normal_mode_fw.fw_file.otp_data ||
842 	    !ar->normal_mode_fw.fw_file.otp_len) {
843 		ath10k_warn(ar,
844 			    "failed to retrieve board id because of invalid otp\n");
845 		return -ENODATA;
846 	}
847 
848 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
849 		   "boot upload otp to 0x%x len %zd for board id\n",
850 		   address, ar->normal_mode_fw.fw_file.otp_len);
851 
852 	ret = ath10k_bmi_fast_download(ar, address,
853 				       ar->normal_mode_fw.fw_file.otp_data,
854 				       ar->normal_mode_fw.fw_file.otp_len);
855 	if (ret) {
856 		ath10k_err(ar, "could not write otp for board id check: %d\n",
857 			   ret);
858 		return ret;
859 	}
860 
861 	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
862 	    ar->cal_mode == ATH10K_PRE_CAL_MODE_FILE)
863 		bmi_board_id_param = BMI_PARAM_GET_FLASH_BOARD_ID;
864 	else
865 		bmi_board_id_param = BMI_PARAM_GET_EEPROM_BOARD_ID;
866 
867 	ret = ath10k_bmi_execute(ar, address, bmi_board_id_param, &result);
868 	if (ret) {
869 		ath10k_err(ar, "could not execute otp for board id check: %d\n",
870 			   ret);
871 		return ret;
872 	}
873 
874 	board_id = MS(result, ATH10K_BMI_BOARD_ID_FROM_OTP);
875 	chip_id = MS(result, ATH10K_BMI_CHIP_ID_FROM_OTP);
876 	ext_bid_support = (result & ATH10K_BMI_EXT_BOARD_ID_SUPPORT);
877 
878 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
879 		   "boot get otp board id result 0x%08x board_id %d chip_id %d ext_bid_support %d\n",
880 		   result, board_id, chip_id, ext_bid_support);
881 
882 	ar->id.ext_bid_supported = ext_bid_support;
883 
884 	if ((result & ATH10K_BMI_BOARD_ID_STATUS_MASK) != 0 ||
885 	    (board_id == 0)) {
886 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
887 			   "board id does not exist in otp, ignore it\n");
888 		return -EOPNOTSUPP;
889 	}
890 
891 	ar->id.bmi_ids_valid = true;
892 	ar->id.bmi_board_id = board_id;
893 	ar->id.bmi_chip_id = chip_id;
894 
895 	return 0;
896 }
897 
898 static void ath10k_core_check_bdfext(const struct dmi_header *hdr, void *data)
899 {
900 	struct ath10k *ar = data;
901 	const char *bdf_ext;
902 	const char *magic = ATH10K_SMBIOS_BDF_EXT_MAGIC;
903 	u8 bdf_enabled;
904 	int i;
905 
906 	if (hdr->type != ATH10K_SMBIOS_BDF_EXT_TYPE)
907 		return;
908 
909 	if (hdr->length != ATH10K_SMBIOS_BDF_EXT_LENGTH) {
910 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
911 			   "wrong smbios bdf ext type length (%d).\n",
912 			   hdr->length);
913 		return;
914 	}
915 
916 	bdf_enabled = *((u8 *)hdr + ATH10K_SMBIOS_BDF_EXT_OFFSET);
917 	if (!bdf_enabled) {
918 		ath10k_dbg(ar, ATH10K_DBG_BOOT, "bdf variant name not found.\n");
919 		return;
920 	}
921 
922 	/* Only one string exists (per spec) */
923 	bdf_ext = (char *)hdr + hdr->length;
924 
925 	if (memcmp(bdf_ext, magic, strlen(magic)) != 0) {
926 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
927 			   "bdf variant magic does not match.\n");
928 		return;
929 	}
930 
931 	for (i = 0; i < strlen(bdf_ext); i++) {
932 		if (!isascii(bdf_ext[i]) || !isprint(bdf_ext[i])) {
933 			ath10k_dbg(ar, ATH10K_DBG_BOOT,
934 				   "bdf variant name contains non ascii chars.\n");
935 			return;
936 		}
937 	}
938 
939 	/* Copy extension name without magic suffix */
940 	if (strscpy(ar->id.bdf_ext, bdf_ext + strlen(magic),
941 		    sizeof(ar->id.bdf_ext)) < 0) {
942 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
943 			   "bdf variant string is longer than the buffer can accommodate (variant: %s)\n",
944 			    bdf_ext);
945 		return;
946 	}
947 
948 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
949 		   "found and validated bdf variant smbios_type 0x%x bdf %s\n",
950 		   ATH10K_SMBIOS_BDF_EXT_TYPE, bdf_ext);
951 }
952 
953 static int ath10k_core_check_smbios(struct ath10k *ar)
954 {
955 	ar->id.bdf_ext[0] = '\0';
956 	dmi_walk(ath10k_core_check_bdfext, ar);
957 
958 	if (ar->id.bdf_ext[0] == '\0')
959 		return -ENODATA;
960 
961 	return 0;
962 }
963 
964 static int ath10k_core_check_dt(struct ath10k *ar)
965 {
966 	struct device_node *node;
967 	const char *variant = NULL;
968 
969 	node = ar->dev->of_node;
970 	if (!node)
971 		return -ENOENT;
972 
973 	of_property_read_string(node, "qcom,ath10k-calibration-variant",
974 				&variant);
975 	if (!variant)
976 		return -ENODATA;
977 
978 	if (strscpy(ar->id.bdf_ext, variant, sizeof(ar->id.bdf_ext)) < 0)
979 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
980 			   "bdf variant string is longer than the buffer can accommodate (variant: %s)\n",
981 			    variant);
982 
983 	return 0;
984 }
985 
986 static int ath10k_download_fw(struct ath10k *ar)
987 {
988 	u32 address, data_len;
989 	const void *data;
990 	int ret;
991 
992 	address = ar->hw_params.patch_load_addr;
993 
994 	data = ar->running_fw->fw_file.firmware_data;
995 	data_len = ar->running_fw->fw_file.firmware_len;
996 
997 	ret = ath10k_swap_code_seg_configure(ar, &ar->running_fw->fw_file);
998 	if (ret) {
999 		ath10k_err(ar, "failed to configure fw code swap: %d\n",
1000 			   ret);
1001 		return ret;
1002 	}
1003 
1004 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
1005 		   "boot uploading firmware image %pK len %d\n",
1006 		   data, data_len);
1007 
1008 	/* Check if device supports to download firmware via
1009 	 * diag copy engine. Downloading firmware via diag CE
1010 	 * greatly reduces the time to download firmware.
1011 	 */
1012 	if (ar->hw_params.fw_diag_ce_download) {
1013 		ret = ath10k_hw_diag_fast_download(ar, address,
1014 						   data, data_len);
1015 		if (ret == 0)
1016 			/* firmware upload via diag ce was successful */
1017 			return 0;
1018 
1019 		ath10k_warn(ar,
1020 			    "failed to upload firmware via diag ce, trying BMI: %d",
1021 			    ret);
1022 	}
1023 
1024 	return ath10k_bmi_fast_download(ar, address,
1025 					data, data_len);
1026 }
1027 
1028 void ath10k_core_free_board_files(struct ath10k *ar)
1029 {
1030 	if (!IS_ERR(ar->normal_mode_fw.board))
1031 		release_firmware(ar->normal_mode_fw.board);
1032 
1033 	if (!IS_ERR(ar->normal_mode_fw.ext_board))
1034 		release_firmware(ar->normal_mode_fw.ext_board);
1035 
1036 	ar->normal_mode_fw.board = NULL;
1037 	ar->normal_mode_fw.board_data = NULL;
1038 	ar->normal_mode_fw.board_len = 0;
1039 	ar->normal_mode_fw.ext_board = NULL;
1040 	ar->normal_mode_fw.ext_board_data = NULL;
1041 	ar->normal_mode_fw.ext_board_len = 0;
1042 }
1043 EXPORT_SYMBOL(ath10k_core_free_board_files);
1044 
1045 static void ath10k_core_free_firmware_files(struct ath10k *ar)
1046 {
1047 	if (!IS_ERR(ar->normal_mode_fw.fw_file.firmware))
1048 		release_firmware(ar->normal_mode_fw.fw_file.firmware);
1049 
1050 	if (!IS_ERR(ar->cal_file))
1051 		release_firmware(ar->cal_file);
1052 
1053 	if (!IS_ERR(ar->pre_cal_file))
1054 		release_firmware(ar->pre_cal_file);
1055 
1056 	ath10k_swap_code_seg_release(ar, &ar->normal_mode_fw.fw_file);
1057 
1058 	ar->normal_mode_fw.fw_file.otp_data = NULL;
1059 	ar->normal_mode_fw.fw_file.otp_len = 0;
1060 
1061 	ar->normal_mode_fw.fw_file.firmware = NULL;
1062 	ar->normal_mode_fw.fw_file.firmware_data = NULL;
1063 	ar->normal_mode_fw.fw_file.firmware_len = 0;
1064 
1065 	ar->cal_file = NULL;
1066 	ar->pre_cal_file = NULL;
1067 }
1068 
1069 static int ath10k_fetch_cal_file(struct ath10k *ar)
1070 {
1071 	char filename[100];
1072 
1073 	/* pre-cal-<bus>-<id>.bin */
1074 	scnprintf(filename, sizeof(filename), "pre-cal-%s-%s.bin",
1075 		  ath10k_bus_str(ar->hif.bus), dev_name(ar->dev));
1076 
1077 	ar->pre_cal_file = ath10k_fetch_fw_file(ar, ATH10K_FW_DIR, filename);
1078 	if (!IS_ERR(ar->pre_cal_file))
1079 		goto success;
1080 
1081 	/* cal-<bus>-<id>.bin */
1082 	scnprintf(filename, sizeof(filename), "cal-%s-%s.bin",
1083 		  ath10k_bus_str(ar->hif.bus), dev_name(ar->dev));
1084 
1085 	ar->cal_file = ath10k_fetch_fw_file(ar, ATH10K_FW_DIR, filename);
1086 	if (IS_ERR(ar->cal_file))
1087 		/* calibration file is optional, don't print any warnings */
1088 		return PTR_ERR(ar->cal_file);
1089 success:
1090 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "found calibration file %s/%s\n",
1091 		   ATH10K_FW_DIR, filename);
1092 
1093 	return 0;
1094 }
1095 
1096 static int ath10k_core_fetch_board_data_api_1(struct ath10k *ar, int bd_ie_type)
1097 {
1098 	const struct firmware *fw;
1099 
1100 	if (bd_ie_type == ATH10K_BD_IE_BOARD) {
1101 		if (!ar->hw_params.fw.board) {
1102 			ath10k_err(ar, "failed to find board file fw entry\n");
1103 			return -EINVAL;
1104 		}
1105 
1106 		ar->normal_mode_fw.board = ath10k_fetch_fw_file(ar,
1107 								ar->hw_params.fw.dir,
1108 								ar->hw_params.fw.board);
1109 		if (IS_ERR(ar->normal_mode_fw.board))
1110 			return PTR_ERR(ar->normal_mode_fw.board);
1111 
1112 		ar->normal_mode_fw.board_data = ar->normal_mode_fw.board->data;
1113 		ar->normal_mode_fw.board_len = ar->normal_mode_fw.board->size;
1114 	} else if (bd_ie_type == ATH10K_BD_IE_BOARD_EXT) {
1115 		if (!ar->hw_params.fw.eboard) {
1116 			ath10k_err(ar, "failed to find eboard file fw entry\n");
1117 			return -EINVAL;
1118 		}
1119 
1120 		fw = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir,
1121 					  ar->hw_params.fw.eboard);
1122 		ar->normal_mode_fw.ext_board = fw;
1123 		if (IS_ERR(ar->normal_mode_fw.ext_board))
1124 			return PTR_ERR(ar->normal_mode_fw.ext_board);
1125 
1126 		ar->normal_mode_fw.ext_board_data = ar->normal_mode_fw.ext_board->data;
1127 		ar->normal_mode_fw.ext_board_len = ar->normal_mode_fw.ext_board->size;
1128 	}
1129 
1130 	return 0;
1131 }
1132 
1133 static int ath10k_core_parse_bd_ie_board(struct ath10k *ar,
1134 					 const void *buf, size_t buf_len,
1135 					 const char *boardname,
1136 					 int bd_ie_type)
1137 {
1138 	const struct ath10k_fw_ie *hdr;
1139 	bool name_match_found;
1140 	int ret, board_ie_id;
1141 	size_t board_ie_len;
1142 	const void *board_ie_data;
1143 
1144 	name_match_found = false;
1145 
1146 	/* go through ATH10K_BD_IE_BOARD_ elements */
1147 	while (buf_len > sizeof(struct ath10k_fw_ie)) {
1148 		hdr = buf;
1149 		board_ie_id = le32_to_cpu(hdr->id);
1150 		board_ie_len = le32_to_cpu(hdr->len);
1151 		board_ie_data = hdr->data;
1152 
1153 		buf_len -= sizeof(*hdr);
1154 		buf += sizeof(*hdr);
1155 
1156 		if (buf_len < ALIGN(board_ie_len, 4)) {
1157 			ath10k_err(ar, "invalid ATH10K_BD_IE_BOARD length: %zu < %zu\n",
1158 				   buf_len, ALIGN(board_ie_len, 4));
1159 			ret = -EINVAL;
1160 			goto out;
1161 		}
1162 
1163 		switch (board_ie_id) {
1164 		case ATH10K_BD_IE_BOARD_NAME:
1165 			ath10k_dbg_dump(ar, ATH10K_DBG_BOOT, "board name", "",
1166 					board_ie_data, board_ie_len);
1167 
1168 			if (board_ie_len != strlen(boardname))
1169 				break;
1170 
1171 			ret = memcmp(board_ie_data, boardname, strlen(boardname));
1172 			if (ret)
1173 				break;
1174 
1175 			name_match_found = true;
1176 			ath10k_dbg(ar, ATH10K_DBG_BOOT,
1177 				   "boot found match for name '%s'",
1178 				   boardname);
1179 			break;
1180 		case ATH10K_BD_IE_BOARD_DATA:
1181 			if (!name_match_found)
1182 				/* no match found */
1183 				break;
1184 
1185 			if (bd_ie_type == ATH10K_BD_IE_BOARD) {
1186 				ath10k_dbg(ar, ATH10K_DBG_BOOT,
1187 					   "boot found board data for '%s'",
1188 						boardname);
1189 
1190 				ar->normal_mode_fw.board_data = board_ie_data;
1191 				ar->normal_mode_fw.board_len = board_ie_len;
1192 			} else if (bd_ie_type == ATH10K_BD_IE_BOARD_EXT) {
1193 				ath10k_dbg(ar, ATH10K_DBG_BOOT,
1194 					   "boot found eboard data for '%s'",
1195 						boardname);
1196 
1197 				ar->normal_mode_fw.ext_board_data = board_ie_data;
1198 				ar->normal_mode_fw.ext_board_len = board_ie_len;
1199 			}
1200 
1201 			ret = 0;
1202 			goto out;
1203 		default:
1204 			ath10k_warn(ar, "unknown ATH10K_BD_IE_BOARD found: %d\n",
1205 				    board_ie_id);
1206 			break;
1207 		}
1208 
1209 		/* jump over the padding */
1210 		board_ie_len = ALIGN(board_ie_len, 4);
1211 
1212 		buf_len -= board_ie_len;
1213 		buf += board_ie_len;
1214 	}
1215 
1216 	/* no match found */
1217 	ret = -ENOENT;
1218 
1219 out:
1220 	return ret;
1221 }
1222 
1223 static int ath10k_core_search_bd(struct ath10k *ar,
1224 				 const char *boardname,
1225 				 const u8 *data,
1226 				 size_t len)
1227 {
1228 	size_t ie_len;
1229 	struct ath10k_fw_ie *hdr;
1230 	int ret = -ENOENT, ie_id;
1231 
1232 	while (len > sizeof(struct ath10k_fw_ie)) {
1233 		hdr = (struct ath10k_fw_ie *)data;
1234 		ie_id = le32_to_cpu(hdr->id);
1235 		ie_len = le32_to_cpu(hdr->len);
1236 
1237 		len -= sizeof(*hdr);
1238 		data = hdr->data;
1239 
1240 		if (len < ALIGN(ie_len, 4)) {
1241 			ath10k_err(ar, "invalid length for board ie_id %d ie_len %zu len %zu\n",
1242 				   ie_id, ie_len, len);
1243 			return -EINVAL;
1244 		}
1245 
1246 		switch (ie_id) {
1247 		case ATH10K_BD_IE_BOARD:
1248 			ret = ath10k_core_parse_bd_ie_board(ar, data, ie_len,
1249 							    boardname,
1250 							    ATH10K_BD_IE_BOARD);
1251 			if (ret == -ENOENT)
1252 				/* no match found, continue */
1253 				break;
1254 
1255 			/* either found or error, so stop searching */
1256 			goto out;
1257 		case ATH10K_BD_IE_BOARD_EXT:
1258 			ret = ath10k_core_parse_bd_ie_board(ar, data, ie_len,
1259 							    boardname,
1260 							    ATH10K_BD_IE_BOARD_EXT);
1261 			if (ret == -ENOENT)
1262 				/* no match found, continue */
1263 				break;
1264 
1265 			/* either found or error, so stop searching */
1266 			goto out;
1267 		}
1268 
1269 		/* jump over the padding */
1270 		ie_len = ALIGN(ie_len, 4);
1271 
1272 		len -= ie_len;
1273 		data += ie_len;
1274 	}
1275 
1276 out:
1277 	/* return result of parse_bd_ie_board() or -ENOENT */
1278 	return ret;
1279 }
1280 
1281 static int ath10k_core_fetch_board_data_api_n(struct ath10k *ar,
1282 					      const char *boardname,
1283 					      const char *fallback_boardname,
1284 					      const char *filename)
1285 {
1286 	size_t len, magic_len;
1287 	const u8 *data;
1288 	int ret;
1289 
1290 	/* Skip if already fetched during board data download */
1291 	if (!ar->normal_mode_fw.board)
1292 		ar->normal_mode_fw.board = ath10k_fetch_fw_file(ar,
1293 								ar->hw_params.fw.dir,
1294 								filename);
1295 	if (IS_ERR(ar->normal_mode_fw.board))
1296 		return PTR_ERR(ar->normal_mode_fw.board);
1297 
1298 	data = ar->normal_mode_fw.board->data;
1299 	len = ar->normal_mode_fw.board->size;
1300 
1301 	/* magic has extra null byte padded */
1302 	magic_len = strlen(ATH10K_BOARD_MAGIC) + 1;
1303 	if (len < magic_len) {
1304 		ath10k_err(ar, "failed to find magic value in %s/%s, file too short: %zu\n",
1305 			   ar->hw_params.fw.dir, filename, len);
1306 		ret = -EINVAL;
1307 		goto err;
1308 	}
1309 
1310 	if (memcmp(data, ATH10K_BOARD_MAGIC, magic_len)) {
1311 		ath10k_err(ar, "found invalid board magic\n");
1312 		ret = -EINVAL;
1313 		goto err;
1314 	}
1315 
1316 	/* magic is padded to 4 bytes */
1317 	magic_len = ALIGN(magic_len, 4);
1318 	if (len < magic_len) {
1319 		ath10k_err(ar, "failed: %s/%s too small to contain board data, len: %zu\n",
1320 			   ar->hw_params.fw.dir, filename, len);
1321 		ret = -EINVAL;
1322 		goto err;
1323 	}
1324 
1325 	data += magic_len;
1326 	len -= magic_len;
1327 
1328 	/* attempt to find boardname in the IE list */
1329 	ret = ath10k_core_search_bd(ar, boardname, data, len);
1330 
1331 	/* if we didn't find it and have a fallback name, try that */
1332 	if (ret == -ENOENT && fallback_boardname)
1333 		ret = ath10k_core_search_bd(ar, fallback_boardname, data, len);
1334 
1335 	if (ret == -ENOENT) {
1336 		ath10k_err(ar,
1337 			   "failed to fetch board data for %s from %s/%s\n",
1338 			   boardname, ar->hw_params.fw.dir, filename);
1339 		ret = -ENODATA;
1340 	}
1341 
1342 	if (ret)
1343 		goto err;
1344 
1345 	return 0;
1346 
1347 err:
1348 	ath10k_core_free_board_files(ar);
1349 	return ret;
1350 }
1351 
1352 static int ath10k_core_create_board_name(struct ath10k *ar, char *name,
1353 					 size_t name_len, bool with_variant)
1354 {
1355 	/* strlen(',variant=') + strlen(ar->id.bdf_ext) */
1356 	char variant[9 + ATH10K_SMBIOS_BDF_EXT_STR_LENGTH] = { 0 };
1357 
1358 	if (with_variant && ar->id.bdf_ext[0] != '\0')
1359 		scnprintf(variant, sizeof(variant), ",variant=%s",
1360 			  ar->id.bdf_ext);
1361 
1362 	if (ar->id.bmi_ids_valid) {
1363 		scnprintf(name, name_len,
1364 			  "bus=%s,bmi-chip-id=%d,bmi-board-id=%d%s",
1365 			  ath10k_bus_str(ar->hif.bus),
1366 			  ar->id.bmi_chip_id,
1367 			  ar->id.bmi_board_id, variant);
1368 		goto out;
1369 	}
1370 
1371 	if (ar->id.qmi_ids_valid) {
1372 		scnprintf(name, name_len,
1373 			  "bus=%s,qmi-board-id=%x",
1374 			  ath10k_bus_str(ar->hif.bus),
1375 			  ar->id.qmi_board_id);
1376 		goto out;
1377 	}
1378 
1379 	scnprintf(name, name_len,
1380 		  "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x%s",
1381 		  ath10k_bus_str(ar->hif.bus),
1382 		  ar->id.vendor, ar->id.device,
1383 		  ar->id.subsystem_vendor, ar->id.subsystem_device, variant);
1384 out:
1385 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot using board name '%s'\n", name);
1386 
1387 	return 0;
1388 }
1389 
1390 static int ath10k_core_create_eboard_name(struct ath10k *ar, char *name,
1391 					  size_t name_len)
1392 {
1393 	if (ar->id.bmi_ids_valid) {
1394 		scnprintf(name, name_len,
1395 			  "bus=%s,bmi-chip-id=%d,bmi-eboard-id=%d",
1396 			  ath10k_bus_str(ar->hif.bus),
1397 			  ar->id.bmi_chip_id,
1398 			  ar->id.bmi_eboard_id);
1399 
1400 		ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot using eboard name '%s'\n", name);
1401 		return 0;
1402 	}
1403 	/* Fallback if returned board id is zero */
1404 	return -1;
1405 }
1406 
1407 int ath10k_core_fetch_board_file(struct ath10k *ar, int bd_ie_type)
1408 {
1409 	char boardname[100], fallback_boardname[100];
1410 	int ret;
1411 
1412 	if (bd_ie_type == ATH10K_BD_IE_BOARD) {
1413 		ret = ath10k_core_create_board_name(ar, boardname,
1414 						    sizeof(boardname), true);
1415 		if (ret) {
1416 			ath10k_err(ar, "failed to create board name: %d", ret);
1417 			return ret;
1418 		}
1419 
1420 		ret = ath10k_core_create_board_name(ar, fallback_boardname,
1421 						    sizeof(boardname), false);
1422 		if (ret) {
1423 			ath10k_err(ar, "failed to create fallback board name: %d", ret);
1424 			return ret;
1425 		}
1426 	} else if (bd_ie_type == ATH10K_BD_IE_BOARD_EXT) {
1427 		ret = ath10k_core_create_eboard_name(ar, boardname,
1428 						     sizeof(boardname));
1429 		if (ret) {
1430 			ath10k_err(ar, "fallback to eboard.bin since board id 0");
1431 			goto fallback;
1432 		}
1433 	}
1434 
1435 	ar->bd_api = 2;
1436 	ret = ath10k_core_fetch_board_data_api_n(ar, boardname,
1437 						 fallback_boardname,
1438 						 ATH10K_BOARD_API2_FILE);
1439 	if (!ret)
1440 		goto success;
1441 
1442 fallback:
1443 	ar->bd_api = 1;
1444 	ret = ath10k_core_fetch_board_data_api_1(ar, bd_ie_type);
1445 	if (ret) {
1446 		ath10k_err(ar, "failed to fetch board-2.bin or board.bin from %s\n",
1447 			   ar->hw_params.fw.dir);
1448 		return ret;
1449 	}
1450 
1451 success:
1452 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "using board api %d\n", ar->bd_api);
1453 	return 0;
1454 }
1455 EXPORT_SYMBOL(ath10k_core_fetch_board_file);
1456 
1457 static int ath10k_core_get_ext_board_id_from_otp(struct ath10k *ar)
1458 {
1459 	u32 result, address;
1460 	u8 ext_board_id;
1461 	int ret;
1462 
1463 	address = ar->hw_params.patch_load_addr;
1464 
1465 	if (!ar->normal_mode_fw.fw_file.otp_data ||
1466 	    !ar->normal_mode_fw.fw_file.otp_len) {
1467 		ath10k_warn(ar,
1468 			    "failed to retrieve extended board id due to otp binary missing\n");
1469 		return -ENODATA;
1470 	}
1471 
1472 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
1473 		   "boot upload otp to 0x%x len %zd for ext board id\n",
1474 		   address, ar->normal_mode_fw.fw_file.otp_len);
1475 
1476 	ret = ath10k_bmi_fast_download(ar, address,
1477 				       ar->normal_mode_fw.fw_file.otp_data,
1478 				       ar->normal_mode_fw.fw_file.otp_len);
1479 	if (ret) {
1480 		ath10k_err(ar, "could not write otp for ext board id check: %d\n",
1481 			   ret);
1482 		return ret;
1483 	}
1484 
1485 	ret = ath10k_bmi_execute(ar, address, BMI_PARAM_GET_EXT_BOARD_ID, &result);
1486 	if (ret) {
1487 		ath10k_err(ar, "could not execute otp for ext board id check: %d\n",
1488 			   ret);
1489 		return ret;
1490 	}
1491 
1492 	if (!result) {
1493 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
1494 			   "ext board id does not exist in otp, ignore it\n");
1495 		return -EOPNOTSUPP;
1496 	}
1497 
1498 	ext_board_id = result & ATH10K_BMI_EBOARD_ID_STATUS_MASK;
1499 
1500 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
1501 		   "boot get otp ext board id result 0x%08x ext_board_id %d\n",
1502 		   result, ext_board_id);
1503 
1504 	ar->id.bmi_eboard_id = ext_board_id;
1505 
1506 	return 0;
1507 }
1508 
1509 static int ath10k_download_board_data(struct ath10k *ar, const void *data,
1510 				      size_t data_len)
1511 {
1512 	u32 board_data_size = ar->hw_params.fw.board_size;
1513 	u32 eboard_data_size = ar->hw_params.fw.ext_board_size;
1514 	u32 board_address;
1515 	u32 ext_board_address;
1516 	int ret;
1517 
1518 	ret = ath10k_push_board_ext_data(ar, data, data_len);
1519 	if (ret) {
1520 		ath10k_err(ar, "could not push board ext data (%d)\n", ret);
1521 		goto exit;
1522 	}
1523 
1524 	ret = ath10k_bmi_read32(ar, hi_board_data, &board_address);
1525 	if (ret) {
1526 		ath10k_err(ar, "could not read board data addr (%d)\n", ret);
1527 		goto exit;
1528 	}
1529 
1530 	ret = ath10k_bmi_write_memory(ar, board_address, data,
1531 				      min_t(u32, board_data_size,
1532 					    data_len));
1533 	if (ret) {
1534 		ath10k_err(ar, "could not write board data (%d)\n", ret);
1535 		goto exit;
1536 	}
1537 
1538 	ret = ath10k_bmi_write32(ar, hi_board_data_initialized, 1);
1539 	if (ret) {
1540 		ath10k_err(ar, "could not write board data bit (%d)\n", ret);
1541 		goto exit;
1542 	}
1543 
1544 	if (!ar->id.ext_bid_supported)
1545 		goto exit;
1546 
1547 	/* Extended board data download */
1548 	ret = ath10k_core_get_ext_board_id_from_otp(ar);
1549 	if (ret == -EOPNOTSUPP) {
1550 		/* Not fetching ext_board_data if ext board id is 0 */
1551 		ath10k_dbg(ar, ATH10K_DBG_BOOT, "otp returned ext board id 0\n");
1552 		return 0;
1553 	} else if (ret) {
1554 		ath10k_err(ar, "failed to get extended board id: %d\n", ret);
1555 		goto exit;
1556 	}
1557 
1558 	ret = ath10k_core_fetch_board_file(ar, ATH10K_BD_IE_BOARD_EXT);
1559 	if (ret)
1560 		goto exit;
1561 
1562 	if (ar->normal_mode_fw.ext_board_data) {
1563 		ext_board_address = board_address + EXT_BOARD_ADDRESS_OFFSET;
1564 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
1565 			   "boot writing ext board data to addr 0x%x",
1566 			   ext_board_address);
1567 		ret = ath10k_bmi_write_memory(ar, ext_board_address,
1568 					      ar->normal_mode_fw.ext_board_data,
1569 					      min_t(u32, eboard_data_size, data_len));
1570 		if (ret)
1571 			ath10k_err(ar, "failed to write ext board data: %d\n", ret);
1572 	}
1573 
1574 exit:
1575 	return ret;
1576 }
1577 
1578 static int ath10k_download_and_run_otp(struct ath10k *ar)
1579 {
1580 	u32 result, address = ar->hw_params.patch_load_addr;
1581 	u32 bmi_otp_exe_param = ar->hw_params.otp_exe_param;
1582 	int ret;
1583 
1584 	ret = ath10k_download_board_data(ar,
1585 					 ar->running_fw->board_data,
1586 					 ar->running_fw->board_len);
1587 	if (ret) {
1588 		ath10k_err(ar, "failed to download board data: %d\n", ret);
1589 		return ret;
1590 	}
1591 
1592 	/* OTP is optional */
1593 
1594 	if (!ar->running_fw->fw_file.otp_data ||
1595 	    !ar->running_fw->fw_file.otp_len) {
1596 		ath10k_warn(ar, "Not running otp, calibration will be incorrect (otp-data %pK otp_len %zd)!\n",
1597 			    ar->running_fw->fw_file.otp_data,
1598 			    ar->running_fw->fw_file.otp_len);
1599 		return 0;
1600 	}
1601 
1602 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot upload otp to 0x%x len %zd\n",
1603 		   address, ar->running_fw->fw_file.otp_len);
1604 
1605 	ret = ath10k_bmi_fast_download(ar, address,
1606 				       ar->running_fw->fw_file.otp_data,
1607 				       ar->running_fw->fw_file.otp_len);
1608 	if (ret) {
1609 		ath10k_err(ar, "could not write otp (%d)\n", ret);
1610 		return ret;
1611 	}
1612 
1613 	/* As of now pre-cal is valid for 10_4 variants */
1614 	if (ar->cal_mode == ATH10K_PRE_CAL_MODE_DT ||
1615 	    ar->cal_mode == ATH10K_PRE_CAL_MODE_FILE)
1616 		bmi_otp_exe_param = BMI_PARAM_FLASH_SECTION_ALL;
1617 
1618 	ret = ath10k_bmi_execute(ar, address, bmi_otp_exe_param, &result);
1619 	if (ret) {
1620 		ath10k_err(ar, "could not execute otp (%d)\n", ret);
1621 		return ret;
1622 	}
1623 
1624 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot otp execute result %d\n", result);
1625 
1626 	if (!(skip_otp || test_bit(ATH10K_FW_FEATURE_IGNORE_OTP_RESULT,
1627 				   ar->running_fw->fw_file.fw_features)) &&
1628 	    result != 0) {
1629 		ath10k_err(ar, "otp calibration failed: %d", result);
1630 		return -EINVAL;
1631 	}
1632 
1633 	return 0;
1634 }
1635 
1636 static int ath10k_download_cal_file(struct ath10k *ar,
1637 				    const struct firmware *file)
1638 {
1639 	int ret;
1640 
1641 	if (!file)
1642 		return -ENOENT;
1643 
1644 	if (IS_ERR(file))
1645 		return PTR_ERR(file);
1646 
1647 	ret = ath10k_download_board_data(ar, file->data, file->size);
1648 	if (ret) {
1649 		ath10k_err(ar, "failed to download cal_file data: %d\n", ret);
1650 		return ret;
1651 	}
1652 
1653 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot cal file downloaded\n");
1654 
1655 	return 0;
1656 }
1657 
1658 static int ath10k_download_cal_dt(struct ath10k *ar, const char *dt_name)
1659 {
1660 	struct device_node *node;
1661 	int data_len;
1662 	void *data;
1663 	int ret;
1664 
1665 	node = ar->dev->of_node;
1666 	if (!node)
1667 		/* Device Tree is optional, don't print any warnings if
1668 		 * there's no node for ath10k.
1669 		 */
1670 		return -ENOENT;
1671 
1672 	if (!of_get_property(node, dt_name, &data_len)) {
1673 		/* The calibration data node is optional */
1674 		return -ENOENT;
1675 	}
1676 
1677 	if (data_len != ar->hw_params.cal_data_len) {
1678 		ath10k_warn(ar, "invalid calibration data length in DT: %d\n",
1679 			    data_len);
1680 		ret = -EMSGSIZE;
1681 		goto out;
1682 	}
1683 
1684 	data = kmalloc(data_len, GFP_KERNEL);
1685 	if (!data) {
1686 		ret = -ENOMEM;
1687 		goto out;
1688 	}
1689 
1690 	ret = of_property_read_u8_array(node, dt_name, data, data_len);
1691 	if (ret) {
1692 		ath10k_warn(ar, "failed to read calibration data from DT: %d\n",
1693 			    ret);
1694 		goto out_free;
1695 	}
1696 
1697 	ret = ath10k_download_board_data(ar, data, data_len);
1698 	if (ret) {
1699 		ath10k_warn(ar, "failed to download calibration data from Device Tree: %d\n",
1700 			    ret);
1701 		goto out_free;
1702 	}
1703 
1704 	ret = 0;
1705 
1706 out_free:
1707 	kfree(data);
1708 
1709 out:
1710 	return ret;
1711 }
1712 
1713 static int ath10k_download_cal_eeprom(struct ath10k *ar)
1714 {
1715 	size_t data_len;
1716 	void *data = NULL;
1717 	int ret;
1718 
1719 	ret = ath10k_hif_fetch_cal_eeprom(ar, &data, &data_len);
1720 	if (ret) {
1721 		if (ret != -EOPNOTSUPP)
1722 			ath10k_warn(ar, "failed to read calibration data from EEPROM: %d\n",
1723 				    ret);
1724 		goto out_free;
1725 	}
1726 
1727 	ret = ath10k_download_board_data(ar, data, data_len);
1728 	if (ret) {
1729 		ath10k_warn(ar, "failed to download calibration data from EEPROM: %d\n",
1730 			    ret);
1731 		goto out_free;
1732 	}
1733 
1734 	ret = 0;
1735 
1736 out_free:
1737 	kfree(data);
1738 
1739 	return ret;
1740 }
1741 
1742 int ath10k_core_fetch_firmware_api_n(struct ath10k *ar, const char *name,
1743 				     struct ath10k_fw_file *fw_file)
1744 {
1745 	size_t magic_len, len, ie_len;
1746 	int ie_id, i, index, bit, ret;
1747 	struct ath10k_fw_ie *hdr;
1748 	const u8 *data;
1749 	__le32 *timestamp, *version;
1750 
1751 	/* first fetch the firmware file (firmware-*.bin) */
1752 	fw_file->firmware = ath10k_fetch_fw_file(ar, ar->hw_params.fw.dir,
1753 						 name);
1754 	if (IS_ERR(fw_file->firmware))
1755 		return PTR_ERR(fw_file->firmware);
1756 
1757 	data = fw_file->firmware->data;
1758 	len = fw_file->firmware->size;
1759 
1760 	/* magic also includes the null byte, check that as well */
1761 	magic_len = strlen(ATH10K_FIRMWARE_MAGIC) + 1;
1762 
1763 	if (len < magic_len) {
1764 		ath10k_err(ar, "firmware file '%s/%s' too small to contain magic: %zu\n",
1765 			   ar->hw_params.fw.dir, name, len);
1766 		ret = -EINVAL;
1767 		goto err;
1768 	}
1769 
1770 	if (memcmp(data, ATH10K_FIRMWARE_MAGIC, magic_len) != 0) {
1771 		ath10k_err(ar, "invalid firmware magic\n");
1772 		ret = -EINVAL;
1773 		goto err;
1774 	}
1775 
1776 	/* jump over the padding */
1777 	magic_len = ALIGN(magic_len, 4);
1778 
1779 	len -= magic_len;
1780 	data += magic_len;
1781 
1782 	/* loop elements */
1783 	while (len > sizeof(struct ath10k_fw_ie)) {
1784 		hdr = (struct ath10k_fw_ie *)data;
1785 
1786 		ie_id = le32_to_cpu(hdr->id);
1787 		ie_len = le32_to_cpu(hdr->len);
1788 
1789 		len -= sizeof(*hdr);
1790 		data += sizeof(*hdr);
1791 
1792 		if (len < ie_len) {
1793 			ath10k_err(ar, "invalid length for FW IE %d (%zu < %zu)\n",
1794 				   ie_id, len, ie_len);
1795 			ret = -EINVAL;
1796 			goto err;
1797 		}
1798 
1799 		switch (ie_id) {
1800 		case ATH10K_FW_IE_FW_VERSION:
1801 			if (ie_len > sizeof(fw_file->fw_version) - 1)
1802 				break;
1803 
1804 			memcpy(fw_file->fw_version, data, ie_len);
1805 			fw_file->fw_version[ie_len] = '\0';
1806 
1807 			ath10k_dbg(ar, ATH10K_DBG_BOOT,
1808 				   "found fw version %s\n",
1809 				    fw_file->fw_version);
1810 			break;
1811 		case ATH10K_FW_IE_TIMESTAMP:
1812 			if (ie_len != sizeof(u32))
1813 				break;
1814 
1815 			timestamp = (__le32 *)data;
1816 
1817 			ath10k_dbg(ar, ATH10K_DBG_BOOT, "found fw timestamp %d\n",
1818 				   le32_to_cpup(timestamp));
1819 			break;
1820 		case ATH10K_FW_IE_FEATURES:
1821 			ath10k_dbg(ar, ATH10K_DBG_BOOT,
1822 				   "found firmware features ie (%zd B)\n",
1823 				   ie_len);
1824 
1825 			for (i = 0; i < ATH10K_FW_FEATURE_COUNT; i++) {
1826 				index = i / 8;
1827 				bit = i % 8;
1828 
1829 				if (index == ie_len)
1830 					break;
1831 
1832 				if (data[index] & (1 << bit)) {
1833 					ath10k_dbg(ar, ATH10K_DBG_BOOT,
1834 						   "Enabling feature bit: %i\n",
1835 						   i);
1836 					__set_bit(i, fw_file->fw_features);
1837 				}
1838 			}
1839 
1840 			ath10k_dbg_dump(ar, ATH10K_DBG_BOOT, "features", "",
1841 					fw_file->fw_features,
1842 					sizeof(fw_file->fw_features));
1843 			break;
1844 		case ATH10K_FW_IE_FW_IMAGE:
1845 			ath10k_dbg(ar, ATH10K_DBG_BOOT,
1846 				   "found fw image ie (%zd B)\n",
1847 				   ie_len);
1848 
1849 			fw_file->firmware_data = data;
1850 			fw_file->firmware_len = ie_len;
1851 
1852 			break;
1853 		case ATH10K_FW_IE_OTP_IMAGE:
1854 			ath10k_dbg(ar, ATH10K_DBG_BOOT,
1855 				   "found otp image ie (%zd B)\n",
1856 				   ie_len);
1857 
1858 			fw_file->otp_data = data;
1859 			fw_file->otp_len = ie_len;
1860 
1861 			break;
1862 		case ATH10K_FW_IE_WMI_OP_VERSION:
1863 			if (ie_len != sizeof(u32))
1864 				break;
1865 
1866 			version = (__le32 *)data;
1867 
1868 			fw_file->wmi_op_version = le32_to_cpup(version);
1869 
1870 			ath10k_dbg(ar, ATH10K_DBG_BOOT, "found fw ie wmi op version %d\n",
1871 				   fw_file->wmi_op_version);
1872 			break;
1873 		case ATH10K_FW_IE_HTT_OP_VERSION:
1874 			if (ie_len != sizeof(u32))
1875 				break;
1876 
1877 			version = (__le32 *)data;
1878 
1879 			fw_file->htt_op_version = le32_to_cpup(version);
1880 
1881 			ath10k_dbg(ar, ATH10K_DBG_BOOT, "found fw ie htt op version %d\n",
1882 				   fw_file->htt_op_version);
1883 			break;
1884 		case ATH10K_FW_IE_FW_CODE_SWAP_IMAGE:
1885 			ath10k_dbg(ar, ATH10K_DBG_BOOT,
1886 				   "found fw code swap image ie (%zd B)\n",
1887 				   ie_len);
1888 			fw_file->codeswap_data = data;
1889 			fw_file->codeswap_len = ie_len;
1890 			break;
1891 		default:
1892 			ath10k_warn(ar, "Unknown FW IE: %u\n",
1893 				    le32_to_cpu(hdr->id));
1894 			break;
1895 		}
1896 
1897 		/* jump over the padding */
1898 		ie_len = ALIGN(ie_len, 4);
1899 
1900 		len -= ie_len;
1901 		data += ie_len;
1902 	}
1903 
1904 	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI, fw_file->fw_features) &&
1905 	    (!fw_file->firmware_data || !fw_file->firmware_len)) {
1906 		ath10k_warn(ar, "No ATH10K_FW_IE_FW_IMAGE found from '%s/%s', skipping\n",
1907 			    ar->hw_params.fw.dir, name);
1908 		ret = -ENOMEDIUM;
1909 		goto err;
1910 	}
1911 
1912 	return 0;
1913 
1914 err:
1915 	ath10k_core_free_firmware_files(ar);
1916 	return ret;
1917 }
1918 
1919 static void ath10k_core_get_fw_name(struct ath10k *ar, char *fw_name,
1920 				    size_t fw_name_len, int fw_api)
1921 {
1922 	switch (ar->hif.bus) {
1923 	case ATH10K_BUS_SDIO:
1924 	case ATH10K_BUS_USB:
1925 		scnprintf(fw_name, fw_name_len, "%s-%s-%d.bin",
1926 			  ATH10K_FW_FILE_BASE, ath10k_bus_str(ar->hif.bus),
1927 			  fw_api);
1928 		break;
1929 	case ATH10K_BUS_PCI:
1930 	case ATH10K_BUS_AHB:
1931 	case ATH10K_BUS_SNOC:
1932 		scnprintf(fw_name, fw_name_len, "%s-%d.bin",
1933 			  ATH10K_FW_FILE_BASE, fw_api);
1934 		break;
1935 	}
1936 }
1937 
1938 static int ath10k_core_fetch_firmware_files(struct ath10k *ar)
1939 {
1940 	int ret, i;
1941 	char fw_name[100];
1942 
1943 	/* calibration file is optional, don't check for any errors */
1944 	ath10k_fetch_cal_file(ar);
1945 
1946 	for (i = ATH10K_FW_API_MAX; i >= ATH10K_FW_API_MIN; i--) {
1947 		ar->fw_api = i;
1948 		ath10k_dbg(ar, ATH10K_DBG_BOOT, "trying fw api %d\n",
1949 			   ar->fw_api);
1950 
1951 		ath10k_core_get_fw_name(ar, fw_name, sizeof(fw_name), ar->fw_api);
1952 		ret = ath10k_core_fetch_firmware_api_n(ar, fw_name,
1953 						       &ar->normal_mode_fw.fw_file);
1954 		if (!ret)
1955 			goto success;
1956 	}
1957 
1958 	/* we end up here if we couldn't fetch any firmware */
1959 
1960 	ath10k_err(ar, "Failed to find firmware-N.bin (N between %d and %d) from %s: %d",
1961 		   ATH10K_FW_API_MIN, ATH10K_FW_API_MAX, ar->hw_params.fw.dir,
1962 		   ret);
1963 
1964 	return ret;
1965 
1966 success:
1967 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "using fw api %d\n", ar->fw_api);
1968 
1969 	return 0;
1970 }
1971 
1972 static int ath10k_core_pre_cal_download(struct ath10k *ar)
1973 {
1974 	int ret;
1975 
1976 	ret = ath10k_download_cal_file(ar, ar->pre_cal_file);
1977 	if (ret == 0) {
1978 		ar->cal_mode = ATH10K_PRE_CAL_MODE_FILE;
1979 		goto success;
1980 	}
1981 
1982 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
1983 		   "boot did not find a pre calibration file, try DT next: %d\n",
1984 		   ret);
1985 
1986 	ret = ath10k_download_cal_dt(ar, "qcom,ath10k-pre-calibration-data");
1987 	if (ret) {
1988 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
1989 			   "unable to load pre cal data from DT: %d\n", ret);
1990 		return ret;
1991 	}
1992 	ar->cal_mode = ATH10K_PRE_CAL_MODE_DT;
1993 
1994 success:
1995 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot using calibration mode %s\n",
1996 		   ath10k_cal_mode_str(ar->cal_mode));
1997 
1998 	return 0;
1999 }
2000 
2001 static int ath10k_core_pre_cal_config(struct ath10k *ar)
2002 {
2003 	int ret;
2004 
2005 	ret = ath10k_core_pre_cal_download(ar);
2006 	if (ret) {
2007 		ath10k_dbg(ar, ATH10K_DBG_BOOT,
2008 			   "failed to load pre cal data: %d\n", ret);
2009 		return ret;
2010 	}
2011 
2012 	ret = ath10k_core_get_board_id_from_otp(ar);
2013 	if (ret) {
2014 		ath10k_err(ar, "failed to get board id: %d\n", ret);
2015 		return ret;
2016 	}
2017 
2018 	ret = ath10k_download_and_run_otp(ar);
2019 	if (ret) {
2020 		ath10k_err(ar, "failed to run otp: %d\n", ret);
2021 		return ret;
2022 	}
2023 
2024 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
2025 		   "pre cal configuration done successfully\n");
2026 
2027 	return 0;
2028 }
2029 
2030 static int ath10k_download_cal_data(struct ath10k *ar)
2031 {
2032 	int ret;
2033 
2034 	ret = ath10k_core_pre_cal_config(ar);
2035 	if (ret == 0)
2036 		return 0;
2037 
2038 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
2039 		   "pre cal download procedure failed, try cal file: %d\n",
2040 		   ret);
2041 
2042 	ret = ath10k_download_cal_file(ar, ar->cal_file);
2043 	if (ret == 0) {
2044 		ar->cal_mode = ATH10K_CAL_MODE_FILE;
2045 		goto done;
2046 	}
2047 
2048 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
2049 		   "boot did not find a calibration file, try DT next: %d\n",
2050 		   ret);
2051 
2052 	ret = ath10k_download_cal_dt(ar, "qcom,ath10k-calibration-data");
2053 	if (ret == 0) {
2054 		ar->cal_mode = ATH10K_CAL_MODE_DT;
2055 		goto done;
2056 	}
2057 
2058 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
2059 		   "boot did not find DT entry, try target EEPROM next: %d\n",
2060 		   ret);
2061 
2062 	ret = ath10k_download_cal_eeprom(ar);
2063 	if (ret == 0) {
2064 		ar->cal_mode = ATH10K_CAL_MODE_EEPROM;
2065 		goto done;
2066 	}
2067 
2068 	ath10k_dbg(ar, ATH10K_DBG_BOOT,
2069 		   "boot did not find target EEPROM entry, try OTP next: %d\n",
2070 		   ret);
2071 
2072 	ret = ath10k_download_and_run_otp(ar);
2073 	if (ret) {
2074 		ath10k_err(ar, "failed to run otp: %d\n", ret);
2075 		return ret;
2076 	}
2077 
2078 	ar->cal_mode = ATH10K_CAL_MODE_OTP;
2079 
2080 done:
2081 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "boot using calibration mode %s\n",
2082 		   ath10k_cal_mode_str(ar->cal_mode));
2083 	return 0;
2084 }
2085 
2086 static int ath10k_init_uart(struct ath10k *ar)
2087 {
2088 	int ret;
2089 
2090 	/*
2091 	 * Explicitly setting UART prints to zero as target turns it on
2092 	 * based on scratch registers.
2093 	 */
2094 	ret = ath10k_bmi_write32(ar, hi_serial_enable, 0);
2095 	if (ret) {
2096 		ath10k_warn(ar, "could not disable UART prints (%d)\n", ret);
2097 		return ret;
2098 	}
2099 
2100 	if (!uart_print && ar->hw_params.uart_pin_workaround) {
2101 		ret = ath10k_bmi_write32(ar, hi_dbg_uart_txpin,
2102 					 ar->hw_params.uart_pin);
2103 		if (ret) {
2104 			ath10k_warn(ar, "failed to set UART TX pin: %d", ret);
2105 			return ret;
2106 		}
2107 
2108 		return 0;
2109 	}
2110 
2111 	ret = ath10k_bmi_write32(ar, hi_dbg_uart_txpin, ar->hw_params.uart_pin);
2112 	if (ret) {
2113 		ath10k_warn(ar, "could not enable UART prints (%d)\n", ret);
2114 		return ret;
2115 	}
2116 
2117 	ret = ath10k_bmi_write32(ar, hi_serial_enable, 1);
2118 	if (ret) {
2119 		ath10k_warn(ar, "could not enable UART prints (%d)\n", ret);
2120 		return ret;
2121 	}
2122 
2123 	/* Set the UART baud rate to 19200. */
2124 	ret = ath10k_bmi_write32(ar, hi_desired_baud_rate, 19200);
2125 	if (ret) {
2126 		ath10k_warn(ar, "could not set the baud rate (%d)\n", ret);
2127 		return ret;
2128 	}
2129 
2130 	ath10k_info(ar, "UART prints enabled\n");
2131 	return 0;
2132 }
2133 
2134 static int ath10k_init_hw_params(struct ath10k *ar)
2135 {
2136 	const struct ath10k_hw_params *uninitialized_var(hw_params);
2137 	int i;
2138 
2139 	for (i = 0; i < ARRAY_SIZE(ath10k_hw_params_list); i++) {
2140 		hw_params = &ath10k_hw_params_list[i];
2141 
2142 		if (hw_params->bus == ar->hif.bus &&
2143 		    hw_params->id == ar->target_version &&
2144 		    hw_params->dev_id == ar->dev_id)
2145 			break;
2146 	}
2147 
2148 	if (i == ARRAY_SIZE(ath10k_hw_params_list)) {
2149 		ath10k_err(ar, "Unsupported hardware version: 0x%x\n",
2150 			   ar->target_version);
2151 		return -EINVAL;
2152 	}
2153 
2154 	ar->hw_params = *hw_params;
2155 
2156 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "Hardware name %s version 0x%x\n",
2157 		   ar->hw_params.name, ar->target_version);
2158 
2159 	return 0;
2160 }
2161 
2162 static void ath10k_core_restart(struct work_struct *work)
2163 {
2164 	struct ath10k *ar = container_of(work, struct ath10k, restart_work);
2165 	int ret;
2166 
2167 	set_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);
2168 
2169 	/* Place a barrier to make sure the compiler doesn't reorder
2170 	 * CRASH_FLUSH and calling other functions.
2171 	 */
2172 	barrier();
2173 
2174 	ieee80211_stop_queues(ar->hw);
2175 	ath10k_drain_tx(ar);
2176 	complete(&ar->scan.started);
2177 	complete(&ar->scan.completed);
2178 	complete(&ar->scan.on_channel);
2179 	complete(&ar->offchan_tx_completed);
2180 	complete(&ar->install_key_done);
2181 	complete(&ar->vdev_setup_done);
2182 	complete(&ar->thermal.wmi_sync);
2183 	complete(&ar->bss_survey_done);
2184 	wake_up(&ar->htt.empty_tx_wq);
2185 	wake_up(&ar->wmi.tx_credits_wq);
2186 	wake_up(&ar->peer_mapping_wq);
2187 
2188 	/* TODO: We can have one instance of cancelling coverage_class_work by
2189 	 * moving it to ath10k_halt(), so that both stop() and restart() would
2190 	 * call that but it takes conf_mutex() and if we call cancel_work_sync()
2191 	 * with conf_mutex it will deadlock.
2192 	 */
2193 	cancel_work_sync(&ar->set_coverage_class_work);
2194 
2195 	mutex_lock(&ar->conf_mutex);
2196 
2197 	switch (ar->state) {
2198 	case ATH10K_STATE_ON:
2199 		ar->state = ATH10K_STATE_RESTARTING;
2200 		ath10k_halt(ar);
2201 		ath10k_scan_finish(ar);
2202 		ieee80211_restart_hw(ar->hw);
2203 		break;
2204 	case ATH10K_STATE_OFF:
2205 		/* this can happen if driver is being unloaded
2206 		 * or if the crash happens during FW probing
2207 		 */
2208 		ath10k_warn(ar, "cannot restart a device that hasn't been started\n");
2209 		break;
2210 	case ATH10K_STATE_RESTARTING:
2211 		/* hw restart might be requested from multiple places */
2212 		break;
2213 	case ATH10K_STATE_RESTARTED:
2214 		ar->state = ATH10K_STATE_WEDGED;
2215 		/* fall through */
2216 	case ATH10K_STATE_WEDGED:
2217 		ath10k_warn(ar, "device is wedged, will not restart\n");
2218 		break;
2219 	case ATH10K_STATE_UTF:
2220 		ath10k_warn(ar, "firmware restart in UTF mode not supported\n");
2221 		break;
2222 	}
2223 
2224 	mutex_unlock(&ar->conf_mutex);
2225 
2226 	ret = ath10k_coredump_submit(ar);
2227 	if (ret)
2228 		ath10k_warn(ar, "failed to send firmware crash dump via devcoredump: %d",
2229 			    ret);
2230 
2231 	complete(&ar->driver_recovery);
2232 }
2233 
2234 static void ath10k_core_set_coverage_class_work(struct work_struct *work)
2235 {
2236 	struct ath10k *ar = container_of(work, struct ath10k,
2237 					 set_coverage_class_work);
2238 
2239 	if (ar->hw_params.hw_ops->set_coverage_class)
2240 		ar->hw_params.hw_ops->set_coverage_class(ar, -1);
2241 }
2242 
2243 static int ath10k_core_init_firmware_features(struct ath10k *ar)
2244 {
2245 	struct ath10k_fw_file *fw_file = &ar->normal_mode_fw.fw_file;
2246 	int max_num_peers;
2247 
2248 	if (test_bit(ATH10K_FW_FEATURE_WMI_10_2, fw_file->fw_features) &&
2249 	    !test_bit(ATH10K_FW_FEATURE_WMI_10X, fw_file->fw_features)) {
2250 		ath10k_err(ar, "feature bits corrupted: 10.2 feature requires 10.x feature to be set as well");
2251 		return -EINVAL;
2252 	}
2253 
2254 	if (fw_file->wmi_op_version >= ATH10K_FW_WMI_OP_VERSION_MAX) {
2255 		ath10k_err(ar, "unsupported WMI OP version (max %d): %d\n",
2256 			   ATH10K_FW_WMI_OP_VERSION_MAX, fw_file->wmi_op_version);
2257 		return -EINVAL;
2258 	}
2259 
2260 	ar->wmi.rx_decap_mode = ATH10K_HW_TXRX_NATIVE_WIFI;
2261 	switch (ath10k_cryptmode_param) {
2262 	case ATH10K_CRYPT_MODE_HW:
2263 		clear_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags);
2264 		clear_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags);
2265 		break;
2266 	case ATH10K_CRYPT_MODE_SW:
2267 		if (!test_bit(ATH10K_FW_FEATURE_RAW_MODE_SUPPORT,
2268 			      fw_file->fw_features)) {
2269 			ath10k_err(ar, "cryptmode > 0 requires raw mode support from firmware");
2270 			return -EINVAL;
2271 		}
2272 
2273 		set_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags);
2274 		set_bit(ATH10K_FLAG_HW_CRYPTO_DISABLED, &ar->dev_flags);
2275 		break;
2276 	default:
2277 		ath10k_info(ar, "invalid cryptmode: %d\n",
2278 			    ath10k_cryptmode_param);
2279 		return -EINVAL;
2280 	}
2281 
2282 	ar->htt.max_num_amsdu = ATH10K_HTT_MAX_NUM_AMSDU_DEFAULT;
2283 	ar->htt.max_num_ampdu = ATH10K_HTT_MAX_NUM_AMPDU_DEFAULT;
2284 
2285 	if (rawmode) {
2286 		if (!test_bit(ATH10K_FW_FEATURE_RAW_MODE_SUPPORT,
2287 			      fw_file->fw_features)) {
2288 			ath10k_err(ar, "rawmode = 1 requires support from firmware");
2289 			return -EINVAL;
2290 		}
2291 		set_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags);
2292 	}
2293 
2294 	if (test_bit(ATH10K_FLAG_RAW_MODE, &ar->dev_flags)) {
2295 		ar->wmi.rx_decap_mode = ATH10K_HW_TXRX_RAW;
2296 
2297 		/* Workaround:
2298 		 *
2299 		 * Firmware A-MSDU aggregation breaks with RAW Tx encap mode
2300 		 * and causes enormous performance issues (malformed frames,
2301 		 * etc).
2302 		 *
2303 		 * Disabling A-MSDU makes RAW mode stable with heavy traffic
2304 		 * albeit a bit slower compared to regular operation.
2305 		 */
2306 		ar->htt.max_num_amsdu = 1;
2307 	}
2308 
2309 	/* Backwards compatibility for firmwares without
2310 	 * ATH10K_FW_IE_WMI_OP_VERSION.
2311 	 */
2312 	if (fw_file->wmi_op_version == ATH10K_FW_WMI_OP_VERSION_UNSET) {
2313 		if (test_bit(ATH10K_FW_FEATURE_WMI_10X, fw_file->fw_features)) {
2314 			if (test_bit(ATH10K_FW_FEATURE_WMI_10_2,
2315 				     fw_file->fw_features))
2316 				fw_file->wmi_op_version = ATH10K_FW_WMI_OP_VERSION_10_2;
2317 			else
2318 				fw_file->wmi_op_version = ATH10K_FW_WMI_OP_VERSION_10_1;
2319 		} else {
2320 			fw_file->wmi_op_version = ATH10K_FW_WMI_OP_VERSION_MAIN;
2321 		}
2322 	}
2323 
2324 	switch (fw_file->wmi_op_version) {
2325 	case ATH10K_FW_WMI_OP_VERSION_MAIN:
2326 		max_num_peers = TARGET_NUM_PEERS;
2327 		ar->max_num_stations = TARGET_NUM_STATIONS;
2328 		ar->max_num_vdevs = TARGET_NUM_VDEVS;
2329 		ar->htt.max_num_pending_tx = TARGET_NUM_MSDU_DESC;
2330 		ar->fw_stats_req_mask = WMI_STAT_PDEV | WMI_STAT_VDEV |
2331 			WMI_STAT_PEER;
2332 		ar->max_spatial_stream = WMI_MAX_SPATIAL_STREAM;
2333 		break;
2334 	case ATH10K_FW_WMI_OP_VERSION_10_1:
2335 	case ATH10K_FW_WMI_OP_VERSION_10_2:
2336 	case ATH10K_FW_WMI_OP_VERSION_10_2_4:
2337 		if (ath10k_peer_stats_enabled(ar)) {
2338 			max_num_peers = TARGET_10X_TX_STATS_NUM_PEERS;
2339 			ar->max_num_stations = TARGET_10X_TX_STATS_NUM_STATIONS;
2340 		} else {
2341 			max_num_peers = TARGET_10X_NUM_PEERS;
2342 			ar->max_num_stations = TARGET_10X_NUM_STATIONS;
2343 		}
2344 		ar->max_num_vdevs = TARGET_10X_NUM_VDEVS;
2345 		ar->htt.max_num_pending_tx = TARGET_10X_NUM_MSDU_DESC;
2346 		ar->fw_stats_req_mask = WMI_STAT_PEER;
2347 		ar->max_spatial_stream = WMI_MAX_SPATIAL_STREAM;
2348 		break;
2349 	case ATH10K_FW_WMI_OP_VERSION_TLV:
2350 		max_num_peers = TARGET_TLV_NUM_PEERS;
2351 		ar->max_num_stations = TARGET_TLV_NUM_STATIONS;
2352 		ar->max_num_vdevs = TARGET_TLV_NUM_VDEVS;
2353 		ar->max_num_tdls_vdevs = TARGET_TLV_NUM_TDLS_VDEVS;
2354 		if (ar->hif.bus == ATH10K_BUS_SDIO)
2355 			ar->htt.max_num_pending_tx =
2356 				TARGET_TLV_NUM_MSDU_DESC_HL;
2357 		else
2358 			ar->htt.max_num_pending_tx = TARGET_TLV_NUM_MSDU_DESC;
2359 		ar->wow.max_num_patterns = TARGET_TLV_NUM_WOW_PATTERNS;
2360 		ar->fw_stats_req_mask = WMI_TLV_STAT_PDEV | WMI_TLV_STAT_VDEV |
2361 			WMI_TLV_STAT_PEER | WMI_TLV_STAT_PEER_EXTD;
2362 		ar->max_spatial_stream = WMI_MAX_SPATIAL_STREAM;
2363 		ar->wmi.mgmt_max_num_pending_tx = TARGET_TLV_MGMT_NUM_MSDU_DESC;
2364 		break;
2365 	case ATH10K_FW_WMI_OP_VERSION_10_4:
2366 		max_num_peers = TARGET_10_4_NUM_PEERS;
2367 		ar->max_num_stations = TARGET_10_4_NUM_STATIONS;
2368 		ar->num_active_peers = TARGET_10_4_ACTIVE_PEERS;
2369 		ar->max_num_vdevs = TARGET_10_4_NUM_VDEVS;
2370 		ar->num_tids = TARGET_10_4_TGT_NUM_TIDS;
2371 		ar->fw_stats_req_mask = WMI_10_4_STAT_PEER |
2372 					WMI_10_4_STAT_PEER_EXTD |
2373 					WMI_10_4_STAT_VDEV_EXTD;
2374 		ar->max_spatial_stream = ar->hw_params.max_spatial_stream;
2375 		ar->max_num_tdls_vdevs = TARGET_10_4_NUM_TDLS_VDEVS;
2376 
2377 		if (test_bit(ATH10K_FW_FEATURE_PEER_FLOW_CONTROL,
2378 			     fw_file->fw_features))
2379 			ar->htt.max_num_pending_tx = TARGET_10_4_NUM_MSDU_DESC_PFC;
2380 		else
2381 			ar->htt.max_num_pending_tx = TARGET_10_4_NUM_MSDU_DESC;
2382 		break;
2383 	case ATH10K_FW_WMI_OP_VERSION_UNSET:
2384 	case ATH10K_FW_WMI_OP_VERSION_MAX:
2385 	default:
2386 		WARN_ON(1);
2387 		return -EINVAL;
2388 	}
2389 
2390 	if (ar->hw_params.num_peers)
2391 		ar->max_num_peers = ar->hw_params.num_peers;
2392 	else
2393 		ar->max_num_peers = max_num_peers;
2394 
2395 	/* Backwards compatibility for firmwares without
2396 	 * ATH10K_FW_IE_HTT_OP_VERSION.
2397 	 */
2398 	if (fw_file->htt_op_version == ATH10K_FW_HTT_OP_VERSION_UNSET) {
2399 		switch (fw_file->wmi_op_version) {
2400 		case ATH10K_FW_WMI_OP_VERSION_MAIN:
2401 			fw_file->htt_op_version = ATH10K_FW_HTT_OP_VERSION_MAIN;
2402 			break;
2403 		case ATH10K_FW_WMI_OP_VERSION_10_1:
2404 		case ATH10K_FW_WMI_OP_VERSION_10_2:
2405 		case ATH10K_FW_WMI_OP_VERSION_10_2_4:
2406 			fw_file->htt_op_version = ATH10K_FW_HTT_OP_VERSION_10_1;
2407 			break;
2408 		case ATH10K_FW_WMI_OP_VERSION_TLV:
2409 			fw_file->htt_op_version = ATH10K_FW_HTT_OP_VERSION_TLV;
2410 			break;
2411 		case ATH10K_FW_WMI_OP_VERSION_10_4:
2412 		case ATH10K_FW_WMI_OP_VERSION_UNSET:
2413 		case ATH10K_FW_WMI_OP_VERSION_MAX:
2414 			ath10k_err(ar, "htt op version not found from fw meta data");
2415 			return -EINVAL;
2416 		}
2417 	}
2418 
2419 	return 0;
2420 }
2421 
2422 static int ath10k_core_reset_rx_filter(struct ath10k *ar)
2423 {
2424 	int ret;
2425 	int vdev_id;
2426 	int vdev_type;
2427 	int vdev_subtype;
2428 	const u8 *vdev_addr;
2429 
2430 	vdev_id = 0;
2431 	vdev_type = WMI_VDEV_TYPE_STA;
2432 	vdev_subtype = ath10k_wmi_get_vdev_subtype(ar, WMI_VDEV_SUBTYPE_NONE);
2433 	vdev_addr = ar->mac_addr;
2434 
2435 	ret = ath10k_wmi_vdev_create(ar, vdev_id, vdev_type, vdev_subtype,
2436 				     vdev_addr);
2437 	if (ret) {
2438 		ath10k_err(ar, "failed to create dummy vdev: %d\n", ret);
2439 		return ret;
2440 	}
2441 
2442 	ret = ath10k_wmi_vdev_delete(ar, vdev_id);
2443 	if (ret) {
2444 		ath10k_err(ar, "failed to delete dummy vdev: %d\n", ret);
2445 		return ret;
2446 	}
2447 
2448 	/* WMI and HTT may use separate HIF pipes and are not guaranteed to be
2449 	 * serialized properly implicitly.
2450 	 *
2451 	 * Moreover (most) WMI commands have no explicit acknowledges. It is
2452 	 * possible to infer it implicitly by poking firmware with echo
2453 	 * command - getting a reply means all preceding comments have been
2454 	 * (mostly) processed.
2455 	 *
2456 	 * In case of vdev create/delete this is sufficient.
2457 	 *
2458 	 * Without this it's possible to end up with a race when HTT Rx ring is
2459 	 * started before vdev create/delete hack is complete allowing a short
2460 	 * window of opportunity to receive (and Tx ACK) a bunch of frames.
2461 	 */
2462 	ret = ath10k_wmi_barrier(ar);
2463 	if (ret) {
2464 		ath10k_err(ar, "failed to ping firmware: %d\n", ret);
2465 		return ret;
2466 	}
2467 
2468 	return 0;
2469 }
2470 
2471 static int ath10k_core_compat_services(struct ath10k *ar)
2472 {
2473 	struct ath10k_fw_file *fw_file = &ar->normal_mode_fw.fw_file;
2474 
2475 	/* all 10.x firmware versions support thermal throttling but don't
2476 	 * advertise the support via service flags so we have to hardcode
2477 	 * it here
2478 	 */
2479 	switch (fw_file->wmi_op_version) {
2480 	case ATH10K_FW_WMI_OP_VERSION_10_1:
2481 	case ATH10K_FW_WMI_OP_VERSION_10_2:
2482 	case ATH10K_FW_WMI_OP_VERSION_10_2_4:
2483 	case ATH10K_FW_WMI_OP_VERSION_10_4:
2484 		set_bit(WMI_SERVICE_THERM_THROT, ar->wmi.svc_map);
2485 		break;
2486 	default:
2487 		break;
2488 	}
2489 
2490 	return 0;
2491 }
2492 
2493 int ath10k_core_start(struct ath10k *ar, enum ath10k_firmware_mode mode,
2494 		      const struct ath10k_fw_components *fw)
2495 {
2496 	int status;
2497 	u32 val;
2498 
2499 	lockdep_assert_held(&ar->conf_mutex);
2500 
2501 	clear_bit(ATH10K_FLAG_CRASH_FLUSH, &ar->dev_flags);
2502 
2503 	ar->running_fw = fw;
2504 
2505 	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
2506 		      ar->running_fw->fw_file.fw_features)) {
2507 		ath10k_bmi_start(ar);
2508 
2509 		if (ath10k_init_configure_target(ar)) {
2510 			status = -EINVAL;
2511 			goto err;
2512 		}
2513 
2514 		status = ath10k_download_cal_data(ar);
2515 		if (status)
2516 			goto err;
2517 
2518 		/* Some of of qca988x solutions are having global reset issue
2519 		 * during target initialization. Bypassing PLL setting before
2520 		 * downloading firmware and letting the SoC run on REF_CLK is
2521 		 * fixing the problem. Corresponding firmware change is also
2522 		 * needed to set the clock source once the target is
2523 		 * initialized.
2524 		 */
2525 		if (test_bit(ATH10K_FW_FEATURE_SUPPORTS_SKIP_CLOCK_INIT,
2526 			     ar->running_fw->fw_file.fw_features)) {
2527 			status = ath10k_bmi_write32(ar, hi_skip_clock_init, 1);
2528 			if (status) {
2529 				ath10k_err(ar, "could not write to skip_clock_init: %d\n",
2530 					   status);
2531 				goto err;
2532 			}
2533 		}
2534 
2535 		status = ath10k_download_fw(ar);
2536 		if (status)
2537 			goto err;
2538 
2539 		status = ath10k_init_uart(ar);
2540 		if (status)
2541 			goto err;
2542 
2543 		if (ar->hif.bus == ATH10K_BUS_SDIO)
2544 			ath10k_init_sdio(ar, mode);
2545 	}
2546 
2547 	ar->htc.htc_ops.target_send_suspend_complete =
2548 		ath10k_send_suspend_complete;
2549 
2550 	status = ath10k_htc_init(ar);
2551 	if (status) {
2552 		ath10k_err(ar, "could not init HTC (%d)\n", status);
2553 		goto err;
2554 	}
2555 
2556 	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
2557 		      ar->running_fw->fw_file.fw_features)) {
2558 		status = ath10k_bmi_done(ar);
2559 		if (status)
2560 			goto err;
2561 	}
2562 
2563 	status = ath10k_wmi_attach(ar);
2564 	if (status) {
2565 		ath10k_err(ar, "WMI attach failed: %d\n", status);
2566 		goto err;
2567 	}
2568 
2569 	status = ath10k_htt_init(ar);
2570 	if (status) {
2571 		ath10k_err(ar, "failed to init htt: %d\n", status);
2572 		goto err_wmi_detach;
2573 	}
2574 
2575 	status = ath10k_htt_tx_start(&ar->htt);
2576 	if (status) {
2577 		ath10k_err(ar, "failed to alloc htt tx: %d\n", status);
2578 		goto err_wmi_detach;
2579 	}
2580 
2581 	/* If firmware indicates Full Rx Reorder support it must be used in a
2582 	 * slightly different manner. Let HTT code know.
2583 	 */
2584 	ar->htt.rx_ring.in_ord_rx = !!(test_bit(WMI_SERVICE_RX_FULL_REORDER,
2585 						ar->wmi.svc_map));
2586 
2587 	status = ath10k_htt_rx_alloc(&ar->htt);
2588 	if (status) {
2589 		ath10k_err(ar, "failed to alloc htt rx: %d\n", status);
2590 		goto err_htt_tx_detach;
2591 	}
2592 
2593 	status = ath10k_hif_start(ar);
2594 	if (status) {
2595 		ath10k_err(ar, "could not start HIF: %d\n", status);
2596 		goto err_htt_rx_detach;
2597 	}
2598 
2599 	status = ath10k_htc_wait_target(&ar->htc);
2600 	if (status) {
2601 		ath10k_err(ar, "failed to connect to HTC: %d\n", status);
2602 		goto err_hif_stop;
2603 	}
2604 
2605 	status = ath10k_hif_swap_mailbox(ar);
2606 	if (status) {
2607 		ath10k_err(ar, "failed to swap mailbox: %d\n", status);
2608 		goto err_hif_stop;
2609 	}
2610 
2611 	if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
2612 		status = ath10k_htt_connect(&ar->htt);
2613 		if (status) {
2614 			ath10k_err(ar, "failed to connect htt (%d)\n", status);
2615 			goto err_hif_stop;
2616 		}
2617 	}
2618 
2619 	status = ath10k_wmi_connect(ar);
2620 	if (status) {
2621 		ath10k_err(ar, "could not connect wmi: %d\n", status);
2622 		goto err_hif_stop;
2623 	}
2624 
2625 	status = ath10k_htc_start(&ar->htc);
2626 	if (status) {
2627 		ath10k_err(ar, "failed to start htc: %d\n", status);
2628 		goto err_hif_stop;
2629 	}
2630 
2631 	if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
2632 		status = ath10k_wmi_wait_for_service_ready(ar);
2633 		if (status) {
2634 			ath10k_warn(ar, "wmi service ready event not received");
2635 			goto err_hif_stop;
2636 		}
2637 	}
2638 
2639 	ath10k_dbg(ar, ATH10K_DBG_BOOT, "firmware %s booted\n",
2640 		   ar->hw->wiphy->fw_version);
2641 
2642 	if (test_bit(WMI_SERVICE_EXT_RES_CFG_SUPPORT, ar->wmi.svc_map) &&
2643 	    mode == ATH10K_FIRMWARE_MODE_NORMAL) {
2644 		val = 0;
2645 		if (ath10k_peer_stats_enabled(ar))
2646 			val = WMI_10_4_PEER_STATS;
2647 
2648 		/* Enable vdev stats by default */
2649 		val |= WMI_10_4_VDEV_STATS;
2650 
2651 		if (test_bit(WMI_SERVICE_BSS_CHANNEL_INFO_64, ar->wmi.svc_map))
2652 			val |= WMI_10_4_BSS_CHANNEL_INFO_64;
2653 
2654 		/* 10.4 firmware supports BT-Coex without reloading firmware
2655 		 * via pdev param. To support Bluetooth coexistence pdev param,
2656 		 * WMI_COEX_GPIO_SUPPORT of extended resource config should be
2657 		 * enabled always.
2658 		 */
2659 		if (test_bit(WMI_SERVICE_COEX_GPIO, ar->wmi.svc_map) &&
2660 		    test_bit(ATH10K_FW_FEATURE_BTCOEX_PARAM,
2661 			     ar->running_fw->fw_file.fw_features))
2662 			val |= WMI_10_4_COEX_GPIO_SUPPORT;
2663 
2664 		if (test_bit(WMI_SERVICE_TDLS_EXPLICIT_MODE_ONLY,
2665 			     ar->wmi.svc_map))
2666 			val |= WMI_10_4_TDLS_EXPLICIT_MODE_ONLY;
2667 
2668 		if (test_bit(WMI_SERVICE_TDLS_UAPSD_BUFFER_STA,
2669 			     ar->wmi.svc_map))
2670 			val |= WMI_10_4_TDLS_UAPSD_BUFFER_STA;
2671 
2672 		if (test_bit(WMI_SERVICE_TX_DATA_ACK_RSSI,
2673 			     ar->wmi.svc_map))
2674 			val |= WMI_10_4_TX_DATA_ACK_RSSI;
2675 
2676 		if (test_bit(WMI_SERVICE_REPORT_AIRTIME, ar->wmi.svc_map))
2677 			val |= WMI_10_4_REPORT_AIRTIME;
2678 
2679 		status = ath10k_mac_ext_resource_config(ar, val);
2680 		if (status) {
2681 			ath10k_err(ar,
2682 				   "failed to send ext resource cfg command : %d\n",
2683 				   status);
2684 			goto err_hif_stop;
2685 		}
2686 	}
2687 
2688 	status = ath10k_wmi_cmd_init(ar);
2689 	if (status) {
2690 		ath10k_err(ar, "could not send WMI init command (%d)\n",
2691 			   status);
2692 		goto err_hif_stop;
2693 	}
2694 
2695 	status = ath10k_wmi_wait_for_unified_ready(ar);
2696 	if (status) {
2697 		ath10k_err(ar, "wmi unified ready event not received\n");
2698 		goto err_hif_stop;
2699 	}
2700 
2701 	status = ath10k_core_compat_services(ar);
2702 	if (status) {
2703 		ath10k_err(ar, "compat services failed: %d\n", status);
2704 		goto err_hif_stop;
2705 	}
2706 
2707 	status = ath10k_wmi_pdev_set_base_macaddr(ar, ar->mac_addr);
2708 	if (status && status != -EOPNOTSUPP) {
2709 		ath10k_err(ar,
2710 			   "failed to set base mac address: %d\n", status);
2711 		goto err_hif_stop;
2712 	}
2713 
2714 	/* Some firmware revisions do not properly set up hardware rx filter
2715 	 * registers.
2716 	 *
2717 	 * A known example from QCA9880 and 10.2.4 is that MAC_PCU_ADDR1_MASK
2718 	 * is filled with 0s instead of 1s allowing HW to respond with ACKs to
2719 	 * any frames that matches MAC_PCU_RX_FILTER which is also
2720 	 * misconfigured to accept anything.
2721 	 *
2722 	 * The ADDR1 is programmed using internal firmware structure field and
2723 	 * can't be (easily/sanely) reached from the driver explicitly. It is
2724 	 * possible to implicitly make it correct by creating a dummy vdev and
2725 	 * then deleting it.
2726 	 */
2727 	if (ar->hw_params.hw_filter_reset_required &&
2728 	    mode == ATH10K_FIRMWARE_MODE_NORMAL) {
2729 		status = ath10k_core_reset_rx_filter(ar);
2730 		if (status) {
2731 			ath10k_err(ar,
2732 				   "failed to reset rx filter: %d\n", status);
2733 			goto err_hif_stop;
2734 		}
2735 	}
2736 
2737 	status = ath10k_htt_rx_ring_refill(ar);
2738 	if (status) {
2739 		ath10k_err(ar, "failed to refill htt rx ring: %d\n", status);
2740 		goto err_hif_stop;
2741 	}
2742 
2743 	if (ar->max_num_vdevs >= 64)
2744 		ar->free_vdev_map = 0xFFFFFFFFFFFFFFFFLL;
2745 	else
2746 		ar->free_vdev_map = (1LL << ar->max_num_vdevs) - 1;
2747 
2748 	INIT_LIST_HEAD(&ar->arvifs);
2749 
2750 	/* we don't care about HTT in UTF mode */
2751 	if (mode == ATH10K_FIRMWARE_MODE_NORMAL) {
2752 		status = ath10k_htt_setup(&ar->htt);
2753 		if (status) {
2754 			ath10k_err(ar, "failed to setup htt: %d\n", status);
2755 			goto err_hif_stop;
2756 		}
2757 	}
2758 
2759 	status = ath10k_debug_start(ar);
2760 	if (status)
2761 		goto err_hif_stop;
2762 
2763 	return 0;
2764 
2765 err_hif_stop:
2766 	ath10k_hif_stop(ar);
2767 err_htt_rx_detach:
2768 	ath10k_htt_rx_free(&ar->htt);
2769 err_htt_tx_detach:
2770 	ath10k_htt_tx_free(&ar->htt);
2771 err_wmi_detach:
2772 	ath10k_wmi_detach(ar);
2773 err:
2774 	return status;
2775 }
2776 EXPORT_SYMBOL(ath10k_core_start);
2777 
2778 int ath10k_wait_for_suspend(struct ath10k *ar, u32 suspend_opt)
2779 {
2780 	int ret;
2781 	unsigned long time_left;
2782 
2783 	reinit_completion(&ar->target_suspend);
2784 
2785 	ret = ath10k_wmi_pdev_suspend_target(ar, suspend_opt);
2786 	if (ret) {
2787 		ath10k_warn(ar, "could not suspend target (%d)\n", ret);
2788 		return ret;
2789 	}
2790 
2791 	time_left = wait_for_completion_timeout(&ar->target_suspend, 1 * HZ);
2792 
2793 	if (!time_left) {
2794 		ath10k_warn(ar, "suspend timed out - target pause event never came\n");
2795 		return -ETIMEDOUT;
2796 	}
2797 
2798 	return 0;
2799 }
2800 
2801 void ath10k_core_stop(struct ath10k *ar)
2802 {
2803 	lockdep_assert_held(&ar->conf_mutex);
2804 	ath10k_debug_stop(ar);
2805 
2806 	/* try to suspend target */
2807 	if (ar->state != ATH10K_STATE_RESTARTING &&
2808 	    ar->state != ATH10K_STATE_UTF)
2809 		ath10k_wait_for_suspend(ar, WMI_PDEV_SUSPEND_AND_DISABLE_INTR);
2810 
2811 	ath10k_hif_stop(ar);
2812 	ath10k_htt_tx_stop(&ar->htt);
2813 	ath10k_htt_rx_free(&ar->htt);
2814 	ath10k_wmi_detach(ar);
2815 }
2816 EXPORT_SYMBOL(ath10k_core_stop);
2817 
2818 /* mac80211 manages fw/hw initialization through start/stop hooks. However in
2819  * order to know what hw capabilities should be advertised to mac80211 it is
2820  * necessary to load the firmware (and tear it down immediately since start
2821  * hook will try to init it again) before registering
2822  */
2823 static int ath10k_core_probe_fw(struct ath10k *ar)
2824 {
2825 	struct bmi_target_info target_info;
2826 	int ret = 0;
2827 
2828 	ret = ath10k_hif_power_up(ar, ATH10K_FIRMWARE_MODE_NORMAL);
2829 	if (ret) {
2830 		ath10k_err(ar, "could not power on hif bus (%d)\n", ret);
2831 		return ret;
2832 	}
2833 
2834 	switch (ar->hif.bus) {
2835 	case ATH10K_BUS_SDIO:
2836 		memset(&target_info, 0, sizeof(target_info));
2837 		ret = ath10k_bmi_get_target_info_sdio(ar, &target_info);
2838 		if (ret) {
2839 			ath10k_err(ar, "could not get target info (%d)\n", ret);
2840 			goto err_power_down;
2841 		}
2842 		ar->target_version = target_info.version;
2843 		ar->hw->wiphy->hw_version = target_info.version;
2844 		break;
2845 	case ATH10K_BUS_PCI:
2846 	case ATH10K_BUS_AHB:
2847 	case ATH10K_BUS_USB:
2848 		memset(&target_info, 0, sizeof(target_info));
2849 		ret = ath10k_bmi_get_target_info(ar, &target_info);
2850 		if (ret) {
2851 			ath10k_err(ar, "could not get target info (%d)\n", ret);
2852 			goto err_power_down;
2853 		}
2854 		ar->target_version = target_info.version;
2855 		ar->hw->wiphy->hw_version = target_info.version;
2856 		break;
2857 	case ATH10K_BUS_SNOC:
2858 		memset(&target_info, 0, sizeof(target_info));
2859 		ret = ath10k_hif_get_target_info(ar, &target_info);
2860 		if (ret) {
2861 			ath10k_err(ar, "could not get target info (%d)\n", ret);
2862 			goto err_power_down;
2863 		}
2864 		ar->target_version = target_info.version;
2865 		ar->hw->wiphy->hw_version = target_info.version;
2866 		break;
2867 	default:
2868 		ath10k_err(ar, "incorrect hif bus type: %d\n", ar->hif.bus);
2869 	}
2870 
2871 	ret = ath10k_init_hw_params(ar);
2872 	if (ret) {
2873 		ath10k_err(ar, "could not get hw params (%d)\n", ret);
2874 		goto err_power_down;
2875 	}
2876 
2877 	ret = ath10k_core_fetch_firmware_files(ar);
2878 	if (ret) {
2879 		ath10k_err(ar, "could not fetch firmware files (%d)\n", ret);
2880 		goto err_power_down;
2881 	}
2882 
2883 	BUILD_BUG_ON(sizeof(ar->hw->wiphy->fw_version) !=
2884 		     sizeof(ar->normal_mode_fw.fw_file.fw_version));
2885 	memcpy(ar->hw->wiphy->fw_version, ar->normal_mode_fw.fw_file.fw_version,
2886 	       sizeof(ar->hw->wiphy->fw_version));
2887 
2888 	ath10k_debug_print_hwfw_info(ar);
2889 
2890 	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
2891 		      ar->normal_mode_fw.fw_file.fw_features)) {
2892 		ret = ath10k_core_pre_cal_download(ar);
2893 		if (ret) {
2894 			/* pre calibration data download is not necessary
2895 			 * for all the chipsets. Ignore failures and continue.
2896 			 */
2897 			ath10k_dbg(ar, ATH10K_DBG_BOOT,
2898 				   "could not load pre cal data: %d\n", ret);
2899 		}
2900 
2901 		ret = ath10k_core_get_board_id_from_otp(ar);
2902 		if (ret && ret != -EOPNOTSUPP) {
2903 			ath10k_err(ar, "failed to get board id from otp: %d\n",
2904 				   ret);
2905 			goto err_free_firmware_files;
2906 		}
2907 
2908 		ret = ath10k_core_check_smbios(ar);
2909 		if (ret)
2910 			ath10k_dbg(ar, ATH10K_DBG_BOOT, "SMBIOS bdf variant name not set.\n");
2911 
2912 		ret = ath10k_core_check_dt(ar);
2913 		if (ret)
2914 			ath10k_dbg(ar, ATH10K_DBG_BOOT, "DT bdf variant name not set.\n");
2915 
2916 		ret = ath10k_core_fetch_board_file(ar, ATH10K_BD_IE_BOARD);
2917 		if (ret) {
2918 			ath10k_err(ar, "failed to fetch board file: %d\n", ret);
2919 			goto err_free_firmware_files;
2920 		}
2921 
2922 		ath10k_debug_print_board_info(ar);
2923 	}
2924 
2925 	device_get_mac_address(ar->dev, ar->mac_addr, sizeof(ar->mac_addr));
2926 
2927 	ret = ath10k_core_init_firmware_features(ar);
2928 	if (ret) {
2929 		ath10k_err(ar, "fatal problem with firmware features: %d\n",
2930 			   ret);
2931 		goto err_free_firmware_files;
2932 	}
2933 
2934 	if (!test_bit(ATH10K_FW_FEATURE_NON_BMI,
2935 		      ar->normal_mode_fw.fw_file.fw_features)) {
2936 		ret = ath10k_swap_code_seg_init(ar,
2937 						&ar->normal_mode_fw.fw_file);
2938 		if (ret) {
2939 			ath10k_err(ar, "failed to initialize code swap segment: %d\n",
2940 				   ret);
2941 			goto err_free_firmware_files;
2942 		}
2943 	}
2944 
2945 	mutex_lock(&ar->conf_mutex);
2946 
2947 	ret = ath10k_core_start(ar, ATH10K_FIRMWARE_MODE_NORMAL,
2948 				&ar->normal_mode_fw);
2949 	if (ret) {
2950 		ath10k_err(ar, "could not init core (%d)\n", ret);
2951 		goto err_unlock;
2952 	}
2953 
2954 	ath10k_debug_print_boot_info(ar);
2955 	ath10k_core_stop(ar);
2956 
2957 	mutex_unlock(&ar->conf_mutex);
2958 
2959 	ath10k_hif_power_down(ar);
2960 	return 0;
2961 
2962 err_unlock:
2963 	mutex_unlock(&ar->conf_mutex);
2964 
2965 err_free_firmware_files:
2966 	ath10k_core_free_firmware_files(ar);
2967 
2968 err_power_down:
2969 	ath10k_hif_power_down(ar);
2970 
2971 	return ret;
2972 }
2973 
2974 static void ath10k_core_register_work(struct work_struct *work)
2975 {
2976 	struct ath10k *ar = container_of(work, struct ath10k, register_work);
2977 	int status;
2978 
2979 	/* peer stats are enabled by default */
2980 	set_bit(ATH10K_FLAG_PEER_STATS, &ar->dev_flags);
2981 
2982 	status = ath10k_core_probe_fw(ar);
2983 	if (status) {
2984 		ath10k_err(ar, "could not probe fw (%d)\n", status);
2985 		goto err;
2986 	}
2987 
2988 	status = ath10k_mac_register(ar);
2989 	if (status) {
2990 		ath10k_err(ar, "could not register to mac80211 (%d)\n", status);
2991 		goto err_release_fw;
2992 	}
2993 
2994 	status = ath10k_coredump_register(ar);
2995 	if (status) {
2996 		ath10k_err(ar, "unable to register coredump\n");
2997 		goto err_unregister_mac;
2998 	}
2999 
3000 	status = ath10k_debug_register(ar);
3001 	if (status) {
3002 		ath10k_err(ar, "unable to initialize debugfs\n");
3003 		goto err_unregister_coredump;
3004 	}
3005 
3006 	status = ath10k_spectral_create(ar);
3007 	if (status) {
3008 		ath10k_err(ar, "failed to initialize spectral\n");
3009 		goto err_debug_destroy;
3010 	}
3011 
3012 	status = ath10k_thermal_register(ar);
3013 	if (status) {
3014 		ath10k_err(ar, "could not register thermal device: %d\n",
3015 			   status);
3016 		goto err_spectral_destroy;
3017 	}
3018 
3019 	set_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags);
3020 	return;
3021 
3022 err_spectral_destroy:
3023 	ath10k_spectral_destroy(ar);
3024 err_debug_destroy:
3025 	ath10k_debug_destroy(ar);
3026 err_unregister_coredump:
3027 	ath10k_coredump_unregister(ar);
3028 err_unregister_mac:
3029 	ath10k_mac_unregister(ar);
3030 err_release_fw:
3031 	ath10k_core_free_firmware_files(ar);
3032 err:
3033 	/* TODO: It's probably a good idea to release device from the driver
3034 	 * but calling device_release_driver() here will cause a deadlock.
3035 	 */
3036 	return;
3037 }
3038 
3039 int ath10k_core_register(struct ath10k *ar,
3040 			 const struct ath10k_bus_params *bus_params)
3041 {
3042 	ar->bus_param = *bus_params;
3043 
3044 	queue_work(ar->workqueue, &ar->register_work);
3045 
3046 	return 0;
3047 }
3048 EXPORT_SYMBOL(ath10k_core_register);
3049 
3050 void ath10k_core_unregister(struct ath10k *ar)
3051 {
3052 	cancel_work_sync(&ar->register_work);
3053 
3054 	if (!test_bit(ATH10K_FLAG_CORE_REGISTERED, &ar->dev_flags))
3055 		return;
3056 
3057 	ath10k_thermal_unregister(ar);
3058 	/* Stop spectral before unregistering from mac80211 to remove the
3059 	 * relayfs debugfs file cleanly. Otherwise the parent debugfs tree
3060 	 * would be already be free'd recursively, leading to a double free.
3061 	 */
3062 	ath10k_spectral_destroy(ar);
3063 
3064 	/* We must unregister from mac80211 before we stop HTC and HIF.
3065 	 * Otherwise we will fail to submit commands to FW and mac80211 will be
3066 	 * unhappy about callback failures.
3067 	 */
3068 	ath10k_mac_unregister(ar);
3069 
3070 	ath10k_testmode_destroy(ar);
3071 
3072 	ath10k_core_free_firmware_files(ar);
3073 	ath10k_core_free_board_files(ar);
3074 
3075 	ath10k_debug_unregister(ar);
3076 }
3077 EXPORT_SYMBOL(ath10k_core_unregister);
3078 
3079 struct ath10k *ath10k_core_create(size_t priv_size, struct device *dev,
3080 				  enum ath10k_bus bus,
3081 				  enum ath10k_hw_rev hw_rev,
3082 				  const struct ath10k_hif_ops *hif_ops)
3083 {
3084 	struct ath10k *ar;
3085 	int ret;
3086 
3087 	ar = ath10k_mac_create(priv_size);
3088 	if (!ar)
3089 		return NULL;
3090 
3091 	ar->ath_common.priv = ar;
3092 	ar->ath_common.hw = ar->hw;
3093 	ar->dev = dev;
3094 	ar->hw_rev = hw_rev;
3095 	ar->hif.ops = hif_ops;
3096 	ar->hif.bus = bus;
3097 
3098 	switch (hw_rev) {
3099 	case ATH10K_HW_QCA988X:
3100 	case ATH10K_HW_QCA9887:
3101 		ar->regs = &qca988x_regs;
3102 		ar->hw_ce_regs = &qcax_ce_regs;
3103 		ar->hw_values = &qca988x_values;
3104 		break;
3105 	case ATH10K_HW_QCA6174:
3106 	case ATH10K_HW_QCA9377:
3107 		ar->regs = &qca6174_regs;
3108 		ar->hw_ce_regs = &qcax_ce_regs;
3109 		ar->hw_values = &qca6174_values;
3110 		break;
3111 	case ATH10K_HW_QCA99X0:
3112 	case ATH10K_HW_QCA9984:
3113 		ar->regs = &qca99x0_regs;
3114 		ar->hw_ce_regs = &qcax_ce_regs;
3115 		ar->hw_values = &qca99x0_values;
3116 		break;
3117 	case ATH10K_HW_QCA9888:
3118 		ar->regs = &qca99x0_regs;
3119 		ar->hw_ce_regs = &qcax_ce_regs;
3120 		ar->hw_values = &qca9888_values;
3121 		break;
3122 	case ATH10K_HW_QCA4019:
3123 		ar->regs = &qca4019_regs;
3124 		ar->hw_ce_regs = &qcax_ce_regs;
3125 		ar->hw_values = &qca4019_values;
3126 		break;
3127 	case ATH10K_HW_WCN3990:
3128 		ar->regs = &wcn3990_regs;
3129 		ar->hw_ce_regs = &wcn3990_ce_regs;
3130 		ar->hw_values = &wcn3990_values;
3131 		break;
3132 	default:
3133 		ath10k_err(ar, "unsupported core hardware revision %d\n",
3134 			   hw_rev);
3135 		ret = -ENOTSUPP;
3136 		goto err_free_mac;
3137 	}
3138 
3139 	init_completion(&ar->scan.started);
3140 	init_completion(&ar->scan.completed);
3141 	init_completion(&ar->scan.on_channel);
3142 	init_completion(&ar->target_suspend);
3143 	init_completion(&ar->driver_recovery);
3144 	init_completion(&ar->wow.wakeup_completed);
3145 
3146 	init_completion(&ar->install_key_done);
3147 	init_completion(&ar->vdev_setup_done);
3148 	init_completion(&ar->thermal.wmi_sync);
3149 	init_completion(&ar->bss_survey_done);
3150 
3151 	INIT_DELAYED_WORK(&ar->scan.timeout, ath10k_scan_timeout_work);
3152 
3153 	ar->workqueue = create_singlethread_workqueue("ath10k_wq");
3154 	if (!ar->workqueue)
3155 		goto err_free_mac;
3156 
3157 	ar->workqueue_aux = create_singlethread_workqueue("ath10k_aux_wq");
3158 	if (!ar->workqueue_aux)
3159 		goto err_free_wq;
3160 
3161 	mutex_init(&ar->conf_mutex);
3162 	mutex_init(&ar->dump_mutex);
3163 	spin_lock_init(&ar->data_lock);
3164 
3165 	INIT_LIST_HEAD(&ar->peers);
3166 	init_waitqueue_head(&ar->peer_mapping_wq);
3167 	init_waitqueue_head(&ar->htt.empty_tx_wq);
3168 	init_waitqueue_head(&ar->wmi.tx_credits_wq);
3169 
3170 	init_completion(&ar->offchan_tx_completed);
3171 	INIT_WORK(&ar->offchan_tx_work, ath10k_offchan_tx_work);
3172 	skb_queue_head_init(&ar->offchan_tx_queue);
3173 
3174 	INIT_WORK(&ar->wmi_mgmt_tx_work, ath10k_mgmt_over_wmi_tx_work);
3175 	skb_queue_head_init(&ar->wmi_mgmt_tx_queue);
3176 
3177 	INIT_WORK(&ar->register_work, ath10k_core_register_work);
3178 	INIT_WORK(&ar->restart_work, ath10k_core_restart);
3179 	INIT_WORK(&ar->set_coverage_class_work,
3180 		  ath10k_core_set_coverage_class_work);
3181 
3182 	init_dummy_netdev(&ar->napi_dev);
3183 
3184 	ret = ath10k_coredump_create(ar);
3185 	if (ret)
3186 		goto err_free_aux_wq;
3187 
3188 	ret = ath10k_debug_create(ar);
3189 	if (ret)
3190 		goto err_free_coredump;
3191 
3192 	return ar;
3193 
3194 err_free_coredump:
3195 	ath10k_coredump_destroy(ar);
3196 
3197 err_free_aux_wq:
3198 	destroy_workqueue(ar->workqueue_aux);
3199 err_free_wq:
3200 	destroy_workqueue(ar->workqueue);
3201 
3202 err_free_mac:
3203 	ath10k_mac_destroy(ar);
3204 
3205 	return NULL;
3206 }
3207 EXPORT_SYMBOL(ath10k_core_create);
3208 
3209 void ath10k_core_destroy(struct ath10k *ar)
3210 {
3211 	flush_workqueue(ar->workqueue);
3212 	destroy_workqueue(ar->workqueue);
3213 
3214 	flush_workqueue(ar->workqueue_aux);
3215 	destroy_workqueue(ar->workqueue_aux);
3216 
3217 	ath10k_debug_destroy(ar);
3218 	ath10k_coredump_destroy(ar);
3219 	ath10k_htt_tx_destroy(&ar->htt);
3220 	ath10k_wmi_free_host_mem(ar);
3221 	ath10k_mac_destroy(ar);
3222 }
3223 EXPORT_SYMBOL(ath10k_core_destroy);
3224 
3225 MODULE_AUTHOR("Qualcomm Atheros");
3226 MODULE_DESCRIPTION("Core module for Qualcomm Atheros 802.11ac wireless LAN cards.");
3227 MODULE_LICENSE("Dual BSD/GPL");
3228