wifi: ath12k: do not restore ASPM in case of single MSI vector
authorKang Yang <quic_kangyang@quicinc.com>
Fri, 1 Dec 2023 16:09:47 +0000 (18:09 +0200)
committerKalle Valo <quic_kvalo@quicinc.com>
Tue, 5 Dec 2023 15:04:19 +0000 (17:04 +0200)
Current code enables ASPM by default, it allows MHI to enter M2 state.
In case of one MSI vector, system hang is observed if ath12k does MHI
register reading in this state.

The workaround here is to prevent MHI from entering M2 state, this can
be done by disabling ASPM if only one MSI vector is used. When using 32
vectors ASPM is enabled as before.

Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.0-03427-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.15378.4

Signed-off-by: Kang Yang <quic_kangyang@quicinc.com>
Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
Link: https://lore.kernel.org/r/20231121021304.12966-7-quic_kangyang@quicinc.com
drivers/net/wireless/ath/ath12k/pci.c

index 32dcf91e0a06f0b750713cf3b5fc8123a0732852..2d9ef7add95fa2a9e6a48c3c70dc94d9044692cb 100644 (file)
@@ -1094,7 +1094,10 @@ int ath12k_pci_start(struct ath12k_base *ab)
 
        set_bit(ATH12K_PCI_FLAG_INIT_DONE, &ab_pci->flags);
 
-       ath12k_pci_aspm_restore(ab_pci);
+       if (test_bit(ATH12K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags))
+               ath12k_pci_aspm_restore(ab_pci);
+       else
+               ath12k_info(ab, "leaving PCI ASPM disabled to avoid MHI M2 problems\n");
 
        ath12k_pci_ce_irqs_enable(ab);
        ath12k_ce_rx_post_buf(ab);