I'm running into a problem when resources are read.
The amd8111 adds two subtractive resources on link 0. The problem is that it has no link 0.
static void amd8111_lpc_read_resources(struct device * dev) { struct resource *res;
printk(BIOS_DEBUG,"%s calls read_resources with %s bus %s \n", __func__, dev->dtsname, dev->bus? dev->bus->dev->dtsname: "NULL"); /* Get the normal pci resources of this device */ pci_dev_read_resources(dev);
/* Add an extra subtractive resource for both memory and I/O */ res = new_resource(dev, IOINDEX_SUBTRACTIVE(0, 0)); res->flags = IORESOURCE_IO | IORESOURCE_SUBTRACTIVE | IORESOURCE_ASSIGNED;
res = new_resource(dev, IOINDEX_SUBTRACTIVE(1, 0)); res->flags = IORESOURCE_MEM | IORESOURCE_SUBTRACTIVE | IORESOURCE_ASSIGNED; printk(BIOS_DEBUG,"%s after read_resources\n", __func__); }
Either of these changes fix it, but I'd like a little more understanding of why we're trying to do this.
I like the first change better because it quits trying sooner.
Index: device/device.c =================================================================== --- device/device.c (revision 984) +++ device/device.c (working copy) @@ -311,7 +311,7 @@
/* Read in subtractive resources behind the current device. */ links = 0; - for (i = 0; i < curdev->resources; i++) { + for (i = 0; i < curdev->resources && curdev->links>0; i++) { struct resource *resource; unsigned int link; resource = &curdev->resource[i]; @@ -326,7 +326,8 @@ } if (!(links & (1 << link))) { links |= (1 << link); - read_resources(&curdev->link[link]); + if (curdev->link[link].dev) + read_resources(&curdev->link[link]); } } }
Signed-off-by: Myles Watson mylesgw@gmail.com
Thanks, Myles