get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 15742,
    "url": "https://patches.dpdk.org/api/patches/15742/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1473410639-10367-15-git-send-email-shreyansh.jain@nxp.com/",
    "project": {
        "id": 1,
        "url": "https://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": "<1473410639-10367-15-git-send-email-shreyansh.jain@nxp.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1473410639-10367-15-git-send-email-shreyansh.jain@nxp.com",
    "date": "2016-09-09T08:43:58",
    "name": "[dpdk-dev,v3,14/15] ether: Support rte_soc_driver/device for etherdev",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "48f9a0439df04818d2cf8607166c0a4257ed1b2e",
    "submitter": {
        "id": 497,
        "url": "https://patches.dpdk.org/api/people/497/?format=api",
        "name": "Shreyansh Jain",
        "email": "shreyansh.jain@nxp.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1473410639-10367-15-git-send-email-shreyansh.jain@nxp.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/15742/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/15742/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 F3D7B6CCE;\n\tFri,  9 Sep 2016 10:45:18 +0200 (CEST)",
            "from NAM02-SN1-obe.outbound.protection.outlook.com\n\t(mail-sn1nam02on0059.outbound.protection.outlook.com [104.47.36.59])\n\tby dpdk.org (Postfix) with ESMTP id 72B4B7F14\n\tfor <dev@dpdk.org>; Fri,  9 Sep 2016 10:45:15 +0200 (CEST)",
            "from BN3PR0301CA0040.namprd03.prod.outlook.com (10.160.180.178) by\n\tDM5PR03MB2444.namprd03.prod.outlook.com (10.168.233.14) with\n\tMicrosoft SMTP Server (version=TLS1_0,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384) id\n\t15.1.619.10; Fri, 9 Sep 2016 08:45:12 +0000",
            "from BL2FFO11FD043.protection.gbl (2a01:111:f400:7c09::184) by\n\tBN3PR0301CA0040.outlook.office365.com (2a01:111:e400:4000::50) with\n\tMicrosoft SMTP Server (version=TLS1_0,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA_P384)\n\tid 15.1.609.9 via Frontend Transport; Fri, 9 Sep 2016 08:45:13 +0000",
            "from tx30smr01.am.freescale.net (192.88.168.50) by\n\tBL2FFO11FD043.mail.protection.outlook.com (10.173.161.139) with\n\tMicrosoft\n\tSMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id\n\t15.1.587.6 via Frontend Transport; Fri, 9 Sep 2016 08:45:12 +0000",
            "from Tophie.ap.freescale.net ([10.232.14.87])\n\tby tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id\n\tu898hoZ8018305; Fri, 9 Sep 2016 01:45:10 -0700"
        ],
        "Authentication-Results": "spf=fail (sender IP is 192.88.168.50)\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.168.50 as permitted sender)\n\treceiver=protection.outlook.com; \n\tclient-ip=192.88.168.50; helo=tx30smr01.am.freescale.net;",
        "From": "Shreyansh Jain <shreyansh.jain@nxp.com>",
        "To": "<dev@dpdk.org>",
        "CC": "<viktorin@rehivetech.com>, <hemant.agrawal@nxp.com>, Shreyansh Jain\n\t<shreyansh.jain@nxp.com>",
        "Date": "Fri, 9 Sep 2016 14:13:58 +0530",
        "Message-ID": "<1473410639-10367-15-git-send-email-shreyansh.jain@nxp.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1473410639-10367-1-git-send-email-shreyansh.jain@nxp.com>",
        "References": "<1451682326-5834-1-git-send-email-viktorin@rehivetech.com>\n\t<1473410639-10367-1-git-send-email-shreyansh.jain@nxp.com>",
        "X-EOPAttributedMessage": "0",
        "X-Matching-Connectors": "131178843124720574;\n\t(91ab9b29-cfa4-454e-5278-08d120cd25b8); ()",
        "X-Forefront-Antispam-Report": "CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI;\n\tSFV:NSPM;\n\tSFS:(10009020)(6009001)(7916002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(5660300001)(68736007)(47776003)(2950100001)(85426001)(626004)(87936001)(7846002)(189998001)(50986999)(76176999)(19580405001)(356003)(50226002)(19580395003)(8666005)(5003940100001)(36756003)(8676002)(81166006)(81156014)(305945005)(8936002)(92566002)(77096005)(2351001)(586003)(229853001)(86362001)(110136002)(105606002)(50466002)(97736004)(5890100001)(106466001)(104016004)(2906002)(33646002)(4326007)(48376002)(7059030);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM5PR03MB2444;\n\tH:tx30smr01.am.freescale.net; \n\tFPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; BL2FFO11FD043;\n\t1:04AoDwrOZKQ9ZAZN7J0n3slC8NftMIE3BdIgeKS8GiHqranihEjv9QaRcL+7KzLgjbwka1CBc6tYu7ONqzmETsMewYIp9NaBOkwPgHqcGdbqmSTxuLxSprxk1GJzGBvtDMY5+ROv10wWfCY5OKSwT30QqiTphktFqM1QUx+uG9o1Kl0aAUO7DL7zYWD+ya3MExw1bwhUjKoYX3CCnO7m/fbDU3xeWSnuYVfFsDtyi6EAi26+M7KGhcD2pTC2bWNNhV7jw3vyTVaq+p5smCFrNCK0/mRuFqhYWLJDFw5Bm0pR+++zR4DuEAC72/TZG6umuMv3ZSitbMIT5F5ZZayt8JlM7bZz3NGcvrrMemhaLhuYJNzc3Pv2EpdBzXztR+8bEzWV9VrwmphWTa6Mqg4l2hoc8O8qsV6FYE9raz4rnkmAEevCxQAqJLOFE6cRMMe5cB4MQ3r23WNJK5odsw0jrqq8HdxumdAYd/94F6UZp5hIsp1idFP658YAA1nf5FfaZt/emm8s6BH90p7FvS/kdJ/eNUXuvTC297PVEgKK6wdYSBTEAsmoT3P9KKEWA4lEMJPFigkQHCVpciVZXPXLPf6rYPQSfyAaa/WgQjfDAXlVKy/CwRF0+PF7fA0w3X7+EMjcfA0+08ZkABiCtqtHykLx1NJ9eoRmyhMNeCRq8otHXIm9CKG3Jz//bFQCF+sgf+NxqwDO5b8xcSfwHP5yZVOibLPoZCmIbWTcOibt5m8=",
            "1; DM5PR03MB2444;\n\t2:JBBMNi0bIlgersVgRmqc9lBH4aXalnmWxY2ZR5KVcLFnZa9r2GiiSYhXFEgs0+xrBU8uPHL3OGxOUKVYBG33FDCjcaJCcv6pvZsJ6gOlOWz/1DsVaPIVXOpiYmQi91eYz18SNqzEeZ00Njv+k8iLVRtQ+siNPWiHAxa+OGaw7gJvaYVygnBdcpkbbJg/OnDo;\n\t3:Cp9MSt8pq88qUoK1jkOe6EZIMc8Xke4yP5G5sIzK6osUsZMJR2s5iDhrn/J6iIogUXEVyX/wsW1tajgD1PxzgcnCepwNaXjtaZA/WcuoAQWKdu/LOeJBpScRRZXO8gIc/l6pxIqeSjkZ8xG6a7GCvkmj/zp3kojRqvHpWe3Hd5sTCu97I6ip2qmWRuLj22xe6syYjKaLlIT/qzGKX3E2H2NR64ddmHB513mfFTiKVys=;\n\t25:EvP33olFk+Cawj7voGFuu08RYbcUYyIxLECK5kJybsmuCAeMj5QR5+/p5YYZfC+UYOsbJ+wvywlid6v7kXJ2YZs+wwwQtdrHm96ZRkBXZoody2+HVZ4uyfkYISKcAEIaHlfYoJm1y5cZ05TH6QsgLhQ1lQlltDPwrDmYSz23MMR1y5hYimpk95EXR0aIXVzK7OhqB5kHGkVaPMm+bVyyz5qh9otDqR0VkTh9Jw0t/i4zKhNmqM8Q4BQKVkCgpsyqOn4FYb86iDxrCqOXjsiI4KyU+5ipdOUlpf00Zf24SJq2WP+suiI8FxXMgQrMTIqb9M8r7ItSqcpR22gGgU8OnVmMNYNu6sTFvbrI025DEFZYUvVSnZ4N5b+1wARCPRk7BLIj3zwE3x1htT9kvaRj0dTgjznbTr3Hofedxtw78Zo=",
            "1; DM5PR03MB2444;\n\t31:ToU5cs6Y+RHKFqE2EPneYBFz81TkvqdMSXy1lDUJ3Z4srzfFH7DJX/s90tz5uMbE6fqQYpzFAF71OQZamI5IaeuDA8cRVLHi6IZ3/gSLu2oMTH+3nB24wILqL//F5RduTfuQaD2Mx10jJKygkIvxdcm0K+9q+z14vVGt5jmJFbmrqU3DYrmBAbVVIVPca7uX0DqQzlaoNi26n6+HCnNqcibRCYEwV3oaabHrYTe8wvE=;\n\t4:Mur2c7gDYwvaBCjD7YvclAAOhLLgz8DsQ17gmyg04oBZL9gt0hKe0CRgvCVytWiUXYpr/FCT404iMkEJaSOY3X9fL5lgDC8PCxYNRH5ZQcNDrqxm2BkU/QYsPm361dZaubJk3rTC1DROouecjyud7mIkPJV8R/LqV5f8d7nv0EjS/aQgPLKVvBo6jKsEbJIKxbsvqddtlduj1Cj2zUL7K88y0nanRR626aQsYqCajznuGm0KZhfr4T1ma0FjnmBW8sq0ilgeZUcrTudGP6nXx5+bCRN0PhiZy6smDgrX5rLcp4lrfGnvbk49qSVVQqyrb3Z2NT/kMzVzf73LQAcWPtyFlIn5fiPoj/AspkM6JVNoRI0PLhtnAU94ljq8WLIKEBSP6Z48g5rBaATuwtNSXYdqud9TsgAkX/v7z7NbJ2X972qRAjaU/R5mXTUhzRMsOndSD5/rBet0N+Y+EmUplZhjQImElJsDQNJ/CA05Xb1BW+RjzCzrC5Vhp24GAlDCbgWXX06qWoax/BYh1q17xQFQBIdAkJcOftFh7soGVL8=",
            "=?us-ascii?Q?1; DM5PR03MB2444;\n\t23:ym4W7YqQIPNRc04wb1WiVA1zZv/kK7Tuo0Am3l0VP?=\n\t=?us-ascii?Q?nLLjpsZ/32j9jcOIYuZ0CJifPuXlU5jVeiFLAbRYVOoJE/1S1ewNth8raDHl?=\n\t=?us-ascii?Q?N8fcGLT3QCcUhd+jW8+spDcQIGcL3RQByAr3eR3iWeOCRmNqUNaojdgQBony?=\n\t=?us-ascii?Q?S/GUqLpcRuVztnuHoafYozTXOipi0onw0QGnAPhii3E4pwIi62PqQGDAVQK7?=\n\t=?us-ascii?Q?CFglrWGoSxCoyysbEhE6lrN4F17TpqXvy7A9nqpUyTZ97dJDbrqudYPOIBh/?=\n\t=?us-ascii?Q?2gZrY1SyO8Pe8Cw7A9V0KCCVcTCOa7Mp0hF49kK8g5pIgvMy+BUj0yoR5ygT?=\n\t=?us-ascii?Q?H23UNUYJJFkxxS4iO3qKn9WFJQV0NHQ+NyhsuWL5Ue/virFM/A8ksL1Txk/b?=\n\t=?us-ascii?Q?ugFOIh1aL6Nxh6CcmQ4wRl+yR4odzdibc+gOkZqCgbxcxF0cUNRKtHVuBMKZ?=\n\t=?us-ascii?Q?Uvv9llep21NL6tjsPtGxrtHaKEpjdDu25JOsaKi4Yg49lexjm7WG3i5wSdyU?=\n\t=?us-ascii?Q?uQ5Wx/GkMjd+XwUv22VfIA+9x1+jU5bjGl7pgQkeu1tX4UTzkrc2jBefyEsK?=\n\t=?us-ascii?Q?Vt4LtZSjBHhxvF0N4k2K5I7q/3MjFesTQ3FE6tMNL0eiG+AMrJhpTgQvQ7tk?=\n\t=?us-ascii?Q?V/D9/YGChqvOVZ3SfB84O7SgO1iKGk6e2HiHZd3VZsq2tElhyLoeHfZUAvg7?=\n\t=?us-ascii?Q?qo1kyVNfxq94toMh04hl7SvCRPXJQWvzHGTS/mawdLVtdywU+jvqfGIdatxF?=\n\t=?us-ascii?Q?cEtlU9OHQBZDGVKYzXi+gCFPUGDgu+PQyo0DxFmx7rTSMUUCrC/V9RXhVKlT?=\n\t=?us-ascii?Q?snXDGOBpFuqaTUIRtf3HQ8SzIC5ATOhp0h9s5vyxYdiEsz4xxyX3Ly35/Bp9?=\n\t=?us-ascii?Q?EdnE/xPo8JIKybGkNFRaGn0mmB8RAWyw/RD8ZiRTLcNDA9eHI4koJ/PLE5mA?=\n\t=?us-ascii?Q?qUstY+3mPPfn64lo62BY7OPevEyL1uBCJvuLxlDLYa/WkRjXrZonVTZCR3Tb?=\n\t=?us-ascii?Q?U7tlwgTMV+RZidtgkpEspNLpS0CDM6tHLx4bA0oGyrM1MCV4EyesS+OaUZTW?=\n\t=?us-ascii?Q?hICtIkUN0VhJ2d6K14beE3deuVOct8jIPggfz/t6/jV7X1cx2mmNUZv4xlfW?=\n\t=?us-ascii?Q?Np1DrIi7g+wxw+1xdN8Tv46qA3w+5tMB1PsEzGpAf/F41JvMnFlR8mwXvqGo?=\n\t=?us-ascii?Q?hMZk5VW9cESFOI=3D?=",
            "1; DM5PR03MB2444;\n\t6:7q+PPeoVDDNi44d85dMC6TQSKaZSzibpdSqZYkjAh79FcHJMk1Um5XTGibLOZZWfFeGAmywNvHhvMxYrfQBpewFHVLT9i2UK6CaTIq+38NVWnfoDe/f658GrAKAPC6ptCM7hio2YCG55VOD/V7NwJ5JyUDzAL07u+OajcA4ppY5ZkrM/m7CpoPUzxahhuyG00VpblGnnI+UfS9lGKM+0M5s6hGgoj3yWu8geuZVrhYPr7HHy5rEjLp133SeW4iAzr3BnzHPD+J1S88bFP1cTcAPGZRBL4Kz00hnSjg4IBZI=;\n\t5:dYd5MfRLk1FzyEcOCiSHmaCI0YwG0MR2pKsJEbYx0uhHN8NaKI9Bf2RlnVB3gTByJ3X8oI0WusAkXKlcXhaS7rCWZdW5bMudjzxAxI6a7mGv6HA4c9cSzcdEaNo6monscLbFvQdp9nKCcv2DgUenMSHV6JymyTrpTSbudo+QycY=;\n\t24:0mmpDoMoSorOuTwrN2jqcnY6hmoWoeWByi4+Ij/vPlG/A50W/3roOBimzQJBvomHbRQN/7O+mWOWRXSy4Ilqqecz4yfhAl1HDalc7Y7sQTA=;\n\t7:YrsPvXNKuTvQ6F26ssisQ6acu6HhiSVlGgX6E29qkM2Z2Uft+p66Jf3D96gYoiwJzZWkcwjTomArF8gVnH+3vqSDZD4GQGDUMcan2z5wiGMX2xCI/8A9+C1NEitdykrQhy+N29DEIVT7cEhu7dI9uJs6q3QoQXZ0J9dlhbvXoZ2LnUxIivCQ2CLQcrpKRr5uX0iuv8NtUGyLl6jNpv2foV+paQxnvpvtuTH4RRx7lRLDIHGsKw9T0NqsPIeWZ4DR"
        ],
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-MS-Office365-Filtering-Correlation-Id": "2cbf9fe8-aff4-481f-825d-08d3d88d9cf3",
        "X-Microsoft-Antispam": "UriScan:;BCL:0;PCL:0;RULEID:;SRVR:DM5PR03MB2444;",
        "X-Microsoft-Antispam-PRVS": "<DM5PR03MB244456BAAF5876FE6FC0DA1490FA0@DM5PR03MB2444.namprd03.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:(185117386973197);",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(6040176)(601004)(2401047)(13017025)(13018025)(13015025)(13024025)(13023025)(8121501046)(5005006)(10201501046)(3002001)(6055026);\n\tSRVR:DM5PR03MB2444; BCL:0; PCL:0; RULEID:(400006); SRVR:DM5PR03MB2444;",
        "X-Forefront-PRVS": "00603B7EEF",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "09 Sep 2016 08:45:12.2848\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.168.50]; \n\tHelo=[tx30smr01.am.freescale.net]",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "HybridOnPrem",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM5PR03MB2444",
        "Subject": "[dpdk-dev] [PATCH v3 14/15] ether: Support rte_soc_driver/device\n\tfor etherdev",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <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": "- eth_driver/rte_eth_dev embeds rte_soc_driver/device for relating SoC\n  PMDs to ethernet devices.\n- Add probe and remove functions linked to eth_dev_init/uninit\n\nSigned-off-by: Jan Viktorin <viktorin@rehivetech.com>\nSigned-off-by: Shreyansh Jain <shreyansh.jain@nxp.com>\nSigned-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>\n---\n lib/librte_ether/rte_ethdev.c | 129 ++++++++++++++++++++++++++++++++++++++++++\n lib/librte_ether/rte_ethdev.h |  31 ++++++++++\n 2 files changed, 160 insertions(+)",
    "diff": "diff --git a/lib/librte_ether/rte_ethdev.c b/lib/librte_ether/rte_ethdev.c\nindex 4fa65ca..b57d7b2 100644\n--- a/lib/librte_ether/rte_ethdev.c\n+++ b/lib/librte_ether/rte_ethdev.c\n@@ -326,6 +326,101 @@ rte_eth_dev_pci_remove(struct rte_pci_device *pci_dev)\n }\n \n int\n+rte_eth_dev_soc_probe(struct rte_soc_driver *soc_drv,\n+\t\t      struct rte_soc_device *soc_dev)\n+{\n+\tstruct eth_driver    *eth_drv;\n+\tstruct rte_eth_dev *eth_dev;\n+\tchar ethdev_name[RTE_ETH_NAME_MAX_LEN];\n+\n+\tint diag;\n+\n+\teth_drv = container_of(soc_drv, struct eth_driver, soc_drv);\n+\n+\trte_eal_soc_device_name(&soc_dev->addr, ethdev_name,\n+\t\t\tsizeof(ethdev_name));\n+\n+\teth_dev = rte_eth_dev_allocate(ethdev_name);\n+\tif (eth_dev == NULL)\n+\t\treturn -ENOMEM;\n+\n+\tif (rte_eal_process_type() == RTE_PROC_PRIMARY) {\n+\t\teth_dev->data->dev_private = rte_zmalloc(\n+\t\t\t\t  \"ethdev private structure\",\n+\t\t\t\t  eth_drv->dev_private_size,\n+\t\t\t\t  RTE_CACHE_LINE_SIZE);\n+\t\tif (eth_dev->data->dev_private == NULL)\n+\t\t\trte_panic(\"Cannot allocate memzone for private port \"\n+\t\t\t\t  \"data\\n\");\n+\t}\n+\teth_dev->soc_dev = soc_dev;\n+\teth_dev->driver = eth_drv;\n+\teth_dev->data->rx_mbuf_alloc_failed = 0;\n+\n+\t/* init user callbacks */\n+\tTAILQ_INIT(&(eth_dev->link_intr_cbs));\n+\n+\t/*\n+\t * Set the default MTU.\n+\t */\n+\teth_dev->data->mtu = ETHER_MTU;\n+\n+\t/* Invoke PMD device initialization function */\n+\tdiag = (*eth_drv->eth_dev_init)(eth_dev);\n+\tif (diag == 0)\n+\t\treturn 0;\n+\n+\tRTE_PMD_DEBUG_TRACE(\"driver %s: eth_dev_init(%s) failed\\n\",\n+\t\t\tsoc_drv->driver.name,\n+\t\t\tsoc_dev->addr.name);\n+\tif (rte_eal_process_type() == RTE_PROC_PRIMARY)\n+\t\trte_free(eth_dev->data->dev_private);\n+\trte_eth_dev_release_port(eth_dev);\n+\treturn diag;\n+}\n+\n+int\n+rte_eth_dev_soc_remove(struct rte_soc_device *soc_dev)\n+{\n+\tconst struct eth_driver *eth_drv;\n+\tstruct rte_eth_dev *eth_dev;\n+\tchar ethdev_name[RTE_ETH_NAME_MAX_LEN];\n+\tint ret;\n+\n+\tif (soc_dev == NULL)\n+\t\treturn -EINVAL;\n+\n+\trte_eal_soc_device_name(&soc_dev->addr, ethdev_name,\n+\t\t\tsizeof(ethdev_name));\n+\n+\teth_dev = rte_eth_dev_allocated(ethdev_name);\n+\tif (eth_dev == NULL)\n+\t\treturn -ENODEV;\n+\n+\teth_drv = container_of(soc_dev->driver, struct eth_driver, soc_drv);\n+\n+\t/* Invoke PMD device uninit function */\n+\tif (*eth_drv->eth_dev_uninit) {\n+\t\tret = (*eth_drv->eth_dev_uninit)(eth_dev);\n+\t\tif (ret)\n+\t\t\treturn ret;\n+\t}\n+\n+\t/* free ether device */\n+\trte_eth_dev_release_port(eth_dev);\n+\n+\tif (rte_eal_process_type() == RTE_PROC_PRIMARY)\n+\t\trte_free(eth_dev->data->dev_private);\n+\n+\teth_dev->soc_dev = NULL;\n+\teth_dev->driver = NULL;\n+\teth_dev->data = NULL;\n+\n+\treturn 0;\n+}\n+\n+\n+int\n rte_eth_dev_is_valid_port(uint8_t port_id)\n {\n \tif (port_id >= RTE_MAX_ETHPORTS ||\n@@ -1555,6 +1650,7 @@ rte_eth_dev_info_get(uint8_t port_id, struct rte_eth_dev_info *dev_info)\n \tRTE_FUNC_PTR_OR_RET(*dev->dev_ops->dev_infos_get);\n \t(*dev->dev_ops->dev_infos_get)(dev, dev_info);\n \tdev_info->pci_dev = dev->pci_dev;\n+\tdev_info->soc_dev = dev->soc_dev;\n \tdev_info->driver_name = dev->data->drv_name;\n \tdev_info->nb_rx_queues = dev->data->nb_rx_queues;\n \tdev_info->nb_tx_queues = dev->data->nb_tx_queues;\n@@ -2530,8 +2626,13 @@ static inline\n struct rte_intr_handle *eth_dev_get_intr_handle(struct rte_eth_dev *dev)\n {\n \tif (dev->pci_dev) {\n+\t\tRTE_VERIFY(dev->soc_dev == NULL);\n \t\treturn &dev->pci_dev->intr_handle;\n \t}\n+\tif (dev->soc_dev) {\n+\t\tRTE_VERIFY(dev->pci_dev == NULL);\n+\t\treturn &dev->soc_dev->intr_handle;\n+\t}\n \n \tRTE_VERIFY(0);\n \treturn NULL;\n@@ -2572,9 +2673,15 @@ static inline\n const char *eth_dev_get_driver_name(const struct rte_eth_dev *dev)\n {\n \tif (dev->pci_dev) {\n+\t\tRTE_VERIFY(dev->soc_dev == NULL);\n \t\treturn dev->driver->pci_drv.driver.name;\n \t}\n \n+\tif (dev->soc_dev) {\n+\t\tRTE_VERIFY(dev->pci_dev == NULL);\n+\t\treturn dev->driver->soc_drv.driver.name;\n+\t}\n+\n \tRTE_VERIFY(0);\n \treturn NULL;\n }\n@@ -3237,6 +3344,28 @@ rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev, struct rte_pci_device *pci_de\n \teth_dev->data->drv_name = pci_dev->driver->driver.name;\n }\n \n+void\n+rte_eth_copy_soc_info(struct rte_eth_dev *eth_dev,\n+\t\t      struct rte_soc_device *soc_dev)\n+{\n+\tif ((eth_dev == NULL) || (soc_dev == NULL)) {\n+\t\tRTE_PMD_DEBUG_TRACE(\"NULL pointer eth_dev=%p soc_dev=%p\\n\",\n+\t\t\t\teth_dev, soc_dev);\n+\t\treturn;\n+\t}\n+\n+\tRTE_VERIFY(eth_dev->soc_dev != NULL);\n+\n+\teth_dev->data->dev_flags = 0;\n+\tif (soc_dev->driver->drv_flags & RTE_SOC_DRV_INTR_LSC)\n+\t\teth_dev->data->dev_flags |= RTE_ETH_DEV_INTR_LSC;\n+\tif (soc_dev->driver->drv_flags & RTE_SOC_DRV_DETACHABLE)\n+\t\teth_dev->data->dev_flags |= RTE_ETH_DEV_DETACHABLE;\n+\n+\teth_dev->data->numa_node = soc_dev->device.numa_node;\n+\teth_dev->data->drv_name = soc_dev->driver->driver.name;\n+}\n+\n int\n rte_eth_dev_l2_tunnel_eth_type_conf(uint8_t port_id,\n \t\t\t\t    struct rte_eth_l2_tunnel_conf *l2_tunnel)\ndiff --git a/lib/librte_ether/rte_ethdev.h b/lib/librte_ether/rte_ethdev.h\nindex 8320dc4..4ae22e9 100644\n--- a/lib/librte_ether/rte_ethdev.h\n+++ b/lib/librte_ether/rte_ethdev.h\n@@ -180,6 +180,7 @@ extern \"C\" {\n #include <rte_log.h>\n #include <rte_interrupts.h>\n #include <rte_pci.h>\n+#include <rte_soc.h>\n #include <rte_dev.h>\n #include <rte_devargs.h>\n #include \"rte_ether.h\"\n@@ -870,6 +871,7 @@ struct rte_eth_conf {\n  */\n struct rte_eth_dev_info {\n \tstruct rte_pci_device *pci_dev; /**< Device PCI information. */\n+\tstruct rte_soc_device *soc_dev; /**< Device SoC information. */\n \tconst char *driver_name; /**< Device Driver name. */\n \tunsigned int if_index; /**< Index to bound host interface, or 0 if none.\n \t\tUse if_indextoname() to translate into an interface name. */\n@@ -1619,6 +1621,7 @@ struct rte_eth_dev {\n \tconst struct eth_driver *driver;/**< Driver for this device */\n \tconst struct eth_dev_ops *dev_ops; /**< Functions exported by PMD */\n \tstruct rte_pci_device *pci_dev; /**< PCI info. supplied by probing */\n+\tstruct rte_soc_device *soc_dev; /**< SoC info. supplied by probing */\n \t/** User application callbacks for NIC interrupts */\n \tstruct rte_eth_dev_cb_list link_intr_cbs;\n \t/**\n@@ -1852,6 +1855,7 @@ typedef int (*eth_dev_uninit_t)(struct rte_eth_dev *eth_dev);\n  */\n struct eth_driver {\n \tstruct rte_pci_driver pci_drv;    /**< The PMD is also a PCI driver. */\n+\tstruct rte_soc_driver soc_drv;    /**< The PMD is also a SoC driver. */\n \teth_dev_init_t eth_dev_init;      /**< Device init function. */\n \teth_dev_uninit_t eth_dev_uninit;  /**< Device uninit function. */\n \tunsigned int dev_private_size;    /**< Size of device private data. */\n@@ -4244,6 +4248,20 @@ void rte_eth_copy_pci_info(struct rte_eth_dev *eth_dev,\n \t\tstruct rte_pci_device *pci_dev);\n \n /**\n+ * Copy SoC device info to the Ethernet device data.\n+ *\n+ * @param eth_dev\n+ * The *eth_dev* pointer is the address of the *rte_eth_dev* structure.\n+ * @param soc_dev\n+ * The *soc_dev* pointer is the address of the *rte_soc_device* structure.\n+ *\n+ * @return\n+ *   - 0 on success, negative on error\n+ */\n+void rte_eth_copy_soc_info(struct rte_eth_dev *eth_dev,\n+\t\tstruct rte_soc_device *soc_dev);\n+\n+/**\n  * Create memzone for HW rings.\n  * malloc can't be used as the physical address is needed.\n  * If the memzone is already created, then this function returns a ptr\n@@ -4356,6 +4374,19 @@ int rte_eth_dev_pci_probe(struct rte_pci_driver *pci_drv,\n  */\n int rte_eth_dev_pci_remove(struct rte_pci_device *pci_dev);\n \n+/**\n+ * Wrapper for use by SoC drivers as a .devinit function to attach to a ethdev\n+ * interface.\n+ */\n+int rte_eth_dev_soc_probe(struct rte_soc_driver *soc_drv,\n+\t\t\t  struct rte_soc_device *soc_dev);\n+\n+/**\n+ * Wrapper for use by SoC drivers as a .devuninit function to detach a ethdev\n+ * interface.\n+ */\n+int rte_eth_dev_soc_remove(struct rte_soc_device *soc_dev);\n+\n #ifdef __cplusplus\n }\n #endif\n",
    "prefixes": [
        "dpdk-dev",
        "v3",
        "14/15"
    ]
}