diff options
Diffstat (limited to 'drivers/net/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/e1000e/netdev.c | 29 | 
1 files changed, 19 insertions, 10 deletions
| diff --git a/drivers/net/e1000e/netdev.c b/drivers/net/e1000e/netdev.c index 2b8ef44bd2b..e561d15c3eb 100644 --- a/drivers/net/e1000e/netdev.c +++ b/drivers/net/e1000e/netdev.c @@ -2704,6 +2704,16 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)  	u32 psrctl = 0;  	u32 pages = 0; +	/* Workaround Si errata on 82579 - configure jumbo frame flow */ +	if (hw->mac.type == e1000_pch2lan) { +		s32 ret_val; + +		if (adapter->netdev->mtu > ETH_DATA_LEN) +			ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); +		else +			ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); +	} +  	/* Program MC offset vector base */  	rctl = er32(RCTL);  	rctl &= ~(3 << E1000_RCTL_MO_SHIFT); @@ -2744,16 +2754,6 @@ static void e1000_setup_rctl(struct e1000_adapter *adapter)  		e1e_wphy(hw, 22, phy_data);  	} -	/* Workaround Si errata on 82579 - configure jumbo frame flow */ -	if (hw->mac.type == e1000_pch2lan) { -		s32 ret_val; - -		if (rctl & E1000_RCTL_LPE) -			ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, true); -		else -			ret_val = e1000_lv_jumbo_workaround_ich8lan(hw, false); -	} -  	/* Setup buffer sizes */  	rctl &= ~E1000_RCTL_SZ_4096;  	rctl |= E1000_RCTL_BSEX; @@ -4833,6 +4833,15 @@ static int e1000_change_mtu(struct net_device *netdev, int new_mtu)  		return -EINVAL;  	} +	/* Jumbo frame workaround on 82579 requires CRC be stripped */ +	if ((adapter->hw.mac.type == e1000_pch2lan) && +	    !(adapter->flags2 & FLAG2_CRC_STRIPPING) && +	    (new_mtu > ETH_DATA_LEN)) { +		e_err("Jumbo Frames not supported on 82579 when CRC " +		      "stripping is disabled.\n"); +		return -EINVAL; +	} +  	/* 82573 Errata 17 */  	if (((adapter->hw.mac.type == e1000_82573) ||  	     (adapter->hw.mac.type == e1000_82574)) && | 
