Module Name:    src
Committed By:   msaitoh
Date:           Fri Nov  1 02:53:23 UTC 2019

Modified Files:
        src/distrib/sets/lists/man: mi
        src/share/man/man4: Makefile
        src/sys/arch/amd64/conf: ALL GENERIC
        src/sys/arch/i386/conf: ALL GENERIC
        src/sys/dev: DEVNAMES
        src/sys/dev/mii: files.mii
Added Files:
        src/share/man/man4: smscphy.4
        src/sys/dev/mii: smscphy.c

Log Message:
 Port SMSC LAN87xx 10/100 Ethernet PHY driver from FreeBSD with some cleanup
and IFM_NONE support.


To generate a diff of this commit:
cvs rdiff -u -r1.1661 -r1.1662 src/distrib/sets/lists/man/mi
cvs rdiff -u -r1.687 -r1.688 src/share/man/man4/Makefile
cvs rdiff -u -r0 -r1.1 src/share/man/man4/smscphy.4
cvs rdiff -u -r1.127 -r1.128 src/sys/arch/amd64/conf/ALL
cvs rdiff -u -r1.543 -r1.544 src/sys/arch/amd64/conf/GENERIC
cvs rdiff -u -r1.473 -r1.474 src/sys/arch/i386/conf/ALL
cvs rdiff -u -r1.1214 -r1.1215 src/sys/arch/i386/conf/GENERIC
cvs rdiff -u -r1.324 -r1.325 src/sys/dev/DEVNAMES
cvs rdiff -u -r1.52 -r1.53 src/sys/dev/mii/files.mii
cvs rdiff -u -r0 -r1.1 src/sys/dev/mii/smscphy.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/man/mi
diff -u src/distrib/sets/lists/man/mi:1.1661 src/distrib/sets/lists/man/mi:1.1662
--- src/distrib/sets/lists/man/mi:1.1661	Wed Oct 30 12:06:25 2019
+++ src/distrib/sets/lists/man/mi	Fri Nov  1 02:53:22 2019
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1661 2019/10/30 12:06:25 msaitoh Exp $
+# $NetBSD: mi,v 1.1662 2019/11/01 02:53:22 msaitoh Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -1712,6 +1712,7 @@
 ./usr/share/man/cat4/slip.0			man-sys-catman		.cat
 ./usr/share/man/cat4/sm.0			man-sys-catman		.cat
 ./usr/share/man/cat4/smsc.0			man-sys-catman		.cat
+./usr/share/man/cat4/smscphy.0			man-sys-catman		.cat
 ./usr/share/man/cat4/smscmon.0			man-sys-catman		.cat
 ./usr/share/man/cat4/smsh.0			man-sys-catman		.cat
 ./usr/share/man/cat4/sn.0			man-sys-catman		.cat
@@ -4823,6 +4824,7 @@
 ./usr/share/man/html4/slip.html			man-sys-htmlman		html
 ./usr/share/man/html4/sm.html			man-sys-htmlman		html
 ./usr/share/man/html4/smsc.html			man-sys-htmlman		html
+./usr/share/man/html4/smscphy.html		man-sys-htmlman		html
 ./usr/share/man/html4/smscmon.html		man-sys-htmlman		html
 ./usr/share/man/html4/smsh.html			man-sys-htmlman		html
 ./usr/share/man/html4/sn.html			man-sys-htmlman		html
@@ -7841,6 +7843,7 @@
 ./usr/share/man/man4/sm.4			man-sys-man		.man
 ./usr/share/man/man4/smsc.4			man-sys-man		.man
 ./usr/share/man/man4/smscmon.4			man-sys-man		.man
+./usr/share/man/man4/smscphy.4			man-sys-man		.man
 ./usr/share/man/man4/smsh.4			man-sys-man		.man
 ./usr/share/man/man4/sn.4			man-sys-man		.man
 ./usr/share/man/man4/sony.4			man-sys-man		.man

