]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.25/patches.drivers/netxen-fix-vlan-tso-checksum-offload.patch
Updated xen patches taken from suse.
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.25 / patches.drivers / netxen-fix-vlan-tso-checksum-offload.patch
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