PCI: Don't print anything while decoding is disabled
authorBjorn Helgaas <bhelgaas@google.com>
Mon, 14 Apr 2014 21:26:50 +0000 (15:26 -0600)
committerBjorn Helgaas <bhelgaas@google.com>
Fri, 23 May 2014 16:47:20 +0000 (10:47 -0600)
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>
drivers/pci/probe.c

index dd710b12d34cd5edc04621ce5bde7ee3ef97ba11..3bc149b848a88e5bb2cbd8603d1f6ac75ab3c60c 100644 (file)
@@ -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, &region.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);