Module Name:    src
Committed By:   matt
Date:           Tue Jul 17 01:36:14 UTC 2012

Modified Files:
        src/sys/arch/evbppc/conf: TWRP1025
        src/sys/arch/evbppc/mpc85xx: machdep.c
        src/sys/arch/powerpc/booke/dev: pq3etsec.c
        src/sys/arch/powerpc/include/booke: e500reg.h etsecreg.h

Log Message:
The ETSEC on the P1025 has been moved/split so the MDIO stayed in the same
place but each ETSEC has been split into two virtual halves (G0 and G1) and
each one has a new different base address.
For some reason, tsec1 connects to phy 2 and tsec2 connects to phy 1.
Adjust config file to match


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/evbppc/conf/TWRP1025
cvs rdiff -u -r1.25 -r1.26 src/sys/arch/evbppc/mpc85xx/machdep.c
cvs rdiff -u -r1.14 -r1.15 src/sys/arch/powerpc/booke/dev/pq3etsec.c
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/powerpc/include/booke/e500reg.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/powerpc/include/booke/etsecreg.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/arch/evbppc/conf/TWRP1025
diff -u src/sys/arch/evbppc/conf/TWRP1025:1.1 src/sys/arch/evbppc/conf/TWRP1025:1.2
--- src/sys/arch/evbppc/conf/TWRP1025:1.1	Sun Jul 15 08:44:56 2012
+++ src/sys/arch/evbppc/conf/TWRP1025	Tue Jul 17 01:36:12 2012
@@ -1,4 +1,4 @@
-#	$NetBSD: TWRP1025,v 1.1 2012/07/15 08:44:56 matt Exp $
+#	$NetBSD: TWRP1025,v 1.2 2012/07/17 01:36:12 matt Exp $
 #
 #	TWRP1025 -- everything that's currently supported
 #
@@ -7,7 +7,7 @@ include		"arch/evbppc/conf/std.mpc85xx"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-ident 		"TWRP1025-$Revision: 1.1 $"
+ident 		"TWRP1025-$Revision: 1.2 $"
 
 maxusers	32
 
@@ -167,8 +167,8 @@ duart*		at cpunode?
 com*		at duart? port ?
 options		CONSADDR="DUART1_BASE"
 
-tsec0		at cpunode? flags 0x002	# Enhanced 3-Speed Ethernet Controller
-tsec1		at cpunode? flags 0x103	# Enhanced 3-Speed Ethernet Controller
+tsec0		at cpunode? instance 1 flags 0x003	# Enhanced 3-Speed Ethernet Controller
+tsec1		at cpunode? instance 3 flags 0x102	# Enhanced 3-Speed Ethernet Controller
 ukphy*		at mii?
 #options 	ETSEC_EVENT_COUNTERS
 

