2001-07-10 06:49:01

by Tim Hockin

[permalink] [raw]
Subject: [PATCH] PCI probing status cleanup

diff -ruN dist-2.4.6/drivers/pci/pci.c cobalt-2.4.6/drivers/pci/pci.c
--- dist-2.4.6/drivers/pci/pci.c Mon Jul 2 14:42:53 2001
+++ cobalt-2.4.6/drivers/pci/pci.c Mon Jul 9 11:04:01 2001
@@ -1229,8 +1233,19 @@
return NULL;

/* some broken boards return 0 or ~0 if a slot is empty: */
- if (l == 0xffffffff || l == 0x00000000 || l == 0x0000ffff || l == 0xffff0000)
+ if (l == 0xffffffff || l == 0x00000000
+ || l == 0x0000ffff || l == 0xffff0000) {
+ /*
+ * host/pci and pci/pci bridges will set Received Master Abort
+ * (bit 13) on failed configuration access (happens when
+ * searching for devices). To be safe, clear the status
+ * register.
+ */
+ unsigned short st;
+ pci_read_config_word(temp, PCI_STATUS, &st);
+ pci_write_config_word(temp, PCI_STATUS, st);
return NULL;
+ }

dev = kmalloc(sizeof(*dev), GFP_KERNEL);
if (!dev)


Attachments:
pci_bridge.diff (867.00 B)

2001-07-10 12:37:40

by Jeff Garzik

[permalink] [raw]
Subject: Re: [PATCH] PCI probing status cleanup

Tim Hockin wrote:
> /* some broken boards return 0 or ~0 if a slot is empty: */
> - if (l == 0xffffffff || l == 0x00000000 || l == 0x0000ffff || l == 0xffff0000)
> + if (l == 0xffffffff || l == 0x00000000
> + || l == 0x0000ffff || l == 0xffff0000) {
> + /*
> + * host/pci and pci/pci bridges will set Received Master Abort
> + * (bit 13) on failed configuration access (happens when
> + * searching for devices). To be safe, clear the status
> + * register.
> + */
> + unsigned short st;
> + pci_read_config_word(temp, PCI_STATUS, &st);
> + pci_write_config_word(temp, PCI_STATUS, st);
> return NULL;
> + }

ok, though I wonder if we shouldn't just clear status for all PCI
devices on boot for paranoia's sake.

--
Jeff Garzik | A recent study has shown that too much soup
Building 1024 | can cause malaise in laboratory mice.
MandrakeSoft |