[PATCH] Re: regression, 2.6.26-rc7, pnp: quirk_system_pci_resources()

From: Rene Herman
Date: Sat Jun 21 2008 - 13:07:54 EST


On 21-06-08 04:12, Rene Herman wrote:

I have been running with pnpacpi=off due to testing ISAPnP/PnPBIOS but when testing some other ACPI related problem tonight I removed that and found that unfortunately something seems to have regressed. My soundcard driver (snd-es1968) won't load anymore on current mainline:

===
ACPI: PCI Interrupt 0000:00:0a.0[A] -> Link [LNKC] -> GSI 10 (level, low) -> IRQ 10
PCI: Unable to reserve I/O region #1:100@de00 for device 0000:00:0a.0
ACPI: PCI interrupt for device 0000:00:0a.0 disabled
ES1968 (ESS Maestro): probe of 0000:00:0a.0 failed with error -16
===

00:01 (PNP0c02) is keeping its I/O region occupied:

===
# cat /sys/bus/pnp/devices/00\:01/resources
state = active
io 0xde00-0xde03
===

Sound used to work back when I wasn't yet booting with pnpacpi=off but I don't quite recall when I started doing that nor have I looked yet at why quirk_system_pci_resources() isn't doing its job. I'll investigate if you need me to but thought I'd first throw a heap of information your way and hope you'll have a patch for me when I wake up :-/

Well, why the quirk wasn't helping is fairly obvious -- but given that I definitely didn't need anything like this on .25 I wonder why PnPACPI is all of a sudden claiming those 4 ports in the first place.

As in, this works for me and might not be bogus due to the symmetry and all but still needs some head scratching. In any case, I do definitely need something for .26...

I'll go recompile .25 onto here and see if's just my BIOS being funny or something to do with the kernel.

Signed-off-by: Rene Herman <rene.herman@xxxxxxxxx>

Rene. diff --git a/drivers/pnp/quirks.c b/drivers/pnp/quirks.c
index 55f55ed..bbca54f 100644
--- a/drivers/pnp/quirks.c
+++ b/drivers/pnp/quirks.c
@@ -245,15 +245,17 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)
*/
for_each_pci_dev(pdev) {
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
- if (!(pci_resource_flags(pdev, i) & IORESOURCE_MEM) ||
- pci_resource_len(pdev, i) == 0)
+ unsigned int type;
+
+ type = pci_resource_flags(pdev, i) &
+ (IORESOURCE_IO | IORESOURCE_MEM);
+ if (!type || pci_resource_len(pdev, i) == 0)
continue;

pci_start = pci_resource_start(pdev, i);
pci_end = pci_resource_end(pdev, i);
for (j = 0;
- (res = pnp_get_resource(dev, IORESOURCE_MEM, j));
- j++) {
+ (res = pnp_get_resource(dev, type, j)); j++) {
if (res->start == 0 && res->end == 0)
continue;

@@ -283,9 +285,10 @@ static void quirk_system_pci_resources(struct pnp_dev *dev)
* the PCI region, and that might prevent a PCI
* driver from requesting its resources.
*/
- dev_warn(&dev->dev, "mem resource "
+ dev_warn(&dev->dev, "%s resource "
"(0x%llx-0x%llx) overlaps %s BAR %d "
"(0x%llx-0x%llx), disabling\n",
+ type & IORESOURCE_IO ? "port" : "mem",
(unsigned long long) pnp_start,
(unsigned long long) pnp_end,
pci_name(pdev), i,