Re: [U-Boot] [PATCH v3 1/7] net: mvpp2x: fix traffic stuck after PHY start error

2019-08-14 Thread Joe Hershberger
On Tue, Aug 6, 2019 at 10:52 AM  wrote:
>
> From: Stefan Chulski 
>
> 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 
> Reviewed-by: Igal Liberman 
> Tested-by: Igal Liberman 

Acked-by: Joe Hershberger 
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


Re: [U-Boot] [PATCH v3 1/7] net: mvpp2x: fix traffic stuck after PHY start error

2019-08-07 Thread Ramon Fried
On Tue, Aug 6, 2019 at 6:52 PM  wrote:
>
> From: Stefan Chulski 
>
> 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 
> Reviewed-by: Igal Liberman 
> Tested-by: Igal Liberman 
> ---
>  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 
___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot


[U-Boot] [PATCH v3 1/7] net: mvpp2x: fix traffic stuck after PHY start error

2019-08-06 Thread nhed+uboot
From: Stefan Chulski 

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 
Reviewed-by: Igal Liberman 
Tested-by: Igal Liberman 
---
 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

___
U-Boot mailing list
U-Boot@lists.denx.de
https://lists.denx.de/listinfo/u-boot