linux/drivers/pci/pcie
Heiner Kallweit e02b9c6a83 PCI/ASPM: Fix L1 substate handling in aspm_attr_store_common()
commit 8e37372ad0 upstream.

aspm_attr_store_common(), which handles sysfs control of ASPM, has the same
problem as fb097dcd5a ("PCI/ASPM: Disable only ASPM_STATE_L1 when driver
disables L1"): disabling L1 adds only ASPM_L1 (but not any of the L1.x
substates) to the "aspm_disable" mask.

Enabling one substate, e.g., L1.1, via sysfs removes ASPM_L1 from the
disable mask.  Since disabling L1 via sysfs doesn't add any of the
substates to the disable mask, enabling L1.1 actually enables *all* the
substates.

In this scenario:

  - Write 0 to "l1_aspm" to disable L1
  - Write 1 to "l1_1_aspm" to enable L1.1

the intention is to disable L1 and all L1.x substates, then enable just
L1.1, but in fact, *all* L1.x substates are enabled.

Fix this by explicitly disabling all the L1.x substates when disabling L1.

Fixes: 72ea91afbf ("PCI/ASPM: Add sysfs attributes for controlling ASPM link states")
Link: https://lore.kernel.org/r/6ba7dd79-9cfe-4ed0-a002-d99cb842f361@gmail.com
Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
[bhelgaas: commit log]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Cc: stable@vger.kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2023-11-28 17:07:11 +00:00
..
aer.c PCI/AER: Iterate over error counters instead of error strings 2022-07-13 14:45:20 -05:00
aer_inject.c PCI/AER: Update aer-inject URL 2022-03-02 11:26:17 -06:00
aspm.c PCI/ASPM: Fix L1 substate handling in aspm_attr_store_common() 2023-11-28 17:07:11 +00:00
dpc.c PCI/DPC: Await readiness of secondary bus after reset 2023-03-10 09:34:31 +01:00
edr.c PCI/EDR: Clear Device Status after EDR error recovery 2023-05-11 23:03:28 +09:00
err.c PCI/ERR: Recognize disconnected devices in report_error_detected() 2022-06-08 15:08:40 -05:00
Kconfig PCI/AER: Update aer-inject URL 2022-03-02 11:26:17 -06:00
Makefile PCI/ERR: Reduce compile time for CONFIG_PCIEAER=n 2021-10-16 09:16:59 -05:00
pme.c PCI/PME: Use PCI_POSSIBLE_ERROR() to check config reads 2021-11-18 14:13:18 -06:00
portdrv.h PCI/portdrv: Remove unused pcie_port_bus_{,un}register() declarations 2021-10-15 14:25:18 -05:00
portdrv_core.c PCI/portdrv: Don't disable AER reporting in get_port_device_capability() 2022-07-13 14:43:40 -05:00
portdrv_pci.c PCI: portdrv: Set driver_managed_dma 2022-04-28 15:32:20 +02:00
ptm.c PCI/PTM: Reorder functions in logical order 2022-09-12 15:29:52 -05:00
rcec.c PCI/RCEC: Fix RCiEP device to RCEC association 2021-03-10 15:10:46 -06:00