mail archive of the barebox mailing list
 help / color / mirror / Atom feed
* [PATCH 0/4] Orion GBE fixes and Marvell PHY driver
@ 2014-06-24 10:18 Sebastian Hesselbarth
  2014-06-24 10:18 ` [PATCH 1/4] of: net: respect phy-connection-type property Sebastian Hesselbarth
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Sebastian Hesselbarth @ 2014-06-24 10:18 UTC (permalink / raw)
  To: Sebastian Hesselbarth; +Cc: barebox

This patch set comprises some fixes and improvements related with ethernet
support on Marvell Orion SoC based boards.

Patch 1 adds a check for ePAPR standard "phy-connection-type" property to
of_get_phy_mode.

Patch 2 resolves a device name conflict on orion-gbe port names when using
more than one controller instance.

Patch 3 extends ethernet serial port setup to also check for delayed RGMII
interface modes.

Patch 4 finally adds a driver for Marvell PHYs with 88E1121R as a first
PHY driver.

The patches have been tested on Globalscale Guruplug. For ethernet, the
board needs a DT fix that has been picked up for Linux v3.16-rc yesterday
and should be available in barebox soon. For the second ethernet port,
barebox is still missing pinctrl for Kirkwood, but that is next on my
"polish private branches for submission"-TODO list.

Sebastian Hesselbarth (4):
  of: net: respect phy-connection-type property
  net: orion: generate unique port device names
  net: orion-gbe: extend RGMII detection to delayed modes
  net: phy: add support for Marvell PHY drivers

 drivers/net/orion-gbe.c   |   8 +-
 drivers/net/phy/Kconfig   |   5 ++
 drivers/net/phy/Makefile  |   1 +
 drivers/net/phy/marvell.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++
 drivers/of/of_net.c       |   2 +
 5 files changed, 213 insertions(+), 2 deletions(-)
 create mode 100644 drivers/net/phy/marvell.c

---
Cc: barebox@lists.infradead.org
-- 
2.0.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 1/4] of: net: respect phy-connection-type property
  2014-06-24 10:18 [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sebastian Hesselbarth
@ 2014-06-24 10:18 ` Sebastian Hesselbarth
  2014-06-24 10:18 ` [PATCH 2/4] net: orion: generate unique port device names Sebastian Hesselbarth
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Sebastian Hesselbarth @ 2014-06-24 10:18 UTC (permalink / raw)
  To: Sebastian Hesselbarth; +Cc: barebox

ePAPR defines phy-connection-type as standard property for PHY interface
between Ethernet device and PHY device. Add corresponding property check
to of_get_phy_mode.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
---
Cc: barebox@lists.infradead.org
---
 drivers/of/of_net.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/of/of_net.c b/drivers/of/of_net.c
index 2bf05e2ba21d..0320c1d4f50e 100644
--- a/drivers/of/of_net.c
+++ b/drivers/of/of_net.c
@@ -44,6 +44,8 @@ int of_get_phy_mode(struct device_node *np)
 
 	err = of_property_read_string(np, "phy-mode", &pm);
 	if (err < 0)
+		err = of_property_read_string(np, "phy-connection-type", &pm);
+	if (err < 0)
 		return err;
 
 	for (i = 0; i < ARRAY_SIZE(phy_modes); i++)
-- 
2.0.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 2/4] net: orion: generate unique port device names
  2014-06-24 10:18 [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sebastian Hesselbarth
  2014-06-24 10:18 ` [PATCH 1/4] of: net: respect phy-connection-type property Sebastian Hesselbarth
@ 2014-06-24 10:18 ` Sebastian Hesselbarth
  2014-06-24 10:18 ` [PATCH 3/4] net: orion-gbe: extend RGMII detection to delayed modes Sebastian Hesselbarth
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Sebastian Hesselbarth @ 2014-06-24 10:18 UTC (permalink / raw)
  To: Sebastian Hesselbarth; +Cc: barebox

Marvell Orion ethernet IP originally is multi-port capable, but SoCs
using the IP usually have multiple single-port controllers built in.
Currently, orion-gbe driver registers each port device with a constant
name, which causes a name conflict with multiple controller instances.