Index: src/share/man/man4/Makefile
diff -u src/share/man/man4/Makefile:1.687 src/share/man/man4/Makefile:1.688
--- src/share/man/man4/Makefile:1.687	Wed Oct 30 12:06:25 2019
+++ src/share/man/man4/Makefile	Fri Nov  1 02:53:23 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.687 2019/10/30 12:06:25 msaitoh Exp $
+#	$NetBSD: Makefile,v 1.688 2019/11/01 02:53:23 msaitoh Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/18/93
 
 MAN=	aac.4 ac97.4 acardide.4 aceride.4 acphy.4 \
@@ -58,7 +58,8 @@ MAN=	aac.4 ac97.4 acardide.4 aceride.4 a
 	scsi.4 sctp.4 sd.4 se.4 seeprom.4 sem.4 \
 	ses.4 sf.4 sfb.4 sgsmix.4 shb.4 shmif.4 shpcic.4 si70xxtemp.4 \
 	siisata.4 siop.4 sip.4 siside.4 sk.4 sl.4 slide.4 \
-	sm.4 smsh.4 sn.4 sony.4 spc.4 speaker.4 spif.4 sqphy.4 srt.4 ss.4 \
+	sm.4 smscphy.4 smsh.4 sn.4 sony.4 spc.4 speaker.4 spif.4 sqphy.4 \
+	srt.4 ss.4 \
 	ssdfb.4 st.4 ste.4 stge.4 sti.4 stpcide.4 sv.4 strip.4 \
 	svwsata.4 swsensor.4 swwdog.4 sysmon.4 \
 	tap.4 tc.4 tcds.4 tcp.4 tcu.4 tdvfb.4 tea5767radio.4 termios.4 tfb.4 \

Index: src/sys/arch/amd64/conf/ALL
diff -u src/sys/arch/amd64/conf/ALL:1.127 src/sys/arch/amd64/conf/ALL:1.128
--- src/sys/arch/amd64/conf/ALL:1.127	Wed Oct 30 12:06:25 2019
+++ src/sys/arch/amd64/conf/ALL	Fri Nov  1 02:53:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: ALL,v 1.127 2019/10/30 12:06:25 msaitoh Exp $
+# $NetBSD: ALL,v 1.128 2019/11/01 02:53:23 msaitoh Exp $
 # From NetBSD: GENERIC,v 1.787 2006/10/01 18:37:54 bouyer Exp
 #
 # ALL machine description file
@@ -17,7 +17,7 @@ include 	"arch/amd64/conf/std.amd64"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident		"ALL-$Revision: 1.127 $"
+#ident		"ALL-$Revision: 1.128 $"
 
 maxusers	64		# estimated number of users
 
@@ -1116,6 +1116,7 @@ qsphy*	at mii? phy ?			# Quality Semicon
 rdcphy* at mii? phy ?			# RDC R6040 internal PHY
 rgephy* at mii? phy ?			# Realtek 8169S/8110S internal PHYs
 rlphy*	at mii? phy ?			# Realtek 8139/8201L PHYs
+smscphy* at mii? phy ?			# SMSC LAN87xx PHYs
 sqphy*	at mii? phy ?			# Seeq 80220/80221/80223 PHYs
 tlphy*	at mii? phy ?			# ThunderLAN PHYs
 tqphy*	at mii? phy ?			# TDK Semiconductor PHYs

Index: src/sys/arch/amd64/conf/GENERIC
diff -u src/sys/arch/amd64/conf/GENERIC:1.543 src/sys/arch/amd64/conf/GENERIC:1.544
--- src/sys/arch/amd64/conf/GENERIC:1.543	Wed Oct 30 12:06:25 2019
+++ src/sys/arch/amd64/conf/GENERIC	Fri Nov  1 02:53:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.543 2019/10/30 12:06:25 msaitoh Exp $
+# $NetBSD: GENERIC,v 1.544 2019/11/01 02:53:23 msaitoh Exp $
 #
 # GENERIC machine description file
 #
@@ -22,7 +22,7 @@ include 	"arch/amd64/conf/std.amd64"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident		"GENERIC-$Revision: 1.543 $"
+#ident		"GENERIC-$Revision: 1.544 $"
 
 maxusers	64		# estimated number of users
 
