|
@@ -509,6 +509,40 @@ static s32 ixgbe_start_mac_link_82598(struct ixgbe_hw *hw,
|
|
|
return status;
|
|
|
}
|
|
|
|
|
|
+/**
|
|
|
+ * ixgbe_validate_link_ready - Function looks for phy link
|
|
|
+ * @hw: pointer to hardware structure
|
|
|
+ *
|
|
|
+ * Function indicates success when phy link is available. If phy is not ready
|
|
|
+ * within 5 seconds of MAC indicating link, the function returns error.
|
|
|
+ **/
|
|
|
+static s32 ixgbe_validate_link_ready(struct ixgbe_hw *hw)
|
|
|
+{
|
|
|
+ u32 timeout;
|
|
|
+ u16 an_reg;
|
|
|
+
|
|
|
+ if (hw->device_id != IXGBE_DEV_ID_82598AT2)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ for (timeout = 0;
|
|
|
+ timeout < IXGBE_VALIDATE_LINK_READY_TIMEOUT; timeout++) {
|
|
|
+ hw->phy.ops.read_reg(hw, MDIO_STAT1, MDIO_MMD_AN, &an_reg);
|
|
|
+
|
|
|
+ if ((an_reg & MDIO_AN_STAT1_COMPLETE) &&
|
|
|
+ (an_reg & MDIO_STAT1_LSTATUS))
|
|
|
+ break;
|
|
|
+
|
|
|
+ msleep(100);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (timeout == IXGBE_VALIDATE_LINK_READY_TIMEOUT) {
|
|
|
+ hw_dbg(hw, "Link was indicated but link is down\n");
|
|
|
+ return IXGBE_ERR_LINK_SETUP;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* ixgbe_check_mac_link_82598 - Get link/speed status
|
|
|
* @hw: pointer to hardware structure
|
|
@@ -589,6 +623,10 @@ static s32 ixgbe_check_mac_link_82598(struct ixgbe_hw *hw,
|
|
|
else
|
|
|
*speed = IXGBE_LINK_SPEED_1GB_FULL;
|
|
|
|
|
|
+ if ((hw->device_id == IXGBE_DEV_ID_82598AT2) && (*link_up == true) &&
|
|
|
+ (ixgbe_validate_link_ready(hw) != 0))
|
|
|
+ *link_up = false;
|
|
|
+
|
|
|
/* if link is down, zero out the current_mode */
|
|
|
if (*link_up == false) {
|
|
|
hw->fc.current_mode = ixgbe_fc_none;
|