Module Name:    src
Committed By:   kiyohara
Date:           Sat Oct  2 05:57:42 UTC 2010

Modified Files:
        src/sys/dev/marvell: if_mvgbe.c mvgbereg.h

Log Message:
Support Kirkwood's GbE.


To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/marvell/if_mvgbe.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/marvell/mvgbereg.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/marvell/if_mvgbe.c
diff -u src/sys/dev/marvell/if_mvgbe.c:1.2 src/sys/dev/marvell/if_mvgbe.c:1.3
--- src/sys/dev/marvell/if_mvgbe.c:1.2	Sun Jul 11 08:43:36 2010
+++ src/sys/dev/marvell/if_mvgbe.c	Sat Oct  2 05:57:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: if_mvgbe.c,v 1.2 2010/07/11 08:43:36 kiyohara Exp $	*/
+/*	$NetBSD: if_mvgbe.c,v 1.3 2010/10/02 05:57:42 kiyohara Exp $	*/
 /*
  * Copyright (c) 2007, 2008 KIYOHARA Takashi
  * All rights reserved.
@@ -25,7 +25,7 @@
  * POSSIBILITY OF SUCH DAMAGE.
  */
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.2 2010/07/11 08:43:36 kiyohara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_mvgbe.c,v 1.3 2010/10/02 05:57:42 kiyohara Exp $");
 
 #include "rnd.h"
 
@@ -180,11 +180,13 @@
 	bus_space_handle_t sc_ioh;
 
 	kmutex_t sc_mtx;
+
+	int sc_fix_tqtb;
 };
 
 struct mvgbe_softc {
 	device_t sc_dev;
-	int sc_port;				/* port num (0 or 1) */
+	int sc_port;
 
 	bus_space_tag_t sc_iot;
 	bus_space_handle_t sc_ioh;
@@ -267,23 +269,39 @@
 
 struct mvgbe_port {
 	int model;
+	int unit;
 	int ports;
-	int irqs[4];
+	int irqs[3];
+	int flags;
+#define FLAGS_FIX_TQTB	(1 << 0)
 } mvgbe_ports[] = {
-	{ MARVELL_DISCOVERY_II,		3, { 32, 33, 34 } },
-	{ MARVELL_DISCOVERY_III,	3, { 32, 33, 34 } },
+	{ MARVELL_DISCOVERY_II,		0, 3, { 32, 33, 34 }, 0 },
+	{ MARVELL_DISCOVERY_III,	0, 3, { 32, 33, 34 }, 0 },
 #if 0
-	{ MARVELL_DISCOVERY_LT,		?, { } },
-	{ MARVELL_DISCOVERY_V,		?, { } },
-	{ MARVELL_DISCOVERY_VI,		?, { } },
+	{ MARVELL_DISCOVERY_LT,		0, ?, { }, 0 },
+	{ MARVELL_DISCOVERY_V,		0, ?, { }, 0 },
+	{ MARVELL_DISCOVERY_VI,		0, ?, { }, 0 },
 #endif
-	{ MARVELL_ORION_1_88F5082,	1, { 21 } },
-	{ MARVELL_ORION_1_88F5180N,	1, { 21 } },
-	{ MARVELL_ORION_1_88F5181,	1, { 21 } },
-	{ MARVELL_ORION_1_88F5182,	1, { 21 } },
-	{ MARVELL_ORION_2_88F5281,	1, { 21 } },
-	{ MARVELL_ORION_1_88F6082,	1, { 21 } },
-	{ MARVELL_ORION_1_88W8660,	1, { 21 } },
+	{ MARVELL_ORION_1_88F5082,	0, 1, { 21 }, 0 },
+	{ MARVELL_ORION_1_88F5180N,	0, 1, { 21 }, 0 },
+	{ MARVELL_ORION_1_88F5181,	0, 1, { 21 }, 0 },
+	{ MARVELL_ORION_1_88F5182,	0, 1, { 21 }, 0 },
+	{ MARVELL_ORION_2_88F5281,	0, 1, { 21 }, 0 },
+	{ MARVELL_ORION_1_88F6082,	0, 1, { 21 }, 0 },
+	{ MARVELL_ORION_1_88W8660,	0, 1, { 21 }, 0 },
+
+	{ MARVELL_KIRKWOOD_88F6180,	0, 1, { 11 }, FLAGS_FIX_TQTB },
+	{ MARVELL_KIRKWOOD_88F6192,	0, 1, { 11 }, FLAGS_FIX_TQTB },
+	{ MARVELL_KIRKWOOD_88F6192,	1, 1, { 14 }, FLAGS_FIX_TQTB },
+	{ MARVELL_KIRKWOOD_88F6281,	0, 1, { 11 }, FLAGS_FIX_TQTB },
+	{ MARVELL_KIRKWOOD_88F6281,	1, 1, { 14 }, FLAGS_FIX_TQTB },
+
+	{ MARVELL_MV78XX0_MV78100,	0, 1, { 40 }, FLAGS_FIX_TQTB },
+	{ MARVELL_MV78XX0_MV78100,	1, 1, { 44 }, FLAGS_FIX_TQTB },
+	{ MARVELL_MV78XX0_MV78200,	0, 1, { 40 }, FLAGS_FIX_TQTB },
+	{ MARVELL_MV78XX0_MV78200,	1, 1, { 44 }, FLAGS_FIX_TQTB },
+	{ MARVELL_MV78XX0_MV78200,	2, 1, { 48 }, FLAGS_FIX_TQTB },
+	{ MARVELL_MV78XX0_MV78200,	3, 1, { 52 }, FLAGS_FIX_TQTB },
 };
 
 
@@ -296,7 +314,6 @@
 
 	if (strcmp(mva->mva_name, match->cf_name) != 0)
 		return 0;
-
 	if (mva->mva_offset == MVA_OFFSET_DEFAULT)
 		return 0;
 
@@ -343,9 +360,12 @@
 
 	memset(&gbea, 0, sizeof(gbea));
 	for (i = 0; i < __arraycount(mvgbe_ports); i++) {
-		if (mvgbe_ports[i].model != mva->mva_model)
+		if (mvgbe_ports[i].model != mva->mva_model ||
+		    mvgbe_ports[i].unit != mva->mva_unit)
 			continue;
 
+		sc->sc_fix_tqtb = mvgbe_ports[i].flags & FLAGS_FIX_TQTB;
+
 		for (j = 0; j < mvgbe_ports[i].ports; j++) {
 			gbea.mva_name = "mvgbe";
 			gbea.mva_model = mva->mva_model;
@@ -362,6 +382,7 @@
 				phyaddr |= MVGBE_PHYADDR_PHYAD(j, mii->mii_phy);
 			}
 		}
+		break;
 	}
 	MVGBE_WRITE(sc, MVGBE_PHYADDR, phyaddr);
 }
