From 2c0dd4bbe4e239ac9588a0c284164cd7324f4573 Mon Sep 17 00:00:00 2001 From: Adrian Chadd Date: Tue, 18 Oct 2011 03:32:18 +0000 Subject: [PATCH] Add in a currently-disabled WAR for PCI NICs. Some earlier series (~AR5212?) play badly with BIOSes. In these instances, they may require a forced reset (by transitioning the NIC through D0 -> D3 -> D0) before they probe/attach correctly. This is currently disabled because: * I haven't figured out the "right" code to ensure this only happens for PCI NICs (not PCIe or Cardbus); * I haven't at all done wide scale testing for this, and I'm not yet ready for said wide-scale testing. I'm documenting this primarily so users with misbehaving NICs have something to tinker with. Obtained from: Atheros --- sys/dev/ath/if_ath_pci.c | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/sys/dev/ath/if_ath_pci.c b/sys/dev/ath/if_ath_pci.c index 531c79adb744..4824773dc8fd 100644 --- a/sys/dev/ath/if_ath_pci.c +++ b/sys/dev/ath/if_ath_pci.c @@ -73,10 +73,27 @@ struct ath_pci_softc { #define BS_BAR 0x10 #define PCIR_RETRY_TIMEOUT 0x41 +#define PCIR_CFG_PMCSR 0x48 static void ath_pci_setup(device_t dev) { + /* Override the system latency timer */ + pci_write_config(dev, PCIR_LATTIMER, 0x80, 1); + + /* If a PCI NIC, force wakeup */ +#ifdef ATH_PCI_WAKEUP_WAR + /* XXX TODO: don't do this for non-PCI (ie, PCIe, Cardbus!) */ + if (1) { + uint16_t pmcsr; + pmcsr = pci_read_config(dev, PCIR_CFG_PMCSR, 2); + pmcsr |= 3; + pci_write_config(dev, PCIR_CFG_PMCSR, pmcsr, 2); + pmcsr &= ~3; + pci_write_config(dev, PCIR_CFG_PMCSR, pmcsr, 2); + } +#endif + /* * Disable retry timeout to keep PCI Tx retries from * interfering with C3 CPU state.