@@ -886,6 +886,7 @@ pnaphy* at mii? phy ?			# generic HomePN
 qsphy*	at mii? phy ?			# Quality Semiconductor QS6612 PHYs
 rgephy* at mii? phy ?			# Realtek 8169S/8110 internal PHYs
 rlphy*	at mii? phy ?			# Realtek 8139/8201L PHYs
+smscphy* at mii? phy ?			# SMSC LAN87xx PHYs
 sqphy*	at mii? phy ?			# Seeq 80220/80221/80223 PHYs
 tlphy*	at mii? phy ?			# ThunderLAN PHYs
 tqphy*	at mii? phy ?			# TDK Semiconductor PHYs

Index: src/sys/arch/i386/conf/ALL
diff -u src/sys/arch/i386/conf/ALL:1.473 src/sys/arch/i386/conf/ALL:1.474
--- src/sys/arch/i386/conf/ALL:1.473	Wed Oct 30 12:06:25 2019
+++ src/sys/arch/i386/conf/ALL	Fri Nov  1 02:53:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: ALL,v 1.473 2019/10/30 12:06:25 msaitoh Exp $
+# $NetBSD: ALL,v 1.474 2019/11/01 02:53:23 msaitoh Exp $
 # From NetBSD: GENERIC,v 1.787 2006/10/01 18:37:54 bouyer Exp
 #
 # ALL machine description file
@@ -17,7 +17,7 @@ include 	"arch/i386/conf/std.i386"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident		"ALL-$Revision: 1.473 $"
+#ident		"ALL-$Revision: 1.474 $"
 
 maxusers	64		# estimated number of users
 
@@ -1220,6 +1220,7 @@ qsphy*	at mii? phy ?			# Quality Semicon
 rdcphy* at mii? phy ?			# RDC R6040 internal PHY
 rgephy* at mii? phy ?			# Realtek 8169S/8110S internal PHYs
 rlphy*	at mii? phy ?			# Realtek 8139/8201L PHYs
+smscphy* at mii? phy ?			# SMSC LAN87xx PHYs
 sqphy*	at mii? phy ?			# Seeq 80220/80221/80223 PHYs
 tlphy*	at mii? phy ?			# ThunderLAN PHYs
 tqphy*	at mii? phy ?			# TDK Semiconductor PHYs

Index: src/sys/arch/i386/conf/GENERIC
diff -u src/sys/arch/i386/conf/GENERIC:1.1214 src/sys/arch/i386/conf/GENERIC:1.1215
--- src/sys/arch/i386/conf/GENERIC:1.1214	Wed Oct 30 12:06:25 2019
+++ src/sys/arch/i386/conf/GENERIC	Fri Nov  1 02:53:23 2019
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.1214 2019/10/30 12:06:25 msaitoh Exp $
+# $NetBSD: GENERIC,v 1.1215 2019/11/01 02:53:23 msaitoh Exp $
 #
 # GENERIC machine description file
 #
@@ -22,7 +22,7 @@ include 	"arch/i386/conf/std.i386"
 
 options 	INCLUDE_CONFIG_FILE	# embed config file in kernel binary
 
-#ident		"GENERIC-$Revision: 1.1214 $"
+#ident		"GENERIC-$Revision: 1.1215 $"
 
 maxusers	64		# estimated number of users
 
@@ -1134,6 +1134,7 @@ qsphy*	at mii? phy ?			# Quality Semicon
 rdcphy* at mii? phy ?			# RDC R6040 10/100 PHY
 rgephy* at mii? phy ?			# Realtek 8169S/8110S internal PHYs
 rlphy*	at mii? phy ?			# Realtek 8139/8201L PHYs
+smscphy* at mii? phy ?			# SMSC LAN87xx PHYs
 sqphy*	at mii? phy ?			# Seeq 80220/80221/80223 PHYs
 tlphy*	at mii? phy ?			# ThunderLAN PHYs
 tqphy*	at mii? phy ?			# TDK Semiconductor PHYs

