xref: /linux/drivers/net/wireless/ath/ath12k/core.c (revision daa121128a2d2ac6006159e2c47676e4fcd21eab)
1 // SPDX-License-Identifier: BSD-3-Clause-Clear
2 /*
3  * Copyright (c) 2018-2021 The Linux Foundation. All rights reserved.
4  * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved.
5  */
6 
7 #include <linux/module.h>
8 #include <linux/slab.h>
9 #include <linux/remoteproc.h>
10 #include <linux/firmware.h>
11 #include <linux/of.h>
12 #include "core.h"
13 #include "dp_tx.h"
14 #include "dp_rx.h"
15 #include "debug.h"
16 #include "hif.h"
17 #include "fw.h"
18 #include "debugfs.h"
19 
20 unsigned int ath12k_debug_mask;
21 module_param_named(debug_mask, ath12k_debug_mask, uint, 0644);
22 MODULE_PARM_DESC(debug_mask, "Debugging mask");
23 
24 static int ath12k_core_rfkill_config(struct ath12k_base *ab)
25 {
26 	struct ath12k *ar;
27 	int ret = 0, i;
28 
29 	if (!(ab->target_caps.sys_cap_info & WMI_SYS_CAP_INFO_RFKILL))
30 		return 0;
31 
32 	for (i = 0; i < ab->num_radios; i++) {
33 		ar = ab->pdevs[i].ar;
34 
35 		ret = ath12k_mac_rfkill_config(ar);
36 		if (ret && ret != -EOPNOTSUPP) {
37 			ath12k_warn(ab, "failed to configure rfkill: %d", ret);
38 			return ret;
39 		}
40 	}
41 
42 	return ret;
43 }
44 
45 int ath12k_core_suspend(struct ath12k_base *ab)
46 {
47 	struct ath12k *ar;
48 	int ret, i;
49 
50 	if (!ab->hw_params->supports_suspend)
51 		return -EOPNOTSUPP;
52 
53 	rcu_read_lock();
54 	for (i = 0; i < ab->num_radios; i++) {
55 		ar = ath12k_mac_get_ar_by_pdev_id(ab, i);
56 		if (!ar)
57 			continue;
58 		ret = ath12k_mac_wait_tx_complete(ar);
59 		if (ret) {
60 			ath12k_warn(ab, "failed to wait tx complete: %d\n", ret);
61 			rcu_read_unlock();
62 			return ret;
63 		}
64 	}
65 	rcu_read_unlock();
66 
67 	/* PM framework skips suspend_late/resume_early callbacks
68 	 * if other devices report errors in their suspend callbacks.
69 	 * However ath12k_core_resume() would still be called because
70 	 * here we return success thus kernel put us on dpm_suspended_list.
71 	 * Since we won't go through a power down/up cycle, there is
72 	 * no chance to call complete(&ab->restart_completed) in
73 	 * ath12k_core_restart(), making ath12k_core_resume() timeout.
74 	 * So call it here to avoid this issue. This also works in case
75 	 * no error happens thus suspend_late/resume_early get called,
76 	 * because it will be reinitialized in ath12k_core_resume_early().
77 	 */
78 	complete(&ab->restart_completed);
79 
80 	return 0;
81 }
82 EXPORT_SYMBOL(ath12k_core_suspend);
83 
84 int ath12k_core_suspend_late(struct ath12k_base *ab)
85 {
86 	if (!ab->hw_params->supports_suspend)
87 		return -EOPNOTSUPP;
88 
89 	ath12k_hif_irq_disable(ab);
90 	ath12k_hif_ce_irq_disable(ab);
91 
92 	ath12k_hif_power_down(ab, true);
93 
94 	return 0;
95 }
96 EXPORT_SYMBOL(ath12k_core_suspend_late);
97 
98 int ath12k_core_resume_early(struct ath12k_base *ab)
99 {
100 	int ret;
101 
102 	if (!ab->hw_params->supports_suspend)
103 		return -EOPNOTSUPP;
104 
105 	reinit_completion(&ab->restart_completed);
106 	ret = ath12k_hif_power_up(ab);
107 	if (ret)
108 		ath12k_warn(ab, "failed to power up hif during resume: %d\n", ret);
109 
110 	return ret;
111 }
112 EXPORT_SYMBOL(ath12k_core_resume_early);
113 
114 int ath12k_core_resume(struct ath12k_base *ab)
115 {
116 	long time_left;
117 
118 	if (!ab->hw_params->supports_suspend)
119 		return -EOPNOTSUPP;
120 
121 	time_left = wait_for_completion_timeout(&ab->restart_completed,
122 						ATH12K_RESET_TIMEOUT_HZ);
123 	if (time_left == 0) {
124 		ath12k_warn(ab, "timeout while waiting for restart complete");
125 		return -ETIMEDOUT;
126 	}
127 
128 	return 0;
129 }
130 EXPORT_SYMBOL(ath12k_core_resume);
131 
132 static int __ath12k_core_create_board_name(struct ath12k_base *ab, char *name,
133 					   size_t name_len, bool with_variant,
134 					   bool bus_type_mode)
135 {
136 	/* strlen(',variant=') + strlen(ab->qmi.target.bdf_ext) */
137 	char variant[9 + ATH12K_QMI_BDF_EXT_STR_LENGTH] = { 0 };
138 
139 	if (with_variant && ab->qmi.target.bdf_ext[0] != '\0')
140 		scnprintf(variant, sizeof(variant), ",variant=%s",
141 			  ab->qmi.target.bdf_ext);
142 
143 	switch (ab->id.bdf_search) {
144 	case ATH12K_BDF_SEARCH_BUS_AND_BOARD:
145 		if (bus_type_mode)
146 			scnprintf(name, name_len,
147 				  "bus=%s",
148 				  ath12k_bus_str(ab->hif.bus));
149 		else
150 			scnprintf(name, name_len,
151 				  "bus=%s,vendor=%04x,device=%04x,subsystem-vendor=%04x,subsystem-device=%04x,qmi-chip-id=%d,qmi-board-id=%d%s",
152 				  ath12k_bus_str(ab->hif.bus),
153 				  ab->id.vendor, ab->id.device,
154 				  ab->id.subsystem_vendor,
155 				  ab->id.subsystem_device,
156 				  ab->qmi.target.chip_id,
157 				  ab->qmi.target.board_id,
158 				  variant);
159 		break;
160 	default:
161 		scnprintf(name, name_len,
162 			  "bus=%s,qmi-chip-id=%d,qmi-board-id=%d%s",
163 			  ath12k_bus_str(ab->hif.bus),
164 			  ab->qmi.target.chip_id,
165 			  ab->qmi.target.board_id, variant);
166 		break;
167 	}
168 
169 	ath12k_dbg(ab, ATH12K_DBG_BOOT, "boot using board name '%s'\n", name);
170 
171 	return 0;
172 }
173 
174 static int ath12k_core_create_board_name(struct ath12k_base *ab, char *name,
175 					 size_t name_len)
176 {
177 	return __ath12k_core_create_board_name(ab, name, name_len, true, false);
178 }
179 
180 static int ath12k_core_create_fallback_board_name(struct ath12k_base *ab, char *name,
181 						  size_t name_len)
182 {
183 	return __ath12k_core_create_board_name(ab, name, name_len, false, false);
184 }
185 
186 static int ath12k_core_create_bus_type_board_name(struct ath12k_base *ab, char *name,
187 						  size_t name_len)
188 {
189 	return __ath12k_core_create_board_name(ab, name, name_len, false, true);
190 }
191 
192 const struct firmware *ath12k_core_firmware_request(struct ath12k_base *ab,
193 						    const char *file)
194 {
195 	const struct firmware *fw;
196 	char path[100];
197 	int ret;
198 
199 	if (!file)
200 		return ERR_PTR(-ENOENT);
201 
202 	ath12k_core_create_firmware_path(ab, file, path, sizeof(path));
203 
204 	ret = firmware_request_nowarn(&fw, path, ab->dev);
205 	if (ret)
206 		return ERR_PTR(ret);
207 
208 	ath12k_dbg(ab, ATH12K_DBG_BOOT, "boot firmware request %s size %zu\n",
209 		   path, fw->size);
210 
211 	return fw;
212 }
213 
214 void ath12k_core_free_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd)
215 {
216 	if (!IS_ERR(bd->fw))
217 		release_firmware(bd->fw);
218 
219 	memset(bd, 0, sizeof(*bd));
220 }
221 
222 static int ath12k_core_parse_bd_ie_board(struct ath12k_base *ab,
223 					 struct ath12k_board_data *bd,
224 					 const void *buf, size_t buf_len,
225 					 const char *boardname,
226 					 int ie_id,
227 					 int name_id,
228 					 int data_id)
229 {
230 	const struct ath12k_fw_ie *hdr;
231 	bool name_match_found;
232 	int ret, board_ie_id;
233 	size_t board_ie_len;
234 	const void *board_ie_data;
235 
236 	name_match_found = false;
237 
238 	/* go through ATH12K_BD_IE_BOARD_/ATH12K_BD_IE_REGDB_ elements */
239 	while (buf_len > sizeof(struct ath12k_fw_ie)) {
240 		hdr = buf;
241 		board_ie_id = le32_to_cpu(hdr->id);
242 		board_ie_len = le32_to_cpu(hdr->len);
243 		board_ie_data = hdr->data;
244 
245 		buf_len -= sizeof(*hdr);
246 		buf += sizeof(*hdr);
247 
248 		if (buf_len < ALIGN(board_ie_len, 4)) {
249 			ath12k_err(ab, "invalid %s length: %zu < %zu\n",
250 				   ath12k_bd_ie_type_str(ie_id),
251 				   buf_len, ALIGN(board_ie_len, 4));
252 			ret = -EINVAL;
253 			goto out;
254 		}
255 
256 		if (board_ie_id == name_id) {
257 			ath12k_dbg_dump(ab, ATH12K_DBG_BOOT, "board name", "",
258 					board_ie_data, board_ie_len);
259 
260 			if (board_ie_len != strlen(boardname))
261 				goto next;
262 
263 			ret = memcmp(board_ie_data, boardname, strlen(boardname));
264 			if (ret)
265 				goto next;
266 
267 			name_match_found = true;
268 			ath12k_dbg(ab, ATH12K_DBG_BOOT,
269 				   "boot found match %s for name '%s'",
270 				   ath12k_bd_ie_type_str(ie_id),
271 				   boardname);
272 		} else if (board_ie_id == data_id) {
273 			if (!name_match_found)
274 				/* no match found */
275 				goto next;
276 
277 			ath12k_dbg(ab, ATH12K_DBG_BOOT,
278 				   "boot found %s for '%s'",
279 				   ath12k_bd_ie_type_str(ie_id),
280 				   boardname);
281 
282 			bd->data = board_ie_data;
283 			bd->len = board_ie_len;
284 
285 			ret = 0;
286 			goto out;
287 		} else {
288 			ath12k_warn(ab, "unknown %s id found: %d\n",
289 				    ath12k_bd_ie_type_str(ie_id),
290 				    board_ie_id);
291 		}
292 next:
293 		/* jump over the padding */
294 		board_ie_len = ALIGN(board_ie_len, 4);
295 
296 		buf_len -= board_ie_len;
297 		buf += board_ie_len;
298 	}
299 
300 	/* no match found */
301 	ret = -ENOENT;
302 
303 out:
304 	return ret;
305 }
306 
307 static int ath12k_core_fetch_board_data_api_n(struct ath12k_base *ab,
308 					      struct ath12k_board_data *bd,
309 					      const char *boardname,
310 					      int ie_id_match,
311 					      int name_id,
312 					      int data_id)
313 {
314 	size_t len, magic_len;
315 	const u8 *data;
316 	char *filename, filepath[100];
317 	size_t ie_len;
318 	struct ath12k_fw_ie *hdr;
319 	int ret, ie_id;
320 
321 	filename = ATH12K_BOARD_API2_FILE;
322 
323 	if (!bd->fw)
324 		bd->fw = ath12k_core_firmware_request(ab, filename);
325 
326 	if (IS_ERR(bd->fw))
327 		return PTR_ERR(bd->fw);
328 
329 	data = bd->fw->data;
330 	len = bd->fw->size;
331 
332 	ath12k_core_create_firmware_path(ab, filename,
333 					 filepath, sizeof(filepath));
334 
335 	/* magic has extra null byte padded */
336 	magic_len = strlen(ATH12K_BOARD_MAGIC) + 1;
337 	if (len < magic_len) {
338 		ath12k_err(ab, "failed to find magic value in %s, file too short: %zu\n",
339 			   filepath, len);
340 		ret = -EINVAL;
341 		goto err;
342 	}
343 
344 	if (memcmp(data, ATH12K_BOARD_MAGIC, magic_len)) {
345 		ath12k_err(ab, "found invalid board magic\n");
346 		ret = -EINVAL;
347 		goto err;
348 	}
349 
350 	/* magic is padded to 4 bytes */
351 	magic_len = ALIGN(magic_len, 4);
352 	if (len < magic_len) {
353 		ath12k_err(ab, "failed: %s too small to contain board data, len: %zu\n",
354 			   filepath, len);
355 		ret = -EINVAL;
356 		goto err;
357 	}
358 
359 	data += magic_len;
360 	len -= magic_len;
361 
362 	while (len > sizeof(struct ath12k_fw_ie)) {
363 		hdr = (struct ath12k_fw_ie *)data;
364 		ie_id = le32_to_cpu(hdr->id);
365 		ie_len = le32_to_cpu(hdr->len);
366 
367 		len -= sizeof(*hdr);
368 		data = hdr->data;
369 
370 		if (len < ALIGN(ie_len, 4)) {
371 			ath12k_err(ab, "invalid length for board ie_id %d ie_len %zu len %zu\n",
372 				   ie_id, ie_len, len);
373 			ret = -EINVAL;
374 			goto err;
375 		}
376 
377 		if (ie_id == ie_id_match) {
378 			ret = ath12k_core_parse_bd_ie_board(ab, bd, data,
379 							    ie_len,
380 							    boardname,
381 							    ie_id_match,
382 							    name_id,
383 							    data_id);
384 			if (ret == -ENOENT)
385 				/* no match found, continue */
386 				goto next;
387 			else if (ret)
388 				/* there was an error, bail out */
389 				goto err;
390 			/* either found or error, so stop searching */
391 			goto out;
392 		}
393 next:
394 		/* jump over the padding */
395 		ie_len = ALIGN(ie_len, 4);
396 
397 		len -= ie_len;
398 		data += ie_len;
399 	}
400 
401 out:
402 	if (!bd->data || !bd->len) {
403 		ath12k_dbg(ab, ATH12K_DBG_BOOT,
404 			   "failed to fetch %s for %s from %s\n",
405 			   ath12k_bd_ie_type_str(ie_id_match),
406 			   boardname, filepath);
407 		ret = -ENODATA;
408 		goto err;
409 	}
410 
411 	return 0;
412 
413 err:
414 	ath12k_core_free_bdf(ab, bd);
415 	return ret;
416 }
417 
418 int ath12k_core_fetch_board_data_api_1(struct ath12k_base *ab,
419 				       struct ath12k_board_data *bd,
420 				       char *filename)
421 {
422 	bd->fw = ath12k_core_firmware_request(ab, filename);
423 	if (IS_ERR(bd->fw))
424 		return PTR_ERR(bd->fw);
425 
426 	bd->data = bd->fw->data;
427 	bd->len = bd->fw->size;
428 
429 	return 0;
430 }
431 
432 #define BOARD_NAME_SIZE 200
433 int ath12k_core_fetch_bdf(struct ath12k_base *ab, struct ath12k_board_data *bd)
434 {
435 	char boardname[BOARD_NAME_SIZE], fallback_boardname[BOARD_NAME_SIZE];
436 	char *filename, filepath[100];
437 	int bd_api;
438 	int ret;
439 
440 	filename = ATH12K_BOARD_API2_FILE;
441 
442 	ret = ath12k_core_create_board_name(ab, boardname, sizeof(boardname));
443 	if (ret) {
444 		ath12k_err(ab, "failed to create board name: %d", ret);
445 		return ret;
446 	}
447 
448 	bd_api = 2;
449 	ret = ath12k_core_fetch_board_data_api_n(ab, bd, boardname,
450 						 ATH12K_BD_IE_BOARD,
451 						 ATH12K_BD_IE_BOARD_NAME,
452 						 ATH12K_BD_IE_BOARD_DATA);
453 	if (!ret)
454 		goto success;
455 
456 	ret = ath12k_core_create_fallback_board_name(ab, fallback_boardname,
457 						     sizeof(fallback_boardname));
458 	if (ret) {
459 		ath12k_err(ab, "failed to create fallback board name: %d", ret);
460 		return ret;
461 	}
462 
463 	ret = ath12k_core_fetch_board_data_api_n(ab, bd, fallback_boardname,
464 						 ATH12K_BD_IE_BOARD,
465 						 ATH12K_BD_IE_BOARD_NAME,
466 						 ATH12K_BD_IE_BOARD_DATA);
467 	if (!ret)
468 		goto success;
469 
470 	bd_api = 1;
471 	ret = ath12k_core_fetch_board_data_api_1(ab, bd, ATH12K_DEFAULT_BOARD_FILE);
472 	if (ret) {
473 		ath12k_core_create_firmware_path(ab, filename,
474 						 filepath, sizeof(filepath));
475 		ath12k_err(ab, "failed to fetch board data for %s from %s\n",
476 			   boardname, filepath);
477 		if (memcmp(boardname, fallback_boardname, strlen(boardname)))
478 			ath12k_err(ab, "failed to fetch board data for %s from %s\n",
479 				   fallback_boardname, filepath);
480 
481 		ath12k_err(ab, "failed to fetch board.bin from %s\n",
482 			   ab->hw_params->fw.dir);
483 		return ret;
484 	}
485 
486 success:
487 	ath12k_dbg(ab, ATH12K_DBG_BOOT, "using board api %d\n", bd_api);
488 	return 0;
489 }
490 
491 int ath12k_core_fetch_regdb(struct ath12k_base *ab, struct ath12k_board_data *bd)
492 {
493 	char boardname[BOARD_NAME_SIZE], default_boardname[BOARD_NAME_SIZE];
494 	int ret;
495 
496 	ret = ath12k_core_create_board_name(ab, boardname, BOARD_NAME_SIZE);
497 	if (ret) {
498 		ath12k_dbg(ab, ATH12K_DBG_BOOT,
499 			   "failed to create board name for regdb: %d", ret);
500 		goto exit;
501 	}
502 
503 	ret = ath12k_core_fetch_board_data_api_n(ab, bd, boardname,
504 						 ATH12K_BD_IE_REGDB,
505 						 ATH12K_BD_IE_REGDB_NAME,
506 						 ATH12K_BD_IE_REGDB_DATA);
507 	if (!ret)
508 		goto exit;
509 
510 	ret = ath12k_core_create_bus_type_board_name(ab, default_boardname,
511 						     BOARD_NAME_SIZE);
512 	if (ret) {
513 		ath12k_dbg(ab, ATH12K_DBG_BOOT,
514 			   "failed to create default board name for regdb: %d", ret);
515 		goto exit;
516 	}
517 
518 	ret = ath12k_core_fetch_board_data_api_n(ab, bd, default_boardname,
519 						 ATH12K_BD_IE_REGDB,
520 						 ATH12K_BD_IE_REGDB_NAME,
521 						 ATH12K_BD_IE_REGDB_DATA);
522 	if (!ret)
523 		goto exit;
524 
525 	ret = ath12k_core_fetch_board_data_api_1(ab, bd, ATH12K_REGDB_FILE_NAME);
526 	if (ret)
527 		ath12k_dbg(ab, ATH12K_DBG_BOOT, "failed to fetch %s from %s\n",
528 			   ATH12K_REGDB_FILE_NAME, ab->hw_params->fw.dir);
529 
530 exit:
531 	if (!ret)
532 		ath12k_dbg(ab, ATH12K_DBG_BOOT, "fetched regdb\n");
533 
534 	return ret;
535 }
536 
537 u32 ath12k_core_get_max_station_per_radio(struct ath12k_base *ab)
538 {
539 	if (ab->num_radios == 2)
540 		return TARGET_NUM_STATIONS_DBS;
541 	else if (ab->num_radios == 3)
542 		return TARGET_NUM_PEERS_PDEV_DBS_SBS;
543 	return TARGET_NUM_STATIONS_SINGLE;
544 }
545 
546 u32 ath12k_core_get_max_peers_per_radio(struct ath12k_base *ab)
547 {
548 	if (ab->num_radios == 2)
549 		return TARGET_NUM_PEERS_PDEV_DBS;
550 	else if (ab->num_radios == 3)
551 		return TARGET_NUM_PEERS_PDEV_DBS_SBS;
552 	return TARGET_NUM_PEERS_PDEV_SINGLE;
553 }
554 
555 u32 ath12k_core_get_max_num_tids(struct ath12k_base *ab)
556 {
557 	if (ab->num_radios == 2)
558 		return TARGET_NUM_TIDS(DBS);
559 	else if (ab->num_radios == 3)
560 		return TARGET_NUM_TIDS(DBS_SBS);
561 	return TARGET_NUM_TIDS(SINGLE);
562 }
563 
564 static void ath12k_core_stop(struct ath12k_base *ab)
565 {
566 	if (!test_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags))
567 		ath12k_qmi_firmware_stop(ab);
568 
569 	ath12k_acpi_stop(ab);
570 
571 	ath12k_hif_stop(ab);
572 	ath12k_wmi_detach(ab);
573 	ath12k_dp_rx_pdev_reo_cleanup(ab);
574 
575 	/* De-Init of components as needed */
576 }
577 
578 static void ath12k_core_check_bdfext(const struct dmi_header *hdr, void *data)
579 {
580 	struct ath12k_base *ab = data;
581 	const char *magic = ATH12K_SMBIOS_BDF_EXT_MAGIC;
582 	struct ath12k_smbios_bdf *smbios = (struct ath12k_smbios_bdf *)hdr;
583 	ssize_t copied;
584 	size_t len;
585 	int i;
586 
587 	if (ab->qmi.target.bdf_ext[0] != '\0')
588 		return;
589 
590 	if (hdr->type != ATH12K_SMBIOS_BDF_EXT_TYPE)
591 		return;
592 
593 	if (hdr->length != ATH12K_SMBIOS_BDF_EXT_LENGTH) {
594 		ath12k_dbg(ab, ATH12K_DBG_BOOT,
595 			   "wrong smbios bdf ext type length (%d).\n",
596 			   hdr->length);
597 		return;
598 	}
599 
600 	if (!smbios->bdf_enabled) {
601 		ath12k_dbg(ab, ATH12K_DBG_BOOT, "bdf variant name not found.\n");
602 		return;
603 	}
604 
605 	/* Only one string exists (per spec) */
606 	if (memcmp(smbios->bdf_ext, magic, strlen(magic)) != 0) {
607 		ath12k_dbg(ab, ATH12K_DBG_BOOT,
608 			   "bdf variant magic does not match.\n");
609 		return;
610 	}
611 
612 	len = min_t(size_t,
613 		    strlen(smbios->bdf_ext), sizeof(ab->qmi.target.bdf_ext));
614 	for (i = 0; i < len; i++) {
615 		if (!isascii(smbios->bdf_ext[i]) || !isprint(smbios->bdf_ext[i])) {
616 			ath12k_dbg(ab, ATH12K_DBG_BOOT,
617 				   "bdf variant name contains non ascii chars.\n");
618 			return;
619 		}
620 	}
621 
622 	/* Copy extension name without magic prefix */
623 	copied = strscpy(ab->qmi.target.bdf_ext, smbios->bdf_ext + strlen(magic),
624 			 sizeof(ab->qmi.target.bdf_ext));
625 	if (copied < 0) {
626 		ath12k_dbg(ab, ATH12K_DBG_BOOT,
627 			   "bdf variant string is longer than the buffer can accommodate\n");
628 		return;
629 	}
630 
631 	ath12k_dbg(ab, ATH12K_DBG_BOOT,
632 		   "found and validated bdf variant smbios_type 0x%x bdf %s\n",
633 		   ATH12K_SMBIOS_BDF_EXT_TYPE, ab->qmi.target.bdf_ext);
634 }
635 
636 int ath12k_core_check_smbios(struct ath12k_base *ab)
637 {
638 	ab->qmi.target.bdf_ext[0] = '\0';
639 	dmi_walk(ath12k_core_check_bdfext, ab);
640 
641 	if (ab->qmi.target.bdf_ext[0] == '\0')
642 		return -ENODATA;
643 
644 	return 0;
645 }
646 
647 static int ath12k_core_soc_create(struct ath12k_base *ab)
648 {
649 	int ret;
650 
651 	ret = ath12k_qmi_init_service(ab);
652 	if (ret) {
653 		ath12k_err(ab, "failed to initialize qmi :%d\n", ret);
654 		return ret;
655 	}
656 
657 	ath12k_debugfs_soc_create(ab);
658 
659 	ret = ath12k_hif_power_up(ab);
660 	if (ret) {
661 		ath12k_err(ab, "failed to power up :%d\n", ret);
662 		goto err_qmi_deinit;
663 	}
664 
665 	return 0;
666 
667 err_qmi_deinit:
668 	ath12k_debugfs_soc_destroy(ab);
669 	ath12k_qmi_deinit_service(ab);
670 	return ret;
671 }
672 
673 static void ath12k_core_soc_destroy(struct ath12k_base *ab)
674 {
675 	ath12k_dp_free(ab);
676 	ath12k_reg_free(ab);
677 	ath12k_debugfs_soc_destroy(ab);
678 	ath12k_qmi_deinit_service(ab);
679 }
680 
681 static int ath12k_core_pdev_create(struct ath12k_base *ab)
682 {
683 	int ret;
684 
685 	ret = ath12k_mac_register(ab);
686 	if (ret) {
687 		ath12k_err(ab, "failed register the radio with mac80211: %d\n", ret);
688 		return ret;
689 	}
690 
691 	ret = ath12k_dp_pdev_alloc(ab);
692 	if (ret) {
693 		ath12k_err(ab, "failed to attach DP pdev: %d\n", ret);
694 		goto err_mac_unregister;
695 	}
696 
697 	return 0;
698 
699 err_mac_unregister:
700 	ath12k_mac_unregister(ab);
701 
702 	return ret;
703 }
704 
705 static void ath12k_core_pdev_destroy(struct ath12k_base *ab)
706 {
707 	ath12k_mac_unregister(ab);
708 	ath12k_hif_irq_disable(ab);
709 	ath12k_dp_pdev_free(ab);
710 }
711 
712 static int ath12k_core_start(struct ath12k_base *ab,
713 			     enum ath12k_firmware_mode mode)
714 {
715 	int ret;
716 
717 	ret = ath12k_wmi_attach(ab);
718 	if (ret) {
719 		ath12k_err(ab, "failed to attach wmi: %d\n", ret);
720 		return ret;
721 	}
722 
723 	ret = ath12k_htc_init(ab);
724 	if (ret) {
725 		ath12k_err(ab, "failed to init htc: %d\n", ret);
726 		goto err_wmi_detach;
727 	}
728 
729 	ret = ath12k_hif_start(ab);
730 	if (ret) {
731 		ath12k_err(ab, "failed to start HIF: %d\n", ret);
732 		goto err_wmi_detach;
733 	}
734 
735 	ret = ath12k_htc_wait_target(&ab->htc);
736 	if (ret) {
737 		ath12k_err(ab, "failed to connect to HTC: %d\n", ret);
738 		goto err_hif_stop;
739 	}
740 
741 	ret = ath12k_dp_htt_connect(&ab->dp);
742 	if (ret) {
743 		ath12k_err(ab, "failed to connect to HTT: %d\n", ret);
744 		goto err_hif_stop;
745 	}
746 
747 	ret = ath12k_wmi_connect(ab);
748 	if (ret) {
749 		ath12k_err(ab, "failed to connect wmi: %d\n", ret);
750 		goto err_hif_stop;
751 	}
752 
753 	ret = ath12k_htc_start(&ab->htc);
754 	if (ret) {
755 		ath12k_err(ab, "failed to start HTC: %d\n", ret);
756 		goto err_hif_stop;
757 	}
758 
759 	ret = ath12k_wmi_wait_for_service_ready(ab);
760 	if (ret) {
761 		ath12k_err(ab, "failed to receive wmi service ready event: %d\n",
762 			   ret);
763 		goto err_hif_stop;
764 	}
765 
766 	ret = ath12k_mac_allocate(ab);
767 	if (ret) {
768 		ath12k_err(ab, "failed to create new hw device with mac80211 :%d\n",
769 			   ret);
770 		goto err_hif_stop;
771 	}
772 
773 	ath12k_dp_cc_config(ab);
774 
775 	ret = ath12k_dp_rx_pdev_reo_setup(ab);
776 	if (ret) {
777 		ath12k_err(ab, "failed to initialize reo destination rings: %d\n", ret);
778 		goto err_mac_destroy;
779 	}
780 
781 	ath12k_dp_hal_rx_desc_init(ab);
782 
783 	ret = ath12k_wmi_cmd_init(ab);
784 	if (ret) {
785 		ath12k_err(ab, "failed to send wmi init cmd: %d\n", ret);
786 		goto err_reo_cleanup;
787 	}
788 
789 	ret = ath12k_wmi_wait_for_unified_ready(ab);
790 	if (ret) {
791 		ath12k_err(ab, "failed to receive wmi unified ready event: %d\n",
792 			   ret);
793 		goto err_reo_cleanup;
794 	}
795 
796 	/* put hardware to DBS mode */
797 	if (ab->hw_params->single_pdev_only) {
798 		ret = ath12k_wmi_set_hw_mode(ab, WMI_HOST_HW_MODE_DBS);
799 		if (ret) {
800 			ath12k_err(ab, "failed to send dbs mode: %d\n", ret);
801 			goto err_reo_cleanup;
802 		}
803 	}
804 
805 	ret = ath12k_dp_tx_htt_h2t_ver_req_msg(ab);
806 	if (ret) {
807 		ath12k_err(ab, "failed to send htt version request message: %d\n",
808 			   ret);
809 		goto err_reo_cleanup;
810 	}
811 
812 	ret = ath12k_acpi_start(ab);
813 	if (ret)
814 		/* ACPI is optional so continue in case of an error */
815 		ath12k_dbg(ab, ATH12K_DBG_BOOT, "acpi failed: %d\n", ret);
816 
817 	return 0;
818 
819 err_reo_cleanup:
820 	ath12k_dp_rx_pdev_reo_cleanup(ab);
821 err_mac_destroy:
822 	ath12k_mac_destroy(ab);
823 err_hif_stop:
824 	ath12k_hif_stop(ab);
825 err_wmi_detach:
826 	ath12k_wmi_detach(ab);
827 	return ret;
828 }
829 
830 static int ath12k_core_start_firmware(struct ath12k_base *ab,
831 				      enum ath12k_firmware_mode mode)
832 {
833 	int ret;
834 
835 	ath12k_ce_get_shadow_config(ab, &ab->qmi.ce_cfg.shadow_reg_v3,
836 				    &ab->qmi.ce_cfg.shadow_reg_v3_len);
837 
838 	ret = ath12k_qmi_firmware_start(ab, mode);
839 	if (ret) {
840 		ath12k_err(ab, "failed to send firmware start: %d\n", ret);
841 		return ret;
842 	}
843 
844 	return ret;
845 }
846 
847 int ath12k_core_qmi_firmware_ready(struct ath12k_base *ab)
848 {
849 	int ret;
850 
851 	ret = ath12k_core_start_firmware(ab, ATH12K_FIRMWARE_MODE_NORMAL);
852 	if (ret) {
853 		ath12k_err(ab, "failed to start firmware: %d\n", ret);
854 		return ret;
855 	}
856 
857 	ret = ath12k_ce_init_pipes(ab);
858 	if (ret) {
859 		ath12k_err(ab, "failed to initialize CE: %d\n", ret);
860 		goto err_firmware_stop;
861 	}
862 
863 	ret = ath12k_dp_alloc(ab);
864 	if (ret) {
865 		ath12k_err(ab, "failed to init DP: %d\n", ret);
866 		goto err_firmware_stop;
867 	}
868 
869 	mutex_lock(&ab->core_lock);
870 	ret = ath12k_core_start(ab, ATH12K_FIRMWARE_MODE_NORMAL);
871 	if (ret) {
872 		ath12k_err(ab, "failed to start core: %d\n", ret);
873 		goto err_dp_free;
874 	}
875 
876 	ret = ath12k_core_pdev_create(ab);
877 	if (ret) {
878 		ath12k_err(ab, "failed to create pdev core: %d\n", ret);
879 		goto err_core_stop;
880 	}
881 	ath12k_hif_irq_enable(ab);
882 
883 	ret = ath12k_core_rfkill_config(ab);
884 	if (ret && ret != -EOPNOTSUPP) {
885 		ath12k_err(ab, "failed to config rfkill: %d\n", ret);
886 		goto err_core_pdev_destroy;
887 	}
888 
889 	mutex_unlock(&ab->core_lock);
890 
891 	return 0;
892 
893 err_core_pdev_destroy:
894 	ath12k_core_pdev_destroy(ab);
895 err_core_stop:
896 	ath12k_core_stop(ab);
897 	ath12k_mac_destroy(ab);
898 err_dp_free:
899 	ath12k_dp_free(ab);
900 	mutex_unlock(&ab->core_lock);
901 err_firmware_stop:
902 	ath12k_qmi_firmware_stop(ab);
903 
904 	return ret;
905 }
906 
907 static int ath12k_core_reconfigure_on_crash(struct ath12k_base *ab)
908 {
909 	int ret;
910 
911 	mutex_lock(&ab->core_lock);
912 	ath12k_dp_pdev_free(ab);
913 	ath12k_ce_cleanup_pipes(ab);
914 	ath12k_wmi_detach(ab);
915 	ath12k_dp_rx_pdev_reo_cleanup(ab);
916 	mutex_unlock(&ab->core_lock);
917 
918 	ath12k_dp_free(ab);
919 	ath12k_hal_srng_deinit(ab);
920 
921 	ab->free_vdev_map = (1LL << (ab->num_radios * TARGET_NUM_VDEVS)) - 1;
922 
923 	ret = ath12k_hal_srng_init(ab);
924 	if (ret)
925 		return ret;
926 
927 	clear_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags);
928 
929 	ret = ath12k_core_qmi_firmware_ready(ab);
930 	if (ret)
931 		goto err_hal_srng_deinit;
932 
933 	clear_bit(ATH12K_FLAG_RECOVERY, &ab->dev_flags);
934 
935 	return 0;
936 
937 err_hal_srng_deinit:
938 	ath12k_hal_srng_deinit(ab);
939 	return ret;
940 }
941 
942 static void ath12k_rfkill_work(struct work_struct *work)
943 {
944 	struct ath12k_base *ab = container_of(work, struct ath12k_base, rfkill_work);
945 	struct ath12k *ar;
946 	struct ath12k_hw *ah;
947 	struct ieee80211_hw *hw;
948 	bool rfkill_radio_on;
949 	int i, j;
950 
951 	spin_lock_bh(&ab->base_lock);
952 	rfkill_radio_on = ab->rfkill_radio_on;
953 	spin_unlock_bh(&ab->base_lock);
954 
955 	for (i = 0; i < ab->num_hw; i++) {
956 		ah = ab->ah[i];
957 		if (!ah)
958 			continue;
959 
960 		for (j = 0; j < ah->num_radio; j++) {
961 			ar = &ah->radio[j];
962 			if (!ar)
963 				continue;
964 
965 			ath12k_mac_rfkill_enable_radio(ar, rfkill_radio_on);
966 		}
967 
968 		hw = ah->hw;
969 		wiphy_rfkill_set_hw_state(hw->wiphy, !rfkill_radio_on);
970 	}
971 }
972 
973 void ath12k_core_halt(struct ath12k *ar)
974 {
975 	struct ath12k_base *ab = ar->ab;
976 
977 	lockdep_assert_held(&ar->conf_mutex);
978 
979 	ar->num_created_vdevs = 0;
980 	ar->allocated_vdev_map = 0;
981 
982 	ath12k_mac_scan_finish(ar);
983 	ath12k_mac_peer_cleanup_all(ar);
984 	cancel_delayed_work_sync(&ar->scan.timeout);
985 	cancel_work_sync(&ar->regd_update_work);
986 	cancel_work_sync(&ab->rfkill_work);
987 
988 	rcu_assign_pointer(ab->pdevs_active[ar->pdev_idx], NULL);
989 	synchronize_rcu();
990 	INIT_LIST_HEAD(&ar->arvifs);
991 	idr_init(&ar->txmgmt_idr);
992 }
993 
994 static void ath12k_core_pre_reconfigure_recovery(struct ath12k_base *ab)
995 {
996 	struct ath12k *ar;
997 	struct ath12k_pdev *pdev;
998 	struct ath12k_hw *ah;
999 	int i;
1000 
1001 	spin_lock_bh(&ab->base_lock);
1002 	ab->stats.fw_crash_counter++;
1003 	spin_unlock_bh(&ab->base_lock);
1004 
1005 	if (ab->is_reset)
1006 		set_bit(ATH12K_FLAG_CRASH_FLUSH, &ab->dev_flags);
1007 
1008 	for (i = 0; i < ab->num_hw; i++) {
1009 		if (!ab->ah[i])
1010 			continue;
1011 
1012 		ah = ab->ah[i];
1013 		ieee80211_stop_queues(ah->hw);
1014 	}
1015 
1016 	for (i = 0; i < ab->num_radios; i++) {
1017 		pdev = &ab->pdevs[i];
1018 		ar = pdev->ar;
1019 		if (!ar || ar->state == ATH12K_STATE_OFF)
1020 			continue;
1021 
1022 		ath12k_mac_drain_tx(ar);
1023 		complete(&ar->scan.started);
1024 		complete(&ar->scan.completed);
1025 		complete(&ar->scan.on_channel);
1026 		complete(&ar->peer_assoc_done);
1027 		complete(&ar->peer_delete_done);
1028 		complete(&ar->install_key_done);
1029 		complete(&ar->vdev_setup_done);
1030 		complete(&ar->vdev_delete_done);
1031 		complete(&ar->bss_survey_done);
1032 
1033 		wake_up(&ar->dp.tx_empty_waitq);
1034 		idr_for_each(&ar->txmgmt_idr,
1035 			     ath12k_mac_tx_mgmt_pending_free, ar);
1036 		idr_destroy(&ar->txmgmt_idr);
1037 		wake_up(&ar->txmgmt_empty_waitq);
1038 	}
1039 
1040 	wake_up(&ab->wmi_ab.tx_credits_wq);
1041 	wake_up(&ab->peer_mapping_wq);
1042 }
1043 
1044 static void ath12k_core_post_reconfigure_recovery(struct ath12k_base *ab)
1045 {
1046 	struct ath12k *ar;
1047 	struct ath12k_pdev *pdev;
1048 	int i;
1049 
1050 	for (i = 0; i < ab->num_radios; i++) {
1051 		pdev = &ab->pdevs[i];
1052 		ar = pdev->ar;
1053 		if (!ar || ar->state == ATH12K_STATE_OFF)
1054 			continue;
1055 
1056 		mutex_lock(&ar->conf_mutex);
1057 
1058 		switch (ar->state) {
1059 		case ATH12K_STATE_ON:
1060 			ar->state = ATH12K_STATE_RESTARTING;
1061 			ath12k_core_halt(ar);
1062 			ieee80211_restart_hw(ath12k_ar_to_hw(ar));
1063 			break;
1064 		case ATH12K_STATE_OFF:
1065 			ath12k_warn(ab,
1066 				    "cannot restart radio %d that hasn't been started\n",
1067 				    i);
1068 			break;
1069 		case ATH12K_STATE_RESTARTING:
1070 			break;
1071 		case ATH12K_STATE_RESTARTED:
1072 			ar->state = ATH12K_STATE_WEDGED;
1073 			fallthrough;
1074 		case ATH12K_STATE_WEDGED:
1075 			ath12k_warn(ab,
1076 				    "device is wedged, will not restart radio %d\n", i);
1077 			break;
1078 		}
1079 		mutex_unlock(&ar->conf_mutex);
1080 	}
1081 	complete(&ab->driver_recovery);
1082 }
1083 
1084 static void ath12k_core_restart(struct work_struct *work)
1085 {
1086 	struct ath12k_base *ab = container_of(work, struct ath12k_base, restart_work);
1087 	int ret;
1088 
1089 	ret = ath12k_core_reconfigure_on_crash(ab);
1090 	if (ret) {
1091 		ath12k_err(ab, "failed to reconfigure driver on crash recovery\n");
1092 		return;
1093 	}
1094 
1095 	if (ab->is_reset)
1096 		complete_all(&ab->reconfigure_complete);
1097 
1098 	complete(&ab->restart_completed);
1099 }
1100 
1101 static void ath12k_core_reset(struct work_struct *work)
1102 {
1103 	struct ath12k_base *ab = container_of(work, struct ath12k_base, reset_work);
1104 	int reset_count, fail_cont_count;
1105 	long time_left;
1106 
1107 	if (!(test_bit(ATH12K_FLAG_REGISTERED, &ab->dev_flags))) {
1108 		ath12k_warn(ab, "ignore reset dev flags 0x%lx\n", ab->dev_flags);
1109 		return;
1110 	}
1111 
1112 	/* Sometimes the recovery will fail and then the next all recovery fail,
1113 	 * this is to avoid infinite recovery since it can not recovery success
1114 	 */
1115 	fail_cont_count = atomic_read(&ab->fail_cont_count);
1116 
1117 	if (fail_cont_count >= ATH12K_RESET_MAX_FAIL_COUNT_FINAL)
1118 		return;
1119 
1120 	if (fail_cont_count >= ATH12K_RESET_MAX_FAIL_COUNT_FIRST &&
1121 	    time_before(jiffies, ab->reset_fail_timeout))
1122 		return;
1123 
1124 	reset_count = atomic_inc_return(&ab->reset_count);
1125 
1126 	if (reset_count > 1) {
1127 		/* Sometimes it happened another reset worker before the previous one
1128 		 * completed, then the second reset worker will destroy the previous one,
1129 		 * thus below is to avoid that.
1130 		 */
1131 		ath12k_warn(ab, "already resetting count %d\n", reset_count);
1132 
1133 		reinit_completion(&ab->reset_complete);
1134 		time_left = wait_for_completion_timeout(&ab->reset_complete,
1135 							ATH12K_RESET_TIMEOUT_HZ);
1136 		if (time_left) {
1137 			ath12k_dbg(ab, ATH12K_DBG_BOOT, "to skip reset\n");
1138 			atomic_dec(&ab->reset_count);
1139 			return;
1140 		}
1141 
1142 		ab->reset_fail_timeout = jiffies + ATH12K_RESET_FAIL_TIMEOUT_HZ;
1143 		/* Record the continuous recovery fail count when recovery failed*/
1144 		fail_cont_count = atomic_inc_return(&ab->fail_cont_count);
1145 	}
1146 
1147 	ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset starting\n");
1148 
1149 	ab->is_reset = true;
1150 	atomic_set(&ab->recovery_start_count, 0);
1151 	reinit_completion(&ab->recovery_start);
1152 	atomic_set(&ab->recovery_count, 0);
1153 
1154 	ath12k_core_pre_reconfigure_recovery(ab);
1155 
1156 	reinit_completion(&ab->reconfigure_complete);
1157 	ath12k_core_post_reconfigure_recovery(ab);
1158 
1159 	ath12k_dbg(ab, ATH12K_DBG_BOOT, "waiting recovery start...\n");
1160 
1161 	time_left = wait_for_completion_timeout(&ab->recovery_start,
1162 						ATH12K_RECOVER_START_TIMEOUT_HZ);
1163 
1164 	ath12k_hif_irq_disable(ab);
1165 	ath12k_hif_ce_irq_disable(ab);
1166 
1167 	ath12k_hif_power_down(ab, false);
1168 	ath12k_hif_power_up(ab);
1169 
1170 	ath12k_dbg(ab, ATH12K_DBG_BOOT, "reset started\n");
1171 }
1172 
1173 int ath12k_core_pre_init(struct ath12k_base *ab)
1174 {
1175 	int ret;
1176 
1177 	ret = ath12k_hw_init(ab);
1178 	if (ret) {
1179 		ath12k_err(ab, "failed to init hw params: %d\n", ret);
1180 		return ret;
1181 	}
1182 
1183 	ath12k_fw_map(ab);
1184 
1185 	return 0;
1186 }
1187 
1188 int ath12k_core_init(struct ath12k_base *ab)
1189 {
1190 	int ret;
1191 
1192 	ret = ath12k_core_soc_create(ab);
1193 	if (ret) {
1194 		ath12k_err(ab, "failed to create soc core: %d\n", ret);
1195 		return ret;
1196 	}
1197 
1198 	return 0;
1199 }
1200 
1201 void ath12k_core_deinit(struct ath12k_base *ab)
1202 {
1203 	mutex_lock(&ab->core_lock);
1204 
1205 	ath12k_core_pdev_destroy(ab);
1206 	ath12k_core_stop(ab);
1207 
1208 	mutex_unlock(&ab->core_lock);
1209 
1210 	ath12k_hif_power_down(ab, false);
1211 	ath12k_mac_destroy(ab);
1212 	ath12k_core_soc_destroy(ab);
1213 	ath12k_fw_unmap(ab);
1214 }
1215 
1216 void ath12k_core_free(struct ath12k_base *ab)
1217 {
1218 	timer_delete_sync(&ab->rx_replenish_retry);
1219 	destroy_workqueue(ab->workqueue_aux);
1220 	destroy_workqueue(ab->workqueue);
1221 	kfree(ab);
1222 }
1223 
1224 struct ath12k_base *ath12k_core_alloc(struct device *dev, size_t priv_size,
1225 				      enum ath12k_bus bus)
1226 {
1227 	struct ath12k_base *ab;
1228 
1229 	ab = kzalloc(sizeof(*ab) + priv_size, GFP_KERNEL);
1230 	if (!ab)
1231 		return NULL;
1232 
1233 	init_completion(&ab->driver_recovery);
1234 
1235 	ab->workqueue = create_singlethread_workqueue("ath12k_wq");
1236 	if (!ab->workqueue)
1237 		goto err_sc_free;
1238 
1239 	ab->workqueue_aux = create_singlethread_workqueue("ath12k_aux_wq");
1240 	if (!ab->workqueue_aux)
1241 		goto err_free_wq;
1242 
1243 	mutex_init(&ab->core_lock);
1244 	spin_lock_init(&ab->base_lock);
1245 	init_completion(&ab->reset_complete);
1246 	init_completion(&ab->reconfigure_complete);
1247 	init_completion(&ab->recovery_start);
1248 
1249 	INIT_LIST_HEAD(&ab->peers);
1250 	init_waitqueue_head(&ab->peer_mapping_wq);
1251 	init_waitqueue_head(&ab->wmi_ab.tx_credits_wq);
1252 	INIT_WORK(&ab->restart_work, ath12k_core_restart);
1253 	INIT_WORK(&ab->reset_work, ath12k_core_reset);
1254 	INIT_WORK(&ab->rfkill_work, ath12k_rfkill_work);
1255 
1256 	timer_setup(&ab->rx_replenish_retry, ath12k_ce_rx_replenish_retry, 0);
1257 	init_completion(&ab->htc_suspend);
1258 	init_completion(&ab->restart_completed);
1259 
1260 	ab->dev = dev;
1261 	ab->hif.bus = bus;
1262 	ab->qmi.num_radios = U8_MAX;
1263 	ab->mlo_capable_flags = ATH12K_INTRA_DEVICE_MLO_SUPPORT;
1264 
1265 	return ab;
1266 
1267 err_free_wq:
1268 	destroy_workqueue(ab->workqueue);
1269 err_sc_free:
1270 	kfree(ab);
1271 	return NULL;
1272 }
1273 
1274 MODULE_DESCRIPTION("Core module for Qualcomm Atheros 802.11be wireless LAN cards.");
1275 MODULE_LICENSE("Dual BSD/GPL");
1276