get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 133755,
    "url": "http://patchwork.dpdk.org/api/patches/133755/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20231102022321.2254224-9-chaoyong.he@corigine.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20231102022321.2254224-9-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20231102022321.2254224-9-chaoyong.he@corigine.com",
    "date": "2023-11-02T02:23:18",
    "name": "[08/11] net/nfp: add PF ID used to format symbols",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "912e8a3862535ec09dccac3180112286f000f38e",
    "submitter": {
        "id": 2554,
        "url": "http://patchwork.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.com"
    },
    "delegate": {
        "id": 319,
        "url": "http://patchwork.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20231102022321.2254224-9-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 30106,
            "url": "http://patchwork.dpdk.org/api/series/30106/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=30106",
            "date": "2023-11-02T02:23:10",
            "name": "Add the support of multiple PF",
            "version": 1,
            "mbox": "http://patchwork.dpdk.org/series/30106/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/133755/comments/",
    "check": "warning",
    "checks": "http://patchwork.dpdk.org/api/patches/133755/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 C6FF643267;\n\tThu,  2 Nov 2023 03:24:53 +0100 (CET)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 69CB642E7D;\n\tThu,  2 Nov 2023 03:24:04 +0100 (CET)",
            "from NAM11-CO1-obe.outbound.protection.outlook.com\n (mail-co1nam11on2099.outbound.protection.outlook.com [40.107.220.99])\n by mails.dpdk.org (Postfix) with ESMTP id B152742E4A\n for <dev@dpdk.org>; Thu,  2 Nov 2023 03:24:02 +0100 (CET)",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com (2603:10b6:a03:424::5)\n by MN2PR13MB3709.namprd13.prod.outlook.com (2603:10b6:208:1e1::12)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6954.19; Thu, 2 Nov\n 2023 02:23:59 +0000",
            "from SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::45b3:d83c:cff2:4a1b]) by SJ0PR13MB5545.namprd13.prod.outlook.com\n ([fe80::45b3:d83c:cff2:4a1b%6]) with mapi id 15.20.6933.027; Thu, 2 Nov 2023\n 02:23:58 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=GfmiWwd4HhiQI/6mg67PSyXHO+udfm+DN5Qn2J51LVF7IlV5X6GW8wpOTtUKMZaNcWYjBGQbL+7T1mSW0ZXJrh0CJ3Bq56+1kiCzQCsRqh5SlEcS2LaQMJSVL+npKvE0APzM6g0tTTVgcFszjHGAMReVUASLS8wTFXNrOCdcdq6IxM/0GoUQPvflgaw8zIpiMVz6O3MoPsuSWU5IpUcxGuxY10UwLfszZocxr22iYarLbHFSSjk79ASgXoEivrRHweh3ZO8gMOd9q2bJexDhdxo5ccznN0QB/AXWgAYLSeRK8ZeAF0cjGKYeXi1sV7Z2o+QkBxZtlUKrNC6gKXOyPA==",
        "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=OvE+jpu0eyxnZ5Ui0q8Z/449F4fN9BB/F1hTanw5QmU=;\n b=N4klC75u7zQFagixdewDneGGYSo+QieRIl1XrWmR8D2p+awYH/McoFwbqanNgwZx49M9eznNX9aCZ1IjquiCqo/yaUroXhP0W5enBUiCTze6Xg9BpLB27R4gnIa9W6TLcWvrtLk0VNQU1L+UteHMzaTi4LeBCoytuB8wIDcyBL4waSj0CKEUqu45qAZM32zbobAxp8HmutGggOKyRMp3IEMLBNS568f7h2EEI6TvA+8I150RZ/6CZdfvH/+tPMZCxc0XysrabhuCuzJpVpP7ZklIQMDyCcVZzweBTanVw7CRkB2h8HrqE5Hn0JVeR7wz9tNkDl3X0F386tK2H1EpLw==",
        "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=OvE+jpu0eyxnZ5Ui0q8Z/449F4fN9BB/F1hTanw5QmU=;\n b=WLiS/JvEmE2kJuN87iD+wTladmWdtDbzV708ZMVlBnqsVABRLlDP946Ctjq/ZADKsW1pq8XtEbaAm4fwVb258mPi7o2aZ/iOZmXkgvgdfS5uoHJa2fINTq8x1+m7SoB7fL+fFgmi6BkjMQD+xGpINY5ACj7uzTP8cAPvBxSbat8=",
        "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, Peng Zhang <peng.zhang@corigine.com>,\n Chaoyong He <chaoyong.he@corigine.com>, Long Wu <long.wu@corigine.com>",
        "Subject": "[PATCH 08/11] net/nfp: add PF ID used to format symbols",
        "Date": "Thu,  2 Nov 2023 10:23:18 +0800",
        "Message-Id": "<20231102022321.2254224-9-chaoyong.he@corigine.com>",
        "X-Mailer": "git-send-email 2.39.1",
        "In-Reply-To": "<20231102022321.2254224-1-chaoyong.he@corigine.com>",
        "References": "<20231102022321.2254224-1-chaoyong.he@corigine.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "BY5PR20CA0030.namprd20.prod.outlook.com\n (2603:10b6:a03:1f4::43) 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_|MN2PR13MB3709:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "fcb12e2e-0dd9-4142-2cdc-08dbdb4ac52f",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n d7DI23Rup4JVodYh3+Wowj6eGVZsylcKE1Q0c774kWs+mCRwPX7+9vqlMM7YeERU5UgEfA7W9D17MW8lxSKBinYkn31FX/uaBUnY2k7luJ8NOJHFBMdLzF4G0COW1QRQawDrHGyng/Yw6xKKrfWqfaMkNO76q8eOJiBsS9jfBmSxl/fuW4nKs9uxuKNdf20g3OrxvhVHQbvYPm9kbG/gq52py6zi8o3nfr2mFhbXDtl3iJNaD+3+WIZh+SlsAZ9LJlCf33LcvGzB4+aieyTTa3R8NzTtAARVStVZLaBiGR9GcsmMqB44gbpFDV/WrSmNmguKYpEpPen9fmrpgoVh2iuQmJiBzSfxBGg1V+Sndinnik60Q+A5RTS1XQwnpd5By9US9b4RBuuScwgHsD8jwK2P8zM8BqT9GqahlnzT18+fO18YFwcYg/kKY97pgGSWQDwLd4mjeONFUmqsxPc9MRn5Z8HllUQ29khhjR+rHneuJq6Qr6+Wsp/x3PGjUa1+N7OT851B/Hv63IHDBWDivGx1jYvkjVa2x8uKdGi3AZ2OGgTryXZaMEQg11KEsfXmg4mNxA2ZHwLDsHBlkLGt0QPZsdFBi1CpUShRzz/HS2XRNc30HJI9onNnokKS/yHSQrb1uIVuRq6yUhkyJAWV8ecS75gdHXQkv1BKesmUCs0=",
        "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)(346002)(136003)(376002)(366004)(39840400004)(396003)(230922051799003)(186009)(1800799009)(64100799003)(451199024)(38350700005)(478600001)(52116002)(36756003)(6486002)(6506007)(107886003)(38100700002)(83380400001)(41300700001)(6666004)(4326008)(8676002)(8936002)(2616005)(44832011)(30864003)(2906002)(316002)(1076003)(6916009)(86362001)(26005)(66946007)(54906003)(6512007)(66556008)(66476007)(5660300002);\n DIR:OUT; SFP:1102;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n T49UbHMQ0rCvVcwMTS/U0X2odJbny8DTCfTTVTkIjLuK+0acYmLV1IONYwRWItUoX2qMS+EUX7uQzDxGrYgD8uqp+stwo9Or8bjRbbFR4vDbbdNjGo+kCg7UEXiHPqaPLJ7jtu5qzn/oahTOgI0n51Q59sEsDMmcjEcGs55rGaeuUPCs8wa69YD0R4aByh14XN7Np9LPdpekOoErkp1ccwpVOAxP/Unwi9s/awFIV5lCvewZakoNj6ErZBqcUs1ZwXvoJc3WGcJGut+WuXXJUeTCnMy8X9oskVcSRBlu1hvSDwh+oPmCL90LRvok6hr6e0tZNq7F6UpZkqBITGY8m+i4RrAw1ze8Hlg0Px5SDsqxNZ78DIc/TJBAQJyO5gw3GSDzpADkhbZZbZV63TMtvceq12ly6zU98qVQgCHDrmizxGoC45X7S0rtIvlV0lYnGv/BvaEgg3G1rCYJKyXUvU1s4p0JNA6kGUjzTMXzXMuTJb/rDW5hppE+a7rui4k0hAke9XrCqNYYq/uBzi9+6cULK6fuD8/RoWn9o94pSNZ9gO/HsjxHKKgxPiuuPTmhJE5yyAMBplovgllVDjaRs4R/AYnT8KPZRrr+uOGIe2vXB9E9mVRkk3zl1hVky663PKeeeSOw0j51FP1ucJmVAWTTEgGve1V5u2ZftzApbfH45R8UPe9V4tDwS9eAyPE5QgQ/BDJrVbbGS3lL5VbKyxSau2pnK0RmLklHM0nSU0qA+1hiarkaaMhlBElfydARoJDQipTAGncx6y0BDtYkpJzMUmH7N0faa2mcgmb58R44HYb5MkXET9qsI6LwwDHnQ789TrxSV53HsNP55veCVd/PaamH0AeAkxTepzk20jwLl6yU/Tjtf5FWDu8ctFyD0uib4eg6hcZEnVvVXkQUffGkmFjQaCVx6F7S1Uzw1qL3E51IKvmqzK0ieENoTb+F9uaqD3r6WJstNl39hAolcik6Q8RsWUkxVsloBw0o4At+cldQ09QX0/l8wFqaxltlOf3TfRdIEBQvtiaA+uNVBlxL07cEsLBQ1S5a/89OyLdG4IK+hfNKfGCYMF1b4mGlqWjQKX2sh4TuztOvhfoWrkgoI7gHxMkkATGp4HgMsaLiTgdxUy+eL/MGKlUzy2OCzvBBD37b6ZIhlJHvS0YtnOu742HJCEInW6jPfb2Fq6WLjOAaxPcDprIpRjgFj7en1qC5R4/MGNu0HoqREya6FzW7VvNx5StLV+ZNaO9Gq/mGJc8cg4GJ+TtQUlxKWxWXnmf5aDjXmd9CRWXKfMC0G8kMMxn16d32C7VVVkdL9rqHk51ZYyxPywZqrS61LzyH8yKNBXAwCDjOZ9i3/oQ0AZ8vLl1ZR8QVKWvHNjNZOelm5MoBflQkcIOOZsKuPLzWJGty6yNlnV52RihgtMYH9Q7u8j/JuqCQPjqUtfu0wAQ7G6BeZGk8a1u2f7uCpPLJvUF5jhUr8+4L18IfwUeyXKGPAreAsSKzq6hUWgbiUxMRovbepPUtyPCqvGWZwvefFN3fB6kAA6d1/qzDIxoLMaKouKnZXyjdTd5lEYuWkYlfhMH101fpi6uhPmE2hnApxJ1FLuWlY59HM02am2VrlQ==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n fcb12e2e-0dd9-4142-2cdc-08dbdb4ac52f",
        "X-MS-Exchange-CrossTenant-AuthSource": "SJ0PR13MB5545.namprd13.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "02 Nov 2023 02:23:58.8154 (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 lGOcEb5YXuqpQFp+KtePVjNYDJlzvQZm9gv6/pdCECCQV3MbILYBekNl8LvjbtqAS2h9JRjpESM4FHZLqBTydv+qzIhgMSPnz9ZAkUayYjc=",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "MN2PR13MB3709",
        "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": "From: Peng Zhang <peng.zhang@corigine.com>\n\nIn single PF scenario, the format symbols just is related\nwith PF ID 0. In multiple PF scenario, the format symbols\nshould be related with PF ID. So this commit adds the\nPF ID used to format symbols.\n\nSigned-off-by: Peng Zhang <peng.zhang@corigine.com>\nReviewed-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Long Wu <long.wu@corigine.com>\n---\n drivers/net/nfp/nfp_ethdev.c     | 109 ++++++++++++++++++++++++-------\n drivers/net/nfp/nfp_net_common.h |   2 +\n 2 files changed, 86 insertions(+), 25 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex 9378a2ebc3..96f0ae3fe3 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -224,11 +224,22 @@ nfp_net_set_link_down(struct rte_eth_dev *dev)\n \t\treturn nfp_eth_set_configured(dev->process_private, hw->nfp_idx, 0);\n }\n \n+static uint8_t\n+nfp_function_id_get(const struct nfp_pf_dev *pf_dev,\n+\t\tuint8_t phy_port)\n+{\n+\tif (pf_dev->multi_pf.enabled)\n+\t\treturn pf_dev->multi_pf.function_id;\n+\n+\treturn phy_port;\n+}\n+\n /* Reset and stop device. The device can not be restarted. */\n static int\n nfp_net_close(struct rte_eth_dev *dev)\n {\n \tuint8_t i;\n+\tuint8_t id;\n \tstruct nfp_net_hw *hw;\n \tstruct nfp_pf_dev *pf_dev;\n \tstruct rte_pci_device *pci_dev;\n@@ -264,8 +275,10 @@ nfp_net_close(struct rte_eth_dev *dev)\n \tapp_fw_nic->ports[hw->idx] = NULL;\n \n \tfor (i = 0; i < app_fw_nic->total_phyports; i++) {\n+\t\tid = nfp_function_id_get(pf_dev, i);\n+\n \t\t/* Check to see if ports are still in use */\n-\t\tif (app_fw_nic->ports[i] != NULL)\n+\t\tif (app_fw_nic->ports[id] != NULL)\n \t\t\treturn 0;\n \t}\n \n@@ -667,6 +680,19 @@ nfp_fw_upload(struct rte_pci_device *dev,\n \treturn 0;\n }\n \n+static void\n+nfp_fw_unload(struct nfp_cpp *cpp)\n+{\n+\tstruct nfp_nsp *nsp;\n+\n+\tnsp = nfp_nsp_open(cpp);\n+\tif (nsp == NULL)\n+\t\treturn;\n+\n+\tnfp_nsp_device_soft_reset(nsp);\n+\tnfp_nsp_close(nsp);\n+}\n+\n static int\n nfp_fw_setup(struct rte_pci_device *dev,\n \t\tstruct nfp_cpp *cpp,\n@@ -751,6 +777,7 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\n \t\tconst struct nfp_dev_info *dev_info)\n {\n \tuint8_t i;\n+\tuint8_t id;\n \tint ret = 0;\n \tuint32_t total_vnics;\n \tstruct nfp_net_hw *hw;\n@@ -758,10 +785,13 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\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 \n \tnfp_eth_table = pf_dev->nfp_eth_table;\n \tPMD_INIT_LOG(INFO, \"Total physical ports: %d\", nfp_eth_table->count);\n+\tid = nfp_function_id_get(pf_dev, 0);\n \n \t/* Allocate memory for the CoreNIC app */\n \tapp_fw_nic = rte_zmalloc(\"nfp_app_fw_nic\", sizeof(*app_fw_nic), 0);\n@@ -772,9 +802,10 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\n \tpf_dev->app_fw_priv = app_fw_nic;\n \n \t/* Read the number of vNIC's created for the PF */\n-\ttotal_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, \"nfd_cfg_pf0_num_ports\", &ret);\n+\tsnprintf(vnic_name, sizeof(vnic_name), \"nfd_cfg_pf%u_num_ports\", id);\n+\ttotal_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, vnic_name, &ret);\n \tif (ret != 0 || total_vnics == 0 || total_vnics > 8) {\n-\t\tPMD_INIT_LOG(ERR, \"nfd_cfg_pf0_num_ports symbol with wrong value\");\n+\t\tPMD_INIT_LOG(ERR, \"%s symbol with wrong value\", vnic_name);\n \t\tret = -ENODEV;\n \t\tgoto app_cleanup;\n \t}\n@@ -804,11 +835,12 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\n \t\tapp_fw_nic->multiport = true;\n \n \t/* Map the symbol table */\n-\tpf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, \"_pf0_net_bar0\",\n+\tsnprintf(bar_name, sizeof(bar_name), \"_pf%u_net_bar0\", id);\n+\tpf_dev->ctrl_bar = nfp_rtsym_map(pf_dev->sym_tbl, bar_name,\n \t\t\tapp_fw_nic->total_phyports * NFP_NET_CFG_BAR_SZ,\n \t\t\t&pf_dev->ctrl_area);\n \tif (pf_dev->ctrl_bar == NULL) {\n-\t\tPMD_INIT_LOG(ERR, \"nfp_rtsym_map fails for _pf0_net_ctrl_bar\");\n+\t\tPMD_INIT_LOG(ERR, \"nfp_rtsym_map fails for %s\", bar_name);\n \t\tret = -EIO;\n \t\tgoto app_cleanup;\n \t}\n@@ -818,8 +850,9 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\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\tsnprintf(port_name, sizeof(port_name), \"%s_port%d\",\n-\t\t\t\tpf_dev->pci_dev->device.name, i);\n+\t\tid = nfp_function_id_get(pf_dev, i);\n+\t\tsnprintf(port_name, sizeof(port_name), \"%s_port%u\",\n+\t\t\t\tpf_dev->pci_dev->device.name, id);\n \n \t\t/* Allocate a eth_dev for this phyport */\n \t\teth_dev = rte_eth_dev_allocate(port_name);\n@@ -841,14 +874,14 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\n \t\thw = eth_dev->data->dev_private;\n \n \t\t/* Add this device to the PF's array of physical ports */\n-\t\tapp_fw_nic->ports[i] = hw;\n+\t\tapp_fw_nic->ports[id] = hw;\n \n \t\thw->dev_info = dev_info;\n \t\thw->pf_dev = pf_dev;\n \t\thw->cpp = pf_dev->cpp;\n \t\thw->eth_dev = eth_dev;\n-\t\thw->idx = i;\n-\t\thw->nfp_idx = nfp_eth_table->ports[i].index;\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 \n@@ -870,13 +903,15 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\n \n port_cleanup:\n \tfor (i = 0; i < app_fw_nic->total_phyports; i++) {\n-\t\tif (app_fw_nic->ports[i] != NULL &&\n-\t\t\t\tapp_fw_nic->ports[i]->eth_dev != NULL) {\n+\t\tid = nfp_function_id_get(pf_dev, i);\n+\n+\t\tif (app_fw_nic->ports[id] != NULL &&\n+\t\t\t\tapp_fw_nic->ports[id]->eth_dev != NULL) {\n \t\t\tstruct rte_eth_dev *tmp_dev;\n-\t\t\ttmp_dev = app_fw_nic->ports[i]->eth_dev;\n+\t\t\ttmp_dev = app_fw_nic->ports[id]->eth_dev;\n \t\t\tnfp_ipsec_uninit(tmp_dev);\n \t\t\trte_eth_dev_release_port(tmp_dev);\n-\t\t\tapp_fw_nic->ports[i] = NULL;\n+\t\t\tapp_fw_nic->ports[id] = NULL;\n \t\t}\n \t}\n \tnfp_cpp_area_free(pf_dev->ctrl_area);\n@@ -890,15 +925,19 @@ static int\n nfp_pf_init(struct rte_pci_device *pci_dev)\n {\n \tuint32_t i;\n+\tuint32_t id;\n \tint ret = 0;\n \tuint64_t addr;\n+\tuint32_t index;\n \tuint32_t cpp_id;\n+\tuint8_t function_id;\n \tstruct nfp_cpp *cpp;\n \tstruct nfp_pf_dev *pf_dev;\n \tstruct nfp_hwinfo *hwinfo;\n \tenum nfp_app_fw_id app_fw_id;\n \tchar name[RTE_ETH_NAME_MAX_LEN];\n \tstruct nfp_rtsym_table *sym_tbl;\n+\tchar app_name[RTE_ETH_NAME_MAX_LEN];\n \tstruct nfp_eth_table *nfp_eth_table;\n \tconst struct nfp_dev_info *dev_info;\n \n@@ -917,7 +956,8 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \t}\n \n \t/* Allocate memory for the PF \"device\" */\n-\tsnprintf(name, sizeof(name), \"nfp_pf%d\", 0);\n+\tfunction_id = (pci_dev->addr.function) & 0x07;\n+\tsnprintf(name, sizeof(name), \"nfp_pf%u\", function_id);\n \tpf_dev = rte_zmalloc(name, sizeof(*pf_dev), 0);\n \tif (pf_dev == NULL) {\n \t\tPMD_INIT_LOG(ERR, \"Can't allocate memory for the PF device\");\n@@ -958,10 +998,14 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \t}\n \n \tpf_dev->multi_pf.enabled = nfp_check_multi_pf_from_nsp(pci_dev, cpp);\n+\tpf_dev->multi_pf.function_id = function_id;\n \n \t/* Force the physical port down to clear the possible DMA error */\n-\tfor (i = 0; i < nfp_eth_table->count; i++)\n-\t\tnfp_eth_set_configured(cpp, nfp_eth_table->ports[i].index, 0);\n+\tfor (i = 0; i < nfp_eth_table->count; i++) {\n+\t\tid = nfp_function_id_get(pf_dev, i);\n+\t\tindex = nfp_eth_table->ports[id].index;\n+\t\tnfp_eth_set_configured(cpp, index, 0);\n+\t}\n \n \tif (nfp_fw_setup(pci_dev, cpp, nfp_eth_table, hwinfo) != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Error when uploading firmware\");\n@@ -974,13 +1018,14 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \tif (sym_tbl == NULL) {\n \t\tPMD_INIT_LOG(ERR, \"Something is wrong with the firmware symbol table\");\n \t\tret = -EIO;\n-\t\tgoto eth_table_cleanup;\n+\t\tgoto fw_cleanup;\n \t}\n \n \t/* Read the app ID of the firmware loaded */\n-\tapp_fw_id = nfp_rtsym_read_le(sym_tbl, \"_pf0_net_app_id\", &ret);\n+\tsnprintf(app_name, sizeof(app_name), \"_pf%u_net_app_id\", function_id);\n+\tapp_fw_id = nfp_rtsym_read_le(sym_tbl, app_name, &ret);\n \tif (ret != 0) {\n-\t\tPMD_INIT_LOG(ERR, \"Couldn't read app_fw_id from fw\");\n+\t\tPMD_INIT_LOG(ERR, \"Couldn't read %s from firmware\", app_name);\n \t\tret = -EIO;\n \t\tgoto sym_tbl_cleanup;\n \t}\n@@ -1045,6 +1090,8 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \tnfp_cpp_area_free(pf_dev->qc_area);\n sym_tbl_cleanup:\n \tfree(sym_tbl);\n+fw_cleanup:\n+\tnfp_fw_unload(cpp);\n eth_table_cleanup:\n \tfree(nfp_eth_table);\n hwinfo_cleanup:\n@@ -1063,21 +1110,29 @@ nfp_secondary_init_app_fw_nic(struct nfp_pf_dev *pf_dev)\n \tuint32_t i;\n \tint err = 0;\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 \n \t/* Read the number of vNIC's created for the PF */\n-\ttotal_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, \"nfd_cfg_pf0_num_ports\", &err);\n+\tfunction_id = (pf_dev->pci_dev->addr.function) & 0x07;\n+\tsnprintf(pf_name, sizeof(pf_name), \"nfd_cfg_pf%u_num_ports\", function_id);\n+\ttotal_vnics = nfp_rtsym_read_le(pf_dev->sym_tbl, pf_name, &err);\n \tif (err != 0 || total_vnics == 0 || total_vnics > 8) {\n-\t\tPMD_INIT_LOG(ERR, \"nfd_cfg_pf0_num_ports symbol with wrong value\");\n+\t\tPMD_INIT_LOG(ERR, \"%s symbol with wrong value\", pf_name);\n \t\treturn -ENODEV;\n \t}\n \n \tfor (i = 0; i < total_vnics; i++) {\n+\t\tuint32_t id = 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+\t\t\tid = function_id;\n \t\tsnprintf(port_name, sizeof(port_name), \"%s_port%u\",\n-\t\t\t\tpf_dev->pci_dev->device.name, i);\n+\t\t\t\tpf_dev->pci_dev->device.name, id);\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@@ -1107,11 +1162,13 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)\n {\n \tint ret = 0;\n \tstruct nfp_cpp *cpp;\n+\tuint8_t function_id;\n \tstruct nfp_pf_dev *pf_dev;\n \tenum nfp_app_fw_id app_fw_id;\n \tchar name[RTE_ETH_NAME_MAX_LEN];\n \tstruct nfp_rtsym_table *sym_tbl;\n \tconst struct nfp_dev_info *dev_info;\n+\tchar app_name[RTE_ETH_NAME_MAX_LEN];\n \n \tif (pci_dev == NULL)\n \t\treturn -ENODEV;\n@@ -1165,9 +1222,11 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)\n \t}\n \n \t/* Read the app ID of the firmware loaded */\n-\tapp_fw_id = nfp_rtsym_read_le(sym_tbl, \"_pf0_net_app_id\", &ret);\n+\tfunction_id = pci_dev->addr.function & 0x7;\n+\tsnprintf(app_name, sizeof(app_name), \"_pf%u_net_app_id\", function_id);\n+\tapp_fw_id = nfp_rtsym_read_le(sym_tbl, app_name, &ret);\n \tif (ret != 0) {\n-\t\tPMD_INIT_LOG(ERR, \"Couldn't read app_fw_id from fw\");\n+\t\tPMD_INIT_LOG(ERR, \"Couldn't read %s from fw\", app_name);\n \t\tret = -EIO;\n \t\tgoto sym_tbl_cleanup;\n \t}\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex bd0ed077c5..a40ddfd985 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -57,6 +57,8 @@ struct nfp_net_tlv_caps {\n struct nfp_multi_pf {\n \t/** Support multiple PF */\n \tbool enabled;\n+\t/** Function index */\n+\tuint8_t function_id;\n };\n \n struct nfp_pf_dev {\n",
    "prefixes": [
        "08/11"
    ]
}