Index: src/sys/dev/DEVNAMES
diff -u src/sys/dev/DEVNAMES:1.324 src/sys/dev/DEVNAMES:1.325
--- src/sys/dev/DEVNAMES:1.324	Wed Oct 30 12:06:26 2019
+++ src/sys/dev/DEVNAMES	Fri Nov  1 02:53:23 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: DEVNAMES,v 1.324 2019/10/30 12:06:26 msaitoh Exp $
+#	$NetBSD: DEVNAMES,v 1.325 2019/11/01 02:53:23 msaitoh Exp $
 #
 # This file contains all used device names and defined attributes in
 # alphabetical order. New devices added to the system somewhere should first
@@ -1260,6 +1260,7 @@ sm			MI
 smap			playstation2
 smc93cx6		MI		Attribute
 smg			vax
+smscphy			MI
 smsh			MI
 sn			arc
 sn			mac68k

Index: src/sys/dev/mii/files.mii
diff -u src/sys/dev/mii/files.mii:1.52 src/sys/dev/mii/files.mii:1.53
--- src/sys/dev/mii/files.mii:1.52	Wed Oct 30 12:06:26 2019
+++ src/sys/dev/mii/files.mii	Fri Nov  1 02:53:22 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: files.mii,v 1.52 2019/10/30 12:06:26 msaitoh Exp $
+#	$NetBSD: files.mii,v 1.53 2019/11/01 02:53:22 msaitoh Exp $
 
 defflag	opt_mii.h	MIIVERBOSE
 
@@ -166,3 +166,7 @@ file	dev/mii/rdcphy.c			rdcphy
 device	micphy: mii_phy, ukphy_subr
 attach	micphy at mii
 file	dev/mii/micphy.c			micphy
+
+device	smscphy: mii_phy
+attach	smscphy at mii
+file	dev/mii/smscphy.c			smscphy

Added files:

Index: src/share/man/man4/smscphy.4
diff -u /dev/null src/share/man/man4/smscphy.4:1.1
--- /dev/null	Fri Nov  1 02:53:23 2019
+++ src/share/man/man4/smscphy.4	Fri Nov  1 02:53:23 2019
@@ -0,0 +1,63 @@
+.\" $
+.\"
+.\" Copyright (c) 2019 The NetBSD Foundation, Inc.
+.\" All rights reserved.
+.\"
+.\" This code is derived from software contributed to The NetBSD Foundation
+.\" by Masanobu SAITOH.
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+.\" ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+.\" TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+.\" PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+.\" BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+.\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+.\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+.\" INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+.\" CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIHENCE OR OTHERWISE)
+.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+.\" POSSIBILITY OF SUCH DAMAGE.
+.\"
+.Dd November 1, 2019
+.Dt SMSCPHY 4
+.Os
+.Sh NAME
+.Nm smscphy
+.Nd SMSC LAN87xx 10/100 Ethernet PHYs
+.Sh SYNOPSIS
+.Cd "smscphy* at mii? phy ?"
+.Sh DESCRIPTION
+The
+.Nm
+driver supports SMSC LAN8700, LAN8710 and LAN8720 10/100 Ethernet PHYs.
+.Sh SEE ALSO
+.Xr ifmedia 4 ,
+.Xr intro 4 ,
+.Xr mii 4 ,
+.Xr ifconfig 8
+.Sh HISTORY
+The
+.Nm
+device driver first appeared in
+.Fx 8.0 .
+.Sh AUTHORS
+.An -nosplit
+The
+.Nm
+driver was written by
+.An Ben Gray
+for
+.Fx
+and ported to
+.Nx 9.0
+by
+.An Masanobu SAITOH.

