Split mdio/mii access into its own "device" and update accordingly.

(on the P1025 the mdio functionality is separate from the etsec functions).
Provide locking for mii access.
This commit is contained in:
matt 2012-07-22 23:46:10 +00:00
parent b017b8c719
commit 20d6accb8c
9 changed files with 267 additions and 192 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: MPC8536DS,v 1.10 2011/12/18 05:49:26 dholland Exp $
# $NetBSD: MPC8536DS,v 1.11 2012/07/22 23:46:10 matt Exp $
#
# MPC8536DS -- 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 "MPC8536DS-$Revision: 1.10 $"
ident "MPC8536DS-$Revision: 1.11 $"
maxusers 32
@ -163,8 +163,9 @@ com* at duart? port ?
options CONSPEED=9600
options CONSADDR="DUART1_BASE"
tsec0 at cpunode? flags 0x002 # Enhanced 3-Speed Ethernet Controller
tsec1 at cpunode? flags 0x101 # Enhanced 3-Speed Ethernet Controller
tsec0 at cpunode? phy 1 # Enhanced 3-Speed Ethernet Controller
mdio0 at tsec0
tsec1 at cpunode? mdio 0 phy 0 # Enhanced 3-Speed Ethernet Controller
ciphy* at mii? # Cicada PHY
ukphy* at mii?
#options ETSEC_EVENT_COUNTERS

View File

@ -1,4 +1,4 @@
# $NetBSD: MPC8548CDS,v 1.9 2011/12/18 05:49:26 dholland Exp $
# $NetBSD: MPC8548CDS,v 1.10 2012/07/22 23:46:10 matt Exp $
#
# MPC8548CDS -- 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 "MPC8548CDS-$Revision: 1.9 $"
ident "MPC8548CDS-$Revision: 1.10 $"
maxusers 32
@ -157,8 +157,9 @@ duart* at cpunode?
com* at duart? port ?
options CONSPEED=115200
tsec0 at cpunode? flags 1 # Enhanced 3-Speed Ethernet Controller
tsec1 at cpunode? flags 1 # Enhanced 3-Speed Ethernet Controller
tsec0 at cpunode? phy 0 # Enhanced 3-Speed Ethernet Controller
mdio0 at tsec0
tsec1 at cpunode? mdio 0 phy 1 # Enhanced 3-Speed Ethernet Controller
makphy* at mii? # Marvell PHY
ukphy* at mii?
#options ETSEC_EVENT_COUNTERS

View File