Index: src/sys/arch/evbppc/mpc85xx/machdep.c
diff -u src/sys/arch/evbppc/mpc85xx/machdep.c:1.25 src/sys/arch/evbppc/mpc85xx/machdep.c:1.26
--- src/sys/arch/evbppc/mpc85xx/machdep.c:1.25	Sun Jul 15 08:44:56 2012
+++ src/sys/arch/evbppc/mpc85xx/machdep.c	Tue Jul 17 01:36:12 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: machdep.c,v 1.25 2012/07/15 08:44:56 matt Exp $	*/
+/*	$NetBSD: machdep.c,v 1.26 2012/07/17 01:36:12 matt Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -221,9 +221,23 @@ static const struct cpunode_locators mpc
 		1 + ilog2(DEVDISR_DUART) },
 	{ "tsec", ETSEC1_BASE, ETSEC_SIZE, 1,
 		3, { ISOURCE_ETSEC1_TX, ISOURCE_ETSEC1_RX, ISOURCE_ETSEC1_ERR },
-		1 + ilog2(DEVDISR_TSEC1) },
+		1 + ilog2(DEVDISR_TSEC1),
+		{ 0xffff, SVR_P1025v1 >> 16 } },
+#if defined(P1025)
+	{ "tsec", ETSEC1_G0_BASE, ETSEC_SIZE, 1,
+		3, { ISOURCE_ETSEC1_TX, ISOURCE_ETSEC1_RX, ISOURCE_ETSEC1_ERR },
+		1 + ilog2(DEVDISR_TSEC1),
+		{ SVR_P1025v1 >> 16 } },
+#if 0
+	{ "tsec", ETSEC1_G1_BASE, ETSEC_SIZE, 1,
+		3, { ISOURCE_ETSEC1_G1_TX, ISOURCE_ETSEC1_G1_RX,
+		     ISOURCE_ETSEC1_G1_ERR },
+		1 + ilog2(DEVDISR_TSEC1),
+		{ SVR_P1025v1 >> 16 } },
+#endif
+#endif
 #if defined(MPC8548) || defined(MPC8555) || defined(MPC8572) \
-    || defined(P2020) || defined(P1025)
+    || defined(P2020)
 	{ "tsec", ETSEC2_BASE, ETSEC_SIZE, 2,
 		3, { ISOURCE_ETSEC2_TX, ISOURCE_ETSEC2_RX, ISOURCE_ETSEC2_ERR },
 		1 + ilog2(DEVDISR_TSEC2),
@@ -231,18 +245,44 @@ static const struct cpunode_locators mpc
 		  SVR_MPC8572v1 >> 16, SVR_P2020v2 >> 16,
 		  SVR_P1025v1 >> 16 } },
 #endif
+#if defined(P1025)
+	{ "tsec", ETSEC2_G0_BASE, ETSEC_SIZE, 2,
+		3, { ISOURCE_ETSEC2_TX, ISOURCE_ETSEC2_RX, ISOURCE_ETSEC2_ERR },
+		1 + ilog2(DEVDISR_TSEC2),
+		{ SVR_P1025v1 >> 16 } },
+#if 0
+	{ "tsec", ETSEC2_G1_BASE, ETSEC_SIZE, 5,
+		3, { ISOURCE_ETSEC2_G1_TX, ISOURCE_ETSEC2_G1_RX,
+		     ISOURCE_ETSEC2_G1_ERR },
+		1 + ilog2(DEVDISR_TSEC2),
+		{ SVR_P1025v1 >> 16 } },
+#endif
+#endif
 #if defined(MPC8544) || defined(MPC8536)
 	{ "tsec", ETSEC3_BASE, ETSEC_SIZE, 2,
 		3, { ISOURCE_ETSEC3_TX, ISOURCE_ETSEC3_RX, ISOURCE_ETSEC3_ERR },
 		1 + ilog2(DEVDISR_TSEC3),
 		{ SVR_MPC8536v1 >> 16, SVR_MPC8544v1 >> 16 } },
 #endif
-#if defined(MPC8548) || defined(MPC8572) || defined(P1025) || defined(P2020)
+#if defined(MPC8548) || defined(MPC8572) || defined(P2020)
 	{ "tsec", ETSEC3_BASE, ETSEC_SIZE, 3,
 		3, { ISOURCE_ETSEC3_TX, ISOURCE_ETSEC3_RX, ISOURCE_ETSEC3_ERR },
 		1 + ilog2(DEVDISR_TSEC3),
 		{ SVR_MPC8548v1 >> 16, SVR_MPC8572v1 >> 16,
-		  SVR_P2020v2 >> 16, SVR_P1025v1 >> 16 } },
+		  SVR_P2020v2 >> 16 } },
+#endif
+#if defined(P1025)
+	{ "tsec", ETSEC3_G0_BASE, ETSEC_SIZE, 3,
+		3, { ISOURCE_ETSEC3_TX, ISOURCE_ETSEC3_RX, ISOURCE_ETSEC3_ERR },
+		1 + ilog2(DEVDISR_TSEC3),
+		{ SVR_P1025v1 >> 16 } },
+#if 0
+	{ "tsec", ETSEC3_G1_BASE, ETSEC_SIZE, 3,
+		3, { ISOURCE_ETSEC3_G1_TX, ISOURCE_ETSEC3_G1_RX,
+		     ISOURCE_ETSEC3_G1_ERR },
+		1 + ilog2(DEVDISR_TSEC3),
+		{ SVR_P1025v1 >> 16 } },
+#endif
 #endif
 #if defined(MPC8548) || defined(MPC8572)
 	{ "tsec", ETSEC4_BASE, ETSEC_SIZE, 4,

Index: src/sys/arch/powerpc/booke/dev/pq3etsec.c
diff -u src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.14 src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.15
--- src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.14	Sun Jul 15 08:44:56 2012
+++ src/sys/arch/powerpc/booke/dev/pq3etsec.c	Tue Jul 17 01:36:13 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: pq3etsec.c,v 1.14 2012/07/15 08:44:56 matt Exp $	*/
+/*	$NetBSD: pq3etsec.c,v 1.15 2012/07/17 01:36:13 matt Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -35,10 +35,11 @@
  */
 
 #include "opt_inet.h"
