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>
8 o set netdev->vlan_features appropriately.
9 o fix tso descriptor initialization for vlan case.
11 Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com>
12 Signed-off-by: David S. Miller <davem@davemloft.net>
14 drivers/net/netxen/netxen_nic_main.c | 31 ++++++++++++++++++++-----------
15 1 files changed, 20 insertions(+), 11 deletions(-)
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_
24 u8 opcode = TX_ETHER_PKT;
25 + __be16 protocol = skb->protocol;
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;
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);
40 - opcode = (skb->protocol == htons(ETH_P_IPV6)) ?
41 + opcode = (protocol == __constant_htons(ETH_P_IPV6)) ?
42 TX_TCP_LSO6 : TX_TCP_LSO;
45 } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
48 - if (skb->protocol == htons(ETH_P_IP)) {
49 + if (protocol == __constant_htons(ETH_P_IP)) {
50 l4proto = ip_hdr(skb)->protocol;
52 if (l4proto == IPPROTO_TCP)
54 else if(l4proto == IPPROTO_UDP)
56 - } else if (skb->protocol == htons(ETH_P_IPV6)) {
57 + } else if (protocol == __constant_htons(ETH_P_IPV6)) {
58 l4proto = ipv6_hdr(skb)->nexthdr;
60 if (l4proto == IPPROTO_TCP)
61 @@ -1188,7 +1196,7 @@ static bool netxen_tso_check(struct net_
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);