get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 18189,
    "url": "http://patches.dpdk.org/api/patches/18189/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1482180853-18823-21-git-send-email-hemant.agrawal@nxp.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": "<1482180853-18823-21-git-send-email-hemant.agrawal@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1482180853-18823-21-git-send-email-hemant.agrawal@nxp.com",
    "date": "2016-12-19T20:53:59",
    "name": "[dpdk-dev,PATCHv2,20/34] net/dpaa2: add rss flow distribution",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "e4ba84381a9896020dd59413aab867cd3df72c2a",
    "submitter": {
        "id": 477,
        "url": "http://patches.dpdk.org/api/people/477/?format=api",
        "name": "Hemant Agrawal",
        "email": "hemant.agrawal@nxp.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/1482180853-18823-21-git-send-email-hemant.agrawal@nxp.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/18189/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/18189/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 BB77CFAED;\n\tMon, 19 Dec 2016 16:22:05 +0100 (CET)",
            "from NAM03-DM3-obe.outbound.protection.outlook.com\n\t(mail-dm3nam03on0066.outbound.protection.outlook.com [104.47.41.66])\n\tby dpdk.org (Postfix) with ESMTP id 8C573FA85\n\tfor <dev@dpdk.org>; Mon, 19 Dec 2016 16:21:43 +0100 (CET)",
            "from DM5PR03CA0010.namprd03.prod.outlook.com (10.175.104.20) by\n\tCY1PR0301MB0748.namprd03.prod.outlook.com (10.160.159.154) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.789.14;\n\tMon, 19 Dec 2016 15:21:41 +0000",
            "from BN1AFFO11FD036.protection.gbl (2a01:111:f400:7c10::130) by\n\tDM5PR03CA0010.outlook.office365.com (2603:10b6:3:118::20) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id\n\t15.1.789.14 via Frontend Transport; Mon, 19 Dec 2016 15:21:41 +0000",
            "from az84smr01.freescale.net (192.88.158.2) by\n\tBN1AFFO11FD036.mail.protection.outlook.com (10.58.52.240) with\n\tMicrosoft SMTP Server (version=TLS1_0,\n\tcipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.789.10\n\tvia Frontend Transport; Mon, 19 Dec 2016 15:21:41 +0000",
            "from bf-netperf1.idc ([10.232.134.28])\n\tby az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id\n\tuBJFKMhj029110; Mon, 19 Dec 2016 08:21:37 -0700"
        ],
        "Authentication-Results": "spf=fail (sender IP is 192.88.158.2)\n\tsmtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed)\n\theader.d=none; nxp.com; dmarc=fail action=none header.from=nxp.com;\n\tnxp.com; \n\tdkim=none (message not signed) header.d=none;",
        "Received-SPF": "Fail (protection.outlook.com: domain of nxp.com does not\n\tdesignate 192.88.158.2 as permitted sender)\n\treceiver=protection.outlook.com; \n\tclient-ip=192.88.158.2; helo=az84smr01.freescale.net;",
        "From": "Hemant Agrawal <hemant.agrawal@nxp.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<thomas.monjalon@6wind.com>, <bruce.richardson@intel.com>,\n\t<shreyansh.jain@nxp.com>, <john.mcnamara@intel.com>,\n\t<ferruh.yigit@intel.com>, <jerin.jacob@caviumnetworks.com>,\n\tHemant Agrawal <hemant.agrawal@nxp.com>",
        "Date": "Tue, 20 Dec 2016 02:23:59 +0530",
        "Message-ID": "<1482180853-18823-21-git-send-email-hemant.agrawal@nxp.com>",
        "X-Mailer": "git-send-email 1.9.1",
        "In-Reply-To": "<1482180853-18823-1-git-send-email-hemant.agrawal@nxp.com>",
        "References": "<1480875447-23680-1-git-send-email-hemant.agrawal@nxp.com>\n\t<1482180853-18823-1-git-send-email-hemant.agrawal@nxp.com>",
        "X-EOPAttributedMessage": "0",
        "X-Matching-Connectors": "131266345014303581;\n\t(91ab9b29-cfa4-454e-5278-08d120cd25b8); ()",
        "X-Forefront-Antispam-Report": "CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI;\n\tSFV:NSPM;\n\tSFS:(10009020)(6009001)(336005)(7916002)(39410400002)(39850400002)(39400400002)(39380400002)(39450400003)(39840400002)(39860400002)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(38730400001)(81156014)(8676002)(50226002)(8936002)(69596002)(33646002)(626004)(5660300001)(6666003)(6916009)(2950100002)(47776003)(110136003)(92566002)(2906002)(85426001)(97736004)(104016004)(5003940100001)(189998001)(81166006)(76176999)(50986999)(77096006)(48376002)(86362001)(36756003)(4326007)(50466002)(106466001)(2351001)(68736007)(356003)(8666005)(305945005)(105606002)(7059030);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0301MB0748;\n\tH:az84smr01.freescale.net; \n\tFPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; BN1AFFO11FD036;\n\t1:7N0xXWSQwzBFV4x1yI5n/n3pykSZyM/j8Ctj9w3HLVFrtZPH6SsMkhl3lg+3CD/WllCGvEu5CG83ROPnDtrqE7VmNVy3XVQNxj4imkUOBFL7lanFVDNHnTmLcV7eSF+IUKHlM5P/DBu69ibLVPHLNal1H0vgKI2uuJIyRH1zpj1m6+aMYqZXEN8/VbYuZBkakw85CjLigqWB6E3TCDuG5gUpniXpUxykbvjq/i4Cuxgz8mAZcA6sgNU2/ojdLo4gTowE8bJaaTMlQun3+vRH2OKht8d8XPJeV3p7CkwXqNv/+SUHfNWDlLNSwClPiCT3pKp4U5LL3yAosKqlOX7auQo4K3dAQNXkHcy1Zzm0oi/s/0+ydKq5V5Hoah2qdGYyOURYTcIGTj09X8g2zzAnnAt47JcsutaQI5HwyyRZg4CwUJ8voFQJVCuxwtP+Wo0+i5bHHh64IsLJPMi0/VNavxLdLImNC+kvFrYZ34EWzmaVFa078owI66GBwSrTuD2AmU84MdnsKCqx2QW8a1WvJWzCuhH2mAY6cO0H0e9IdYCz9oVOhrgTPQguJEQ44HojfPancN6Fu8qWB4Rkn2qQT9XJRg9jWzTq4RcQ4tXWbusduvRzJDDUUZt0QBh8g7hNkpEqLDQh7OqxaVrCB3EQDc2ZdWJHHgoOSlGA1WRqTywJFsL5i1/DRtmqnxpyi3J1LgTHyXnlMSKIxOZbfIRmeMRsylK+mU6w3cClWh6msi6zEnoJ/llz6AolGSQJbH5+CvXkNTsIc+KqjeF0pH8+GA==",
            "1; CY1PR0301MB0748;\n\t3:pUkjV5NS5dlJjpbAb0h+gA46UO6bITmy8wy6OI8jfBRdqiqQX/9iQ4e5IM4yIBD6i8tP5GtgUJU0yD6sLzk2OZ9q04uibLH+yALNEVrvmu0gadIkeJap5CsKtHg2qjuoxChrO+JdJQJahe9wHnMTf3njdTAnbL6fmP6EZAxcqvzaYGbsgQvIpr0pbWdOyRTEqpyurtCW08HHcyE2WK1ST/OBacJD0DTMIsiv70EzAxHzXJ+zgAaDrejpmPTudNkRJPxnSDMapOnKvmN9+d8QmpKubCl7ro9ecTNV0n0T+LH+ePybn70URiGFjA3G3g9lwtiu2SUjXKQNr2rFTt3ljhB6DQRzJibtA2WhF7DQRfmP39iOfhg9knwHNUf8HXZl;\n\t25:KmJ/hJYIsbfSuHw3vzZp3a29GZhfPFDfEwW73D99qIiLObq+cy6WiovX3OuGp6TCt/6TWHy434F8z4by2iPp69M8b/80Hqsr7LNW087euN8luMucv02RG/v2/JI/9eEOoGG/BfooW2SWwdkU8qTlHkQnZMFxzjVB14PR55vmO0eOitg/bKAtXiYOsVgpUwbG6+PoSMHMy4N0ZvGsEilQ26GmEAuO4BR5ymtKLvhXfdn4guRSL8TEr+BugP0h19RlcZJ3gxhS5wbc26acKdo6cnTGsNxVNo5lowYWNKJQZAAG8zrqfupe+QnYfQnBM1aQ5Vs0Jkf/RbfSAKZ5x1jFzQxvzik/xk6Cvw+ZcjV8zjk4Y4WpzbHJVM/N+D/qNJf6BgPrvjTP0jujuqldAku2GjYgotBbFRJUr7u1BjRya/BwmZt8EmPLHxgUKEbRkkN4MAoC45HeNAiDoTUtQ8ds/Q==",
            "1; CY1PR0301MB0748;\n\t31:G15ZLjmKRy9MS8P0A5wYeAYPic3TN6T1Z3GImSe0xwbNGsR7Xqdr9IQ+wk+1WFql6U+ZMdpA3VnNOe8MnI0UNK3FHCdn/xMiXoG/ng190ZVa+VbAJjux4eVFjEI/FMUyRCz28YYRS7ALOjOsJ+sOBWuMtaR3yPmVXrfotAOkMkfAOz2e2/pRb2PJf6A23OOGqHddBVSsjzqPa+1IkDqs9FoB1joDHUNssuhT3k97Bviqxsqs13sJID6iZOdqCrp4hTywMRZq05oy0V+lqqFtKA==",
            "1; CY1PR0301MB0748;\n\t4:CuhIy/th4gn7iykaY/U/XpFmDc6fmAap6bY9dBz3JFC9TO2/QunVJ8vtkPGtiAaGWCLJXUvhZEJ2grBPTHRRGXMggLfT2RDSk1F2w37WjvSIsmm/rDclZMawstBZnjBvtWqt1yILSz61ev0OMJQGzDaMMKyYFXmOTD/bAyg+CiySEwZpM9x8VUt9uhvzGczosNBywAlM/5+pzrWcjI5ReZT1Wse1wgDWUGOnEpoKEPgCBMj4dEvB2GxGb3VEnIrifaNRu8lLJn0FWTmLc29Nnf9A3jRUg9IzpjKtRZnidKgo446EO8E8xO776nHknVG7dyiinn1omGr7gjFVz3RWCyuUG+idkKoxF9x+aIcAQGfpN8NnaYld9CBfnsyP8y69SQ1nUNEDr4ivqp2gG2Wglt5kaoKaE9JtRNa3s3b/a94prwIDSIURiSsJDaXlCzxR0Ujwm1ZHyqH7w/g+JFFL5521ctvrAolWJXIa2BC5YD9p8nx+hb9Ho7QCi9QYSR9vSwVnBZERhOkuBzfsXy09cKwsqkY10QVjDesmnS+luxPiySNpIPxE6pXCyyXVI9v40n77wbtPZjcQF3sfiQNzzQzFTVDKOO//oDh11iPOxzaqYy/3Hyb8q8EuvQz6UFzCZHX+N7Qe1XXGPJR8bJxqhY25x4YdNQ6aRAUjBMj6aEVZFsctZjE7HAiP3X57CihI2l6nDRYChSJITWebtIMUrkG3Imy8he0Qj/tzuQy7QKIif+VDtia9Mc/SrIxQiNPa",
            "=?us-ascii?Q?1; CY1PR0301MB0748;\n\t23:mHL1/cLSKKNj3VO8nmSeUYjl++D8bPxBnYKUjEe?=\n\tT9DjUBzwew9922AwTcuLxFwtlui6FrRxCGt25KbevpGSjq7XW37+OwKGIPkAyGWXUJXeM6WRBnt8CjCN9e8oFDnLn3tN9Qo6OczsGS5x2F86NHked7PG9YSa2VZ3ZZLK5rkXS6qgQoFJDqYxcXfSIekPaEcH9pGEHx+f/jwnJIUeLjv88HWCO37pgUdj6jTxgc7klVHM/IrKz1vVPrGlkG4QtjPjZbeZcekKSRBkji3UsNprD4HeRcjgBubw1fj1+WuKEWzONdLC+/rdgUYtylHIEGfgf5Ez5zO/ni0oNpS4hwAPV9lf1bHXXFkgabTlHb6ikFHln2YLv92YLDruh8HH2jkxAt79i9Xew3bwdzbvsUTYTC45nnmncYIpizyo2mDn7QNEVaPSpYCheNW+Bv5euXdkajYODUqF+41x+fkcCx+szdGQRdsnCu2Hrpp+mQRvuPc9kFXERRZWFYXJVsNHEHiIro+vtk0MVNNm1btQeP8ytPv+4FyXND5rZK0SoezrjlOBqZvQnCFlBnGdfBElkMuPxSK4qSSrq999NZWbV/BZCTEJRLp07wgw1JtCU6bRWKu1S8ElyW5pWYs0Qk9CmSt9VsxWZGm0OYUlUuR70SSuIuL1u+n4X9LLtRX4uLBzTGV2UiSdWalL84aLgSd/tfYMcaHPyA0P0qYeRkVFlxXjyEWvi/vTkWYN8jLyrJlBdq8GpGQDbhUE/904mLb33/y5oO+e57iBYIYd0iaH1A2YXynKmwXJgNYfEUyF4PDlc3LGZnyJ0aQEe06gE60grALGn2q8JFzzMb3osA0A6C9E3iysgn2VvZZ5Z7bWMh5IxQtXfGTqjICciUwG400PY3KRO+OG08RfBV9xrmZPqTdhFnYME670+KGqVGC/TGhldS1icItj8E8hvq992mOueX7G4IpRSYuXNnBFRF2yZ1Vj8F+h4se79cmnQgGNMDbT+dLYGsDDVdMC+/h5vWHchHqk4v05bn/gm5yUY4ySlgjF5heStMcF3nSdSTPOOz2Fr09hV9fLppFs7fZU7c62T8C8yi1Mu1VU7DM1MEJpNwBSsLIK8RXFsWzvpySzscVEWgVhXBkTWiCVDB3XeKfVm+FgN3/CfBC5SS2hIii4kkUeR9DLftc1s6BRScJhJvAU3EpkVeqCmwCm8zmrRHV47F8LnZs9BzuoV8Rb/K9cLWV4ETJPEEttnKC/fOEm9vrp1+xUVcSK9zuK3Vzmt8loAP7Ne37JV/OxdQ2jyIFxbf9e5Em+q0zu8d67r97DuERo=",
            "1; CY1PR0301MB0748;\n\t6:JsQVcXXu18hDR4ORrpJvIPOqC3OP3FuEhNI5ho7Y9UkZp7bksCsVUN0PkUBvkeMB/c16r03Zpe25an8XgWo51+sCJiN32V6acMR3Y4HX44DCJBeZAv73diLmZUIR2QD8b2mEMC/oJ7KxiQGjatei8qIH6tH9QGj/FSwtwdPeUpLFB8zAG5Gc3hgIo27rSCUoiLwKwvGETMSDYFkxM/tR2Ln9AFzD6pipwV+YId+EgM6YtDCJf8SZm7XpLf0Ir0KmBKXeksjEcjNe84tKYTP6Sklq89tJiDu6E0IWUmgoj6vKoPDw6URdwZO2dFUtGiQ9zi9VlPnCJzodqWK+xFPJJgXm75lIdBl/oGClxkGT16pRcUjM17vM4o+nTFfou58XzAEI4f+sf/ABiOcDZyNfK6pPuvrVNPeDqdybRnyuYLgiNpGl1qhDH5JjI6rvLBSN;\n\t5:oRUTfAQG7E+Vjl5zHoXRTjaGzzYDvij/cv6iIpzJj0P4ceZbc+U+bGiKj1M0FY8iwkpeIeUbhXIEaLOlAjV7LG5pyNrDOKiGjOVBk2pRbto6E0GZmUGruaqR87NSbSUi/gRBDVkC+lh5+V2+FsYBZk6lzuSQtbqOYUJpAxDvoySDJKVYGd15XkFPBcX7X507;\n\t24:Dzf9ZV2zpou6XdvB1349x7d9ROu/XWEvorKr1gzAf8Kgt/qvF1Js+FeOuPZu3BDAgfHspCXaN6NVekjuqw9ygWlGCrP8UK1+1Yprn23vneE=",
            "1; CY1PR0301MB0748;\n\t7:+dVQ+pTKWS9wX+djbo3AQ5Nw4YJdPJoakTSWa1r4h7QjNFL7jrfMEYpUW1GS1L6kTuJElIuEjrtlRsCR86QlmfEt5Mm6aV6AcKzmH0zuClcXkdq+JHgRbLv7IE732BaZaOFvlVkM8TTMtH48iySCkmt9iYxSb5Cx40aLelOlKKZhPKKMkIgGK2PzvnzPKjUaEg871FRYLmAzAAHCA/W7jDrSFbDvDsRoa8Vyeq/Fa8UuPCPxpH6FVT1OBuHOPUv6hZYBV7kT7A8+sHG1vlVneEpiQnIZyHWTTK//Nj5/YkGtubDUe+6g7+lLXaNkroK49fksmtO28RYaRYhtO1JxebtFz0d8EGOP2WO/LYSxvVwo6/2UeWWjoBb52hDtba03vO9W7ALmQMyR591Hli0kPfMrzjdT9JlVo4EAeGwsLURn8BU5air/jCS8JzP9Oll/PFkPJmKAtfxloOSqHOvzew=="
        ],
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-MS-Office365-Filtering-Correlation-Id": "db5f02a6-85dc-4340-9b5d-08d42822bc01",
        "X-Microsoft-Antispam": "UriScan:; BCL:0; PCL:0; RULEID:(22001);\n\tSRVR:CY1PR0301MB0748; ",
        "X-Microsoft-Antispam-PRVS": "<CY1PR0301MB0748C5D511E2C7F126C58C6E89910@CY1PR0301MB0748.namprd03.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:(185117386973197);",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(6095060)(601004)(2401047)(13023025)(13024025)(13015025)(13017025)(13018025)(5005006)(8121501046)(3002001)(10201501046)(6055026)(6096035)(20161123561025)(20161123559025)(20161123556025)(20161123565025)(20161123563025);\n\tSRVR:CY1PR0301MB0748; BCL:0; PCL:0; RULEID:(400006);\n\tSRVR:CY1PR0301MB0748; ",
        "X-Forefront-PRVS": "01613DFDC8",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "19 Dec 2016 15:21:41.1963\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Id": "5afe0b00-7697-4969-b663-5eab37d5f47e",
        "X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp": "TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e;\n\tIp=[192.88.158.2]; \n\tHelo=[az84smr01.freescale.net]",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "CY1PR0301MB0748",
        "Subject": "[dpdk-dev] [PATCHv2 20/34] net/dpaa2: add rss flow distribution",
        "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: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n doc/guides/nics/features/dpaa2.ini     |   1 +\n drivers/net/dpaa2/Makefile             |   1 +\n drivers/net/dpaa2/base/dpaa2_hw_dpni.c | 287 +++++++++++++++++++++++++++++++++\n drivers/net/dpaa2/dpaa2_ethdev.c       |  31 +++-\n drivers/net/dpaa2/dpaa2_ethdev.h       |  12 ++\n 5 files changed, 328 insertions(+), 4 deletions(-)\n create mode 100644 drivers/net/dpaa2/base/dpaa2_hw_dpni.c",
    "diff": "diff --git a/doc/guides/nics/features/dpaa2.ini b/doc/guides/nics/features/dpaa2.ini\nindex 0b59725..20152a0 100644\n--- a/doc/guides/nics/features/dpaa2.ini\n+++ b/doc/guides/nics/features/dpaa2.ini\n@@ -5,6 +5,7 @@\n ;\n [Features]\n Queue start/stop     = Y\n+RSS hash             = Y\n Linux VFIO           = Y\n ARMv8                = Y\n Usage doc            = Y\ndiff --git a/drivers/net/dpaa2/Makefile b/drivers/net/dpaa2/Makefile\nindex 4425b76..c331270 100644\n--- a/drivers/net/dpaa2/Makefile\n+++ b/drivers/net/dpaa2/Makefile\n@@ -57,6 +57,7 @@ EXPORT_MAP := rte_pmd_dpaa2_version.map\n # library version\n LIBABIVER := 1\n \n+SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += base/dpaa2_hw_dpni.c\n SRCS-$(CONFIG_RTE_LIBRTE_DPAA2_PMD) += dpaa2_ethdev.c\n \n # library dependencies\ndiff --git a/drivers/net/dpaa2/base/dpaa2_hw_dpni.c b/drivers/net/dpaa2/base/dpaa2_hw_dpni.c\nnew file mode 100644\nindex 0000000..c95c083\n--- /dev/null\n+++ b/drivers/net/dpaa2/base/dpaa2_hw_dpni.c\n@@ -0,0 +1,287 @@\n+/*-\n+ *   BSD LICENSE\n+ *\n+ *   Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved.\n+ *   Copyright (c) 2016 NXP. All rights reserved.\n+ *\n+ *   Redistribution and use in source and binary forms, with or without\n+ *   modification, are permitted provided that the following conditions\n+ *   are met:\n+ *\n+ *     * Redistributions of source code must retain the above copyright\n+ *       notice, this list of conditions and the following disclaimer.\n+ *     * Redistributions in binary form must reproduce the above copyright\n+ *       notice, this list of conditions and the following disclaimer in\n+ *       the documentation and/or other materials provided with the\n+ *       distribution.\n+ *     * Neither the name of Freescale Semiconductor, Inc nor the names of its\n+ *       contributors may be used to endorse or promote products derived\n+ *       from this software without specific prior written permission.\n+ *\n+ *   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n+ *   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n+ *   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n+ *   A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n+ *   OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n+ *   SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n+ *   LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n+ *   DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n+ *   THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n+ *   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n+ *   OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n+ */\n+\n+#include <time.h>\n+#include <net/if.h>\n+\n+#include <rte_mbuf.h>\n+#include <rte_ethdev.h>\n+#include <rte_malloc.h>\n+#include <rte_memcpy.h>\n+#include <rte_string_fns.h>\n+#include <rte_cycles.h>\n+#include <rte_kvargs.h>\n+#include <rte_dev.h>\n+#include <rte_ethdev.h>\n+\n+#include <fslmc_logs.h>\n+#include <dpaa2_hw_pvt.h>\n+\n+#include \"../dpaa2_ethdev.h\"\n+\n+static void\n+dpaa2_distset_to_dpkg_profile_cfg(\n+\t\tuint32_t req_dist_set,\n+\t\tstruct dpkg_profile_cfg *kg_cfg);\n+\n+int\n+dpaa2_setup_flow_dist(struct rte_eth_dev *eth_dev,\n+\t\t      uint32_t req_dist_set)\n+{\n+\tstruct dpaa2_dev_priv *priv = eth_dev->data->dev_private;\n+\tstruct fsl_mc_io *dpni = priv->hw;\n+\tstruct dpni_rx_tc_dist_cfg tc_cfg;\n+\tstruct dpkg_profile_cfg kg_cfg;\n+\tvoid *p_params;\n+\tint ret, tc_index = 0;\n+\n+\tp_params = rte_malloc(\n+\t\tNULL, DIST_PARAM_IOVA_SIZE, RTE_CACHE_LINE_SIZE);\n+\tif (!p_params) {\n+\t\tRTE_LOG(ERR, PMD, \"Memory unavaialble\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\tmemset(p_params, 0, DIST_PARAM_IOVA_SIZE);\n+\tmemset(&tc_cfg, 0, sizeof(struct dpni_rx_tc_dist_cfg));\n+\n+\tdpaa2_distset_to_dpkg_profile_cfg(req_dist_set, &kg_cfg);\n+\ttc_cfg.key_cfg_iova = (uint64_t)(p_params);\n+\ttc_cfg.dist_size = eth_dev->data->nb_rx_queues;\n+\ttc_cfg.dist_mode = DPNI_DIST_MODE_HASH;\n+\n+\tret = dpni_prepare_key_cfg(&kg_cfg, p_params);\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, PMD, \"Unable to prepare extract parameters\\n\");\n+\t\trte_free(p_params);\n+\t\treturn ret;\n+\t}\n+\n+\tret = dpni_set_rx_tc_dist(dpni, CMD_PRI_LOW, priv->token, tc_index,\n+\t\t\t\t  &tc_cfg);\n+\trte_free(p_params);\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, PMD, \"Setting distribution for Rx failed with\"\n+\t\t\t\" err code: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+int dpaa2_remove_flow_dist(\n+\tstruct rte_eth_dev *eth_dev,\n+\tuint8_t tc_index)\n+{\n+\tstruct dpaa2_dev_priv *priv = eth_dev->data->dev_private;\n+\tstruct fsl_mc_io *dpni = priv->hw;\n+\tstruct dpni_rx_tc_dist_cfg tc_cfg;\n+\tstruct dpkg_profile_cfg kg_cfg;\n+\tvoid *p_params;\n+\tint ret;\n+\n+\tp_params = rte_malloc(\n+\t\tNULL, DIST_PARAM_IOVA_SIZE, RTE_CACHE_LINE_SIZE);\n+\tif (!p_params) {\n+\t\tRTE_LOG(ERR, PMD, \"Memory unavaialble\\n\");\n+\t\treturn -ENOMEM;\n+\t}\n+\tmemset(p_params, 0, DIST_PARAM_IOVA_SIZE);\n+\tmemset(&tc_cfg, 0, sizeof(struct dpni_rx_tc_dist_cfg));\n+\n+\ttc_cfg.key_cfg_iova = (uint64_t)(p_params);\n+\ttc_cfg.dist_size = 0;\n+\ttc_cfg.dist_mode = DPNI_DIST_MODE_NONE;\n+\n+\tret = dpni_prepare_key_cfg(&kg_cfg, p_params);\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, PMD, \"Unable to prepare extract parameters\\n\");\n+\t\trte_free(p_params);\n+\t\treturn ret;\n+\t}\n+\n+\tret = dpni_set_rx_tc_dist(dpni, CMD_PRI_LOW, priv->token, tc_index,\n+\t\t\t\t  &tc_cfg);\n+\trte_free(p_params);\n+\tif (ret) {\n+\t\tRTE_LOG(ERR, PMD, \"Setting distribution for Rx failed with\"\n+\t\t\t\" err code: %d\\n\", ret);\n+\t\treturn ret;\n+\t}\n+\treturn ret;\n+}\n+\n+static void\n+dpaa2_distset_to_dpkg_profile_cfg(\n+\t\tuint32_t req_dist_set,\n+\t\tstruct dpkg_profile_cfg *kg_cfg)\n+{\n+\tuint32_t loop = 0, i = 0, dist_field = 0;\n+\tint l2_configured = 0, l3_configured = 0;\n+\tint l4_configured = 0, sctp_configured = 0;\n+\n+\tmemset(kg_cfg, 0, sizeof(struct dpkg_profile_cfg));\n+\twhile (req_dist_set) {\n+\t\tif (req_dist_set % 2 != 0) {\n+\t\t\tdist_field = 1U << loop;\n+\t\t\tswitch (dist_field) {\n+\t\t\tcase ETH_RSS_L2_PAYLOAD:\n+\n+\t\t\t\tif (l2_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tl2_configured = 1;\n+\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.prot =\n+\t\t\t\t\tNET_PROT_ETH;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.field =\n+\t\t\t\t\tNH_FLD_ETH_TYPE;\n+\t\t\t\tkg_cfg->extracts[i].type =\n+\t\t\t\t\tDPKG_EXTRACT_FROM_HDR;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.type =\n+\t\t\t\t\tDPKG_FULL_FIELD;\n+\t\t\t\ti++;\n+\t\t\tbreak;\n+\n+\t\t\tcase ETH_RSS_IPV4:\n+\t\t\tcase ETH_RSS_FRAG_IPV4:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV4_OTHER:\n+\t\t\tcase ETH_RSS_IPV6:\n+\t\t\tcase ETH_RSS_FRAG_IPV6:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV6_OTHER:\n+\t\t\tcase ETH_RSS_IPV6_EX:\n+\n+\t\t\t\tif (l3_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tl3_configured = 1;\n+\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.prot =\n+\t\t\t\t\tNET_PROT_IP;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.field =\n+\t\t\t\t\tNH_FLD_IP_SRC;\n+\t\t\t\tkg_cfg->extracts[i].type =\n+\t\t\t\t\tDPKG_EXTRACT_FROM_HDR;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.type =\n+\t\t\t\t\tDPKG_FULL_FIELD;\n+\t\t\t\ti++;\n+\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.prot =\n+\t\t\t\t\tNET_PROT_IP;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.field =\n+\t\t\t\t\tNH_FLD_IP_DST;\n+\t\t\t\tkg_cfg->extracts[i].type =\n+\t\t\t\t\tDPKG_EXTRACT_FROM_HDR;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.type =\n+\t\t\t\t\tDPKG_FULL_FIELD;\n+\t\t\t\ti++;\n+\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.prot =\n+\t\t\t\t\tNET_PROT_IP;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.field =\n+\t\t\t\t\tNH_FLD_IP_PROTO;\n+\t\t\t\tkg_cfg->extracts[i].type =\n+\t\t\t\t\tDPKG_EXTRACT_FROM_HDR;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.type =\n+\t\t\t\t\tDPKG_FULL_FIELD;\n+\t\t\t\tkg_cfg->num_extracts++;\n+\t\t\t\ti++;\n+\t\t\tbreak;\n+\n+\t\t\tcase ETH_RSS_NONFRAG_IPV4_TCP:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV6_TCP:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV4_UDP:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV6_UDP:\n+\t\t\tcase ETH_RSS_IPV6_TCP_EX:\n+\t\t\tcase ETH_RSS_IPV6_UDP_EX:\n+\n+\t\t\t\tif (l4_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tl4_configured = 1;\n+\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.prot =\n+\t\t\t\t\tNET_PROT_TCP;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.field =\n+\t\t\t\t\tNH_FLD_TCP_PORT_SRC;\n+\t\t\t\tkg_cfg->extracts[i].type =\n+\t\t\t\t\tDPKG_EXTRACT_FROM_HDR;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.type =\n+\t\t\t\t\tDPKG_FULL_FIELD;\n+\t\t\t\ti++;\n+\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.prot =\n+\t\t\t\t\tNET_PROT_TCP;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.field =\n+\t\t\t\t\tNH_FLD_TCP_PORT_SRC;\n+\t\t\t\tkg_cfg->extracts[i].type =\n+\t\t\t\t\tDPKG_EXTRACT_FROM_HDR;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.type =\n+\t\t\t\t\tDPKG_FULL_FIELD;\n+\t\t\t\ti++;\n+\t\t\t\tbreak;\n+\n+\t\t\tcase ETH_RSS_NONFRAG_IPV4_SCTP:\n+\t\t\tcase ETH_RSS_NONFRAG_IPV6_SCTP:\n+\n+\t\t\t\tif (sctp_configured)\n+\t\t\t\t\tbreak;\n+\t\t\t\tsctp_configured = 1;\n+\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.prot =\n+\t\t\t\t\tNET_PROT_SCTP;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.field =\n+\t\t\t\t\tNH_FLD_SCTP_PORT_SRC;\n+\t\t\t\tkg_cfg->extracts[i].type =\n+\t\t\t\t\tDPKG_EXTRACT_FROM_HDR;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.type =\n+\t\t\t\t\tDPKG_FULL_FIELD;\n+\t\t\t\ti++;\n+\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.prot =\n+\t\t\t\t\tNET_PROT_SCTP;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.field =\n+\t\t\t\t\tNH_FLD_SCTP_PORT_DST;\n+\t\t\t\tkg_cfg->extracts[i].type =\n+\t\t\t\t\tDPKG_EXTRACT_FROM_HDR;\n+\t\t\t\tkg_cfg->extracts[i].extract.from_hdr.type =\n+\t\t\t\t\tDPKG_FULL_FIELD;\n+\t\t\t\ti++;\n+\t\t\t\tbreak;\n+\n+\t\t\tdefault:\n+\t\t\t\tPMD_DRV_LOG(WARNING, \"Bad flow distribution\"\n+\t\t\t\t\t    \" option %x\\n\", dist_field);\n+\t\t\t}\n+\t\t}\n+\t\treq_dist_set = req_dist_set >> 1;\n+\t\tloop++;\n+\t}\n+\tkg_cfg->num_extracts = i;\n+}\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.c b/drivers/net/dpaa2/dpaa2_ethdev.c\nindex d511d7b..9066aa5 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.c\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.c\n@@ -116,7 +116,8 @@\n \t}\n \n \tvq_id = 0;\n-\tfor (dist_idx = 0; dist_idx < priv->nb_rx_queues; dist_idx++) {\n+\tfor (dist_idx = 0; dist_idx < priv->num_dist_per_tc[DPAA2_DEF_TC];\n+\t     dist_idx++) {\n \t\tmcq = (struct dpaa2_queue *)priv->rx_vq[vq_id];\n \t\tmcq->tc_index = DPAA2_DEF_TC;\n \t\tmcq->flow_id = dist_idx;\n@@ -142,6 +143,7 @@\n {\n \tstruct rte_eth_dev_data *data = dev->data;\n \tstruct rte_eth_conf *eth_conf = &data->dev_conf;\n+\tint ret;\n \n \tPMD_INIT_FUNC_TRACE();\n \n@@ -153,6 +155,18 @@\n \t\treturn -1;\n \t}\n \n+\tif (eth_conf->rxmode.mq_mode == ETH_MQ_RX_RSS) {\n+\t\t/* Return in case number of Rx queues is 1 */\n+\t\tif (data->nb_rx_queues == 1)\n+\t\t\treturn 0;\n+\t\tret = dpaa2_setup_flow_dist(dev,\n+\t\t\t\teth_conf->rx_adv_conf.rss_conf.rss_hf);\n+\t\tif (ret) {\n+\t\t\tPMD_INIT_LOG(ERR, \"unable to set flow distribution.\"\n+\t\t\t\t     \"please check queue config\\n\");\n+\t\t\treturn ret;\n+\t\t}\n+\t}\n \treturn 0;\n }\n \n@@ -184,7 +198,7 @@\n \tdpaa2_q->mb_pool = mb_pool; /**< mbuf pool to populate RX ring. */\n \n \t/*Get the tc id and flow id from given VQ id*/\n-\tflow_id = rx_queue_id;\n+\tflow_id = rx_queue_id % priv->num_dist_per_tc[dpaa2_q->tc_index];\n \tmemset(&cfg, 0, sizeof(struct dpni_queue));\n \n \toptions = options | DPNI_QUEUE_OPT_USER_CTX;\n@@ -374,7 +388,7 @@\n \tstruct fsl_mc_io *dpni_dev;\n \tstruct dpni_attr attr;\n \tstruct dpaa2_dev_priv *priv = eth_dev->data->dev_private;\n-\tint ret, hw_id;\n+\tint i, ret, hw_id;\n \n \tPMD_INIT_FUNC_TRACE();\n \n@@ -416,7 +430,16 @@\n \t}\n \n \tpriv->num_tc = attr.num_tcs;\n-\tpriv->nb_rx_queues = attr.num_queues;\n+\tfor (i = 0; i < attr.num_tcs; i++) {\n+\t\tpriv->num_dist_per_tc[i] = attr.num_queues;\n+\t\tbreak;\n+\t}\n+\n+\t/* Distribution is per Tc only,\n+\t * so choosing RX queues from default TC only\n+\t */\n+\tpriv->nb_rx_queues = priv->num_dist_per_tc[DPAA2_DEF_TC];\n+\n \tpriv->nb_tx_queues = attr.num_queues;\n \n \teth_dev->data->nb_rx_queues = priv->nb_rx_queues;\ndiff --git a/drivers/net/dpaa2/dpaa2_ethdev.h b/drivers/net/dpaa2/dpaa2_ethdev.h\nindex 5f599a7..d24fcc6 100644\n--- a/drivers/net/dpaa2/dpaa2_ethdev.h\n+++ b/drivers/net/dpaa2/dpaa2_ethdev.h\n@@ -37,12 +37,16 @@\n #include <mc/fsl_dpni.h>\n #include <mc/fsl_mc_sys.h>\n \n+#define MAX_TCS\t\t\tDPNI_MAX_TC\n #define MAX_RX_QUEUES\t\t16\n #define MAX_TX_QUEUES\t\t16\n \n /*default tc to be used for ,congestion, distribution etc configuration. */\n #define DPAA2_DEF_TC\t\t0\n \n+/* Size of the input SMMU mapped memory required by MC */\n+#define DIST_PARAM_IOVA_SIZE 256\n+\n struct dpaa2_dev_priv {\n \tvoid *hw;\n \tint32_t hw_id;\n@@ -53,7 +57,15 @@ struct dpaa2_dev_priv {\n \tvoid *rx_vq[MAX_RX_QUEUES];\n \tvoid *tx_vq[MAX_TX_QUEUES];\n \n+\tuint16_t num_dist_per_tc[MAX_TCS];\n \tuint8_t num_tc;\n \tuint8_t flags; /*dpaa2 config flags */\n };\n+\n+int dpaa2_setup_flow_dist(struct rte_eth_dev *eth_dev,\n+\t\t\t  uint32_t req_dist_set);\n+\n+int dpaa2_remove_flow_dist(struct rte_eth_dev *eth_dev,\n+\t\t\t   uint8_t tc_index);\n+\n #endif /* _DPAA2_ETHDEV_H */\n",
    "prefixes": [
        "dpdk-dev",
        "PATCHv2",
        "20/34"
    ]
}