|
@@ -2509,6 +2509,7 @@ static void ixgbe_check_sfp_event(struct ixgbe_adapter *adapter, u32 eicr)
|
|
|
IXGBE_WRITE_REG(hw, IXGBE_EICR, eicr_mask);
|
|
|
if (!test_bit(__IXGBE_DOWN, &adapter->state)) {
|
|
|
adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET;
|
|
|
+ adapter->sfp_poll_time = 0;
|
|
|
ixgbe_service_event_schedule(adapter);
|
|
|
}
|
|
|
}
|
|
@@ -4804,6 +4805,7 @@ static void ixgbe_sfp_link_config(struct ixgbe_adapter *adapter)
|
|
|
adapter->flags2 |= IXGBE_FLAG2_SEARCH_FOR_SFP;
|
|
|
|
|
|
adapter->flags2 |= IXGBE_FLAG2_SFP_NEEDS_RESET;
|
|
|
+ adapter->sfp_poll_time = 0;
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -6709,10 +6711,16 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
|
|
|
!(adapter->flags2 & IXGBE_FLAG2_SFP_NEEDS_RESET))
|
|
|
return;
|
|
|
|
|
|
+ if (adapter->sfp_poll_time &&
|
|
|
+ time_after(adapter->sfp_poll_time, jiffies))
|
|
|
+ return; /* If not yet time to poll for SFP */
|
|
|
+
|
|
|
/* someone else is in init, wait until next service event */
|
|
|
if (test_and_set_bit(__IXGBE_IN_SFP_INIT, &adapter->state))
|
|
|
return;
|
|
|
|
|
|
+ adapter->sfp_poll_time = jiffies + IXGBE_SFP_POLL_JIFFIES - 1;
|
|
|
+
|
|
|
err = hw->phy.ops.identify_sfp(hw);
|
|
|
if (err == IXGBE_ERR_SFP_NOT_SUPPORTED)
|
|
|
goto sfp_out;
|