get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/572588/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 572588,
    "url": "http://patchwork.ozlabs.org/api/patches/572588/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20160125051701.12004.23605.stgit@localhost.localdomain/",
    "project": {
        "id": 46,
        "url": "http://patchwork.ozlabs.org/api/projects/46/?format=api",
        "name": "Intel Wired Ethernet development",
        "link_name": "intel-wired-lan",
        "list_id": "intel-wired-lan.osuosl.org",
        "list_email": "intel-wired-lan@osuosl.org",
        "web_url": "",
        "scm_url": "",
        "webscm_url": "",
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<20160125051701.12004.23605.stgit@localhost.localdomain>",
    "list_archive_url": null,
    "date": "2016-01-25T05:17:01",
    "name": "[next,v3,08/15] i40e/i40evf: Do not write to descriptor unless we complete",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "09e195b2739d522d0eb73ccb57034f7312f29f69",
    "submitter": {
        "id": 67293,
        "url": "http://patchwork.ozlabs.org/api/people/67293/?format=api",
        "name": "Alexander Duyck",
        "email": "aduyck@mirantis.com"
    },
    "delegate": {
        "id": 68,
        "url": "http://patchwork.ozlabs.org/api/users/68/?format=api",
        "username": "jtkirshe",
        "first_name": "Jeff",
        "last_name": "Kirsher",
        "email": "jeffrey.t.kirsher@intel.com"
    },
    "mbox": "http://patchwork.ozlabs.org/project/intel-wired-lan/patch/20160125051701.12004.23605.stgit@localhost.localdomain/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/572588/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/572588/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<intel-wired-lan-bounces@lists.osuosl.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Delivered-To": [
            "patchwork-incoming@bilbo.ozlabs.org",
            "intel-wired-lan@lists.osuosl.org"
        ],
        "Received": [
            "from whitealder.osuosl.org (smtp1.osuosl.org [140.211.166.138])\n\tby ozlabs.org (Postfix) with ESMTP id 909AC140326\n\tfor <incoming@patchwork.ozlabs.org>;\n\tMon, 25 Jan 2016 16:17:08 +1100 (AEDT)",
            "from localhost (localhost [127.0.0.1])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 8601E8C42C;\n\tMon, 25 Jan 2016 05:17:06 +0000 (UTC)",
            "from whitealder.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id TDvKJwOt63wY; Mon, 25 Jan 2016 05:17:05 +0000 (UTC)",
            "from ash.osuosl.org (ash.osuosl.org [140.211.166.34])\n\tby whitealder.osuosl.org (Postfix) with ESMTP id 2B4AC8C410;\n\tMon, 25 Jan 2016 05:17:05 +0000 (UTC)",
            "from fraxinus.osuosl.org (smtp4.osuosl.org [140.211.166.137])\n\tby ash.osuosl.org (Postfix) with ESMTP id 83E4D1C107C\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 25 Jan 2016 05:17:05 +0000 (UTC)",
            "from localhost (localhost [127.0.0.1])\n\tby fraxinus.osuosl.org (Postfix) with ESMTP id 7FB4789E42\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 25 Jan 2016 05:17:05 +0000 (UTC)",
            "from fraxinus.osuosl.org ([127.0.0.1])\n\tby localhost (.osuosl.org [127.0.0.1]) (amavisd-new, port 10024)\n\twith ESMTP id VgqiJiMJ3PiG for <intel-wired-lan@lists.osuosl.org>;\n\tMon, 25 Jan 2016 05:17:04 +0000 (UTC)",
            "from mail-pa0-f44.google.com (mail-pa0-f44.google.com\n\t[209.85.220.44])\n\tby fraxinus.osuosl.org (Postfix) with ESMTPS id ABE8889D36\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tMon, 25 Jan 2016 05:17:04 +0000 (UTC)",
            "by mail-pa0-f44.google.com with SMTP id cy9so74901247pac.0\n\tfor <intel-wired-lan@lists.osuosl.org>;\n\tSun, 24 Jan 2016 21:17:04 -0800 (PST)",
            "from localhost.localdomain\n\t(static-50-53-29-36.bvtn.or.frontiernet.net. [50.53.29.36])\n\tby smtp.gmail.com with ESMTPSA id\n\tth10sm5620623pab.3.2016.01.24.21.17.03\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tSun, 24 Jan 2016 21:17:03 -0800 (PST)"
        ],
        "Authentication-Results": "ozlabs.org;\n\tdkim=fail reason=\"signature verification failed\" (1024-bit key;\n\tunprotected) header.d=mirantis.com header.i=@mirantis.com\n\theader.b=Ws7ZQvQu; dkim-atps=neutral",
        "X-Virus-Scanned": [
            "amavisd-new at osuosl.org",
            "amavisd-new at osuosl.org"
        ],
        "X-Greylist": "from auto-whitelisted by SQLgrey-1.7.6",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=mirantis.com;\n\ts=google; \n\th=subject:from:to:cc:date:message-id:in-reply-to:references\n\t:user-agent:mime-version:content-type:content-transfer-encoding;\n\tbh=p3dt2bCIQGq1ce/KAbPpmM2yb60tjTVleR9U14ip4d4=;\n\tb=Ws7ZQvQuFR9NnWjpZiLbYPVK/otCv2k5Wul7o6d90+LehxW19XXOZq6xCZIna2YHrt\n\tnmt+cWWpF9Tqf8l63bOOwBAWt6cceB63rM5vsNF2PTMxTCVIrd2r2aa3X5JNKHXpDmNt\n\tr3zZGw3Aj3Yb3Bzcpu+PJXG/F9LLBWG2dkMNE=",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:subject:from:to:cc:date:message-id:in-reply-to\n\t:references:user-agent:mime-version:content-type\n\t:content-transfer-encoding;\n\tbh=p3dt2bCIQGq1ce/KAbPpmM2yb60tjTVleR9U14ip4d4=;\n\tb=kGyeqdiP2xCPB2lBoY/J7RZKTZKuY403TPSTtWOS+8YIswMeTY/vt4jpRofxr+ZSIk\n\tWN8iHSGpjquVrOToMCNUzLlJ1kpW5QG7HWZkLpdaoz6aDpLMe1h8kuIQA6H4dsU5kTpn\n\tJ5ZYiQjuHzkeXbzEvqZLJhaHzdT0aOvLOe1S8KmBLHXTsdhx64+YzwCL+nykw4Mm/VUc\n\tKND8Nm1gIZaLBfQKWSLaCVmLA3aclJl9FgM+ipSQjOYZ5vnUzOz1Qtz0zsNjlbaCWy6c\n\tKEGri5/P+dSkGeCfMwLfo1R7np6DZhLki9TMoBLvdDcqVZl4BDAR1OqEErbg9QYuUDz+\n\tnZsg==",
        "X-Gm-Message-State": "AG10YOTzU4JTeiv0sTauGTly4MP8pHXnV+lrOPA/hAni9Y7RK41mEFo3N7r2SirltCM2f2fB",
        "X-Received": "by 10.66.191.195 with SMTP id ha3mr23414829pac.58.1453699024417; \n\tSun, 24 Jan 2016 21:17:04 -0800 (PST)",
        "From": "Alexander Duyck <aduyck@mirantis.com>",
        "To": "intel-wired-lan@lists.osuosl.org, jeffrey.t.kirsher@intel.com",
        "Date": "Sun, 24 Jan 2016 21:17:01 -0800",
        "Message-ID": "<20160125051701.12004.23605.stgit@localhost.localdomain>",
        "In-Reply-To": "<20160125050602.12004.38884.stgit@localhost.localdomain>",
        "References": "<20160125050602.12004.38884.stgit@localhost.localdomain>",
        "User-Agent": "StGit/0.17.1-dirty",
        "MIME-Version": "1.0",
        "Subject": "[Intel-wired-lan] [next PATCH v3 08/15] i40e/i40evf: Do not write\n\tto descriptor unless we complete",
        "X-BeenThere": "intel-wired-lan@lists.osuosl.org",
        "X-Mailman-Version": "2.1.18-1",
        "Precedence": "list",
        "List-Id": "Intel Wired Ethernet Linux Kernel Driver Development\n\t<intel-wired-lan.lists.osuosl.org>",
        "List-Unsubscribe": "<http://lists.osuosl.org/mailman/options/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=unsubscribe>",
        "List-Archive": "<http://lists.osuosl.org/pipermail/intel-wired-lan/>",
        "List-Post": "<mailto:intel-wired-lan@lists.osuosl.org>",
        "List-Help": "<mailto:intel-wired-lan-request@lists.osuosl.org?subject=help>",
        "List-Subscribe": "<http://lists.osuosl.org/mailman/listinfo/intel-wired-lan>, \n\t<mailto:intel-wired-lan-request@lists.osuosl.org?subject=subscribe>",
        "Content-Type": "text/plain; charset=\"us-ascii\"",
        "Content-Transfer-Encoding": "7bit",
        "Errors-To": "intel-wired-lan-bounces@lists.osuosl.org",
        "Sender": "\"Intel-wired-lan\" <intel-wired-lan-bounces@lists.osuosl.org>"
    },
    "content": "This patch defers writing to the Tx descriptor bits until we know we have\nsuccessuflly completed a given operation.  So for example we defer updating\nthe tunnelling portion of the context descriptor until we have fully\nidentified the type.\n\nThe advantage to this approach is that we can assemble values as we go\ninstead of having to try and cludge everything together all at once.  As a\nresult we can significantly clean up the tunneling configuration for\ninstance as we can just do a pointer walk and do the math for the distance\nbetween each set of points.\n\nSigned-off-by: Alexander Duyck <aduyck@mirantis.com>\n---\n drivers/net/ethernet/intel/i40e/i40e_txrx.c   |   81 +++++++++++++------------\n drivers/net/ethernet/intel/i40evf/i40e_txrx.c |   81 +++++++++++++------------\n 2 files changed, 84 insertions(+), 78 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/intel/i40e/i40e_txrx.c b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\nindex 2e9ae018d639..713b39f4f6f8 100644\n--- a/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40e/i40e_txrx.c\n@@ -2403,25 +2403,26 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\tunsigned char *hdr;\n \t} l4;\n \tunsigned char *exthdr;\n-\tu32 l4_tunnel = 0;\n+\tu32 offset, cmd = 0, tunnel = 0;\n \t__be16 frag_off;\n \tu8 l4_proto = 0;\n \n \tip.hdr = skb_network_header(skb);\n \tl4.hdr = skb_transport_header(skb);\n \n+\t/* compute outer L2 header size */\n+\toffset = ((ip.hdr - skb->data) / 2) << I40E_TX_DESC_LENGTH_MACLEN_SHIFT;\n+\n \tif (skb->encapsulation) {\n \t\t/* define outer network header type */\n \t\tif (*tx_flags & I40E_TX_FLAGS_IPV4) {\n-\t\t\tif (*tx_flags & I40E_TX_FLAGS_TSO) {\n-\t\t\t\t*cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV4;\n-\t\t\t} else {\n-\t\t\t\t*cd_tunneling |=\n-\t\t\t\t\t I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM;\n-\t\t\t}\n+\t\t\ttunnel |= (*tx_flags & I40E_TX_FLAGS_TSO) ?\n+\t\t\t\t  I40E_TX_CTX_EXT_IP_IPV4 :\n+\t\t\t\t  I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM;\n+\n \t\t\tl4_proto = ip.v4->protocol;\n \t\t} else if (*tx_flags & I40E_TX_FLAGS_IPV6) {\n-\t\t\t*cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6;\n+\t\t\ttunnel |= I40E_TX_CTX_EXT_IP_IPV6;\n \n \t\t\texthdr = ip.hdr + sizeof(*ip.v6);\n \t\t\tl4_proto = ip.v6->nexthdr;\n@@ -2430,33 +2431,38 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t\t\t\t\t &l4_proto, &frag_off);\n \t\t}\n \n+\t\t/* compute outer L3 header size */\n+\t\ttunnel |= ((l4.hdr - ip.hdr) / 4) <<\n+\t\t\t  I40E_TXD_CTX_QW0_EXT_IPLEN_SHIFT;\n+\n+\t\t/* switch IP header pointer from outer to inner header */\n+\t\tip.hdr = skb_inner_network_header(skb);\n+\n \t\t/* define outer transport */\n \t\tswitch (l4_proto) {\n \t\tcase IPPROTO_UDP:\n-\t\t\tl4_tunnel = I40E_TXD_CTX_UDP_TUNNELING;\n+\t\t\ttunnel |= I40E_TXD_CTX_UDP_TUNNELING;\n \t\t\t*tx_flags |= I40E_TX_FLAGS_TUNNEL;\n \t\t\tbreak;\n \t\tcase IPPROTO_GRE:\n-\t\t\tl4_tunnel = I40E_TXD_CTX_GRE_TUNNELING;\n+\t\t\ttunnel |= I40E_TXD_CTX_GRE_TUNNELING;\n \t\t\t*tx_flags |= I40E_TX_FLAGS_TUNNEL;\n \t\t\tbreak;\n \t\tdefault:\n \t\t\treturn;\n \t\t}\n \n+\t\t/* compute tunnel header size */\n+\t\ttunnel |= ((ip.hdr - l4.hdr) / 2) <<\n+\t\t\t  I40E_TXD_CTX_QW0_NATLEN_SHIFT;\n+\n+\t\t/* record tunnel offload values */\n+\t\t*cd_tunneling |= tunnel;\n+\n \t\t/* switch L4 header pointer from outer to inner */\n-\t\tip.hdr = skb_inner_network_header(skb);\n \t\tl4.hdr = skb_inner_transport_header(skb);\n \t\tl4_proto = 0;\n \n-\t\t/* Now set the ctx descriptor fields */\n-\t\t*cd_tunneling |= (skb_network_header_len(skb) >> 2) <<\n-\t\t\t\t   I40E_TXD_CTX_QW0_EXT_IPLEN_SHIFT      |\n-\t\t\t\t   l4_tunnel                             |\n-\t\t\t\t   ((skb_inner_network_offset(skb) -\n-\t\t\t\t\tskb_transport_offset(skb)) >> 1) <<\n-\t\t\t\t   I40E_TXD_CTX_QW0_NATLEN_SHIFT;\n-\n \t\t/* reset type as we transition from outer to inner headers */\n \t\t*tx_flags &= ~(I40E_TX_FLAGS_IPV4 | I40E_TX_FLAGS_IPV6);\n \t\tif (ip.v4->version == 4)\n@@ -2471,13 +2477,11 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t/* the stack computes the IP header already, the only time we\n \t\t * need the hardware to recompute it is in the case of TSO.\n \t\t */\n-\t\tif (*tx_flags & I40E_TX_FLAGS_TSO) {\n-\t\t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV4_CSUM;\n-\t\t} else {\n-\t\t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV4;\n-\t\t}\n+\t\tcmd |= (*tx_flags & I40E_TX_FLAGS_TSO) ?\n+\t\t       I40E_TX_DESC_CMD_IIPT_IPV4_CSUM :\n+\t\t       I40E_TX_DESC_CMD_IIPT_IPV4;\n \t} else if (*tx_flags & I40E_TX_FLAGS_IPV6) {\n-\t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV6;\n+\t\tcmd |= I40E_TX_DESC_CMD_IIPT_IPV6;\n \n \t\texthdr = ip.hdr + sizeof(*ip.v6);\n \t\tl4_proto = ip.v6->nexthdr;\n@@ -2486,35 +2490,34 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t\t\t\t &l4_proto, &frag_off);\n \t}\n \n-\t/* Now set the td_offset for IP header length */\n-\t*td_offset = ((l4.hdr - ip.hdr) / 4) << I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n-\t/* words in MACLEN + dwords in IPLEN + dwords in L4Len */\n-\t*td_offset |= (skb_network_offset(skb) >> 1) <<\n-\t\t       I40E_TX_DESC_LENGTH_MACLEN_SHIFT;\n+\t/* compute inner L3 header size */\n+\toffset |= ((l4.hdr - ip.hdr) / 4) << I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n \n \t/* Enable L4 checksum offloads */\n \tswitch (l4_proto) {\n \tcase IPPROTO_TCP:\n \t\t/* enable checksum offloads */\n-\t\t*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_TCP;\n-\t\t*td_offset |= l4.tcp->doff <<\n-\t\t\t       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n+\t\tcmd |= I40E_TX_DESC_CMD_L4T_EOFT_TCP;\n+\t\toffset |= l4.tcp->doff << I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n \t\tbreak;\n \tcase IPPROTO_SCTP:\n \t\t/* enable SCTP checksum offload */\n-\t\t*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_SCTP;\n-\t\t*td_offset |= (sizeof(struct sctphdr) >> 2) <<\n-\t\t\t       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n+\t\tcmd |= I40E_TX_DESC_CMD_L4T_EOFT_SCTP;\n+\t\toffset |= (sizeof(struct sctphdr) >> 2) <<\n+\t\t\t  I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n \t\tbreak;\n \tcase IPPROTO_UDP:\n \t\t/* enable UDP checksum offload */\n-\t\t*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_UDP;\n-\t\t*td_offset |= (sizeof(struct udphdr) >> 2) <<\n-\t\t\t       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n+\t\tcmd |= I40E_TX_DESC_CMD_L4T_EOFT_UDP;\n+\t\toffset |= (sizeof(struct udphdr) >> 2) <<\n+\t\t\t  I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n \t\tbreak;\n \tdefault:\n \t\tbreak;\n \t}\n+\n+\t*td_cmd |= cmd;\n+\t*td_offset |= offset;\n }\n \n /**\ndiff --git a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\nindex d37cba28ecfa..35aa07f8b9da 100644\n--- a/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\n+++ b/drivers/net/ethernet/intel/i40evf/i40e_txrx.c\n@@ -1620,25 +1620,26 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\tunsigned char *hdr;\n \t} l4;\n \tunsigned char *exthdr;\n-\tu32 l4_tunnel = 0;\n+\tu32 offset, cmd = 0, tunnel = 0;\n \t__be16 frag_off;\n \tu8 l4_proto = 0;\n \n \tip.hdr = skb_network_header(skb);\n \tl4.hdr = skb_transport_header(skb);\n \n+\t/* compute outer L2 header size */\n+\toffset = ((ip.hdr - skb->data) / 2) << I40E_TX_DESC_LENGTH_MACLEN_SHIFT;\n+\n \tif (skb->encapsulation) {\n \t\t/* define outer network header type */\n \t\tif (*tx_flags & I40E_TX_FLAGS_IPV4) {\n-\t\t\tif (*tx_flags & I40E_TX_FLAGS_TSO) {\n-\t\t\t\t*cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV4;\n-\t\t\t} else {\n-\t\t\t\t*cd_tunneling |=\n-\t\t\t\t\t I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM;\n-\t\t\t}\n+\t\t\ttunnel |= (*tx_flags & I40E_TX_FLAGS_TSO) ?\n+\t\t\t\t  I40E_TX_CTX_EXT_IP_IPV4 :\n+\t\t\t\t  I40E_TX_CTX_EXT_IP_IPV4_NO_CSUM;\n+\n \t\t\tl4_proto = ip.v4->protocol;\n \t\t} else if (*tx_flags & I40E_TX_FLAGS_IPV6) {\n-\t\t\t*cd_tunneling |= I40E_TX_CTX_EXT_IP_IPV6;\n+\t\t\ttunnel |= I40E_TX_CTX_EXT_IP_IPV6;\n \n \t\t\texthdr = ip.hdr + sizeof(*ip.v6);\n \t\t\tl4_proto = ip.v6->nexthdr;\n@@ -1647,33 +1648,38 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t\t\t\t\t &l4_proto, &frag_off);\n \t\t}\n \n+\t\t/* compute outer L3 header size */\n+\t\ttunnel |= ((l4.hdr - ip.hdr) / 4) <<\n+\t\t\t  I40E_TXD_CTX_QW0_EXT_IPLEN_SHIFT;\n+\n+\t\t/* switch IP header pointer from outer to inner header */\n+\t\tip.hdr = skb_inner_network_header(skb);\n+\n \t\t/* define outer transport */\n \t\tswitch (l4_proto) {\n \t\tcase IPPROTO_UDP:\n-\t\t\tl4_tunnel = I40E_TXD_CTX_UDP_TUNNELING;\n+\t\t\ttunnel |= I40E_TXD_CTX_UDP_TUNNELING;\n \t\t\t*tx_flags |= I40E_TX_FLAGS_TUNNEL;\n \t\t\tbreak;\n \t\tcase IPPROTO_GRE:\n-\t\t\tl4_tunnel = I40E_TXD_CTX_GRE_TUNNELING;\n+\t\t\ttunnel |= I40E_TXD_CTX_GRE_TUNNELING;\n \t\t\t*tx_flags |= I40E_TX_FLAGS_TUNNEL;\n \t\t\tbreak;\n \t\tdefault:\n \t\t\treturn;\n \t\t}\n \n+\t\t/* compute tunnel header size */\n+\t\ttunnel |= ((ip.hdr - l4.hdr) / 2) <<\n+\t\t\t  I40E_TXD_CTX_QW0_NATLEN_SHIFT;\n+\n+\t\t/* record tunnel offload values */\n+\t\t*cd_tunneling |= tunnel;\n+\n \t\t/* switch L4 header pointer from outer to inner */\n-\t\tip.hdr = skb_inner_network_header(skb);\n \t\tl4.hdr = skb_inner_transport_header(skb);\n \t\tl4_proto = 0;\n \n-\t\t/* Now set the ctx descriptor fields */\n-\t\t*cd_tunneling |= (skb_network_header_len(skb) >> 2) <<\n-\t\t\t\t   I40E_TXD_CTX_QW0_EXT_IPLEN_SHIFT      |\n-\t\t\t\t   l4_tunnel                             |\n-\t\t\t\t   ((skb_inner_network_offset(skb) -\n-\t\t\t\t\tskb_transport_offset(skb)) >> 1) <<\n-\t\t\t\t   I40E_TXD_CTX_QW0_NATLEN_SHIFT;\n-\n \t\t/* reset type as we transition from outer to inner headers */\n \t\t*tx_flags &= ~(I40E_TX_FLAGS_IPV4 | I40E_TX_FLAGS_IPV6);\n \t\tif (ip.v4->version == 4)\n@@ -1688,13 +1694,11 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t/* the stack computes the IP header already, the only time we\n \t\t * need the hardware to recompute it is in the case of TSO.\n \t\t */\n-\t\tif (*tx_flags & I40E_TX_FLAGS_TSO) {\n-\t\t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV4_CSUM;\n-\t\t} else {\n-\t\t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV4;\n-\t\t}\n+\t\tcmd |= (*tx_flags & I40E_TX_FLAGS_TSO) ?\n+\t\t       I40E_TX_DESC_CMD_IIPT_IPV4_CSUM :\n+\t\t       I40E_TX_DESC_CMD_IIPT_IPV4;\n \t} else if (*tx_flags & I40E_TX_FLAGS_IPV6) {\n-\t\t*td_cmd |= I40E_TX_DESC_CMD_IIPT_IPV6;\n+\t\tcmd |= I40E_TX_DESC_CMD_IIPT_IPV6;\n \n \t\texthdr = ip.hdr + sizeof(*ip.v6);\n \t\tl4_proto = ip.v6->nexthdr;\n@@ -1703,35 +1707,34 @@ static void i40e_tx_enable_csum(struct sk_buff *skb, u32 *tx_flags,\n \t\t\t\t\t &l4_proto, &frag_off);\n \t}\n \n-\t/* Now set the td_offset for IP header length */\n-\t*td_offset = ((l4.hdr - ip.hdr) / 4) << I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n-\t/* words in MACLEN + dwords in IPLEN + dwords in L4Len */\n-\t*td_offset |= (skb_network_offset(skb) >> 1) <<\n-\t\t       I40E_TX_DESC_LENGTH_MACLEN_SHIFT;\n+\t/* compute inner L3 header size */\n+\toffset |= ((l4.hdr - ip.hdr) / 4) << I40E_TX_DESC_LENGTH_IPLEN_SHIFT;\n \n \t/* Enable L4 checksum offloads */\n \tswitch (l4_proto) {\n \tcase IPPROTO_TCP:\n \t\t/* enable checksum offloads */\n-\t\t*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_TCP;\n-\t\t*td_offset |= l4.tcp->doff <<\n-\t\t\t       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n+\t\tcmd |= I40E_TX_DESC_CMD_L4T_EOFT_TCP;\n+\t\toffset |= l4.tcp->doff << I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n \t\tbreak;\n \tcase IPPROTO_SCTP:\n \t\t/* enable SCTP checksum offload */\n-\t\t*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_SCTP;\n-\t\t*td_offset |= (sizeof(struct sctphdr) >> 2) <<\n-\t\t\t       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n+\t\tcmd |= I40E_TX_DESC_CMD_L4T_EOFT_SCTP;\n+\t\toffset |= (sizeof(struct sctphdr) >> 2) <<\n+\t\t\t  I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n \t\tbreak;\n \tcase IPPROTO_UDP:\n \t\t/* enable UDP checksum offload */\n-\t\t*td_cmd |= I40E_TX_DESC_CMD_L4T_EOFT_UDP;\n-\t\t*td_offset |= (sizeof(struct udphdr) >> 2) <<\n-\t\t\t       I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n+\t\tcmd |= I40E_TX_DESC_CMD_L4T_EOFT_UDP;\n+\t\toffset |= (sizeof(struct udphdr) >> 2) <<\n+\t\t\t  I40E_TX_DESC_LENGTH_L4_FC_LEN_SHIFT;\n \t\tbreak;\n \tdefault:\n \t\tbreak;\n \t}\n+\n+\t*td_cmd |= cmd;\n+\t*td_offset |= offset;\n }\n \n /**\n",
    "prefixes": [
        "next",
        "v3",
        "08/15"
    ]
}