Index: src/sys/dev/mii/smscphy.c
diff -u /dev/null src/sys/dev/mii/smscphy.c:1.1
--- /dev/null	Fri Nov  1 02:53:23 2019
+++ src/sys/dev/mii/smscphy.c	Fri Nov  1 02:53:22 2019
@@ -0,0 +1,251 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2006 Benno Rice.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <sys/cdefs.h>
+/* $FreeBSD: head/sys/dev/mii/smscphy.c 326255 2017-11-27 14:52:40Z pfg $ */
+
+/*
+ * Driver for the SMSC LAN8710A
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/device.h>
+#include <sys/socket.h>
+#include <sys/errno.h>
+
+#include <net/if.h>
+#include <net/if_media.h>
+
+#include <dev/mii/mii.h>
+#include <dev/mii/miivar.h>
+#include <dev/mii/miidevs.h>
+
+/* PHY special control/status register */
+#define SMSCPHY_SPCSR	0x1f
+#define  SPCSR_SPDIND_10	0x0004
+#define  SPCSR_SPDIND_100	0x0008
+#define  SPCSR_SPDIND_SPDMASK	0x000c
+#define  SPCSR_SPDIND_FDX	0x0010
+
+static int	smscphy_match(device_t, cfdata_t, void *);
+static void	smscphy_attach(device_t, device_t, void *);
+
+CFATTACH_DECL_NEW(smscphy, sizeof (struct mii_softc),
+    smscphy_match, smscphy_attach, mii_phy_detach, mii_phy_activate);
+
+static void	smscphy_power(struct mii_softc *, bool);
+static int	smscphy_service(struct mii_softc *, struct mii_data *, int);
+static void	smscphy_auto(struct mii_softc *, int);
+static void	smscphy_status(struct mii_softc *);
+
+static const struct mii_phydesc smscphys[] = {
+	MII_PHY_DESC(SMSC, LAN8700),
+	MII_PHY_DESC(SMSC, LAN8710_LAN8720),
+	MII_PHY_END
+};
+
+static const struct mii_phy_funcs smscphy_funcs = {
+	smscphy_service,
+	smscphy_status,
+	mii_phy_reset
+};
+
+static int
+smscphy_match(device_t dev, cfdata_t match, void *aux)
+{
+	struct mii_attach_args *ma = aux;
+
+	if (mii_phy_match(ma, smscphys) != NULL)
+		return 10;
+
+	return 0;
+}
+
+static void
+smscphy_attach(device_t parent, device_t self, void *aux)
+{
+	struct mii_softc *sc = device_private(self);
+	struct mii_attach_args *ma = aux;
+	struct mii_data *mii = ma->mii_data;
+	const struct mii_phydesc *mpd;
+
+	mpd = mii_phy_match(ma, smscphys);
+	aprint_naive(": Media interface\n");
+	aprint_normal(": %s, rev. %d\n", mpd->mpd_name, MII_REV(ma->mii_id2));
+
+	sc->mii_dev = self;
+	sc->mii_inst = mii->mii_instance;
+	sc->mii_phy = ma->mii_phyno;
+	sc->mii_funcs = &smscphy_funcs;
+	sc->mii_mpd_oui = MII_OUI(ma->mii_id1, ma->mii_id2);
+	sc->mii_mpd_model = MII_MODEL(ma->mii_id2);
+	sc->mii_mpd_rev = MII_REV(ma->mii_id2);
+	sc->mii_pdata = mii;
+	sc->mii_flags = ma->mii_flags;
+	sc->mii_anegticks = MII_ANEGTICKS;
+
+	PHY_RESET(sc);
+
+	PHY_READ(sc, MII_BMSR, &sc->mii_capabilities);
+	sc->mii_capabilities &= ma->mii_capmask;
+	aprint_normal_dev(self, "");
+	if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0)
+		aprint_error("no media present");
+	else
+		mii_phy_add_media(sc);
+	aprint_normal("\n");
+}
+
+static void
+smscphy_power(struct mii_softc *sc, bool power)
+{
+	uint16_t bmcr, new;
+
+	PHY_READ(sc, MII_BMCR, &bmcr);
+	if (power)
+		new = bmcr & ~BMCR_PDOWN;
+	else
+		new = bmcr | BMCR_PDOWN;
+	if (bmcr != new)
+		PHY_WRITE(sc, MII_BMCR, new);
+}
+
+static int
+smscphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
+{
+	struct	ifmedia_entry *ife;
+	uint16_t reg;
+
+	ife = mii->mii_media.ifm_cur;
+
+	switch (cmd) {
+	case MII_POLLSTAT:
+		break;
+
+	case MII_MEDIACHG:
+		/* Try to power up the PHY in case it's down */
+		if (IFM_SUBTYPE(ife->ifm_media) != IFM_NONE)
+			smscphy_power(sc, true);
+
+		switch (IFM_SUBTYPE(ife->ifm_media)) {
+		case IFM_AUTO:
+			smscphy_auto(sc, ife->ifm_media);
+			break;
+
+		default:
+			mii_phy_setmedia(sc);
+			if (IFM_SUBTYPE(ife->ifm_media) == IFM_NONE)
+				smscphy_power(sc, false);
+			break;
+		}
+		break;
+
+	case MII_TICK:
+		if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+			break;
+
+		PHY_READ(sc, MII_BMSR, &reg);
+		PHY_READ(sc, MII_BMSR, &reg);
+		if (reg & BMSR_LINK) {
+			sc->mii_ticks = 0;
+			break;
+		}
+
+		if (++sc->mii_ticks <= MII_ANEGTICKS)
+			break;
+
+		PHY_RESET(sc);
+		smscphy_auto(sc, ife->ifm_media);
+		break;
+	}
+
+	/* Update the media status. */
+	PHY_STATUS(sc);
+
+	/* Callback if something changed. */
+	mii_phy_update(sc, cmd);
+	return 0;
+}
+
+static void
+smscphy_auto(struct mii_softc *sc, int media)
+{
+	uint16_t anar;
+
+	sc->mii_ticks = 0;
+	anar = BMSR_MEDIA_TO_ANAR(sc->mii_capabilities) | ANAR_CSMA;
+	if ((media & IFM_FLOW) != 0)
+		anar |= ANAR_FC;
+	PHY_WRITE(sc, MII_ANAR, anar);
+	/* Apparently this helps. */
+	PHY_READ(sc, MII_ANAR, &anar);
+	PHY_WRITE(sc, MII_BMCR, BMCR_AUTOEN | BMCR_STARTNEG);
+}
+
+static void
+smscphy_status(struct mii_softc *sc)
+{
+	struct mii_data *mii = sc->mii_pdata;
+	uint16_t bmcr, bmsr, status;
+
+	mii->mii_media_status = IFM_AVALID;
+	mii->mii_media_active = IFM_ETHER;
+
+	PHY_READ(sc, MII_BMSR, &bmsr);
+	PHY_READ(sc, MII_BMSR, &bmsr);
+	if ((bmsr & BMSR_LINK) != 0)
+		mii->mii_media_status |= IFM_ACTIVE;
+
+	PHY_READ(sc, MII_BMCR, &bmcr);
+	if ((bmcr & BMCR_ISO) != 0) {
+		mii->mii_media_active |= IFM_NONE;
+		mii->mii_media_status = 0;
+		return;
+	}
+
+	if ((bmcr & BMCR_LOOP) != 0)
+		mii->mii_media_active |= IFM_LOOP;
+
+	if ((bmcr & BMCR_AUTOEN) != 0) {
+		if ((bmsr & BMSR_ACOMP) == 0) {
+			/* Erg, still trying, I guess... */
+			mii->mii_media_active |= IFM_NONE;
+			return;
+		}
+	}
+
+	PHY_READ(sc, SMSCPHY_SPCSR, &status);
+	if ((status & SPCSR_SPDIND_SPDMASK) == SPCSR_SPDIND_100)
+		mii->mii_media_active |= IFM_100_TX;
+	else
+		mii->mii_media_active |= IFM_10_T;
+	if (status & SPCSR_SPDIND_FDX)
+		mii->mii_media_active |= IFM_FDX | mii_phy_flowstatus(sc);
+	else
+		mii->mii_media_active |= IFM_HDX;
+}

Reply via email to