|
@@ -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))
|