summaryrefslogtreecommitdiff
path: root/drivers/ssb
diff options
context:
space:
mode:
authorLarry Finger <Larry.Finger@lwfinger.net>2010-10-20 09:59:33 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-11-15 13:23:28 -0500
commite081685c1bbe8da37c7f61726fdb783ff277f14f (patch)
tree333e95f2e541b72dec38e76ae8d371bd8942e53c /drivers/ssb
parent14fb7c17e97ea0fcc545393fb1f34e6541647b5b (diff)
downloadlinux-3.10-e081685c1bbe8da37c7f61726fdb783ff277f14f.tar.gz
linux-3.10-e081685c1bbe8da37c7f61726fdb783ff277f14f.tar.bz2
linux-3.10-e081685c1bbe8da37c7f61726fdb783ff277f14f.zip
ssb: Clear RETRY_TIMEOUT in PCI Configuration for normal devices
MMIO log traces obtained using the Broadcom wl hybrid driver show that the RETRY_TIMEOUT register (0x41) in PCI configuration space is cleared if non-zero. Similar code found in other drivers such as ipw2100 show this operation is needed to keep PCI Tx retries from interfering with C3 CPU state. There are no known cases where omission of this code has caused a problem, but this patch is offered just in case such a situation occurs. Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/ssb')
-rw-r--r--drivers/ssb/pcihost_wrapper.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/ssb/pcihost_wrapper.c b/drivers/ssb/pcihost_wrapper.c
index 6536a041d90..f6c8c81a002 100644
--- a/drivers/ssb/pcihost_wrapper.c
+++ b/drivers/ssb/pcihost_wrapper.c
@@ -59,6 +59,7 @@ static int ssb_pcihost_probe(struct pci_dev *dev,
struct ssb_bus *ssb;
int err = -ENOMEM;
const char *name;
+ u32 val;
ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
if (!ssb)
@@ -74,6 +75,12 @@ static int ssb_pcihost_probe(struct pci_dev *dev,
goto err_pci_disable;
pci_set_master(dev);
+ /* Disable the RETRY_TIMEOUT register (0x41) to keep
+ * PCI Tx retries from interfering with C3 CPU state */
+ pci_read_config_dword(dev, 0x40, &val);
+ if ((val & 0x0000ff00) != 0)
+ pci_write_config_dword(dev, 0x40, val & 0xffff00ff);
+
err = ssb_bus_pcibus_register(ssb, dev);
if (err)
goto err_pci_release_regions;