diff options
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/probe.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 9e7d642e66b0..579a56c8181f 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -847,6 +847,11 @@ int pci_cfg_space_size(struct pci_dev *dev) | |||
847 | { | 847 | { |
848 | int pos; | 848 | int pos; |
849 | u32 status; | 849 | u32 status; |
850 | u16 class; | ||
851 | |||
852 | class = dev->class >> 8; | ||
853 | if (class == PCI_CLASS_BRIDGE_HOST) | ||
854 | return pci_cfg_space_size_ext(dev); | ||
850 | 855 | ||
851 | pos = pci_find_capability(dev, PCI_CAP_ID_EXP); | 856 | pos = pci_find_capability(dev, PCI_CAP_ID_EXP); |
852 | if (!pos) { | 857 | if (!pos) { |
@@ -936,7 +941,6 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn) | |||
936 | dev->multifunction = !!(hdr_type & 0x80); | 941 | dev->multifunction = !!(hdr_type & 0x80); |
937 | dev->vendor = l & 0xffff; | 942 | dev->vendor = l & 0xffff; |
938 | dev->device = (l >> 16) & 0xffff; | 943 | dev->device = (l >> 16) & 0xffff; |
939 | dev->cfg_size = pci_cfg_space_size(dev); | ||
940 | dev->error_state = pci_channel_io_normal; | 944 | dev->error_state = pci_channel_io_normal; |
941 | set_pcie_port_type(dev); | 945 | set_pcie_port_type(dev); |
942 | 946 | ||
@@ -952,6 +956,9 @@ static struct pci_dev *pci_scan_device(struct pci_bus *bus, int devfn) | |||
952 | return NULL; | 956 | return NULL; |
953 | } | 957 | } |
954 | 958 | ||
959 | /* need to have dev->class ready */ | ||
960 | dev->cfg_size = pci_cfg_space_size(dev); | ||
961 | |||
955 | return dev; | 962 | return dev; |
956 | } | 963 | } |
957 | 964 | ||