linux/drivers/pci/pcie
Feng Tang 2a54a1a9c6 PCI/portdrv: Only disable pciehp interrupts early when needed
[ Upstream commit 9d7db4db19 ]

Firmware developers reported that Linux issues two PCIe hotplug commands in
very short intervals on an ARM server, which doesn't comply with the PCIe
spec.  According to PCIe r6.1, sec 6.7.3.2, if the Command Completed event
is supported, software must wait for a command to complete or wait at
least 1 second before sending a new command.

In the failure case, the first PCIe hotplug command is from
get_port_device_capability(), which sends a command to disable PCIe hotplug
interrupts without waiting for its completion, and the second command comes
from pcie_enable_notification() of pciehp driver, which enables hotplug
interrupts again.

Fix this by only disabling the hotplug interrupts when the pciehp driver is
not enabled.

Link: https://lore.kernel.org/r/20250303023630.78397-1-feng.tang@linux.alibaba.com
Fixes: 2bd50dd800 ("PCI: PCIe: Disable PCIe port services during port initialization")
Suggested-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Feng Tang <feng.tang@linux.alibaba.com>
[bhelgaas: commit log]
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Lukas Wunner <lukas@wunner.de>
Reviewed-by: Kuppuswamy Sathyanarayanan <sathyanarayanan.kuppuswamy@linux.intel.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
History 2025-04-10 14:39:15 +02:00
..
aer.c PCI/AER: Disable AER service on suspend 2024-06-18 14:49:44 -05:00
aer_inject.c PCI/AER: Use PCI_DEVID() macro in aer_inject() 2024-09-01 17:05:45 +00:00
aspm.c PCI/ASPM: Fix link state exit during switch upstream function removal 2025-04-10 14:39:14 +02:00
dpc.c PCI/DPC: Disable DPC service on suspend 2024-06-18 14:51:23 -05:00
edr.c PCI/EDR: Align EDR_PORT_LOCATE_DSM with PCI Firmware r3.3 2024-05-08 15:08:39 -05:00
err.c PCI/ERR: Cleanup misleading indentation inside if conditions 2024-04-29 10:33:29 -05:00
Kconfig PCI/AER: Update aer-inject tool source URL 2024-04-17 10:35:43 -05:00
Makefile PCI/ASPM: Always build aspm.c 2024-03-07 14:29:17 -06:00
pme.c PCI/PME: Use FIELD_GET() 2023-10-24 16:55:45 -05:00
portdrv.c PCI/portdrv: Only disable pciehp interrupts early when needed 2025-04-10 14:39:15 +02:00
portdrv.h PCI: Make pcie_port_bus_type const 2024-02-08 14:59:47 -06:00
ptm.c PCI/PTM: Use FIELD_GET() 2023-10-24 16:55:45 -05:00
rcec.c PCI/RCEC: Fix RCiEP device to RCEC association 2021-03-10 15:10:46 -06:00