diff options
author | gallatin <gallatin@FreeBSD.org> | 2009-09-30 14:42:06 +0000 |
---|---|---|
committer | gallatin <gallatin@FreeBSD.org> | 2009-09-30 14:42:06 +0000 |
commit | e020b62ba48e93b7c2bf987e6918a4e0fd0d0d9b (patch) | |
tree | 9726ca7b28ea0ce427bdd978501854f30170759e /sys/dev/mxge/if_mxge.c | |
parent | 247be636e0b24ffd0d6ce7d765cd93315585f602 (diff) | |
download | FreeBSD-src-e020b62ba48e93b7c2bf987e6918a4e0fd0d0d9b.zip FreeBSD-src-e020b62ba48e93b7c2bf987e6918a4e0fd0d0d9b.tar.gz |
Two more mxge watchdog fixes:
1) Restore the PCI Express control register after a watchdog
reset. This is required because the device will come out
of watchdog reset with the pectl reg at its default state,
and important BIOS configuration (like max payload size)
could be lost.
2) Call mxge_start_locked() for every tx queue before dropping
the lock in the watchdog handler. This is required, as
the queue's buf ring may have filled during the reset.
Diffstat (limited to 'sys/dev/mxge/if_mxge.c')
-rw-r--r-- | sys/dev/mxge/if_mxge.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/dev/mxge/if_mxge.c b/sys/dev/mxge/if_mxge.c index 6e8ca67..8a71c33 100644 --- a/sys/dev/mxge/if_mxge.c +++ b/sys/dev/mxge/if_mxge.c @@ -3701,10 +3701,16 @@ mxge_setup_cfg_space(mxge_softc_t *sc) if (pci_find_extcap(dev, PCIY_EXPRESS, ®) == 0) { lnk = pci_read_config(dev, reg + 0x12, 2); sc->link_width = (lnk >> 4) & 0x3f; - - pectl = pci_read_config(dev, reg + 0x8, 2); - pectl = (pectl & ~0x7000) | (5 << 12); - pci_write_config(dev, reg + 0x8, pectl, 2); + + if (sc->pectl == 0) { + pectl = pci_read_config(dev, reg + 0x8, 2); + pectl = (pectl & ~0x7000) | (5 << 12); + pci_write_config(dev, reg + 0x8, pectl, 2); + sc->pectl = pectl; + } else { + /* restore saved pectl after watchdog reset */ + pci_write_config(dev, reg + 0x8, sc->pectl, 2); + } } /* Enable DMA and Memory space access */ @@ -3816,6 +3822,9 @@ mxge_watchdog_reset(mxge_softc_t *sc, int slice) /* release all TX locks */ for (s = 0; s < num_tx_slices; s++) { ss = &sc->ss[s]; +#ifdef IFNET_BUF_RING + mxge_start_locked(ss); +#endif mtx_unlock(&ss->tx.mtx); } } |