]> git.ipfire.org Git - people/pmueller/ipfire-2.x.git/blob - src/patches/suse-2.6.27.31/patches.arch/s390-13-03-qeth_checksum.patch
Revert "Disable build of xen kernel."
[people/pmueller/ipfire-2.x.git] / src / patches / suse-2.6.27.31 / patches.arch / s390-13-03-qeth_checksum.patch
1 From: Gerald Schaefer <geraldsc@de.ibm.com>
2 Subject: qeth: improve no_checksumming handling for layer3
3 References: bnc#499845,LTC#53306
4
5 Symptom: Messages "hw csum failure" when tcpdump is running
6 Problem: If sysfs-attribute checksumming is set to
7 "no-checksumming" for a layer3 qeth device, incoming
8 data is stored in skbs with incorrect setting of
9 skb->ip_summed.
10 Solution: Set skb->ip_summed to CHECKSUM_UNNECESSARY if
11 RX-checksumming is not required.
12
13 Acked-by: John Jolly <jjolly@suse.de>
14 ---
15 drivers/s390/net/qeth_l3_main.c | 20 +++++++++++++-------
16 1 file changed, 13 insertions(+), 7 deletions(-)
17
18 Index: linux-sles11/drivers/s390/net/qeth_l3_main.c
19 ===================================================================
20 --- linux-sles11.orig/drivers/s390/net/qeth_l3_main.c
21 +++ linux-sles11/drivers/s390/net/qeth_l3_main.c
22 @@ -1939,16 +1939,22 @@ static inline __u16 qeth_l3_rebuild_skb(
23 hdr->hdr.l3.vlan_id : *((u16 *)&hdr->hdr.l3.dest_addr[12]);
24 }
25
26 - skb->ip_summed = card->options.checksum_type;
27 - if (card->options.checksum_type == HW_CHECKSUMMING) {
28 + switch (card->options.checksum_type) {
29 + case SW_CHECKSUMMING:
30 + skb->ip_summed = CHECKSUM_NONE;
31 + break;
32 + case NO_CHECKSUMMING:
33 + skb->ip_summed = CHECKSUM_UNNECESSARY;
34 + break;
35 + case HW_CHECKSUMMING:
36 if ((hdr->hdr.l3.ext_flags &
37 - (QETH_HDR_EXT_CSUM_HDR_REQ |
38 - QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
39 - (QETH_HDR_EXT_CSUM_HDR_REQ |
40 - QETH_HDR_EXT_CSUM_TRANSP_REQ))
41 + (QETH_HDR_EXT_CSUM_HDR_REQ |
42 + QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
43 + (QETH_HDR_EXT_CSUM_HDR_REQ |
44 + QETH_HDR_EXT_CSUM_TRANSP_REQ))
45 skb->ip_summed = CHECKSUM_UNNECESSARY;
46 else
47 - skb->ip_summed = SW_CHECKSUMMING;
48 + skb->ip_summed = CHECKSUM_NONE;
49 }
50
51 return vlan_id;