Commit c519a5a7 authored by Bjorn Helgaas's avatar Bjorn Helgaas Committed by Jesse Barnes

PCI: complain about devices that seem to be broken

If we can tell that a device isn't working correctly, we should tell
the user to make debugging easier.  Otherwise, it can take a lot of
work to determine whether the problem is in the driver, PCMCIA, PCI,
hardware, etc., as in http://bugzilla.kernel.org/show_bug.cgi?id=12006Signed-off-by: default avatarBjorn Helgaas <bjorn.helgaas@hp.com>
Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
parent e1944c6b
...@@ -174,14 +174,19 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, ...@@ -174,14 +174,19 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
pci_read_config_dword(dev, pos, &sz); pci_read_config_dword(dev, pos, &sz);
pci_write_config_dword(dev, pos, l); pci_write_config_dword(dev, pos, l);
if (!sz)
goto fail; /* BAR not implemented */
/* /*
* All bits set in sz means the device isn't working properly. * All bits set in sz means the device isn't working properly.
* If the BAR isn't implemented, all bits must be 0. If it's a * If it's a memory BAR or a ROM, bit 0 must be clear; if it's
* memory BAR or a ROM, bit 0 must be clear; if it's an io BAR, bit * an io BAR, bit 1 must be clear.
* 1 must be clear.
*/ */
if (!sz || sz == 0xffffffff) if (sz == 0xffffffff) {
dev_err(&dev->dev, "reg %x: invalid size %#x; broken device?\n",
pos, sz);
goto fail; goto fail;
}
/* /*
* I don't know how l can have all bits set. Copied from old code. * I don't know how l can have all bits set. Copied from old code.
...@@ -244,13 +249,17 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, ...@@ -244,13 +249,17 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type,
pos, res); pos, res);
} }
} else { } else {
sz = pci_size(l, sz, mask); u32 size = pci_size(l, sz, mask);
if (!sz) if (!size) {
dev_err(&dev->dev, "reg %x: invalid size "
"(l %#x sz %#x mask %#x); broken device?",
pos, l, sz, mask);
goto fail; goto fail;
}
res->start = l; res->start = l;
res->end = l + sz; res->end = l + size;
dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res); dev_printk(KERN_DEBUG, &dev->dev, "reg %x: %pR\n", pos, res);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment