Message ID | 7918fdf6bbe6505a64e54ae360c59c905aa3fe1d.1584106347.git.Jose.Abreu@synopsys.com |
---|---|
State | Changes Requested |
Delegated to: | David Miller |
Headers | show |
Series | net: phy: xpcs: Link errors improvements | expand |
On Fri, Mar 13, 2020 at 02:39:41PM +0100, Jose Abreu wrote: > RX/TX fault status results in link errors. Return error upon these cases > so that XPCS can be correctly resumed. Are you sure about this? I'm sure that I read in IEEE 802.3 that a loss of link results in a receive fault being indicated in status register 2. See 49.2.14.1 describing "PCS_status" and the descriptions of MDIO registers 3.1.2 and 3.8.10. Basically, the link status (3.1.2) is a latched-low version of PCS_status, and 3.8.10 is an inverted version of this, independently latched-high. Returning -EFAULT seems to mean that we'll soft-reset the PHY, and reconfigure it every time we attempt to read the status whenever the link is down. > > Signed-off-by: Jose Abreu <Jose.Abreu@synopsys.com> > > --- > Cc: Jose Abreu <Jose.Abreu@synopsys.com> > Cc: Andrew Lunn <andrew@lunn.ch> > Cc: Florian Fainelli <f.fainelli@gmail.com> > Cc: Heiner Kallweit <hkallweit1@gmail.com> > Cc: Russell King <linux@armlinux.org.uk> > Cc: "David S. Miller" <davem@davemloft.net> > Cc: netdev@vger.kernel.org > Cc: linux-kernel@vger.kernel.org > --- > drivers/net/phy/mdio-xpcs.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/drivers/net/phy/mdio-xpcs.c b/drivers/net/phy/mdio-xpcs.c > index a4cbeecc6d42..23516397b982 100644 > --- a/drivers/net/phy/mdio-xpcs.c > +++ b/drivers/net/phy/mdio-xpcs.c > @@ -190,10 +190,14 @@ static int xpcs_read_fault(struct mdio_xpcs_args *xpcs, > if (ret < 0) > return ret; > > - if (ret & MDIO_STAT2_RXFAULT) > + if (ret & MDIO_STAT2_RXFAULT) { > xpcs_warn(xpcs, state, "Receiver fault detected!\n"); > - if (ret & MDIO_STAT2_TXFAULT) > + return -EFAULT; > + } > + if (ret & MDIO_STAT2_TXFAULT) { > xpcs_warn(xpcs, state, "Transmitter fault detected!\n"); > + return -EFAULT; > + } > > ret = xpcs_read_vendor(xpcs, MDIO_MMD_PCS, DW_VR_XS_PCS_DIG_STS); > if (ret < 0) > -- > 2.7.4 > >
diff --git a/drivers/net/phy/mdio-xpcs.c b/drivers/net/phy/mdio-xpcs.c index a4cbeecc6d42..23516397b982 100644 --- a/drivers/net/phy/mdio-xpcs.c +++ b/drivers/net/phy/mdio-xpcs.c @@ -190,10 +190,14 @@ static int xpcs_read_fault(struct mdio_xpcs_args *xpcs, if (ret < 0) return ret; - if (ret & MDIO_STAT2_RXFAULT) + if (ret & MDIO_STAT2_RXFAULT) { xpcs_warn(xpcs, state, "Receiver fault detected!\n"); - if (ret & MDIO_STAT2_TXFAULT) + return -EFAULT; + } + if (ret & MDIO_STAT2_TXFAULT) { xpcs_warn(xpcs, state, "Transmitter fault detected!\n"); + return -EFAULT; + } ret = xpcs_read_vendor(xpcs, MDIO_MMD_PCS, DW_VR_XS_PCS_DIG_STS); if (ret < 0)
RX/TX fault status results in link errors. Return error upon these cases so that XPCS can be correctly resumed. Signed-off-by: Jose Abreu <Jose.Abreu@synopsys.com> --- Cc: Jose Abreu <Jose.Abreu@synopsys.com> Cc: Andrew Lunn <andrew@lunn.ch> Cc: Florian Fainelli <f.fainelli@gmail.com> Cc: Heiner Kallweit <hkallweit1@gmail.com> Cc: Russell King <linux@armlinux.org.uk> Cc: "David S. Miller" <davem@davemloft.net> Cc: netdev@vger.kernel.org Cc: linux-kernel@vger.kernel.org --- drivers/net/phy/mdio-xpcs.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)