get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 42615,
    "url": "http://patchwork.dpdk.org/api/patches/42615/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/1531132986-5054-1-git-send-email-motih@mellanox.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1531132986-5054-1-git-send-email-motih@mellanox.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1531132986-5054-1-git-send-email-motih@mellanox.com",
    "date": "2018-07-09T10:43:06",
    "name": "[v5] net/mlx4: support hardware TSO",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "b6b7b3e002811da248ec89c062fe697c008e8273",
    "submitter": {
        "id": 748,
        "url": "http://patchwork.dpdk.org/api/people/748/?format=api",
        "name": "Moti Haimovsky",
        "email": "motih@mellanox.com"
    },
    "delegate": {
        "id": 6624,
        "url": "http://patchwork.dpdk.org/api/users/6624/?format=api",
        "username": "shahafs",
        "first_name": "Shahaf",
        "last_name": "Shuler",
        "email": "shahafs@mellanox.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/1531132986-5054-1-git-send-email-motih@mellanox.com/mbox/",
    "series": [
        {
            "id": 471,
            "url": "http://patchwork.dpdk.org/api/series/471/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=471",
            "date": "2018-07-09T10:43:06",
            "name": "[v5] net/mlx4: support hardware TSO",
            "version": 5,
            "mbox": "http://patchwork.dpdk.org/series/471/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/42615/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/42615/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id DF8211B067;\n\tMon,  9 Jul 2018 12:43:32 +0200 (CEST)",
            "from EUR02-HE1-obe.outbound.protection.outlook.com\n\t(mail-eopbgr10074.outbound.protection.outlook.com [40.107.1.74])\n\tby dpdk.org (Postfix) with ESMTP id 60B3D1B062\n\tfor <dev@dpdk.org>; Mon,  9 Jul 2018 12:43:31 +0200 (CEST)",
            "from localhost.localdomain (37.142.13.130) by\n\tVI1PR05MB4445.eurprd05.prod.outlook.com (2603:10a6:803:42::28) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.930.20; Mon, 9 Jul 2018 10:43:28 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com;\n\ts=selector1;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=Tnt21gWhDrzLfs/dGoysyHibgYB9gKee5Y+XDhNUCyI=;\n\tb=On95c9IUQdTWchBfDCxjnYp2eWsyx1CBFelsg4wg5mF4YdkOnGunJqgvrXtnF+jj/py+KoufpVDV0rmkY0R9mqzC6QtyzUWjxTg2DCHxtXqhYm9DXlZ2wd7nZ8ZNGzEjy89/Vw7EDGj2kqjMiuvwNtoPd0xi6YSczQsYwTMKivs=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=motih@mellanox.com; ",
        "From": "Moti Haimovsky <motih@mellanox.com>",
        "To": "adrien.mazarguil@6wind.com,\n\tmatan@mellanox.com",
        "Cc": "dev@dpdk.org,\n\tMoti Haimovsky <motih@mellanox.com>",
        "Date": "Mon,  9 Jul 2018 13:43:06 +0300",
        "Message-Id": "<1531132986-5054-1-git-send-email-motih@mellanox.com>",
        "X-Mailer": "git-send-email 1.7.1",
        "In-Reply-To": "<1530715998-15703-1-git-send-email-motih@mellanox.com>",
        "References": "<1530715998-15703-1-git-send-email-motih@mellanox.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[37.142.13.130]",
        "X-ClientProxiedBy": "HE1PR05CA0142.eurprd05.prod.outlook.com\n\t(2603:10a6:7:28::29) To VI1PR05MB4445.eurprd05.prod.outlook.com\n\t(2603:10a6:803:42::28)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "3a2f453f-eddf-4cbe-9c28-08d5e588cf21",
        "X-MS-Office365-Filtering-HT": "Tenant",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989117)(5600053)(711020)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(48565401081)(2017052603328)(7153060)(7193020);\n\tSRVR:VI1PR05MB4445; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; VI1PR05MB4445;\n\t3:6mQP8aRCmKyd2QNs7W6qK/WujRcG2K9opODW46j2hELarNG7bTnXydIDL0ZFFxSibnfHbjIdOuVE7fAKw1AS4PFFbqQGeTXaF9hXWuaIfUR7CnnClS9Tw+zA6mG//3X60XrWBtGM5nZr0xc2Y2drNUhZ7KCbDdwSWuz2+qL5hc11C6XZKlC/MkRZ8+eOvr+WxPQ1Q+TONjm7mod6xy+ZwPRA3gsBU7CapqsqYSIf15y7JMjOhJdTs6JDV560V5qm;\n\t25:N2SXdVSKieL47uUWRGFC3cJrE4IC3KENvpRdSj7i/ag1sTVXGUwOcTcbZfSeikNJjh4VfFgW6TKzliuQ2Si2knlwFxOitL0qnyTBRFBizV9LUp7nF/IP++44d3NPqSEuJuGBXety43F6JRpto4oPDahHY+FZMGQ9n+NyjCFzIQXhx2vpk2SvcfOtqv/DpjRcucIeL906TDc95a/BT0Cf8u+gN5cKq/5omX+zE4zHW+Ie6LEXzGY4VkFiHscAUo1YHcXzhk7db5dkP1zet+8qDEn3wXu7iluIKF11TbfIb9/XSyLx+NLTnb++nMzZm5FIj7ym1AvbXTaXoUM2w/rczw==;\n\t31:BIdxjVhZx3VT8WdTqEmC/XJ2PgpxpyCLqYSQbwWeIeDAUBtuNbRKimMXo6Psn9nwD3tSc3CUjC8pYjNd84wrZdoCvAjTA77Lc0tdDJbP132CwNNdJ9MsbW+DjmrKTyYqR+DWfzoZGZF+s2pkPDjNR/tEll2o+ihdIuefVc4hcsKF1uWjZxAyxUVSUoGQegSQEUByAH0Yv2nZXET7zZEghAoO40+IlTboeCQ0hoUXgFE=",
            "1; VI1PR05MB4445;\n\t20:fb3gl0ztRUGGWgegYv1dIPvrra7MAnWxfEPJmX1aJnj3g1fq841exZhw7/H13fvnxqSjD29q4XQS8VRTV0Aiw5a/ZiYYzeamdMsVO2W+RT4VHeCqKZs4J/vf3N0iC9ubyG7v9tJSNHzT6TJI7gDUpn50L3iaUUMY9KvfYmQo9ryvncc2w5QToQ+oR8zARyqFYrsHphg4r/jJ53yuLAMpMogVDT9lw1NzPW5vlj5opaLvMA/7rVtixmwJwzrp9OZBcvgeLG8fv6Lck3TN7OFu46M38pJr20HMpL4ZybZMGFIO4qOgb6Ey2ALhMAxLnUWiXH8cExVWDJHxlYFqgdCQuvRcZNbzBwOVVfswprakRVrN3f4s6WUBMBB4OI8K19bcyzSFIYsUAuGm4YhK4Dk8f6VbFrbU8aCheP892hEugsdpsUz/wJMJYIoMGkFbs5nwnhN3pSbe4xJaI4Faam2eMe6iszqIxS2AV/v0slDmLB5uPze3RL+/IR1yJSXv9irP;\n\t4:DXdqVXf65FJ2O1OG1af/XZNoY1afFPtcq29YOx9XiCHytg30/+1vfBvYCEcpiWYYXNt41ipV4h4HFrhtjb5mdkgYkqBbFVcp8oRZ6ZSAzugZ4wDJPSNmSs4j9rs/+MhRcxqL2+o00zznU4X7R4gJdJRn2p4iHd7anW8z+jZvn1ztwWcWwKL9iB9gVeJgR+W1WhHWkBimvC0DdDlckBvKd97/C5i5VmNexMU8LscbYkGDd6oDZlrfM5ZNHxZ7n1oAGKaQFClV4eCb8ZKP5ARZ+w==",
            "=?us-ascii?Q?1; VI1PR05MB4445;\n\t23:mstwt9MK+7YSbCdHRSV02q6Y92cAPlIzJGyTZc91B?=\n\tSUVd2K4z6NyKgTramXb05O5qkW6EZdnHUPoBW9FgYoKWo++s2WCJ8lQIdXqfvzpQ08vuocQIvV/Sm07uquui5H1TptS/nvA9Th/gFg1zWSho9D6Z9LDXtjxydu2m9e5hFSIJXCoPNADJBREoxrMlCuCclGoElG0QMfgWQqhin0NI/85+9yuJWh8OWwu8NLoy6HfMXs4iNK9Mwt+yFijrVcHxaSRxsvNRVvxS20Kohppe+2SbVNc8ZnAcBmaaSaRquELryRRR92lu8frnpKuQ13y60QVLSLZPoRyyTZnIYbF7ageJsn6BkZBUe4DgJDsfMSnYCni6vLplSsr5htz/7/hzZWXu0nVdODrHE6xQmf5X550hvS2DXWZURZulMgg0P0s50f7oaItZsjK542J3eAfF0EwUAJdaeCwfVj/nz97Q4ruI85je2pDPtCNEI9e/TVpxQYVSoBamO5SbEre69F9k5E3CFqulsEbSXgIwkMAZXw6Of83YU3TFzX/ldl3Zp01qm8IZyV0gL1MbTaCxqiwA/vwrQdywxsGKGkMh0K+5BgN0k2OlLm8HFzOz5XaTAaFxSrgj9o6ptIoutAjMsG6X6xkjv20vq8jjcfhAfunLpXeLKh/UnFN9DSvd0sfmWhWojO6ToHuKR4cjFB545Kh5btFyjxNT9I54LMAR/B7Valddn63al8sAiHu6GR+mpLlblDdufMWV5w1/eIgh3NZQu7YInMZODZk5skk+XDgynETbkS5TOoXBFyj2WMEePHiw9eAY8DhhDd5afyWGGXjtI7yhzX/TYO1wWMlJbpuO9wkWsDHnQyJm3kDldYO04ctLHjAAiM6/5c8/RLpt+xGngVNN3Ml7k2F+lNLWO2Vt9rRE1KkPi7mcZXlgFf5HLvCuem2bwYVdR81tIqP8GPyqro++1mFs4F4VqRMbh80R9L3EbfrlAF8mW4OEilRhWNvRuu/I35/kt0X4hTsRHld1IGn2fBHudBl37pDqLG/NmGkIt3JjgWKXnyEksmQgBsiFzgrqFaV4KF9E+whUs54fk48AL9iqEZC8wsAIwp7TafhALf1Y9EAy9jQBqoj0+7sdH7ONEqEvDnH5Opq+eB7A/KcXklRJjFiLUk9vjmiq4EFoRyU2G4Gy1Ox+4rsDDEsjRC2QMoUrlo4FGgPNEirDtWULxOXB0JBw/78kWe9qg==",
            "1; VI1PR05MB4445;\n\t6:JDk/KmPl7i3Erp0cTnRw3R1+sSJkFaJ7ZCc9gai217W7J/BglD1UHcOmBM5wKv/sX1OjiDceT3fcUPwm5Sq2ZaqGkf6hfl4srlThacbf1KpSY0hI1zF/Ntp9aW/hsJX7SkoCsNp1MSPULU/EN0FsZ/OLRrcC7M2fLDY3CHFul6K1b0Smihz/F++1GvsfrIA40Tyld9/k9ktKt32Da/2i/GMsEj3+U/L7osvrCYgiHCYdprcrjjSq9Aw4yMaC+g2MM1DwTmkJDAKFfwUvgxKCbWESKJQ3YIKiJZdFfAnd5mVBKwCxcHB76zraSAbXdASbpHRJRYtveDyG3MqVPtQ82J1Xo/f0u8uYLYgBOd4efVMzePRPHDCJkJA04RZ/ta+gSSzN9GZQK26HyVd2ryDtpMBfW7j7bRDhPXjtwlpMfqfnK7IF7hneULp0hi1XlJiz51yvKPLNfXP7t7xvwwB3vQ==;\n\t5:aIlw9xDkABP0kWcOr3wcFhbTpSmQgoBC0LFlKKCe3DC/+knxTrTX7Majh429BPiWWfU9QS6krKx+fknUHn+SRuLZlBrF8Xnm61udINzcy1RZlgWLgknVErel27z9qDEp7RCAIFvu4F/uMP69R8dvPnsHa2kkjWpUgqOJByLX5yw=;\n\t24:E0MYykiwde2GXvSzDP7IyGx/yr+agLVxAXRZlgxYpXCcO4MrpEFDqChvVKtKOEGFTAA+sVvuiwwVWQTLOY3ETFLs6GXonT+NINSyTnqPkmQ=",
            "1; VI1PR05MB4445;\n\t7:4P8UwiEYg48Zmd79SRo4qxy/0eD6/L5FZNTSRD1Yh+XPS0hSR30hXoDcngVwNJyCUR32iSu/Rf262C5MXrczPaajr4SFW/DNtnQX/+6Vyaz/rLfS7LAaW8tQsq1TwzbkiJBr437gIr1hNDfIDyLSDkS6bm3wx8WCwjbNDJzDXy3lR38kAno9O9n0SMp9ah7gvQU0gMpjEDNFj3I+8LRx09J4fyq7Nop+o9Lg9oZYyFkJg5+qu6bzZn5WxfX6ZRaE"
        ],
        "X-MS-TrafficTypeDiagnostic": "VI1PR05MB4445:",
        "X-LD-Processed": "a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr",
        "X-Microsoft-Antispam-PRVS": "<VI1PR05MB4445D78C3F2E916672B943CFD2440@VI1PR05MB4445.eurprd05.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(8121501046)(5005006)(93006095)(93001095)(10201501046)(3002001)(3231311)(944501410)(52105095)(6055026)(149027)(150027)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123562045)(20161123564045)(20161123558120)(6072148)(201708071742011)(7699016);\n\tSRVR:VI1PR05MB4445; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB4445; ",
        "X-Forefront-PRVS": "07283408BE",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(6069001)(39850400004)(136003)(396003)(376002)(346002)(366004)(189003)(199004)(8676002)(36756003)(8936002)(97736004)(305945005)(86362001)(81166006)(81156014)(7736002)(6666003)(50226002)(5660300001)(6636002)(3846002)(53936002)(2906002)(68736007)(6486002)(4326008)(107886003)(6512007)(6116002)(25786009)(50466002)(956004)(478600001)(476003)(16586007)(47776003)(106356001)(105586002)(186003)(16526019)(386003)(6506007)(76176011)(11346002)(446003)(51416003)(48376002)(2616005)(14444005)(52116002)(66066001)(26005)(316002)(486006);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR05MB4445; H:localhost.localdomain;\n\tFPR:; \n\tSPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; ",
        "Received-SPF": "None (protection.outlook.com: mellanox.com does not designate\n\tpermitted sender hosts)",
        "X-Microsoft-Antispam-Message-Info": "yUjt5EAG5ziW8bTakEZhkRVrhIIA+zJ8//RBwqCQbiDT6Ad4j/v4flnljk5mO1DBsmanRY+0spQ8y11x76SvTYs7G9uD0P9CNDuZldACdDM/EVDIeN7GodDO8yLJwAnOii2cz9ps+GEeERw3+Chq6lh3dNbO7+2fIy+QMutNN+LfUXRQbyVc8lmzp39QaYBWo/GuGz7m55zXQFQhzEys98BYOjbAmQL/70ogFPKyth3bq382Nf2oUTL/embXUhmnXuE7Q6eXHtyEdRTIQ9BSW7YlQM3tzkwr60B0mmugqxr8BSlASsSsGF+QM/2cIb3CEkbrP+tjsnIleAehEWQ5ipcZR1Cusz6aNpKMqSKnN2s=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "Mellanox.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "09 Jul 2018 10:43:28.5074\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "3a2f453f-eddf-4cbe-9c28-08d5e588cf21",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "a652971c-7d2e-4d9b-a6a4-d149256f461b",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "VI1PR05MB4445",
        "Subject": "[dpdk-dev] [PATCH v5] net/mlx4: support hardware TSO",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Implement support for hardware TSO.\n\nSigned-off-by: Moti Haimovsky <motih@mellanox.com>\n---\nv5:\n* Modification to the code according to review inputs from Matan\n  Azrad.\n* Code optimization to the TSO header copy routine.\n* Rearranged the TSO data-segments creation routine.\nin reply to \n1530715998-15703-1-git-send-email-motih@mellanox.com\n\nv4:\n* Bug fixes in filling TSO data segments.\n* Modifications according to review inputs from Adrien Mazarguil\n  and Matan Azrad.\nin reply to\n1530190137-17848-1-git-send-email-motih@mellanox.com\n\nv3:\n* Fixed compilation errors in compilers without GNU C extensions\n  caused by a declaration of zero-length array in the code.\nin reply to\n1530187032-6489-1-git-send-email-motih@mellanox.com\n\nv2:\n* Fixed coding style warning.\nin reply to\n1530184583-30166-1-git-send-email-motih@mellanox.com\n\nv1:\n* Fixed coding style warnings.\nin reply to\n1530181779-19716-1-git-send-email-motih@mellanox.com\n---\n doc/guides/nics/features/mlx4.ini |   1 +\n doc/guides/nics/mlx4.rst          |   3 +\n drivers/net/mlx4/Makefile         |   5 +\n drivers/net/mlx4/mlx4.c           |   9 +\n drivers/net/mlx4/mlx4.h           |   5 +\n drivers/net/mlx4/mlx4_prm.h       |  15 ++\n drivers/net/mlx4/mlx4_rxtx.c      | 372 +++++++++++++++++++++++++++++++++++++-\n drivers/net/mlx4/mlx4_rxtx.h      |   2 +-\n drivers/net/mlx4/mlx4_txq.c       |   8 +-\n 9 files changed, 416 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/features/mlx4.ini b/doc/guides/nics/features/mlx4.ini\nindex f6efd21..98a3f61 100644\n--- a/doc/guides/nics/features/mlx4.ini\n+++ b/doc/guides/nics/features/mlx4.ini\n@@ -13,6 +13,7 @@ Queue start/stop     = Y\n MTU update           = Y\n Jumbo frame          = Y\n Scattered Rx         = Y\n+TSO                  = Y\n Promiscuous mode     = Y\n Allmulticast mode    = Y\n Unicast MAC filter   = Y\ndiff --git a/doc/guides/nics/mlx4.rst b/doc/guides/nics/mlx4.rst\nindex 491106a..12adaeb 100644\n--- a/doc/guides/nics/mlx4.rst\n+++ b/doc/guides/nics/mlx4.rst\n@@ -142,6 +142,9 @@ Limitations\n   The ability to enable/disable CRC stripping requires OFED version\n   4.3-1.5.0.0 and above  or rdma-core version v18 and above.\n \n+- TSO (Transmit Segmentation Offload) is supported in OFED version\n+  4.4 and above or in rdma-core version v18 and above.\n+\n Prerequisites\n -------------\n \ndiff --git a/drivers/net/mlx4/Makefile b/drivers/net/mlx4/Makefile\nindex 73f9d40..63bc003 100644\n--- a/drivers/net/mlx4/Makefile\n+++ b/drivers/net/mlx4/Makefile\n@@ -85,6 +85,11 @@ mlx4_autoconf.h.new: FORCE\n mlx4_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh\n \t$Q $(RM) -f -- '$@'\n \t$Q : > '$@'\n+\t$Q sh -- '$<' '$@' \\\n+\t\tHAVE_IBV_MLX4_WQE_LSO_SEG \\\n+\t\tinfiniband/mlx4dv.h \\\n+\t\ttype 'struct mlx4_wqe_lso_seg' \\\n+\t\t$(AUTOCONF_OUTPUT)\n \n # Create mlx4_autoconf.h or update it in case it differs from the new one.\n \ndiff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c\nindex d151a90..5d8c76d 100644\n--- a/drivers/net/mlx4/mlx4.c\n+++ b/drivers/net/mlx4/mlx4.c\n@@ -677,6 +677,15 @@ struct mlx4_conf {\n \t\t\t\t\tIBV_RAW_PACKET_CAP_SCATTER_FCS);\n \t\tDEBUG(\"FCS stripping toggling is %ssupported\",\n \t\t      priv->hw_fcs_strip ? \"\" : \"not \");\n+\t\tpriv->tso =\n+\t\t\t((device_attr_ex.tso_caps.max_tso > 0) &&\n+\t\t\t (device_attr_ex.tso_caps.supported_qpts &\n+\t\t\t  (1 << IBV_QPT_RAW_PACKET)));\n+\t\tif (priv->tso)\n+\t\t\tpriv->tso_max_payload_sz =\n+\t\t\t\t\tdevice_attr_ex.tso_caps.max_tso;\n+\t\tDEBUG(\"TSO is %ssupported\",\n+\t\t      priv->tso ? \"\" : \"not \");\n \t\t/* Configure the first MAC address by default. */\n \t\terr = mlx4_get_mac(priv, &mac.addr_bytes);\n \t\tif (err) {\ndiff --git a/drivers/net/mlx4/mlx4.h b/drivers/net/mlx4/mlx4.h\nindex 300cb4d..89d8c38 100644\n--- a/drivers/net/mlx4/mlx4.h\n+++ b/drivers/net/mlx4/mlx4.h\n@@ -47,6 +47,9 @@\n /** Interrupt alarm timeout value in microseconds. */\n #define MLX4_INTR_ALARM_TIMEOUT 100000\n \n+/* Maximum packet headers size (L2+L3+L4) for TSO. */\n+#define MLX4_MAX_TSO_HEADER 192\n+\n /** Port parameter. */\n #define MLX4_PMD_PORT_KVARG \"port\"\n \n@@ -90,6 +93,8 @@ struct priv {\n \tuint32_t hw_csum:1; /**< Checksum offload is supported. */\n \tuint32_t hw_csum_l2tun:1; /**< Checksum support for L2 tunnels. */\n \tuint32_t hw_fcs_strip:1; /**< FCS stripping toggling is supported. */\n+\tuint32_t tso:1; /**< Transmit segmentation offload is supported. */\n+\tuint32_t tso_max_payload_sz; /**< Max supported TSO payload size. */\n \tuint64_t hw_rss_sup; /**< Supported RSS hash fields (Verbs format). */\n \tstruct rte_intr_handle intr_handle; /**< Port interrupt handle. */\n \tstruct mlx4_drop *drop; /**< Shared resources for drop flow rules. */\ndiff --git a/drivers/net/mlx4/mlx4_prm.h b/drivers/net/mlx4/mlx4_prm.h\nindex b771d8c..aef77ba 100644\n--- a/drivers/net/mlx4/mlx4_prm.h\n+++ b/drivers/net/mlx4/mlx4_prm.h\n@@ -19,6 +19,7 @@\n #ifdef PEDANTIC\n #pragma GCC diagnostic error \"-Wpedantic\"\n #endif\n+#include \"mlx4_autoconf.h\"\n \n /* ConnectX-3 Tx queue basic block. */\n #define MLX4_TXBB_SHIFT 6\n@@ -40,6 +41,7 @@\n /* Work queue element (WQE) flags. */\n #define MLX4_WQE_CTRL_IIP_HDR_CSUM (1 << 28)\n #define MLX4_WQE_CTRL_IL4_HDR_CSUM (1 << 27)\n+#define MLX4_WQE_CTRL_RR (1 << 6)\n \n /* CQE checksum flags. */\n enum {\n@@ -98,6 +100,19 @@ struct mlx4_cq {\n \tint arm_sn; /**< Rx event counter. */\n };\n \n+#ifndef HAVE_IBV_MLX4_WQE_LSO_SEG\n+/*\n+ * WQE LSO segment structure.\n+ * Defined here as backward compatibility for rdma-core v17 and below.\n+ * Similar definition is found in infiniband/mlx4dv.h in rdma-core v18\n+ * and above.\n+ */\n+struct mlx4_wqe_lso_seg {\n+\trte_be32_t mss_hdr_size;\n+\trte_be32_t header[];\n+};\n+#endif\n+\n /**\n  * Retrieve a CQE entry from a CQ.\n  *\ndiff --git a/drivers/net/mlx4/mlx4_rxtx.c b/drivers/net/mlx4/mlx4_rxtx.c\nindex 78b6dd5..b695539 100644\n--- a/drivers/net/mlx4/mlx4_rxtx.c\n+++ b/drivers/net/mlx4/mlx4_rxtx.c\n@@ -38,10 +38,29 @@\n  * DWORD (32 byte) of a TXBB.\n  */\n struct pv {\n-\tvolatile struct mlx4_wqe_data_seg *dseg;\n+\tunion {\n+\t\tvolatile struct mlx4_wqe_data_seg *dseg;\n+\t\tvolatile uint32_t *dst;\n+\t};\n \tuint32_t val;\n };\n \n+/** A helper structure for TSO packet handling. */\n+struct tso_info {\n+\t/** Pointer to the array of saved first DWORD (32 byte) of a TXBB. */\n+\tstruct pv *pv;\n+\t/** Current entry in the pv array. */\n+\tint pv_counter;\n+\t/** Total size of the WQE including padding. */\n+\tuint32_t wqe_size;\n+\t/** Size of TSO header to prepend to each packet to send. */\n+\tuint16_t tso_header_size;\n+\t/** Total size of the TSO segment in the WQE. */\n+\tuint16_t wqe_tso_seg_size;\n+\t/** Raw WQE size in units of 16 Bytes and without padding. */\n+\tuint8_t fence_size;\n+};\n+\n /** A table to translate Rx completion flags to packet type. */\n uint32_t mlx4_ptype_table[0x100] __rte_cache_aligned = {\n \t/*\n@@ -368,6 +387,345 @@ struct pv {\n }\n \n /**\n+ * Obtain and calculate TSO information needed for assembling a TSO WQE.\n+ *\n+ * @param buf\n+ *   Pointer to the first packet mbuf.\n+ * @param txq\n+ *   Pointer to Tx queue structure.\n+ * @param tinfo\n+ *   Pointer to a structure to fill the info with.\n+ *\n+ * @return\n+ *   0 on success, negative value upon error.\n+ */\n+static inline int\n+mlx4_tx_burst_tso_get_params(struct rte_mbuf *buf,\n+\t\t\t     struct txq *txq,\n+\t\t\t     struct tso_info *tinfo)\n+{\n+\tstruct mlx4_sq *sq = &txq->msq;\n+\tconst uint8_t tunneled = txq->priv->hw_csum_l2tun &&\n+\t\t\t\t (buf->ol_flags & PKT_TX_TUNNEL_MASK);\n+\n+\ttinfo->tso_header_size = buf->l2_len + buf->l3_len + buf->l4_len;\n+\tif (tunneled)\n+\t\ttinfo->tso_header_size +=\n+\t\t\t\tbuf->outer_l2_len + buf->outer_l3_len;\n+\tif (unlikely(buf->tso_segsz == 0 ||\n+\t\t     tinfo->tso_header_size == 0 ||\n+\t\t     tinfo->tso_header_size > MLX4_MAX_TSO_HEADER ||\n+\t\t     tinfo->tso_header_size > buf->data_len))\n+\t\treturn -EINVAL;\n+\t/*\n+\t * Calculate the WQE TSO segment size\n+\t * Note:\n+\t * 1. An LSO segment must be padded such that the subsequent data\n+\t *    segment is 16-byte aligned.\n+\t * 2. The start address of the TSO segment is always 16 Bytes aligned.\n+\t */\n+\ttinfo->wqe_tso_seg_size = RTE_ALIGN(sizeof(struct mlx4_wqe_lso_seg) +\n+\t\t\t\t\t    tinfo->tso_header_size,\n+\t\t\t\t\t    sizeof(struct mlx4_wqe_data_seg));\n+\ttinfo->fence_size = ((sizeof(struct mlx4_wqe_ctrl_seg) +\n+\t\t\t     tinfo->wqe_tso_seg_size) >> MLX4_SEG_SHIFT) +\n+\t\t\t     buf->nb_segs;\n+\ttinfo->wqe_size =\n+\t\tRTE_ALIGN((uint32_t)(tinfo->fence_size << MLX4_SEG_SHIFT),\n+\t\t\t  MLX4_TXBB_SIZE);\n+\t/* Validate WQE size and WQE space in the send queue. */\n+\tif (sq->remain_size < tinfo->wqe_size ||\n+\t    tinfo->wqe_size > MLX4_MAX_WQE_SIZE)\n+\t\treturn -ENOMEM;\n+\t/* Init pv. */\n+\ttinfo->pv = (struct pv *)txq->bounce_buf;\n+\ttinfo->pv_counter = 0;\n+\treturn 0;\n+}\n+\n+/**\n+ * Fill the TSO WQE data segments with info on buffers to transmit .\n+ *\n+ * @param buf\n+ *   Pointer to the first packet mbuf.\n+ * @param txq\n+ *   Pointer to Tx queue structure.\n+ * @param tinfo\n+ *   Pointer to TSO info to use.\n+ * @param dseg\n+ *   Pointer to the first data segment in the TSO WQE.\n+ * @param ctrl\n+ *   Pointer to the control segment in the TSO WQE.\n+ *\n+ * @return\n+ *   0 on success, negative value upon error.\n+ */\n+static inline volatile struct mlx4_wqe_ctrl_seg *\n+mlx4_tx_burst_fill_tso_dsegs(struct rte_mbuf *buf,\n+\t\t\t     struct txq *txq,\n+\t\t\t     struct tso_info *tinfo,\n+\t\t\t     volatile struct mlx4_wqe_data_seg *dseg,\n+\t\t\t     volatile struct mlx4_wqe_ctrl_seg *ctrl)\n+{\n+\tuint32_t lkey;\n+\tint nb_segs = buf->nb_segs;\n+\tint nb_segs_txbb;\n+\tstruct mlx4_sq *sq = &txq->msq;\n+\tstruct rte_mbuf *sbuf = buf;\n+\tstruct pv *pv = tinfo->pv;\n+\tint *pv_counter = &tinfo->pv_counter;\n+\tvolatile struct mlx4_wqe_ctrl_seg *ctrl_next =\n+\t\t\t(volatile struct mlx4_wqe_ctrl_seg *)\n+\t\t\t\t((volatile uint8_t *)ctrl + tinfo->wqe_size);\n+\tuint16_t sb_of = tinfo->tso_header_size;\n+\tuint16_t data_len;\n+\n+\tdo {\n+\t\t/* how many dseg entries do we have in the current TXBB ? */\n+\t\tnb_segs_txbb = (MLX4_TXBB_SIZE -\n+\t\t\t\t((uintptr_t)dseg & (MLX4_TXBB_SIZE - 1))) >>\n+\t\t\t       MLX4_SEG_SHIFT;\n+\t\tswitch (nb_segs_txbb) {\n+\t\tdefault:\n+\t\t\t/* Should never happen. */\n+\t\t\trte_panic(\"%p: Invalid number of SGEs(%d) for a TXBB\",\n+\t\t\t(void *)txq, nb_segs_txbb);\n+\t\t\t/* rte_panic never returns. */\n+\t\tcase 4:\n+\t\t\t/* Memory region key for this memory pool. */\n+\t\t\tlkey = mlx4_tx_mb2mr(txq, sbuf);\n+\t\t\tif (unlikely(lkey == (uint32_t)-1))\n+\t\t\t\tgoto err;\n+\t\t\tdseg->addr =\n+\t\t\t    rte_cpu_to_be_64(rte_pktmbuf_mtod_offset(sbuf,\n+\t\t\t\t\t\t\t\t     uintptr_t,\n+\t\t\t\t\t\t\t\t     sb_of));\n+\t\t\tdseg->lkey = lkey;\n+\t\t\t/*\n+\t\t\t * This data segment starts at the beginning of a new\n+\t\t\t * TXBB, so we need to postpone its byte_count writing\n+\t\t\t * for later.\n+\t\t\t */\n+\t\t\tpv[*pv_counter].dseg = dseg;\n+\t\t\t/*\n+\t\t\t * Zero length segment is treated as inline segment\n+\t\t\t * with zero data.\n+\t\t\t */\n+\t\t\tdata_len = sbuf->data_len - sb_of;\n+\t\t\tpv[(*pv_counter)++].val =\n+\t\t\t\trte_cpu_to_be_32(data_len ?\n+\t\t\t\t\t\t data_len :\n+\t\t\t\t\t\t 0x80000000);\n+\t\t\tsb_of = 0;\n+\t\t\tsbuf = sbuf->next;\n+\t\t\tdseg++;\n+\t\t\tif (--nb_segs == 0)\n+\t\t\t\treturn ctrl_next;\n+\t\t\t/* fallthrough */\n+\t\tcase 3:\n+\t\t\tlkey = mlx4_tx_mb2mr(txq, sbuf);\n+\t\t\tif (unlikely(lkey == (uint32_t)-1))\n+\t\t\t\tgoto err;\n+\t\t\tdata_len = sbuf->data_len - sb_of;\n+\t\t\tmlx4_fill_tx_data_seg(dseg,\n+\t\t\t\t\tlkey,\n+\t\t\t\t\trte_pktmbuf_mtod_offset(sbuf,\n+\t\t\t\t\t\t\t\tuintptr_t,\n+\t\t\t\t\t\t\t\tsb_of),\n+\t\t\t\t\trte_cpu_to_be_32(data_len ?\n+\t\t\t\t\t\t\t data_len :\n+\t\t\t\t\t\t\t 0x80000000));\n+\t\t\tsb_of = 0;\n+\t\t\tsbuf = sbuf->next;\n+\t\t\tdseg++;\n+\t\t\tif (--nb_segs == 0)\n+\t\t\t\treturn ctrl_next;\n+\t\t\t/* fallthrough */\n+\t\tcase 2:\n+\t\t\tlkey = mlx4_tx_mb2mr(txq, sbuf);\n+\t\t\tif (unlikely(lkey == (uint32_t)-1))\n+\t\t\t\tgoto err;\n+\t\t\tdata_len = sbuf->data_len - sb_of;\n+\t\t\tmlx4_fill_tx_data_seg(dseg,\n+\t\t\t\t\tlkey,\n+\t\t\t\t\trte_pktmbuf_mtod_offset(sbuf,\n+\t\t\t\t\t\t\t\tuintptr_t,\n+\t\t\t\t\t\t\t\tsb_of),\n+\t\t\t\t\trte_cpu_to_be_32(data_len ?\n+\t\t\t\t\t\t\t data_len :\n+\t\t\t\t\t\t\t 0x80000000));\n+\t\t\tsb_of = 0;\n+\t\t\tsbuf = sbuf->next;\n+\t\t\tdseg++;\n+\t\t\tif (--nb_segs == 0)\n+\t\t\t\treturn ctrl_next;\n+\t\t\t/* fallthrough */\n+\t\tcase 1:\n+\t\t\tlkey = mlx4_tx_mb2mr(txq, sbuf);\n+\t\t\tif (unlikely(lkey == (uint32_t)-1))\n+\t\t\t\tgoto err;\n+\t\t\tdata_len = sbuf->data_len - sb_of;\n+\t\t\tmlx4_fill_tx_data_seg(dseg,\n+\t\t\t\t\tlkey,\n+\t\t\t\t\trte_pktmbuf_mtod_offset(sbuf,\n+\t\t\t\t\t\t\t\tuintptr_t,\n+\t\t\t\t\t\t\t\tsb_of),\n+\t\t\t\t\trte_cpu_to_be_32(data_len ?\n+\t\t\t\t\t\t\t data_len :\n+\t\t\t\t\t\t\t 0x80000000));\n+\t\t\tsb_of = 0;\n+\t\t\tsbuf = sbuf->next;\n+\t\t\tdseg++;\n+\t\t\tif (--nb_segs == 0)\n+\t\t\t\treturn ctrl_next;\n+\t\t}\n+\t\t/* Wrap dseg if it points at the end of the queue. */\n+\t\tif ((volatile uint8_t *)dseg >= sq->eob)\n+\t\t\tdseg = (volatile struct mlx4_wqe_data_seg *)\n+\t\t\t\t\t((volatile uint8_t *)dseg - sq->size);\n+\t} while (true);\n+err:\n+\treturn NULL;\n+}\n+\n+/**\n+ * Fill the packet's l2, l3 and l4 headers to the WQE.\n+ *\n+ * This will be used as the header for each TSO segment that is transmitted.\n+ *\n+ * @param buf\n+ *   Pointer to the first packet mbuf.\n+ * @param txq\n+ *   Pointer to Tx queue structure.\n+ * @param tinfo\n+ *   Pointer to TSO info to use.\n+ * @param ctrl\n+ *   Pointer to the control segment in the TSO WQE.\n+ *\n+ * @return\n+ *   0 on success, negative value upon error.\n+ */\n+static inline volatile struct mlx4_wqe_data_seg *\n+mlx4_tx_burst_fill_tso_hdr(struct rte_mbuf *buf,\n+\t\t\t   struct txq *txq,\n+\t\t\t   struct tso_info *tinfo,\n+\t\t\t   volatile struct mlx4_wqe_ctrl_seg *ctrl)\n+{\n+\tvolatile struct mlx4_wqe_lso_seg *tseg =\n+\t\t(volatile struct mlx4_wqe_lso_seg *)(ctrl + 1);\n+\tstruct mlx4_sq *sq = &txq->msq;\n+\tstruct pv *pv = tinfo->pv;\n+\tint *pv_counter = &tinfo->pv_counter;\n+\tint remain_size = tinfo->tso_header_size;\n+\tchar *from = rte_pktmbuf_mtod(buf, char *);\n+\tuint16_t txbb_avail_space;\n+\t/* Union to overcome volatile constraints when copying TSO header. */\n+\tunion {\n+\t\tvolatile uint8_t *vto;\n+\t\tuint8_t *to;\n+\t} thdr = { .vto = (volatile uint8_t *)tseg->header, };\n+\n+\t/*\n+\t * TSO data always starts at offset 20 from the beginning of the TXBB\n+\t * (16 byte ctrl + 4byte TSO desc). Since each TXBB is 64Byte aligned\n+\t * we can write the first 44 TSO header bytes without worry for TxQ\n+\t * wrapping or overwriting the first TXBB 32bit word.\n+\t */\n+\ttxbb_avail_space = MLX4_TXBB_SIZE -\n+\t\t\t   (sizeof(struct mlx4_wqe_ctrl_seg) +\n+\t\t\t    sizeof(struct mlx4_wqe_lso_seg));\n+\twhile (remain_size >= (int)(txbb_avail_space + sizeof(uint32_t))) {\n+\t\t/* Copy to end of txbb. */\n+\t\trte_memcpy(thdr.to, from, txbb_avail_space);\n+\t\tfrom += txbb_avail_space;\n+\t\tthdr.to += txbb_avail_space;\n+\t\t/* New TXBB, Check for TxQ wrap. */\n+\t\tif (thdr.to >= sq->eob)\n+\t\t\tthdr.vto = sq->buf;\n+\t\t/* New TXBB, stash the first 32bits for later use. */\n+\t\tpv[*pv_counter].dst = (volatile uint32_t *)thdr.to;\n+\t\tpv[(*pv_counter)++].val = *(uint32_t *)from,\n+\t\tfrom += sizeof(uint32_t);\n+\t\tthdr.to += sizeof(uint32_t);\n+\t\tremain_size -= (txbb_avail_space + sizeof(uint32_t));\n+\t\t/* Avail space in new TXBB is TXBB size - 4 */\n+\t\ttxbb_avail_space = MLX4_TXBB_SIZE - sizeof(uint32_t);\n+\t}\n+\tif (remain_size > txbb_avail_space) {\n+\t\trte_memcpy(thdr.to, from, txbb_avail_space);\n+\t\tfrom += txbb_avail_space;\n+\t\tthdr.to += txbb_avail_space;\n+\t\tremain_size -= txbb_avail_space;\n+\t\t/* New TXBB, Check for TxQ wrap. */\n+\t\tif (thdr.to >= sq->eob)\n+\t\t\tthdr.vto = sq->buf;\n+\t\tpv[*pv_counter].dst = (volatile uint32_t *)thdr.to;\n+\t\trte_memcpy(&pv[*pv_counter].val, from, remain_size);\n+\t\t(*pv_counter)++;\n+\t} else {\n+\t\trte_memcpy(thdr.to, from, remain_size);\n+\t}\n+\n+\ttseg->mss_hdr_size = rte_cpu_to_be_32((buf->tso_segsz << 16) |\n+\t\t\t\t\t      tinfo->tso_header_size);\n+\t/* Calculate data segment location */\n+\treturn (volatile struct mlx4_wqe_data_seg *)\n+\t\t\t\t((uintptr_t)tseg + tinfo->wqe_tso_seg_size);\n+}\n+\n+/**\n+ * Write data segments and header for TSO uni/multi segment packet.\n+ *\n+ * @param buf\n+ *   Pointer to the first packet mbuf.\n+ * @param txq\n+ *   Pointer to Tx queue structure.\n+ * @param ctrl\n+ *   Pointer to the WQE control segment.\n+ *\n+ * @return\n+ *   Pointer to the next WQE control segment on success, NULL otherwise.\n+ */\n+static volatile struct mlx4_wqe_ctrl_seg *\n+mlx4_tx_burst_tso(struct rte_mbuf *buf, struct txq *txq,\n+\t\t  volatile struct mlx4_wqe_ctrl_seg *ctrl)\n+{\n+\tvolatile struct mlx4_wqe_data_seg *dseg;\n+\tvolatile struct mlx4_wqe_ctrl_seg *ctrl_next;\n+\tstruct mlx4_sq *sq = &txq->msq;\n+\tstruct tso_info tinfo;\n+\tstruct pv *pv;\n+\tint pv_counter;\n+\tint ret;\n+\n+\tret = mlx4_tx_burst_tso_get_params(buf, txq, &tinfo);\n+\tif (unlikely(ret))\n+\t\tgoto error;\n+\tdseg = mlx4_tx_burst_fill_tso_hdr(buf, txq, &tinfo, ctrl);\n+\tif (unlikely(dseg == NULL))\n+\t\tgoto error;\n+\tif ((uintptr_t)dseg >= (uintptr_t)sq->eob)\n+\t\tdseg = (volatile struct mlx4_wqe_data_seg *)\n+\t\t\t\t\t((uintptr_t)dseg - sq->size);\n+\tctrl_next = mlx4_tx_burst_fill_tso_dsegs(buf, txq, &tinfo, dseg, ctrl);\n+\tif (unlikely(ctrl_next == NULL))\n+\t\tgoto error;\n+\t/* Write the first DWORD of each TXBB save earlier. */\n+\tpv = tinfo.pv;\n+\tpv_counter = tinfo.pv_counter;\n+\t/* Need a barrier here before writing the first TXBB word. */\n+\trte_io_wmb();\n+\tfor (--pv_counter; pv_counter  >= 0; pv_counter--)\n+\t\t*pv[pv_counter].dst = pv[pv_counter].val;\n+\tctrl->fence_size = tinfo.fence_size;\n+\tsq->remain_size -= tinfo.wqe_size;\n+\treturn ctrl_next;\n+error:\n+\ttxq->stats.odropped++;\n+\treturn NULL;\n+}\n+\n+/**\n  * Write data segments of multi-segment packet.\n  *\n  * @param buf\n@@ -560,6 +918,7 @@ struct pv {\n \t\t\tuint16_t flags16[2];\n \t\t} srcrb;\n \t\tuint32_t lkey;\n+\t\tbool tso = txq->priv->tso && (buf->ol_flags & PKT_TX_TCP_SEG);\n \n \t\t/* Clean up old buffer. */\n \t\tif (likely(elt->buf != NULL)) {\n@@ -578,7 +937,16 @@ struct pv {\n \t\t\t} while (tmp != NULL);\n \t\t}\n \t\tRTE_MBUF_PREFETCH_TO_FREE(elt_next->buf);\n-\t\tif (buf->nb_segs == 1) {\n+\t\tif (tso) {\n+\t\t\t/* Change opcode to TSO */\n+\t\t\towner_opcode &= ~MLX4_OPCODE_CONFIG_CMD;\n+\t\t\towner_opcode |= MLX4_OPCODE_LSO | MLX4_WQE_CTRL_RR;\n+\t\t\tctrl_next = mlx4_tx_burst_tso(buf, txq, ctrl);\n+\t\t\tif (!ctrl_next) {\n+\t\t\t\telt->buf = NULL;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t} else if (buf->nb_segs == 1) {\n \t\t\t/* Validate WQE space in the send queue. */\n \t\t\tif (sq->remain_size < MLX4_TXBB_SIZE) {\n \t\t\t\telt->buf = NULL;\ndiff --git a/drivers/net/mlx4/mlx4_rxtx.h b/drivers/net/mlx4/mlx4_rxtx.h\nindex 4c025e3..ffa8abf 100644\n--- a/drivers/net/mlx4/mlx4_rxtx.h\n+++ b/drivers/net/mlx4/mlx4_rxtx.h\n@@ -90,7 +90,7 @@ struct mlx4_txq_stats {\n \tunsigned int idx; /**< Mapping index. */\n \tuint64_t opackets; /**< Total of successfully sent packets. */\n \tuint64_t obytes; /**< Total of successfully sent bytes. */\n-\tuint64_t odropped; /**< Total of packets not sent when Tx ring full. */\n+\tuint64_t odropped; /**< Total number of packets failed to transmit. */\n };\n \n /** Tx queue descriptor. */\ndiff --git a/drivers/net/mlx4/mlx4_txq.c b/drivers/net/mlx4/mlx4_txq.c\nindex 6edaadb..9aa7440 100644\n--- a/drivers/net/mlx4/mlx4_txq.c\n+++ b/drivers/net/mlx4/mlx4_txq.c\n@@ -116,8 +116,14 @@\n \t\t\t     DEV_TX_OFFLOAD_UDP_CKSUM |\n \t\t\t     DEV_TX_OFFLOAD_TCP_CKSUM);\n \t}\n-\tif (priv->hw_csum_l2tun)\n+\tif (priv->tso)\n+\t\toffloads |= DEV_TX_OFFLOAD_TCP_TSO;\n+\tif (priv->hw_csum_l2tun) {\n \t\toffloads |= DEV_TX_OFFLOAD_OUTER_IPV4_CKSUM;\n+\t\tif (priv->tso)\n+\t\t\toffloads |= (DEV_TX_OFFLOAD_VXLAN_TNL_TSO |\n+\t\t\t\t     DEV_TX_OFFLOAD_GRE_TNL_TSO);\n+\t}\n \treturn offloads;\n }\n \n",
    "prefixes": [
        "v5"
    ]
}