Module Name:    src
Committed By:   msaitoh
Date:           Wed Oct 30 12:06:26 UTC 2019

Modified Files:
        src/distrib/sets/lists/man: mi
        src/share/man/man4: Makefile jme.4 mii.4
        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/sys/dev/mii: jmphy.c jmphyreg.h

Log Message:
Add jmphy(4) from OpenBSD.


To generate a diff of this commit:
cvs rdiff -u -r1.1660 -r1.1661 src/distrib/sets/lists/man/mi
cvs rdiff -u -r1.686 -r1.687 src/share/man/man4/Makefile
cvs rdiff -u -r1.7 -r1.8 src/share/man/man4/jme.4
cvs rdiff -u -r1.28 -r1.29 src/share/man/man4/mii.4
cvs rdiff -u -r1.126 -r1.127 src/sys/arch/amd64/conf/ALL
cvs rdiff -u -r1.542 -r1.543 src/sys/arch/amd64/conf/GENERIC
cvs rdiff -u -r1.472 -r1.473 src/sys/arch/i386/conf/ALL
cvs rdiff -u -r1.1213 -r1.1214 src/sys/arch/i386/conf/GENERIC
cvs rdiff -u -r1.323 -r1.324 src/sys/dev/DEVNAMES
cvs rdiff -u -r1.51 -r1.52 src/sys/dev/mii/files.mii
cvs rdiff -u -r0 -r1.1 src/sys/dev/mii/jmphy.c src/sys/dev/mii/jmphyreg.h

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.1660 src/distrib/sets/lists/man/mi:1.1661
--- src/distrib/sets/lists/man/mi:1.1660	Mon Oct 28 13:04:18 2019
+++ src/distrib/sets/lists/man/mi	Wed Oct 30 12:06:25 2019
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1660 2019/10/28 13:04:18 maxv Exp $
+# $NetBSD: mi,v 1.1661 2019/10/30 12:06:25 msaitoh Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -1379,6 +1379,7 @@
 ./usr/share/man/cat4/iy.0			man-sys-catman		.cat
 ./usr/share/man/cat4/jme.0			man-sys-catman		.cat
 ./usr/share/man/cat4/jmide.0			man-sys-catman		.cat
+./usr/share/man/cat4/jmphy.0			man-sys-catman		.cat
 ./usr/share/man/cat4/joy.0			man-sys-catman		.cat
 ./usr/share/man/cat4/kame_ipsec.0		man-obsolete		obsolete
 ./usr/share/man/cat4/kcov.0			man-sys-catman		.cat
@@ -4522,6 +4523,7 @@
 ./usr/share/man/html4/iy.html			man-sys-htmlman		html
 ./usr/share/man/html4/jme.html			man-sys-htmlman		html
 ./usr/share/man/html4/jmide.html		man-sys-htmlman		html
+./usr/share/man/html4/jmphy.html		man-sys-htmlman		html
 ./usr/share/man/html4/joy.html			man-sys-htmlman		html
 ./usr/share/man/html4/kame_ipsec.html		man-obsolete		obsolete
 ./usr/share/man/html4/kcov.html		man-sys-htmlman		html
@@ -7505,6 +7507,7 @@
 ./usr/share/man/man4/iy.4			man-sys-man		.man
 ./usr/share/man/man4/jme.4			man-sys-man		.man
 ./usr/share/man/man4/jmide.4			man-sys-man		.man
+./usr/share/man/man4/jmphy.4			man-sys-man		.man
 ./usr/share/man/man4/joy.4			man-sys-man		.man
 ./usr/share/man/man4/kame_ipsec.4		man-obsolete		obsolete
 ./usr/share/man/man4/kcov.4			man-sys-man		.man

