Fix triggering false watchdog timeout as done in bce(4) when

controller is in PAUSE state.
This commit is contained in:
Pyun YongHyeon 2013-06-30 05:56:13 +00:00
parent bd3d8bed6c
commit b584d2b3f4
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=252404
2 changed files with 30 additions and 1 deletions

View File

@ -5271,7 +5271,7 @@ bge_start_locked(struct ifnet *ifp)
/*
* Set a timeout in case the chip goes out to lunch.
*/
sc->bge_timer = 5;
sc->bge_timer = BGE_TX_TIMEOUT;
}
}
@ -5776,12 +5776,40 @@ static void
bge_watchdog(struct bge_softc *sc)
{
struct ifnet *ifp;
uint32_t status;
BGE_LOCK_ASSERT(sc);
if (sc->bge_timer == 0 || --sc->bge_timer)
return;
/* If pause frames are active then don't reset the hardware. */
if ((CSR_READ_4(sc, BGE_RX_MODE) & BGE_RXMODE_FLOWCTL_ENABLE) != 0) {
status = CSR_READ_4(sc, BGE_RX_STS);
if ((status & BGE_RXSTAT_REMOTE_XOFFED) != 0) {
/*
* If link partner has us in XOFF state then wait for
* the condition to clear.
*/
CSR_WRITE_4(sc, BGE_RX_STS, status);
sc->bge_timer = BGE_TX_TIMEOUT;
return;
} else if ((status & BGE_RXSTAT_RCVD_XOFF) != 0 &&
(status & BGE_RXSTAT_RCVD_XON) != 0) {
/*
* If link partner has us in XOFF state then wait for
* the condition to clear.
*/
CSR_WRITE_4(sc, BGE_RX_STS, status);
sc->bge_timer = BGE_TX_TIMEOUT;
return;
}
/*
* Any other condition is unexpected and the controller
* should be reset.
*/
}
ifp = sc->bge_ifp;
if_printf(ifp, "watchdog timeout -- resetting\n");

View File

@ -2918,6 +2918,7 @@ struct bge_dmamap_arg {
#define BGE_HWREV_TIGON_II 0x02
#define BGE_TIMEOUT 100000
#define BGE_TXCONS_UNSET 0xFFFF /* impossible value */
#define BGE_TX_TIMEOUT 5
struct bge_bcom_hack {
int reg;