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 */