Index: src/share/man/man4/Makefile
diff -u src/share/man/man4/Makefile:1.686 src/share/man/man4/Makefile:1.687
--- src/share/man/man4/Makefile:1.686	Mon Oct 28 02:56:40 2019
+++ src/share/man/man4/Makefile	Wed Oct 30 12:06:25 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: Makefile,v 1.686 2019/10/28 02:56:40 ozaki-r Exp $
+#	$NetBSD: Makefile,v 1.687 2019/10/30 12:06:25 msaitoh Exp $
 #	@(#)Makefile	8.1 (Berkeley) 6/18/93
 
 MAN=	aac.4 ac97.4 acardide.4 aceride.4 acphy.4 \
@@ -35,7 +35,7 @@ MAN=	aac.4 ac97.4 acardide.4 aceride.4 a
 	ioasic.4 ioat.4 iop.4 iophy.4 iopsp.4 ip.4 ipgphy.4 ipmi.4 ipw.4 \
 	irmce.4 isp.4 ismt.4 isv.4 itesio.4 iteide.4 iwi.4 iwm.4 iwn.4 ixg.4 \
 	ixpide.4 ixv.4 \
-	jme.4 jmide.4 joy.4 \
+	jme.4 jmide.4 jmphy.4 joy.4 \
 	kcov.4 kloader.4 kse.4 ksyms.4 kttcp.4 \
 	l2tp.4 lc.4 ld.4 lii.4 lo.4 lua.4 lxtphy.4 \
 	mainbus.4 makphy.4 malo.4 mbe.4 mca.4 mcclock.4 mcx.4 md.4 mfb.4 \

Index: src/share/man/man4/jme.4
diff -u src/share/man/man4/jme.4:1.7 src/share/man/man4/jme.4:1.8
--- src/share/man/man4/jme.4:1.7	Mon Jul  3 21:30:58 2017
+++ src/share/man/man4/jme.4	Wed Oct 30 12:06:25 2019
@@ -1,4 +1,4 @@
-.\"	$NetBSD: jme.4,v 1.7 2017/07/03 21:30:58 wiz Exp $
+.\"	$NetBSD: jme.4,v 1.8 2019/10/30 12:06:25 msaitoh Exp $
 .\"
 .\" Copyright (c) 2008 Manuel Bouyer
 .\" All rights reserved.
@@ -23,7 +23,7 @@
 .\" INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 .\"
-.Dd October 17, 2008
+.Dd October 30, 2019
 .Dt JME 4
 .Os
 .Sh NAME
@@ -69,6 +69,7 @@ jme transmit interrupt moderation packet
 .El
 .Sh SEE ALSO
 .Xr ifmedia 4 ,
+.Xr jmphy 4 ,
 .Xr mii 4 ,
 .Xr netintro 4 ,
 .Xr pci 4 ,

Index: src/share/man/man4/mii.4
diff -u src/share/man/man4/mii.4:1.28 src/share/man/man4/mii.4:1.29
--- src/share/man/man4/mii.4:1.28	Mon Oct  7 11:53:40 2019
+++ src/share/man/man4/mii.4	Wed Oct 30 12:06:25 2019
@@ -1,4 +1,4 @@
-.\"	$NetBSD: mii.4,v 1.28 2019/10/07 11:53:40 msaitoh Exp $
+.\"	$NetBSD: mii.4,v 1.29 2019/10/30 12:06:25 msaitoh Exp $
 .\"
 .\" Copyright (c) 1998, 2002 The NetBSD Foundation, Inc.
 .\" All rights reserved.
@@ -50,6 +50,7 @@
 .Cd "inphy*    at mii? phy ?		# Intel 82555 PHYs"
 .Cd "iophy*    at mii? phy ?		# Intel 82553 PHYs"
 .Cd "ipgphy*   at mii? phy ?		# IC PLUS IP1000A/IP1001 PHYs"
+.Cd "jmphy*    at mii? phy ?		# JMicron
 .Cd "lxtphy*   at mii? phy ?		# Level One LXT-970 PHYs"
 .Cd "makphy*   at mii? phy ?		# Marvel 88E1000 Gig-E PHYs"
 .Cd "micphy*   at mii? phy ?		# Micrel KSZ9021 Gig-E PHYs"