+#include "opt_mpc85xx.h"
 
 #include <sys/cdefs.h>
 
-__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.14 2012/07/15 08:44:56 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.15 2012/07/17 01:36:13 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/cpu.h>
@@ -170,6 +171,7 @@ struct pq3etsec_softc {
 	struct mii_data sc_mii;
 	bus_space_tag_t sc_bst;
 	bus_space_handle_t sc_bsh;
+	bus_space_handle_t sc_mdio_bsh;
 	bus_dma_tag_t sc_dmat;
 	int sc_phy_addr;
 	prop_dictionary_t sc_intrmap;
@@ -303,6 +305,18 @@ etsec_write(struct pq3etsec_softc *sc, b
 	bus_space_write_4(sc->sc_bst, sc->sc_bsh, off, data);
 }
 
+static inline uint32_t
+etsec_mdio_read(struct pq3etsec_softc *sc, bus_size_t off)
+{
+	return bus_space_read_4(sc->sc_bst, sc->sc_mdio_bsh, off);
+}
+
+static inline void
+etsec_mdio_write(struct pq3etsec_softc *sc, bus_size_t off, uint32_t data)
+{
+	bus_space_write_4(sc->sc_bst, sc->sc_mdio_bsh, off, data);
+}
+
 static int
 pq3etsec_mii_readreg(device_t self, int phy, int reg)
 {
@@ -311,24 +325,24 @@ pq3etsec_mii_readreg(device_t self, int 
 
 //	int s = splnet();
 
-	etsec_write(sc, MIIMADD,
+	etsec_mdio_write(sc, MIIMADD,
 	    __SHIFTIN(phy, MIIMADD_PHY) | __SHIFTIN(reg, MIIMADD_REG));
 
 	etsec_write(sc, IEVENT, IEVENT_MMRD);
-	etsec_write(sc, MIIMCOM, 0);	/* clear any past bits */
-	etsec_write(sc, MIIMCOM, MIIMCOM_READ);
+	etsec_mdio_write(sc, MIIMCOM, 0);	/* clear any past bits */
+	etsec_mdio_write(sc, MIIMCOM, MIIMCOM_READ);
 #if 0
 	sc->sc_imask |= IEVENT_MMRD;
 	etsec_write(sc, IMASK, sc->sc_imask);
 #endif
 
-	while (etsec_read(sc, MIIMIND) != 0) {
+	while (etsec_mdio_read(sc, MIIMIND) != 0) {
 			delay(1);
 	}
-	int data = etsec_read(sc, MIIMSTAT);
+	int data = etsec_mdio_read(sc, MIIMSTAT);
 
 	if (miimcom == MIIMCOM_SCAN)
-		etsec_write(sc, MIIMCOM, miimcom);
+		etsec_mdio_write(sc, MIIMCOM, miimcom);
 
 #if 0
 	aprint_normal_dev(sc->sc_dev, "%s: phy %d reg %d: %#x\n",
@@ -343,7 +357,7 @@ static void
 pq3etsec_mii_writereg(device_t self, int phy, int reg, int data)
 {
 	struct pq3etsec_softc * const sc = device_private(self);
-	uint32_t miimcom = etsec_read(sc, MIIMCOM);
+	uint32_t miimcom = etsec_mdio_read(sc, MIIMCOM);
 
 #if 0
 	aprint_normal_dev(sc->sc_dev, "%s: phy %d reg %d: %#x\n",
@@ -352,10 +366,10 @@ pq3etsec_mii_writereg(device_t self, int
 
 //	int s = splnet();
 	etsec_write(sc, IEVENT, IEVENT_MMWR);
-	etsec_write(sc, MIIMADD,
+	etsec_mdio_write(sc, MIIMADD,
 	    __SHIFTIN(phy, MIIMADD_PHY) | __SHIFTIN(reg, MIIMADD_REG));
-	etsec_write(sc, MIIMCOM, 0);	/* clear any past bits */
-	etsec_write(sc, MIIMCON, data);
+	etsec_mdio_write(sc, MIIMCOM, 0);	/* clear any past bits */
+	etsec_mdio_write(sc, MIIMCON, data);
 
 #if 0
 	sc->sc_imask |= IEVENT_MMWR;
@@ -363,12 +377,12 @@ pq3etsec_mii_writereg(device_t self, int
 #endif
 
 	int timo = 1000;	/* 1ms */
-	while ((etsec_read(sc, MIIMIND) & MIIMIND_BUSY) && --timo > 0) {
+	while ((etsec_mdio_read(sc, MIIMIND) & MIIMIND_BUSY) && --timo > 0) {
 			delay(1);
 	}
 
 	if (miimcom == MIIMCOM_SCAN)
-		etsec_write(sc, MIIMCOM, miimcom);
+		etsec_mdio_write(sc, MIIMCOM, miimcom);
 	etsec_write(sc, IEVENT, IEVENT_MMWR);
 //	splx(s);
 }
@@ -453,6 +467,50 @@ pq3etsec_mediachange(struct ifnet *ifp)
 }
 #endif
 
+
+static const struct {
+	bus_addr_t reg_base;
+	bus_addr_t mdio_base;
+} etsec_mdio_map[] = {
+	{ ETSEC1_BASE, ETSEC1_BASE },
+	{ ETSEC2_BASE, ETSEC2_BASE },
+	{ ETSEC3_BASE, ETSEC3_BASE },
+	{ ETSEC4_BASE, ETSEC4_BASE },
+#if defined(P1025)
+	{ ETSEC1_G0_BASE, ETSEC1_BASE },
+	{ ETSEC1_G1_BASE, ETSEC1_BASE },
+	{ ETSEC2_G0_BASE, ETSEC2_BASE },
+	{ ETSEC2_G1_BASE, ETSEC2_BASE },
+	{ ETSEC3_G0_BASE, ETSEC3_BASE },
+	{ ETSEC3_G1_BASE, ETSEC3_BASE },
+#endif
+};
+
+static bool
+pq3etsec_mdio_map(struct pq3etsec_softc *sc, bus_addr_t reg_base,
+	bus_addr_t *mdio_basep)
+{
+	*mdio_basep = 0;
+	for (size_t i = 0; i < __arraycount(etsec_mdio_map); i++) {
+		if (etsec_mdio_map[i].reg_base == reg_base) {
+			bus_addr_t mdio_base = etsec_mdio_map[i].mdio_base;
+			if (mdio_base == reg_base) {
+				sc->sc_mdio_bsh = sc->sc_bsh;
+				return true;
+			}
+			if (!bus_space_map(sc->sc_bst,
+					mdio_base,
+					ETSEC_SIZE, 0, &sc->sc_mdio_bsh)) {
+				return true;
+			}
+			*mdio_basep = mdio_base;
+			break;
+		}
+	}
+
+	return false;
+}
+
 static void
 pq3etsec_attach(device_t parent, device_t self, void *aux)
 {
@@ -462,6 +520,7 @@ pq3etsec_attach(device_t parent, device_
 	struct cpunode_locators * const cnl = &cna->cna_locs;
 	cfdata_t cf = device_cfdata(self);
 	int error;
+	bus_addr_t mdio_base;
 
 	psc->sc_children |= cna->cna_childmask;
 	sc->sc_dev = self;
@@ -494,6 +553,12 @@ pq3etsec_attach(device_t parent, device_
 		return;
 	}
 
+	if (!pq3etsec_mdio_map(sc, cnl->cnl_addr, &mdio_base)) {
+		aprint_error(": error mapping mdio registers @ %#x\n",
+		    mdio_base);
+		return;
+	}
+
 	/*
 	 * Assume firmware has aready set the mac address and fetch it
 	 * before we reinit it.

Index: src/sys/arch/powerpc/include/booke/e500reg.h
diff -u src/sys/arch/powerpc/include/booke/e500reg.h:1.11 src/sys/arch/powerpc/include/booke/e500reg.h:1.12
--- src/sys/arch/powerpc/include/booke/e500reg.h:1.11	Sun Jul 15 08:44:56 2012
+++ src/sys/arch/powerpc/include/booke/e500reg.h	Tue Jul 17 01:36:13 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: e500reg.h,v 1.11 2012/07/15 08:44:56 matt Exp $	*/
+/*	$NetBSD: e500reg.h,v 1.12 2012/07/17 01:36:13 matt Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -333,6 +333,12 @@
 #define	ETSEC2_BASE	0x25000
 #define	ETSEC3_BASE	0x26000
 #define	ETSEC4_BASE	0x27000
+#define	ETSEC1_G0_BASE	0xB0000
+#define	ETSEC2_G0_BASE	0xB1000
+#define	ETSEC3_G0_BASE	0xB2000
+#define	ETSEC1_G1_BASE	0xB4000
+#define	ETSEC2_G1_BASE	0xB5000
+#define	ETSEC3_G1_BASE	0xB6000
 #define	ETSEC_SIZE	0x01000
 
 #define	ESDHC_BASE	0x2e000

Index: src/sys/arch/powerpc/include/booke/etsecreg.h
diff -u src/sys/arch/powerpc/include/booke/etsecreg.h:1.4 src/sys/arch/powerpc/include/booke/etsecreg.h:1.5
--- src/sys/arch/powerpc/include/booke/etsecreg.h:1.4	Mon May  7 23:04:22 2012
+++ src/sys/arch/powerpc/include/booke/etsecreg.h	Tue Jul 17 01:36:13 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: etsecreg.h,v 1.4 2012/05/07 23:04:22 matt Exp $	*/
+/*	$NetBSD: etsecreg.h,v 1.5 2012/07/17 01:36:13 matt Exp $	*/
 /*-
  * Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -151,6 +151,7 @@ struct rxfcb {
 #define	IEVENT_PERR	__PPCBIT(31)	/* Receive parse error for TOE */
 #define	IMASK		0x014	/* Interrupt mask register */
 #define	EDIS		0x018	/* error disabled register */
+#define	EMAPG		0x01c	/* group eror mapping register */
 #define	ECNTRL		0x020	/* ethernet control register */
 #define	ECNTRL_FIFM	__PPCBIT(16)	/* FIFO mode enable */
 #define	ECNTRL_CLRCNT	__PPCBIT(17)	/* Clear all MIB counters */

Reply via email to