| From stable-bounces@linux.kernel.org Wed Nov 28 16:21:49 2007 |
| From: Zhao Yakui <yakui.zhao@intel.com> |
| Date: Wed, 28 Nov 2007 16:21:21 -0800 |
| Subject: PNP: increase the maximum number of resources |
| To: torvalds@linux-foundation.org |
| Cc: trenn@suse.de, yakui.zhao@intel.com, shaohua.li@intel.com, akpm@linux-foundation.org, stable@kernel.org, bjorn.helgaas@hp.com |
| Message-ID: <200711290021.lAT0LM7A026611@imap1.linux-foundation.org> |
| |
| |
| From: Zhao Yakui <yakui.zhao@intel.com> |
| |
| patch a7839e960675b549f06209d18283d5cee2ce9261 in mainline. |
| |
| On some systems the number of resources(IO,MEM) returnedy by PNP device is |
| greater than the PNP constant, for example motherboard devices. It brings |
| that some resources can't be reserved and resource confilicts. This will |
| cause PCI resources are assigned wrongly in some systems, and cause hang. |
| This is a regression since we deleted ACPI motherboard driver and use PNP |
| system driver. |
| |
| [akpm@linux-foundation.org: fix text and coding-style a bit] |
| Signed-off-by: Li Shaohua <shaohua.li@intel.com> |
| Signed-off-by: Zhao Yakui <yakui.zhao@intel.com> |
| Cc: Bjorn Helgaas <bjorn.helgaas@hp.com> |
| Cc: Thomas Renninger <trenn@suse.de> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/pnp/pnpacpi/rsparser.c | 15 +++++++++++++-- |
| include/linux/pnp.h | 4 ++-- |
| 2 files changed, 15 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/pnp/pnpacpi/rsparser.c |
| +++ b/drivers/pnp/pnpacpi/rsparser.c |
| @@ -82,9 +82,11 @@ static void pnpacpi_parse_allocated_irqr |
| while (!(res->irq_resource[i].flags & IORESOURCE_UNSET) && |
| i < PNP_MAX_IRQ) |
| i++; |
| - if (i >= PNP_MAX_IRQ) |
| + if (i >= PNP_MAX_IRQ) { |
| + printk(KERN_ERR "pnpacpi: exceeded the max number of IRQ " |
| + "resources: %d \n", PNP_MAX_IRQ); |
| return; |
| - |
| + } |
| res->irq_resource[i].flags = IORESOURCE_IRQ; // Also clears _UNSET flag |
| res->irq_resource[i].flags |= irq_flags(triggering, polarity); |
| irq = acpi_register_gsi(gsi, triggering, polarity); |
| @@ -163,6 +165,9 @@ static void pnpacpi_parse_allocated_dmar |
| } |
| res->dma_resource[i].start = dma; |
| res->dma_resource[i].end = dma; |
| + } else { |
| + printk(KERN_ERR "pnpacpi: exceeded the max number of DMA " |
| + "resources: %d \n", PNP_MAX_DMA); |
| } |
| } |
| |
| @@ -184,6 +189,9 @@ static void pnpacpi_parse_allocated_iore |
| } |
| res->port_resource[i].start = io; |
| res->port_resource[i].end = io + len - 1; |
| + } else { |
| + printk(KERN_ERR "pnpacpi: exceeded the max number of IO " |
| + "resources: %d \n", PNP_MAX_PORT); |
| } |
| } |
| |
| @@ -207,6 +215,9 @@ static void pnpacpi_parse_allocated_memr |
| |
| res->mem_resource[i].start = mem; |
| res->mem_resource[i].end = mem + len - 1; |
| + } else { |
| + printk(KERN_ERR "pnpacpi: exceeded the max number of mem " |
| + "resources: %d\n", PNP_MAX_MEM); |
| } |
| } |
| |
| --- a/include/linux/pnp.h |
| +++ b/include/linux/pnp.h |
| @@ -13,8 +13,8 @@ |
| #include <linux/errno.h> |
| #include <linux/mod_devicetable.h> |
| |
| -#define PNP_MAX_PORT 8 |
| -#define PNP_MAX_MEM 4 |
| +#define PNP_MAX_PORT 24 |
| +#define PNP_MAX_MEM 12 |
| #define PNP_MAX_IRQ 2 |
| #define PNP_MAX_DMA 2 |
| #define PNP_NAME_LEN 50 |