[PATCH v2] wifi: ath11k: fix boot failure with one MSI vector
Jeff Johnson
quic_jjohnson at quicinc.com
Wed Sep 6 22:06:33 PDT 2023
On 9/6/2023 6:56 PM, Baochen Qiang wrote:
> Commit 5b32b6dd96633 ("ath11k: Remove core PCI references from
> PCI common code") breaks with one MSI vector because it moves
> affinity setting after IRQ request, see below log:
>
> [ 1417.278835] ath11k_pci 0000:02:00.0: failed to receive control response completion, polling..
> [ 1418.302829] ath11k_pci 0000:02:00.0: Service connect timeout
> [ 1418.302833] ath11k_pci 0000:02:00.0: failed to connect to HTT: -110
> [ 1418.303669] ath11k_pci 0000:02:00.0: failed to start core: -110
>
> The detail is, if do affinity request after IRQ activated,
> which is done in request_irq(), kernel caches that request and
> returns success directly. Later when a subsequent MHI interrupt is
> fired, kernel will do the real affinity setting work, as a result,
> changs the MSI vector. However at that time host has configured
> old vector to hardware, so host never receives CE or DP interrupts.
>
> Fix it by setting affinity before registering MHI controller
> where host is, for the first time, doing IRQ request.
>
> Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3
Tested-on: WCN6855 hw2.1 PCI
WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.23
Tested-on: WCN6750 hw1.0 AHB WLAN.MSL.1.0.1-01160-QCAMSLSWPLZ-1
>
> Fixes: 5b32b6dd9663 ("ath11k: Remove core PCI references from PCI common code")
> Signed-off-by: Baochen Qiang <quic_bqiang at quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson at quicinc.com>
> ---
> v2:
> rebase on latest ath.git due to v1 apply failure.
>
> drivers/net/wireless/ath/ath11k/pci.c | 24 ++++++++++++------------
> 1 file changed, 12 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/net/wireless/ath/ath11k/pci.c b/drivers/net/wireless/ath/ath11k/pci.c
> index 9573bd959cac..aa049593f9b5 100644
> --- a/drivers/net/wireless/ath/ath11k/pci.c
> +++ b/drivers/net/wireless/ath/ath11k/pci.c
> @@ -852,10 +852,16 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
> if (ret)
> goto err_pci_disable_msi;
>
> + ret = ath11k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0));
> + if (ret) {
> + ath11k_err(ab, "failed to set irq affinity %d\n", ret);
> + goto err_pci_disable_msi;
> + }
> +
> ret = ath11k_mhi_register(ab_pci);
> if (ret) {
> ath11k_err(ab, "failed to register mhi: %d\n", ret);
> - goto err_pci_disable_msi;
> + goto err_irq_affinity_cleanup;
> }
>
> ret = ath11k_hal_srng_init(ab);
> @@ -876,12 +882,6 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
> goto err_ce_free;
> }
>
> - ret = ath11k_pci_set_irq_affinity_hint(ab_pci, cpumask_of(0));
> - if (ret) {
> - ath11k_err(ab, "failed to set irq affinity %d\n", ret);
> - goto err_free_irq;
> - }
> -
> /* kernel may allocate a dummy vector before request_irq and
> * then allocate a real vector when request_irq is called.
> * So get msi_data here again to avoid spurious interrupt
> @@ -890,20 +890,17 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
> ret = ath11k_pci_config_msi_data(ab_pci);
> if (ret) {
> ath11k_err(ab, "failed to config msi_data: %d\n", ret);
> - goto err_irq_affinity_cleanup;
> + goto err_free_irq;
> }
>
> ret = ath11k_core_init(ab);
> if (ret) {
> ath11k_err(ab, "failed to init core: %d\n", ret);
> - goto err_irq_affinity_cleanup;
> + goto err_free_irq;
> }
> ath11k_qmi_fwreset_from_cold_boot(ab);
> return 0;
>
> -err_irq_affinity_cleanup:
> - ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
> -
> err_free_irq:
> ath11k_pcic_free_irq(ab);
>
> @@ -916,6 +913,9 @@ static int ath11k_pci_probe(struct pci_dev *pdev,
> err_mhi_unregister:
> ath11k_mhi_unregister(ab_pci);
>
> +err_irq_affinity_cleanup:
> + ath11k_pci_set_irq_affinity_hint(ab_pci, NULL);
> +
> err_pci_disable_msi:
> ath11k_pci_free_msi(ab_pci);
>
>
> base-commit: 0263687f4441d5a5eab8074d56b4693c8f0acf85
More information about the ath11k
mailing list