On Wed, Aug 14, 2019 at 10:36 AM Joe Hershberger <joe.hershber...@gmail.com> wrote: > > On Fri, Aug 2, 2019 at 12:54 PM <nhed+ub...@starry.com> wrote: > > > > From: Stefan Chulski <stef...@marvell.com> > > > > Issue: > > - Network stuck if autonegotion fails > > > > Issue root cause: > > - During port open procedure if autonegotion fails, configuration of > > packet processor won't be finished and open procedure exits with error. > > - However this won't prevent u-boot network framework from > > calling send and receive procedures. > > - Using of transmit and receive function of not configured properly > > packet processor will cause traffic stuck. > > > > Fix: > > - Don't stop packet processor configuration if autonegotion failed. > > Only error message would be triggered. > > - Exit transmit and receive function if there are no PHY link > > indication. > > - U-boot network framework would call open procedure during next > > transmit initiation. > > > > Signed-off-by: Stefan Chulski <stef...@marvell.com> > > Reviewed-by: Igal Liberman <ig...@marvell.com> > > Tested-by: Igal Liberman <ig...@marvell.com> > > Signed-off-by: Nevo Hed <nhed+git...@starry.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)
[2] - ^^^^ > > { > > struct phy_device *phy_dev; > > > > @@ -4504,7 +4504,7 @@ static int mvpp2_phy_connect(struct udevice *dev, > > struct mvpp2_port *port) [1] - ^^^^ > > port->phy_dev = phy_dev; > > if (!phy_dev) { > > netdev_err(port->dev, "cannot connect to phy\n"); > > - return -ENODEV; > > + return; > > You need to return something here if you haven't changed the function > prototype. Apologies... my eyes went to [1] and not [2]. > > > } > > 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; > > Same thing. You need to return an int. > > > } > > > > 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