All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH v4 0/5] Switch MVPP2 to use new MVMDIO
@ 2019-08-15 22:08 nhed+uboot at starry.com
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error nhed+uboot at starry.com
                   ` (4 more replies)
  0 siblings, 5 replies; 16+ messages in thread
From: nhed+uboot at starry.com @ 2019-08-15 22:08 UTC (permalink / raw
  To: u-boot

From: Nevo Hed <nhed+github@starry.com>

This patchset includes a couple of commits form Marvell's downstream repo
and a change to replace mvpp2's SMI implementation with the new MVMDIO
driver.  The mvpp2 change is based partially on Ken Ma's mods against an
earlier (his) version of MVMDIO that never made it to upstream and has
since been re-implemented by Alex Marginean and seems to be in line for
inclusion [1].  Puicked a few other mvpp2 patches from the afformentioned
Marvell repo as they seemed important yet missing from upstream.

Changes since v3:
 - Squashed the NULL dereference fix
 - Fixed multi-line comment format
 - Squashed the two mvpp2.c changes to use MVMDIO tinto a single one that
   can stand on its own.

Changes since v2:
 - Removed `Reviewed-on` lines from Marvell commits, they are meaningless
   in upstream U-Boot
 - Commit messages rewording
 - Split out Kconfig (select of MVMDIO & DM_MDIO by MVPP2)
 - reworded heading on dtsi change to match last commit (due to noticing
   no delegates weere listed on patchworks)

Changes since v1:
 - removes a redaundant fixed-link patch

  [1] https://patchwork.ozlabs.org/cover/1136769/

Grzegorz Jaszczyk (1):
  net: mvpp2: mark phy as invalid in case of missing appropriate driver

Nevo Hed (3):
  arm: dts: armada-cp110-*dtsi: add xmdio nodes
  net: mvpp2: use new MVMDIO driver
  net: mvpp2: MVPP2 now needs MVMDIO

Stefan Chulski (1):
  net: mvpp2x: fix traffic stuck after PHY start error

 arch/arm/dts/armada-cp110-master.dtsi |   9 +
 arch/arm/dts/armada-cp110-slave.dtsi  |   9 +
 drivers/net/Kconfig                   |   2 +
 drivers/net/mvpp2.c                   | 241 ++++++--------------------
 4 files changed, 73 insertions(+), 188 deletions(-)

--
2.21.0

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

* [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error
  2019-08-15 22:08 [U-Boot] [PATCH v4 0/5] Switch MVPP2 to use new MVMDIO nhed+uboot at starry.com
@ 2019-08-15 22:08 ` nhed+uboot at starry.com
  2019-11-13 22:40   ` Ramon Fried
  2019-11-30  0:58   ` Joe Hershberger
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 2/5] net: mvpp2: mark phy as invalid in case of missing appropriate driver nhed+uboot at starry.com
                   ` (3 subsequent siblings)
  4 siblings, 2 replies; 16+ messages in thread
From: nhed+uboot at starry.com @ 2019-08-15 22:08 UTC (permalink / raw
  To: u-boot

From: Stefan Chulski <stefanc@marvell.com>

Issue:
- Network stuck if autonegotion fails.

Issue root cause:

- When autonegotiation fails during port open procedure, the packet
  processor configuration does not finish and open procedure exits
  with error.
- However, this doesn't prevent u-boot network framework from
  calling send and receive procedures.
- Using transmit and receive functions of misconfigured packet
  processor will cause traffic to get stuck.

Fix:

- Continue packet processor configuration even if autonegotiation
  fails.  Only error message is triggered in this case.
- Exit transmit and receive functions if there is no PHY link
  indication.
- U-boot network framework now calls open procedure again during next
  transmit initiation.

Signed-off-by: Stefan Chulski <stefanc@marvell.com>
Reviewed-by: Igal Liberman <igall@marvell.com>
Tested-by: Igal Liberman <igall@marvell.com>
---
 drivers/net/mvpp2.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
index bd89725e77..f36c8236b1 100644
--- a/drivers/net/mvpp2.c
+++ b/drivers/net/mvpp2.c
@@ -4494,7 +4494,7 @@ static void mvpp2_stop_dev(struct mvpp2_port *port)
 		gop_port_enable(port, 0);
 }
 
-static int mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
+static void mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
 {
 	struct phy_device *phy_dev;
 
@@ -4504,7 +4504,7 @@ static int mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
 		port->phy_dev = phy_dev;
 		if (!phy_dev) {
 			netdev_err(port->dev, "cannot connect to phy\n");
-			return -ENODEV;
+			return;
 		}
 		phy_dev->supported &= PHY_GBIT_FEATURES;
 		phy_dev->advertising = phy_dev->supported;
@@ -4516,18 +4516,14 @@ static int mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
 
 		phy_config(phy_dev);
 		phy_startup(phy_dev);
-		if (!phy_dev->link) {
+		if (!phy_dev->link)
 			printf("%s: No link\n", phy_dev->dev->name);
-			return -1;
-		}
-
-		port->init = 1;
+		else
+			port->init = 1;
 	} else {
 		mvpp2_egress_enable(port);
 		mvpp2_ingress_enable(port);
 	}
-
-	return 0;
 }
 
 static int mvpp2_open(struct udevice *dev, struct mvpp2_port *port)
@@ -4567,10 +4563,7 @@ static int mvpp2_open(struct udevice *dev, struct mvpp2_port *port)
 	}
 
 	if (port->phy_node) {
-		err = mvpp2_phy_connect(dev, port);
-		if (err < 0)
-			return err;
-
+		mvpp2_phy_connect(dev, port);
 		mvpp2_link_event(port);
 	} else {
 		mvpp2_egress_enable(port);
@@ -5175,6 +5168,10 @@ static int mvpp2_recv(struct udevice *dev, int flags, uchar **packetp)
 	struct mvpp2_rx_queue *rxq;
 	u8 *data;
 
+	if (port->phy_node)
+		if (!port->phy_dev->link)
+			return 0;
+
 	/* Process RX packets */
 	rxq = port->rxqs[0];
 
@@ -5240,6 +5237,10 @@ static int mvpp2_send(struct udevice *dev, void *packet, int length)
 	int tx_done;
 	int timeout;
 
+	if (port->phy_node)
+		if (!port->phy_dev->link)
+			return 0;
+
 	txq = port->txqs[0];
 	aggr_txq = &port->priv->aggr_txqs[smp_processor_id()];
 
-- 
2.21.0

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

* [U-Boot] [PATCH v4 2/5] net: mvpp2: mark phy as invalid in case of missing appropriate driver
  2019-08-15 22:08 [U-Boot] [PATCH v4 0/5] Switch MVPP2 to use new MVMDIO nhed+uboot at starry.com
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error nhed+uboot at starry.com
@ 2019-08-15 22:08 ` nhed+uboot at starry.com
  2019-11-13 22:36   ` Ramon Fried
  2019-11-30  0:59   ` Joe Hershberger
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 3/5] arm: dts: armada-cp110-*dtsi: add xmdio nodes nhed+uboot at starry.com
                   ` (2 subsequent siblings)
  4 siblings, 2 replies; 16+ messages in thread
From: nhed+uboot at starry.com @ 2019-08-15 22:08 UTC (permalink / raw
  To: u-boot

From: Grzegorz Jaszczyk <jaz@semihalf.com>

If the phy doesn't match with any existing u-boot drivers, the phy
framework will connect it to the generic one which uid ==
0xffffffff. In this case, act as if the phy wouldn't be declared in
dts. Otherwise, in case of 3310 (for which the driver doesn't exist)
the link is marked as always down. Removing phy entry from dts in case
of 3310 is not a good option because it is required for the
phy_fw_down procedure.

This patch fixes the issue with the link always down on MCBIN board.

nhed: added NULL deref test.

Signed-off-by: Grzegorz Jaszczyk <jaz@semihalf.com>
Reviewed-by: Igal Liberman <igall@marvell.com>
Tested-by: Igal Liberman <igall@marvell.com>
Signed-off-by: Nevo Hed <nhed+github@starry.com>
---
 drivers/net/mvpp2.c | 23 +++++++++++++++++++++++
 1 file changed, 23 insertions(+)

diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
index f36c8236b1..4ba6f9be3e 100644
--- a/drivers/net/mvpp2.c
+++ b/drivers/net/mvpp2.c
@@ -4501,6 +4501,29 @@ static void mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
 	if (!port->init || port->link == 0) {
 		phy_dev = phy_connect(port->bus, port->phyaddr, dev,
 				      port->phy_interface);
+
+		/*
+		 * If the phy doesn't match with any existing u-boot drivers the
+		 * phy framework will connect it to generic one which
+		 * uid == 0xffffffff. In this case act as if the phy wouldn't be
+		 * declared in dts. Otherwise in case of 3310 (for which the
+		 * driver doesn't exist) the link will not be correctly
+		 * detected. Removing phy entry from dts in case of 3310 is not
+		 * an option because it is required for the phy_fw_down
+		 * procedure.
+		 */
+		if (phy_dev &&
+		    phy_dev->drv->uid == 0xffffffff) {/* Generic phy */
+			netdev_warn(port->dev,
+				    "Marking phy as invalid, link will not be checked\n");
+			/* set phy_addr to invalid value */
+			port->phyaddr = PHY_MAX_ADDR;
+			mvpp2_egress_enable(port);
+			mvpp2_ingress_enable(port);
+
+			return;
+		}
+
 		port->phy_dev = phy_dev;
 		if (!phy_dev) {
 			netdev_err(port->dev, "cannot connect to phy\n");
-- 
2.21.0

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

* [U-Boot] [PATCH v4 3/5] arm: dts: armada-cp110-*dtsi: add xmdio nodes
  2019-08-15 22:08 [U-Boot] [PATCH v4 0/5] Switch MVPP2 to use new MVMDIO nhed+uboot at starry.com
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error nhed+uboot at starry.com
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 2/5] net: mvpp2: mark phy as invalid in case of missing appropriate driver nhed+uboot at starry.com
@ 2019-08-15 22:08 ` nhed+uboot at starry.com
  2019-11-13 22:37   ` Ramon Fried
  2019-11-30  1:00   ` Joe Hershberger
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 4/5] net: mvpp2: use new MVMDIO driver nhed+uboot at starry.com
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 5/5] net: mvpp2: MVPP2 now needs MVMDIO nhed+uboot at starry.com
  4 siblings, 2 replies; 16+ messages in thread
