PCI hotplug: acpiphp: remove superfluous _HPP/_HPX evaluation
[safe/jmp/linux-2.6] / drivers / pci / probe.c
index 40e75f6..8105e32 100644 (file)
@@ -235,7 +235,10 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                        res->start = l64;
                        res->end = l64 + sz64;
                        dev_printk(KERN_DEBUG, &dev->dev,
-                               "reg %x 64bit mmio: %pR\n", pos, res);
+                               "reg %x %s: %pR\n", pos,
+                                (res->flags & IORESOURCE_PREFETCH) ?
+                                       "64bit mmio pref" : "64bit mmio",
+                                res);
                }
 
                res->flags |= IORESOURCE_MEM_64;
@@ -249,7 +252,9 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
                res->end = l + sz;
 
                dev_printk(KERN_DEBUG, &dev->dev, "reg %x %s: %pR\n", pos,
-                       (res->flags & IORESOURCE_IO) ? "io port" : "32bit mmio",
+                       (res->flags & IORESOURCE_IO) ? "io port" :
+                        ((res->flags & IORESOURCE_PREFETCH) ?
+                                "32bit mmio pref" : "32bit mmio"),
                        res);
        }
 
@@ -692,6 +697,23 @@ static void set_pcie_port_type(struct pci_dev *pdev)
        pdev->pcie_type = (reg16 & PCI_EXP_FLAGS_TYPE) >> 4;
 }
 
+static void set_pcie_hotplug_bridge(struct pci_dev *pdev)
+{
+       int pos;
+       u16 reg16;
+       u32 reg32;
+
+       pos = pci_find_capability(pdev, PCI_CAP_ID_EXP);
+       if (!pos)
+               return;
+       pci_read_config_word(pdev, pos + PCI_EXP_FLAGS, &reg16);
+       if (!(reg16 & PCI_EXP_FLAGS_SLOT))
+               return;
+       pci_read_config_dword(pdev, pos + PCI_EXP_SLTCAP, &reg32);
+       if (reg32 & PCI_EXP_SLTCAP_HPC)
+               pdev->is_hotplug_bridge = 1;
+}
+
 #define LEGACY_IO_RESOURCE     (IORESOURCE_IO | IORESOURCE_PCI_FIXED)
 
 /**
@@ -799,6 +821,7 @@ int pci_setup_device(struct pci_dev *dev)
                pci_read_irq(dev);
                dev->transparent = ((dev->class & 0xff) == 1);
                pci_read_bases(dev, 2, PCI_ROM_ADDRESS1);
+               set_pcie_hotplug_bridge(dev);
                break;
 
        case PCI_HEADER_TYPE_CARDBUS:               /* CardBus bridge header */
@@ -1009,6 +1032,9 @@ void pci_device_add(struct pci_dev *dev, struct pci_bus *bus)
        /* Fix up broken headers */
        pci_fixup_device(pci_fixup_header, dev);
 
+       /* Clear the state_saved flag. */
+       dev->state_saved = false;
+
        /* Initialize various capabilities */
        pci_init_capabilities(dev);
 
@@ -1061,8 +1087,7 @@ int pci_scan_slot(struct pci_bus *bus, int devfn)
        if (dev && !dev->is_added)      /* new device? */
                nr++;
 
-       if ((dev && dev->multifunction) ||
-           (!dev && pcibios_scan_all_fns(bus, devfn))) {
+       if (dev && dev->multifunction) {
                for (fn = 1; fn < 8; fn++) {
                        dev = pci_scan_single_device(bus, devfn + fn);
                        if (dev) {