drivers: net: aquantia: check system interface too when checking for link up
authorAlex Marginean <alexandru.marginean@nxp.com>
Thu, 14 Nov 2019 16:28:35 +0000 (18:28 +0200)
committerJoe Hershberger <joe.hershberger@ni.com>
Mon, 9 Dec 2019 15:47:43 +0000 (09:47 -0600)
In some cases the link on the system interface of the aquantia PHY comes up
after the link on line interface.  The link state loop only checks the line
side, which may result in first packet sent being lost.
Use aquantia_link_is_up instead, which checks both system and line side on
gen 2/3 PHYs to avoid losing the 1st packet.

Signed-off-by: Alex Marginean <alexandru.marginean@nxp.com>
Acked-by: Joe Hershberger <joe.hershberger@ni.com>
drivers/net/phy/aquantia.c

index 3992a97712488bb1f9d93f8ba57a4ac9481be5d9..c4bd4430017763ffb658e492752e1e2f03a2142e 100644 (file)
@@ -555,17 +555,14 @@ int aquantia_startup(struct phy_device *phydev)
        phydev->duplex = DUPLEX_FULL;
 
        /* if the AN is still in progress, wait till timeout. */
-       phy_read(phydev, MDIO_MMD_AN, MDIO_STAT1);
-       reg = phy_read(phydev, MDIO_MMD_AN, MDIO_STAT1);
-       if (!(reg & MDIO_AN_STAT1_COMPLETE)) {
+       if (!aquantia_link_is_up(phydev)) {
                printf("%s Waiting for PHY auto negotiation to complete",
                       phydev->dev->name);
                do {
                        udelay(1000);
-                       reg = phy_read(phydev, MDIO_MMD_AN, MDIO_STAT1);
                        if ((i++ % 500) == 0)
                                printf(".");
-               } while (!(reg & MDIO_AN_STAT1_COMPLETE) &&
+               } while (!aquantia_link_is_up(phydev) &&
                         i < (4 * PHY_ANEG_TIMEOUT));
 
                if (i > PHY_ANEG_TIMEOUT)