diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c index 0bdf9b8..0cf4ccf 100644 --- a/drivers/pnp/quirks.c +++ b/drivers/pnp/quirks.c @@ -230,7 +230,8 @@ static void quirk_ad1815_mpu_resources(struct pnp_dev *dev) static void quirk_system_pci_resources(struct pnp_dev *dev) { struct pci_dev *pdev = NULL; - struct resource *res; + struct resource *pci_res; + struct resource *pnp_res; resource_size_t pnp_start, pnp_end, pci_start, pci_end; int i, j; @@ -247,20 +248,27 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) { unsigned int type; - type = pci_resource_flags(pdev, i) & - (IORESOURCE_IO | IORESOURCE_MEM); - if (!type || pci_resource_len(pdev, i) == 0) + pci_res = &pdev->resource[i]; + + /* skip unregistered resources */ + if (!pci_res->parent) + continue; + + type = pci_res->flags & + (IORESOURCE_IO | IORESOURCE_MEM); + if (!type) continue; - pci_start = pci_resource_start(pdev, i); - pci_end = pci_resource_end(pdev, i); + pci_start = pci_res->start; + pci_end = pci_res->end; + for (j = 0; - (res = pnp_get_resource(dev, type, j)); j++) { - if (res->start == 0 && res->end == 0) - continue; + (pnp_res = pnp_get_resource(dev, type, j)); j++) { + pnp_start = pnp_res->start; + pnp_end = pnp_res->end; - pnp_start = res->start; - pnp_end = res->end; + if (pnp_end < pnp_start || !pnp_end) + continue; /* * If the PNP region doesn't overlap the PCI @@ -288,13 +296,13 @@ static void quirk_system_pci_resources(struct pnp_dev *dev) dev_warn(&dev->dev, "%s resource " "(0x%llx-0x%llx) overlaps %s BAR %d " "(0x%llx-0x%llx), disabling\n", - pnp_resource_type_name(res), + pnp_resource_type_name(pnp_res), (unsigned long long) pnp_start, (unsigned long long) pnp_end, pci_name(pdev), i, (unsigned long long) pci_start, (unsigned long long) pci_end); - res->flags |= IORESOURCE_DISABLED; + pnp_res->flags |= IORESOURCE_DISABLED; } } }