linux/drivers/pci
Vladimir Oltean 1a8c251cff PCI: move OF status = "disabled" detection to dev->match_driver
The blamed commit has broken probing on
arch/arm64/boot/dts/freescale/fsl-ls1028a.dtsi when &enetc_port0
(PCI function 0) has status = "disabled".

Background: pci_scan_slot() has logic to say that if the function 0 of a
device is absent, the entire device is absent and we can skip the other
functions entirely. Traditionally, this has meant that
pci_bus_read_dev_vendor_id() returns an error code for that function.

However, since the blamed commit, there is an extra confounding
condition: function 0 of the device exists and has a valid vendor id,
but it is disabled in the device tree. In that case, pci_scan_slot()
would incorrectly skip the entire device instead of just that function.

In the case of NXP LS1028A, status = "disabled" does not mean that the
PCI function's config space is not available for reading. It is, but the
Ethernet port is just not functionally useful with a particular SerDes
protocol configuration (0x9999) due to pinmuxing constraints of the Soc.
So, pci_scan_slot() skips all other functions on the ENETC ECAM
(enetc_port1, enetc_port2, enetc_mdio_pf3 etc) when just enetc_port0 had
to not be probed.

There is an additional regression introduced by the change, caused by
its fundamental premise. The enetc driver needs to run code for all PCI
functions, regardless of whether they're enabled or not in the device
tree. That is no longer possible if the driver's probe function is no
longer called. But Rob recommends that we move the of_device_is_available()
detection to dev->match_driver, and this makes the PCI fixups still run
on all functions, while just probing drivers for those functions that
are enabled. So, a separate change in the enetc driver will have to move
the workarounds to a PCI fixup.

Fixes: 6fffbc7ae1 ("PCI: Honor firmware's device disabled status")
Link: https://lore.kernel.org/netdev/CAL_JsqLsVYiPLx2kcHkDQ4t=hQVCR7NHziDwi9cCFUFhx48Qow@mail.gmail.com/
Suggested-by: Rob Herring <robh@kernel.org>
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
2023-08-09 09:18:30 +01:00
..
controller dmaengine updates for v6.5 2023-07-06 09:48:31 -07:00
endpoint Fixes for pci_clean_master, error handling in driver inits, and various 2023-07-09 09:35:51 -07:00
hotplug Merge branch 'pci/hotplug' 2023-06-26 12:59:56 -05:00
msi PCI/MSI: Remove over-zealous hardware size check in pci_msix_validate_entries() 2023-04-16 14:11:51 +02:00
pcie Merge branch 'pci/enumeration' 2023-06-26 12:59:56 -05:00
switch driver core: class: remove module * from class_create() 2023-03-17 15:16:33 +01:00
access.c PCI: Access Link 2 registers only for devices with Links 2022-11-04 10:38:11 -05:00
ats.c PCI: Enable PASID only when ACS RR & UF enabled on upstream path 2022-11-03 15:47:47 +01:00
bus.c PCI: move OF status = "disabled" detection to dev->match_driver 2023-08-09 09:18:30 +01:00
doe.c PCI/DOE: Relax restrictions on request and response size 2023-04-18 10:36:58 -07:00
ecam.c
host-bridge.c
iov.c PCI/IOV: Enlarge virtfn sysfs name buffer 2023-01-18 10:54:41 -06:00
irq.c PCI: Check for alloc failure in pci_request_irq() 2022-11-21 16:55:18 -06:00
Kconfig scatterlist: add dedicated config for DMA flags 2023-06-19 16:19:22 -07:00
Makefile PCI/DOE: Add DOE mailbox support functions 2022-07-19 15:38:04 -07:00
mmap.c PCI: Remove pci_mmap_page_range() wrapper 2022-07-29 12:08:44 -05:00
of.c PCI: move OF status = "disabled" detection to dev->match_driver 2023-08-09 09:18:30 +01:00
p2pdma.c PCI/P2PDMA: Fix pci_p2pmem_find_many() kernel-doc 2023-04-06 16:37:51 -05:00
pci-acpi.c PCI/ACPI: Call _REG when transitioning D-states 2023-06-23 12:28:08 -05:00
pci-bridge-emul.c PCI: pci-bridge-emul: Set position of PCI capabilities to real HW value 2022-08-25 12:07:56 +02:00
pci-bridge-emul.h PCI: pci-bridge-emul: Set position of PCI capabilities to real HW value 2022-08-25 12:07:56 +02:00
pci-driver.c PCI/PM: Drop pci_bridge_wait_for_secondary_bus() timeout parameter 2023-04-11 17:35:06 -05:00
pci-label.c
pci-mid.c
pci-pf-stub.c
pci-stub.c
pci-sysfs.c driver core: bus: mark the struct bus_type for sysfs callbacks as constant 2023-03-23 13:20:40 +01:00
pci.c Merge branch 'pci/pm' 2023-06-26 12:59:56 -05:00
pci.h Merge branch 'pci/pm' 2023-06-26 12:59:56 -05:00
probe.c Merge branch 'pci/resource' 2023-06-26 12:59:57 -05:00
proc.c PCI: Remove pci_mmap_page_range() wrapper 2022-07-29 12:08:44 -05:00
quirks.c pci-v6.5-changes 2023-06-30 15:06:45 -07:00
remove.c cxl for v6.4 2023-04-30 11:51:51 -07:00
rom.c
search.c
setup-bus.c PCI: Make pci_bus_for_each_resource() index optional 2023-04-05 15:10:09 -05:00
setup-irq.c
setup-res.c PCI: Introduce pci_dev_for_each_resource() 2023-04-04 10:43:52 -05:00
slot.c PCI/sysfs: Constify struct kobj_type pci_slot_ktype 2023-02-16 12:00:25 -06:00
syscall.c
vc.c
vgaarb.c PCI: Introduce pci_dev_for_each_resource() 2023-04-04 10:43:52 -05:00
vpd.c
xen-pcifront.c PCI: Introduce pci_dev_for_each_resource() 2023-04-04 10:43:52 -05:00