[PATCH] PCI: disable decoding while sizing BARs

Bjorn Helgaas (bjorn_helgaas@hp.com)
Mon, 16 Dec 2002 17:41:53 -0700


While sizing BARs, devices are temporarily assigned ranges
that may conflict with other things in the system, like IOSAPICs.
Here's a detailed description of a hang that results from leaving
device decoding enabled while sizing the BARs:

https://lists.linuxia64.org/archives//linux-ia64/2002-April/003302.html

This patch applies to current 2.4 BitKeeper.

--- linux-2.4/drivers/pci/pci.c 2002-12-16 10:44:21.000000000 -0700
+++ testing/drivers/pci/pci.c 2002-12-16 17:22:26.000000000 -0700
@@ -1058,8 +1058,14 @@
{
unsigned int pos, reg, next;
u32 l, sz;
+ u16 cmd;
struct resource *res;

+ /* Disable I/O & memory decoding while we size the BARs. */
+ pci_read_config_word(dev, PCI_COMMAND, &cmd);
+ pci_write_config_word(dev, PCI_COMMAND,
+ cmd & ~(PCI_COMMAND_IO | PCI_COMMAND_MEMORY));
+
for(pos=0; pos<howmany; pos = next) {
next = pos+1;
res = &dev->resource[pos];
@@ -1131,6 +1137,8 @@
res->end = res->start + (unsigned long) sz;
}
}
+
+ pci_write_config_word(dev, PCI_COMMAND, cmd);
}

void __devinit pci_read_bridge_bases(struct pci_bus *child)

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