get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 21117,
    "url": "http://patches.dpdk.org/api/patches/21117/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1488454371-3342-35-git-send-email-shijith.thotton@caviumnetworks.com/",
    "project": {
        "id": 1,
        "url": "http://patches.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": "<1488454371-3342-35-git-send-email-shijith.thotton@caviumnetworks.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1488454371-3342-35-git-send-email-shijith.thotton@caviumnetworks.com",
    "date": "2017-03-02T11:32:39",
    "name": "[dpdk-dev,v2,34/46] net/liquidio: add RSS support",
    "commit_ref": null,
    "pull_url": null,
    "state": "changes-requested",
    "archived": true,
    "hash": "4314037d685790ae19991a1fbc1394be57f73a73",
    "submitter": {
        "id": 677,
        "url": "http://patches.dpdk.org/api/people/677/?format=api",
        "name": "Shijith Thotton",
        "email": "shijith.thotton@caviumnetworks.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1488454371-3342-35-git-send-email-shijith.thotton@caviumnetworks.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/21117/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/21117/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 [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id C3DA3FAB8;\n\tThu,  2 Mar 2017 12:39:46 +0100 (CET)",
            "from NAM03-BY2-obe.outbound.protection.outlook.com\n\t(mail-by2nam03on0050.outbound.protection.outlook.com [104.47.42.50])\n\tby dpdk.org (Postfix) with ESMTP id A3C23FA46\n\tfor <dev@dpdk.org>; Thu,  2 Mar 2017 12:39:43 +0100 (CET)",
            "from lio357.in.caveonetworks.com (14.140.2.178) by\n\tCY1PR07MB2277.namprd07.prod.outlook.com (10.164.112.155) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id\n\t15.1.947.12; Thu, 2 Mar 2017 11:39:40 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version;\n\tbh=EnsNWu+NfhdITiNeKapcIr5i2mJu1IjIyyJ2ujPatIk=;\n\tb=JiA6Z3NnEF8vf32JZXqXxb3iPo/ivm1SpB4S0SbWF7RzcZWsj2R1dPdnHPLRzrHTHqk/IYAR40Z8M8BwKk4DAGJwuHDKLy0ziJM00qI1taPhiLEw4ppPlIvLnTDeulRAELMOE214BcRMYiyYEuSuvCVaHAziR7YpjzN2WaYuzYs=",
        "Authentication-Results": "intel.com; dkim=none (message not signed)\n\theader.d=none;intel.com; dmarc=none action=none\n\theader.from=caviumnetworks.com;",
        "From": "Shijith Thotton <shijith.thotton@caviumnetworks.com>",
        "To": "ferruh.yigit@intel.com",
        "Cc": "dev@dpdk.org, Jerin Jacob <jerin.jacob@caviumnetworks.com>,\n\tDerek Chickles <derek.chickles@caviumnetworks.com>,\n\tVenkat Koppula <venkat.koppula@caviumnetworks.com>,\n\tSrisivasubramanian S <ssrinivasan@caviumnetworks.com>,\n\tMallesham Jatharakonda <mjatharakonda@oneconvergence.com>",
        "Date": "Thu,  2 Mar 2017 17:02:39 +0530",
        "Message-Id": "<1488454371-3342-35-git-send-email-shijith.thotton@caviumnetworks.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1488454371-3342-1-git-send-email-shijith.thotton@caviumnetworks.com>",
        "References": "<1487669225-30091-1-git-send-email-shijith.thotton@caviumnetworks.com>\n\t<1488454371-3342-1-git-send-email-shijith.thotton@caviumnetworks.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[14.140.2.178]",
        "X-ClientProxiedBy": "BM1PR01CA0021.INDPRD01.PROD.OUTLOOK.COM (10.163.198.156)\n\tTo\n\tCY1PR07MB2277.namprd07.prod.outlook.com (10.164.112.155)",
        "X-MS-Office365-Filtering-Correlation-Id": "4e91e3d5-f173-4b27-a453-08d46160d1a5",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0; RULEID:(22001);\n\tSRVR:CY1PR07MB2277; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; CY1PR07MB2277;\n\t3:fQ5uKWhawxulCmzVX2DuoDn9QTLZPrn+T/yPzik5AQPUkeHn8DRuqzuzh9vEGO7e7WFelTYC0fkVCVpetgSa9QsfWb8j1JD/Y9gRLHaKe04keJSd8Y2Qw7C2XsAEo5YvMS/rcwCH3fhLkp4zD0JQecL3GP3jI7h7gVAGrSe33jWoHkvlCs0/0PDLJDheMehXFbAcnm8GAa8uO4WatlAu9ggKZG9wQS4+9rzVT6qeHnY/V3r7purfbfpxlUmIpoyJgd9dMc1b+gWPTN4gXYYW3w==;\n\t25:9J+ufysydgxyQF8NslTK2hAd4YBMA4Wk+H8dWBXsw9ktO+BWa1Msi/VI93rP43oEdWRwjR1THX15XeZRMQAZJetnXSR7w/ypw6iVhZ3jr2EJsGSv4+ui1seO3YW3aaf/hKU4YcSXnPlbkMvQp6KVm+1e31UVbIqiGZkVX1e3/RZBnvqeJAqp3OkVF7mBWacOgcKL3+1ORQWj88bJWOSH33wY9sp7Lc9AAABLGiwkITD6xfik+IW/K26tWJJVOfID00WYju2vsLdV7UZUK0kcxJRnRRunhrhsiEdnZ86X+kAewKdvj/8WJSUW3jlv5ShtyGnJ7VTWFXGdqwNZV63ZZxSdTjBGM2t4fvd37UCOALjwmjOiYFUA8Vl0SysEJxPLLqyQTEslJ1on6hJxxjKGYi4MV7MONTApcOXKN+9l/C48+g1ey+EWKNqHKXSfccDpHAgJJeSlht/OWvVORuNwgg==",
            "1; CY1PR07MB2277;\n\t31:SB6NLR2OUCuoVDAfhcZ8vCFh+TDHtmpnLYEchRGNrDzjQD/ZxvHMARjK1z+TEYhp6ZsmwOeTzCk+O5RLikFHtmgkkdEoI+4r54GOk7u1/+7X6+NaaRd9vaqcMXQKB/ZhURSt46pnlDHsDh1taXi3qwQHtm32UNVzoNRlH6iCEIssMd1XW/JqDjSk7/HwyAWtsOxpetOS8iZ+nBstNPgDT8m3L+GgGlB42BZCybxGmDlo4FXzgEaqP1HQGgxTxjw+;\n\t20:qjCeoOz1oyYzfb2TZMibo/gL94PIZ4KyK2YuZEcJrCWUGLEBav/RaAsrCBYp86DDzIHOVbdmz1pX9xcJZCcF3H/m071Y7azdV+/MVhi6nfBLPEKUidpENiUuD/IHlxkaRUKmXlNpFGWF1+lXqfpqozHFo8Jzo5UoP8OkUZBhZyCSd0J3CrJ/z8aslnMz2U/ioOPxQr2kPrmIdNb+dtCxesAWLqTpzb/qUCCkxxnf9enFAF9Tm42zW1/2HPHbhSttEX2wvJd/RA2d/MJkrPBkJwoTYYgQqOoHwLoy4H7kyhulW+kF7+LSY1ZziUpDyNtjq8YxGMri13krSjA6JYnYMNbblxcQPz8O/gQrYe6bvXWXj2L8wdvjNswFgK7/E8Eoz9vEdGXVQvxrKJ05QPxk2rB573C+VsANnBkHXbQ+X0cwBBm/pkRD4/jjbFiQObEgINFKtY4pGqMx3DcXfm4ZS3FRhQtI3XaEeWt+ei5CpxOLkFbNOmh05cKZIreqOcUsmpAtHZriY+GiY9o8MxNxffhCCb3G97g+FVsDR/hk8n3L3nes1OsB3sSoNlyUp1cma3FtVW5M9GvAsqTOayG9AsKRySXbWx1gO/gZwIR3cmY=",
            "1; CY1PR07MB2277;\n\t4:gXJfbHI27nUcoRwfZIwSpGyDxHDhx1p1a0/9wMoRVlHMvdCW2PLhgMizmjFPCKLC0oIQ7aY3WO7/NLk7A51ZgQuXsH8uj/i5GzNOsABcv9ybVCUVvG3VA0Q1BorLH7UJlhOyaiWpwX5+4FXR9TcBkUnwK1WNUEFqiGifLv9MzhtdWES6xBqP+WxtE+64Dt/m+uhwuW361LamR2zPC9a+2PlfM3t7C7PQ6aGHbrt9rAJJP7nD5TwWA19Mo3YEGwla7TSBxtWNDdQNg/HxCPyyxGggIucTTPW3b7CZDwfQqAHIsuakGzFkSOeqrq3KJkbZDb7XGc9DdSsy1nm4eGN7BdCwGhpXCQs9GIZeB0CahkKSJ1oMY5cOLihQtIVlAcJLPR2XL5GBkE9yW3SaLVLWfeR801DsYENTGlgZNjk8CKArY1CsTUEZxvjgBtRY2GBMaAHfyh00UpPAc/0XdhQ293Smf2LIqM7eT28Nec9HICGMkSsPdsXffCgMROh4LXh98VzX+MV6n3/UuM13EpoeMqO2QUWLKPP2fbK4pdw5FbBlPmksKpJAMNM/04+ugnH29QSPhq2LP789DYC6HFPoMtHPhpzcp5dncvJT1vD/cbtoOiUn1bxLNVMIsy9Z5oD9",
            "=?us-ascii?Q?1; CY1PR07MB2277;\n\t23:k/AY//z+JMOcO9Z8mT9G7/UYl1HLkiS5f0oz0pyBQ?=\n\tlTCS2C+9h0+YHLumlxFwFIFtwF/ch5yECY32AuqqYuI/rcDInCrfoLlR7QqgmIZXhuKyKQ2loxWdEzSYmUz4n0Mv9ULGISLGpzTFxIYVWXSDKSQyMlKvcAYW/0xWixLGieRe7GgXKwIsSE7B5PZSMj05c77bmpu2lfwcApdDAnWAJpO9WiB7VqIrkxphlYHuiqMn/ugSxQCuoIuCiY+HicLvr4UAI52OV8Ysa3h8A7eO50RrlvDdnr3NMcA1y8fmv62eoUPe5dBoq+vaZIk01vAAr3hE4RsUEQ+ZC3y/MqCrZEyPreCRHHeBIgWaAP5R9LDKaBouAdg+36pjwTX2odB5kVZNwh0+VlREk3/lgK5gNbQ0ksiaL4XiKDMpwI+HXq2ZbJwGdzkAh0eHaZPcThQqTloQuHcf8A1jZmo6GAEHogSPjX6EwGFa6bJZA83nRQWX3FhR6bBZg7+p9D0o5xpGwd76wMUIx0TOqDyKsaVQ4kmmH3fOqW9YGSGnDBgZbC7uZ17YtOeJ1UeIoVljr3zqxRbAKq4HOMBGyl6Ulhs26FbhJOcvQxS5wD2ImAXJ6uuAF0F2UwBUjblhEqjLl/lNnSzbBlllQ3MALWkFWAIG9fzJkTaHtf61dB7YU5fm/a97/dBeeF7qeovqLMC66SJ+nDW6kJ23ue4GZxpwqzTy+UBDAOeAyl4Uw975L+VqryhRqGmo8RL4zjOs2j5LteqqErbMczQvA3BGKhp4TmsidTdGRokHoy5R41QJq2QDO2uQNRblK4u0XQw3qTv4MEEMeSsrRZ/Ib+e+uiOkQ/luOAj+qf6x8kbNwWUVwcKFj5mWIV3D53RkKohnR+X2q6PnYtbNXuVFlkrzC5hSy6iic9g6wAEeXko5ZqmVPSzCd2Jmvuwmrd7Aie/o7UkH/EyqOjsLFlKZzCeps5drAUfrorS4qWpILbX6QswVuRSLkdTlDi2A79PXoVjgS2YcOMzvKNIoIl/T+tO/3k71f0+PdHFjjpGmkEP1KYzGerCIoJ2ahUXQrGDKuOMehn+yqMN",
            "1; CY1PR07MB2277;\n\t6:qP+tCQ2P8uOK2jwDj3sRJx4eAxbNWUCHVZ5yFJsD54kdXhnuJtskgL1L8l6PendmYnNm+hDmwB6C117whDaMy0Taei2sd+s4AbW/dZEcKrrAeCsWKiNDl3VQtD2/Kjkn7vFSzn+M62HXynosVIvBSIf7rymTD7O6b1ds0f6m1KO++WOdpCO2LpPdwyBWCOMDBC/6K1VgQmET4Y5ehp5eRCimmCByyXYo4xeOM2Wyu6mNobhxPP4QhzmwzIkmSmXR4ynuNQ73bug/E8VlGu9+dZzkp38gZJFKW5gjdIKqiefu1cwZZfIODsBKohYQ2X5+3YlVuHbOo0J70GQPARjtWvqNaACdx/OBHlBKgD2jfYRw+mcHmBcsstBJEU25/5mreEbWwj68WpdFIOSzfzXn2Q==;\n\t5:vVBc3KdSkrOzuC17C6kBhGuTL3oHi7PhAM6HFjQ03CwAutlwLzc0zj63/0Lzr0BSvh0ktuSNxUB+4DFaJsiNYoIH9y+ofm/hF68k5xidsI+LRsoD9tLs5FSOwebQFt+32bn2TAXITf7wnLgvq8yHig==;\n\t24:LtsrrDuU368sjQM4cgpkpV4HgqsHFxhZXOJNHq5L/kEG94H4gkBNLRj7t+TrKJ7AxWfUJD/VoV3Swz1Z/UX5wXXcSetEM/pW3iWb1z1PV6A=",
            "1; CY1PR07MB2277;\n\t7:kbTabYUxij7aMpDzGYVumfs3SVsqf3PUbsacUM0GFKVlWtC9vdSUpIfqqFQp3VkK+DBzBhNRCMSs79ydB9TOu/C8IW499jQOa2GEwBSAX+e/GG8/CfRwK1E5ZiQemq8ihqsq1ACHbbtpRQF2D3Wz9v4d+mJeMXIGaZFCCwWWr7qzlQUQAJnQ1uj8pmzqCsoKa31ttT4rkj+GHddqlQPVZPCg1UivStEP+mTicQbVnXYUD6CYtZ3oPrzdJFFGe0raBIJuFEPqAZBcevzGyBwFJpm5eLfhczFR+/0ttreU9vCdixZ+Zv5PWmsmlrcqT3ldNDm9yDGCKTgiIZ35gLYZDQ=="
        ],
        "X-Microsoft-Antispam-PRVS": "<CY1PR07MB2277053672D995968054D65D81280@CY1PR07MB2277.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(6040375)(601004)(2401047)(5005006)(8121501046)(10201501046)(3002001)(6041248)(20161123558025)(20161123555025)(20161123560025)(20161123564025)(20161123562025)(6072148)(6042181);\n\tSRVR:CY1PR07MB2277; BCL:0; PCL:0; RULEID:; SRVR:CY1PR07MB2277; ",
        "X-Forefront-PRVS": "023495660C",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(4630300001)(6009001)(7916002)(2950100002)(6916009)(42882006)(575784001)(5660300001)(92566002)(4720700003)(33646002)(48376002)(50226002)(2906002)(5003940100001)(36756003)(8676002)(50466002)(81166006)(110136004)(38730400002)(4326008)(305945005)(2361001)(53936002)(2351001)(25786008)(6512007)(189998001)(54906002)(47776003)(6506006)(6486002)(66066001)(6116002)(3846002)(50986999)(76176999)(5009440100003)(42186005)(7736002)(7099028)(110426004);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR07MB2277;\n\tH:lio357.in.caveonetworks.com; \n\tFPR:; SPF:None; MLV:nov; PTR:InfoNoRecords; LANG:en; ",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "caviumnetworks.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "02 Mar 2017 11:39:40.2661\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY1PR07MB2277",
        "Subject": "[dpdk-dev] [PATCH v2 34/46] net/liquidio: add RSS support",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Signed-off-by: Shijith Thotton <shijith.thotton@caviumnetworks.com>\nSigned-off-by: Jerin Jacob <jerin.jacob@caviumnetworks.com>\nSigned-off-by: Derek Chickles <derek.chickles@caviumnetworks.com>\nSigned-off-by: Venkat Koppula <venkat.koppula@caviumnetworks.com>\nSigned-off-by: Srisivasubramanian S <ssrinivasan@caviumnetworks.com>\nSigned-off-by: Mallesham Jatharakonda <mjatharakonda@oneconvergence.com>\n---\n drivers/net/liquidio/base/lio_hw_defs.h |  26 +++\n drivers/net/liquidio/lio_ethdev.c       | 336 ++++++++++++++++++++++++++++++++\n drivers/net/liquidio/lio_ethdev.h       |  21 ++\n drivers/net/liquidio/lio_struct.h       |  16 ++\n 4 files changed, 399 insertions(+)",
    "diff": "diff --git a/drivers/net/liquidio/base/lio_hw_defs.h b/drivers/net/liquidio/base/lio_hw_defs.h\nindex 59668c0..8272162 100644\n--- a/drivers/net/liquidio/base/lio_hw_defs.h\n+++ b/drivers/net/liquidio/base/lio_hw_defs.h\n@@ -130,12 +130,38 @@ enum octeon_tag_type {\n \n /* NIC Command types */\n #define LIO_CMD_RX_CTL\t\t\t0x4\n+#define LIO_CMD_SET_RSS\t\t\t0xD\n \n /* RX(packets coming from wire) Checksum verification flags */\n /* TCP/UDP csum */\n #define LIO_L4_CSUM_VERIFIED\t\t0x1\n #define LIO_IP_CSUM_VERIFIED\t\t0x2\n \n+/* RSS */\n+#define LIO_RSS_PARAM_DISABLE_RSS\t\t0x10\n+#define LIO_RSS_PARAM_HASH_KEY_UNCHANGED\t0x08\n+#define LIO_RSS_PARAM_ITABLE_UNCHANGED\t\t0x04\n+#define LIO_RSS_PARAM_HASH_INFO_UNCHANGED\t0x02\n+\n+#define LIO_RSS_HASH_IPV4\t\t\t0x100\n+#define LIO_RSS_HASH_TCP_IPV4\t\t\t0x200\n+#define LIO_RSS_HASH_IPV6\t\t\t0x400\n+#define LIO_RSS_HASH_TCP_IPV6\t\t\t0x1000\n+#define LIO_RSS_HASH_IPV6_EX\t\t\t0x800\n+#define LIO_RSS_HASH_TCP_IPV6_EX\t\t0x2000\n+\n+#define LIO_RSS_OFFLOAD_ALL (\t\t\\\n+\t\tLIO_RSS_HASH_IPV4 |\t\\\n+\t\tLIO_RSS_HASH_TCP_IPV4 |\t\\\n+\t\tLIO_RSS_HASH_IPV6 |\t\\\n+\t\tLIO_RSS_HASH_TCP_IPV6 |\t\\\n+\t\tLIO_RSS_HASH_IPV6_EX |\t\\\n+\t\tLIO_RSS_HASH_TCP_IPV6_EX)\n+\n+#define LIO_RSS_MAX_TABLE_SZ\t\t128\n+#define LIO_RSS_MAX_KEY_SZ\t\t40\n+#define LIO_RSS_PARAM_SIZE\t\t16\n+\n /* Interface flags communicated between host driver and core app. */\n enum lio_ifflags {\n \tLIO_IFFLAG_UNICAST\t= 0x10\ndiff --git a/drivers/net/liquidio/lio_ethdev.c b/drivers/net/liquidio/lio_ethdev.c\nindex c698c70..58a932e 100644\n--- a/drivers/net/liquidio/lio_ethdev.c\n+++ b/drivers/net/liquidio/lio_ethdev.c\n@@ -41,6 +41,15 @@\n #include \"lio_ethdev.h\"\n #include \"lio_rxtx.h\"\n \n+/* Default RSS key in use */\n+static uint8_t lio_rss_key[40] = {\n+\t0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,\n+\t0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,\n+\t0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,\n+\t0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,\n+\t0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA,\n+};\n+\n /* Wait for control command to reach nic. */\n static uint16_t\n lio_wait_for_ctrl_cmd(struct lio_device *lio_dev,\n@@ -96,6 +105,267 @@\n \treturn 0;\n }\n \n+static int\n+lio_dev_rss_reta_update(struct rte_eth_dev *eth_dev,\n+\t\t\tstruct rte_eth_rss_reta_entry64 *reta_conf,\n+\t\t\tuint16_t reta_size)\n+{\n+\tstruct lio_device *lio_dev = LIO_DEV(eth_dev);\n+\tstruct lio_rss_ctx *rss_state = &lio_dev->rss_state;\n+\tstruct lio_rss_set *rss_param;\n+\tstruct lio_dev_ctrl_cmd ctrl_cmd;\n+\tstruct lio_ctrl_pkt ctrl_pkt;\n+\tint i, j, index;\n+\n+\tif (!lio_dev->intf_open) {\n+\t\tlio_dev_err(lio_dev, \"Port %d down, can't update reta\\n\",\n+\t\t\t    lio_dev->port_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (reta_size != LIO_RSS_MAX_TABLE_SZ) {\n+\t\tlio_dev_err(lio_dev,\n+\t\t\t    \"The size of hash lookup table configured (%d) doesn't match the number hardware can supported (%d)\\n\",\n+\t\t\t    reta_size, LIO_RSS_MAX_TABLE_SZ);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* flush added to prevent cmd failure\n+\t * incase the queue is full\n+\t */\n+\tlio_flush_iq(lio_dev, lio_dev->instr_queue[0]);\n+\n+\tmemset(&ctrl_pkt, 0, sizeof(struct lio_ctrl_pkt));\n+\tmemset(&ctrl_cmd, 0, sizeof(struct lio_dev_ctrl_cmd));\n+\n+\trss_param = (struct lio_rss_set *)&ctrl_pkt.udd[0];\n+\n+\tctrl_cmd.eth_dev = eth_dev;\n+\tctrl_cmd.cond = 0;\n+\n+\tctrl_pkt.ncmd.s.cmd = LIO_CMD_SET_RSS;\n+\tctrl_pkt.ncmd.s.more = sizeof(struct lio_rss_set) >> 3;\n+\tctrl_pkt.ctrl_cmd = &ctrl_cmd;\n+\n+\trss_param->param.flags = 0xF;\n+\trss_param->param.flags &= ~LIO_RSS_PARAM_ITABLE_UNCHANGED;\n+\trss_param->param.itablesize = LIO_RSS_MAX_TABLE_SZ;\n+\n+\tfor (i = 0; i < (reta_size / RTE_RETA_GROUP_SIZE); i++) {\n+\t\tfor (j = 0; j < RTE_RETA_GROUP_SIZE; j++) {\n+\t\t\tif ((reta_conf[i].mask) & ((uint64_t)1 << j)) {\n+\t\t\t\tindex = (i * RTE_RETA_GROUP_SIZE) + j;\n+\t\t\t\trss_state->itable[index] = reta_conf[i].reta[j];\n+\t\t\t}\n+\t\t}\n+\t}\n+\n+\trss_state->itable_size = LIO_RSS_MAX_TABLE_SZ;\n+\tmemcpy(rss_param->itable, rss_state->itable, rss_state->itable_size);\n+\n+\tlio_swap_8B_data((uint64_t *)rss_param, LIO_RSS_PARAM_SIZE >> 3);\n+\n+\tif (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) {\n+\t\tlio_dev_err(lio_dev, \"Failed to set rss hash\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) {\n+\t\tlio_dev_err(lio_dev, \"Set rss hash timed out\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+lio_dev_rss_reta_query(struct rte_eth_dev *eth_dev,\n+\t\t       struct rte_eth_rss_reta_entry64 *reta_conf,\n+\t\t       uint16_t reta_size)\n+{\n+\tstruct lio_device *lio_dev = LIO_DEV(eth_dev);\n+\tstruct lio_rss_ctx *rss_state = &lio_dev->rss_state;\n+\tint i, num;\n+\n+\tif (reta_size != LIO_RSS_MAX_TABLE_SZ) {\n+\t\tlio_dev_err(lio_dev,\n+\t\t\t    \"The size of hash lookup table configured (%d) doesn't match the number hardware can supported (%d)\\n\",\n+\t\t\t    reta_size, LIO_RSS_MAX_TABLE_SZ);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tnum = reta_size / RTE_RETA_GROUP_SIZE;\n+\n+\tfor (i = 0; i < num; i++) {\n+\t\tmemcpy(reta_conf->reta,\n+\t\t       &rss_state->itable[i * RTE_RETA_GROUP_SIZE],\n+\t\t       RTE_RETA_GROUP_SIZE);\n+\t\treta_conf++;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+lio_dev_rss_hash_conf_get(struct rte_eth_dev *eth_dev,\n+\t\t\t  struct rte_eth_rss_conf *rss_conf)\n+{\n+\tstruct lio_device *lio_dev = LIO_DEV(eth_dev);\n+\tstruct lio_rss_ctx *rss_state = &lio_dev->rss_state;\n+\tuint8_t *hash_key = NULL;\n+\tuint64_t rss_hf = 0;\n+\n+\tif (rss_state->hash_disable) {\n+\t\tlio_dev_info(lio_dev, \"RSS disabled in nic\\n\");\n+\t\trss_conf->rss_hf = 0;\n+\t\treturn 0;\n+\t}\n+\n+\t/* Get key value */\n+\thash_key = rss_conf->rss_key;\n+\tif (hash_key != NULL)\n+\t\tmemcpy(hash_key, rss_state->hash_key, rss_state->hash_key_size);\n+\n+\tif (rss_state->ip)\n+\t\trss_hf |= ETH_RSS_IPV4;\n+\tif (rss_state->tcp_hash)\n+\t\trss_hf |= ETH_RSS_NONFRAG_IPV4_TCP;\n+\tif (rss_state->ipv6)\n+\t\trss_hf |= ETH_RSS_IPV6;\n+\tif (rss_state->ipv6_tcp_hash)\n+\t\trss_hf |= ETH_RSS_NONFRAG_IPV6_TCP;\n+\tif (rss_state->ipv6_ex)\n+\t\trss_hf |= ETH_RSS_IPV6_EX;\n+\tif (rss_state->ipv6_tcp_ex_hash)\n+\t\trss_hf |= ETH_RSS_IPV6_TCP_EX;\n+\n+\trss_conf->rss_hf = rss_hf;\n+\n+\treturn 0;\n+}\n+\n+static int\n+lio_dev_rss_hash_update(struct rte_eth_dev *eth_dev,\n+\t\t\tstruct rte_eth_rss_conf *rss_conf)\n+{\n+\tstruct lio_device *lio_dev = LIO_DEV(eth_dev);\n+\tstruct lio_rss_ctx *rss_state = &lio_dev->rss_state;\n+\tstruct lio_rss_set *rss_param;\n+\tstruct lio_dev_ctrl_cmd ctrl_cmd;\n+\tstruct lio_ctrl_pkt ctrl_pkt;\n+\n+\tif (!lio_dev->intf_open) {\n+\t\tlio_dev_err(lio_dev, \"Port %d down, can't update hash\\n\",\n+\t\t\t    lio_dev->port_id);\n+\t\treturn -EINVAL;\n+\t}\n+\n+\t/* flush added to prevent cmd failure\n+\t * incase the queue is full\n+\t */\n+\tlio_flush_iq(lio_dev, lio_dev->instr_queue[0]);\n+\n+\tmemset(&ctrl_pkt, 0, sizeof(struct lio_ctrl_pkt));\n+\tmemset(&ctrl_cmd, 0, sizeof(struct lio_dev_ctrl_cmd));\n+\n+\trss_param = (struct lio_rss_set *)&ctrl_pkt.udd[0];\n+\n+\tctrl_cmd.eth_dev = eth_dev;\n+\tctrl_cmd.cond = 0;\n+\n+\tctrl_pkt.ncmd.s.cmd = LIO_CMD_SET_RSS;\n+\tctrl_pkt.ncmd.s.more = sizeof(struct lio_rss_set) >> 3;\n+\tctrl_pkt.ctrl_cmd = &ctrl_cmd;\n+\n+\trss_param->param.flags = 0xF;\n+\n+\tif (rss_conf->rss_key) {\n+\t\trss_param->param.flags &= ~LIO_RSS_PARAM_HASH_KEY_UNCHANGED;\n+\t\trss_state->hash_key_size = LIO_RSS_MAX_KEY_SZ;\n+\t\trss_param->param.hashkeysize = LIO_RSS_MAX_KEY_SZ;\n+\t\tmemcpy(rss_state->hash_key, rss_conf->rss_key,\n+\t\t       rss_state->hash_key_size);\n+\t\tmemcpy(rss_param->key, rss_state->hash_key,\n+\t\t       rss_state->hash_key_size);\n+\t}\n+\n+\tif ((rss_conf->rss_hf & LIO_RSS_OFFLOAD_ALL) == 0) {\n+\t\t/* Can't disable rss through hash flags,\n+\t\t * if it is enabled by default during init\n+\t\t */\n+\t\tif (!rss_state->hash_disable)\n+\t\t\treturn -EINVAL;\n+\n+\t\t/* This is for --disable-rss during testpmd launch */\n+\t\trss_param->param.flags |= LIO_RSS_PARAM_DISABLE_RSS;\n+\t} else {\n+\t\tuint32_t hashinfo = 0;\n+\n+\t\t/* Can't enable rss if disabled by default during init */\n+\t\tif (rss_state->hash_disable)\n+\t\t\treturn -EINVAL;\n+\n+\t\tif (rss_conf->rss_hf & ETH_RSS_IPV4) {\n+\t\t\thashinfo |= LIO_RSS_HASH_IPV4;\n+\t\t\trss_state->ip = 1;\n+\t\t} else {\n+\t\t\trss_state->ip = 0;\n+\t\t}\n+\n+\t\tif (rss_conf->rss_hf & ETH_RSS_NONFRAG_IPV4_TCP) {\n+\t\t\thashinfo |= LIO_RSS_HASH_TCP_IPV4;\n+\t\t\trss_state->tcp_hash = 1;\n+\t\t} else {\n+\t\t\trss_state->tcp_hash = 0;\n+\t\t}\n+\n+\t\tif (rss_conf->rss_hf & ETH_RSS_IPV6) {\n+\t\t\thashinfo |= LIO_RSS_HASH_IPV6;\n+\t\t\trss_state->ipv6 = 1;\n+\t\t} else {\n+\t\t\trss_state->ipv6 = 0;\n+\t\t}\n+\n+\t\tif (rss_conf->rss_hf & ETH_RSS_NONFRAG_IPV6_TCP) {\n+\t\t\thashinfo |= LIO_RSS_HASH_TCP_IPV6;\n+\t\t\trss_state->ipv6_tcp_hash = 1;\n+\t\t} else {\n+\t\t\trss_state->ipv6_tcp_hash = 0;\n+\t\t}\n+\n+\t\tif (rss_conf->rss_hf & ETH_RSS_IPV6_EX) {\n+\t\t\thashinfo |= LIO_RSS_HASH_IPV6_EX;\n+\t\t\trss_state->ipv6_ex = 1;\n+\t\t} else {\n+\t\t\trss_state->ipv6_ex = 0;\n+\t\t}\n+\n+\t\tif (rss_conf->rss_hf & ETH_RSS_IPV6_TCP_EX) {\n+\t\t\thashinfo |= LIO_RSS_HASH_TCP_IPV6_EX;\n+\t\t\trss_state->ipv6_tcp_ex_hash = 1;\n+\t\t} else {\n+\t\t\trss_state->ipv6_tcp_ex_hash = 0;\n+\t\t}\n+\n+\t\trss_param->param.flags &= ~LIO_RSS_PARAM_HASH_INFO_UNCHANGED;\n+\t\trss_param->param.hashinfo = hashinfo;\n+\t}\n+\n+\tlio_swap_8B_data((uint64_t *)rss_param, LIO_RSS_PARAM_SIZE >> 3);\n+\n+\tif (lio_send_ctrl_pkt(lio_dev, &ctrl_pkt)) {\n+\t\tlio_dev_err(lio_dev, \"Failed to set rss hash\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\tif (lio_wait_for_ctrl_cmd(lio_dev, &ctrl_cmd)) {\n+\t\tlio_dev_err(lio_dev, \"Set rss hash timed out\\n\");\n+\t\treturn -1;\n+\t}\n+\n+\treturn 0;\n+}\n+\n /**\n  * Atomically writes the link status information into global\n  * structure rte_eth_dev.\n@@ -179,6 +449,65 @@\n \treturn 0;\n }\n \n+static void\n+lio_dev_rss_configure(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct lio_device *lio_dev = LIO_DEV(eth_dev);\n+\tstruct lio_rss_ctx *rss_state = &lio_dev->rss_state;\n+\tstruct rte_eth_rss_reta_entry64 reta_conf[8];\n+\tstruct rte_eth_rss_conf rss_conf;\n+\tuint16_t i;\n+\n+\t/* Configure the RSS key and the RSS protocols used to compute\n+\t * the RSS hash of input packets.\n+\t */\n+\trss_conf = eth_dev->data->dev_conf.rx_adv_conf.rss_conf;\n+\tif ((rss_conf.rss_hf & LIO_RSS_OFFLOAD_ALL) == 0) {\n+\t\trss_state->hash_disable = 1;\n+\t\tlio_dev_rss_hash_update(eth_dev, &rss_conf);\n+\t\treturn;\n+\t}\n+\n+\tif (rss_conf.rss_key == NULL)\n+\t\trss_conf.rss_key = lio_rss_key; /* Default hash key */\n+\n+\tlio_dev_rss_hash_update(eth_dev, &rss_conf);\n+\n+\tmemset(reta_conf, 0, sizeof(reta_conf));\n+\tfor (i = 0; i < LIO_RSS_MAX_TABLE_SZ; i++) {\n+\t\tuint8_t q_idx, conf_idx, reta_idx;\n+\n+\t\tq_idx = (uint8_t)((eth_dev->data->nb_rx_queues > 1) ?\n+\t\t\t\t  i % eth_dev->data->nb_rx_queues : 0);\n+\t\tconf_idx = i / RTE_RETA_GROUP_SIZE;\n+\t\treta_idx = i % RTE_RETA_GROUP_SIZE;\n+\t\treta_conf[conf_idx].reta[reta_idx] = q_idx;\n+\t\treta_conf[conf_idx].mask |= ((uint64_t)1 << reta_idx);\n+\t}\n+\n+\tlio_dev_rss_reta_update(eth_dev, reta_conf, LIO_RSS_MAX_TABLE_SZ);\n+}\n+\n+static void\n+lio_dev_mq_rx_configure(struct rte_eth_dev *eth_dev)\n+{\n+\tstruct lio_device *lio_dev = LIO_DEV(eth_dev);\n+\tstruct lio_rss_ctx *rss_state = &lio_dev->rss_state;\n+\tstruct rte_eth_rss_conf rss_conf;\n+\n+\tswitch (eth_dev->data->dev_conf.rxmode.mq_mode) {\n+\tcase ETH_MQ_RX_RSS:\n+\t\tlio_dev_rss_configure(eth_dev);\n+\t\tbreak;\n+\tcase ETH_MQ_RX_NONE:\n+\t/* if mq_mode is none, disable rss mode. */\n+\tdefault:\n+\t\tmemset(&rss_conf, 0, sizeof(rss_conf));\n+\t\trss_state->hash_disable = 1;\n+\t\tlio_dev_rss_hash_update(eth_dev, &rss_conf);\n+\t}\n+}\n+\n /**\n  * Setup our receive queue/ringbuffer. This is the\n  * queue the Octeon uses to send us packets and\n@@ -464,6 +793,9 @@\n \tlio_dev->intf_open = 1;\n \trte_mb();\n \n+\t/* Configure RSS if device configured with multiple RX queues. */\n+\tlio_dev_mq_rx_configure(eth_dev);\n+\n \t/* start polling for lsc */\n \tret = rte_eal_alarm_set(LIO_LSC_TIMEOUT,\n \t\t\t\tlio_sync_link_state_check,\n@@ -659,6 +991,10 @@ static int lio_dev_configure(struct rte_eth_dev *eth_dev)\n \t.rx_queue_release\t= lio_dev_rx_queue_release,\n \t.tx_queue_setup\t\t= lio_dev_tx_queue_setup,\n \t.tx_queue_release\t= lio_dev_tx_queue_release,\n+\t.reta_update\t\t= lio_dev_rss_reta_update,\n+\t.reta_query\t\t= lio_dev_rss_reta_query,\n+\t.rss_hash_conf_get\t= lio_dev_rss_hash_conf_get,\n+\t.rss_hash_update\t= lio_dev_rss_hash_update,\n };\n \n static void\ndiff --git a/drivers/net/liquidio/lio_ethdev.h b/drivers/net/liquidio/lio_ethdev.h\nindex 7b5343a..6543061 100644\n--- a/drivers/net/liquidio/lio_ethdev.h\n+++ b/drivers/net/liquidio/lio_ethdev.h\n@@ -92,4 +92,25 @@ struct lio_link_status_resp {\n \tstruct octeon_link_info link_info;\n \tuint64_t status;\n };\n+\n+struct lio_rss_set {\n+\tstruct param {\n+#if RTE_BYTE_ORDER == RTE_LITTLE_ENDIAN\n+\t\tuint64_t flags : 16;\n+\t\tuint64_t hashinfo : 32;\n+\t\tuint64_t itablesize : 16;\n+\t\tuint64_t hashkeysize : 16;\n+\t\tuint64_t reserved : 48;\n+#elif RTE_BYTE_ORDER == RTE_BIG_ENDIAN\n+\t\tuint64_t itablesize : 16;\n+\t\tuint64_t hashinfo : 32;\n+\t\tuint64_t flags : 16;\n+\t\tuint64_t reserved : 48;\n+\t\tuint64_t hashkeysize : 16;\n+#endif\n+\t} param;\n+\n+\tuint8_t itable[LIO_RSS_MAX_TABLE_SZ];\n+\tuint8_t key[LIO_RSS_MAX_KEY_SZ];\n+};\n #endif\t/* _LIO_ETHDEV_H_ */\ndiff --git a/drivers/net/liquidio/lio_struct.h b/drivers/net/liquidio/lio_struct.h\nindex da08fe4..c2293f7 100644\n--- a/drivers/net/liquidio/lio_struct.h\n+++ b/drivers/net/liquidio/lio_struct.h\n@@ -357,6 +357,21 @@ struct lio_gather {\n \tstruct lio_sg_entry *sg;\n };\n \n+struct lio_rss_ctx {\n+\tuint16_t hash_key_size;\n+\tuint8_t  hash_key[LIO_RSS_MAX_KEY_SZ];\n+\t/* Ideally a factor of number of queues */\n+\tuint8_t  itable[LIO_RSS_MAX_TABLE_SZ];\n+\tuint8_t  itable_size;\n+\tuint8_t  ip;\n+\tuint8_t  tcp_hash;\n+\tuint8_t  ipv6;\n+\tuint8_t  ipv6_tcp_hash;\n+\tuint8_t  ipv6_ex;\n+\tuint8_t  ipv6_tcp_ex_hash;\n+\tuint8_t  hash_disable;\n+};\n+\n struct lio_io_enable {\n \tuint64_t iq;\n \tuint64_t oq;\n@@ -619,6 +634,7 @@ struct lio_device {\n \tuint8_t nb_rx_queues;\n \tuint8_t nb_tx_queues;\n \tuint8_t port_configured;\n+\tstruct lio_rss_ctx rss_state;\n \tuint8_t port_id;\n };\n #endif /* _LIO_STRUCT_H_ */\n",
    "prefixes": [
        "dpdk-dev",
        "v2",
        "34/46"
    ]
}