@ -1,4 +1,4 @@
# $NetBSD: P2020DS,v 1.11 2011/12/18 05:49:26 dholland Exp $
# $NetBSD: P2020DS,v 1.12 2012/07/22 23:46:10 matt Exp $
#
# P2020DS -- everything that's currently supported
#
@ -8,7 +8,7 @@ include "arch/evbppc/conf/std.mpc85xx"
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
ident "P2020DS-$Revision: 1.11 $"
ident "P2020DS-$Revision: 1.12 $"
maxusers 32
@ -20,13 +20,16 @@ options PIXIS
#options SYS_CLK=100000000
#options HZ=1000
#options MEMSIZE=0x40000000
#options PMAP_MINIMALTLB
#makeoptions KERNLDSCRIPT="${POWERPC}/conf/kern-mb.ldscript"
makeoptions NEED_BINARY="yes"
makeoptions NEED_UBOOTIMAGE="yes"
#options INSECURE # disable kernel security levels
options INSECURE # disable kernel security levels
#options NTP # NTP phase/frequency locked loop
options KTRACE # system call tracing via ktrace(1)
options MODULAR # new style module(7) framework
options SYSVMSG # System V message queues
options SYSVSEM # System V semaphores
@ -43,7 +46,7 @@ options DEBUG # expensive debugging checks/support
options DDB # in-kernel debugger
options DDB_HISTORY_SIZE=512 # enable history editing in DDB
options TRAP_PANICWAIT
options SYMTAB_SPACE=410000 # size for embedded symbol table
options SYMTAB_SPACE=425000 # size for embedded symbol table
makeoptions DEBUG="-g" # compile full symbol table
@ -78,7 +81,7 @@ file-system TMPFS # efficient memory file system
file-system KERNFS # /kern
file-system NULLFS # loopback file system
#file-system OVERLAY # overlay file system
#file-system PUFFS # Userspace file systems (e.g. ntfs-3g & sshfs)
file-system PUFFS # Userspace file systems (e.g. ntfs-3g & sshfs)
file-system PROCFS # /proc
#file-system UMAPFS # NULLFS + uid and gid remapping
#file-system UNION # union file system
@ -102,7 +105,7 @@ options INET # IP + ICMP + TCP + UDP
options INET_CSUM_COUNTERS
options TCP_CSUM_COUNTERS
options UDP_CSUM_COUNTERS
#options INET6 # IPV6
options INET6 # IPV6
#options IPSEC # IP security
#options IPSEC_ESP # IP security (encryption part; define w/IPSEC)
#options IPSEC_NAT_T # IPsec NAT traversal (NAT-T)
@ -167,9 +170,10 @@ com* at duart? port ?
options CONSPEED=115200
options CONSADDR="DUART1_BASE"
tsec0 at cpunode? flags 0x001 # Enhanced 3-Speed Ethernet Controller
tsec1 at cpunode? flags 0x102 # Enhanced 3-Speed Ethernet Controller
tsec2 at cpunode? flags 0x103 # Enhanced 3-Speed Ethernet Controller
tsec0 at cpunode? phy 0 # Enhanced 3-Speed Ethernet Controller
mdio0 at tsec0
tsec1 at cpunode? mdio 0 phy 1 # Enhanced 3-Speed Ethernet Controller
tsec2 at cpunode? mdio 0 phy 2 # Enhanced 3-Speed Ethernet Controller
options ETSEC_EVENT_COUNTERS
ehci* at cpunode? # usb
@ -177,7 +181,7 @@ ehci* at cpunode? # usb
diic* at cpunode? # i2c bus
iic* at diic?
spdmem* at iic0 addr 0x51 # DDR
dsrtc* at iic1 addr 0x68 # RTC
dsrtc* at iic1 addr 0x68 flags 3232 # RTC - DS3232
pq3pcie* at cpunode? # PCI-Express controller
pq3pci* at cpunode? # PCI(X)
@ -233,3 +237,5 @@ pseudo-device ksyms # /dev/ksyms
pseudo-device pty # pseudo-terminals
pseudo-device kttcp # kernel ttcp
pseudo-device vlan # 802.1Q VLANs
pseudo-device putter # for puffs and pud
pseudo-device vnd # disk-like interface to files

View File

@ -1,4 +1,4 @@
# $NetBSD: P2020RDB,v 1.12 2011/12/18 05:49:26 dholland Exp $
# $NetBSD: P2020RDB,v 1.13 2012/07/22 23:46:10 matt Exp $
#
# P2020RBD -- 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 "P2020RBD-$Revision: 1.12 $"
ident "P2020RBD-$Revision: 1.13 $"
maxusers 32
@ -21,6 +21,8 @@ options P2020
options SYS_CLK=100000000
#options HZ=1000
#options SDHC_DEBUG
#options INSECURE # disable kernel security levels
#options NTP # NTP phase/frequency locked loop
options KTRACE # system call tracing via ktrace(1)
@ -165,15 +167,16 @@ duart* at cpunode?
com* at duart? port ?
options CONSADDR="DUART1_BASE"
tsec0 at cpunode? flags 0x021 # Enhanced 3-Speed Ethernet Controller
tsec1 at cpunode? flags 0x101 # Enhanced 3-Speed Ethernet Controller
tsec2 at cpunode? flags 0x102 # Enhanced 3-Speed Ethernet Controller
tsec0 at cpunode? phy 32 # Enhanced 3-Speed Ethernet Controller
mdio0 at tsec0
tsec1 at cpunode? mdio 0 phy 0 # Enhanced 3-Speed Ethernet Controller
tsec2 at cpunode? mdio 0 phy 1 # Enhanced 3-Speed Ethernet Controller
ukphy* at mii?
#options ETSEC_EVENT_COUNTERS
diic* at cpunode? # i2c bus
iic* at diic?
dsrtc* at iic1 addr 0x68 # RTC
dsrtc* at iic1 addr 0x68 flags 1339 # RTC DS1339
pq3pcie* at cpunode? # PCI-Express controller
pq3pci* at cpunode? # PCI(X)
@ -194,9 +197,9 @@ umass* at uhub? port ?
scsibus* at umass? channel ?
sd* at scsibus? target ? lun ?
#sdhc* at cpunode? # sdmmc
#sdmmc* at sdhc? # SD/MMC bus
#ld* at sdmmc?
sdhc* at cpunode? # sdmmc
sdmmc* at sdhc? # SD/MMC bus
ld* at sdmmc?
#siisata* at pci? dev ? function ?
#atabus* at siisata? channel ?

