Subject: Re: Problem rtk driver with 1.5W
To: None <thorpej@zembu.com>
From: Masanori Kanaoka <kanaoka@ann.hi-ho.ne.jp>
List: current-users
Date: 07/25/2001 08:40:12
Hi,

       From: Jason R Thorpe <thorpej@zembu.com>
    Subject: Re: Problem rtk driver with 1.5W
      Date : Tue, 24 Jul 2001 08:22:22 -0700

$ When an underrun occurs, you might consider printing out what the next
$ threshold is, like:

$ rtk0: transmit underrun; new threshold 320 bytes

Indeed! I added print out code. 
In my case,rtk driver said below:

rtk0 at cardbus1 dev 0 function 0: Corega FEther CB-TXD 10/100BaseTX
rtk0: Ethernet address 00:90:99:48:51:f5
ukphy0 at rtk0 phy 7: Generic IEEE 802.3u media interface
ukphy0: OUI 0x000000, model 0x0000, rev. 0
ukphy0: 10baseT, 10baseT-FDX, 100baseTX, 100baseTX-FDX, auto
boot device: wd0
root on wd0a dumps on wd0b
root file system type: ffs
rtk0: interrupting at 11
rtk0: transmit underrun; new threshold: 320 bytes
rtk0: transmit underrun; new threshold: 384 bytes
rtk0: transmit underrun; new threshold: 448 bytes
rtk0: transmit underrun; new threshold: 512 bytes
rtk0: transmit underrun; new threshold: 576 bytes

I attached the patch that added print out code.
I'll commit this patch later.

Regards!
---
 Masanori Kanaoka	kanaoka@ann.hi-ho.ne.jp

Index: sys/dev/ic/rtl81x9.c
===================================================================
RCS file: /ftp/cvs/syssrc/sys/dev/ic/rtl81x9.c,v
retrieving revision 1.35
diff -u -r1.35 rtl81x9.c
--- sys/dev/ic/rtl81x9.c	2001/07/19 16:25:26	1.35
+++ sys/dev/ic/rtl81x9.c	2001/07/24 23:31:05
@@ -704,6 +704,9 @@
 	 */
 	sc->sc_flags |= RTK_ATTACHED;
 
+	/* Init Early TX threshold. */
+	sc->sc_txthresh = TXTH_256; 
+
 	/* Reset the adapter. */
 	rtk_reset(sc);
 
@@ -1190,6 +1193,21 @@
 			ifp->if_opackets++;
 		else {
 			ifp->if_oerrors++;
+
+			/*
+			 * Increase Early TX threshold if underrun occurred.
+			 * Increase step 64 bytes.
+			 */
+			if (txstat & RTK_TXSTAT_TX_UNDERRUN) {
+				printf("%s: transmit underrun;", 
+					sc->sc_dev.dv_xname);
+				if (sc->sc_txthresh < TXTH_MAX) {
+					sc->sc_txthresh += 2;
+					printf(" new threshold: %d bytes",
+						sc->sc_txthresh * 32);
+				}
+				printf("\n");
+			}
 			if (txstat & (RTK_TXSTAT_TXABRT|RTK_TXSTAT_OUTOFWIN))
 				CSR_WRITE_4(sc, RTK_TXCFG, RTK_TXCFG_CONFIG);
 		}
@@ -1334,7 +1352,7 @@
 
 		CSR_WRITE_4(sc, txd->txd_txaddr,
 		    txd->txd_dmamap->dm_segs[0].ds_addr);
-		CSR_WRITE_4(sc, txd->txd_txstat, RTK_TX_EARLYTHRESH | len);
+		CSR_WRITE_4(sc, txd->txd_txstat, RTK_TX_THRESH(sc) | len);
 	}
 
 	/*
@@ -1379,6 +1397,8 @@
 	/* Init TX descriptors. */
 	rtk_list_tx_init(sc);
 
+	/* Init Early TX threshold. */
+	sc->sc_txthresh = TXTH_256;
 	/*
 	 * Enable transmit and receive.
 	 */
Index: sys/dev/ic/rtl81x9var.h
===================================================================
RCS file: /ftp/cvs/syssrc/sys/dev/ic/rtl81x9var.h,v
retrieving revision 1.9
diff -u -r1.9 rtl81x9var.h
--- sys/dev/ic/rtl81x9var.h	2001/02/02 04:34:19	1.9
+++ sys/dev/ic/rtl81x9var.h	2001/07/24 09:54:03
@@ -92,6 +92,8 @@
 	SIMPLEQ_HEAD(, rtk_tx_desc) rtk_tx_dirty;
 
 	int			sc_flags;	/* misc flags */
+	int			sc_txthresh;	/* Early tx threshold */
+
 	void	*sc_sdhook;			/* shutdown hook */
 	void	*sc_powerhook;			/* power management hook */
 
@@ -105,6 +107,11 @@
 #define RTK_ENABLED  0x00000002 /* chip is enabled	*/
 
 #define RTK_IS_ENABLED(sc)	((sc)->sc_flags & RTK_ENABLED)
+#define RTK_TX_THRESH(sc)	(((sc)->sc_txthresh << 16) & 0x003F0000)
+
+#define TXTH_256	8
+#define TXTH_MAX	48
+
 /*
  * register space access macros
  */