ixgbe: fix link status check for copper X550em

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>
This commit is contained in:
Emil Tantilov 2016-09-26 14:08:18 -07:00 committed by Jeff Kirsher
parent 4dc4000b35
commit 21d882eb3a
1 changed files with 13 additions and 8 deletions

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