@@ -919,8 +940,9 @@
 mvgbe_init(struct ifnet *ifp)
 {
 	struct mvgbe_softc *sc = ifp->if_softc;
+	struct mvgbec_softc *csc = device_private(device_parent(sc->sc_dev));
 	struct mii_data *mii = &sc->sc_mii;
-	uint32_t reg, val;
+	uint32_t reg;
 	int i, s;
 
 	DPRINTFN(2, ("mvgbe_init\n"));
@@ -959,20 +981,33 @@
 	    MVGBE_PSC_FLFAIL |			/* Do NOT Force Link Fail */
 	    MVGBE_PSC_MRU(MVGBE_PSC_MRU_9700) |	/* Always 9700 OK */
 	    MVGBE_PSC_SETFULLDX);		/* Set_FullDx */
+	/* XXXX: mvgbe(4) always use RGMII. */
+	MVGBE_WRITE(sc, MVGBE_PSC1,
+	    MVGBE_READ(sc, MVGBE_PSC1) | MVGBE_PSC1_RGMIIEN);
+	/* XXXX: Also always Weighted Round-Robin Priority Mode */
+	MVGBE_WRITE(sc, MVGBE_TQFPC, MVGBE_TQFPC_EN(0));
 
 	MVGBE_WRITE(sc, MVGBE_CRDP(0), MVGBE_RX_RING_ADDR(sc, 0));
 	MVGBE_WRITE(sc, MVGBE_TCQDP, MVGBE_TX_RING_ADDR(sc, 0));
 
-	val = 0x3fffffff;
-	for (i = 0; i < 8; i++) {
+	if (csc->sc_fix_tqtb) {
 		/*
-		 * Queue 0 must be programmed to 0x3fffffff. Queue 1 through 7
-		 * must be programmed to 0x00000000.
+		 * Queue 0 (offset 0x72700) must be programmed to 0x3fffffff.
+		 * And offset 0x72704 must be programmed to 0x03ffffff.
+		 * Queue 1 through 7 must be programmed to 0x0.
 		 */
-		MVGBE_WRITE(sc, MVGBE_TQTBCOUNT(i), val);
-		MVGBE_WRITE(sc, MVGBE_TQTBCONFIG(i), val);
-		val = 0x00000000;
-	}
+		MVGBE_WRITE(sc, MVGBE_TQTBCOUNT(0), 0x3fffffff);
+		MVGBE_WRITE(sc, MVGBE_TQTBCONFIG(0), 0x03ffffff);
+		for (i = 1; i < 8; i++) {
+			MVGBE_WRITE(sc, MVGBE_TQTBCOUNT(i), 0x0);
+			MVGBE_WRITE(sc, MVGBE_TQTBCONFIG(i), 0x0);
+		}
+	} else
+		for (i = 1; i < 8; i++) {
+			MVGBE_WRITE(sc, MVGBE_TQTBCOUNT(i), 0x3fffffff);
+			MVGBE_WRITE(sc, MVGBE_TQTBCONFIG(i), 0xffff7fff);
+			MVGBE_WRITE(sc, MVGBE_TQAC(i), 0xfc0000ff);
+		}
 
 	MVGBE_WRITE(sc, MVGBE_PXC, MVGBE_PXC_RXCS);
 	MVGBE_WRITE(sc, MVGBE_PXCX, 0);