From: nhed+uboot at starry.com @ 2019-08-15 22:08 UTC (permalink / raw
  To: u-boot

From: Nevo Hed <nhed+github@starry.com>

Based on upstream-linux
See https://github.com/torvalds/linux/commit/f66b2aff.

However made the XSMI register window 0x16 (22) bytes per my reading
of the functional spec.  Similar commits in Marvels own repo bump it
to 0x200 (512) bytes but I did not see the reasoning for that.

https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/4d932b4.

Also added device-name attributes to prevent ambiguity in the `mdio`
command.

Signed-off-by: Nevo Hed <nhed+github@starry.com>
---
 arch/arm/dts/armada-cp110-master.dtsi | 9 +++++++++
 arch/arm/dts/armada-cp110-slave.dtsi  | 9 +++++++++
 2 files changed, 18 insertions(+)

diff --git a/arch/arm/dts/armada-cp110-master.dtsi b/arch/arm/dts/armada-cp110-master.dtsi
index e4c17e9f4b..cd5c974482 100644
--- a/arch/arm/dts/armada-cp110-master.dtsi
+++ b/arch/arm/dts/armada-cp110-master.dtsi
@@ -99,6 +99,15 @@
 				device-name = "cpm-mdio";
 			};
 
+			cpm_xmdio: mdio at 12a600 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				compatible = "marvell,xmdio";
+				reg = <0x12a600 0x16>;
+				status = "disabled";
+				device-name = "cpm-xmdio";
+			};
+
 			cpm_syscon0: system-controller at 440000 {
 				compatible = "marvell,cp110-system-controller0",
 					     "syscon";
diff --git a/arch/arm/dts/armada-cp110-slave.dtsi b/arch/arm/dts/armada-cp110-slave.dtsi
index 2fbd7b5514..b426a4eb69 100644
--- a/arch/arm/dts/armada-cp110-slave.dtsi
+++ b/arch/arm/dts/armada-cp110-slave.dtsi
@@ -99,6 +99,15 @@
 				device-name = "cps-mdio";
 			};
 
+			cps_xmdio: mdio at 12a600 {
+				#address-cells = <1>;
+				#size-cells = <0>;
+				compatible = "marvell,xmdio";
+				reg = <0x12a600 0x16>;
+				status = "disabled";
+				device-name = "cps-xmdio";
+			};
+
 			cps_syscon0: system-controller at 440000 {
 				compatible = "marvell,cp110-system-controller0",
 					     "syscon";
-- 
2.21.0

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

* [U-Boot] [PATCH v4 4/5] net: mvpp2: use new MVMDIO driver
  2019-08-15 22:08 [U-Boot] [PATCH v4 0/5] Switch MVPP2 to use new MVMDIO nhed+uboot at starry.com
                   ` (2 preceding siblings ...)
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 3/5] arm: dts: armada-cp110-*dtsi: add xmdio nodes nhed+uboot at starry.com
@ 2019-08-15 22:08 ` nhed+uboot at starry.com
  2019-11-13 22:37   ` Ramon Fried
  2019-11-30  1:01   ` Joe Hershberger
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 5/5] net: mvpp2: MVPP2 now needs MVMDIO nhed+uboot at starry.com
  4 siblings, 2 replies; 16+ messages in thread