View File

@ -1,4 +1,4 @@
# $NetBSD: RB800,v 1.16 2012/01/19 23:37:23 matt Exp $
# $NetBSD: RB800,v 1.17 2012/07/22 23:46:10 matt Exp $
#
# RB800 -- 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 "RB800-$Revision: 1.16 $"
ident "RB800-$Revision: 1.17 $"
maxusers 32
@ -169,8 +169,9 @@ com* at duart? port ?
options CONSPEED=115200
options CONSADDR="DUART1_BASE"
tsec0 at cpunode? flags 0x003 # 3-Speed Ethernet Controller (phy 2)
tsec1 at cpunode? flags 0x102 # 3-Speed Ethernet Controller (phy 1)
tsec0 at cpunode? phy 2 # 3-Speed Ethernet Controller (phy 2)
mdio0 at tsec0
tsec1 at cpunode? mdio 0 phy 1 # 3-Speed Ethernet Controller (phy 1)
atphy* at mii? # Attansic PHY
ukphy* at mii?
#options TSEC_EVENT_COUNTERS

View File

@ -1,4 +1,4 @@
# $NetBSD: TWRP1025,v 1.4 2012/07/18 19:39:54 matt Exp $
# $NetBSD: TWRP1025,v 1.5 2012/07/22 23:46:10 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.4 $"
ident "TWRP1025-$Revision: 1.5 $"
maxusers 32
@ -21,8 +21,6 @@ options P1025
options SYS_CLK=66666667
#options HZ=1000
#options SDHC_DEBUG
#options INSECURE # disable kernel security levels
#options NTP # NTP phase/frequency locked loop
options KTRACE # system call tracing via ktrace(1)
@ -171,8 +169,10 @@ duart* at cpunode?
com* at duart? port ?
options CONSADDR="DUART1_BASE"
tsec0 at cpunode? instance 1 flags 0x003 # Enhanced 3-Speed Ethernet Controller
tsec1 at cpunode? instance 3 flags 0x102 # Enhanced 3-Speed Ethernet Controller
mdio0 at cpunode? instance 1
tsec0 at cpunode? instance 1 mdio 0 phy 2 # Enhanced 3-Speed Ethernet Controller
tsec1 at cpunode? instance 3 mdio 0 phy 1 # Enhanced 3-Speed Ethernet Controller
atphy* at mii?
ukphy* at mii?
#options ETSEC_EVENT_COUNTERS
@ -198,6 +198,8 @@ umass* at uhub? port ?
scsibus* at umass? channel ?
sd* at scsibus? target ? lun ?
#options SDHC_DEBUG
#options SDMMC_DEBUG
sdhc* at cpunode? # sdmmc
sdmmc* at sdhc? # SD/MMC bus
ld* at sdmmc?

View File

