From 8b1bf051e2ddffa6451136f79eb5e53e62d65e1a Mon Sep 17 00:00:00 2001 From: riz Date: Sat, 19 Nov 2005 21:45:50 +0000 Subject: [PATCH] From FreeBSD (appropriate pieces of revs 1.90 and 1.92): Only clear the IFF_OACTIVE flag when we have a chance of being able to queue a packet to the hardware, instead of when the hardware queue is empty, and fix up handling and prodding of the tx. These fixes clear up an occasional "sk0: watchdog timeout" from the on-board ethernet on my Asus A8V motherboard. OK christos@ --- sys/dev/pci/if_sk.c | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/sys/dev/pci/if_sk.c b/sys/dev/pci/if_sk.c index 42404207f579..a972e838e177 100644 --- a/sys/dev/pci/if_sk.c +++ b/sys/dev/pci/if_sk.c @@ -1,4 +1,4 @@ -/* $NetBSD: if_sk.c,v 1.16 2005/09/11 23:49:39 xtraeme Exp $ */ +/* $NetBSD: if_sk.c,v 1.17 2005/11/19 21:45:50 riz Exp $ */ /*- * Copyright (c) 2003 The NetBSD Foundation, Inc. @@ -1759,11 +1759,13 @@ sk_start(struct ifnet *ifp) return; /* Transmit */ - sc_if->sk_cdata.sk_tx_prod = idx; - CSR_WRITE_4(sc, sc_if->sk_tx_bmu, SK_TXBMU_TX_START); + if (idx != sc_if->sk_cdata.sk_tx_prod) { + sc_if->sk_cdata.sk_tx_prod = idx; + CSR_WRITE_4(sc, sc_if->sk_tx_bmu, SK_TXBMU_TX_START); - /* Set a timeout in case the chip goes out to lunch. */ - ifp->if_timer = 5; + /* Set a timeout in case the chip goes out to lunch. */ + ifp->if_timer = 5; + } } @@ -1888,7 +1890,7 @@ void sk_txeof(struct sk_if_softc *sc_if) { struct sk_softc *sc = sc_if->sk_softc; - struct sk_tx_desc *cur_tx = NULL; + struct sk_tx_desc *cur_tx; struct ifnet *ifp = &sc_if->sk_ethercom.ec_if; u_int32_t idx; struct sk_txmap_entry *entry; @@ -1937,10 +1939,10 @@ sk_txeof(struct sk_if_softc *sc_if) else /* nudge chip to keep tx ring moving */ CSR_WRITE_4(sc, sc_if->sk_tx_bmu, SK_TXBMU_TX_START); - sc_if->sk_cdata.sk_tx_cons = idx; - - if (cur_tx != NULL) + if (sc_if->sk_cdata.sk_tx_cnt < SK_TX_RING_CNT - 2) ifp->if_flags &= ~IFF_OACTIVE; + + sc_if->sk_cdata.sk_tx_cons = idx; } void