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
This commit is contained in:
parent
65d1eb9443
commit
2c0dd4bbe4
@ -73,10 +73,27 @@ struct ath_pci_softc {
|
|||||||
|
|
||||||
#define BS_BAR 0x10
|
#define BS_BAR 0x10
|
||||||
#define PCIR_RETRY_TIMEOUT 0x41
|
#define PCIR_RETRY_TIMEOUT 0x41
|
||||||
|
#define PCIR_CFG_PMCSR 0x48
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ath_pci_setup(device_t dev)
|
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
|
* Disable retry timeout to keep PCI Tx retries from
|
||||||
* interfering with C3 CPU state.
|
* interfering with C3 CPU state.
|
||||||
|
Loading…
Reference in New Issue
Block a user