Module Name: src
Committed By: msaitoh
Date: Tue Jul 14 00:00:44 UTC 2009
Modified Files:
src/sys/dev/pci: if_wm.c if_wmreg.h
Log Message:
Some fixes for i80003 and ICH{8,9,10) from e1000 driver and document:
Add setting for KABGTXD register for ICH{8,9,10}.
ICH9 and ICH10 has no FCAL, FCAH and FCT like ICH8.
Add special setting for FCTTV and TCTL_EXT register for i80003
The special setting fopr TIPG is only for i80003.
Some of kumeran settings are only for i80003's bugs.
Add some ICH10 fixes.
To generate a diff of this commit:
cvs rdiff -u -r1.176 -r1.177 src/sys/dev/pci/if_wm.c
cvs rdiff -u -r1.27 -r1.28 src/sys/dev/pci/if_wmreg.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_wm.c
diff -u src/sys/dev/pci/if_wm.c:1.176 src/sys/dev/pci/if_wm.c:1.177
--- src/sys/dev/pci/if_wm.c:1.176 Mon Jul 13 23:31:19 2009
+++ src/sys/dev/pci/if_wm.c Tue Jul 14 00:00:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: if_wm.c,v 1.176 2009/07/13 23:31:19 msaitoh Exp $ */
+/* $NetBSD: if_wm.c,v 1.177 2009/07/14 00:00:44 msaitoh Exp $ */
/*
* Copyright (c) 2001, 2002, 2003, 2004 Wasabi Systems, Inc.
@@ -76,7 +76,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.176 2009/07/13 23:31:19 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_wm.c,v 1.177 2009/07/14 00:00:44 msaitoh Exp $");
#include "bpfilter.h"
#include "rnd.h"
@@ -3264,7 +3264,8 @@
*
* XXX Values could probably stand some tuning.
*/
- if (sc->sc_type != WM_T_ICH8) {
+ if ((sc->sc_type != WM_T_ICH8) && (sc->sc_type != WM_T_ICH9)
+ && (sc->sc_type != WM_T_ICH10)) {
CSR_WRITE(sc, WMREG_FCAL, FCAL_CONST);
CSR_WRITE(sc, WMREG_FCAH, FCAH_CONST);
CSR_WRITE(sc, WMREG_FCT, ETHERTYPE_FLOWCONTROL);
@@ -3278,7 +3279,11 @@
CSR_WRITE(sc, WMREG_FCRTH, FCRTH_DFLT);
CSR_WRITE(sc, WMREG_FCRTL, sc->sc_fcrtl);
}
- CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
+
+ if (sc->sc_type == WM_T_80003)
+ CSR_WRITE(sc, WMREG_FCTTV, 0xffff);
+ else
+ CSR_WRITE(sc, WMREG_FCTTV, FCTTV_DFLT);
/* Deal with VLAN enables. */
if (VLAN_ATTACHED(&sc->sc_ethercom))
@@ -3288,29 +3293,47 @@
/* Write the control registers. */
CSR_WRITE(sc, WMREG_CTRL, sc->sc_ctrl);
- if (sc->sc_type >= WM_T_80003 && (sc->sc_flags & WM_F_HAS_MII)) {
+
+ if (sc->sc_flags & WM_F_HAS_MII) {
int val;
- val = CSR_READ(sc, WMREG_CTRL_EXT);
- val &= ~CTRL_EXT_LINK_MODE_MASK;
- CSR_WRITE(sc, WMREG_CTRL_EXT, val);
-
- /* Bypass RX and TX FIFO's */
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
- KUMCTRLSTA_FIFO_CTRL_RX_BYPASS |
- KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
+
+ switch (sc->sc_type) {
+ case WM_T_80003:
+ case WM_T_ICH8:
+ case WM_T_ICH9:
+ case WM_T_ICH10:
+ /*
+ * Set the mac to wait the maximum time between each
+ * iteration and increase the max iterations when
+ * polling the phy; this fixes erroneous timeouts at
+ * 10Mbps.
+ */
+ wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS,
+ 0xFFFF);
+ val = wm_kmrn_i80003_readreg(sc,
+ KUMCTRLSTA_OFFSET_INB_PARAM);
+ val |= 0x3F;
+ wm_kmrn_i80003_writereg(sc,
+ KUMCTRLSTA_OFFSET_INB_PARAM, val);
+ break;
+ default:
+ break;
+ }
+
+ if (sc->sc_type == WM_T_80003) {
+ val = CSR_READ(sc, WMREG_CTRL_EXT);
+ val &= ~CTRL_EXT_LINK_MODE_MASK;
+ CSR_WRITE(sc, WMREG_CTRL_EXT, val);
+
+ /* Bypass RX and TX FIFO's */
+ wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_FIFO_CTRL,
+ KUMCTRLSTA_FIFO_CTRL_RX_BYPASS |
+ KUMCTRLSTA_FIFO_CTRL_TX_BYPASS);
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
- KUMCTRLSTA_INB_CTRL_DIS_PADDING |
- KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
- /*
- * Set the mac to wait the maximum time between each
- * iteration and increase the max iterations when
- * polling the phy; this fixes erroneous timeouts at 10Mbps.
- */
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_TIMEOUTS, 0xFFFF);
- val = wm_kmrn_i80003_readreg(sc, KUMCTRLSTA_OFFSET_INB_PARAM);
- val |= 0x3F;
- wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_INB_PARAM, val);
+ wm_kmrn_i80003_writereg(sc, KUMCTRLSTA_OFFSET_INB_CTRL,
+ KUMCTRLSTA_INB_CTRL_DIS_PADDING |
+ KUMCTRLSTA_INB_CTRL_LINK_TMOUT_DFLT);
+ }
}
#if 0
CSR_WRITE(sc, WMREG_CTRL_EXT, sc->sc_ctrl_ext);
@@ -3342,6 +3365,13 @@
sc->sc_icr |= ICR_RXCFG;
CSR_WRITE(sc, WMREG_IMS, sc->sc_icr);
+ if ((sc->sc_type == WM_T_ICH8) || (sc->sc_type == WM_T_ICH9)
+ || (sc->sc_type == WM_T_ICH10)) {
+ reg = CSR_READ(sc, WMREG_KABGTXD);
+ reg |= KABGTXD_BGSQLBIAS;
+ CSR_WRITE(sc, WMREG_KABGTXD, reg);
+ }
+
/* Set up the inter-packet gap. */
CSR_WRITE(sc, WMREG_TIPG, sc->sc_tipg);
@@ -3385,6 +3415,13 @@
sc->sc_tctl |= TCTL_RTLC;
CSR_WRITE(sc, WMREG_TCTL, sc->sc_tctl);
+ if (sc->sc_type == WM_T_80003) {
+ reg = CSR_READ(sc, WMREG_TCTL_EXT);
+ reg &= ~TCTL_EXT_GCEX_MASK;
+ reg |= DEFAULT_80003ES2LAN_TCTL_EXT_GCEX;
+ CSR_WRITE(sc, WMREG_TCTL_EXT, reg);
+ }
+
/* Set the media. */
if ((error = mii_ifmedia_change(&sc->sc_mii)) != 0)
goto out;
@@ -4487,7 +4524,7 @@
/* We have MII. */
sc->sc_flags |= WM_F_HAS_MII;
- if (sc->sc_type >= WM_T_80003)
+ if (sc->sc_type == WM_T_80003)
sc->sc_tipg = TIPG_1000T_80003_DFLT;
else
sc->sc_tipg = TIPG_1000T_DFLT;
Index: src/sys/dev/pci/if_wmreg.h
diff -u src/sys/dev/pci/if_wmreg.h:1.27 src/sys/dev/pci/if_wmreg.h:1.28
--- src/sys/dev/pci/if_wmreg.h:1.27 Tue Apr 7 18:23:37 2009
+++ src/sys/dev/pci/if_wmreg.h Tue Jul 14 00:00:44 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: if_wmreg.h,v 1.27 2009/04/07 18:23:37 msaitoh Exp $ */
+/* $NetBSD: if_wmreg.h,v 1.28 2009/07/14 00:00:44 msaitoh Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -610,8 +610,14 @@
#define WMREG_TXDMAC 0x3000 /* Transfer DMA Control */
#define TXDMAC_DPP (1U << 0) /* disable packet prefetch */
+#define WMREG_KABGTXD 0x3004 /* AFE and Gap Transmit Ref Data */
+#define KABGTXD_BGSQLBIAS 0x00050000
+
#define WMREG_TSPMT 0x3830 /* TCP Segmentation Pad and Minimum
Threshold (Cordova) */
+
+#define WMREG_TARC0 0x3840 /* Tx arbitration count */
+
#define TSPMT_TSMT(x) (x) /* TCP seg min transfer */
#define TSPMT_TSPBP(x) ((x) << 16) /* TCP seg pkt buf padding */