Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 26 Dec 2015 17:22:02 +0000 (UTC)
From:      Adrian Chadd <adrian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r292750 - head/sys/dev/mdio
Message-ID:  <201512261722.tBQHM2ui004731@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: adrian
Date: Sat Dec 26 17:22:02 2015
New Revision: 292750
URL: https://svnweb.freebsd.org/changeset/base/292750

Log:
  [mdio] Add MDIO support for "extended" registers as defined by IEEE 802.3 Clause 45.
  
  IEEE 802.3 Clause 45 added backwards-compatible support for 2^16 PHY registers
  through the addition of an additional device address frame.
  
  Clause 45 addressing is used in 10Gbe PHYs, 802.3az EEE registers, etc. It may
  make sense to provide a similar extension to the miibus interface, but I've
  refrained from unilaterally doing so here.
  
  Submitted by:	Landon Fuller <landon@landonf.org>
  Differential Revision:	https://reviews.freebsd.org/D4607

Modified:
  head/sys/dev/mdio/mdio.c
  head/sys/dev/mdio/mdio.h
  head/sys/dev/mdio/mdio_if.m

Modified: head/sys/dev/mdio/mdio.c
==============================================================================
--- head/sys/dev/mdio/mdio.c	Sat Dec 26 15:40:12 2015	(r292749)
+++ head/sys/dev/mdio/mdio.c	Sat Dec 26 17:22:02 2015	(r292750)
@@ -83,6 +83,21 @@ mdio_writereg(device_t dev, int phy, int
 	return (MDIO_WRITEREG(device_get_parent(dev), phy, reg, val));
 }
 
+static int
+mdio_readextreg(device_t dev, int phy, int devad, int reg)
+{
+
+	return (MDIO_READEXTREG(device_get_parent(dev), phy, devad, reg));
+}
+
+static int
+mdio_writeextreg(device_t dev, int phy, int devad, int reg,
+    int val)
+{
+
+	return (MDIO_WRITEEXTREG(device_get_parent(dev), phy, devad, reg, val));
+}
+
 static void
 mdio_hinted_child(device_t dev, const char *name, int unit)
 {
@@ -105,6 +120,8 @@ static device_method_t mdio_methods[] = 
 	/* MDIO access */
 	DEVMETHOD(mdio_readreg,		mdio_readreg),
 	DEVMETHOD(mdio_writereg,	mdio_writereg),
+	DEVMETHOD(mdio_readextreg,	mdio_readextreg),
+	DEVMETHOD(mdio_writeextreg,	mdio_writeextreg),
 
 	DEVMETHOD_END
 };

Modified: head/sys/dev/mdio/mdio.h
==============================================================================
--- head/sys/dev/mdio/mdio.h	Sat Dec 26 15:40:12 2015	(r292749)
+++ head/sys/dev/mdio/mdio.h	Sat Dec 26 17:22:02 2015	(r292750)
@@ -32,4 +32,6 @@
 extern driver_t mdio_driver;
 extern devclass_t mdio_devclass;
 
+#define	MDIO_DEVADDR_NONE	-1	/**< Use clause 22 register access */
+
 #endif	/* __DEV_MDIO_MDIO_H__ */

Modified: head/sys/dev/mdio/mdio_if.m
==============================================================================
--- head/sys/dev/mdio/mdio_if.m	Sat Dec 26 15:40:12 2015	(r292749)
+++ head/sys/dev/mdio/mdio_if.m	Sat Dec 26 17:22:02 2015	(r292750)
@@ -4,21 +4,88 @@
 
 INTERFACE mdio;
 
-#
-# Read register from device on MDIO bus
-#
+CODE {
+	#include <dev/mdio/mdio.h>
+
+	static int
+	mdio_null_readextreg(device_t dev, int phy, int devad, int reg)
+	{
+		if (devad == MDIO_DEVADDR_NONE)
+			return (MDIO_READREG(dev, phy, reg));
+		return (~0U);
+	}
+
+	static int
+	mdio_null_writeextreg(device_t dev, int phy, int devad, int reg,
+	    int val)
+	{
+		if (devad == MDIO_DEVADDR_NONE)
+			return (MDIO_WRITEREG(dev, phy, reg, val));
+
+		return (EINVAL);
+	}
+}
+
+/**
+ * @brief Read register from device on MDIO bus.
+ *
+ * @param dev	MDIO bus device.
+ * @param phy	PHY address.
+ * @param reg	The PHY register offset.
+ */
 METHOD int readreg {
 	device_t		dev;
 	int			phy;
 	int			reg;
 };
 
-#
-# Write register to device on MDIO bus
-#
+/**
+ * @brief Write register to device on MDIO bus.
+ *
+ * @param dev	MDIO bus device.
+ * @param phy	PHY address.
+ * @param reg	The PHY register offset.
+ * @param val	The value to write at offset @p reg.
+ */
 METHOD int writereg {
 	device_t		dev;
 	int			phy;
 	int			reg;
 	int			val;
 };
+
+
+/**
+ * @brief Read extended register from device on MDIO bus.
+ *
+ * @param dev	MDIO bus device.
+ * @param phy	PHY address.
+ * @param devad The MDIO IEEE 802.3 Clause 45 device address, or
+ *		MDIO_DEVADDR_NONE to request Clause 22 register addressing.
+ * @param reg	The PHY register offset.
+ */
+METHOD int readextreg {
+	device_t		dev;
+	int			phy;
+	int			devad;
+	int			reg;
+} DEFAULT mdio_null_readextreg;
+
+
+/**
+ * @brief Write extended register to device on MDIO bus.
+ *
+ * @param dev	MDIO bus device.
+ * @param phy	PHY address.
+ * @param devad The MDIO IEEE 802.3 Clause 45 device address, or
+ *		MDIO_DEVADDR_NONE to request Clause 22 register addressing.
+ * @param reg	The PHY register offset.
+ * @param val	The value to write at offset @p reg.
+ */
+METHOD int writeextreg {
+	device_t		dev;
+	int			phy;
+	int			devad;
+	int			reg;
+	int			val;
+} DEFAULT mdio_null_writeextreg;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201512261722.tBQHM2ui004731>