Module Name:    src
Committed By:   matt
Date:           Sun Jul 22 23:46:11 UTC 2012

Modified Files:
        src/sys/arch/evbppc/conf: MPC8536DS MPC8548CDS P2020DS P2020RDB RB800
            TWRP1025
        src/sys/arch/evbppc/mpc85xx: machdep.c
        src/sys/arch/powerpc/booke/dev: pq3etsec.c
        src/sys/arch/powerpc/conf: files.booke

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/evbppc/conf/MPC8536DS
cvs rdiff -u -r1.9 -r1.10 src/sys/arch/evbppc/conf/MPC8548CDS
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/evbppc/conf/P2020DS
cvs rdiff -u -r1.12 -r1.13 src/sys/arch/evbppc/conf/P2020RDB
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/evbppc/conf/RB800
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/evbppc/conf/TWRP1025
cvs rdiff -u -r1.27 -r1.28 src/sys/arch/evbppc/mpc85xx/machdep.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/powerpc/booke/dev/pq3etsec.c
cvs rdiff -u -r1.6 -r1.7 src/sys/arch/powerpc/conf/files.booke

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/MPC8536DS
diff -u src/sys/arch/evbppc/conf/MPC8536DS:1.10 src/sys/arch/evbppc/conf/MPC8536DS:1.11
--- src/sys/arch/evbppc/conf/MPC8536DS:1.10	Sun Dec 18 05:49:26 2011
+++ src/sys/arch/evbppc/conf/MPC8536DS	Sun Jul 22 23:46:10 2012
@@ -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

Index: src/sys/arch/evbppc/conf/MPC8548CDS
diff -u src/sys/arch/evbppc/conf/MPC8548CDS:1.9 src/sys/arch/evbppc/conf/MPC8548CDS:1.10
--- src/sys/arch/evbppc/conf/MPC8548CDS:1.9	Sun Dec 18 05:49:26 2011
+++ src/sys/arch/evbppc/conf/MPC8548CDS	Sun Jul 22 23:46:10 2012
@@ -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

Index: src/sys/arch/evbppc/conf/P2020DS
diff -u src/sys/arch/evbppc/conf/P2020DS:1.11 src/sys/arch/evbppc/conf/P2020DS:1.12
--- src/sys/arch/evbppc/conf/P2020DS:1.11	Sun Dec 18 05:49:26 2011
+++ src/sys/arch/evbppc/conf/P2020DS	Sun Jul 22 23:46:10 2012
@@ -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 ch
 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 f
 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

Index: src/sys/arch/evbppc/conf/P2020RDB
diff -u src/sys/arch/evbppc/conf/P2020RDB:1.12 src/sys/arch/evbppc/conf/P2020RDB:1.13
--- src/sys/arch/evbppc/conf/P2020RDB:1.12	Sun Dec 18 05:49:26 2011
+++ src/sys/arch/evbppc/conf/P2020RDB	Sun Jul 22 23:46:10 2012
@@ -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 ?

Index: src/sys/arch/evbppc/conf/RB800
diff -u src/sys/arch/evbppc/conf/RB800:1.16 src/sys/arch/evbppc/conf/RB800:1.17
--- src/sys/arch/evbppc/conf/RB800:1.16	Thu Jan 19 23:37:23 2012
+++ src/sys/arch/evbppc/conf/RB800	Sun Jul 22 23:46:10 2012
@@ -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

Index: src/sys/arch/evbppc/conf/TWRP1025
diff -u src/sys/arch/evbppc/conf/TWRP1025:1.4 src/sys/arch/evbppc/conf/TWRP1025:1.5
--- src/sys/arch/evbppc/conf/TWRP1025:1.4	Wed Jul 18 19:39:54 2012
+++ src/sys/arch/evbppc/conf/TWRP1025	Sun Jul 22 23:46:10 2012
@@ -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?

Index: src/sys/arch/evbppc/mpc85xx/machdep.c
diff -u src/sys/arch/evbppc/mpc85xx/machdep.c:1.27 src/sys/arch/evbppc/mpc85xx/machdep.c:1.28
--- src/sys/arch/evbppc/mpc85xx/machdep.c:1.27	Wed Jul 18 19:38:26 2012
+++ src/sys/arch/evbppc/mpc85xx/machdep.c	Sun Jul 22 23:46:10 2012
@@ -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 mpc
 		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 mpc
 		  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 mpc
 		  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),

Index: src/sys/arch/powerpc/booke/dev/pq3etsec.c
diff -u src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.15 src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.16
--- src/sys/arch/powerpc/booke/dev/pq3etsec.c:1.15	Tue Jul 17 01:36:13 2012
+++ src/sys/arch/powerpc/booke/dev/pq3etsec.c	Sun Jul 22 23:46:10 2012
@@ -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
 
 #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);
 
