Pull pci fix from Bjorn Helgaas: - Previously we ignored PCI devices if the DT "status" property or the ACPI _STA method said it was not present. Per spec, _STA cannot be used for that purpose, and using it that way caused regressions, so skip the _STA check (Rob Herring) * tag 'pci-v6.3-fixes-3' of git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci: PCI: Restrict device disabled status check to DT
Unified · Split
| @@ -16,14 +16,32 @@ · 15 unmodified lines | |||
| 16 | #include "pci.h" | 16 | #include "pci.h" |
| 17 | 17 | ||
| 18 | #ifdef CONFIG_PCI | 18 | #ifdef CONFIG_PCI |
| 19 | void pci_set_of_node(struct pci_dev *dev) | 19 | /** |
| 20 | * pci_set_of_node - Find and set device's DT device_node | ||
| 21 | * @dev: the PCI device structure to fill | ||
| 22 | * | ||
| 23 | * Returns 0 on success with of_node set or when no device is described in the | ||
| 24 | * DT. Returns -ENODEV if the device is present, but disabled in the DT. | ||
| 25 | */ | ||
| 26 | int pci_set_of_node(struct pci_dev *dev) | ||
| 20 | { | 27 | { |
| 28 | struct device_node *node; | ||
| 29 | |||
| 21 | if (!dev->bus->dev.of_node) | 30 | if (!dev->bus->dev.of_node) |
| 22 | return; | 31 | return 0; |
| 23 | dev->dev.of_node = of_pci_find_child_device(dev->bus->dev.of_node, | 32 | |
| 24 | dev->devfn); | 33 | node = of_pci_find_child_device(dev->bus->dev.of_node, dev->devfn); |
| 25 | if (dev->dev.of_node) | 34 | if (!node) |
| 26 | dev->dev.fwnode = &dev->dev.of_node->fwnode; | 35 | return 0; |
| 36 | |||
| 37 | if (!of_device_is_available(node)) { | ||
| 38 | of_node_put(node); | ||
| 39 | return -ENODEV; | ||
| 40 | } | ||
| 41 | |||
| 42 | dev->dev.of_node = node; | ||
| 43 | dev->dev.fwnode = &node->fwnode; | ||
| 44 | return 0; | ||
| 27 | } | 45 | } |
| 28 | 46 | ||
| 29 | void pci_release_of_node(struct pci_dev *dev) | 47 | void pci_release_of_node(struct pci_dev *dev) |
| @@ -624,7 +624,7 @@ int of_pci_get_max_link_speed(struct device_node *node); · 623 unmodified lines | |||
| 624 | u32 of_pci_get_slot_power_limit(struct device_node *node, | 624 | u32 of_pci_get_slot_power_limit(struct device_node *node, |
| 625 | u8 *slot_power_limit_value, | 625 | u8 *slot_power_limit_value, |
| 626 | u8 *slot_power_limit_scale); | 626 | u8 *slot_power_limit_scale); |
| 627 | void pci_set_of_node(struct pci_dev *dev); | 627 | int pci_set_of_node(struct pci_dev *dev); |
| 628 | void pci_release_of_node(struct pci_dev *dev); | 628 | void pci_release_of_node(struct pci_dev *dev); |
| 629 | void pci_set_bus_of_node(struct pci_bus *bus); | 629 | void pci_set_bus_of_node(struct pci_bus *bus); |
| 630 | void pci_release_bus_of_node(struct pci_bus *bus); | 630 | void pci_release_bus_of_node(struct pci_bus *bus); |
| @@ -662,7 +662,7 @@ of_pci_get_slot_power_limit(struct device_node *node, · 31 unmodified lines | |||
| 662 | return 0; | 662 | return 0; |
| 663 | } | 663 | } |
| 664 | 664 | ||
| 665 | static inline void pci_set_of_node(struct pci_dev *dev) { } | 665 | static inline int pci_set_of_node(struct pci_dev *dev) { return 0; } |
| 666 | static inline void pci_release_of_node(struct pci_dev *dev) { } | 666 | static inline void pci_release_of_node(struct pci_dev *dev) { } |
| 667 | static inline void pci_set_bus_of_node(struct pci_bus *bus) { } | 667 | static inline void pci_set_bus_of_node(struct pci_bus *bus) { } |
| 668 | static inline void pci_release_bus_of_node(struct pci_bus *bus) { } | 668 | static inline void pci_release_bus_of_node(struct pci_bus *bus) { } |
| @@ -1826,7 +1826,7 @@ int pci_setup_device(struct pci_dev *dev) · 1825 unmodified lines | |||
| 1826 | u32 class; | 1826 | u32 class; |
| 1827 | u16 cmd; | 1827 | u16 cmd; |
| 1828 | u8 hdr_type; | 1828 | u8 hdr_type; |
| 1829 | int pos = 0; | 1829 | int err, pos = 0; |
| 1830 | struct pci_bus_region region; | 1830 | struct pci_bus_region region; |
| 1831 | struct resource *res; | 1831 | struct resource *res; |
| 1832 | 1832 | ||
| @@ -1840,10 +1840,10 @@ int pci_setup_device(struct pci_dev *dev) · 7 unmodified lines | |||
| 1840 | dev->error_state = pci_channel_io_normal; | 1840 | dev->error_state = pci_channel_io_normal; |
| 1841 | set_pcie_port_type(dev); | 1841 | set_pcie_port_type(dev); |
| 1842 | 1842 | ||
| 1843 | pci_set_of_node(dev); | 1843 | err = pci_set_of_node(dev); |
| 1844 | if (err) | ||
| 1845 | return err; | ||
| 1844 | pci_set_acpi_fwnode(dev); | 1846 | pci_set_acpi_fwnode(dev); |
| 1845 | if (dev->dev.fwnode && !fwnode_device_is_available(dev->dev.fwnode)) | ||
| 1846 | return -ENODEV; | ||
| 1847 | 1847 | ||
| 1848 | pci_dev_assign_slot(dev); | 1848 | pci_dev_assign_slot(dev); |
| 1849 | 1849 | ||