diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_common.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_common.c | 21 | 
1 files changed, 18 insertions, 3 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c index 38c4609bd429..878dd8dff528 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_common.c @@ -3292,13 +3292,14 @@ static bool ixgbe_need_crosstalk_fix(struct ixgbe_hw *hw)  s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed,  				 bool *link_up, bool link_up_wait_to_complete)  { +	bool crosstalk_fix_active = ixgbe_need_crosstalk_fix(hw);  	u32 links_reg, links_orig;  	u32 i;  	/* If Crosstalk fix enabled do the sanity check of making sure  	 * the SFP+ cage is full.  	 */ -	if (ixgbe_need_crosstalk_fix(hw)) { +	if (crosstalk_fix_active) {  		u32 sfp_cage_full;  		switch (hw->mac.type) { @@ -3346,10 +3347,24 @@ s32 ixgbe_check_mac_link_generic(struct ixgbe_hw *hw, ixgbe_link_speed *speed,  			links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS);  		}  	} else { -		if (links_reg & IXGBE_LINKS_UP) +		if (links_reg & IXGBE_LINKS_UP) { +			if (crosstalk_fix_active) { +				/* Check the link state again after a delay +				 * to filter out spurious link up +				 * notifications. +				 */ +				mdelay(5); +				links_reg = IXGBE_READ_REG(hw, IXGBE_LINKS); +				if (!(links_reg & IXGBE_LINKS_UP)) { +					*link_up = false; +					*speed = IXGBE_LINK_SPEED_UNKNOWN; +					return 0; +				} +			}  			*link_up = true; -		else +		} else {  			*link_up = false; +		}  	}  	switch (links_reg & IXGBE_LINKS_SPEED_82599) {  |