diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2014-04-14 23:26:50 +0200 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2014-05-23 18:47:20 +0200 |
commit | 26370fc6647b63eefb85a675382d661d0fed30a1 (patch) | |
tree | ff504a0d7bcca78b3250dc6652ff16ce80e190d1 /drivers/pci/probe.c | |
parent | PCI: Don't set BAR to zero if dma_addr_t is too small (diff) | |
download | linux-26370fc6647b63eefb85a675382d661d0fed30a1.tar.xz linux-26370fc6647b63eefb85a675382d661d0fed30a1.zip |
PCI: Don't print anything while decoding is disabled
If the console is a PCI device, and we try to print to it while its
decoding is disabled, the system will hang. This particular printk hasn't
caused a problem yet, but it could, so this fixes it.
See also 0ff9514b579b ("PCI: Don't print anything while decoding is
disabled").
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/probe.c')
-rw-r--r-- | drivers/pci/probe.c | 10 |
1 files changed, 6 insertions, 4 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index dd710b12d34c..3bc149b848a8 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -174,7 +174,7 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, u64 l64, sz64, mask64; u16 orig_cmd; struct pci_bus_region region, inverted_region; - bool bar_too_big = false, bar_too_high = false; + bool bar_too_big = false, bar_too_high = false, bar_invalid = false; mask = type ? PCI_ROM_ADDRESS_MASK : ~0; @@ -289,11 +289,10 @@ int __pci_read_base(struct pci_dev *dev, enum pci_bar_type type, * be claimed by the device. */ if (inverted_region.start != region.start) { - dev_info(&dev->dev, "reg 0x%x: initial BAR value %pa invalid; forcing reassignment\n", - pos, ®ion.start); res->flags |= IORESOURCE_UNSET; - res->end -= res->start; res->start = 0; + res->end = region.end - region.start; + bar_invalid = true; } goto out; @@ -312,6 +311,9 @@ out: if (bar_too_high) dev_info(&dev->dev, "reg 0x%x: can't handle BAR above 4G (bus address %#010llx)\n", pos, (unsigned long long) l64); + if (bar_invalid) + dev_info(&dev->dev, "reg 0x%x: initial BAR value %#010llx invalid\n", + pos, (unsigned long long) region.start); if (res->flags) dev_printk(KERN_DEBUG, &dev->dev, "reg 0x%x: %pR\n", pos, res); |