get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139533,
    "url": "https://patches.dpdk.org/api/patches/139533/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20240419052349.1294696-9-chaoyong.he@corigine.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": "<20240419052349.1294696-9-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240419052349.1294696-9-chaoyong.he@corigine.com",
    "date": "2024-04-19T05:23:49",
    "name": "[v2,8/8] net/nfp: unify port create and destroy interface",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "a6cf50ca4813781ef6c22f29f9567aaa1c42bda4",
    "submitter": {
        "id": 2554,
        "url": "https://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20240419052349.1294696-9-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 31788,
            "url": "https://patches.dpdk.org/api/series/31788/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=31788",
            "date": "2024-04-19T05:23:42",
            "name": "[v2,1/8] net/nfp: fix resource leak of secondary process",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/31788/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/139533/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/139533/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id D184443EAA;\n\tFri, 19 Apr 2024 07:25:19 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 1AD3A4067E;\n\tFri, 19 Apr 2024 07:24:45 +0200 (CEST)",
            "from NAM12-MW2-obe.outbound.protection.outlook.com\n (mail-mw2nam12on2101.outbound.protection.outlook.com [40.107.244.101])\n by mails.dpdk.org (Postfix) with ESMTP id 35F22406B8\n for <dev@dpdk.org>; Fri, 19 Apr 2024 07:24:39 +0200 (CEST)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by MW3PR13MB3961.namprd13.prod.outlook.com (2603:10b6:303:2c::18)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.7472.42; Fri, 19 Apr\n 2024 05:24:37 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::ec12:7411:559a:850e%5]) with mapi id 15.20.7472.042; Fri, 19 Apr 2024\n 05:24:37 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=WpwSwNXQPei8ZDer3nnsFwmmFX7RYfnJBYir8v+Ko8a2MFJgzZaxSqygzi3MsX6RGQYQUFREx1GAJQZ3RWBdUSYwfw5/4rSs1v+lct9sR3M6rSX7KNe58ZUsART18FcmDMGyq8urVKpQIDFC2XukN3xf6+qFv0dqJismbvmH7hUEK/7rDtOOqRsQb5n4PVOPO9EFsy4NbyN+Aav1HKYhW14zsZN+yN3xQIoHBEdCrebLkcHoD0wIX5x+iYR8IVwK+dLVJ4h+G6GQVR6V9/N6VpsCQjL+XbILBb7ES1/P6HH5cJEHlO3W6p/BUXENFmaFbpWFQR7z5rgZZEbesPUWEA==",
        "ARC-Message-Signature": "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector9901;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1;\n bh=rCi8m/zoxaAvim3gUm+/XR3DC/mZmc359W4FsSl8Q5Y=;\n b=IwThOumowVfvAGCKz2i2OLJO7NcuWmK2nWagjaGmQKN9upzD8vLvcpaWNtV+7H9heZ4QSKkU2G7IHhsLnDK2HhM9SuxxSTcLHabqnASgWB9wXpORkJvuqwgvEsNIIcqzFgRjNev3D4tVk+UmMKLv4Dcljjw1JPeaqWRUmLBnAEXB8cA8KyYQu5Kz/CegufTOWGsjoiNIMqd3BHQzhsczCWZiKalb3rZjTVfOQZD7i8RvOQ3ki8F0QxJjEw7M+qfurCOoLqHsNAWOwHYDbEbAr2qN+ksaDRZWQ+mREE2GW3zAPVe3SjE/i/IJ+I3MLexc3QJi/xUiouFuoo/DG8n7pA==",
        "ARC-Authentication-Results": "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com;\n dkim=pass header.d=corigine.com; arc=none",
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=rCi8m/zoxaAvim3gUm+/XR3DC/mZmc359W4FsSl8Q5Y=;\n b=UNnHhx98bY54cI1OkQqWWA3IvxFjbSz+jfLmGcs2mQ0/lWsV/+S3kx0xM2E0nHVIR2mD1UHccUOqZVSF0QnOSlaJwEP29g3jpI+VfYKhXlUIZjUYYIh6e6+rPKD8+VxX/mzYvbu9vV44g5zUENDe3UyfRANvUVx9dbm4jF1cwXA=",
        "Authentication-Results": "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=corigine.com;",
        "From": "Chaoyong He <chaoyong.he@corigine.com>",
        "To": "dev@dpdk.org",
        "Cc": "oss-drivers@corigine.com, Chaoyong He <chaoyong.he@corigine.com>,\n Long Wu <long.wu@corigine.com>, Peng Zhang <peng.zhang@corigine.com>",
        "Subject": "[PATCH v2 8/8] net/nfp: unify port create and destroy interface",
        "Date": "Fri, 19 Apr 2024 13:23:49 +0800",
        "Message-Id": "<20240419052349.1294696-9-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20240419052349.1294696-1-chaoyong.he@corigine.com>",
        "References": "<20240419031226.1191069-1-chaoyong.he@corigine.com>\n <20240419052349.1294696-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "SG2PR03CA0087.apcprd03.prod.outlook.com\n (2603:1096:4:7c::15) To SJ0PR13MB5545.namprd13.prod.outlook.com\n (2603:10b6:a03:424::5)",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "SJ0PR13MB5545:EE_|MW3PR13MB3961:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "17a25d86-db1e-486b-ae1a-08dc6031009c",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n RirRFPOCUU0fbPvJK8araBgl4+K6MgOkOHPSYaYbycTXFHWaPCdCCpRf5pn5T0+6tUiMeu2wKifu4+vDuqmkMKRCuHtSFzLax7KSI0f2noUMcV0LF2lAKk+vR2oACBrncI1pVaslfZjxlExP8T+NG4l8IEx29pqvgMI09aYZzOG7ZrgZMT5zwrC0LJqjaJ1awN+XI5qwmGwRv5AGJzIDIRmrIalTV5ocO3A0F6qzNLYiF6U0JObv3hApjugvjz/dsQ0E2zKGd2jRz128ZZ95nZiL59Ir2O0A8el2kbXW8ZrukaRgjkTQATr+jF8YmPx+ZBwLu69F8dkygnDUnIIXZl9lK6PHqh0iAieeSQ7s/GaVnJogTmaiL81lYz+wvQ7TKSBOX8h9vJTyjfrd1ThA0aWvGr76VR809BVsg8L2/qbmi6Mkvd6f/0Rq7Rs1zWSqvjLRCPneB3+bfz+P3AQPPbjQZzXkk33ej1HqMJmy23iKwQAC7nUI0R8mjI+Wng+q3X7IOLGjiA8nPrc+vm0XcejJClsSc3cOMIOS7Ob9O3w6nJOcbc6a88dB5oWKXsoRc7WyLfHW5AmiffMLz6lOFhVofyQ7BvTYocoIfCf/NDsgj3PDues756hVQkf9+KZ9v871rDAxNuc5Q6QZPSdfq4+UA7AuFO7k5bEc22ZEHWm4R69UWnr4PAIDt1Zsj0eM9SYnxg107CEZC1X89223e58lPY5jH90meQcHAOU1jaazNcMUakyZwHPnCiDYfKUKtTAEN3aClJiWVoxbe0jQcLnNJqvlAYSivm4LS/a7jfjSGkJtwWc0r2NIefgxGXvrBBleOwGx5CENtmSAyYxodUPGB31EBRTaaWq3xN9urmzaYy/przFv959birESYDFdwcvWauBG+7ZCWDtUqzX6CQ0taICcwBjZcb0jO9EVVYdz70kHhXha2qvy6kXSufLUT3Omw2bepg4apS2iWIQzmunhPaBhWbvPXt6bqQTNAMowb0zstXW4njHaFA/Qx+IUMXRpgFDhOeINPOew50owjS3UCjl204mFBGuiJOebGDiW8YHNHHEp2nqX7ofPPjkKLUJqlSSvpLxvpf2+fiyqP6Goonw571qCY9wOZVTqYiPSOpd4rHCUanQt43Pl9o3uL6U/Ol5J6Vov3tsLS0v/kRiX74u26CuUhp2atgaO/u4Wxg653yU9/RTWJc4niqH/pS6r+/faVZBUpu93V6zk4hH9eBcFi40om8WXw90refAaClFTKw6GjnNXiFvPfXTpBKjeJwCfbcQeCyWr6e8GsbGOVvvCG+JJuEGPYe5CVDlgqeBTOWaw7qQUswUQYhoh3fT/v0y6MHPq6eDMSedTsg==",
        "X-Forefront-Antispam-Report": "CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:SJ0PR13MB5545.namprd13.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230031)(52116005)(1800799015)(366007)(376005)(38350700005); DIR:OUT;\n SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n lpIffk0KYBf9Z0iWxUWd67dIy57EnndygzaQ40AJtJYo3N4+MgX0mwLim7N1DcD5BArGbgsaVFp/Sic54FXKDwXgE9K6mamEF4lMZy1zZj2DtsSRZhmP0qp1dC+uVM/i2jTnPCKNChbWs6Hm7RWlyi0YqCXZBS6OQxWQE//TrPMTp75zTP/mN3HXLdz1hyZJxJD1ywn3KCToO0qIL8PGCO39XWLo284AeDBPPLi5usO1EnzPtL2L31YQ79f4tERGJ4gO86zWYCZZ4wVFIhViQFkomYWLFHcjc6CCs9owZPcmgkcaZHqqzGuJXu/cwzWJUGFbzoliW3/0prPqczcBLrBt31g0Zta7UN54Dl/u/XK8A3MhfvyPgPIZGbL4HLXatZu0MageZBOwWkW8MTTqCtH8Sx+vz45ZnO5gsgRRgaBqznZZQ/60IMXrZzgw5T5XuOo4MhtBzAA1LFWP+GKjjvjxHHGZxkb3J8y5onhRCOnYk2PwfCRz1OEVYG79yiwqOzDrHRJbTsZMMQUOa37nvhfa8/P0/poCzT3fAGT+0tQi+EwIaZkYzzXNoRnQmFzcZXBIQ5quzFM1Gezkvmid/dAf+6HG2u5SZWUqs/v6kLRIDOIupYeQ67daElHlJA0DHCJh8XJypAz7tow843jscQznd7bog99kw7iGHRvxP9EtlLxUJX0RL3af3oZgLPa6eDjFHZX8OcnwbXryrnIdfLsEPq3xLJlWSGK03uQXXFoL4JfcPh01iOXbihYH7D86jcgyPVyjeZFGjm9H3fWcgzs/6hDoe1AkDTDYTFaZL/d/oCV1yxpiexMhRTAVurqhP0Wd8uzPn5fbeGCHsNVL8ox0MHflPDYexNBWzIpUm6w21SqtshRJAvB9js8ke8Pj0FVlUfrKwB6mduGa/jZcTYTncnWjPrO0wSb6OJV1EdWPsZJHT14OoQvONW7CrLuSXYWMZAVB+HScQCaA6zPMi8Qn6Le0GeKuXsF1/lD4smZ2Z04jCDqFe83cyM/Xvoq0lqbHEoZNnD69syVmCZhzum5dy+7bcBi0rCh/cmmm2UEgb+EZsu8BTA1tNMNgY/+e+NCSFUJBo6qkKQfSqDHOMYH9ixQ8pYne0K9zBvdCrjwAXlkjb8vLhSm/PPk0qD66MkCJmvkAy+24aERkO3hoQ3Hv+y48fljTKij2i+oGs4nBXFFKK+T8K1kfOdTzA6mgs2BXmJhq2v43UiYk+2ZjoBqd2l7yUlAjzpa3ufcnHw/kOvH2g3rJWvCmKcrX9G518rgHJafnXKPX646t1RD31CHqrZF9/ugt2NwfzO9E8dzpFdVLE6/QHtH2ASMN0hj7azFT7QZtkOJYCoSOFXe1n/sYdS98R9L2vXd6ib/om/4G5xAo9Tp/vnnGKIYUznpbUn7vHnLvpQjEQCxR6ItyxO7Net75s6cdrszKjpH2INh7OKn5CVqMi6bZnKM/O2924KMnrT2HwUXDetU0KVb7Ti6ArkUmRLSVBov+3O5GL5iHm71Tvzi9F5n5fxn4sUNkS5DJS/tEaKa1w+3M+Bl0Gwj51FLj0/axvf9wmSxZB8I9XYtjjIqw7OjCQLDFZEgmfkbv9+flG0OgnCMxj0EiAw==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 17a25d86-db1e-486b-ae1a-08dc6031009c",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "19 Apr 2024 05:24:37.2831 (UTC)",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "fe128f2c-073b-4c20-818e-7246a585940c",
        "X-MS-Exchange-CrossTenant-MailboxType": "HOSTED",
        "X-MS-Exchange-CrossTenant-UserPrincipalName": "\n kMHenpOPv3lYZXFxJB010iPrpQHEclSmWe0XC5+u5of85U3Egz+ZrUfh/p/xOj5TYk+U4BoOza74hEbmivrxs49IuUUhVcORShbBwFd1L80=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MW3PR13MB3961",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <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 <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "The interface 'rte_eth_dev_create()' and 'rte_eth_dev_destroy()' are\navailable for both primary and secondary process.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nSigned-off-by: Long Wu <long.wu@corigine.com>\nReviewed-by: Peng Zhang <peng.zhang@corigine.com>\n---\n drivers/net/nfp/flower/nfp_flower.c           |  31 +++--\n .../net/nfp/flower/nfp_flower_representor.c   |  18 +--\n drivers/net/nfp/nfp_ethdev.c                  | 112 +++++++++---------\n 3 files changed, 80 insertions(+), 81 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex 76e5d674f1..0edebd574a 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -798,25 +798,36 @@ nfp_uninit_app_fw_flower(struct nfp_net_hw_priv *hw_priv)\n \trte_free(app_fw_flower);\n }\n \n+static int\n+nfp_secondary_flower_init(struct rte_eth_dev *eth_dev,\n+\t\tvoid *para)\n+{\n+\teth_dev->process_private = para;\n+\teth_dev->dev_ops = &nfp_flower_pf_vnic_ops;\n+\teth_dev->rx_pkt_burst = nfp_net_recv_pkts;\n+\teth_dev->tx_pkt_burst = nfp_flower_pf_xmit_pkts;\n+\n+\treturn 0;\n+}\n+\n int\n nfp_secondary_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv)\n {\n-\tstruct rte_eth_dev *eth_dev;\n-\tconst char *port_name = \"pf_vnic_eth_dev\";\n+\tint ret;\n+\tconst char *pci_name;\n+\tchar port_name[RTE_ETH_NAME_MAX_LEN];\n+\n+\tpci_name = strchr(hw_priv->pf_dev->pci_dev->name, ':') + 1;\n+\tsnprintf(port_name, RTE_ETH_NAME_MAX_LEN, \"%s_repr_pf\", pci_name);\n \n \tPMD_INIT_LOG(DEBUG, \"Secondary attaching to port %s\", port_name);\n \n-\teth_dev = rte_eth_dev_attach_secondary(port_name);\n-\tif (eth_dev == NULL) {\n+\tret = rte_eth_dev_create(&hw_priv->pf_dev->pci_dev->device, port_name, 0, NULL,\n+\t\t\tNULL, nfp_secondary_flower_init, hw_priv);\n+\tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Secondary process attach to port %s failed\", port_name);\n \t\treturn -ENODEV;\n \t}\n \n-\teth_dev->process_private = hw_priv;\n-\teth_dev->dev_ops = &nfp_flower_pf_vnic_ops;\n-\teth_dev->rx_pkt_burst = nfp_net_recv_pkts;\n-\teth_dev->tx_pkt_burst = nfp_flower_pf_xmit_pkts;\n-\trte_eth_dev_probing_finish(eth_dev);\n-\n \treturn 0;\n }\ndiff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c\nindex 60f02ad919..f9001ab1f0 100644\n--- a/drivers/net/nfp/flower/nfp_flower_representor.c\n+++ b/drivers/net/nfp/flower/nfp_flower_representor.c\n@@ -683,10 +683,8 @@ nfp_flower_repr_free_all(struct nfp_app_fw_flower *app_fw_flower)\n \t\trepr = app_fw_flower->vf_reprs[i];\n \t\tif (repr != NULL) {\n \t\t\teth_dev = rte_eth_dev_get_by_name(repr->name);\n-\t\t\tif (eth_dev != NULL) {\n-\t\t\t\tnfp_flower_repr_free(eth_dev, NFP_REPR_TYPE_VF);\n-\t\t\t\tapp_fw_flower->vf_reprs[i] = NULL;\n-\t\t\t}\n+\t\t\tif (eth_dev != NULL)\n+\t\t\t\trte_eth_dev_destroy(eth_dev, nfp_flower_repr_uninit);\n \t\t}\n \t}\n \n@@ -694,20 +692,16 @@ nfp_flower_repr_free_all(struct nfp_app_fw_flower *app_fw_flower)\n \t\trepr = app_fw_flower->phy_reprs[i];\n \t\tif (repr != NULL) {\n \t\t\teth_dev = rte_eth_dev_get_by_name(repr->name);\n-\t\t\tif (eth_dev != NULL) {\n-\t\t\t\tnfp_flower_repr_free(eth_dev, NFP_REPR_TYPE_PHYS_PORT);\n-\t\t\t\tapp_fw_flower->phy_reprs[i] = NULL;\n-\t\t\t}\n+\t\t\tif (eth_dev != NULL)\n+\t\t\t\trte_eth_dev_destroy(eth_dev, nfp_flower_repr_uninit);\n \t\t}\n \t}\n \n \trepr = app_fw_flower->pf_repr;\n \tif (repr != NULL) {\n \t\teth_dev = rte_eth_dev_get_by_name(repr->name);\n-\t\tif (eth_dev != NULL) {\n-\t\t\tnfp_flower_repr_free(eth_dev, NFP_REPR_TYPE_PF);\n-\t\t\tapp_fw_flower->pf_repr = NULL;\n-\t\t}\n+\t\tif (eth_dev != NULL)\n+\t\t\trte_eth_dev_destroy(eth_dev, nfp_flower_pf_repr_uninit);\n \t}\n }\n \ndiff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex d450c9472e..cdc946faff 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -34,6 +34,16 @@\n #define NFP_PF_DRIVER_NAME net_nfp_pf\n #define NFP_PF_FORCE_RELOAD_FW   \"force_reload_fw\"\n \n+struct nfp_net_init {\n+\t/** Sequential physical port number, only valid for CoreNIC firmware */\n+\tuint8_t idx;\n+\n+\t/** Internal port number as seen from NFP */\n+\tuint8_t nfp_idx;\n+\n+\tstruct nfp_net_hw_priv *hw_priv;\n+};\n+\n static int\n nfp_devarg_handle_int(const char *key,\n \t\tconst char *value,\n@@ -559,7 +569,7 @@ nfp_net_keepalive_stop(struct nfp_multi_pf *multi_pf)\n \trte_eal_alarm_cancel(nfp_net_beat_timer, (void *)multi_pf);\n }\n \n-static void\n+static int\n nfp_net_uninit(struct rte_eth_dev *eth_dev)\n {\n \tstruct nfp_net_hw *net_hw;\n@@ -577,6 +587,8 @@ nfp_net_uninit(struct rte_eth_dev *eth_dev)\n \tnfp_ipsec_uninit(eth_dev);\n \tif (net_hw->mac_stats_area != NULL)\n \t\tnfp_cpp_area_release_free(net_hw->mac_stats_area);\n+\n+\treturn 0;\n }\n \n static void\n@@ -875,7 +887,8 @@ nfp_net_ethdev_ops_mount(struct nfp_net_hw *hw,\n }\n \n static int\n-nfp_net_init(struct rte_eth_dev *eth_dev)\n+nfp_net_init(struct rte_eth_dev *eth_dev,\n+\t\tvoid *para)\n {\n \tint err;\n \tuint16_t port;\n@@ -884,6 +897,7 @@ nfp_net_init(struct rte_eth_dev *eth_dev)\n \tstruct nfp_hw *hw;\n \tstruct nfp_net_hw *net_hw;\n \tstruct nfp_pf_dev *pf_dev;\n+\tstruct nfp_net_init *hw_init;\n \tstruct rte_pci_device *pci_dev;\n \tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_app_fw_nic *app_fw_nic;\n@@ -891,6 +905,11 @@ nfp_net_init(struct rte_eth_dev *eth_dev)\n \tpci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n \tnet_hw = eth_dev->data->dev_private;\n \n+\thw_init = para;\n+\tnet_hw->idx      = hw_init->idx;\n+\tnet_hw->nfp_idx  = hw_init->nfp_idx;\n+\teth_dev->process_private = hw_init->hw_priv;\n+\n \t/* Use backpointer here to the PF of this eth_dev */\n \thw_priv = eth_dev->process_private;\n \tpf_dev = hw_priv->pf_dev;\n@@ -898,7 +917,10 @@ nfp_net_init(struct rte_eth_dev *eth_dev)\n \t/* Use backpointer to the CoreNIC app struct */\n \tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(pf_dev->app_fw_priv);\n \n-\tport = ((struct nfp_net_hw *)eth_dev->data->dev_private)->idx;\n+\t/* Add this device to the PF's array of physical ports */\n+\tapp_fw_nic->ports[net_hw->idx] = net_hw;\n+\n+\tport = net_hw->idx;\n \tif (port > 7) {\n \t\tPMD_DRV_LOG(ERR, \"Port value is wrong\");\n \t\treturn -ENODEV;\n@@ -1475,15 +1497,15 @@ nfp_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n \tuint8_t id;\n \tint ret = 0;\n \tuint32_t total_vnics;\n-\tstruct nfp_net_hw *hw;\n-\tunsigned int numa_node;\n-\tstruct rte_eth_dev *eth_dev;\n \tstruct nfp_app_fw_nic *app_fw_nic;\n \tstruct nfp_eth_table *nfp_eth_table;\n \tchar bar_name[RTE_ETH_NAME_MAX_LEN];\n \tchar port_name[RTE_ETH_NAME_MAX_LEN];\n \tchar vnic_name[RTE_ETH_NAME_MAX_LEN];\n \tstruct nfp_pf_dev *pf_dev = hw_priv->pf_dev;\n+\tstruct nfp_net_init hw_init = {\n+\t\t.hw_priv = hw_priv,\n+\t};\n \n \tnfp_eth_table = pf_dev->nfp_eth_table;\n \tPMD_INIT_LOG(INFO, \"Total physical ports: %d\", nfp_eth_table->count);\n@@ -1543,7 +1565,6 @@ nfp_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n \tPMD_INIT_LOG(DEBUG, \"ctrl bar: %p\", pf_dev->ctrl_bar);\n \n \t/* Loop through all physical ports on PF */\n-\tnuma_node = rte_socket_id();\n \tfor (i = 0; i < app_fw_nic->total_phyports; i++) {\n \t\tif (pf_dev->multi_pf.enabled)\n \t\t\tsnprintf(port_name, sizeof(port_name), \"%s\",\n@@ -1552,46 +1573,14 @@ nfp_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n \t\t\tsnprintf(port_name, sizeof(port_name), \"%s_port%u\",\n \t\t\t\t\tpf_dev->pci_dev->device.name, i);\n \n-\t\t/* Allocate a eth_dev for this phyport */\n-\t\teth_dev = rte_eth_dev_allocate(port_name);\n-\t\tif (eth_dev == NULL) {\n-\t\t\tret = -ENODEV;\n-\t\t\tgoto port_cleanup;\n-\t\t}\n-\n-\t\t/* Allocate memory for this phyport */\n-\t\teth_dev->data->dev_private = rte_zmalloc_socket(port_name,\n-\t\t\t\tsizeof(struct nfp_net_hw),\n-\t\t\t\tRTE_CACHE_LINE_SIZE, numa_node);\n-\t\tif (eth_dev->data->dev_private == NULL) {\n-\t\t\tret = -ENOMEM;\n-\t\t\trte_eth_dev_release_port(eth_dev);\n-\t\t\tgoto port_cleanup;\n-\t\t}\n-\n-\t\thw = eth_dev->data->dev_private;\n \t\tid = nfp_function_id_get(pf_dev, i);\n-\n-\t\t/* Add this device to the PF's array of physical ports */\n-\t\tapp_fw_nic->ports[id] = hw;\n-\n-\t\thw->idx = id;\n-\t\thw->nfp_idx = nfp_eth_table->ports[id].index;\n-\n-\t\teth_dev->device = &pf_dev->pci_dev->device;\n-\t\teth_dev->process_private = hw_priv;\n-\n-\t\t/*\n-\t\t * Ctrl/tx/rx BAR mappings and remaining init happens in\n-\t\t * @nfp_net_init()\n-\t\t */\n-\t\tret = nfp_net_init(eth_dev);\n-\t\tif (ret != 0) {\n-\t\t\tret = -ENODEV;\n+\t\thw_init.idx = id;\n+\t\thw_init.nfp_idx = nfp_eth_table->ports[id].index;\n+\t\tret = rte_eth_dev_create(&pf_dev->pci_dev->device, port_name,\n+\t\t\t\tsizeof(struct nfp_net_hw), NULL, NULL,\n+\t\t\t\tnfp_net_init, &hw_init);\n+\t\tif (ret != 0)\n \t\t\tgoto port_cleanup;\n-\t\t}\n-\n-\t\trte_eth_dev_probing_finish(eth_dev);\n \n \t} /* End loop, all ports on this PF */\n \n@@ -1608,10 +1597,8 @@ nfp_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n \t\t\tsnprintf(port_name, sizeof(port_name), \"%s_port%u\",\n \t\t\t\t\tpf_dev->pci_dev->device.name, i);\n \t\teth_dev = rte_eth_dev_get_by_name(port_name);\n-\t\tif (eth_dev != NULL) {\n-\t\t\tnfp_net_uninit(eth_dev);\n-\t\t\trte_eth_dev_release_port(eth_dev);\n-\t\t}\n+\t\tif (eth_dev != NULL)\n+\t\t\trte_eth_dev_destroy(eth_dev, nfp_net_uninit);\n \t}\n \tnfp_cpp_area_release_free(pf_dev->ctrl_area);\n app_cleanup:\n@@ -2012,6 +1999,20 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \treturn ret;\n }\n \n+static int\n+nfp_secondary_net_init(struct rte_eth_dev *eth_dev,\n+\t\tvoid *para)\n+{\n+\tstruct nfp_net_hw *net_hw;\n+\n+\tnet_hw = eth_dev->data->dev_private;\n+\tnfp_net_ethdev_ops_mount(net_hw, eth_dev);\n+\n+\teth_dev->process_private = para;\n+\n+\treturn 0;\n+}\n+\n static int\n nfp_secondary_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n {\n@@ -2020,7 +2021,6 @@ nfp_secondary_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n \tint ret = 0;\n \tuint8_t function_id;\n \tuint32_t total_vnics;\n-\tstruct nfp_net_hw *hw;\n \tchar pf_name[RTE_ETH_NAME_MAX_LEN];\n \tstruct nfp_pf_dev *pf_dev = hw_priv->pf_dev;\n \n@@ -2034,7 +2034,6 @@ nfp_secondary_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n \t}\n \n \tfor (i = 0; i < total_vnics; i++) {\n-\t\tstruct rte_eth_dev *eth_dev;\n \t\tchar port_name[RTE_ETH_NAME_MAX_LEN];\n \n \t\tif (nfp_check_multi_pf_from_fw(total_vnics))\n@@ -2045,18 +2044,13 @@ nfp_secondary_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n \t\t\t\t\tpf_dev->pci_dev->device.name, i);\n \n \t\tPMD_INIT_LOG(DEBUG, \"Secondary attaching to port %s\", port_name);\n-\t\teth_dev = rte_eth_dev_attach_secondary(port_name);\n-\t\tif (eth_dev == NULL) {\n+\t\tret = rte_eth_dev_create(&pf_dev->pci_dev->device, port_name, 0,\n+\t\t\t\tNULL, NULL, nfp_secondary_net_init, hw_priv);\n+\t\tif (ret != 0) {\n \t\t\tPMD_INIT_LOG(ERR, \"Secondary process attach to port %s failed\", port_name);\n \t\t\tret = -ENODEV;\n \t\t\tbreak;\n \t\t}\n-\n-\t\teth_dev->process_private = hw_priv;\n-\t\thw = eth_dev->data->dev_private;\n-\t\tnfp_net_ethdev_ops_mount(hw, eth_dev);\n-\n-\t\trte_eth_dev_probing_finish(eth_dev);\n \t}\n \n \treturn ret;\n",
    "prefixes": [
        "v2",
        "8/8"
    ]
}