Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 31 Mar 2008 14:22:23 +0900
From:      Pyun YongHyeon <pyunyh@gmail.com>
To:        =?euc-kr?B?rK6s2qznrNGs2qzdIKysrNqs4azR?= <msnkipa@mail.ru>
Cc:        freebsd-stable@freebsd.org
Subject:   Re: rl driver error?
Message-ID:  <20080331052223.GF9900@cdnetworks.co.kr>
In-Reply-To: <E1Jg2hW-000Diz-00.msnkipa-mail-ru@f127.mail.ru>
References:  <E1Jg2hW-000Diz-00.msnkipa-mail-ru@f127.mail.ru>

next in thread | previous in thread | raw e-mail | index | archive | help

--2/5bycvrmDh4d1IB
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

On Sun, Mar 30, 2008 at 10:56:18PM +0400,   wrote:
 > I have got system with rl and re cards. This system functiones as gateway, rl - internet re - 
 > intranet. Periodically I have 
 > ping: sendto: No buffer space available
 > on rl card! 
 > on logs I have
 > Mar 30 22:23:02 xxxxxxx kernel: rl0: watchdog timeout
 > Mar 30 22:23:32 xxxxxxx last message repeated 6 times
 > This could be improved by reboting the system, that very bad, as it network gateway!
 > Some ideas?
 > 
 > System FreeBSD 7.0 , compiled from RELENG_7_0_0

Please try attached patch and let me know how it goes.

-- 
Regards,
Pyun YongHyeon

--2/5bycvrmDh4d1IB
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename="rl.patch2"

--- sys/pci/if_rl.c.orig	2008-03-03 13:15:08.000000000 +0900
+++ sys/pci/if_rl.c	2008-03-31 14:16:02.000000000 +0900
@@ -1117,17 +1117,19 @@
 		 * datasheet makes absolutely no mention of this and
 		 * RealTek should be shot for this.
 		 */
-		if ((uint16_t)(rxstat >> 16) == RL_RXSTAT_UNFINISHED)
+		total_len = rxstat >> 16;
+		if (total_len == RL_RXSTAT_UNFINISHED)
 			break;
 
-		if (!(rxstat & RL_RXSTAT_RXOK)) {
+		if (!(rxstat & RL_RXSTAT_RXOK) ||
+		    total_len < ETHER_MIN_LEN ||
+		    total_len > ETHER_MAX_LEN + ETHER_VLAN_ENCAP_LEN) {
 			ifp->if_ierrors++;
 			rl_init_locked(sc);
 			return;
 		}
 
 		/* No errors; receive the packet. */
-		total_len = rxstat >> 16;
 		rx_bytes += total_len + 4;
 
 		/*
@@ -1244,8 +1246,6 @@
 
 	if (RL_LAST_TXMBUF(sc) == NULL)
 		sc->rl_watchdog_timer = 0;
-	else if (sc->rl_watchdog_timer == 0)
-		sc->rl_watchdog_timer = 5;
 }
 
 static void
@@ -1326,27 +1326,32 @@
 		goto done_locked;
 #endif
 
-	for (;;) {
-		status = CSR_READ_2(sc, RL_ISR);
+	status = CSR_READ_2(sc, RL_ISR);
+	if (status == 0 || status == 0xffff || (status & RL_INTRS) == 0)
+		goto done_locked;
+
+	/* Disable interrupts. */
+	CSR_WRITE_2(sc, RL_IMR, 0);
+
+	for (; (status & RL_INTRS) != 0;) {
 		/* If the card has gone away, the read returns 0xffff. */
 		if (status == 0xffff)
 			break;
-		if (status != 0)
-			CSR_WRITE_2(sc, RL_ISR, status);
-		if ((status & RL_INTRS) == 0)
-			break;
-		if (status & RL_ISR_RX_OK)
+		CSR_WRITE_2(sc, RL_ISR, status);
+		if ((status & (RL_ISR_RX_OK | RL_ISR_RX_ERR)) != 0)
 			rl_rxeof(sc);
-		if (status & RL_ISR_RX_ERR)
-			rl_rxeof(sc);
-		if ((status & RL_ISR_TX_OK) || (status & RL_ISR_TX_ERR))
+		if ((status & (RL_ISR_TX_OK | RL_ISR_TX_ERR)) != 0)
 			rl_txeof(sc);
 		if (status & RL_ISR_SYSTEM_ERR) {
 			rl_reset(sc);
 			rl_init_locked(sc);
 		}
+		status = CSR_READ_2(sc, RL_ISR);
 	}
 
+	/* Enable interrupts. */
+	CSR_WRITE_2(sc, RL_IMR, RL_INTRS);
+
 	if (!IFQ_DRV_IS_EMPTY(&ifp->if_snd))
 		rl_start_locked(ifp);
 

--2/5bycvrmDh4d1IB--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20080331052223.GF9900>