git://ftp.safe.ca
/
safe
/
jmp
/
linux-2.6
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
net: ipx: use seq_list_foo() helpers
[safe/jmp/linux-2.6]
/
drivers
/
pci
/
bus.c
diff --git
a/drivers/pci/bus.c
b/drivers/pci/bus.c
index
52b54f0
..
cef28a7
100644
(file)
--- a/
drivers/pci/bus.c
+++ b/
drivers/pci/bus.c
@@
-41,9
+41,14
@@
pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
void *alignf_data)
{
int i, ret = -ENOMEM;
void *alignf_data)
{
int i, ret = -ENOMEM;
+ resource_size_t max = -1;
type_mask |= IORESOURCE_IO | IORESOURCE_MEM;
type_mask |= IORESOURCE_IO | IORESOURCE_MEM;
+ /* don't allocate too high if the pref mem doesn't support 64bit*/
+ if (!(res->flags & IORESOURCE_MEM_64))
+ max = PCIBIOS_MAX_MEM_32;
+
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
struct resource *r = bus->resource[i];
if (!r)
for (i = 0; i < PCI_BUS_NUM_RESOURCES; i++) {
struct resource *r = bus->resource[i];
if (!r)
@@
-62,7
+67,7
@@
pci_bus_alloc_resource(struct pci_bus *bus, struct resource *res,
/* Ok, try it out.. */
ret = allocate_resource(r, res, size,
r->start ? : min,
/* Ok, try it out.. */
ret = allocate_resource(r, res, size,
r->start ? : min,
-
-1
, align,
+
max
, align,
alignf, alignf_data);
if (ret == 0)
break;
alignf, alignf_data);
if (ret == 0)
break;
@@
-133,7
+138,7
@@
int pci_bus_add_child(struct pci_bus *bus)
*
* Call hotplug for each new devices.
*/
*
* Call hotplug for each new devices.
*/
-void pci_bus_add_devices(struct pci_bus *bus)
+void pci_bus_add_devices(
const
struct pci_bus *bus)
{
struct pci_dev *dev;
struct pci_bus *child;
{
struct pci_dev *dev;
struct pci_bus *child;
@@
-184,8
+189,10
@@
void pci_enable_bridges(struct pci_bus *bus)
list_for_each_entry(dev, &bus->devices, bus_list) {
if (dev->subordinate) {
list_for_each_entry(dev, &bus->devices, bus_list) {
if (dev->subordinate) {
- retval = pci_enable_device(dev);
- pci_set_master(dev);
+ if (!pci_is_enabled(dev)) {
+ retval = pci_enable_device(dev);
+ pci_set_master(dev);
+ }
pci_enable_bridges(dev->subordinate);
}
}
pci_enable_bridges(dev->subordinate);
}
}
@@
-199,13
+206,18
@@
void pci_enable_bridges(struct pci_bus *bus)
* Walk the given bus, including any bridged devices
* on buses under this bus. Call the provided callback
* on each device found.
* Walk the given bus, including any bridged devices
* on buses under this bus. Call the provided callback
* on each device found.
+ *
+ * We check the return of @cb each time. If it returns anything
+ * other than 0, we break out.
+ *
*/
*/
-void pci_walk_bus(struct pci_bus *top,
void
(*cb)(struct pci_dev *, void *),
+void pci_walk_bus(struct pci_bus *top,
int
(*cb)(struct pci_dev *, void *),
void *userdata)
{
struct pci_dev *dev;
struct pci_bus *bus;
struct list_head *next;
void *userdata)
{
struct pci_dev *dev;
struct pci_bus *bus;
struct list_head *next;
+ int retval;
bus = top;
down_read(&pci_bus_sem);
bus = top;
down_read(&pci_bus_sem);
@@
-229,8
+241,10
@@
void pci_walk_bus(struct pci_bus *top, void (*cb)(struct pci_dev *, void *),
/* Run device routines with the device locked */
down(&dev->dev.sem);
/* Run device routines with the device locked */
down(&dev->dev.sem);
- cb(dev, userdata);
+
retval =
cb(dev, userdata);
up(&dev->dev.sem);
up(&dev->dev.sem);
+ if (retval)
+ break;
}
up_read(&pci_bus_sem);
}
}
up_read(&pci_bus_sem);
}