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, ®);
+ PHY_READ(sc, MII_BMSR, ®);
+ 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;
+}