public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
* [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks
@ 2014-10-17 17:44 Ivan Khoronzhuk
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 1/5] net: phy: print a number of phy that is not found Ivan Khoronzhuk
                   ` (5 more replies)
  0 siblings, 6 replies; 12+ messages in thread
From: Ivan Khoronzhuk @ 2014-10-17 17:44 UTC (permalink / raw)
  To: u-boot

This patch series optimize keystone_net driver to use MDIO bus and
eht PHY frameworks.

Based on
"[U-boot] [Patch v3 0/5] keystone2: serdes: add seredes driver"
https://www.mail-archive.com/u-boot at lists.denx.de/msg148694.html

v2..v1
  net: keystone_net: register eth PHYs on MDIO bus
	- add ability for choosing to configure phy at init or not

Ivan Khoronzhuk (5):
  net: phy: print a number of phy that is not found
  net: keystone_net: use mdio_reset function
  net: keystone_net: register MDIO bus
  net: keystone_net: register eth PHYs on MDIO bus
  net: keystone_net: use general get link function

 arch/arm/include/asm/ti-common/keystone_net.h |   1 +
 drivers/net/keystone_net.c                    | 171 ++++++++++++--------------
 drivers/net/phy/phy.c                         |   2 +-
 include/configs/ks2_evm.h                     |   3 +-
 4 files changed, 81 insertions(+), 96 deletions(-)

-- 
1.8.3.2

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

* [U-Boot] [U-boot] [Patch v2 1/5] net: phy: print a number of phy that is not found
  2014-10-17 17:44 [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
@ 2014-10-17 17:44 ` Ivan Khoronzhuk
  2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 2/5] net: keystone_net: use mdio_reset function Ivan Khoronzhuk
                   ` (4 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Ivan Khoronzhuk @ 2014-10-17 17:44 UTC (permalink / raw)
  To: u-boot

In case when several Ethernet ports are supported it's
convenient to see the number of phy that is not found.

Acked-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
---
 drivers/net/phy/phy.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c
index 1d6c14f..99b0b83 100644
--- a/drivers/net/phy/phy.c
+++ b/drivers/net/phy/phy.c
@@ -648,7 +648,7 @@ static struct phy_device *get_phy_device_by_mask(struct mii_dev *bus,
 		if (phydev)
 			return phydev;
 	}
-	printf("Phy not found\n");
+	printf("Phy %d not found\n", ffs(phy_mask) - 1);
 	return phy_device_create(bus, ffs(phy_mask) - 1, 0xffffffff, interface);
 }
 
-- 
1.8.3.2

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

* [U-Boot] [U-boot] [Patch v2 2/5] net: keystone_net: use mdio_reset function
  2014-10-17 17:44 [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 1/5] net: phy: print a number of phy that is not found Ivan Khoronzhuk
@ 2014-10-17 17:44 ` Ivan Khoronzhuk
  2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 3/5] net: keystone_net: register MDIO bus Ivan Khoronzhuk
                   ` (3 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Ivan Khoronzhuk @ 2014-10-17 17:44 UTC (permalink / raw)
  To: u-boot

Don't use mdio_enable twice while eth open. Also rename it to
keystone2_mdio_reset as more appropriate name.

Acked-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
---
 drivers/net/keystone_net.c | 16 ++--------------
 1 file changed, 2 insertions(+), 14 deletions(-)

diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c
index 8a45fbd..3f9650c 100644
--- a/drivers/net/keystone_net.c
+++ b/drivers/net/keystone_net.c
@@ -38,7 +38,6 @@ struct rx_buff_desc net_rx_buffs = {
 	.rx_flow	= 22,
 };
 
-static void keystone2_eth_mdio_enable(void);
 static void keystone2_net_serdes_setup(void);
 
 static int gen_get_link_speed(int phy_addr);
@@ -71,7 +70,7 @@ int keystone2_eth_read_mac_addr(struct eth_device *dev)
 	return 0;
 }
 
-static void keystone2_eth_mdio_enable(void)
+static void keystone2_mdio_reset(void)
 {
 	u_int32_t	clkdiv;
 
@@ -397,7 +396,6 @@ int32_t cpmac_drv_send(u32 *buffer, int num_bytes, int slave_port_num)
 /* Eth device open */
 static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
 {
-	u_int32_t clkdiv;
 	int link;
 	struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv;
 
@@ -410,9 +408,6 @@ static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
 
 	keystone2_net_serdes_setup();
 
-	if (sys_has_mdio)
-		keystone2_eth_mdio_enable();
-
 	keystone_sgmii_config(eth_priv->slave_port - 1,
 			      eth_priv->sgmii_link_type);
 
@@ -440,14 +435,7 @@ static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
 	hw_config_streaming_switch();
 
 	if (sys_has_mdio) {
-		/* Init MDIO & get link state */
-		clkdiv = (EMAC_MDIO_BUS_FREQ / EMAC_MDIO_CLOCK_FREQ) - 1;
-		writel((clkdiv & 0xff) | MDIO_CONTROL_ENABLE |
-		       MDIO_CONTROL_FAULT, &adap_mdio->control)
-			;
-
-		/* We need to wait for MDIO to start */
-		udelay(1000);
+		keystone2_mdio_reset();
 
 		link = keystone_get_link_status(dev);
 		if (link == 0) {
-- 
1.8.3.2

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

* [U-Boot] [U-boot] [Patch v2 3/5] net: keystone_net: register MDIO bus
  2014-10-17 17:44 [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 1/5] net: phy: print a number of phy that is not found Ivan Khoronzhuk
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 2/5] net: keystone_net: use mdio_reset function Ivan Khoronzhuk
@ 2014-10-17 17:44 ` Ivan Khoronzhuk
  2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 4/5] net: keystone_net: register eth PHYs on " Ivan Khoronzhuk
                   ` (2 subsequent siblings)
  5 siblings, 1 reply; 12+ messages in thread
From: Ivan Khoronzhuk @ 2014-10-17 17:44 UTC (permalink / raw)
  To: u-boot

Currently MDIO framework is not used to configure Ethernet PHY.
As result some of already implemented functions are duplicated.
So register MDIO bus in order to use it. On that stage it's just
registered, it'll be used as we start to use PHY framework.

Use mdio bus read/write/reset functions in the driver.

Acked-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
---
 drivers/net/keystone_net.c | 93 +++++++++++++++++++++++++++-------------------
 1 file changed, 55 insertions(+), 38 deletions(-)

diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c
index 3f9650c..265530a 100644
--- a/drivers/net/keystone_net.c
+++ b/drivers/net/keystone_net.c
@@ -17,6 +17,7 @@
 #include <asm/ti-common/keystone_serdes.h>
 
 unsigned int emac_open;
+static struct mii_dev *mdio_bus;
 static unsigned int sys_has_mdio = 1;
 
 #ifdef KEYSTONE2_EMAC_GIG_ENABLE
@@ -42,10 +43,6 @@ static void keystone2_net_serdes_setup(void);
 
 static int gen_get_link_speed(int phy_addr);
 
-/* EMAC Addresses */
-static volatile struct mdio_regs	*adap_mdio =
-	(struct mdio_regs *)EMAC_MDIO_BASE_ADDR;
-
 int keystone2_eth_read_mac_addr(struct eth_device *dev)
 {
 	struct eth_priv_t *eth_priv;
@@ -70,64 +67,67 @@ int keystone2_eth_read_mac_addr(struct eth_device *dev)
 	return 0;
 }
 
-static void keystone2_mdio_reset(void)
+/* MDIO */
+
+static int keystone2_mdio_reset(struct mii_dev *bus)
 {
-	u_int32_t	clkdiv;
+	u_int32_t clkdiv;
+	struct mdio_regs *adap_mdio = bus->priv;
 
 	clkdiv = (EMAC_MDIO_BUS_FREQ / EMAC_MDIO_CLOCK_FREQ) - 1;
 
-	writel((clkdiv & 0xffff) |
-	       MDIO_CONTROL_ENABLE |
-	       MDIO_CONTROL_FAULT |
-	       MDIO_CONTROL_FAULT_ENABLE,
+	writel((clkdiv & 0xffff) | MDIO_CONTROL_ENABLE |
+	       MDIO_CONTROL_FAULT | MDIO_CONTROL_FAULT_ENABLE,
 	       &adap_mdio->control);
 
 	while (readl(&adap_mdio->control) & MDIO_CONTROL_IDLE)
 		;
+
+	return 0;
 }
 
-/* Read a PHY register via MDIO inteface. Returns 1 on success, 0 otherwise */
-int keystone2_eth_phy_read(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t *data)
+/**
+ * keystone2_mdio_read - read a PHY register via MDIO interface.
+ * Blocks until operation is complete.
+ */
+static int keystone2_mdio_read(struct mii_dev *bus,
+			       int addr, int devad, int reg)
 {
-	int	tmp;
+	int tmp;
+	struct mdio_regs *adap_mdio = bus->priv;
 
 	while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO)
 		;
 
-	writel(MDIO_USERACCESS0_GO |
-	       MDIO_USERACCESS0_WRITE_READ |
-	       ((reg_num & 0x1f) << 21) |
-	       ((phy_addr & 0x1f) << 16),
+	writel(MDIO_USERACCESS0_GO | MDIO_USERACCESS0_WRITE_READ |
+	       ((reg & 0x1f) << 21) | ((addr & 0x1f) << 16),
 	       &adap_mdio->useraccess0);
 
 	/* Wait for command to complete */
 	while ((tmp = readl(&adap_mdio->useraccess0)) & MDIO_USERACCESS0_GO)
 		;
 
-	if (tmp & MDIO_USERACCESS0_ACK) {
-		*data = tmp & 0xffff;
-		return 0;
-	}
+	if (tmp & MDIO_USERACCESS0_ACK)
+		return tmp & 0xffff;
 
-	*data = -1;
 	return -1;
 }
 
-/*
- * Write to a PHY register via MDIO inteface.
+/**
+ * keystone2_mdio_write - write to a PHY register via MDIO interface.
  * Blocks until operation is complete.
  */
-int keystone2_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data)
+static int keystone2_mdio_write(struct mii_dev *bus,
+				int addr, int devad, int reg, u16 val)
 {
+	struct mdio_regs *adap_mdio = bus->priv;
+
 	while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO)
 		;
 
-	writel(MDIO_USERACCESS0_GO |
-	       MDIO_USERACCESS0_WRITE_WRITE |
-	       ((reg_num & 0x1f) << 21) |
-	       ((phy_addr & 0x1f) << 16) |
-	       (data & 0xffff),
-	       &adap_mdio->useraccess0);
+	writel(MDIO_USERACCESS0_GO | MDIO_USERACCESS0_WRITE_WRITE |
+	       ((reg & 0x1f) << 21) | ((addr & 0x1f) << 16) |
+	       (val & 0xffff), &adap_mdio->useraccess0);
 
 	/* Wait for command to complete */
 	while (readl(&adap_mdio->useraccess0) & MDIO_USERACCESS0_GO)
@@ -139,12 +139,12 @@ int keystone2_eth_phy_write(u_int8_t phy_addr, u_int8_t reg_num, u_int16_t data)
 /* PHY functions for a generic PHY */
 static int gen_get_link_speed(int phy_addr)
 {
-	u_int16_t	tmp;
+	u_int16_t tmp;
 
-	if ((!keystone2_eth_phy_read(phy_addr, MII_STATUS_REG, &tmp)) &&
-	    (tmp & 0x04)) {
+	tmp = mdio_bus->read(mdio_bus, phy_addr,
+			     MDIO_DEVAD_NONE, MII_STATUS_REG);
+	if (tmp & 0x04)
 		return 0;
-	}
 
 	return -1;
 }
@@ -156,8 +156,10 @@ static void  __attribute__((unused))
 	struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv;
 
 	if (sys_has_mdio) {
-		if (keystone2_eth_phy_read(eth_priv->phy_addr, 0, &data) ||
-		    !(data & (1 << 6))) /* speed selection MSB */
+		data = keystone2_mdio_read(mdio_bus, eth_priv->phy_addr,
+					   MDIO_DEVAD_NONE, 0);
+		/* speed selection MSB */
+		if (!(data & (1 << 6)))
 			return;
 	}
 
@@ -435,7 +437,7 @@ static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
 	hw_config_streaming_switch();
 
 	if (sys_has_mdio) {
-		keystone2_mdio_reset();
+		keystone2_mdio_reset(mdio_bus);
 
 		link = keystone_get_link_status(dev);
 		if (link == 0) {
@@ -518,6 +520,7 @@ static int keystone2_eth_rcv_packet(struct eth_device *dev)
  */
 int keystone2_emac_initialize(struct eth_priv_t *eth_priv)
 {
+	int res;
 	struct eth_device *dev;
 
 	dev = malloc(sizeof(struct eth_device));
@@ -539,6 +542,20 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv)
 
 	eth_register(dev);
 
+	/* Register MDIO bus if it's not registered yet */
+	if (!mdio_bus) {
+		mdio_bus	= mdio_alloc();
+		mdio_bus->read	= keystone2_mdio_read;
+		mdio_bus->write	= keystone2_mdio_write;
+		mdio_bus->reset	= keystone2_mdio_reset;
+		mdio_bus->priv	= (void *)EMAC_MDIO_BASE_ADDR;
+		sprintf(mdio_bus->name, "ethernet-mdio");
+
+		res = mdio_register(mdio_bus);
+		if (res)
+			return res;
+	}
+
 	return 0;
 }
 
-- 
1.8.3.2

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

* [U-Boot] [U-boot] [Patch v2 4/5] net: keystone_net: register eth PHYs on MDIO bus
  2014-10-17 17:44 [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
                   ` (2 preceding siblings ...)
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 3/5] net: keystone_net: register MDIO bus Ivan Khoronzhuk
@ 2014-10-17 17:44 ` Ivan Khoronzhuk
  2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 5/5] net: keystone_net: use general get link function Ivan Khoronzhuk
  2014-10-17 19:06 ` [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
  5 siblings, 1 reply; 12+ messages in thread
From: Ivan Khoronzhuk @ 2014-10-17 17:44 UTC (permalink / raw)
  To: u-boot

As MDIO bus has been added we can register PHYs with it.
After registration, the PHY driver will be probed according to the
hardware on board.

Startup PHY at the ethernet open.

Use phy_startup() instead of keystone_get_link_status() when eth open,
as it verifies PHY link inside and SGMII link is checked before.

For K2HK evm PHY configuration at init was absent, so don't enable
phy config at init for k2hk evm.

Acked-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
---
 arch/arm/include/asm/ti-common/keystone_net.h |  1 +
 drivers/net/keystone_net.c                    | 24 +++++++++++++++++++++---
 include/configs/ks2_evm.h                     |  2 ++
 3 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/arch/arm/include/asm/ti-common/keystone_net.h b/arch/arm/include/asm/ti-common/keystone_net.h
index e56759d..011c03c 100644
--- a/arch/arm/include/asm/ti-common/keystone_net.h
+++ b/arch/arm/include/asm/ti-common/keystone_net.h
@@ -239,6 +239,7 @@ struct eth_priv_t {
 	int phy_addr;
 	int slave_port;
 	int sgmii_link_type;
+	struct phy_device *phy_dev;
 };
 
 int keystone2_emac_initialize(struct eth_priv_t *eth_priv);
diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c
index 265530a..fa8e1ef 100644
--- a/drivers/net/keystone_net.c
+++ b/drivers/net/keystone_net.c
@@ -10,6 +10,7 @@
 #include <command.h>
 
 #include <net.h>
+#include <phy.h>
 #include <miiphy.h>
 #include <malloc.h>
 #include <asm/ti-common/keystone_nav.h>
@@ -398,8 +399,8 @@ int32_t cpmac_drv_send(u32 *buffer, int num_bytes, int slave_port_num)
 /* Eth device open */
 static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
 {
-	int link;
 	struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv;
+	struct phy_device *phy_dev = eth_priv->phy_dev;
 
 	debug("+ emac_open\n");
 
@@ -439,8 +440,8 @@ static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
 	if (sys_has_mdio) {
 		keystone2_mdio_reset(mdio_bus);
 
-		link = keystone_get_link_status(dev);
-		if (link == 0) {
+		phy_startup(phy_dev);
+		if (phy_dev->link == 0) {
 			ksnav_close(&netcp_pktdma);
 			qm_close();
 			return -1;
@@ -461,6 +462,9 @@ static int keystone2_eth_open(struct eth_device *dev, bd_t *bis)
 /* Eth device close */
 void keystone2_eth_close(struct eth_device *dev)
 {
+	struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv;
+	struct phy_device *phy_dev = eth_priv->phy_dev;
+
 	debug("+ emac_close\n");
 
 	if (!emac_open)
@@ -470,6 +474,7 @@ void keystone2_eth_close(struct eth_device *dev)
 
 	ksnav_close(&netcp_pktdma);
 	qm_close();
+	phy_shutdown(phy_dev);
 
 	emac_open = 0;
 
@@ -522,6 +527,7 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv)
 {
 	int res;
 	struct eth_device *dev;
+	struct phy_device *phy_dev;
 
 	dev = malloc(sizeof(struct eth_device));
 	if (dev == NULL)
@@ -556,6 +562,18 @@ int keystone2_emac_initialize(struct eth_priv_t *eth_priv)
 			return res;
 	}
 
+	/* Create phy device and bind it with driver */
+#ifdef CONFIG_KSNET_MDIO_PHY_CONFIG_ENABLE
+	phy_dev = phy_connect(mdio_bus, eth_priv->phy_addr,
+			      dev, PHY_INTERFACE_MODE_SGMII);
+	phy_config(phy_dev);
+#else
+	phy_dev = phy_find_by_mask(mdio_bus, 1 << eth_priv->phy_addr,
+				   PHY_INTERFACE_MODE_SGMII);
+	phy_dev->dev = dev;
+#endif
+	eth_priv->phy_dev = phy_dev;
+
 	return 0;
 }
 
diff --git a/include/configs/ks2_evm.h b/include/configs/ks2_evm.h
index 7fbb648..8d02d18 100644
--- a/include/configs/ks2_evm.h
+++ b/include/configs/ks2_evm.h
@@ -94,6 +94,8 @@
 #define CONFIG_SYS_SPI2_NUM_CS		4
 
 /* Network Configuration */
+#define CONFIG_PHYLIB
+#define CONFIG_PHY_MARVELL
 #define CONFIG_MII
 #define CONFIG_BOOTP_DEFAULT
 #define CONFIG_BOOTP_DNS
-- 
1.8.3.2

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

* [U-Boot] [U-boot] [Patch v2 5/5] net: keystone_net: use general get link function
  2014-10-17 17:44 [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
                   ` (3 preceding siblings ...)
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 4/5] net: keystone_net: register eth PHYs on " Ivan Khoronzhuk
@ 2014-10-17 17:44 ` Ivan Khoronzhuk
  2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
  2014-10-17 19:06 ` [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
  5 siblings, 1 reply; 12+ messages in thread
From: Ivan Khoronzhuk @ 2014-10-17 17:44 UTC (permalink / raw)
  To: u-boot

The phy framework has function to get link, so use it
instead of own implementation.

There is no reason to check SGMII link while sending each
packet, phy link is enough. Check SGMII link only while
ethernet open.

Acked-by: Vitaly Andrianov <vitalya@ti.com>
Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>
---
 drivers/net/keystone_net.c | 50 +++++-----------------------------------------
 include/configs/ks2_evm.h  |  1 -
 2 files changed, 5 insertions(+), 46 deletions(-)

diff --git a/drivers/net/keystone_net.c b/drivers/net/keystone_net.c
index fa8e1ef..13a1778 100644
--- a/drivers/net/keystone_net.c
+++ b/drivers/net/keystone_net.c
@@ -42,8 +42,6 @@ struct rx_buff_desc net_rx_buffs = {
 
 static void keystone2_net_serdes_setup(void);
 
-static int gen_get_link_speed(int phy_addr);
-
 int keystone2_eth_read_mac_addr(struct eth_device *dev)
 {
 	struct eth_priv_t *eth_priv;
@@ -137,19 +135,6 @@ static int keystone2_mdio_write(struct mii_dev *bus,
 	return 0;
 }
 
-/* PHY functions for a generic PHY */
-static int gen_get_link_speed(int phy_addr)
-{
-	u_int16_t tmp;
-
-	tmp = mdio_bus->read(mdio_bus, phy_addr,
-			     MDIO_DEVAD_NONE, MII_STATUS_REG);
-	if (tmp & 0x04)
-		return 0;
-
-	return -1;
-}
-
 static void  __attribute__((unused))
 	keystone2_eth_gigabit_enable(struct eth_device *dev)
 {
@@ -180,35 +165,8 @@ int keystone_sgmii_link_status(int port)
 
 	status = __raw_readl(SGMII_STATUS_REG(port));
 
-	return status & SGMII_REG_STATUS_LINK;
-}
-
-
-int keystone_get_link_status(struct eth_device *dev)
-{
-	struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv;
-	int sgmii_link;
-	int link_state = 0;
-#if CONFIG_GET_LINK_STATUS_ATTEMPTS > 1
-	int j;
-
-	for (j = 0; (j < CONFIG_GET_LINK_STATUS_ATTEMPTS) && (link_state == 0);
-	     j++) {
-#endif
-		sgmii_link =
-			keystone_sgmii_link_status(eth_priv->slave_port - 1);
-
-		if (sgmii_link) {
-			link_state = 1;
-
-			if (eth_priv->sgmii_link_type == SGMII_LINK_MAC_PHY)
-				if (gen_get_link_speed(eth_priv->phy_addr))
-					link_state = 0;
-		}
-#if CONFIG_GET_LINK_STATUS_ATTEMPTS > 1
-	}
-#endif
-	return link_state;
+	return (status & SGMII_REG_STATUS_LOCK) &&
+	       (status & SGMII_REG_STATUS_LINK);
 }
 
 int keystone_sgmii_config(int port, int interface)
@@ -490,8 +448,10 @@ static int keystone2_eth_send_packet(struct eth_device *dev,
 {
 	int ret_status = -1;
 	struct eth_priv_t *eth_priv = (struct eth_priv_t *)dev->priv;
+	struct phy_device *phy_dev = eth_priv->phy_dev;
 
-	if (keystone_get_link_status(dev) == 0)
+	genphy_update_link(phy_dev);
+	if (phy_dev->link == 0)
 		return -1;
 
 	if (cpmac_drv_send((u32 *)packet, length, eth_priv->slave_port) != 0)
diff --git a/include/configs/ks2_evm.h b/include/configs/ks2_evm.h
index 8d02d18..dcce7c3 100644
--- a/include/configs/ks2_evm.h
+++ b/include/configs/ks2_evm.h
@@ -103,7 +103,6 @@
 #define CONFIG_BOOTP_SEND_HOSTNAME
 #define CONFIG_NET_RETRY_COUNT		32
 #define CONFIG_NET_MULTI
-#define CONFIG_GET_LINK_STATUS_ATTEMPTS	5
 #define CONFIG_SYS_SGMII_REFCLK_MHZ	312
 #define CONFIG_SYS_SGMII_LINERATE_MHZ	1250
 #define CONFIG_SYS_SGMII_RATESCALE	2
-- 
1.8.3.2

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

* [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks
  2014-10-17 17:44 [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
                   ` (4 preceding siblings ...)
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 5/5] net: keystone_net: use general get link function Ivan Khoronzhuk
@ 2014-10-17 19:06 ` Ivan Khoronzhuk
  5 siblings, 0 replies; 12+ messages in thread
From: Ivan Khoronzhuk @ 2014-10-17 19:06 UTC (permalink / raw)
  To: u-boot

On 10/17/2014 08:44 PM, Ivan Khoronzhuk wrote:
> This patch series optimize keystone_net driver to use MDIO bus and
> eht PHY frameworks.
>
> Based on
> "[U-boot] [Patch v3 0/5] keystone2: serdes: add seredes driver"
> https://www.mail-archive.com/u-boot at lists.denx.de/msg148694.html
link update
https://www.mail-archive.com/u-boot at lists.denx.de/msg150347.html

-- 
Regards,
Ivan Khoronzhuk

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

* [U-Boot] [U-Boot, U-boot, v2, 1/5] net: phy: print a number of phy that is not found
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 1/5] net: phy: print a number of phy that is not found Ivan Khoronzhuk
@ 2014-10-23 17:14   ` Tom Rini
  0 siblings, 0 replies; 12+ messages in thread
From: Tom Rini @ 2014-10-23 17:14 UTC (permalink / raw)
  To: u-boot

On Fri, Oct 17, 2014 at 08:44:32PM +0300, Khoronzhuk, Ivan wrote:

> In case when several Ethernet ports are supported it's
> convenient to see the number of phy that is not found.
> 
> Acked-by: Vitaly Andrianov <vitalya@ti.com>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>

Applied to u-boot-ti/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141023/199ffd6d/attachment.pgp>

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

* [U-Boot] [U-Boot, U-boot, v2, 2/5] net: keystone_net: use mdio_reset function
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 2/5] net: keystone_net: use mdio_reset function Ivan Khoronzhuk
@ 2014-10-23 17:14   ` Tom Rini
  0 siblings, 0 replies; 12+ messages in thread
From: Tom Rini @ 2014-10-23 17:14 UTC (permalink / raw)
  To: u-boot

On Fri, Oct 17, 2014 at 08:44:33PM +0300, Khoronzhuk, Ivan wrote:

> Don't use mdio_enable twice while eth open. Also rename it to
> keystone2_mdio_reset as more appropriate name.
> 
> Acked-by: Vitaly Andrianov <vitalya@ti.com>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>

Applied to u-boot-ti/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141023/9cf7d0c1/attachment.pgp>

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

* [U-Boot] [U-Boot, U-boot, v2, 3/5] net: keystone_net: register MDIO bus
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 3/5] net: keystone_net: register MDIO bus Ivan Khoronzhuk
@ 2014-10-23 17:14   ` Tom Rini
  0 siblings, 0 replies; 12+ messages in thread
From: Tom Rini @ 2014-10-23 17:14 UTC (permalink / raw)
  To: u-boot

On Fri, Oct 17, 2014 at 08:44:34PM +0300, Khoronzhuk, Ivan wrote:

> Currently MDIO framework is not used to configure Ethernet PHY.
> As result some of already implemented functions are duplicated.
> So register MDIO bus in order to use it. On that stage it's just
> registered, it'll be used as we start to use PHY framework.
> 
> Use mdio bus read/write/reset functions in the driver.
> 
> Acked-by: Vitaly Andrianov <vitalya@ti.com>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>

Applied to u-boot-ti/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141023/23480730/attachment.pgp>

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

* [U-Boot] [U-Boot, U-boot, v2, 4/5] net: keystone_net: register eth PHYs on MDIO bus
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 4/5] net: keystone_net: register eth PHYs on " Ivan Khoronzhuk
@ 2014-10-23 17:14   ` Tom Rini
  0 siblings, 0 replies; 12+ messages in thread
From: Tom Rini @ 2014-10-23 17:14 UTC (permalink / raw)
  To: u-boot

On Fri, Oct 17, 2014 at 08:44:35PM +0300, Khoronzhuk, Ivan wrote:

> As MDIO bus has been added we can register PHYs with it.
> After registration, the PHY driver will be probed according to the
> hardware on board.
> 
> Startup PHY at the ethernet open.
> 
> Use phy_startup() instead of keystone_get_link_status() when eth open,
> as it verifies PHY link inside and SGMII link is checked before.
> 
> For K2HK evm PHY configuration at init was absent, so don't enable
> phy config at init for k2hk evm.
> 
> Acked-by: Vitaly Andrianov <vitalya@ti.com>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>

Applied to u-boot-ti/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141023/5801ee36/attachment.pgp>

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

* [U-Boot] [U-Boot, U-boot, v2, 5/5] net: keystone_net: use general get link function
  2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 5/5] net: keystone_net: use general get link function Ivan Khoronzhuk
@ 2014-10-23 17:14   ` Tom Rini
  0 siblings, 0 replies; 12+ messages in thread
From: Tom Rini @ 2014-10-23 17:14 UTC (permalink / raw)
  To: u-boot

On Fri, Oct 17, 2014 at 08:44:36PM +0300, Khoronzhuk, Ivan wrote:

> The phy framework has function to get link, so use it
> instead of own implementation.
> 
> There is no reason to check SGMII link while sending each
> packet, phy link is enough. Check SGMII link only while
> ethernet open.
> 
> Acked-by: Vitaly Andrianov <vitalya@ti.com>
> Signed-off-by: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com>

Applied to u-boot-ti/master, thanks!

-- 
Tom
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 836 bytes
Desc: Digital signature
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20141023/56a58b73/attachment.pgp>

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

end of thread, other threads:[~2014-10-23 17:14 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-17 17:44 [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk
2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 1/5] net: phy: print a number of phy that is not found Ivan Khoronzhuk
2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 2/5] net: keystone_net: use mdio_reset function Ivan Khoronzhuk
2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 3/5] net: keystone_net: register MDIO bus Ivan Khoronzhuk
2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 4/5] net: keystone_net: register eth PHYs on " Ivan Khoronzhuk
2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
2014-10-17 17:44 ` [U-Boot] [U-boot] [Patch v2 5/5] net: keystone_net: use general get link function Ivan Khoronzhuk
2014-10-23 17:14   ` [U-Boot] [U-Boot, U-boot, v2, " Tom Rini
2014-10-17 19:06 ` [U-Boot] [U-boot] [Patch v2 0/5] keystone_net: use MDIO bus and eth PHY frameworks Ivan Khoronzhuk

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