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:
parent
b017b8c719
commit
20d6accb8c
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ?
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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?
|
||||
|
|
|
@ -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),
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue