• Vladimir Oltean's avatar
    PCI: move OF status = "disabled" detection to dev->match_driver · 1a8c251c
    Vladimir Oltean authored
    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: 6fffbc7a ("PCI: Honor firmware's device disabled status")
    Link: https://lore.kernel.org/netdev/CAL_JsqLsVYiPLx2kcHkDQ4t=hQVCR7NHziDwi9cCFUFhx48Qow@mail.gmail.com/Suggested-by: default avatarRob Herring <robh@kernel.org>
    Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1a8c251c
of.c 19.3 KB