Baochen Qiang <bqiang@xxxxxxxxxxxxxx> writes: > With VT-d disabled on Intel platform, ath11k gets only one MSI > vector. In that case, ath11k does not free IRQ when doing suspend, > hence the kernel has to migrate it to CPU0 (if it was affine to > other CPUs) and allocates a new MSI vector. However, ath11k has > no chance to reconfig it to HW srngs during this phase, thus > ath11k fails to resume. > > This issue can be fixed by setting IRQ affinity to CPU0 before > request_irq is called. With such affinity, migration will not > happen and thus the vector keeps unchanged during suspend/resume. > > Tested-on: QCA6390 hw2.0 PCI WLAN.HST.1.0.1-01740-QCAHSTSWPLZ_V2_TO_X86-1 > > Signed-off-by: Baochen Qiang <bqiang@xxxxxxxxxxxxxx> > --- > drivers/net/wireless/ath/ath11k/pci.c | 24 ++++++++++++++++++++++-- > 1 file changed, 22 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/wireless/ath/ath11k/pci.c b/drivers/net/wireless/ath/ath11k/pci.c > index b450b4ed35d1..1cad7545ceb9 100644 > --- a/drivers/net/wireless/ath/ath11k/pci.c > +++ b/drivers/net/wireless/ath/ath11k/pci.c > @@ -840,6 +840,14 @@ static int ath11k_pci_ext_irq_config(struct ath11k_base *ab) > return 0; > } > > +static int ath11k_pci_set_irq_affinity_hint(struct ath11k_pci *ab_pci, const struct cpumask *m) > +{ > + if (!test_bit(ATH11K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags)) > + return irq_set_affinity_hint(ab_pci->pdev->irq, m); > + > + return 0; > +} I reversed the order here: static int ath11k_pci_set_irq_affinity_hint(struct ath11k_pci *ab_pci, const struct cpumask *m) { if (test_bit(ATH11K_PCI_FLAG_MULTI_MSI_VECTORS, &ab_pci->flags)) return 0; return irq_set_affinity_hint(ab_pci->pdev->irq, m); } -- https://patchwork.kernel.org/project/linux-wireless/list/ https://wireless.wiki.kernel.org/en/developers/documentation/submittingpatches