qeth: omit upstream checksumming for HiperSockets
authorUrsula Braun <ursula.braun@de.ibm.com>
Tue, 19 May 2009 21:38:40 +0000 (21:38 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 21 May 2009 00:36:51 +0000 (17:36 -0700)
For HiperSocket devices receive-path checksumming is not required.
Thus NO_CHECKSUMMING is used as default for HiperSocket interfaces.
For layer3 devices configured with NO_CHECKSUMMING received skbs
should have set their ip_summed field to CHECKSUM_UNNECESSARY.

Signed-off-by: Ursula Braun <ursula.braun@de.ibm.com>
Signed-off-by: Frank Blaschka <frank.blaschka@de.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/s390/net/qeth_core_main.c
drivers/s390/net/qeth_l3_main.c

index c827d69b5a912c83244afd3cdd1eeb98b630b7e9..63c9c05d614727bea4475d3c8481f50341afd23a 100644 (file)
@@ -1140,6 +1140,8 @@ static int qeth_setup_card(struct qeth_card *card)
        card->ipato.enabled = 0;
        card->ipato.invert4 = 0;
        card->ipato.invert6 = 0;
+       if (card->info.type == QETH_CARD_TYPE_IQD)
+               card->options.checksum_type = NO_CHECKSUMMING;
        /* init QDIO stuff */
        qeth_init_qdio_info(card);
        return 0;
index 5873240c3ceade70e8786666359b16f345d7f885..b36b5cdf90006ebfcced0e1af86769f3d8eb306e 100644 (file)
@@ -1920,16 +1920,22 @@ static inline __u16 qeth_l3_rebuild_skb(struct qeth_card *card,
                 hdr->hdr.l3.vlan_id : *((u16 *)&hdr->hdr.l3.dest_addr[12]);
        }
 
-       skb->ip_summed = card->options.checksum_type;
-       if (card->options.checksum_type == HW_CHECKSUMMING) {
+       switch (card->options.checksum_type) {
+       case SW_CHECKSUMMING:
+               skb->ip_summed = CHECKSUM_NONE;
+               break;
+       case NO_CHECKSUMMING:
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+               break;
+       case HW_CHECKSUMMING:
                if ((hdr->hdr.l3.ext_flags &
-                     (QETH_HDR_EXT_CSUM_HDR_REQ |
-                      QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
-                    (QETH_HDR_EXT_CSUM_HDR_REQ |
-                     QETH_HDR_EXT_CSUM_TRANSP_REQ))
+                   (QETH_HDR_EXT_CSUM_HDR_REQ |
+                    QETH_HDR_EXT_CSUM_TRANSP_REQ)) ==
+                   (QETH_HDR_EXT_CSUM_HDR_REQ |
+                    QETH_HDR_EXT_CSUM_TRANSP_REQ))
                        skb->ip_summed = CHECKSUM_UNNECESSARY;
                else
-                       skb->ip_summed = SW_CHECKSUMMING;
+                       skb->ip_summed = CHECKSUM_NONE;
        }
 
        return vlan_id;