Date: Tue, 22 Sep 1998 12:21:03 -0400 (EDT) From: Bill Paul <wpaul@skynet.ctr.columbia.edu> To: kong@kong.dorms.spbu.ru, gubarev@raven.itep.ru Cc: current@FreeBSD.ORG Subject: xl driver and watchdog timeouts Message-ID: <199809221621.MAA26438@skynet.ctr.columbia.edu>
next in thread | raw e-mail | index | archive | help
Hm. Okay. I'm not sure what's going on here exactly, but if you have
problems with a 3c905-TX that generates 'watchdog timeout' errors,
please try the patch included at the end of this message. This patch
was generated against the if_xl.c from FreeBSD-current, but it will
apply to the 2.2.x version too with a little fuzz.
Something I realized last night is that if the IFF_OACTIVE flag is set
on an interface, ether_output() won't even bother trying to call the
interface transmit start routine. This being the case, the code I had
added to test for the IFF_OACTIVE condition in xl_start() would never
actually be called.
Anyway, if you are having watchdog timeout problems, please try this
patch and let me know what effect (if any) it has.
-Bill
--
=============================================================================
-Bill Paul (212) 854-6020 | System Manager, Master of Unix-Fu
Work: wpaul@ctr.columbia.edu | Center for Telecommunications Research
Home: wpaul@skynet.ctr.columbia.edu | Columbia University, New York City
=============================================================================
"It is not I who am crazy; it is I who am mad!" - Ren Hoek, "Space Madness"
=============================================================================
*** if_xl.c 1998/09/08 16:05:04 1.53
--- if_xl.c 1998/09/22 15:57:54
***************
*** 2192,2219 ****
}
/*
- * If the OACTIVE flag is set, make sure the transmitter
- * isn't wedged. Call the txeoc handler to make sure the
- * transmitter is enabled and then call the txeof handler
- * to see if any descriptors can be reclaimed and reload
- * the downlist pointer register if necessary. If after
- * that the OACTIVE flag is still set, return, otherwise
- * proceed and queue up some more frames.
- */
- if (ifp->if_flags & IFF_OACTIVE) {
- xl_txeoc(sc);
- xl_txeof(sc);
- if (ifp->if_flags & IFF_OACTIVE)
- return;
- }
-
- /*
* Check for an available queue slot. If there are none,
* punt.
*/
if (sc->xl_cdata.xl_tx_free == NULL) {
! ifp->if_flags |= IFF_OACTIVE;
! return;
}
start_tx = sc->xl_cdata.xl_tx_free;
--- 2192,2207 ----
}
/*
* Check for an available queue slot. If there are none,
* punt.
*/
if (sc->xl_cdata.xl_tx_free == NULL) {
! xl_txeoc(sc);
! xl_txeof(sc);
! if (sc->xl_cdata.xl_tx_free == NULL) {
! ifp->if_flags |= IFF_OACTIVE;
! return;
! }
}
start_tx = sc->xl_cdata.xl_tx_free;
***************
*** 2653,2658 ****
--- 2641,2652 ----
printf("xl%d: no carrier - transceiver cable problem?\n",
sc->xl_unit);
xl_txeoc(sc);
+ xl_txeof(sc);
+ xl_rxeof(sc);
+ xl_init(sc);
+
+ if (ifp->if_snd.ifq_head != NULL)
+ xl_start(ifp);
return;
}
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199809221621.MAA26438>
