Re: Regression with commit f9cde5f in 2.6.30-gitX

Jaswinder Singh Rajput
2009-06-24T12:18:31Z

On Tue, 2009-06-23 at 20:33 -0500, Larry Finger wrote:
> My latest pull from Linus's tree fails to boot. Bisection leads to the
> commit entitled "x86/ACPI: Correct maximum allowed _CRS returned
> resources and warn if exceeded" with hash
> f9cde5ffed17bf74f6bef042d99edb0622f58576. I have been unable to
> capture the first error message as it scrolls off the screen, but the
> second hits the WARN_ON at drivers/ata/ahci.c:695 in routine
> ahci_enable_ahci() because HOST_AHCI_EN is not set.
>

This patch fixes boot failure on my AMD 64 laptop, can you please test
this patch:

[PATCH] x86: fix _CRS resources return handling

We need to check for info->res_num and only handle for < PCI_BUS_NUM_RESOURCES

Also set info->bus->resource[info->res_num] for _CRS resources return handling

Fixed boot failure on some machine.

Reported-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: Jaswinder Singh Rajput <jaswinderrajput@gmail.com>
---
arch/x86/pci/acpi.c | 16 ++++++++++------
1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/arch/x86/pci/acpi.c b/arch/x86/pci/acpi.c
index 16c3fda..0bc015f 100644
--- a/arch/x86/pci/acpi.c
+++ b/arch/x86/pci/acpi.c
@@ -69,6 +69,9 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
struct resource *root;
int max_root_bus_resources = PCI_BUS_NUM_RESOURCES;

+ if (info->res_num >= PCI_BUS_NUM_RESOURCES)
+ return AE_OK;
+
status = resource_to_addr(acpi_res, &addr);
if (!ACPI_SUCCESS(status))
return AE_OK;
@@ -94,17 +97,18 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
if (bus_has_transparent_bridge(info->bus))
max_root_bus_resources -= 3;
if (info->res_num >= max_root_bus_resources) {
- printk(KERN_WARNING "PCI: Failed to allocate 0x%lx-0x%lx "
- "from %s for %s due to _CRS returning more than "
- "%d resource descriptors\n", (unsigned long) res->start,
- (unsigned long) res->end, root->name, info->name,
- max_root_bus_resources);
+ pr_warning("PCI: Failed to allocate 0x%lx-0x%lx "
+ "from %s for %s due to _CRS returning more than "
+ "%d resource descriptors\n",
+ (unsigned long)res->start, (unsigned long)res->end,
+ root->name, info->name, max_root_bus_resources);
+ info->bus->resource[info->res_num] = res;
info->res_num++;
return AE_OK;
}

if (insert_resource(root, res)) {
- printk(KERN_ERR "PCI: Failed to allocate 0x%lx-0x%lx "
+ pr_err("PCI: Failed to allocate 0x%lx-0x%lx "
"from %s for %s\n", (unsigned long) res->start,
(unsigned long) res->end, root->name, info->name);
} else {
--
1.6.0.6