Re: [U-Boot] [PATCH v3 1/7] net: mvpp2x: fix traffic stuck after PHY start error
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
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
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