net: sfp: report error on failure to read sfp soft status
authorRussell King <rmk+kernel@armlinux.org.uk>
Tue, 17 Dec 2019 13:50:29 +0000 (13:50 +0000)
committerDavid S. Miller <davem@davemloft.net>
Fri, 20 Dec 2019 01:26:07 +0000 (17:26 -0800)
Report a rate-limited error if we fail to read the SFP soft status,
and preserve the current status in that case. This avoids I2C bus
errors from triggering a link flap.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/sfp.c

index e54aef92103877ba7640737c154dc5d60dc898fa..73c2969f11a4b200fee352b78115cb967219307b 100644 (file)
@@ -442,13 +442,20 @@ static unsigned int sfp_soft_get_state(struct sfp *sfp)
 {
        unsigned int state = 0;
        u8 status;
+       int ret;
 
-       if (sfp_read(sfp, true, SFP_STATUS, &status, sizeof(status)) ==
-                    sizeof(status)) {
+       ret = sfp_read(sfp, true, SFP_STATUS, &status, sizeof(status));
+       if (ret == sizeof(status)) {
                if (status & SFP_STATUS_RX_LOS)
                        state |= SFP_F_LOS;
                if (status & SFP_STATUS_TX_FAULT)
                        state |= SFP_F_TX_FAULT;
+       } else {
+               dev_err_ratelimited(sfp->dev,
+                                   "failed to read SFP soft status: %d\n",
+                                   ret);
+               /* Preserve the current state */
+               state = sfp->state;
        }
 
        return state & sfp->state_soft_mask;