ixgbe: fix link status check for copper X550em
authorEmil Tantilov <emil.s.tantilov@intel.com>
Mon, 26 Sep 2016 21:08:18 +0000 (14:08 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Sat, 5 Nov 2016 00:13:50 +0000 (17:13 -0700)
Read the PHY register twice in order to get the correct value for
autoneg_status.

Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com>
Tested-by: Krishneil Singh <krishneil.k.singh@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/ixgbe/ixgbe_x550.c

index e9fa83baa00a09239c09b90cac9fb98c0204ad6a..51b6ade6c83a60df2750215ab3286617e59b3cb1 100644 (file)
@@ -1556,7 +1556,7 @@ static s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw,
                                     bool link_up_wait_to_complete)
 {
        u32 status;
-       u16 autoneg_status;
+       u16 i, autoneg_status;
 
        if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_copper)
                return IXGBE_ERR_CONFIG;
@@ -1568,13 +1568,18 @@ static s32 ixgbe_check_link_t_X550em(struct ixgbe_hw *hw,
        if (status || !(*link_up))
                return status;
 
-        /* MAC link is up, so check external PHY link.
-         * Read this twice back to back to indicate current status.
-         */
-       status = hw->phy.ops.read_reg(hw, MDIO_STAT1, MDIO_MMD_AN,
-                                     &autoneg_status);
-       if (status)
-               return status;
+       /* MAC link is up, so check external PHY link.
+        * Link status is latching low, and can only be used to detect link
+        * drop, and not the current status of the link without performing
+        * back-to-back reads.
+        */
+       for (i = 0; i < 2; i++) {
+               status = hw->phy.ops.read_reg(hw, MDIO_STAT1, MDIO_MMD_AN,
+                                             &autoneg_status);
+
+               if (status)
+                       return status;
+       }
 
        /* If external PHY link is not up, then indicate link not up */
        if (!(autoneg_status & IXGBE_MDIO_AUTO_NEG_LINK_STATUS))