-	if (!e500_cpunode_submatch(parent, cf, cf->cf_name, aux))
-		return 0;
+CFATTACH_DECL_NEW(pq3mdio_cpunode, sizeof(struct pq3mdio_softc),
+    pq3mdio_match, pq3mdio_attach, NULL, NULL);
 
-	return 1;
+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);
+}
+
+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, bu
 	return bus_space_read_4(sc->sc_bst, sc->sc_bsh, off);
 }
 
-static inline void
-etsec_write(struct pq3etsec_softc *sc, bus_size_t off, uint32_t data)
+static int
+pq3mdio_find(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
 {
-	bus_space_write_4(sc->sc_bst, sc->sc_bsh, off, data);
+	return strcmp(cf->cf_name, "mdio") == 0;
 }
 
-static inline uint32_t
-etsec_mdio_read(struct pq3etsec_softc *sc, bus_size_t off)
+static int
+pq3mdio_match(device_t parent, cfdata_t cf, void *aux)
 {
-	return bus_space_read_4(sc->sc_bst, sc->sc_mdio_bsh, off);
+	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 inline void
-etsec_mdio_write(struct pq3etsec_softc *sc, bus_size_t off, uint32_t data)
+static void
+pq3mdio_attach(device_t parent, device_t self, void *aux)
 {
-	bus_space_write_4(sc->sc_bst, sc->sc_mdio_bsh, off, data);
+	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
-pq3etsec_mii_readreg(device_t self, int phy, int reg)
+pq3mdio_mii_readreg(device_t self, int phy, int reg)
 {
-	struct pq3etsec_softc * const sc = device_private(self);
-	uint32_t miimcom = etsec_read(sc, MIIMCOM);
+	struct pq3mdio_softc * const mdio = device_private(self);
+	uint32_t miimcom = etsec_mdio_read(mdio, MIIMCOM);
 
-//	int s = splnet();
+	mutex_enter(mdio->mdio_lock);
 
-	etsec_mdio_write(sc, MIIMADD,
+	etsec_mdio_write(mdio, 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
+	etsec_mdio_write(mdio, MIIMCOM, 0);	/* clear any past bits */
+	etsec_mdio_write(mdio, MIIMCOM, MIIMCOM_READ);
 
-	while (etsec_mdio_read(sc, MIIMIND) != 0) {
+	while (etsec_mdio_read(mdio, MIIMIND) != 0) {
 			delay(1);
 	}
-	int data = etsec_mdio_read(sc, MIIMSTAT);
+	int data = etsec_mdio_read(mdio, MIIMSTAT);
 
 	if (miimcom == MIIMCOM_SCAN)
-		etsec_mdio_write(sc, MIIMCOM, miimcom);
+		etsec_mdio_write(mdio, MIIMCOM, miimcom);
 
 #if 0
-	aprint_normal_dev(sc->sc_dev, "%s: phy %d reg %d: %#x\n",
+	aprint_normal_dev(mdio->mdio_dev, "%s: phy %d reg %d: %#x\n",
 	    __func__, phy, reg, data);
 #endif
-	etsec_write(sc, IEVENT, IEVENT_MMRD);
-//	splx(s);
+	mutex_exit(mdio->mdio_lock);
 	return data;
 }
 
 static void
-pq3etsec_mii_writereg(device_t self, int phy, int reg, int data)
+pq3mdio_mii_writereg(device_t self, int phy, int reg, int data)
 {
-	struct pq3etsec_softc * const sc = device_private(self);
-	uint32_t miimcom = etsec_mdio_read(sc, MIIMCOM);
+	struct pq3mdio_softc * const mdio = device_private(self);
+	uint32_t miimcom = etsec_mdio_read(mdio, MIIMCOM);
 
 #if 0
-	aprint_normal_dev(sc->sc_dev, "%s: phy %d reg %d: %#x\n",
+	aprint_normal_dev(mdio->mdio_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);
+	mutex_enter(mdio->mdio_lock);
 
-#if 0
-	sc->sc_imask |= IEVENT_MMWR;
-	etsec_write(sc, IMASK, sc->sc_imask);
-#endif
+	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(sc, MIIMIND) & MIIMIND_BUSY) && --timo > 0) {
+	while ((etsec_mdio_read(mdio, 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);
+		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 void
-pq3etsec_mii_statchg(device_t self)
+pq3etsec_mii_statchg(struct ifnet *ifp)
 {
-	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_
 	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_
 	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_
 		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_
 		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_
 	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) {

Index: src/sys/arch/powerpc/conf/files.booke
diff -u src/sys/arch/powerpc/conf/files.booke:1.6 src/sys/arch/powerpc/conf/files.booke:1.7
--- src/sys/arch/powerpc/conf/files.booke:1.6	Tue Aug  2 00:27:42 2011
+++ src/sys/arch/powerpc/conf/files.booke	Sun Jul 22 23:46:10 2012
@@ -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

Reply via email to