diff options
Diffstat (limited to 'drivers/net/ethernet/intel/e1000/e1000_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/e1000/e1000_main.c | 21 | 
1 files changed, 12 insertions, 9 deletions
diff --git a/drivers/net/ethernet/intel/e1000/e1000_main.c b/drivers/net/ethernet/intel/e1000/e1000_main.c index 660971f304b2..ad3d5d12173f 100644 --- a/drivers/net/ethernet/intel/e1000/e1000_main.c +++ b/drivers/net/ethernet/intel/e1000/e1000_main.c @@ -46,7 +46,7 @@ static const char e1000_copyright[] = "Copyright (c) 1999-2006 Intel Corporation   * Macro expands to...   *   {PCI_DEVICE(PCI_VENDOR_ID_INTEL, device_id)}   */ -static DEFINE_PCI_DEVICE_TABLE(e1000_pci_tbl) = { +static const struct pci_device_id e1000_pci_tbl[] = {  	INTEL_E1000_ETHERNET_DEVICE(0x1000),  	INTEL_E1000_ETHERNET_DEVICE(0x1001),  	INTEL_E1000_ETHERNET_DEVICE(0x1004), @@ -2674,7 +2674,8 @@ set_itr_now:  #define E1000_TX_FLAGS_VLAN_SHIFT	16  static int e1000_tso(struct e1000_adapter *adapter, -		     struct e1000_tx_ring *tx_ring, struct sk_buff *skb) +		     struct e1000_tx_ring *tx_ring, struct sk_buff *skb, +		     __be16 protocol)  {  	struct e1000_context_desc *context_desc;  	struct e1000_buffer *buffer_info; @@ -2692,7 +2693,7 @@ static int e1000_tso(struct e1000_adapter *adapter,  		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; @@ -2702,7 +2703,7 @@ static int e1000_tso(struct e1000_adapter *adapter,  								 0);  			cmd_length = E1000_TXD_CMD_IP;  			ipcse = skb_transport_offset(skb) - 1; -		} else if (skb->protocol == htons(ETH_P_IPV6)) { +		} else if (skb_is_gso_v6(skb)) {  			ipv6_hdr(skb)->payload_len = 0;  			tcp_hdr(skb)->check =  				~csum_ipv6_magic(&ipv6_hdr(skb)->saddr, @@ -2745,7 +2746,8 @@ static int e1000_tso(struct e1000_adapter *adapter,  }  static bool e1000_tx_csum(struct e1000_adapter *adapter, -			  struct e1000_tx_ring *tx_ring, struct sk_buff *skb) +			  struct e1000_tx_ring *tx_ring, struct sk_buff *skb, +			  __be16 protocol)  {  	struct e1000_context_desc *context_desc;  	struct e1000_buffer *buffer_info; @@ -2756,7 +2758,7 @@ static bool e1000_tx_csum(struct e1000_adapter *adapter,  	if (skb->ip_summed != CHECKSUM_PARTIAL)  		return false; -	switch (skb->protocol) { +	switch (protocol) {  	case cpu_to_be16(ETH_P_IP):  		if (ip_hdr(skb)->protocol == IPPROTO_TCP)  			cmd_len |= E1000_TXD_CMD_TCP; @@ -3097,6 +3099,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);  	/* This goes back to the question of how to logically map a Tx queue  	 * to a flow.  Right now, performance is impacted slightly negatively @@ -3210,7 +3213,7 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,  	first = tx_ring->next_to_use; -	tso = e1000_tso(adapter, tx_ring, skb); +	tso = e1000_tso(adapter, tx_ring, skb, protocol);  	if (tso < 0) {  		dev_kfree_skb_any(skb);  		return NETDEV_TX_OK; @@ -3220,10 +3223,10 @@ static netdev_tx_t e1000_xmit_frame(struct sk_buff *skb,  		if (likely(hw->mac_type != e1000_82544))  			tx_ring->last_tx_tso = true;  		tx_flags |= E1000_TX_FLAGS_TSO; -	} else if (likely(e1000_tx_csum(adapter, tx_ring, skb))) +	} else if (likely(e1000_tx_csum(adapter, tx_ring, skb, protocol)))  		tx_flags |= E1000_TX_FLAGS_CSUM; -	if (likely(skb->protocol == htons(ETH_P_IP))) +	if (protocol == htons(ETH_P_IP))  		tx_flags |= E1000_TX_FLAGS_IPV4;  	if (unlikely(skb->no_fcs))  |