Re: [patch] pci: revert "PCI: remove transparent bridge sizing"

From: Gary Hade
Date: Wed Mar 26 2008 - 16:30:35 EST


On Wed, Mar 26, 2008 at 11:33:24AM -0700, Linus Torvalds wrote:
>
>
> On Wed, 26 Mar 2008, Gary Hade wrote:
> >
> > I have a fix for the ThinkPad docking Oops but if the issue being
> > discussed here is caused by the transparent bridge sizing removal
> > change I totally agree that it should be reverted.
>
> Ok, I reverted it, but the docking Oops is still interesting, in that it
> implies that some piece of code wasn't exactly robust. I haven't seen the
> patch, but it sounds like that should be fixed independently..

Could be but without the sizing removal I doubt that the fix I
was going to propose (see below) would be the same. What I had
found is that the removal of the transparent bridge sizing was
leaving the resource record for at least region 7 (IO) of a
hot-added transparent bridge on the docking station in a state
that was not palatable with later executed code in pdev_sort_resource().
Even though the restoration of the transparent bridge sizing
corrects the problem, pdev_sort_resource() could probably use
some bulletproofing. I will take a look at this.

Thanks,
Gary

--
Gary Hade
System x Enablement
IBM Linux Technology Center
503-578-4503 IBM T/L: 775-4503
garyhade@xxxxxxxxxx
http://www.ibm.com/linux/ltc


--- linux-2.6.25-rc6/drivers/pci/probe.c.orig 2008-03-20 12:09:14.000000000 -0700
+++ linux-2.6.25-rc6/drivers/pci/probe.c 2008-03-20 12:11:29.000000000 -0700
@@ -328,6 +328,8 @@ void __devinit pci_read_bridge_bases(str
if (!res->end)
res->end = limit + 0xfff;
}
+ if (!res->start && dev->transparent)
+ res->flags = 0;

res = child->resource[1];
pci_read_config_word(dev, PCI_MEMORY_BASE, &mem_base_lo);
@@ -339,6 +341,8 @@ void __devinit pci_read_bridge_bases(str
res->start = base;
res->end = limit + 0xfffff;
}
+ if (!res->start && dev->transparent)
+ res->flags = 0;

res = child->resource[2];
pci_read_config_word(dev, PCI_PREF_MEMORY_BASE, &mem_base_lo);
@@ -373,6 +377,8 @@ void __devinit pci_read_bridge_bases(str
res->start = base;
res->end = limit + 0xfffff;
}
+ if (!res->start && dev->transparent)
+ res->flags = 0;
}

static struct pci_bus * pci_alloc_bus(void)
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/