diff options
-rw-r--r-- | arch/i386/pci/common.c | 32 | ||||
-rw-r--r-- | drivers/pci/probe.c | 4 |
2 files changed, 35 insertions, 1 deletions
diff --git a/arch/i386/pci/common.c b/arch/i386/pci/common.c index f6bc48da4d2a..dbece776c5b2 100644 --- a/arch/i386/pci/common.c +++ b/arch/i386/pci/common.c | |||
@@ -8,6 +8,7 @@ | |||
8 | #include <linux/pci.h> | 8 | #include <linux/pci.h> |
9 | #include <linux/ioport.h> | 9 | #include <linux/ioport.h> |
10 | #include <linux/init.h> | 10 | #include <linux/init.h> |
11 | #include <linux/dmi.h> | ||
11 | 12 | ||
12 | #include <asm/acpi.h> | 13 | #include <asm/acpi.h> |
13 | #include <asm/segment.h> | 14 | #include <asm/segment.h> |
@@ -120,11 +121,42 @@ void __devinit pcibios_fixup_bus(struct pci_bus *b) | |||
120 | pci_read_bridge_bases(b); | 121 | pci_read_bridge_bases(b); |
121 | } | 122 | } |
122 | 123 | ||
124 | /* | ||
125 | * Enable renumbering of PCI bus# ranges to reach all PCI busses (Cardbus) | ||
126 | */ | ||
127 | #ifdef __i386__ | ||
128 | static int __devinit assign_all_busses(struct dmi_system_id *d) | ||
129 | { | ||
130 | pci_probe |= PCI_ASSIGN_ALL_BUSSES; | ||
131 | printk(KERN_INFO "%s detected: enabling PCI bus# renumbering" | ||
132 | " (pci=assign-busses)\n", d->ident); | ||
133 | return 0; | ||
134 | } | ||
135 | #endif | ||
136 | |||
137 | /* | ||
138 | * Laptops which need pci=assign-busses to see Cardbus cards | ||
139 | */ | ||
140 | static struct dmi_system_id __devinitdata pciprobe_dmi_table[] = { | ||
141 | #ifdef __i386__ | ||
142 | { | ||
143 | .callback = assign_all_busses, | ||
144 | .ident = "Samsung X20 Laptop", | ||
145 | .matches = { | ||
146 | DMI_MATCH(DMI_SYS_VENDOR, "Samsung Electronics"), | ||
147 | DMI_MATCH(DMI_PRODUCT_NAME, "SX20S"), | ||
148 | }, | ||
149 | }, | ||
150 | #endif /* __i386__ */ | ||
151 | {} | ||
152 | }; | ||
123 | 153 | ||
124 | struct pci_bus * __devinit pcibios_scan_root(int busnum) | 154 | struct pci_bus * __devinit pcibios_scan_root(int busnum) |
125 | { | 155 | { |
126 | struct pci_bus *bus = NULL; | 156 | struct pci_bus *bus = NULL; |
127 | 157 | ||
158 | dmi_check_system(pciprobe_dmi_table); | ||
159 | |||
128 | while ((bus = pci_find_next_bus(bus)) != NULL) { | 160 | while ((bus = pci_find_next_bus(bus)) != NULL) { |
129 | if (bus->number == busnum) { | 161 | if (bus->number == busnum) { |
130 | /* Already scanned */ | 162 | /* Already scanned */ |
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 542e7dfb371b..e3dc3063e05b 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -589,13 +589,15 @@ int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max | |||
589 | (child->number > bus->subordinate) || | 589 | (child->number > bus->subordinate) || |
590 | (child->number < bus->number) || | 590 | (child->number < bus->number) || |
591 | (child->subordinate < bus->number)) { | 591 | (child->subordinate < bus->number)) { |
592 | printk(KERN_WARNING "PCI: Bus #%02x (-#%02x) may be " | 592 | printk(KERN_WARNING "PCI: Bus #%02x (-#%02x) is " |
593 | "hidden behind%s bridge #%02x (-#%02x)%s\n", | 593 | "hidden behind%s bridge #%02x (-#%02x)%s\n", |
594 | child->number, child->subordinate, | 594 | child->number, child->subordinate, |
595 | bus->self->transparent ? " transparent" : " ", | 595 | bus->self->transparent ? " transparent" : " ", |
596 | bus->number, bus->subordinate, | 596 | bus->number, bus->subordinate, |
597 | pcibios_assign_all_busses() ? " " : | 597 | pcibios_assign_all_busses() ? " " : |
598 | " (try 'pci=assign-busses')"); | 598 | " (try 'pci=assign-busses')"); |
599 | printk(KERN_WARNING "Please report the result to " | ||
600 | "linux-kernel to fix this permanently\n"); | ||
599 | } | 601 | } |
600 | bus = bus->parent; | 602 | bus = bus->parent; |
601 | } | 603 | } |