|
@@ -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))
|