@@ -1291,7 +1326,7 @@
 	r->bufsize = MVGBE_JLEN & ~MVGBE_BUF_MASK;
 	r->cmdsts = MVGBE_BUFFER_OWNED_BY_DMA | MVGBE_RX_ENABLE_INTERRUPT;
 
-	MVGBE_CDRXSYNC(sc, i, BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
+	MVGBE_CDRXSYNC(sc, i, BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 
 	return 0;
 }
@@ -1554,7 +1589,7 @@
 
 	/* Sync descriptors before handing to chip */
 	MVGBE_CDTXSYNC(sc, *txidx, txmap->dm_nsegs,
-	    BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
+	    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 
 	sc->sc_cdata.mvgbe_tx_cnt += i;
 	*txidx = current;

Index: src/sys/dev/marvell/mvgbereg.h
diff -u src/sys/dev/marvell/mvgbereg.h:1.1 src/sys/dev/marvell/mvgbereg.h:1.2
--- src/sys/dev/marvell/mvgbereg.h:1.1	Wed Jun  2 06:18:11 2010
+++ src/sys/dev/marvell/mvgbereg.h	Sat Oct  2 05:57:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: mvgbereg.h,v 1.1 2010/06/02 06:18:11 kiyohara Exp $	*/
+/*	$NetBSD: mvgbereg.h,v 1.2 2010/10/02 05:57:42 kiyohara Exp $	*/
 /*
  * Copyright (c) 2007 KIYOHARA Takashi
  * All rights reserved.
@@ -76,10 +76,11 @@
 #define MVGBE_MACAH		0x018	/* MAC Address High */
 #define MVGBE_SDC		0x01c	/* SDMA Configuration */
 #define MVGBE_DSCP(n)		(0x020 + ((n) << 2))
-#define MVGBE_PSC		0x03c
+#define MVGBE_PSC		0x03c	/* Port Serial Control0 */
 #define MVGBE_VPT2P		0x040	/* VLAN Priority Tag to Priority */
 #define MVGBE_PS		0x044	/* Ethernet Port Status */
 #define MVGBE_TQC		0x048	/* Transmit Queue Command */
+#define MVGBE_PSC1		0x04c	/* Port Serial Control1 */
 #define MVGBE_MTU		0x058	/* Max Transmit Unit */
 #define MVGBE_IC		0x060	/* Port Interrupt Cause */
 #define MVGBE_ICE		0x064	/* Port Interrupt Cause Extend */
@@ -91,6 +92,7 @@
 #define MVGBE_PXDFC		0x084	/* Port Rx Discard Frame Counter */
 #define MVGBE_POFC		0x088	/* Port Overrun Frame Counter */
 #define MVGBE_PIAE		0x094	/* Port Internal Address Error */
+#define MVGBE_TQFPC		0x0dc	/* Transmit Queue Fixed Priority Cfg */
 #define MVGBE_CRDP(n)		(0x20c + ((n) << 4))
 			/* Ethernet Current Receive Descriptor Pointers */
 #define MVGBE_RQC		0x280	/* Receive Queue Command */
@@ -282,6 +284,11 @@
 #define MVGBE_TQC_ENQ			(1 << 0)	/* Enable Q */
 #define MVGBE_TQC_DISQ			(1 << 8)	/* Disable Q */
 
+/* Port Serial Control 1 (MVGBE_PSC1) */
+#define MVGBE_PSC1_PCSLB		(1 << 1)
+#define MVGBE_PSC1_RGMIIEN		(1 << 3)	/* RGMII */
+#define MVGBE_PSC1_PRST			(1 << 4)	/* Port Reset */
+
 /* Port Interrupt Cause (MVGBE_IC) */
 #define MVGBE_IC_RXBUF			(1 << 0)
 #define MVGBE_IC_EXTEND			(1 << 1)
@@ -307,6 +314,9 @@
 #define MVGBE_PMFS_RXMFS(rxmfs)		(((rxmfs) - 40) & 0x7c)
 					/* RxMFS = 40,44,48,52,56,60,64 bytes */
 
+/* Transmit Queue Fixed Priority Configuration */
+#define MVGBE_TQFPC_EN(q)		(1 << (q))
+
 /* Receive Queue Command (MVGBE_RQC) */
 #define MVGBE_RQC_ENQ_MASK		(0xff << 0)	/* Enable Q */
 #define MVGBE_RQC_ENQ(n)		(1 << (0 + (n)))

Reply via email to