* [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