This patch uniquifies port device name generation by prepending
controller's base register address to resolve the name conflict.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
---
Cc: barebox@lists.infradead.org
---
 drivers/net/orion-gbe.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/net/orion-gbe.c b/drivers/net/orion-gbe.c
index 9315127ac7ff..23c8346ec58f 100644
--- a/drivers/net/orion-gbe.c
+++ b/drivers/net/orion-gbe.c
@@ -399,6 +399,7 @@ static int port_open(struct eth_device *edev)
 
 static int port_probe(struct device_d *parent, struct port_priv *port)
 {
+	struct orion_gbe *gbe = parent->priv;
 	struct device_d *dev = &port->dev;
 	u32 reg;
 	int ret;
@@ -450,7 +451,7 @@ static int port_probe(struct device_d *parent, struct port_priv *port)
 		reg |= RGMII_ENABLE;
 	writel(reg, port->regs + PORT_SC1);
 
-	sprintf(dev->name, "orion-gbe-port");
+	snprintf(dev->name, MAX_DRIVER_NAME, "%08x.ethernet-port", (u32)gbe->regs);
 	dev->id = port->portno;
 	dev->parent = parent;
 	dev->device_node = port->np;
-- 
2.0.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 3/4] net: orion-gbe: extend RGMII detection to delayed modes
  2014-06-24 10:18 [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sebastian Hesselbarth
  2014-06-24 10:18 ` [PATCH 1/4] of: net: respect phy-connection-type property Sebastian Hesselbarth
  2014-06-24 10:18 ` [PATCH 2/4] net: orion: generate unique port device names Sebastian Hesselbarth
@ 2014-06-24 10:18 ` Sebastian Hesselbarth
  2014-06-24 10:18 ` [PATCH 4/4] net: phy: add support for Marvell PHY drivers Sebastian Hesselbarth
  2014-06-25  6:32 ` [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sascha Hauer
  4 siblings, 0 replies; 6+ messages in thread
From: Sebastian Hesselbarth @ 2014-06-24 10:18 UTC (permalink / raw)
  To: Sebastian Hesselbarth; +Cc: barebox

RGMII PHY modes include delayed interface modes RGMII_ID, RGMII_TXID,
and RGMII_RXID. Also check for those modes when setup RGMII mode in
port serial ctrl register.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
---
Cc: barebox@lists.infradead.org
---
 drivers/net/orion-gbe.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/net/orion-gbe.c b/drivers/net/orion-gbe.c
index 23c8346ec58f..991c8a80de31 100644
--- a/drivers/net/orion-gbe.c
+++ b/drivers/net/orion-gbe.c
@@ -447,7 +447,10 @@ static int port_probe(struct device_d *parent, struct port_priv *port)
 
 	reg = SC1_RESERVED;
 	reg |= DEFAULT_COL_LIMIT | COL_ON_BACKPRESS | INBAND_ANEG_BYPASS;
-	if (port->intf == PHY_INTERFACE_MODE_RGMII)
+	if (port->intf == PHY_INTERFACE_MODE_RGMII ||
+	    port->intf == PHY_INTERFACE_MODE_RGMII_ID ||
+	    port->intf == PHY_INTERFACE_MODE_RGMII_RXID ||
+	    port->intf == PHY_INTERFACE_MODE_RGMII_TXID)
 		reg |= RGMII_ENABLE;
 	writel(reg, port->regs + PORT_SC1);
 
-- 
2.0.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH 4/4] net: phy: add support for Marvell PHY drivers
  2014-06-24 10:18 [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sebastian Hesselbarth
                   ` (2 preceding siblings ...)
  2014-06-24 10:18 ` [PATCH 3/4] net: orion-gbe: extend RGMII detection to delayed modes Sebastian Hesselbarth
@ 2014-06-24 10:18 ` Sebastian Hesselbarth
  2014-06-25  6:32 ` [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sascha Hauer
  4 siblings, 0 replies; 6+ messages in thread
From: Sebastian Hesselbarth @ 2014-06-24 10:18 UTC (permalink / raw)
  To: Sebastian Hesselbarth; +Cc: barebox

This adds initial support for Marvell PHY specific drivers. As a first
PHY, a driver for MV88E1121R is ported over from Linux.

Signed-off-by: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
---
Cc: barebox@lists.infradead.org
---
 drivers/net/phy/Kconfig   |   5 ++
 drivers/net/phy/Makefile  |   1 +
 drivers/net/phy/marvell.c | 199 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 205 insertions(+)
 create mode 100644 drivers/net/phy/marvell.c

diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig
index 02e1e83c0b65..d0a02c1e402d 100644
--- a/drivers/net/phy/Kconfig
+++ b/drivers/net/phy/Kconfig
@@ -18,6 +18,11 @@ config LXT_PHY
 	---help---
 	  Currently supports the lxt971 PHY.
 
+config MARVELL_PHY
+	tristate "Drivers for Marvell PHYs"
+	---help---
+	  Add support for various Marvell PHYs (e.g. 88E1121R).
+
 config MICREL_PHY
 	bool "Driver for Micrel PHYs"
 	---help---
diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile
index 7f8277f1d52a..94b9be83ea7a 100644
--- a/drivers/net/phy/Makefile
+++ b/drivers/net/phy/Makefile
@@ -1,6 +1,7 @@
 obj-y += phy.o mdio_bus.o
 obj-$(CONFIG_AT803X_PHY)	+= at803x.o
 obj-$(CONFIG_LXT_PHY)		+= lxt.o
+obj-$(CONFIG_MARVELL_PHY)	+= marvell.o
 obj-$(CONFIG_MICREL_PHY)	+= micrel.o
 obj-$(CONFIG_NATIONAL_PHY)	+= national.o
 obj-$(CONFIG_SMSC_PHY)		+= smsc.o
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
new file mode 100644
index 000000000000..34f852e06550
--- /dev/null
+++ b/drivers/net/phy/marvell.c
@@ -0,0 +1,199 @@
+/*
+ * drivers/net/phy/marvell.c
+ *
+ * Driver for Marvell PHYs based on Linux driver
+ */
+
+#include <common.h>
+#include <init.h>
+#include <linux/mii.h>
+#include <linux/ethtool.h>
+#include <linux/phy.h>
+#include <linux/smscphy.h>
+
+/* Known PHY IDs */
+#define MARVELL_PHY_ID_88E1101		0x01410c60
+#define MARVELL_PHY_ID_88E1112		0x01410c90
+#define MARVELL_PHY_ID_88E1111		0x01410cc0
+#define MARVELL_PHY_ID_88E1118		0x01410e10
+#define MARVELL_PHY_ID_88E1121R		0x01410cb0
+#define MARVELL_PHY_ID_88E1145		0x01410cd0
+#define MARVELL_PHY_ID_88E1149R		0x01410e50
+#define MARVELL_PHY_ID_88E1240		0x01410e30
+#define MARVELL_PHY_ID_88E1318S		0x01410e90
+#define MARVELL_PHY_ID_88E1116R		0x01410e40
+#define MARVELL_PHY_ID_88E1510		0x01410dd0
+
+/* Mask used for ID comparisons */
+#define MARVELL_PHY_ID_MASK		0xfffffff0
+
+/* Marvell Register Page register */
+#define MII_MARVELL_PHY_PAGE		22
+#define MII_MARVELL_PHY_DEFAULT_PAGE	0
+
+#define MII_M1011_PHY_SCR		0x10
+#define MII_M1011_PHY_SCR_AUTO_CROSS	0x0060
+
+#define MII_M1011_PHY_STATUS		0x11
+#define MII_M1011_PHY_STATUS_1000	BIT(15)
+#define MII_M1011_PHY_STATUS_100	BIT(14)
+#define MII_M1011_PHY_STATUS_SPD_MASK	\
+	(MII_M1011_PHY_STATUS_1000 | MII_M1011_PHY_STATUS_100)
+#define MII_M1011_PHY_STATUS_FULLDUPLEX	BIT(13)
+#define MII_M1011_PHY_STATUS_RESOLVED	BIT(11)
+#define MII_M1011_PHY_STATUS_LINK	BIT(10)
+
+#define MII_88E1121_PHY_MSCR_PAGE	2
+#define MII_88E1121_PHY_MSCR		0x15
+#define MII_88E1121_PHY_MSCR_TX_DELAY	BIT(4)
+#define MII_88E1121_PHY_MSCR_RX_DELAY	BIT(5)
+#define MII_88E1121_PHY_MSCR_DELAY_MASK	\
+	(MII_88E1121_PHY_MSCR_RX_DELAY | MII_88E1121_PHY_MSCR_TX_DELAY)
+
+/*
+ * marvell_read_status
+ *
+ * Generic status code does not detect Fiber correctly!
+ * Description:
+ *   Check the link, then figure out the current state
+ *   by comparing what we advertise with what the link partner
+ *   advertises.  Start by checking the gigabit possibilities,
+ *   then move on to 10/100.
+ */
+static int marvell_read_status(struct phy_device *phydev)
+{
+	int adv;
+	int err;
+	int lpa;
+	int status = 0;
+
+	/* Update the link, but return if there
+	 * was an error */
+	err = genphy_update_link(phydev);
+	if (err)
+		return err;
+
+	if (AUTONEG_ENABLE == phydev->autoneg) {
+		status = phy_read(phydev, MII_M1011_PHY_STATUS);
+		if (status < 0)
+			return status;
+
+		lpa = phy_read(phydev, MII_LPA);
+		if (lpa < 0)
+			return lpa;
+
+		adv = phy_read(phydev, MII_ADVERTISE);
+		if (adv < 0)
+			return adv;
+
+		lpa &= adv;
+
+		if (status & MII_M1011_PHY_STATUS_FULLDUPLEX)
+			phydev->duplex = DUPLEX_FULL;
+		else
+			phydev->duplex = DUPLEX_HALF;
+
+		status = status & MII_M1011_PHY_STATUS_SPD_MASK;
+		phydev->pause = phydev->asym_pause = 0;
+
+		switch (status) {
+		case MII_M1011_PHY_STATUS_1000:
+			phydev->speed = SPEED_1000;
+			break;
+
+		case MII_M1011_PHY_STATUS_100:
+			phydev->speed = SPEED_100;
+			break;
+
+		default:
+			phydev->speed = SPEED_10;
+			break;
+		}
+
+		if (phydev->duplex == DUPLEX_FULL) {
+			phydev->pause = lpa & LPA_PAUSE_CAP ? 1 : 0;
+			phydev->asym_pause = lpa & LPA_PAUSE_ASYM ? 1 : 0;
+		}
+	} else {
+		int bmcr = phy_read(phydev, MII_BMCR);
+
+		if (bmcr < 0)
+			return bmcr;
+
+		if (bmcr & BMCR_FULLDPLX)
+			phydev->duplex = DUPLEX_FULL;
+		else
+			phydev->duplex = DUPLEX_HALF;
+
+		if (bmcr & BMCR_SPEED1000)
+			phydev->speed = SPEED_1000;
+		else if (bmcr & BMCR_SPEED100)
+			phydev->speed = SPEED_100;
+		else
+			phydev->speed = SPEED_10;
+
+		phydev->pause = phydev->asym_pause = 0;
+	}
+
+	return 0;
+}
+
+static int m88e1121_config_init(struct phy_device *phydev)
+{
+	u16 reg;
+	int ret;
+
+	ret = phy_write(phydev, MII_MARVELL_PHY_PAGE,
+			MII_88E1121_PHY_MSCR_PAGE);
+	if (ret < 0)
+		return ret;
+
+	/* Setup RGMII TX/RX delay */
+	reg = phy_read(phydev, MII_88E1121_PHY_MSCR) &
+		~MII_88E1121_PHY_MSCR_DELAY_MASK;
+	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
+	    phydev->interface == PHY_INTERFACE_MODE_RGMII_RXID)
+		reg |= MII_88E1121_PHY_MSCR_RX_DELAY;
+	if (phydev->interface == PHY_INTERFACE_MODE_RGMII_ID ||
+	    phydev->interface == PHY_INTERFACE_MODE_RGMII_TXID)
+		reg |= MII_88E1121_PHY_MSCR_TX_DELAY;
+	ret = phy_write(phydev, MII_88E1121_PHY_MSCR, reg);
+	if (ret < 0)
+		return ret;
+
+	phy_write(phydev, MII_MARVELL_PHY_PAGE, MII_MARVELL_PHY_DEFAULT_PAGE);
+	if (ret < 0)
+		return ret;
+
+	/* Enable auto-crossover */
+	ret = phy_write(phydev, MII_M1011_PHY_SCR,
+			MII_M1011_PHY_SCR_AUTO_CROSS);
+	if (ret < 0)
+		return ret;
+
+	/* Reset PHY */
+	ret = phy_write(phydev, MII_BMCR,
+			phy_read(phydev, MII_BMCR) | BMCR_RESET);
+	if (ret < 0)
+		return ret;
+
+	return 0;
+}
+
+static struct phy_driver marvell_phys[] = {
+{
+	.phy_id		= MARVELL_PHY_ID_88E1121R,
+	.phy_id_mask	= MARVELL_PHY_ID_MASK,
+	.drv.name	= "Marvell 88E1121R",
+	.features	= PHY_GBIT_FEATURES,
+	.config_init	= m88e1121_config_init,
+	.config_aneg	= genphy_config_aneg,
+	.read_status	= marvell_read_status,
+},
+};
+
+static int __init marvell_phy_init(void)
+{
+	return phy_drivers_register(marvell_phys, ARRAY_SIZE(marvell_phys));
+}
+fs_initcall(marvell_phy_init);
-- 
2.0.0


_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH 0/4] Orion GBE fixes and Marvell PHY driver
  2014-06-24 10:18 [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sebastian Hesselbarth
                   ` (3 preceding siblings ...)
  2014-06-24 10:18 ` [PATCH 4/4] net: phy: add support for Marvell PHY drivers Sebastian Hesselbarth
@ 2014-06-25  6:32 ` Sascha Hauer
  4 siblings, 0 replies; 6+ messages in thread
From: Sascha Hauer @ 2014-06-25  6:32 UTC (permalink / raw)
  To: Sebastian Hesselbarth; +Cc: barebox

On Tue, Jun 24, 2014 at 12:18:07PM +0200, Sebastian Hesselbarth wrote:
> This patch set comprises some fixes and improvements related with ethernet
> support on Marvell Orion SoC based boards.
> 
> Patch 1 adds a check for ePAPR standard "phy-connection-type" property to
> of_get_phy_mode.
> 
> Patch 2 resolves a device name conflict on orion-gbe port names when using
> more than one controller instance.
> 
> Patch 3 extends ethernet serial port setup to also check for delayed RGMII
> interface modes.
> 
> Patch 4 finally adds a driver for Marvell PHYs with 88E1121R as a first
> PHY driver.
> 
> The patches have been tested on Globalscale Guruplug. For ethernet, the
> board needs a DT fix that has been picked up for Linux v3.16-rc yesterday
> and should be available in barebox soon. For the second ethernet port,
> barebox is still missing pinctrl for Kirkwood, but that is next on my
> "polish private branches for submission"-TODO list.
> 
> Sebastian Hesselbarth (4):
>   of: net: respect phy-connection-type property
>   net: orion: generate unique port device names
>   net: orion-gbe: extend RGMII detection to delayed modes
>   net: phy: add support for Marvell PHY drivers

Applied, thanks

Sascha

-- 
Pengutronix e.K.                           |                             |
Industrial Linux Solutions                 | http://www.pengutronix.de/  |
Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686           | Fax:   +49-5121-206917-5555 |

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2014-06-25  6:32 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-06-24 10:18 [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sebastian Hesselbarth
2014-06-24 10:18 ` [PATCH 1/4] of: net: respect phy-connection-type property Sebastian Hesselbarth
2014-06-24 10:18 ` [PATCH 2/4] net: orion: generate unique port device names Sebastian Hesselbarth
2014-06-24 10:18 ` [PATCH 3/4] net: orion-gbe: extend RGMII detection to delayed modes Sebastian Hesselbarth
2014-06-24 10:18 ` [PATCH 4/4] net: phy: add support for Marvell PHY drivers Sebastian Hesselbarth
2014-06-25  6:32 ` [PATCH 0/4] Orion GBE fixes and Marvell PHY driver Sascha Hauer

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox