Enhance the use of the watchdog timer in this driver so that it will

allow recovery from transmission lockups which occur in the middle
of the descriptor list, rather than just at the beginning.

For some unknown reason, Rhine II chips have a tendency to stop
transmitting while under heavy load, possibly due to collisions.
Whether this behavior is due to a hardware bug or a driver glitch
is unknown as of now.

In either case, this change allows the driver to gracefully recover
from such situations.

Special thanks go to The Anarcat <anarcat@anarcat.dyndns.org>, who
bugged me into looking at this and to
Dominic Marks <dominic_marks@btinternet.com>, who performed a great
deal of testing to help characterize this problem.

MFC after:	3 days
This commit is contained in:
Mike Silbersack 2002-05-15 17:05:28 +00:00
parent cfad593dbd
commit 000c679b3c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=96677
2 changed files with 6 additions and 8 deletions

View file

@ -1071,8 +1071,8 @@ static void vr_txeof(sc)
ifp = &sc->arpcom.ac_if;
/* Clear the timeout timer. */
ifp->if_timer = 0;
/* Reset the timeout timer; if_txeoc will clear it. */
ifp->if_timer = 5;
/* Sanity check. */
if (sc->vr_cdata.vr_tx_head == NULL)
@ -1129,11 +1129,10 @@ static void vr_txeoc(sc)
ifp = &sc->arpcom.ac_if;
ifp->if_timer = 0;
if (sc->vr_cdata.vr_tx_head == NULL) {
ifp->if_flags &= ~IFF_OACTIVE;
sc->vr_cdata.vr_tx_tail = NULL;
ifp->if_timer = 0;
}
return;

View file

@ -1071,8 +1071,8 @@ static void vr_txeof(sc)
ifp = &sc->arpcom.ac_if;
/* Clear the timeout timer. */
ifp->if_timer = 0;
/* Reset the timeout timer; if_txeoc will clear it. */
ifp->if_timer = 5;
/* Sanity check. */
if (sc->vr_cdata.vr_tx_head == NULL)
@ -1129,11 +1129,10 @@ static void vr_txeoc(sc)
ifp = &sc->arpcom.ac_if;
ifp->if_timer = 0;
if (sc->vr_cdata.vr_tx_head == NULL) {
ifp->if_flags &= ~IFF_OACTIVE;
sc->vr_cdata.vr_tx_tail = NULL;
ifp->if_timer = 0;
}
return;