]> git.itanic.dy.fi Git - linux-stable/commitdiff
wifi: ath10k: Use RMW accessors for changing LNKCTL
authorIlpo Järvinen <ilpo.jarvinen@linux.intel.com>
Mon, 17 Jul 2023 12:05:02 +0000 (15:05 +0300)
committerBjorn Helgaas <bhelgaas@google.com>
Mon, 21 Aug 2023 19:11:51 +0000 (14:11 -0500)
Don't assume that only the driver would be accessing LNKCTL. ASPM policy
changes can trigger write to LNKCTL outside of driver's control.

Use RMW capability accessors which does proper locking to avoid losing
concurrent updates to the register value. On restore, clear the ASPMC field
properly.

Suggested-by: Lukas Wunner <lukas@wunner.de>
Fixes: 76d870ed09ab ("ath10k: enable ASPM")
Link: https://lore.kernel.org/r/20230717120503.15276-11-ilpo.jarvinen@linux.intel.com
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Simon Horman <simon.horman@corigine.com>
Acked-by: Kalle Valo <kvalo@kernel.org>
drivers/net/wireless/ath/ath10k/pci.c

index a7f44f6335fb89d531d334fb6dd3fa515320afbd..9275a672f90cbbb08f7b2f52bcd100ef401c16f7 100644 (file)
@@ -1963,8 +1963,9 @@ static int ath10k_pci_hif_start(struct ath10k *ar)
        ath10k_pci_irq_enable(ar);
        ath10k_pci_rx_post(ar);
 
-       pcie_capability_write_word(ar_pci->pdev, PCI_EXP_LNKCTL,
-                                  ar_pci->link_ctl);
+       pcie_capability_clear_and_set_word(ar_pci->pdev, PCI_EXP_LNKCTL,
+                                          PCI_EXP_LNKCTL_ASPMC,
+                                          ar_pci->link_ctl & PCI_EXP_LNKCTL_ASPMC);
 
        return 0;
 }
@@ -2821,8 +2822,8 @@ static int ath10k_pci_hif_power_up(struct ath10k *ar,
 
        pcie_capability_read_word(ar_pci->pdev, PCI_EXP_LNKCTL,
                                  &ar_pci->link_ctl);
-       pcie_capability_write_word(ar_pci->pdev, PCI_EXP_LNKCTL,
-                                  ar_pci->link_ctl & ~PCI_EXP_LNKCTL_ASPMC);
+       pcie_capability_clear_word(ar_pci->pdev, PCI_EXP_LNKCTL,
+                                  PCI_EXP_LNKCTL_ASPMC);
 
        /*
         * Bring the target up cleanly.