]>
Commit | Line | Data |
---|---|---|
2cb7cef9 BS |
1 | From cdff1036492ac97b4213aeab2546914a633a7de7 Mon Sep 17 00:00:00 2001 |
2 | From: Dhananjay Phadke <dhananjay@netxen.com> | |
3 | Date: Mon, 26 Jan 2009 12:34:57 -0800 | |
4 | Subject: netxen: fix vlan tso/checksum offload | |
5 | Acked-by: Karsten Keil <kkeil@novell.com> | |
6 | Reference: bnc#472416 | |
7 | ||
8 | o set netdev->vlan_features appropriately. | |
9 | o fix tso descriptor initialization for vlan case. | |
10 | ||
11 | Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> | |
12 | Signed-off-by: David S. Miller <davem@davemloft.net> | |
13 | --- | |
14 | drivers/net/netxen/netxen_nic_main.c | 31 ++++++++++++++++++++----------- | |
15 | 1 files changed, 20 insertions(+), 11 deletions(-) | |
16 | ||
17 | Index: linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_main.c | |
18 | =================================================================== | |
19 | --- linux-2.6.27-kketmp.orig/drivers/net/netxen/netxen_nic_main.c | |
20 | +++ linux-2.6.27-kketmp/drivers/net/netxen/netxen_nic_main.c | |
21 | @@ -1155,6 +1155,14 @@ static bool netxen_tso_check(struct net_ | |
22 | { | |
23 | bool tso = false; | |
24 | u8 opcode = TX_ETHER_PKT; | |
25 | + __be16 protocol = skb->protocol; | |
26 | + u16 flags = 0; | |
27 | + | |
28 | + if (protocol == __constant_htons(ETH_P_8021Q)) { | |
29 | + struct vlan_ethhdr *vh = (struct vlan_ethhdr *)skb->data; | |
30 | + protocol = vh->h_vlan_encapsulated_proto; | |
31 | + flags = FLAGS_VLAN_TAGGED; | |
32 | + } | |
33 | ||
34 | if ((netdev->features & (NETIF_F_TSO | NETIF_F_TSO6)) && | |
35 | skb_shinfo(skb)->gso_size > 0) { | |
36 | @@ -1163,21 +1171,21 @@ static bool netxen_tso_check(struct net_ | |
37 | desc->total_hdr_length = | |
38 | skb_transport_offset(skb) + tcp_hdrlen(skb); | |
39 | ||
40 | - opcode = (skb->protocol == htons(ETH_P_IPV6)) ? | |
41 | + opcode = (protocol == __constant_htons(ETH_P_IPV6)) ? | |
42 | TX_TCP_LSO6 : TX_TCP_LSO; | |
43 | tso = true; | |
44 | ||
45 | } else if (skb->ip_summed == CHECKSUM_PARTIAL) { | |
46 | u8 l4proto; | |
47 | ||
48 | - if (skb->protocol == htons(ETH_P_IP)) { | |
49 | + if (protocol == __constant_htons(ETH_P_IP)) { | |
50 | l4proto = ip_hdr(skb)->protocol; | |
51 | ||
52 | if (l4proto == IPPROTO_TCP) | |
53 | opcode = TX_TCP_PKT; | |
54 | else if(l4proto == IPPROTO_UDP) | |
55 | opcode = TX_UDP_PKT; | |
56 | - } else if (skb->protocol == htons(ETH_P_IPV6)) { | |
57 | + } else if (protocol == __constant_htons(ETH_P_IPV6)) { | |
58 | l4proto = ipv6_hdr(skb)->nexthdr; | |
59 | ||
60 | if (l4proto == IPPROTO_TCP) | |
61 | @@ -1188,7 +1196,7 @@ static bool netxen_tso_check(struct net_ | |
62 | } | |
63 | desc->tcp_hdr_offset = skb_transport_offset(skb); | |
64 | desc->ip_hdr_offset = skb_network_offset(skb); | |
65 | - netxen_set_tx_flags_opcode(desc, 0, opcode); | |
66 | + netxen_set_tx_flags_opcode(desc, flags, opcode); | |
67 | return tso; | |
68 | } | |
69 |