On Sun, Aug 31, 2008 at 11:03 AM, Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> wrote: > > > On Sun, 31 Aug 2008, Yinghai Lu wrote: >> >> wonder how the probe could find out the size of is 1fff_ffff.. > > Heh. That's how PCI sizing works: you write all ones to the register, and > read back the result. The low bits won't change, and that indicates the > size. > > But if _none_ of the bits change, then that simply means that the size > will be calculated to be 0xffffffff-start. > > So the sizing will "work", it will just always report that the BAR covers > everything from start to the 4G limit. how about diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index cce2f4c..3b5269a 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -240,6 +240,11 @@ static int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, pci_read_config_dword(dev, pos, &l); pci_write_config_dword(dev, pos, mask); pci_read_config_dword(dev, pos, &sz); + + /* sticky and non changable */ + if (sz == l) + goto fail; + pci_write_config_dword(dev, pos, l); /* Rafael, can you check attach one to see if we still have warning ? YH
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index cce2f4c..3b5269a 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -240,6 +240,11 @@ static int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, pci_read_config_dword(dev, pos, &l); pci_write_config_dword(dev, pos, mask); pci_read_config_dword(dev, pos, &sz); + + /* sticky and non changable */ + if (sz == l) + goto fail; + pci_write_config_dword(dev, pos, l); /*