1 // SPDX-License-Identifier: BSD-3-Clause-Clear
3 * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
6 #include <linux/module.h>
7 #include <linux/slab.h>
8 #include <linux/remoteproc.h>
9 #include <linux/firmware.h>
16 unsigned int ath11k_debug_mask
;
17 module_param_named(debug_mask
, ath11k_debug_mask
, uint
, 0644);
18 MODULE_PARM_DESC(debug_mask
, "Debugging mask");
20 static const struct ath11k_hw_params ath11k_hw_params
[] = {
22 .hw_rev
= ATH11K_HW_IPQ8074
,
23 .name
= "ipq8074 hw2.0",
25 .dir
= IPQ8074_FW_DIR
,
26 .board_size
= IPQ8074_MAX_BOARD_DATA_SZ
,
27 .cal_size
= IPQ8074_MAX_CAL_DATA_SZ
,
30 .bdf_addr
= 0x4B0C0000,
31 .hw_ops
= &ipq8074_ops
,
35 static int ath11k_core_create_board_name(struct ath11k_base
*ab
, char *name
,
38 /* Note: bus is fixed to ahb. When other bus type supported,
41 scnprintf(name
, name_len
,
42 "bus=ahb,qmi-chip-id=%d,qmi-board-id=%d",
43 ab
->qmi
.target
.chip_id
,
44 ab
->qmi
.target
.board_id
);
46 ath11k_dbg(ab
, ATH11K_DBG_BOOT
, "boot using board name '%s'\n", name
);
51 const struct firmware
*ath11k_core_firmware_request(struct ath11k_base
*ab
,
56 const struct firmware
*fw
;
60 return ERR_PTR(-ENOENT
);
65 snprintf(filename
, sizeof(filename
), "%s/%s", dir
, file
);
67 ret
= firmware_request_nowarn(&fw
, filename
, ab
->dev
);
71 ath11k_dbg(ab
, ATH11K_DBG_BOOT
, "boot firmware request %s size %zu\n",
77 void ath11k_core_free_bdf(struct ath11k_base
*ab
, struct ath11k_board_data
*bd
)
80 release_firmware(bd
->fw
);
82 memset(bd
, 0, sizeof(*bd
));
85 static int ath11k_core_parse_bd_ie_board(struct ath11k_base
*ab
,
86 struct ath11k_board_data
*bd
,
87 const void *buf
, size_t buf_len
,
88 const char *boardname
,
91 const struct ath11k_fw_ie
*hdr
;
92 bool name_match_found
;
95 const void *board_ie_data
;
97 name_match_found
= false;
99 /* go through ATH11K_BD_IE_BOARD_ elements */
100 while (buf_len
> sizeof(struct ath11k_fw_ie
)) {
102 board_ie_id
= le32_to_cpu(hdr
->id
);
103 board_ie_len
= le32_to_cpu(hdr
->len
);
104 board_ie_data
= hdr
->data
;
106 buf_len
-= sizeof(*hdr
);
109 if (buf_len
< ALIGN(board_ie_len
, 4)) {
110 ath11k_err(ab
, "invalid ATH11K_BD_IE_BOARD length: %zu < %zu\n",
111 buf_len
, ALIGN(board_ie_len
, 4));
116 switch (board_ie_id
) {
117 case ATH11K_BD_IE_BOARD_NAME
:
118 ath11k_dbg_dump(ab
, ATH11K_DBG_BOOT
, "board name", "",
119 board_ie_data
, board_ie_len
);
121 if (board_ie_len
!= strlen(boardname
))
124 ret
= memcmp(board_ie_data
, boardname
, strlen(boardname
));
128 name_match_found
= true;
129 ath11k_dbg(ab
, ATH11K_DBG_BOOT
,
130 "boot found match for name '%s'",
133 case ATH11K_BD_IE_BOARD_DATA
:
134 if (!name_match_found
)
138 ath11k_dbg(ab
, ATH11K_DBG_BOOT
,
139 "boot found board data for '%s'", boardname
);
141 bd
->data
= board_ie_data
;
142 bd
->len
= board_ie_len
;
147 ath11k_warn(ab
, "unknown ATH11K_BD_IE_BOARD found: %d\n",
152 /* jump over the padding */
153 board_ie_len
= ALIGN(board_ie_len
, 4);
155 buf_len
-= board_ie_len
;
166 static int ath11k_core_fetch_board_data_api_n(struct ath11k_base
*ab
,
167 struct ath11k_board_data
*bd
,
168 const char *boardname
)
170 size_t len
, magic_len
;
172 char *filename
= ATH11K_BOARD_API2_FILE
;
174 struct ath11k_fw_ie
*hdr
;
178 bd
->fw
= ath11k_core_firmware_request(ab
,
179 ab
->hw_params
.fw
.dir
,
182 return PTR_ERR(bd
->fw
);
187 /* magic has extra null byte padded */
188 magic_len
= strlen(ATH11K_BOARD_MAGIC
) + 1;
189 if (len
< magic_len
) {
190 ath11k_err(ab
, "failed to find magic value in %s/%s, file too short: %zu\n",
191 ab
->hw_params
.fw
.dir
, filename
, len
);
196 if (memcmp(data
, ATH11K_BOARD_MAGIC
, magic_len
)) {
197 ath11k_err(ab
, "found invalid board magic\n");
202 /* magic is padded to 4 bytes */
203 magic_len
= ALIGN(magic_len
, 4);
204 if (len
< magic_len
) {
205 ath11k_err(ab
, "failed: %s/%s too small to contain board data, len: %zu\n",
206 ab
->hw_params
.fw
.dir
, filename
, len
);
214 while (len
> sizeof(struct ath11k_fw_ie
)) {
215 hdr
= (struct ath11k_fw_ie
*)data
;
216 ie_id
= le32_to_cpu(hdr
->id
);
217 ie_len
= le32_to_cpu(hdr
->len
);
222 if (len
< ALIGN(ie_len
, 4)) {
223 ath11k_err(ab
, "invalid length for board ie_id %d ie_len %zu len %zu\n",
229 case ATH11K_BD_IE_BOARD
:
230 ret
= ath11k_core_parse_bd_ie_board(ab
, bd
, data
,
235 /* no match found, continue */
238 /* there was an error, bail out */
240 /* either found or error, so stop searching */
244 /* jump over the padding */
245 ie_len
= ALIGN(ie_len
, 4);
252 if (!bd
->data
|| !bd
->len
) {
254 "failed to fetch board data for %s from %s/%s\n",
255 boardname
, ab
->hw_params
.fw
.dir
, filename
);
263 ath11k_core_free_bdf(ab
, bd
);
267 static int ath11k_core_fetch_board_data_api_1(struct ath11k_base
*ab
,
268 struct ath11k_board_data
*bd
)
270 bd
->fw
= ath11k_core_firmware_request(ab
,
271 ab
->hw_params
.fw
.dir
,
272 ATH11K_DEFAULT_BOARD_FILE
);
274 return PTR_ERR(bd
->fw
);
276 bd
->data
= bd
->fw
->data
;
277 bd
->len
= bd
->fw
->size
;
282 #define BOARD_NAME_SIZE 100
283 int ath11k_core_fetch_bdf(struct ath11k_base
*ab
, struct ath11k_board_data
*bd
)
285 char boardname
[BOARD_NAME_SIZE
];
288 ret
= ath11k_core_create_board_name(ab
, boardname
, BOARD_NAME_SIZE
);
290 ath11k_err(ab
, "failed to create board name: %d", ret
);
295 ret
= ath11k_core_fetch_board_data_api_n(ab
, bd
, boardname
);
300 ret
= ath11k_core_fetch_board_data_api_1(ab
, bd
);
302 ath11k_err(ab
, "failed to fetch board-2.bin or board.bin from %s\n",
303 ab
->hw_params
.fw
.dir
);
308 ath11k_dbg(ab
, ATH11K_DBG_BOOT
, "using board api %d\n", ab
->bd_api
);
312 static void ath11k_core_stop(struct ath11k_base
*ab
)
314 if (!test_bit(ATH11K_FLAG_CRASH_FLUSH
, &ab
->dev_flags
))
315 ath11k_qmi_firmware_stop(ab
);
317 ath11k_wmi_detach(ab
);
318 ath11k_dp_pdev_reo_cleanup(ab
);
320 /* De-Init of components as needed */
323 static int ath11k_core_soc_create(struct ath11k_base
*ab
)
327 ret
= ath11k_qmi_init_service(ab
);
329 ath11k_err(ab
, "failed to initialize qmi :%d\n", ret
);
333 ret
= ath11k_debug_soc_create(ab
);
335 ath11k_err(ab
, "failed to create ath11k debugfs\n");
339 ret
= ath11k_hif_power_up(ab
);
341 ath11k_err(ab
, "failed to power up :%d\n", ret
);
342 goto err_debugfs_reg
;
348 ath11k_debug_soc_destroy(ab
);
350 ath11k_qmi_deinit_service(ab
);
354 static void ath11k_core_soc_destroy(struct ath11k_base
*ab
)
356 ath11k_debug_soc_destroy(ab
);
359 ath11k_qmi_deinit_service(ab
);
362 static int ath11k_core_pdev_create(struct ath11k_base
*ab
)
366 ret
= ath11k_debug_pdev_create(ab
);
368 ath11k_err(ab
, "failed to create core pdev debugfs: %d\n", ret
);
372 ret
= ath11k_mac_register(ab
);
374 ath11k_err(ab
, "failed register the radio with mac80211: %d\n", ret
);
378 ret
= ath11k_dp_pdev_alloc(ab
);
380 ath11k_err(ab
, "failed to attach DP pdev: %d\n", ret
);
381 goto err_mac_unregister
;
384 ret
= ath11k_thermal_register(ab
);
386 ath11k_err(ab
, "could not register thermal device: %d\n",
388 goto err_dp_pdev_free
;
391 ret
= ath11k_spectral_init(ab
);
393 ath11k_err(ab
, "failed to init spectral %d\n", ret
);
394 goto err_thermal_unregister
;
399 err_thermal_unregister
:
400 ath11k_thermal_unregister(ab
);
402 ath11k_dp_pdev_free(ab
);
404 ath11k_mac_unregister(ab
);
406 ath11k_debug_pdev_destroy(ab
);
411 static void ath11k_core_pdev_destroy(struct ath11k_base
*ab
)
413 ath11k_spectral_deinit(ab
);
414 ath11k_thermal_unregister(ab
);
415 ath11k_mac_unregister(ab
);
416 ath11k_hif_irq_disable(ab
);
417 ath11k_dp_pdev_free(ab
);
418 ath11k_debug_pdev_destroy(ab
);
421 static int ath11k_core_start(struct ath11k_base
*ab
,
422 enum ath11k_firmware_mode mode
)
426 ret
= ath11k_qmi_firmware_start(ab
, mode
);
428 ath11k_err(ab
, "failed to attach wmi: %d\n", ret
);
432 ret
= ath11k_wmi_attach(ab
);
434 ath11k_err(ab
, "failed to attach wmi: %d\n", ret
);
435 goto err_firmware_stop
;
438 ret
= ath11k_htc_init(ab
);
440 ath11k_err(ab
, "failed to init htc: %d\n", ret
);
444 ret
= ath11k_hif_start(ab
);
446 ath11k_err(ab
, "failed to start HIF: %d\n", ret
);
450 ret
= ath11k_htc_wait_target(&ab
->htc
);
452 ath11k_err(ab
, "failed to connect to HTC: %d\n", ret
);
456 ret
= ath11k_dp_htt_connect(&ab
->dp
);
458 ath11k_err(ab
, "failed to connect to HTT: %d\n", ret
);
462 ret
= ath11k_wmi_connect(ab
);
464 ath11k_err(ab
, "failed to connect wmi: %d\n", ret
);
468 ret
= ath11k_htc_start(&ab
->htc
);
470 ath11k_err(ab
, "failed to start HTC: %d\n", ret
);
474 ret
= ath11k_wmi_wait_for_service_ready(ab
);
476 ath11k_err(ab
, "failed to receive wmi service ready event: %d\n",
481 ret
= ath11k_mac_allocate(ab
);
483 ath11k_err(ab
, "failed to create new hw device with mac80211 :%d\n",
488 ath11k_dp_pdev_pre_alloc(ab
);
490 ret
= ath11k_dp_pdev_reo_setup(ab
);
492 ath11k_err(ab
, "failed to initialize reo destination rings: %d\n", ret
);
493 goto err_mac_destroy
;
496 ret
= ath11k_wmi_cmd_init(ab
);
498 ath11k_err(ab
, "failed to send wmi init cmd: %d\n", ret
);
499 goto err_reo_cleanup
;
502 ret
= ath11k_wmi_wait_for_unified_ready(ab
);
504 ath11k_err(ab
, "failed to receive wmi unified ready event: %d\n",
506 goto err_reo_cleanup
;
509 ret
= ath11k_dp_tx_htt_h2t_ver_req_msg(ab
);
511 ath11k_err(ab
, "failed to send htt version request message: %d\n",
513 goto err_reo_cleanup
;
519 ath11k_dp_pdev_reo_cleanup(ab
);
521 ath11k_mac_destroy(ab
);
525 ath11k_wmi_detach(ab
);
527 ath11k_qmi_firmware_stop(ab
);
532 int ath11k_core_qmi_firmware_ready(struct ath11k_base
*ab
)
536 ret
= ath11k_ce_init_pipes(ab
);
538 ath11k_err(ab
, "failed to initialize CE: %d\n", ret
);
542 ret
= ath11k_dp_alloc(ab
);
544 ath11k_err(ab
, "failed to init DP: %d\n", ret
);
548 mutex_lock(&ab
->core_lock
);
549 ret
= ath11k_core_start(ab
, ATH11K_FIRMWARE_MODE_NORMAL
);
551 ath11k_err(ab
, "failed to start core: %d\n", ret
);
555 ret
= ath11k_core_pdev_create(ab
);
557 ath11k_err(ab
, "failed to create pdev core: %d\n", ret
);
560 ath11k_hif_irq_enable(ab
);
561 mutex_unlock(&ab
->core_lock
);
566 ath11k_core_stop(ab
);
567 ath11k_mac_destroy(ab
);
570 mutex_unlock(&ab
->core_lock
);
574 static int ath11k_core_reconfigure_on_crash(struct ath11k_base
*ab
)
578 mutex_lock(&ab
->core_lock
);
579 ath11k_thermal_unregister(ab
);
580 ath11k_hif_irq_disable(ab
);
581 ath11k_dp_pdev_free(ab
);
582 ath11k_spectral_deinit(ab
);
584 ath11k_wmi_detach(ab
);
585 ath11k_dp_pdev_reo_cleanup(ab
);
586 mutex_unlock(&ab
->core_lock
);
589 ath11k_hal_srng_deinit(ab
);
591 ab
->free_vdev_map
= (1LL << (ab
->num_radios
* TARGET_NUM_VDEVS
)) - 1;
593 ret
= ath11k_hal_srng_init(ab
);
597 clear_bit(ATH11K_FLAG_CRASH_FLUSH
, &ab
->dev_flags
);
599 ret
= ath11k_core_qmi_firmware_ready(ab
);
601 goto err_hal_srng_deinit
;
603 clear_bit(ATH11K_FLAG_RECOVERY
, &ab
->dev_flags
);
608 ath11k_hal_srng_deinit(ab
);
612 void ath11k_core_halt(struct ath11k
*ar
)
614 struct ath11k_base
*ab
= ar
->ab
;
616 lockdep_assert_held(&ar
->conf_mutex
);
618 ar
->num_created_vdevs
= 0;
619 ar
->allocated_vdev_map
= 0;
621 ath11k_mac_scan_finish(ar
);
622 ath11k_mac_peer_cleanup_all(ar
);
623 cancel_delayed_work_sync(&ar
->scan
.timeout
);
624 cancel_work_sync(&ar
->regd_update_work
);
626 rcu_assign_pointer(ab
->pdevs_active
[ar
->pdev_idx
], NULL
);
628 INIT_LIST_HEAD(&ar
->arvifs
);
629 idr_init(&ar
->txmgmt_idr
);
632 static void ath11k_core_restart(struct work_struct
*work
)
634 struct ath11k_base
*ab
= container_of(work
, struct ath11k_base
, restart_work
);
636 struct ath11k_pdev
*pdev
;
639 spin_lock_bh(&ab
->base_lock
);
640 ab
->stats
.fw_crash_counter
++;
641 spin_unlock_bh(&ab
->base_lock
);
643 for (i
= 0; i
< ab
->num_radios
; i
++) {
644 pdev
= &ab
->pdevs
[i
];
646 if (!ar
|| ar
->state
== ATH11K_STATE_OFF
)
649 ieee80211_stop_queues(ar
->hw
);
650 ath11k_mac_drain_tx(ar
);
651 complete(&ar
->scan
.started
);
652 complete(&ar
->scan
.completed
);
653 complete(&ar
->peer_assoc_done
);
654 complete(&ar
->install_key_done
);
655 complete(&ar
->vdev_setup_done
);
656 complete(&ar
->bss_survey_done
);
657 complete(&ar
->thermal
.wmi_sync
);
659 wake_up(&ar
->dp
.tx_empty_waitq
);
660 idr_for_each(&ar
->txmgmt_idr
,
661 ath11k_mac_tx_mgmt_pending_free
, ar
);
662 idr_destroy(&ar
->txmgmt_idr
);
665 wake_up(&ab
->wmi_ab
.tx_credits_wq
);
666 wake_up(&ab
->peer_mapping_wq
);
668 ret
= ath11k_core_reconfigure_on_crash(ab
);
670 ath11k_err(ab
, "failed to reconfigure driver on crash recovery\n");
674 for (i
= 0; i
< ab
->num_radios
; i
++) {
675 pdev
= &ab
->pdevs
[i
];
677 if (!ar
|| ar
->state
== ATH11K_STATE_OFF
)
680 mutex_lock(&ar
->conf_mutex
);
683 case ATH11K_STATE_ON
:
684 ar
->state
= ATH11K_STATE_RESTARTING
;
685 ath11k_core_halt(ar
);
686 ieee80211_restart_hw(ar
->hw
);
688 case ATH11K_STATE_OFF
:
690 "cannot restart radio %d that hasn't been started\n",
693 case ATH11K_STATE_RESTARTING
:
695 case ATH11K_STATE_RESTARTED
:
696 ar
->state
= ATH11K_STATE_WEDGED
;
698 case ATH11K_STATE_WEDGED
:
700 "device is wedged, will not restart radio %d\n", i
);
703 mutex_unlock(&ar
->conf_mutex
);
705 complete(&ab
->driver_recovery
);
708 static int ath11k_init_hw_params(struct ath11k_base
*ab
)
710 const struct ath11k_hw_params
*hw_params
= NULL
;
713 for (i
= 0; i
< ARRAY_SIZE(ath11k_hw_params
); i
++) {
714 hw_params
= &ath11k_hw_params
[i
];
716 if (hw_params
->hw_rev
== ab
->hw_rev
)
720 if (i
== ARRAY_SIZE(ath11k_hw_params
)) {
721 ath11k_err(ab
, "Unsupported hardware version: 0x%x\n", ab
->hw_rev
);
725 ab
->hw_params
= *hw_params
;
727 ath11k_dbg(ab
, ATH11K_DBG_BOOT
, "Hardware name %s\n", ab
->hw_params
.name
);
732 int ath11k_core_init(struct ath11k_base
*ab
)
734 struct device
*dev
= ab
->dev
;
735 struct rproc
*prproc
;
736 phandle rproc_phandle
;
739 if (of_property_read_u32(dev
->of_node
, "qcom,rproc", &rproc_phandle
)) {
740 ath11k_err(ab
, "failed to get q6_rproc handle\n");
744 prproc
= rproc_get_by_phandle(rproc_phandle
);
746 ath11k_err(ab
, "failed to get rproc\n");
749 ab
->tgt_rproc
= prproc
;
751 ret
= ath11k_init_hw_params(ab
);
753 ath11k_err(ab
, "failed to get hw params %d\n", ret
);
757 ret
= ath11k_core_soc_create(ab
);
759 ath11k_err(ab
, "failed to create soc core: %d\n", ret
);
766 void ath11k_core_deinit(struct ath11k_base
*ab
)
768 mutex_lock(&ab
->core_lock
);
770 ath11k_core_pdev_destroy(ab
);
771 ath11k_core_stop(ab
);
773 mutex_unlock(&ab
->core_lock
);
775 ath11k_hif_power_down(ab
);
776 ath11k_mac_destroy(ab
);
777 ath11k_core_soc_destroy(ab
);
780 void ath11k_core_free(struct ath11k_base
*ab
)
785 struct ath11k_base
*ath11k_core_alloc(struct device
*dev
, size_t priv_size
,
788 struct ath11k_base
*ab
;
790 ab
= kzalloc(sizeof(*ab
) + priv_size
, GFP_KERNEL
);
794 init_completion(&ab
->driver_recovery
);
796 ab
->workqueue
= create_singlethread_workqueue("ath11k_wq");
800 mutex_init(&ab
->core_lock
);
801 spin_lock_init(&ab
->base_lock
);
803 INIT_LIST_HEAD(&ab
->peers
);
804 init_waitqueue_head(&ab
->peer_mapping_wq
);
805 init_waitqueue_head(&ab
->wmi_ab
.tx_credits_wq
);
806 INIT_WORK(&ab
->restart_work
, ath11k_core_restart
);
807 timer_setup(&ab
->rx_replenish_retry
, ath11k_ce_rx_replenish_retry
, 0);