diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-20 21:32:57 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2006-02-20 21:32:57 -0800 |
commit | f7548a8c177dd826a964700f1d93e99330f2652e (patch) | |
tree | 27913e9a8fb9a9c24d0cdf68911b472f20001d34 /pci | |
parent | e3833654a2d7a762130e15d17844104be13b302f (diff) | |
download | patches-f7548a8c177dd826a964700f1d93e99330f2652e.tar.gz |
relayfs to sysfs patches
Diffstat (limited to 'pci')
-rw-r--r-- | pci/pci-avoid-leaving-master_abort-disabled-permanently-when-returning-from-pci_scan_bridge.patch | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/pci/pci-avoid-leaving-master_abort-disabled-permanently-when-returning-from-pci_scan_bridge.patch b/pci/pci-avoid-leaving-master_abort-disabled-permanently-when-returning-from-pci_scan_bridge.patch new file mode 100644 index 0000000000000..479b365afc807 --- /dev/null +++ b/pci/pci-avoid-leaving-master_abort-disabled-permanently-when-returning-from-pci_scan_bridge.patch @@ -0,0 +1,126 @@ +From ralf@linux-mips.org Tue Feb 14 08:28:09 2006 +Date: Tue, 14 Feb 2006 16:23:57 +0000 +From: Ralf Baechle <ralf@linux-mips.org> +To: Greg KH <gregkh@suse.de> +Cc: "David S. Miller" <davem@davemloft.net>, Mark E Mason <mark.e.mason@broadcom.com> +Subject: PCI: Avoid leaving MASTER_ABORT disabled permanently when returning from pci_scan_bridge. +Message-ID: <20060214162357.GB21016@linux-mips.org> +Content-Disposition: inline + +> On Mon, Feb 13, 2006 at 05:13:21PM -0800, David S. Miller wrote: +> > +> > In drivers/pci/probe.c:pci_scan_bridge(), if this is not the first +> > pass (pass != 0) we don't restore the PCI_BRIDGE_CONTROL_REGISTER and +> > thus leave PCI_BRIDGE_CTL_MASTER_ABORT off: +> > +> > int __devinit pci_scan_bridge(struct pci_bus *bus, struct pci_dev * dev, int max, int pass) +> > { +> > ... +> > /* Disable MasterAbortMode during probing to avoid reporting +> > of bus errors (in some architectures) */ +> > pci_read_config_word(dev, PCI_BRIDGE_CONTROL, &bctl); +> > pci_write_config_word(dev, PCI_BRIDGE_CONTROL, +> > bctl & ~PCI_BRIDGE_CTL_MASTER_ABORT); +> > ... +> > if ((buses & 0xffff00) && !pcibios_assign_all_busses() && !is_cardbus) { +> > unsigned int cmax, busnr; +> > /* +> > * Bus already configured by firmware, process it in the first +> > * pass and just note the configuration. +> > */ +> > if (pass) +> > return max; +> > ... +> > } +> > +> > pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl); +> > ... +> > +> > This doesn't seem intentional. + +Agreed, looks like an accident. The patch [1] originally came from Kip +Walker (Broadcom back then) between 2.6.0-test3 and 2.6.0-test4. As I +recall it was supposed to fix an issue with with PCI aborts being +signalled by the PCI bridge of the Broadcom BCM1250 family of SOCs when +probing behind pci_scan_bridge. It is undeseriable to disable +PCI_BRIDGE_CTL_MASTER_ABORT in pci_{read,write)_config_* and the +behaviour wasn't considered a bug in need of a workaround, so this was +put in probe.c. + +I don't have an affected system at hand, so can't really test but I +propose something like the below patch. + +[1] http://www.linux-mips.org/git?p=linux.git;a=commit;h=599457e0cb702a31a3247ea6a5d9c6c99c4cf195 + +[PCI] Avoid leaving MASTER_ABORT disabled permanently when returning from pci_scan_bridge. + +Signed-off-by: Ralf Baechle <ralf@linux-mips.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + drivers/pci/probe.c | 15 ++++++++------- + 1 file changed, 8 insertions(+), 7 deletions(-) + +--- gregkh-2.6.orig/drivers/pci/probe.c ++++ gregkh-2.6/drivers/pci/probe.c +@@ -456,7 +456,7 @@ int __devinit pci_scan_bridge(struct pci + * pass and just note the configuration. + */ + if (pass) +- return max; ++ goto out; + busnr = (buses >> 8) & 0xFF; + + /* +@@ -466,12 +466,12 @@ int __devinit pci_scan_bridge(struct pci + if (pci_find_bus(pci_domain_nr(bus), busnr)) { + printk(KERN_INFO "PCI: Bus %04x:%02x already known\n", + pci_domain_nr(bus), busnr); +- return max; ++ goto out; + } + + child = pci_add_new_bus(bus, dev, busnr); + if (!child) +- return max; ++ goto out; + child->primary = buses & 0xFF; + child->subordinate = (buses >> 16) & 0xFF; + child->bridge_ctl = bctl; +@@ -496,7 +496,7 @@ int __devinit pci_scan_bridge(struct pci + bus ranges. */ + pci_write_config_dword(dev, PCI_PRIMARY_BUS, + buses & ~0xffffff); +- return max; ++ goto out; + } + + /* Clear errors */ +@@ -505,7 +505,7 @@ int __devinit pci_scan_bridge(struct pci + /* Prevent assigning a bus number that already exists. + * This can happen when a bridge is hot-plugged */ + if (pci_find_bus(pci_domain_nr(bus), max+1)) +- return max; ++ goto out; + child = pci_add_new_bus(bus, dev, ++max); + buses = (buses & 0xff000000) + | ((unsigned int)(child->primary) << 0) +@@ -581,8 +581,6 @@ int __devinit pci_scan_bridge(struct pci + pci_write_config_byte(dev, PCI_SUBORDINATE_BUS, max); + } + +- pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl); +- + sprintf(child->name, (is_cardbus ? "PCI CardBus #%02x" : "PCI Bus #%02x"), child->number); + + while (bus->parent) { +@@ -601,6 +599,9 @@ int __devinit pci_scan_bridge(struct pci + bus = bus->parent; + } + ++out: ++ pci_write_config_word(dev, PCI_BRIDGE_CONTROL, bctl); ++ + return max; + } + |