@ -1,4 +1,4 @@
/* $NetBSD: machdep.c,v 1.27 2012/07/18 19:38:26 matt Exp $ */
/* $NetBSD: machdep.c,v 1.28 2012/07/22 23:46:10 matt Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@ -224,6 +224,10 @@ static const struct cpunode_locators mpc8548_cpunode_locs[] = {
1 + ilog2(DEVDISR_TSEC1),
{ 0xffff, SVR_P1025v1 >> 16 } },
#if defined(P1025)
{ "mdio", ETSEC1_BASE, ETSEC_SIZE, 1,
0, { },
1 + ilog2(DEVDISR_TSEC1),
{ SVR_P1025v1 >> 16 } },
{ "tsec", ETSEC1_G0_BASE, ETSEC_SIZE, 1,
3, { ISOURCE_ETSEC1_TX, ISOURCE_ETSEC1_RX, ISOURCE_ETSEC1_ERR },
1 + ilog2(DEVDISR_TSEC1),
@ -246,6 +250,10 @@ static const struct cpunode_locators mpc8548_cpunode_locs[] = {
SVR_P1025v1 >> 16 } },
#endif
#if defined(P1025)
{ "mdio", ETSEC2_BASE, ETSEC_SIZE, 2,
0, { },
1 + ilog2(DEVDISR_TSEC2),
{ SVR_P1025v1 >> 16 } },
{ "tsec", ETSEC2_G0_BASE, ETSEC_SIZE, 2,
3, { ISOURCE_ETSEC2_TX, ISOURCE_ETSEC2_RX, ISOURCE_ETSEC2_ERR },
1 + ilog2(DEVDISR_TSEC2),
@ -272,6 +280,10 @@ static const struct cpunode_locators mpc8548_cpunode_locs[] = {
SVR_P2020v2 >> 16 } },
#endif
#if defined(P1025)
{ "mdio", ETSEC3_BASE, ETSEC_SIZE, 3,
0, { },
1 + ilog2(DEVDISR_TSEC3),
{ SVR_P1025v1 >> 16 } },
{ "tsec", ETSEC3_G0_BASE, ETSEC_SIZE, 3,
3, { ISOURCE_ETSEC3_TX, ISOURCE_ETSEC3_RX, ISOURCE_ETSEC3_ERR },
1 + ilog2(DEVDISR_TSEC3),

View File

@ -1,4 +1,4 @@
/* $NetBSD: pq3etsec.c,v 1.15 2012/07/17 01:36:13 matt Exp $ */
/* $NetBSD: pq3etsec.c,v 1.16 2012/07/22 23:46:10 matt Exp $ */
/*-
* Copyright (c) 2010, 2011 The NetBSD Foundation, Inc.
* All rights reserved.
@ -39,7 +39,7 @@
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.15 2012/07/17 01:36:13 matt Exp $");
__KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.16 2012/07/22 23:46:10 matt Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
@ -61,8 +61,6 @@ __KERNEL_RCSID(0, "$NetBSD: pq3etsec.c,v 1.15 2012/07/17 01:36:13 matt Exp $");
#include <dev/mii/miivar.h>
#include "ioconf.h"
#include <net/bpf.h>
#ifdef INET
@ -166,6 +164,7 @@ struct pq3etsec_mapcache {
struct pq3etsec_softc {
device_t sc_dev;
device_t sc_mdio_dev;
struct ethercom sc_ec;
#define sc_if sc_ec.ec_if
struct mii_data sc_mii;
@ -232,9 +231,21 @@ struct pq3etsec_softc {
struct pq3etsec_mapcache *sc_tx_mapcache;
};
struct pq3mdio_softc {
device_t mdio_dev;
kmutex_t *mdio_lock;
bus_space_tag_t mdio_bst;
bus_space_handle_t mdio_bsh;
};
static int pq3etsec_match(device_t, cfdata_t, void *);
static void pq3etsec_attach(device_t, device_t, void *);
static int pq3mdio_match(device_t, cfdata_t, void *);
static void pq3mdio_attach(device_t, device_t, void *);
static void pq3etsec_ifstart(struct ifnet *);
static void pq3etsec_ifwatchdog(struct ifnet *);
static int pq3etsec_ifinit(struct ifnet *);
@ -283,14 +294,22 @@ static void pq3etsec_soft_intr(void *);
CFATTACH_DECL_NEW(pq3etsec, sizeof(struct pq3etsec_softc),
pq3etsec_match, pq3etsec_attach, NULL, NULL);
static int
pq3etsec_match(device_t parent, cfdata_t cf, void *aux)
CFATTACH_DECL_NEW(pq3mdio_tsec, sizeof(struct pq3mdio_softc),
pq3mdio_match, pq3mdio_attach, NULL, NULL);
CFATTACH_DECL_NEW(pq3mdio_cpunode, sizeof(struct pq3mdio_softc),
pq3mdio_match, pq3mdio_attach, NULL, NULL);
static inline uint32_t
etsec_mdio_read(struct pq3mdio_softc *mdio, bus_size_t off)
{
return bus_space_read_4(mdio->mdio_bst, mdio->mdio_bsh, off);
}
if (!e500_cpunode_submatch(parent, cf, cf->cf_name, aux))
return 0;
return 1;
static inline void
etsec_mdio_write(struct pq3mdio_softc *mdio, bus_size_t off, uint32_t data)
{
bus_space_write_4(mdio->mdio_bst, mdio->mdio_bsh, off, data);
}
static inline uint32_t
@ -299,98 +318,145 @@ etsec_read(struct pq3etsec_softc *sc, bus_size_t off)
return bus_space_read_4(sc->sc_bst, sc->sc_bsh, off);
}
static int
pq3mdio_find(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
{
return strcmp(cf->cf_name, "mdio") == 0;
}
static int
pq3mdio_match(device_t parent, cfdata_t cf, void *aux)
{
const uint16_t svr = (mfspr(SPR_SVR) & ~0x80000) >> 16;
const bool p1025_p = (svr == (SVR_P1025v1 >> 16)
|| svr == (SVR_P1016v1 >> 16));
if (device_is_a(parent, "cpunode")) {
if (!p1025_p
|| !e500_cpunode_submatch(parent, cf, cf->cf_name, aux))
return 0;
return 1;
}
if (device_is_a(parent, "tsec")) {
if (p1025_p
|| !e500_cpunode_submatch(parent, cf, cf->cf_name, aux))
return 0;
return 1;
}
return 0;
}
static void
pq3mdio_attach(device_t parent, device_t self, void *aux)
{
struct pq3mdio_softc * const mdio = device_private(self);
struct cpunode_attach_args * const cna = aux;
struct cpunode_locators * const cnl = &cna->cna_locs;
mdio->mdio_dev = self;
mdio->mdio_lock = mutex_obj_alloc(MUTEX_DEFAULT, IPL_SOFTNET);
if (device_is_a(parent, "cpunode")) {
struct cpunode_softc * const psc = device_private(parent);
psc->sc_children |= cna->cna_childmask;
mdio->mdio_bst = cna->cna_memt;
if (bus_space_map(mdio->mdio_bst, cnl->cnl_addr,
cnl->cnl_size, 0, &mdio->mdio_bsh) != 0) {
aprint_error(": error mapping registers @ %#x\n",
cnl->cnl_addr);
return;
}
} else {
struct pq3etsec_softc * const sc = device_private(parent);
KASSERT(device_is_a(parent, "tsec"));
KASSERTMSG(cnl->cnl_addr == ETSEC1_BASE
|| cnl->cnl_addr == ETSEC2_BASE
|| cnl->cnl_addr == ETSEC3_BASE
|| cnl->cnl_addr == ETSEC4_BASE,
"unknown tsec addr %x", cnl->cnl_addr);
mdio->mdio_bst = sc->sc_bst;
mdio->mdio_bsh = sc->sc_bsh;
}
aprint_normal("\n");
}
static int
pq3mdio_mii_readreg(device_t self, int phy, int reg)
{
struct pq3mdio_softc * const mdio = device_private(self);
uint32_t miimcom = etsec_mdio_read(mdio, MIIMCOM);
mutex_enter(mdio->mdio_lock);
etsec_mdio_write(mdio, MIIMADD,
__SHIFTIN(phy, MIIMADD_PHY) | __SHIFTIN(reg, MIIMADD_REG));
etsec_mdio_write(mdio, MIIMCOM, 0); /* clear any past bits */
etsec_mdio_write(mdio, MIIMCOM, MIIMCOM_READ);
while (etsec_mdio_read(mdio, MIIMIND) != 0) {
delay(1);
}
int data = etsec_mdio_read(mdio, MIIMSTAT);
if (miimcom == MIIMCOM_SCAN)
etsec_mdio_write(mdio, MIIMCOM, miimcom);
#if 0
aprint_normal_dev(mdio->mdio_dev, "%s: phy %d reg %d: %#x\n",
__func__, phy, reg, data);
#endif
mutex_exit(mdio->mdio_lock);
return data;
}
static void
pq3mdio_mii_writereg(device_t self, int phy, int reg, int data)
{
struct pq3mdio_softc * const mdio = device_private(self);
uint32_t miimcom = etsec_mdio_read(mdio, MIIMCOM);
#if 0
aprint_normal_dev(mdio->mdio_dev, "%s: phy %d reg %d: %#x\n",
__func__, phy, reg, data);
#endif
mutex_enter(mdio->mdio_lock);
etsec_mdio_write(mdio, MIIMADD,
__SHIFTIN(phy, MIIMADD_PHY) | __SHIFTIN(reg, MIIMADD_REG));
etsec_mdio_write(mdio, MIIMCOM, 0); /* clear any past bits */
etsec_mdio_write(mdio, MIIMCON, data);
int timo = 1000; /* 1ms */
while ((etsec_mdio_read(mdio, MIIMIND) & MIIMIND_BUSY) && --timo > 0) {
delay(1);
}
if (miimcom == MIIMCOM_SCAN)
etsec_mdio_write(mdio, MIIMCOM, miimcom);
mutex_exit(mdio->mdio_lock);
}
static inline void
etsec_write(struct pq3etsec_softc *sc, bus_size_t off, uint32_t data)
{
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)
{
struct pq3etsec_softc * const sc = device_private(self);
uint32_t miimcom = etsec_read(sc, MIIMCOM);
// int s = splnet();
etsec_mdio_write(sc, MIIMADD,
__SHIFTIN(phy, MIIMADD_PHY) | __SHIFTIN(reg, MIIMADD_REG));
etsec_write(sc, IEVENT, IEVENT_MMRD);
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_mdio_read(sc, MIIMIND) != 0) {
delay(1);
}
int data = etsec_mdio_read(sc, MIIMSTAT);
if (miimcom == MIIMCOM_SCAN)
etsec_mdio_write(sc, MIIMCOM, miimcom);
#if 0
aprint_normal_dev(sc->sc_dev, "%s: phy %d reg %d: %#x\n",
__func__, phy, reg, data);
#endif
etsec_write(sc, IEVENT, IEVENT_MMRD);
// splx(s);
return data;
}
static void
pq3etsec_mii_writereg(device_t self, int phy, int reg, int data)
pq3etsec_mii_statchg(struct ifnet *ifp)
{
struct pq3etsec_softc * const sc = device_private(self);
uint32_t miimcom = etsec_mdio_read(sc, MIIMCOM);
#if 0
aprint_normal_dev(sc->sc_dev, "%s: phy %d reg %d: %#x\n",
__func__, phy, reg, data);
#endif
// int s = splnet();
etsec_write(sc, IEVENT, IEVENT_MMWR);
etsec_mdio_write(sc, MIIMADD,
__SHIFTIN(phy, MIIMADD_PHY) | __SHIFTIN(reg, MIIMADD_REG));
etsec_mdio_write(sc, MIIMCOM, 0); /* clear any past bits */
etsec_mdio_write(sc, MIIMCON, data);
#if 0
sc->sc_imask |= IEVENT_MMWR;
etsec_write(sc, IMASK, sc->sc_imask);
#endif
int timo = 1000; /* 1ms */
while ((etsec_mdio_read(sc, MIIMIND) & MIIMIND_BUSY) && --timo > 0) {
delay(1);
}
if (miimcom == MIIMCOM_SCAN)
etsec_mdio_write(sc, MIIMCOM, miimcom);
etsec_write(sc, IEVENT, IEVENT_MMWR);
// splx(s);
}
static void
pq3etsec_mii_statchg(device_t self)
{
struct pq3etsec_softc * const sc = device_private(self);
struct pq3etsec_softc * const sc = ifp->if_softc;
struct mii_data * const mii = &sc->sc_mii;
uint32_t maccfg1 = sc->sc_maccfg1;
@ -467,48 +533,14 @@ 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)
static int
pq3etsec_match(device_t parent, cfdata_t cf, void *aux)
{
*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;
if (!e500_cpunode_submatch(parent, cf, cf->cf_name, aux))
return 0;
return 1;
}
static void
@ -520,7 +552,6 @@ pq3etsec_attach(device_t parent, device_t self, void *aux)
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;
@ -528,15 +559,18 @@ pq3etsec_attach(device_t parent, device_t self, void *aux)
sc->sc_dmat = &booke_bus_dma_tag;
/*
* If we have a common MDIO bus, if all off instance 1.
* Pull out the mdio bus and phy we are supposed to use.
*/
device_t miiself = (cf->cf_flags & 0x100) ? tsec_cd.cd_devs[0] : self;
const int mdio = cf->cf_loc[CPUNODECF_MDIO];
const int phy = cf->cf_loc[CPUNODECF_PHY];
if (mdio != CPUNODECF_MDIO_DEFAULT)
aprint_normal(" mdio %d", mdio);
/*
* See if the phy is in the config file...
*/
if (cf->cf_flags & 0x3f) {
sc->sc_phy_addr = (cf->cf_flags & 0x3f) - 1;
if (phy != CPUNODECF_PHY_DEFAULT) {
sc->sc_phy_addr = phy;
} else {
unsigned char prop_name[20];
snprintf(prop_name, sizeof(prop_name), "tsec%u-phy-addr",
@ -553,12 +587,6 @@ pq3etsec_attach(device_t parent, device_t self, void *aux)
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.
@ -655,7 +683,23 @@ pq3etsec_attach(device_t parent, device_t self, void *aux)
return;
}
aprint_normal("\n");
/*
* If there was no MDIO 
*/
if (mdio == CPUNODECF_MDIO_DEFAULT) {
aprint_normal("\n");
cfdata_t mdio_cf = config_search_ia(pq3mdio_find, self, NULL, cna);
if (mdio_cf != NULL) {
sc->sc_mdio_dev = config_attach(self, mdio_cf, cna, NULL);
}
} else {
sc->sc_mdio_dev = device_find_by_driver_unit("mdio", mdio);
if (sc->sc_mdio_dev == NULL) {
aprint_error(": failed to locate mdio device\n");
return;
}
aprint_normal("\n");
}
etsec_write(sc, ATTR, ATTR_DEFAULT);
etsec_write(sc, ATTRELI, ATTRELI_DEFAULT);
@ -675,15 +719,15 @@ pq3etsec_attach(device_t parent, device_t self, void *aux)
ec->ec_mii = &sc->sc_mii;
sc->sc_mii.mii_ifp = ifp;
sc->sc_mii.mii_readreg = pq3etsec_mii_readreg;
sc->sc_mii.mii_writereg = pq3etsec_mii_writereg;
sc->sc_mii.mii_readreg = pq3mdio_mii_readreg;
sc->sc_mii.mii_writereg = pq3mdio_mii_writereg;
sc->sc_mii.mii_statchg = pq3etsec_mii_statchg;
ifmedia_init(&sc->sc_mii.mii_media, 0, ether_mediachange,
ether_mediastatus);
if (sc->sc_phy_addr < 32) {
mii_attach(miiself, &sc->sc_mii, 0xffffffff,
if (sc->sc_mdio_dev != NULL && sc->sc_phy_addr < 32) {
mii_attach(sc->sc_mdio_dev, &sc->sc_mii, 0xffffffff,
sc->sc_phy_addr, MII_OFFSET_ANY, MIIF_DOPAUSE);
if (LIST_FIRST(&sc->sc_mii.mii_phys) == NULL) {

View File

@ -1,4 +1,4 @@
# $NetBSD: files.booke,v 1.6 2011/08/02 00:27:42 matt Exp $
# $NetBSD: files.booke,v 1.7 2012/07/22 23:46:10 matt Exp $
#
# PPC BookE specific configuration info
@ -12,7 +12,7 @@ attach mainbus at root
# Processor Local Bus
#device cpunode {[device = -1], [core = -1]}: gpiobus
device cpunode {[instance = -1]}: gpiobus
device cpunode {[instance = -1], [mdio = -1], [phy = -1]}: gpiobus
attach cpunode at mainbus
file arch/powerpc/booke/dev/cpunode.c cpunode
file arch/powerpc/booke/dev/pq3gpio.c cpunode & gpio
@ -36,9 +36,14 @@ attach diic at cpunode with pq3diic
file arch/powerpc/booke/dev/pq3diic.c pq3diic
# On-chip ethernet device(s)
device tsec: ether, ifnet, arp, mii
device tsec { }: ether, ifnet, arp
attach tsec at cpunode with pq3etsec
file arch/powerpc/booke/dev/pq3etsec.c pq3etsec
device mdio: mii
attach mdio at tsec with pq3mdio_tsec
attach mdio at cpunode with pq3mdio_cpunode
file arch/powerpc/booke/dev/pq3etsec.c pq3etsec | mdio
# On-chip EHCI device(s)
attach ehci at cpunode with pq3ehci