diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000e/netdev.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000e/netdev.c | 21 | 
1 files changed, 9 insertions, 12 deletions
diff --git a/drivers/net/ethernet/intel/e1000e/netdev.c b/drivers/net/ethernet/intel/e1000e/netdev.c index 65c3aef2bd36..247335d2c7ec 100644 --- a/drivers/net/ethernet/intel/e1000e/netdev.c +++ b/drivers/net/ethernet/intel/e1000e/netdev.c @@ -5164,7 +5164,8 @@ link_up:  #define E1000_TX_FLAGS_VLAN_MASK	0xffff0000  #define E1000_TX_FLAGS_VLAN_SHIFT	16 -static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb) +static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb, +		     __be16 protocol)  {  	struct e1000_context_desc *context_desc;  	struct e1000_buffer *buffer_info; @@ -5183,7 +5184,7 @@ static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb)  	hdr_len = skb_transport_offset(skb) + tcp_hdrlen(skb);  	mss = skb_shinfo(skb)->gso_size; -	if (skb->protocol == htons(ETH_P_IP)) { +	if (protocol == htons(ETH_P_IP)) {  		struct iphdr *iph = ip_hdr(skb);  		iph->tot_len = 0;  		iph->check = 0; @@ -5231,7 +5232,8 @@ static int e1000_tso(struct e1000_ring *tx_ring, struct sk_buff *skb)  	return 1;  } -static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb) +static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb, +			  __be16 protocol)  {  	struct e1000_adapter *adapter = tx_ring->adapter;  	struct e1000_context_desc *context_desc; @@ -5239,16 +5241,10 @@ static bool e1000_tx_csum(struct e1000_ring *tx_ring, struct sk_buff *skb)  	unsigned int i;  	u8 css;  	u32 cmd_len = E1000_TXD_CMD_DEXT; -	__be16 protocol;  	if (skb->ip_summed != CHECKSUM_PARTIAL)  		return false; -	if (skb->protocol == cpu_to_be16(ETH_P_8021Q)) -		protocol = vlan_eth_hdr(skb)->h_vlan_encapsulated_proto; -	else -		protocol = skb->protocol; -  	switch (protocol) {  	case cpu_to_be16(ETH_P_IP):  		if (ip_hdr(skb)->protocol == IPPROTO_TCP) @@ -5546,6 +5542,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,  	int count = 0;  	int tso;  	unsigned int f; +	__be16 protocol = vlan_get_protocol(skb);  	if (test_bit(__E1000_DOWN, &adapter->state)) {  		dev_kfree_skb_any(skb); @@ -5620,7 +5617,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,  	first = tx_ring->next_to_use; -	tso = e1000_tso(tx_ring, skb); +	tso = e1000_tso(tx_ring, skb, protocol);  	if (tso < 0) {  		dev_kfree_skb_any(skb);  		return NETDEV_TX_OK; @@ -5628,14 +5625,14 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,  	if (tso)  		tx_flags |= E1000_TX_FLAGS_TSO; -	else if (e1000_tx_csum(tx_ring, skb)) +	else if (e1000_tx_csum(tx_ring, skb, protocol))  		tx_flags |= E1000_TX_FLAGS_CSUM;  	/* Old method was to assume IPv4 packet by default if TSO was enabled.  	 * 82571 hardware supports TSO capabilities for IPv6 as well...  	 * no longer assume, we must.  	 */ -	if (skb->protocol == htons(ETH_P_IP)) +	if (protocol == htons(ETH_P_IP))  		tx_flags |= E1000_TX_FLAGS_IPV4;  	if (unlikely(skb->no_fcs))  | 