Index: src/sys/arch/amd64/conf/ALL
diff -u src/sys/arch/amd64/conf/ALL:1.126 src/sys/arch/amd64/conf/ALL:1.127
--- src/sys/arch/amd64/conf/ALL:1.126	Mon Oct 28 03:01:11 2019
+++ src/sys/arch/amd64/conf/ALL	Wed Oct 30 12:06:25 2019
@@ -1,4 +1,4 @@
-# $NetBSD: ALL,v 1.126 2019/10/28 03:01:11 ozaki-r Exp $
+# $NetBSD: ALL,v 1.127 2019/10/30 12:06:25 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.126 $"
+#ident		"ALL-$Revision: 1.127 $"
 
 maxusers	64		# estimated number of users
 
@@ -1106,6 +1106,7 @@ ikphy*	at mii? phy ?			# Intel 82563 PHY
 inphy*	at mii? phy ?			# Intel 82555 PHYs
 iophy*	at mii? phy ?			# Intel 82553 PHYs
 ipgphy* at mii? phy ?			# IC PLUS IP1000A/IP1001 PHYs
+jmphy*	at mii? phy ?			# Jmicron JMP202/211 PHYs
 lxtphy* at mii? phy ?			# Level One LXT-970 PHYs
 makphy* at mii? phy ?			# Marvell Semiconductor 88E1000 PHYs
 nsphy*	at mii? phy ?			# NS83840 PHYs

Index: src/sys/arch/amd64/conf/GENERIC
diff -u src/sys/arch/amd64/conf/GENERIC:1.542 src/sys/arch/amd64/conf/GENERIC:1.543
--- src/sys/arch/amd64/conf/GENERIC:1.542	Mon Oct 28 03:01:11 2019
+++ src/sys/arch/amd64/conf/GENERIC	Wed Oct 30 12:06:25 2019
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.542 2019/10/28 03:01:11 ozaki-r Exp $
+# $NetBSD: GENERIC,v 1.543 2019/10/30 12:06:25 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.542 $"
+#ident		"GENERIC-$Revision: 1.543 $"
 
 maxusers	64		# estimated number of users
 
@@ -877,6 +877,7 @@ ikphy*	at mii? phy ?			# Intel 82563 PHY
 inphy*	at mii? phy ?			# Intel 82555 PHYs
 iophy*	at mii? phy ?			# Intel 82553 PHYs
 ipgphy* at mii? phy ?			# IC PLUS IP1000A/IP1001 PHYs
+jmphy*	at mii? phy ?			# Jmicron JMP202/211 PHYs
 lxtphy* at mii? phy ?			# Level One LXT-970 PHYs
 makphy* at mii? phy ?			# Marvell Semiconductor 88E1000 PHYs
 nsphy*	at mii? phy ?			# NS83840 PHYs

Index: src/sys/arch/i386/conf/ALL
diff -u src/sys/arch/i386/conf/ALL:1.472 src/sys/arch/i386/conf/ALL:1.473
--- src/sys/arch/i386/conf/ALL:1.472	Tue Oct  8 18:50:44 2019
+++ src/sys/arch/i386/conf/ALL	Wed Oct 30 12:06:25 2019
@@ -1,4 +1,4 @@
-# $NetBSD: ALL,v 1.472 2019/10/08 18:50:44 maxv Exp $
+# $NetBSD: ALL,v 1.473 2019/10/30 12:06:25 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.472 $"
+#ident		"ALL-$Revision: 1.473 $"
 
 maxusers	64		# estimated number of users
 
@@ -1210,6 +1210,7 @@ ikphy*	at mii? phy ?			# Intel 82563 PHY
 inphy*	at mii? phy ?			# Intel 82555 PHYs
 iophy*	at mii? phy ?			# Intel 82553 PHYs
 ipgphy* at mii? phy ?			# IC PLUS IP1000A/IP1001 PHYs
+jmphy*	at mii? phy ?			# Jmicron JMP202/211 PHYs
 lxtphy* at mii? phy ?			# Level One LXT-970 PHYs
 makphy* at mii? phy ?			# Marvell Semiconductor 88E1000 PHYs
 nsphy*	at mii? phy ?			# NS83840 PHYs

Index: src/sys/arch/i386/conf/GENERIC
diff -u src/sys/arch/i386/conf/GENERIC:1.1213 src/sys/arch/i386/conf/GENERIC:1.1214
--- src/sys/arch/i386/conf/GENERIC:1.1213	Fri Oct 25 17:39:57 2019
+++ src/sys/arch/i386/conf/GENERIC	Wed Oct 30 12:06:25 2019
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.1213 2019/10/25 17:39:57 martin Exp $
+# $NetBSD: GENERIC,v 1.1214 2019/10/30 12:06:25 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.1213 $"
+#ident		"GENERIC-$Revision: 1.1214 $"
 
 maxusers	64		# estimated number of users
 
@@ -1124,6 +1124,7 @@ ikphy*	at mii? phy ?			# Intel 82563 PHY
 inphy*	at mii? phy ?			# Intel 82555 PHYs
 iophy*	at mii? phy ?			# Intel 82553 PHYs
 ipgphy* at mii? phy ?			# IC PLUS IP1000A/IP1001 PHYs
+jmphy*	at mii? phy ?			# Jmicron JMP202/211 PHYs
 lxtphy* at mii? phy ?			# Level One LXT-970 PHYs
 makphy* at mii? phy ?			# Marvell Semiconductor 88E1000 PHYs
 nsphy*	at mii? phy ?			# NS83840 PHYs

Index: src/sys/dev/DEVNAMES
diff -u src/sys/dev/DEVNAMES:1.323 src/sys/dev/DEVNAMES:1.324
--- src/sys/dev/DEVNAMES:1.323	Fri Oct 25 17:39:56 2019
+++ src/sys/dev/DEVNAMES	Wed Oct 30 12:06:26 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: DEVNAMES,v 1.323 2019/10/25 17:39:56 martin Exp $
+#	$NetBSD: DEVNAMES,v 1.324 2019/10/30 12:06:26 msaitoh Exp $
 #
 # This file contains all used device names and defined attributes in
 # alphabetical order. New devices added to the system somewhere should first
@@ -708,6 +708,7 @@ j720pwr			hpcarm
 j720ssp			hpcarm
 j720tp			hpcarm
 jme			MI
+jmphy			MI
 joy			arc
 joy			bebox
 joy			cats

Index: src/sys/dev/mii/files.mii
diff -u src/sys/dev/mii/files.mii:1.51 src/sys/dev/mii/files.mii:1.52
--- src/sys/dev/mii/files.mii:1.51	Mon Oct  7 11:53:40 2019
+++ src/sys/dev/mii/files.mii	Wed Oct 30 12:06:26 2019
@@ -1,4 +1,4 @@
-#	$NetBSD: files.mii,v 1.51 2019/10/07 11:53:40 msaitoh Exp $
+#	$NetBSD: files.mii,v 1.52 2019/10/30 12:06:26 msaitoh Exp $
 
 defflag	opt_mii.h	MIIVERBOSE
 
@@ -103,6 +103,10 @@ device	ipgphy: mii_phy
 attach	ipgphy at mii
 file	dev/mii/ipgphy.c			ipgphy
 
+device	jmphy: mii_phy
+attach	jmphy at mii
+file	dev/mii/jmphy.c				jmphy
+
 device	sqphy: mii_phy
 attach	sqphy at mii
 file	dev/mii/sqphy.c				sqphy

Added files:

Index: src/sys/dev/mii/jmphy.c
diff -u /dev/null src/sys/dev/mii/jmphy.c:1.1
--- /dev/null	Wed Oct 30 12:06:26 2019
+++ src/sys/dev/mii/jmphy.c	Wed Oct 30 12:06:26 2019
@@ -0,0 +1,358 @@
+/*	$NetBSD: jmphy.c,v 1.1 2019/10/30 12:06:26 msaitoh Exp $ */
+/*	$OpenBSD: jmphy.c,v 1.6 2015/03/14 03:38:48 jsg Exp $	*/
+/*-
+ * Copyright (c) 2008, Pyun YongHyeon <yong...@freebsd.org>
+ * 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 unmodified, 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 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 AUTHOR 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 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/sys/dev/mii/jmphy.c,v 1.1 2008/05/27 01:16:40 yongari Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/jmphy.c,v 1.1 2008/07/22 11:28:49 sephe Exp $
+ */
+
+/*
+ * Driver for the JMicron JMP211 10/100/1000, JMP202 10/100 PHY.
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/device.h>
+#include <sys/socket.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>
+#include <dev/mii/jmphyreg.h>
+
+static int	jmphy_service(struct mii_softc *, struct mii_data *, int);
+static void	jmphy_status(struct mii_softc *);
+static int	jmphy_match(device_t, cfdata_t, void *);
+static void	jmphy_attach(device_t, device_t, void *);
+static void	jmphy_reset(struct mii_softc *);
+static uint16_t	jmphy_anar(struct ifmedia_entry *);
+static int	jmphy_auto(struct mii_softc *, struct ifmedia_entry *);
+
+static const struct mii_phy_funcs jmphy_funcs = {
+	jmphy_service, jmphy_status, jmphy_reset,
+};
+
+CFATTACH_DECL_NEW(jmphy, sizeof (struct mii_softc),
+    jmphy_match, jmphy_attach, mii_phy_detach, mii_phy_activate);
+
+static const struct mii_phydesc jmphys[] = {
+	MII_PHY_DESC(JMICRON, JMP202),
+	MII_PHY_DESC(JMICRON, JMP211),
+	MII_PHY_END,
+};
+
+static int
+jmphy_match(device_t parent, cfdata_t match, void *aux)
+{
+	struct mii_attach_args *ma = aux;
+
+	if (mii_phy_match(ma, jmphys) != NULL)
+		return 10;
+
+	return 0;
+}
+
+static void
+jmphy_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, jmphys);
+	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 = &jmphy_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_flags |= MIIF_NOISOLATE | MIIF_NOLOOP;
+
+	PHY_RESET(sc);
+
+	PHY_READ(sc, MII_BMSR, &sc->mii_capabilities);
+	sc->mii_capabilities &= ma->mii_capmask;
+	if (sc->mii_capabilities & BMSR_EXTSTAT)
+		PHY_READ(sc, MII_EXTSR, &sc->mii_extcapabilities);
+
+	aprint_normal_dev(self, "");
+	if ((sc->mii_capabilities & BMSR_MEDIAMASK) == 0 &&
+	    (sc->mii_extcapabilities & EXTSR_MEDIAMASK) == 0)
+		aprint_error("no media present");
+	else
+		mii_phy_add_media(sc);
+	aprint_normal("\n");
+}
+
+static int
+jmphy_service(struct mii_softc *sc, struct mii_data *mii, int cmd)
+{
+	struct ifmedia_entry *ife = mii->mii_media.ifm_cur;
+	uint16_t bmcr, ssr;
+
+	switch (cmd) {
+	case MII_POLLSTAT:
+		/*
+		 * If we're not polling our PHY instance, just return.
+		 */
+		if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+			return 0;
+		break;
+
+	case MII_MEDIACHG:
+		/*
+		 * If the media indicates a different PHY instance,
+		 * isolate ourselves.
+		 */
+		if (IFM_INST(ife->ifm_media) != sc->mii_inst) {
+			PHY_READ(sc, MII_BMCR, &bmcr);
+			PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_ISO);
+			return 0;
+		}
+
+		/*
+		 * If the interface is not up, don't do anything.
+		 */
+		if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
+			break;
+
+		if (jmphy_auto(sc, ife) != EJUSTRETURN)
+			return EINVAL;
+		break;
+
+	case MII_TICK:
+		/*
+		 * If we're not currently selected, just return.
+		 */
+		if (IFM_INST(ife->ifm_media) != sc->mii_inst)
+			return 0;
+
+		/*
+		 * Is the interface even up?
+		 */
+		if ((mii->mii_ifp->if_flags & IFF_UP) == 0)
+			return 0;
+
+		/*
+		 * Only used for autonegotiation.
+		 */
+		if (IFM_SUBTYPE(ife->ifm_media) != IFM_AUTO)
+			break;
+
+		/* Check for link. */
+		PHY_READ(sc, JMPHY_SSR, &ssr);
+		if (ssr & JMPHY_SSR_LINK_UP) {
+			sc->mii_ticks = 0;
+			break;
+		}
+
+		/* Announce link loss right after it happens. */
+		if (sc->mii_ticks++ == 0)
+			break;
+		if (sc->mii_ticks <= sc->mii_anegticks)
+			return 0;
+
+		sc->mii_ticks = 0;
+		jmphy_auto(sc, ife);
+		break;
+	}
+
+	/* Update the media status. */
+	jmphy_status(sc);
+
+	/* Callback if something changed. */
+	mii_phy_update(sc, cmd);
+	return 0;
+}
+
+static void
+jmphy_status(struct mii_softc *sc)
+{
+	struct mii_data *mii = sc->mii_pdata;
+	uint16_t bmcr, ssr, gtsr;
+
+	mii->mii_media_status = IFM_AVALID;
+	mii->mii_media_active = IFM_ETHER;
+
+	PHY_READ(sc, JMPHY_SSR, &ssr);
+	if ((ssr & JMPHY_SSR_LINK_UP) != 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 ((ssr & JMPHY_SSR_SPD_DPLX_RESOLVED) == 0) {
+		/* Erg, still trying, I guess... */
+		mii->mii_media_active |= IFM_NONE;
+		return;
+	}
+
+	switch ((ssr & JMPHY_SSR_SPEED_MASK)) {
+	case JMPHY_SSR_SPEED_1000:
+		mii->mii_media_active |= IFM_1000_T;
+		/*
+		 * jmphy(4) got a valid link so reset mii_ticks.
+		 * Resetting mii_ticks is needed in order to
+		 * detect link loss after auto-negotiation.
+		 */
+		sc->mii_ticks = 0;
+		break;
+	case JMPHY_SSR_SPEED_100:
+		mii->mii_media_active |= IFM_100_TX;
+		sc->mii_ticks = 0;
+		break;
+	case JMPHY_SSR_SPEED_10:
+		mii->mii_media_active |= IFM_10_T;
+		sc->mii_ticks = 0;
+		break;
+	default:
+		mii->mii_media_active |= IFM_NONE;
+		return;
+	}
+
+	if ((ssr & JMPHY_SSR_DUPLEX) != 0)
+		mii->mii_media_active |= IFM_FDX | mii_phy_flowstatus(sc);
+	else
+		mii->mii_media_active |= IFM_HDX;
+
+	if (IFM_SUBTYPE(mii->mii_media_active) == IFM_1000_T) {
+		PHY_READ(sc, MII_GTSR, &gtsr);
+		if ((gtsr & GTSR_MS_RES) != 0)
+			mii->mii_media_active |= IFM_ETH_MASTER;
+	}
+}
+
+static void
+jmphy_reset(struct mii_softc *sc)
+{
+	int i;
+	uint16_t val;
+
+	/* Disable sleep mode. */
+	PHY_READ(sc, JMPHY_TMCTL, &val);
+	PHY_WRITE(sc, JMPHY_TMCTL, val & ~JMPHY_TMCTL_SLEEP_ENB);
+
+	PHY_READ(sc, MII_BMCR, &val);
+	PHY_WRITE(sc, MII_BMCR, val | BMCR_RESET);
+
+	for (i = 0; i < 1000; i++) {
+		DELAY(1);
+		PHY_READ(sc, MII_BMCR, &val);
+		if ((val & BMCR_RESET) == 0)
+			break;
+	}
+}
+
+static uint16_t
+jmphy_anar(struct ifmedia_entry *ife)
+{
+	uint16_t anar;
+
+	anar = 0;
+	switch (IFM_SUBTYPE(ife->ifm_media)) {
+	case IFM_AUTO:
+		anar |= ANAR_TX_FD | ANAR_TX | ANAR_10_FD | ANAR_10;
+		break;
+	case IFM_1000_T:
+		break;
+	case IFM_100_TX:
+		anar |= ANAR_TX | ANAR_TX_FD;
+		break;
+	case IFM_10_T:
+		anar |= ANAR_10 | ANAR_10_FD;
+		break;
+	default:
+		break;
+	}
+
+	return anar;
+}
+
+static int
+jmphy_auto(struct mii_softc *sc, struct ifmedia_entry *ife)
+{
+	uint16_t anar, bmcr, gig;
+
+	gig = 0;
+	PHY_READ(sc, MII_BMCR, &bmcr);
+	switch (IFM_SUBTYPE(ife->ifm_media)) {
+	case IFM_AUTO:
+		gig |= GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX;
+		break;
+	case IFM_1000_T:
+		gig |= GTCR_ADV_1000TFDX | GTCR_ADV_1000THDX;
+		break;
+	case IFM_100_TX:
+	case IFM_10_T:
+		break;
+	case IFM_NONE:
+		PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_ISO | BMCR_PDOWN);
+		return EJUSTRETURN;
+	default:
+		return EINVAL;
+	}
+
+	if ((ife->ifm_media & IFM_LOOP) != 0)
+		bmcr |= BMCR_LOOP;
+
+	anar = jmphy_anar(ife);
+	if (sc->mii_flags & MIIF_DOPAUSE)
+		anar |= ANAR_PAUSE_TOWARDS;
+
+	if ((sc->mii_flags & MIIF_HAVE_GTCR) != 0) {
+#ifdef notyet
+		struct mii_data *mii;
+
+		mii = sc->mii_pdata;
+		if ((mii->mii_media.ifm_media & IFM_ETH_MASTER) != 0)
+			gig |= GTCR_MAN_MS | GTCR_MAN_ADV;
+#endif
+		PHY_WRITE(sc, MII_100T2CR, gig);
+	}
+	PHY_WRITE(sc, MII_ANAR, anar | ANAR_CSMA);
+	PHY_WRITE(sc, MII_BMCR, bmcr | BMCR_AUTOEN | BMCR_STARTNEG);
+
+	return EJUSTRETURN;
+}
Index: src/sys/dev/mii/jmphyreg.h
diff -u /dev/null src/sys/dev/mii/jmphyreg.h:1.1
--- /dev/null	Wed Oct 30 12:06:26 2019
+++ src/sys/dev/mii/jmphyreg.h	Wed Oct 30 12:06:26 2019
@@ -0,0 +1,116 @@
+/*	$NetBSD: jmphyreg.h,v 1.1 2019/10/30 12:06:26 msaitoh Exp $ */
+/*	$OpenBSD: jmphyreg.h,v 1.1 2008/09/26 10:35:15 jsg Exp $	*/
+/*-
+ * Copyright (c) 2008, Pyun YongHyeon
+ * 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 unmodified, 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 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 AUTHOR 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 NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD: src/sys/dev/mii/jmphyreg.h,v 1.1 2008/05/27 01:16:40 yongari Exp $
+ * $DragonFly: src/sys/dev/netif/mii_layer/jmphyreg.h,v 1.2 2008/09/13 04:04:39 sephe Exp $
+ */
+
+#ifndef	_DEV_MII_JMPHYREG_H_
+#define	_DEV_MII_JMPHYREG_H_
+
+/*
+ * Registers for the JMicron JMC250 Gigabit PHY.
+ */
+
+/* PHY specific status register. */
+#define JMPHY_SSR			0x11
+#define JMPHY_SSR_SPEED_1000		0x8000
+#define JMPHY_SSR_SPEED_100		0x4000
+#define JMPHY_SSR_SPEED_10		0x0000
+#define JMPHY_SSR_SPEED_MASK		0xC000
+#define JMPHY_SSR_DUPLEX		0x2000
+#define JMPHY_SSR_SPD_DPLX_RESOLVED	0x0800
+#define JMPHY_SSR_LINK_UP		0x0400
+#define JMPHY_SSR_MDI_XOVER		0x0040
+#define	JMPHY_SSR_INV_POLARITY		0x0002
+
+/* PHY specific cable length status register. */
+#define	JMPHY_SCL			0x17
+#define	JMPHY_SCL_CHAN_D_MASK		0xF000
+#define	JMPHY_SCL_CHAN_C_MASK		0x0F00
+#define	JMPHY_SCL_CHAN_B_MASK		0x00F0
+#define	JMPHY_SCL_CHAN_A_MASK		0x000F
+#define	JMPHY_SCL_LEN_35		0
+#define	JMPHY_SCL_LEN_40		1
+#define	JMPHY_SCL_LEN_50		2
+#define	JMPHY_SCL_LEN_60		3
+#define	JMPHY_SCL_LEN_70		4
+#define	JMPHY_SCL_LEN_80		5
+#define	JMPHY_SCL_LEN_90		6
+#define	JMPHY_SCL_LEN_100		7
+#define	JMPHY_SCL_LEN_110		8
+#define	JMPHY_SCL_LEN_120		9
+#define	JMPHY_SCL_LEN_130		10
+#define	JMPHY_SCL_LEN_140		11
+#define	JMPHY_SCL_LEN_150		12
+#define	JMPHY_SCL_LEN_160		13
+#define	JMPHY_SCL_LEN_170		14
+#define	JMPHY_SCL_RSVD			15
+
+/* PHY specific LED control register 1. */
+#define	JMPHY_LED_CTL1			0x18
+#define	JMPHY_LED_BLINK_42MS		0x0000
+#define	JMPHY_LED_BLINK_84MS		0x2000
+#define	JMPHY_LED_BLINK_170MS		0x4000
+#define	JMPHY_LED_BLINK_340MS		0x6000
+#define	JMPHY_LED_BLINK_670MS		0x8000
+#define	JMPHY_LED_BLINK_MASK		0xE000
+#define	JMPHY_LED_FLP_GAP_MASK		0x1F00
+#define	JMPHY_LED_FLP_GAP_DEFULT	0x1000
+#define	JMPHY_LED2_POLARITY_MASK	0x0030
+#define	JMPHY_LED1_POLARITY_MASK	0x000C
+#define	JMPHY_LED0_POLARITY_MASK	0x0003
+#define	JMPHY_LED_ON_LO_OFF_HI		0
+#define	JMPHY_LED_ON_HI_OFF_HI		1
+#define	JMPHY_LED_ON_LO_OFF_TS		2
+#define	JMPHY_LED_ON_HI_OFF_TS		3
+
+/* PHY specific LED control register 2. */
+#define	JMPHY_LED_CTL2			0x19
+#define	JMPHY_LED_NO_STRETCH		0x0000
+#define	JMPHY_LED_STRETCH_42MS		0x2000
+#define	JMPHY_LED_STRETCH_84MS		0x4000
+#define	JMPHY_LED_STRETCH_170MS		0x6000
+#define	JMPHY_LED_STRETCH_340MS		0x8000
+#define	JMPHY_LED_STRETCH_670MS		0xB000
+#define	JMPHY_LED_STRETCH_1300MS	0xC000
+#define	JMPHY_LED_STRETCH_2700MS	0xE000
+#define	JMPHY_LED2_MODE_MASK		0x0F00
+#define	JMPHY_LED1_MODE_MASK		0x00F0
+#define	JMPHY_LED0_MODE_MASK		0x000F
+
+/* PHY specific test mode control register. */
+#define	JMPHY_TMCTL			0x1A
+#define	JMPHY_TMCTL_SLEEP_ENB		0x1000
+
+/* PHY specific configuration */
+#define JMPHY_CONF			0x1B
+#define JMPHY_CONF_EXTFIFO		0x0000 /* use extended fifo */
+#define JMPHY_CONF_DEFFIFO		0x0004 /* use default fifo */
+
+#endif	/* _DEV_MII_JMPHYREG_H_ */

Reply via email to