linux/drivers/pci
Liguang Zhang 92912b1751 PCI: pciehp: Clear cmd_busy bit in polling mode
Writes to a Downstream Port's Slot Control register are PCIe hotplug
"commands."  If the Port supports Command Completed events, software must
wait for a command to complete before writing to Slot Control again.

pcie_do_write_cmd() sets ctrl->cmd_busy when it writes to Slot Control.  If
software notification is enabled, i.e., PCI_EXP_SLTCTL_HPIE and
PCI_EXP_SLTCTL_CCIE are set, ctrl->cmd_busy is cleared by pciehp_isr().

But when software notification is disabled, as it is when pcie_init()
powers off an empty slot, pcie_wait_cmd() uses pcie_poll_cmd() to poll for
command completion, and it neglects to clear ctrl->cmd_busy, which leads to
spurious timeouts:

  pcieport 0000:00:03.0: pciehp: Timeout on hotplug command 0x01c0 (issued 2264 msec ago)
  pcieport 0000:00:03.0: pciehp: Timeout on hotplug command 0x05c0 (issued 2288 msec ago)

Clear ctrl->cmd_busy in pcie_poll_cmd() when it detects a Command Completed
event (PCI_EXP_SLTSTA_CC).

[bhelgaas: commit log]
Fixes: a5dd4b4b05 ("PCI: pciehp: Wait for hotplug command completion where necessary")
Link: https://lore.kernel.org/r/20211111054258.7309-1-zhangliguang@linux.alibaba.com
Link: https://bugzilla.kernel.org/show_bug.cgi?id=215143
Link: https://lore.kernel.org/r/20211126173309.GA12255@wunner.de
Signed-off-by: Liguang Zhang <zhangliguang@linux.alibaba.com>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Lukas Wunner <lukas@wunner.de>
Cc: stable@vger.kernel.org	# v4.19+
2022-02-03 13:36:23 -06:00
..
controller bitmap patches for 5.17-rc1 2022-01-23 06:20:44 +02:00
endpoint Merge branch 'pci/misc' 2022-01-13 09:57:52 -06:00
hotplug PCI: pciehp: Clear cmd_busy bit in polling mode 2022-02-03 13:36:23 -06:00
msi PCI/MSI: Unbreak pci_irq_get_affinity() 2021-12-18 20:33:21 +01:00
pcie Merge branch 'pci/errors' 2022-01-13 09:57:52 -06:00
switch PCI/switchtec: Declare local state_names[] as static 2021-11-19 12:14:02 -06:00
access.c PCI: Use PCI_ERROR_RESPONSE to identify config read errors 2021-11-18 14:31:43 -06:00
ats.c PCI: Allow PASID on fake PCIe devices without TLP prefixes 2021-08-26 14:21:42 -05:00
bus.c
ecam.c
host-bridge.c PCI: VMD: ACPI: Make ACPI companion lookup work for VMD bus 2021-09-02 17:59:58 +02:00
iov.c Revert "PCI: Use to_pci_driver() instead of pci_dev->driver" 2021-11-11 13:36:22 -06:00
irq.c
Kconfig PCI: hv: Add arm64 Hyper-V vPCI support 2022-01-12 08:24:29 -06:00
Makefile PCI/MSI: Move code into a separate directory 2021-12-09 11:52:22 +01:00
mmap.c
of.c PCI: Correct misspelled words 2022-01-07 20:43:23 -06:00
p2pdma.c pci-v5.17-changes 2022-01-16 08:08:11 +02:00
pci-acpi.c Merge branch 'pm-pci' 2021-11-02 19:06:30 +01:00
pci-bridge-emul.c Merge branch 'remotes/lorenzo/pci/bridge-emul' 2022-01-13 09:57:51 -06:00
pci-bridge-emul.h
pci-driver.c Revert "PCI: Use to_pci_driver() instead of pci_dev->driver" 2021-11-11 13:36:22 -06:00
pci-label.c
pci-mid.c PCI: PM: Do not use pci_platform_pm_ops for Intel MID PM 2021-09-27 17:13:21 +02:00
pci-pf-stub.c
pci-stub.c
pci-sysfs.c PCI/sysfs: Use pci_irq_vector() 2021-12-09 11:52:21 +01:00
pci.c pci-v5.17-changes 2022-01-16 08:08:11 +02:00
pci.h pci-v5.16-changes 2021-11-06 14:36:12 -07:00
probe.c pci-v5.17-changes 2022-01-16 08:08:11 +02:00
proc.c proc: remove PDE_DATA() completely 2022-01-22 08:33:37 +02:00
quirks.c pci-v5.17-changes 2022-01-16 08:08:11 +02:00
remove.c PCI: Remove reset_fn field from pci_dev 2021-08-17 17:44:38 -05:00
rom.c PCI: Prefer 'unsigned int' over bare 'unsigned' 2021-10-27 13:41:22 -05:00
search.c
setup-bus.c PCI: Prefer 'unsigned int' over bare 'unsigned' 2021-10-27 13:41:22 -05:00
setup-irq.c PCI: Tidy comments 2021-09-28 13:43:17 -05:00
setup-res.c PCI: Work around Intel I210 ROM BAR overlap defect 2022-01-11 09:33:10 -06:00
slot.c PCI/sysfs: Use default_groups in kobj_type for slot attrs 2021-12-29 13:42:04 -06:00
syscall.c
vc.c
vpd.c PCI/VPD: Use pci_read_vpd_any() in pci_vpd_size() 2021-10-25 19:12:23 -05:00
xen-pcifront.c xen/pcifront: Rework MSI handling 2021-12-16 22:22:18 +01:00