From: nhed+uboot at starry.com @ 2019-08-15 22:08 UTC (permalink / raw
  To: u-boot

From: Nevo Hed <nhed+github@starry.com>

This commit ports mvpp2 to use the recently introduced Marvell MDIO
(MVMDIO) driver.  It removes direct interaction with the SMI & XSMI
busses.  This commit is based in part on earlier work by
Ken Ma <make@marvell.com> in Marvell's own downstream repo:
  https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/c81dc39.

The above refrenced work was based on an MVMDIO implementation that
never made it into U-Boot.  With this patch the mvpp2 driver switches
to use the new MVMDIO driver that is based on a more universal
mdio-uclass implementation.

Signed-off-by: Nevo Hed <nhed+github@starry.com>
---
 drivers/net/mvpp2.c | 195 ++++----------------------------------------
 1 file changed, 18 insertions(+), 177 deletions(-)

diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
index 4ba6f9be3e..cfd119da37 100644
--- a/drivers/net/mvpp2.c
+++ b/drivers/net/mvpp2.c
@@ -32,6 +32,7 @@
 #include <linux/mbus.h>
 #include <asm-generic/gpio.h>
 #include <fdt_support.h>
+#include <linux/mdio.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
@@ -62,8 +63,6 @@ do {									\
 #define MTU			1500
 #define RX_BUFFER_SIZE		(ALIGN(MTU + WRAP, ARCH_DMA_MINALIGN))
 
-#define MVPP2_SMI_TIMEOUT			10000
-
 /* RX Fifo Registers */
 #define MVPP2_RX_DATA_FIFO_SIZE_REG(port)	(0x00 + 4 * (port))
 #define MVPP2_RX_ATTR_FIFO_SIZE_REG(port)	(0x20 + 4 * (port))
@@ -490,23 +489,8 @@ do {									\
 #define MVPP2_QUEUE_NEXT_DESC(q, index) \
 	(((index) < (q)->last_desc) ? ((index) + 1) : 0)
 
-/* SMI: 0xc0054 -> offset 0x54 to lms_base */
-#define MVPP21_SMI				0x0054
 /* PP2.2: SMI: 0x12a200 -> offset 0x1200 to iface_base */
 #define MVPP22_SMI				0x1200
-#define     MVPP2_PHY_REG_MASK			0x1f
-/* SMI register fields */
-#define     MVPP2_SMI_DATA_OFFS			0	/* Data */
-#define     MVPP2_SMI_DATA_MASK			(0xffff << MVPP2_SMI_DATA_OFFS)
-#define     MVPP2_SMI_DEV_ADDR_OFFS		16	/* PHY device address */
-#define     MVPP2_SMI_REG_ADDR_OFFS		21	/* PHY device reg addr*/
-#define     MVPP2_SMI_OPCODE_OFFS		26	/* Write/Read opcode */
-#define     MVPP2_SMI_OPCODE_READ		(1 << MVPP2_SMI_OPCODE_OFFS)
-#define     MVPP2_SMI_READ_VALID		(1 << 27)	/* Read Valid */
-#define     MVPP2_SMI_BUSY			(1 << 28)	/* Busy */
-
-#define     MVPP2_PHY_ADDR_MASK			0x1f
-#define     MVPP2_PHY_REG_MASK			0x1f
 
 /* Additional PPv2.2 offsets */
 #define MVPP22_MPCS				0x007000
@@ -952,7 +936,6 @@ struct mvpp2_port {
 
 	/* Per-port registers' base address */
 	void __iomem *base;
-	void __iomem *mdio_base;
 
 	struct mvpp2_rx_queue **rxqs;
 	struct mvpp2_tx_queue **txqs;
@@ -973,9 +956,8 @@ struct mvpp2_port {
 
 	struct phy_device *phy_dev;
 	phy_interface_t phy_interface;
-	int phy_node;
 	int phyaddr;
-	struct mii_dev *bus;
+	struct udevice *mdio_dev;
 #ifdef CONFIG_DM_GPIO
 	struct gpio_desc phy_reset_gpio;
 	struct gpio_desc phy_tx_disable_gpio;
@@ -4499,8 +4481,8 @@ static void mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
 	struct phy_device *phy_dev;
 
 	if (!port->init || port->link == 0) {
-		phy_dev = phy_connect(port->bus, port->phyaddr, dev,
-				      port->phy_interface);
+		phy_dev = dm_mdio_phy_connect(port->mdio_dev, port->phyaddr,
+					      dev, port->phy_interface);
 
 		/*
 		 * If the phy doesn't match with any existing u-boot drivers the
@@ -4585,7 +4567,7 @@ static int mvpp2_open(struct udevice *dev, struct mvpp2_port *port)
 		return err;
 	}
 
-	if (port->phy_node) {
+	if (port->phyaddr < PHY_MAX_ADDR) {
 		mvpp2_phy_connect(dev, port);
 		mvpp2_link_event(port);
 	} else {
@@ -4724,35 +4706,25 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
 	u32 id;
 	u32 phyaddr = 0;
 	int phy_mode = -1;
-
-	/* Default mdio_base from the same eth base */
-	if (port->priv->hw_version == MVPP21)
-		port->mdio_base = port->priv->lms_base + MVPP21_SMI;
-	else
-		port->mdio_base = port->priv->iface_base + MVPP22_SMI;
+	int ret;
 
 	phy_node = fdtdec_lookup_phandle(gd->fdt_blob, port_node, "phy");
 
 	if (phy_node > 0) {
-		ofnode phy_ofnode;
-		fdt_addr_t phy_base;
-
+		int parent;
 		phyaddr = fdtdec_get_int(gd->fdt_blob, phy_node, "reg", 0);
 		if (phyaddr < 0) {
 			dev_err(&pdev->dev, "could not find phy address\n");
 			return -1;
 		}
-
-		phy_ofnode = ofnode_get_parent(offset_to_ofnode(phy_node));
-		phy_base = ofnode_get_addr(phy_ofnode);
-		port->mdio_base = (void *)phy_base;
-
-		if (port->mdio_base < 0) {
-			dev_err(&pdev->dev, "could not find mdio base address\n");
-			return -1;
-		}
+		parent = fdt_parent_offset(gd->fdt_blob, phy_node);
+		ret = uclass_get_device_by_of_offset(UCLASS_MDIO, parent,
+						     &port->mdio_dev);
+		if (ret)
+			return ret;
 	} else {
-		phy_node = 0;
+		/* phy_addr is set to invalid value */
+		phyaddr = PHY_MAX_ADDR;
 	}
 
 	phy_mode_str = fdt_getprop(gd->fdt_blob, port_node, "phy-mode", NULL);
@@ -4790,7 +4762,6 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
 		port->first_rxq = port->id * rxq_number;
 	else
 		port->first_rxq = port->id * port->priv->max_port_rxqs;
-	port->phy_node = phy_node;
 	port->phy_interface = phy_mode;
 	port->phyaddr = phyaddr;
 
@@ -5067,118 +5038,6 @@ static int mvpp2_init(struct udevice *dev, struct mvpp2 *priv)
 	return 0;
 }
 
-/* SMI / MDIO functions */
-
-static int smi_wait_ready(struct mvpp2_port *priv)
-{
-	u32 timeout = MVPP2_SMI_TIMEOUT;
-	u32 smi_reg;
-
-	/* wait till the SMI is not busy */
-	do {
-		/* read smi register */
-		smi_reg = readl(priv->mdio_base);
-		if (timeout-- == 0) {
-			printf("Error: SMI busy timeout\n");
-			return -EFAULT;
-		}
-	} while (smi_reg & MVPP2_SMI_BUSY);
-
-	return 0;
-}
-
-/*
- * mpp2_mdio_read - miiphy_read callback function.
- *
- * Returns 16bit phy register value, or 0xffff on error
- */
-static int mpp2_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
-{
-	struct mvpp2_port *priv = bus->priv;
-	u32 smi_reg;
-	u32 timeout;
-
-	/* check parameters */
-	if (addr > MVPP2_PHY_ADDR_MASK) {
-		printf("Error: Invalid PHY address %d\n", addr);
-		return -EFAULT;
-	}
-
-	if (reg > MVPP2_PHY_REG_MASK) {
-		printf("Err: Invalid register offset %d\n", reg);
-		return -EFAULT;
-	}
-
-	/* wait till the SMI is not busy */
-	if (smi_wait_ready(priv) < 0)
-		return -EFAULT;
-
-	/* fill the phy address and regiser offset and read opcode */
-	smi_reg = (addr << MVPP2_SMI_DEV_ADDR_OFFS)
-		| (reg << MVPP2_SMI_REG_ADDR_OFFS)
-		| MVPP2_SMI_OPCODE_READ;
-
-	/* write the smi register */
-	writel(smi_reg, priv->mdio_base);
-
-	/* wait till read value is ready */
-	timeout = MVPP2_SMI_TIMEOUT;
-
-	do {
-		/* read smi register */
-		smi_reg = readl(priv->mdio_base);
-		if (timeout-- == 0) {
-			printf("Err: SMI read ready timeout\n");
-			return -EFAULT;
-		}
-	} while (!(smi_reg & MVPP2_SMI_READ_VALID));
-
-	/* Wait for the data to update in the SMI register */
-	for (timeout = 0; timeout < MVPP2_SMI_TIMEOUT; timeout++)
-		;
-
-	return readl(priv->mdio_base) & MVPP2_SMI_DATA_MASK;
-}
-
-/*
- * mpp2_mdio_write - miiphy_write callback function.
- *
- * Returns 0 if write succeed, -EINVAL on bad parameters
- * -ETIME on timeout
- */
-static int mpp2_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
-			   u16 value)
-{
-	struct mvpp2_port *priv = bus->priv;
-	u32 smi_reg;
-
-	/* check parameters */
-	if (addr > MVPP2_PHY_ADDR_MASK) {
-		printf("Error: Invalid PHY address %d\n", addr);
-		return -EFAULT;
-	}
-
-	if (reg > MVPP2_PHY_REG_MASK) {
-		printf("Err: Invalid register offset %d\n", reg);
-		return -EFAULT;
-	}
-
-	/* wait till the SMI is not busy */
-	if (smi_wait_ready(priv) < 0)
-		return -EFAULT;
-
-	/* fill the phy addr and reg offset and write opcode and data */
-	smi_reg = value << MVPP2_SMI_DATA_OFFS;
-	smi_reg |= (addr << MVPP2_SMI_DEV_ADDR_OFFS)
-		| (reg << MVPP2_SMI_REG_ADDR_OFFS);
-	smi_reg &= ~MVPP2_SMI_OPCODE_READ;
-
-	/* write the smi register */
-	writel(smi_reg, priv->mdio_base);
-
-	return 0;
-}
-
 static int mvpp2_recv(struct udevice *dev, int flags, uchar **packetp)
 {
 	struct mvpp2_port *port = dev_get_priv(dev);
@@ -5191,7 +5050,7 @@ static int mvpp2_recv(struct udevice *dev, int flags, uchar **packetp)
 	struct mvpp2_rx_queue *rxq;
 	u8 *data;
 
-	if (port->phy_node)
+	if (port->phyaddr < PHY_MAX_ADDR)
 		if (!port->phy_dev->link)
 			return 0;
 
@@ -5260,7 +5119,7 @@ static int mvpp2_send(struct udevice *dev, void *packet, int length)
 	int tx_done;
 	int timeout;
 
-	if (port->phy_node)
+	if (port->phyaddr < PHY_MAX_ADDR)
 		if (!port->phy_dev->link)
 			return 0;
 
@@ -5444,31 +5303,13 @@ static int mvpp2_probe(struct udevice *dev)
 {
 	struct mvpp2_port *port = dev_get_priv(dev);
 	struct mvpp2 *priv = dev_get_priv(dev->parent);
-	struct mii_dev *bus;
 	int err;
 
 	/* Only call the probe function for the parent once */
 	if (!priv->probe_done)
 		err = mvpp2_base_probe(dev->parent);
 
-	port->priv = dev_get_priv(dev->parent);
-
-	/* Create and register the MDIO bus driver */
-	bus = mdio_alloc();
-	if (!bus) {
-		printf("Failed to allocate MDIO bus\n");
-		return -ENOMEM;
-	}
-
-	bus->read = mpp2_mdio_read;
-	bus->write = mpp2_mdio_write;
-	snprintf(bus->name, sizeof(bus->name), dev->name);
-	bus->priv = (void *)port;
-	port->bus = bus;
-
-	err = mdio_register(bus);
-	if (err)
-		return err;
+	port->priv = priv;
 
 	err = phy_info_parse(dev, port);
 	if (err)
@@ -5497,7 +5338,7 @@ static int mvpp2_probe(struct udevice *dev)
 			port->gop_id * MVPP22_PORT_OFFSET;
 
 		/* Set phy address of the port */
-		if(port->phy_node)
+		if (port->phyaddr < PHY_MAX_ADDR)
 			mvpp22_smi_phy_addr_cfg(port);
 
 		/* GoP Init */
-- 
2.21.0

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

* [U-Boot] [PATCH v4 5/5] net: mvpp2: MVPP2 now needs MVMDIO
  2019-08-15 22:08 [U-Boot] [PATCH v4 0/5] Switch MVPP2 to use new MVMDIO nhed+uboot at starry.com
                   ` (3 preceding siblings ...)
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 4/5] net: mvpp2: use new MVMDIO driver nhed+uboot at starry.com
@ 2019-08-15 22:08 ` nhed+uboot at starry.com
  2019-11-13 22:38   ` Ramon Fried
  2019-11-30  1:02   ` Joe Hershberger
  4 siblings, 2 replies; 16+ messages in thread
From: nhed+uboot at starry.com @ 2019-08-15 22:08 UTC (permalink / raw
  To: u-boot

From: Nevo Hed <nhed+github@starry.com>

Changes to mvpp2.c require the MVMDIO module which in turn uses
DM_MDIO.

Signed-off-by: Nevo Hed <nhed+github@starry.com>
---
 drivers/net/Kconfig | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
index 5fd31b03cf..81f39d0928 100644
--- a/drivers/net/Kconfig
+++ b/drivers/net/Kconfig
@@ -297,6 +297,8 @@ config MVPP2
 	bool "Marvell Armada 375/7K/8K network interface support"
 	depends on ARMADA_375 || ARMADA_8K
 	select PHYLIB
+	select MVMDIO
+	select DM_MDIO
 	help
 	  This driver supports the network interface units in the
 	  Marvell ARMADA 375, 7K and 8K SoCs.
-- 
2.21.0

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

* [U-Boot] [PATCH v4 2/5] net: mvpp2: mark phy as invalid in case of missing appropriate driver
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 2/5] net: mvpp2: mark phy as invalid in case of missing appropriate driver nhed+uboot at starry.com
@ 2019-11-13 22:36   ` Ramon Fried
  2019-11-30  0:59   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Ramon Fried @ 2019-11-13 22:36 UTC (permalink / raw
  To: u-boot

On Fri, Aug 16, 2019 at 1:09 AM <nhed+uboot@starry.com> wrote:
>
> From: Grzegorz Jaszczyk <jaz@semihalf.com>
>
> If the phy doesn't match with any existing u-boot drivers, the phy
> framework will connect it to the generic one which uid ==
> 0xffffffff. In this case, act as if the phy wouldn't be declared in
> dts. Otherwise, in case of 3310 (for which the driver doesn't exist)
> the link is marked as always down. Removing phy entry from dts in case
> of 3310 is not a good option because it is required for the
> phy_fw_down procedure.
>
> This patch fixes the issue with the link always down on MCBIN board.
>
> nhed: added NULL deref test.
>
> Signed-off-by: Grzegorz Jaszczyk <jaz@semihalf.com>
> Reviewed-by: Igal Liberman <igall@marvell.com>
> Tested-by: Igal Liberman <igall@marvell.com>
> Signed-off-by: Nevo Hed <nhed+github@starry.com>
> ---
>  drivers/net/mvpp2.c | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
>
> diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
> index f36c8236b1..4ba6f9be3e 100644
> --- a/drivers/net/mvpp2.c
> +++ b/drivers/net/mvpp2.c
> @@ -4501,6 +4501,29 @@ static void mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
>         if (!port->init || port->link == 0) {
>                 phy_dev = phy_connect(port->bus, port->phyaddr, dev,
>                                       port->phy_interface);
> +
> +               /*
> +                * If the phy doesn't match with any existing u-boot drivers the
> +                * phy framework will connect it to generic one which
> +                * uid == 0xffffffff. In this case act as if the phy wouldn't be
> +                * declared in dts. Otherwise in case of 3310 (for which the
> +                * driver doesn't exist) the link will not be correctly
> +                * detected. Removing phy entry from dts in case of 3310 is not
> +                * an option because it is required for the phy_fw_down
> +                * procedure.
> +                */
> +               if (phy_dev &&
> +                   phy_dev->drv->uid == 0xffffffff) {/* Generic phy */
> +                       netdev_warn(port->dev,
> +                                   "Marking phy as invalid, link will not be checked\n");
> +                       /* set phy_addr to invalid value */
> +                       port->phyaddr = PHY_MAX_ADDR;
> +                       mvpp2_egress_enable(port);
> +                       mvpp2_ingress_enable(port);
> +
> +                       return;
> +               }
> +
>                 port->phy_dev = phy_dev;
>                 if (!phy_dev) {
>                         netdev_err(port->dev, "cannot connect to phy\n");
> --
> 2.21.0
>
Reviewed-By: Ramon Fried <rfried.dev@gmail.com>

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

* [U-Boot] [PATCH v4 3/5] arm: dts: armada-cp110-*dtsi: add xmdio nodes
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 3/5] arm: dts: armada-cp110-*dtsi: add xmdio nodes nhed+uboot at starry.com
@ 2019-11-13 22:37   ` Ramon Fried
  2019-11-30  1:00   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Ramon Fried @ 2019-11-13 22:37 UTC (permalink / raw
  To: u-boot

On Fri, Aug 16, 2019 at 1:09 AM <nhed+uboot@starry.com> wrote:
>
> From: Nevo Hed <nhed+github@starry.com>
>
> Based on upstream-linux
> See https://github.com/torvalds/linux/commit/f66b2aff.
>
> However made the XSMI register window 0x16 (22) bytes per my reading
> of the functional spec.  Similar commits in Marvels own repo bump it
> to 0x200 (512) bytes but I did not see the reasoning for that.
>
> https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/4d932b4.
>
> Also added device-name attributes to prevent ambiguity in the `mdio`
> command.
>
> Signed-off-by: Nevo Hed <nhed+github@starry.com>
> ---
>  arch/arm/dts/armada-cp110-master.dtsi | 9 +++++++++
>  arch/arm/dts/armada-cp110-slave.dtsi  | 9 +++++++++
>  2 files changed, 18 insertions(+)
>
> diff --git a/arch/arm/dts/armada-cp110-master.dtsi b/arch/arm/dts/armada-cp110-master.dtsi
> index e4c17e9f4b..cd5c974482 100644
> --- a/arch/arm/dts/armada-cp110-master.dtsi
> +++ b/arch/arm/dts/armada-cp110-master.dtsi
> @@ -99,6 +99,15 @@
>                                 device-name = "cpm-mdio";
>                         };
>
> +                       cpm_xmdio: mdio at 12a600 {
> +                               #address-cells = <1>;
> +                               #size-cells = <0>;
> +                               compatible = "marvell,xmdio";
> +                               reg = <0x12a600 0x16>;
> +                               status = "disabled";
> +                               device-name = "cpm-xmdio";
> +                       };
> +
>                         cpm_syscon0: system-controller at 440000 {
>                                 compatible = "marvell,cp110-system-controller0",
>                                              "syscon";
> diff --git a/arch/arm/dts/armada-cp110-slave.dtsi b/arch/arm/dts/armada-cp110-slave.dtsi
> index 2fbd7b5514..b426a4eb69 100644
> --- a/arch/arm/dts/armada-cp110-slave.dtsi
> +++ b/arch/arm/dts/armada-cp110-slave.dtsi
> @@ -99,6 +99,15 @@
>                                 device-name = "cps-mdio";
>                         };
>
> +                       cps_xmdio: mdio at 12a600 {
> +                               #address-cells = <1>;
> +                               #size-cells = <0>;
> +                               compatible = "marvell,xmdio";
> +                               reg = <0x12a600 0x16>;
> +                               status = "disabled";
> +                               device-name = "cps-xmdio";
> +                       };
> +
>                         cps_syscon0: system-controller at 440000 {
>                                 compatible = "marvell,cp110-system-controller0",
>                                              "syscon";
> --
> 2.21.0
>
Reviewed-By: Ramon Fried <rfried.dev@gmail.com>

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

* [U-Boot] [PATCH v4 4/5] net: mvpp2: use new MVMDIO driver
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 4/5] net: mvpp2: use new MVMDIO driver nhed+uboot at starry.com
@ 2019-11-13 22:37   ` Ramon Fried
  2019-11-30  1:01   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Ramon Fried @ 2019-11-13 22:37 UTC (permalink / raw
  To: u-boot

On Fri, Aug 16, 2019 at 1:09 AM <nhed+uboot@starry.com> wrote:
>
> From: Nevo Hed <nhed+github@starry.com>
>
> This commit ports mvpp2 to use the recently introduced Marvell MDIO
> (MVMDIO) driver.  It removes direct interaction with the SMI & XSMI
> busses.  This commit is based in part on earlier work by
> Ken Ma <make@marvell.com> in Marvell's own downstream repo:
>   https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/c81dc39.
>
> The above refrenced work was based on an MVMDIO implementation that
> never made it into U-Boot.  With this patch the mvpp2 driver switches
> to use the new MVMDIO driver that is based on a more universal
> mdio-uclass implementation.
>
> Signed-off-by: Nevo Hed <nhed+github@starry.com>
> ---
>  drivers/net/mvpp2.c | 195 ++++----------------------------------------
>  1 file changed, 18 insertions(+), 177 deletions(-)
>
> diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
> index 4ba6f9be3e..cfd119da37 100644
> --- a/drivers/net/mvpp2.c
> +++ b/drivers/net/mvpp2.c
> @@ -32,6 +32,7 @@
>  #include <linux/mbus.h>
>  #include <asm-generic/gpio.h>
>  #include <fdt_support.h>
> +#include <linux/mdio.h>
>
>  DECLARE_GLOBAL_DATA_PTR;
>
> @@ -62,8 +63,6 @@ do {                                                                  \
>  #define MTU                    1500
>  #define RX_BUFFER_SIZE         (ALIGN(MTU + WRAP, ARCH_DMA_MINALIGN))
>
> -#define MVPP2_SMI_TIMEOUT                      10000
> -
>  /* RX Fifo Registers */
>  #define MVPP2_RX_DATA_FIFO_SIZE_REG(port)      (0x00 + 4 * (port))
>  #define MVPP2_RX_ATTR_FIFO_SIZE_REG(port)      (0x20 + 4 * (port))
> @@ -490,23 +489,8 @@ do {                                                                       \
>  #define MVPP2_QUEUE_NEXT_DESC(q, index) \
>         (((index) < (q)->last_desc) ? ((index) + 1) : 0)
>
> -/* SMI: 0xc0054 -> offset 0x54 to lms_base */
> -#define MVPP21_SMI                             0x0054
>  /* PP2.2: SMI: 0x12a200 -> offset 0x1200 to iface_base */
>  #define MVPP22_SMI                             0x1200
> -#define     MVPP2_PHY_REG_MASK                 0x1f
> -/* SMI register fields */
> -#define     MVPP2_SMI_DATA_OFFS                        0       /* Data */
> -#define     MVPP2_SMI_DATA_MASK                        (0xffff << MVPP2_SMI_DATA_OFFS)
> -#define     MVPP2_SMI_DEV_ADDR_OFFS            16      /* PHY device address */
> -#define     MVPP2_SMI_REG_ADDR_OFFS            21      /* PHY device reg addr*/
> -#define     MVPP2_SMI_OPCODE_OFFS              26      /* Write/Read opcode */
> -#define     MVPP2_SMI_OPCODE_READ              (1 << MVPP2_SMI_OPCODE_OFFS)
> -#define     MVPP2_SMI_READ_VALID               (1 << 27)       /* Read Valid */
> -#define     MVPP2_SMI_BUSY                     (1 << 28)       /* Busy */
> -
> -#define     MVPP2_PHY_ADDR_MASK                        0x1f
> -#define     MVPP2_PHY_REG_MASK                 0x1f
>
>  /* Additional PPv2.2 offsets */
>  #define MVPP22_MPCS                            0x007000
> @@ -952,7 +936,6 @@ struct mvpp2_port {
>
>         /* Per-port registers' base address */
>         void __iomem *base;
> -       void __iomem *mdio_base;
>
>         struct mvpp2_rx_queue **rxqs;
>         struct mvpp2_tx_queue **txqs;
> @@ -973,9 +956,8 @@ struct mvpp2_port {
>
>         struct phy_device *phy_dev;
>         phy_interface_t phy_interface;
> -       int phy_node;
>         int phyaddr;
> -       struct mii_dev *bus;
> +       struct udevice *mdio_dev;
>  #ifdef CONFIG_DM_GPIO
>         struct gpio_desc phy_reset_gpio;
>         struct gpio_desc phy_tx_disable_gpio;
> @@ -4499,8 +4481,8 @@ static void mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
>         struct phy_device *phy_dev;
>
>         if (!port->init || port->link == 0) {
> -               phy_dev = phy_connect(port->bus, port->phyaddr, dev,
> -                                     port->phy_interface);
> +               phy_dev = dm_mdio_phy_connect(port->mdio_dev, port->phyaddr,
> +                                             dev, port->phy_interface);
>
>                 /*
>                  * If the phy doesn't match with any existing u-boot drivers the
> @@ -4585,7 +4567,7 @@ static int mvpp2_open(struct udevice *dev, struct mvpp2_port *port)
>                 return err;
>         }
>
> -       if (port->phy_node) {
> +       if (port->phyaddr < PHY_MAX_ADDR) {
>                 mvpp2_phy_connect(dev, port);
>                 mvpp2_link_event(port);
>         } else {
> @@ -4724,35 +4706,25 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
>         u32 id;
>         u32 phyaddr = 0;
>         int phy_mode = -1;
> -
> -       /* Default mdio_base from the same eth base */
> -       if (port->priv->hw_version == MVPP21)
> -               port->mdio_base = port->priv->lms_base + MVPP21_SMI;
> -       else
> -               port->mdio_base = port->priv->iface_base + MVPP22_SMI;
> +       int ret;
>
>         phy_node = fdtdec_lookup_phandle(gd->fdt_blob, port_node, "phy");
>
>         if (phy_node > 0) {
> -               ofnode phy_ofnode;
> -               fdt_addr_t phy_base;
> -
> +               int parent;
>                 phyaddr = fdtdec_get_int(gd->fdt_blob, phy_node, "reg", 0);
>                 if (phyaddr < 0) {
>                         dev_err(&pdev->dev, "could not find phy address\n");
>                         return -1;
>                 }
> -
> -               phy_ofnode = ofnode_get_parent(offset_to_ofnode(phy_node));
> -               phy_base = ofnode_get_addr(phy_ofnode);
> -               port->mdio_base = (void *)phy_base;
> -
> -               if (port->mdio_base < 0) {
> -                       dev_err(&pdev->dev, "could not find mdio base address\n");
> -                       return -1;
> -               }
> +               parent = fdt_parent_offset(gd->fdt_blob, phy_node);
> +               ret = uclass_get_device_by_of_offset(UCLASS_MDIO, parent,
> +                                                    &port->mdio_dev);
> +               if (ret)
> +                       return ret;
>         } else {
> -               phy_node = 0;
> +               /* phy_addr is set to invalid value */
> +               phyaddr = PHY_MAX_ADDR;
>         }
>
>         phy_mode_str = fdt_getprop(gd->fdt_blob, port_node, "phy-mode", NULL);
> @@ -4790,7 +4762,6 @@ static int phy_info_parse(struct udevice *dev, struct mvpp2_port *port)
>                 port->first_rxq = port->id * rxq_number;
>         else
>                 port->first_rxq = port->id * port->priv->max_port_rxqs;
> -       port->phy_node = phy_node;
>         port->phy_interface = phy_mode;
>         port->phyaddr = phyaddr;
>
> @@ -5067,118 +5038,6 @@ static int mvpp2_init(struct udevice *dev, struct mvpp2 *priv)
>         return 0;
>  }
>
> -/* SMI / MDIO functions */
> -
> -static int smi_wait_ready(struct mvpp2_port *priv)
> -{
> -       u32 timeout = MVPP2_SMI_TIMEOUT;
> -       u32 smi_reg;
> -
> -       /* wait till the SMI is not busy */
> -       do {
> -               /* read smi register */
> -               smi_reg = readl(priv->mdio_base);
> -               if (timeout-- == 0) {
> -                       printf("Error: SMI busy timeout\n");
> -                       return -EFAULT;
> -               }
> -       } while (smi_reg & MVPP2_SMI_BUSY);
> -
> -       return 0;
> -}
> -
> -/*
> - * mpp2_mdio_read - miiphy_read callback function.
> - *
> - * Returns 16bit phy register value, or 0xffff on error
> - */
> -static int mpp2_mdio_read(struct mii_dev *bus, int addr, int devad, int reg)
> -{
> -       struct mvpp2_port *priv = bus->priv;
> -       u32 smi_reg;
> -       u32 timeout;
> -
> -       /* check parameters */
> -       if (addr > MVPP2_PHY_ADDR_MASK) {
> -               printf("Error: Invalid PHY address %d\n", addr);
> -               return -EFAULT;
> -       }
> -
> -       if (reg > MVPP2_PHY_REG_MASK) {
> -               printf("Err: Invalid register offset %d\n", reg);
> -               return -EFAULT;
> -       }
> -
> -       /* wait till the SMI is not busy */
> -       if (smi_wait_ready(priv) < 0)
> -               return -EFAULT;
> -
> -       /* fill the phy address and regiser offset and read opcode */
> -       smi_reg = (addr << MVPP2_SMI_DEV_ADDR_OFFS)
> -               | (reg << MVPP2_SMI_REG_ADDR_OFFS)
> -               | MVPP2_SMI_OPCODE_READ;
> -
> -       /* write the smi register */
> -       writel(smi_reg, priv->mdio_base);
> -
> -       /* wait till read value is ready */
> -       timeout = MVPP2_SMI_TIMEOUT;
> -
> -       do {
> -               /* read smi register */
> -               smi_reg = readl(priv->mdio_base);
> -               if (timeout-- == 0) {
> -                       printf("Err: SMI read ready timeout\n");
> -                       return -EFAULT;
> -               }
> -       } while (!(smi_reg & MVPP2_SMI_READ_VALID));
> -
> -       /* Wait for the data to update in the SMI register */
> -       for (timeout = 0; timeout < MVPP2_SMI_TIMEOUT; timeout++)
> -               ;
> -
> -       return readl(priv->mdio_base) & MVPP2_SMI_DATA_MASK;
> -}
> -
> -/*
> - * mpp2_mdio_write - miiphy_write callback function.
> - *
> - * Returns 0 if write succeed, -EINVAL on bad parameters
> - * -ETIME on timeout
> - */
> -static int mpp2_mdio_write(struct mii_dev *bus, int addr, int devad, int reg,
> -                          u16 value)
> -{
> -       struct mvpp2_port *priv = bus->priv;
> -       u32 smi_reg;
> -
> -       /* check parameters */
> -       if (addr > MVPP2_PHY_ADDR_MASK) {
> -               printf("Error: Invalid PHY address %d\n", addr);
> -               return -EFAULT;
> -       }
> -
> -       if (reg > MVPP2_PHY_REG_MASK) {
> -               printf("Err: Invalid register offset %d\n", reg);
> -               return -EFAULT;
> -       }
> -
> -       /* wait till the SMI is not busy */
> -       if (smi_wait_ready(priv) < 0)
> -               return -EFAULT;
> -
> -       /* fill the phy addr and reg offset and write opcode and data */
> -       smi_reg = value << MVPP2_SMI_DATA_OFFS;
> -       smi_reg |= (addr << MVPP2_SMI_DEV_ADDR_OFFS)
> -               | (reg << MVPP2_SMI_REG_ADDR_OFFS);
> -       smi_reg &= ~MVPP2_SMI_OPCODE_READ;
> -
> -       /* write the smi register */
> -       writel(smi_reg, priv->mdio_base);
> -
> -       return 0;
> -}
> -
>  static int mvpp2_recv(struct udevice *dev, int flags, uchar **packetp)
>  {
>         struct mvpp2_port *port = dev_get_priv(dev);
> @@ -5191,7 +5050,7 @@ static int mvpp2_recv(struct udevice *dev, int flags, uchar **packetp)
>         struct mvpp2_rx_queue *rxq;
>         u8 *data;
>
> -       if (port->phy_node)
> +       if (port->phyaddr < PHY_MAX_ADDR)
>                 if (!port->phy_dev->link)
>                         return 0;
>
> @@ -5260,7 +5119,7 @@ static int mvpp2_send(struct udevice *dev, void *packet, int length)
>         int tx_done;
>         int timeout;
>
> -       if (port->phy_node)
> +       if (port->phyaddr < PHY_MAX_ADDR)
>                 if (!port->phy_dev->link)
>                         return 0;
>
> @@ -5444,31 +5303,13 @@ static int mvpp2_probe(struct udevice *dev)
>  {
>         struct mvpp2_port *port = dev_get_priv(dev);
>         struct mvpp2 *priv = dev_get_priv(dev->parent);
> -       struct mii_dev *bus;
>         int err;
>
>         /* Only call the probe function for the parent once */
>         if (!priv->probe_done)
>                 err = mvpp2_base_probe(dev->parent);
>
> -       port->priv = dev_get_priv(dev->parent);
> -
> -       /* Create and register the MDIO bus driver */
> -       bus = mdio_alloc();
> -       if (!bus) {
> -               printf("Failed to allocate MDIO bus\n");
> -               return -ENOMEM;
> -       }
> -
> -       bus->read = mpp2_mdio_read;
> -       bus->write = mpp2_mdio_write;
> -       snprintf(bus->name, sizeof(bus->name), dev->name);
> -       bus->priv = (void *)port;
> -       port->bus = bus;
> -
> -       err = mdio_register(bus);
> -       if (err)
> -               return err;
> +       port->priv = priv;
>
>         err = phy_info_parse(dev, port);
>         if (err)
> @@ -5497,7 +5338,7 @@ static int mvpp2_probe(struct udevice *dev)
>                         port->gop_id * MVPP22_PORT_OFFSET;
>
>                 /* Set phy address of the port */
> -               if(port->phy_node)
> +               if (port->phyaddr < PHY_MAX_ADDR)
>                         mvpp22_smi_phy_addr_cfg(port);
>
>                 /* GoP Init */
> --
> 2.21.0
>
Reviewed-By: Ramon Fried <rfried.dev@gmail.com>

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

* [U-Boot] [PATCH v4 5/5] net: mvpp2: MVPP2 now needs MVMDIO
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 5/5] net: mvpp2: MVPP2 now needs MVMDIO nhed+uboot at starry.com
@ 2019-11-13 22:38   ` Ramon Fried
  2019-11-30  1:02   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Ramon Fried @ 2019-11-13 22:38 UTC (permalink / raw
  To: u-boot

On Fri, Aug 16, 2019 at 1:09 AM <nhed+uboot@starry.com> wrote:
>
> From: Nevo Hed <nhed+github@starry.com>
>
> Changes to mvpp2.c require the MVMDIO module which in turn uses
> DM_MDIO.
>
> Signed-off-by: Nevo Hed <nhed+github@starry.com>
> ---
>  drivers/net/Kconfig | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig
> index 5fd31b03cf..81f39d0928 100644
> --- a/drivers/net/Kconfig
> +++ b/drivers/net/Kconfig
> @@ -297,6 +297,8 @@ config MVPP2
>         bool "Marvell Armada 375/7K/8K network interface support"
>         depends on ARMADA_375 || ARMADA_8K
>         select PHYLIB
> +       select MVMDIO
> +       select DM_MDIO
>         help
>           This driver supports the network interface units in the
>           Marvell ARMADA 375, 7K and 8K SoCs.
> --
> 2.21.0
>
Reviewed-By: Ramon Fried <rfried.dev@gmail.com>

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

* [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error nhed+uboot at starry.com
@ 2019-11-13 22:40   ` Ramon Fried
  2019-11-30  0:58   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Ramon Fried @ 2019-11-13 22:40 UTC (permalink / raw
  To: u-boot

On Fri, Aug 16, 2019 at 1:09 AM <nhed+uboot@starry.com> wrote:
>
> From: Stefan Chulski <stefanc@marvell.com>
>
> Issue:
> - Network stuck if autonegotion fails.
>
> Issue root cause:
>
> - When autonegotiation fails during port open procedure, the packet
>   processor configuration does not finish and open procedure exits
>   with error.
> - However, this doesn't prevent u-boot network framework from
>   calling send and receive procedures.
> - Using transmit and receive functions of misconfigured packet
>   processor will cause traffic to get stuck.
>
> Fix:
>
> - Continue packet processor configuration even if autonegotiation
>   fails.  Only error message is triggered in this case.
> - Exit transmit and receive functions if there is no PHY link
>   indication.
> - U-boot network framework now calls open procedure again during next
>   transmit initiation.
>
> Signed-off-by: Stefan Chulski <stefanc@marvell.com>
> Reviewed-by: Igal Liberman <igall@marvell.com>
> Tested-by: Igal Liberman <igall@marvell.com>
> ---
>  drivers/net/mvpp2.c | 27 ++++++++++++++-------------
>  1 file changed, 14 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
> index bd89725e77..f36c8236b1 100644
> --- a/drivers/net/mvpp2.c
> +++ b/drivers/net/mvpp2.c
> @@ -4494,7 +4494,7 @@ static void mvpp2_stop_dev(struct mvpp2_port *port)
>                 gop_port_enable(port, 0);
>  }
>
> -static int mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
> +static void mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
>  {
>         struct phy_device *phy_dev;
>
> @@ -4504,7 +4504,7 @@ static int mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
>                 port->phy_dev = phy_dev;
>                 if (!phy_dev) {
>                         netdev_err(port->dev, "cannot connect to phy\n");
> -                       return -ENODEV;
> +                       return;
>                 }
>                 phy_dev->supported &= PHY_GBIT_FEATURES;
>                 phy_dev->advertising = phy_dev->supported;
> @@ -4516,18 +4516,14 @@ static int mvpp2_phy_connect(struct udevice *dev, struct mvpp2_port *port)
>
>                 phy_config(phy_dev);
>                 phy_startup(phy_dev);
> -               if (!phy_dev->link) {
> +               if (!phy_dev->link)
>                         printf("%s: No link\n", phy_dev->dev->name);
> -                       return -1;
> -               }
> -
> -               port->init = 1;
> +               else
> +                       port->init = 1;
>         } else {
>                 mvpp2_egress_enable(port);
>                 mvpp2_ingress_enable(port);
>         }
> -
> -       return 0;
>  }
>
>  static int mvpp2_open(struct udevice *dev, struct mvpp2_port *port)
> @@ -4567,10 +4563,7 @@ static int mvpp2_open(struct udevice *dev, struct mvpp2_port *port)
>         }
>
>         if (port->phy_node) {
> -               err = mvpp2_phy_connect(dev, port);
> -               if (err < 0)
> -                       return err;
> -
> +               mvpp2_phy_connect(dev, port);
>                 mvpp2_link_event(port);
>         } else {
>                 mvpp2_egress_enable(port);
> @@ -5175,6 +5168,10 @@ static int mvpp2_recv(struct udevice *dev, int flags, uchar **packetp)
>         struct mvpp2_rx_queue *rxq;
>         u8 *data;
>
> +       if (port->phy_node)
> +               if (!port->phy_dev->link)
> +                       return 0;
> +
>         /* Process RX packets */
>         rxq = port->rxqs[0];
>
> @@ -5240,6 +5237,10 @@ static int mvpp2_send(struct udevice *dev, void *packet, int length)
>         int tx_done;
>         int timeout;
>
> +       if (port->phy_node)
> +               if (!port->phy_dev->link)
> +                       return 0;
> +
>         txq = port->txqs[0];
>         aggr_txq = &port->priv->aggr_txqs[smp_processor_id()];
>
> --
> 2.21.0
>
Reviewed-By: Ramon Fried <rfried.dev@gmail.com>

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

* [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error nhed+uboot at starry.com
  2019-11-13 22:40   ` Ramon Fried
@ 2019-11-30  0:58   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Joe Hershberger @ 2019-11-30  0:58 UTC (permalink / raw
  To: u-boot

On Thu, Aug 15, 2019 at 5:09 PM <nhed+uboot@starry.com> wrote:
>
> From: Stefan Chulski <stefanc@marvell.com>
>
> Issue:
> - Network stuck if autonegotion fails.
>
> Issue root cause:
>
> - When autonegotiation fails during port open procedure, the packet
>   processor configuration does not finish and open procedure exits
>   with error.
> - However, this doesn't prevent u-boot network framework from
>   calling send and receive procedures.
> - Using transmit and receive functions of misconfigured packet
>   processor will cause traffic to get stuck.
>
> Fix:
>
> - Continue packet processor configuration even if autonegotiation
>   fails.  Only error message is triggered in this case.
> - Exit transmit and receive functions if there is no PHY link
>   indication.
> - U-boot network framework now calls open procedure again during next
>   transmit initiation.
>
> Signed-off-by: Stefan Chulski <stefanc@marvell.com>
> Reviewed-by: Igal Liberman <igall@marvell.com>
> Tested-by: Igal Liberman <igall@marvell.com>

Acked-by: Joe Hershberger <joe.hershberger@ni.com>

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

* [U-Boot] [PATCH v4 2/5] net: mvpp2: mark phy as invalid in case of missing appropriate driver
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 2/5] net: mvpp2: mark phy as invalid in case of missing appropriate driver nhed+uboot at starry.com
  2019-11-13 22:36   ` Ramon Fried
@ 2019-11-30  0:59   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Joe Hershberger @ 2019-11-30  0:59 UTC (permalink / raw
  To: u-boot

On Thu, Aug 15, 2019 at 5:09 PM <nhed+uboot@starry.com> wrote:
>
> From: Grzegorz Jaszczyk <jaz@semihalf.com>
>
> If the phy doesn't match with any existing u-boot drivers, the phy
> framework will connect it to the generic one which uid ==
> 0xffffffff. In this case, act as if the phy wouldn't be declared in
> dts. Otherwise, in case of 3310 (for which the driver doesn't exist)
> the link is marked as always down. Removing phy entry from dts in case
> of 3310 is not a good option because it is required for the
> phy_fw_down procedure.
>
> This patch fixes the issue with the link always down on MCBIN board.
>
> nhed: added NULL deref test.
>
> Signed-off-by: Grzegorz Jaszczyk <jaz@semihalf.com>
> Reviewed-by: Igal Liberman <igall@marvell.com>
> Tested-by: Igal Liberman <igall@marvell.com>
> Signed-off-by: Nevo Hed <nhed+github@starry.com>

Acked-by: Joe Hershberger <joe.hershberger@ni.com>

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

* [U-Boot] [PATCH v4 3/5] arm: dts: armada-cp110-*dtsi: add xmdio nodes
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 3/5] arm: dts: armada-cp110-*dtsi: add xmdio nodes nhed+uboot at starry.com
  2019-11-13 22:37   ` Ramon Fried
@ 2019-11-30  1:00   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Joe Hershberger @ 2019-11-30  1:00 UTC (permalink / raw
  To: u-boot

On Thu, Aug 15, 2019 at 5:09 PM <nhed+uboot@starry.com> wrote:
>
> From: Nevo Hed <nhed+github@starry.com>
>
> Based on upstream-linux
> See https://github.com/torvalds/linux/commit/f66b2aff.
>
> However made the XSMI register window 0x16 (22) bytes per my reading
> of the functional spec.  Similar commits in Marvels own repo bump it
> to 0x200 (512) bytes but I did not see the reasoning for that.
>
> https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/4d932b4.
>
> Also added device-name attributes to prevent ambiguity in the `mdio`
> command.
>
> Signed-off-by: Nevo Hed <nhed+github@starry.com>

Acked-by: Joe Hershberger <joe.hershberger@ni.com>

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

* [U-Boot] [PATCH v4 4/5] net: mvpp2: use new MVMDIO driver
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 4/5] net: mvpp2: use new MVMDIO driver nhed+uboot at starry.com
  2019-11-13 22:37   ` Ramon Fried
@ 2019-11-30  1:01   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Joe Hershberger @ 2019-11-30  1:01 UTC (permalink / raw
  To: u-boot

On Thu, Aug 15, 2019 at 5:09 PM <nhed+uboot@starry.com> wrote:
>
> From: Nevo Hed <nhed+github@starry.com>
>
> This commit ports mvpp2 to use the recently introduced Marvell MDIO
> (MVMDIO) driver.  It removes direct interaction with the SMI & XSMI
> busses.  This commit is based in part on earlier work by
> Ken Ma <make@marvell.com> in Marvell's own downstream repo:
>   https://github.com/MarvellEmbeddedProcessors/u-boot-marvell/commit/c81dc39.
>
> The above refrenced work was based on an MVMDIO implementation that
> never made it into U-Boot.  With this patch the mvpp2 driver switches
> to use the new MVMDIO driver that is based on a more universal
> mdio-uclass implementation.
>
> Signed-off-by: Nevo Hed <nhed+github@starry.com>

Acked-by: Joe Hershberger <joe.hershberger@ni.com>

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

* [U-Boot] [PATCH v4 5/5] net: mvpp2: MVPP2 now needs MVMDIO
  2019-08-15 22:08 ` [U-Boot] [PATCH v4 5/5] net: mvpp2: MVPP2 now needs MVMDIO nhed+uboot at starry.com
  2019-11-13 22:38   ` Ramon Fried
@ 2019-11-30  1:02   ` Joe Hershberger
  1 sibling, 0 replies; 16+ messages in thread
From: Joe Hershberger @ 2019-11-30  1:02 UTC (permalink / raw
  To: u-boot

On Thu, Aug 15, 2019 at 5:09 PM <nhed+uboot@starry.com> wrote:
>
> From: Nevo Hed <nhed+github@starry.com>
>
> Changes to mvpp2.c require the MVMDIO module which in turn uses
> DM_MDIO.
>
> Signed-off-by: Nevo Hed <nhed+github@starry.com>

Acked-by: Joe Hershberger <joe.hershberger@ni.com>

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

end of thread, other threads:[~2019-11-30  1:02 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-08-15 22:08 [U-Boot] [PATCH v4 0/5] Switch MVPP2 to use new MVMDIO nhed+uboot at starry.com
2019-08-15 22:08 ` [U-Boot] [PATCH v4 1/5] net: mvpp2x: fix traffic stuck after PHY start error nhed+uboot at starry.com
2019-11-13 22:40   ` Ramon Fried
2019-11-30  0:58   ` Joe Hershberger
2019-08-15 22:08 ` [U-Boot] [PATCH v4 2/5] net: mvpp2: mark phy as invalid in case of missing appropriate driver nhed+uboot at starry.com
2019-11-13 22:36   ` Ramon Fried
2019-11-30  0:59   ` Joe Hershberger
2019-08-15 22:08 ` [U-Boot] [PATCH v4 3/5] arm: dts: armada-cp110-*dtsi: add xmdio nodes nhed+uboot at starry.com
2019-11-13 22:37   ` Ramon Fried
2019-11-30  1:00   ` Joe Hershberger
2019-08-15 22:08 ` [U-Boot] [PATCH v4 4/5] net: mvpp2: use new MVMDIO driver nhed+uboot at starry.com
2019-11-13 22:37   ` Ramon Fried
2019-11-30  1:01   ` Joe Hershberger
2019-08-15 22:08 ` [U-Boot] [PATCH v4 5/5] net: mvpp2: MVPP2 now needs MVMDIO nhed+uboot at starry.com
2019-11-13 22:38   ` Ramon Fried
2019-11-30  1:02   ` Joe Hershberger

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.