get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 139529,
    "url": "http://patches.dpdk.org/api/patches/139529/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20240419052349.1294696-5-chaoyong.he@corigine.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": "<20240419052349.1294696-5-chaoyong.he@corigine.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20240419052349.1294696-5-chaoyong.he@corigine.com",
    "date": "2024-04-19T05:23:45",
    "name": "[v2,4/8] net/nfp: add the process private structure",
    "commit_ref": null,
    "pull_url": null,
    "state": "new",
    "archived": false,
    "hash": "474454bebdad2752e7bd439489e8e0eb3170d407",
    "submitter": {
        "id": 2554,
        "url": "http://patches.dpdk.org/api/people/2554/?format=api",
        "name": "Chaoyong He",
        "email": "chaoyong.he@corigine.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/20240419052349.1294696-5-chaoyong.he@corigine.com/mbox/",
    "series": [
        {
            "id": 31788,
            "url": "http://patches.dpdk.org/api/series/31788/?format=api",
            "web_url": "http://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": "http://patches.dpdk.org/series/31788/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/139529/comments/",
    "check": "success",
    "checks": "http://patches.dpdk.org/api/patches/139529/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 2A8E543EAA;\n\tFri, 19 Apr 2024 07:24:48 +0200 (CEST)",
            "from mails.dpdk.org (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 9025D40687;\n\tFri, 19 Apr 2024 07:24:25 +0200 (CEST)",
            "from NAM12-BN8-obe.outbound.protection.outlook.com\n (mail-bn8nam12on2139.outbound.protection.outlook.com [40.107.237.139])\n by mails.dpdk.org (Postfix) with ESMTP id D8B984067D\n for <dev@dpdk.org>; Fri, 19 Apr 2024 07:24:23 +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:21 +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:21 +0000"
        ],
        "ARC-Seal": "i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none;\n b=fACkwBtF0gVhNHtJvOwjl6Ca7cqrhyXvNwec7uz8YiNkGMQiKs9M4d/NeE7orDGirHoQh/F24Q+Q00RFngKBqLTIP9Md3tKDcqI2kboDAvqbKetNEZkjVx07l84Hw4DzRA6VTfXuLFa+NjT5LEXCDh41LZ/gfQP+knpiuCaDijw/u5maKgxvhw0kdY3toTy1SJDS0Cz9mhYwVj0icAs3jywoF9teUsPiyBYBNtqMvdAUxy7xJeAm8uQdlQJsiX6E1ey91RpptUh/sNNvCKmo6Fc2bIdM4i79QcoZUAyaZT/WJtQmWgVYGtVgPlUmumZC9vEh+H5nQR1WTMVoLhG8pg==",
        "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=m9z0HLs+2tklolyMEvOqp+KQX3ZpHdrnPqZyV/wmLB8=;\n b=CL3QU5A4IQsOs8L7KQVi2TWOuzvJnTT2EyCb0QZn8FMUdw8xgGJvo6/tYvdqOfwvqoTJZ0c3qtBNCSvnKTh3B0ZTnpgZgN7FxhwY2w8VBTZWsGPHNwsKplFte8+R2wWYDh2ELSni52ERvWdLK3paV5yU3EVNWiQ8YzB87Dr7TXhioGlWroBURDPMMXSl6k9FIAogZR9+DfW8y5CFJjCab5tmQmN0qUdhQPVevlF7GGui930i/Vsp5BmAqEwo3FscUDA3MT2EQl9t9e+tQAjlCdar8OB+EXeSEPBv1/UhM/GrDgOtGQyZUduV4I95foAD2lbWIGCL3UcrmuUzg5YucQ==",
        "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=m9z0HLs+2tklolyMEvOqp+KQX3ZpHdrnPqZyV/wmLB8=;\n b=EB4R8jpAGaphnkShZ6Zf2y8yE7ADJG382zUVhQGV2ds2H75vd/CdGN9I7wALnnWNBiyZc3Q8A1uw+FddocZTmWRrNCi2DkHgXsW/hDFmRMUg4GybX4VMvLLIsrqJcfnvjUUd5xKkcDD/qlvlLNkSIBdkIvEepRlvi+PqsvZDg1o=",
        "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 4/8] net/nfp: add the process private structure",
        "Date": "Fri, 19 Apr 2024 13:23:45 +0800",
        "Message-Id": "<20240419052349.1294696-5-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": "94f6adb9-ba43-4c49-9a71-08dc6030f680",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "BCL:0;",
        "X-Microsoft-Antispam-Message-Info": "\n RYV4FFmg4nBsiN6vZ4r774MdTKd2jjOTGN6bs6wNmiiH77X/d+/PJzYpQJEG0vAA5pBDRZDcBm07vOT/ps3Jh1noRHXOMyxJKwZ6WaqCUrTktTSnipNzhVij4HM8ODhWVnRv9oGWCnP/ul1A5x5zGOKkXnJi3eQx0vfDwm6Qc1sPhifvi6onC9LSoX69Pqmv4V/kAt9KVtDytqAEXRYESEfb6vKg0EQcoFLJZpy6o73UFSJnr7xu1BMO+4VgkyBkuZwUTVL/wRT/qbrt2dpAzH5+S4QFHTaN92/jEEMS0K4TZsmim9wAYBKjOfkOUayx+6rsDwPwVUbzSuOiphaKV/C905/NULZesnpMwotaXlsTa6mz1e/EGuNcnJMY5lZceaxeW6JhCWXhTVgcVQJEp5lVddmMiABiQ/2rM6VcHH3wxD1EHluGObmdJGk1P6dJ/wiIvSu54+4AXEW4NGfbH1P1R/aQ80N3yFQcizySBrW3DHXZ9S0JeDWPcGjj33B0l9hbbdpdTh/+dc5RXPWQBxoSIpeFHszyG/kCUSQsZ3CZVqKNoqHGX3sDmHgpr/OO0LnH4ZGww6bpOLvcMkVpOXKtjYU6NjYxYqyKROJzCrfS8lmIalzr1H53f3DV1im3aRniKCtPtLFEYr0RzMWC+Gi57c4Gfxipu0f2V/y48xvX4xaICpRJ571KgUfx3oB81CfDM1iNhGdlqDDjjBmwUv97HSIXU7uJa+YHY0BKMzPHziApEB6oLZzZ7Jqd5eVtS76uFpv2xCeIHplgZNnVlTmle12bHYgX7pEAd06q4so+hb5UDPwezRmylDld7l1O8Cz891PsAIvHOTuVOkNiYwSI/tsnLNQgMHdWgPsHA53824v+wwTf55hRaBxgLQH/YsDZa4/N82rChvABlrQugbxseWJe3+8QDlVnJONv5YWkx5EDE553R0POEddSoEnWdLDmao30vCW7zTEj906DORAq7mYI7PAybRDmjcARxNJ6yE0QaZ7hZYjCgRrnOWzNWgqLA78tB7/LpSPFqi25C9WKpV4QDLDmGpB0epwo6btxfMqIhUymE5w2cUQ3rfYDYHGeo9MJ++WeSvqX17HIGFqsw0zAQSxp0OytrC1gHrN0DZLN/81w+o1P1j3gC/SxklluHl+katiHfXy8IORR03c4Cm9mEWJu5JnjJfI3mMvtHYHPl5RbiPGWOc2/iWoLKUzcoMbqZ4isIzmxFFxqGE3iXkTYr6y7hJDpG82CVdz/Gs+4Z/WwrY+ZGR1nT030BLeKPxYUQFRbs5Vi753/oVn8dRhJsrxwqIylrtVHyuRPgYzRK4ndd2mrrvUtxbVdvqixHWEPlu0sMKr+hHfH0g==",
        "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 uTIoeBZPXNqVstwG4e/eFnW67v27u9CrPKpSY4SNE5O6hKh1A36k7IlyQex+qutxTvYDDzWoW5NlNE2p51vPP7FfESjUMoN9jSZ9Dl/HTzkD1yf9zlxNGu1b1HKIp27O90PzCiVgWrIFps/j4rmC/n50MFJG0V2EcD1aEe2eS9tHm8/6njKlDB1wgKC+qt8pKE8dgJtwXQCRKudfwLCtQZidQE96uo01XJnSBEBjpRrR4t3KQ9S16IvkbkRQfzGh5r5Kkaxq088rGZ5vFUzwQv8y0gFXL9cIbR9FfmyM5Tr34yn6K60eqCDyn2SIHj+/KD5OJUQYHGwXdHdxehYS1vCQr83k1rzTTvqRvB+DNn9kvJytnr5wtQrnEYKG809dyklVN/MLkZHv+2Vo5lUlpTxTZZMM1GUeYvaQGtD8rgpz9hOEQC26V8aZ8GkzfrhNJCH6zWNf76AHP1oTgIa/u7aJN4YZc6K0H2Y7C/o25tNBVxm2usxaTzBmauTkz2co2vRg+4kn6GrpcOXdhr/UPGPWJ74fjKGxaHREjpsYmQogkxXNsafXd7NIxiu4cAaDwqtBQWLbqgiSEmYW+WalQa4c1YtcEm7xbn4qZLZh5WhQ9l0NFDoLDNShkdn2GO6SGvdXtqdWp22hVwzN1F4NDtPne27SN38JKoVhuWdFcS2M5u0JKSywef0/EYYTDRFM2kzIWb80DeyU5bg8ZN7UWV6O1DucFE63QVIUb2RyQ+fJdVq7Ov3AT3+4rt2hOaFfPbX9Gq0117BQdf/vpuFgEQ4+uUbDrxEhWG9LhWmfPnC8t2W8meIeRDEIiemo+HEqmK2kaS8T5DII3HS2FI6gi/VrChvUkAOvknxotfJLenm5JAbr8yEabpiR6dmcqs5tfOBiKdTuqruPX+0CqCOtfHDiew0hFV7wz/sLVBTtpRwJOBEtVzKpPAXlaPfWw1zMHnp+nSwNlM4ZVZ0gTg5K+1KiiONwBYZpngXAKvfbQrjaTjA/8COxUcZBYRzEmpdwb+PSa/e0/ryxi4iTO5QFhXyjZJMjTjxB18ZjocVSargZ3qMMhawCGfzHzTol0HS61f/OzmCcgt+qtKpNeqOYShRJg8br3EldrUJsM5et0J0YzQAg/Ew8qhLN4lkB4P5WOAbrP8YW8qBfMsvUYO6i3oRoIOrcwc1l7x6gA2xLK7jZY52gjGevhiSakn0AJelxAb80WqwPwduchKG4+dRtiaigJtAzy9yzGI4l9KAa/UnaQ0kA8HTXiUnDavufKb+jpPMOIxuW/HLds/nFRI+8NNRDTmVNS/Ut66hobFB+upzkTSHIBiEi8LBkm9TBrudwutY1/3Ul7beANUJINo9BkfNp1o1gAturbtDVdCA2J0zSusr/H/otFy/RL0e0LEh2Ku9J2M2H0VYrb/0Qn8FMtXrHy6fA/+/eyhWinybHD39kGOKa5tGmsZGjEkf0SrnubE5+RB40S+ZSc7axQA7asJ8VoPyq9GRsMsPJCUssInbMXcv0+Rtz8/5Ne9CLmqbKSfxpXHZQKlauRH+7XUjFAj7Z9ciW1Y5J/nJS7eVbWThMQRpQoLW/6XbmOWMEZ9b2i5T6b/rsfMsW8GbEQOi33A==",
        "X-OriginatorOrg": "corigine.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 94f6adb9-ba43-4c49-9a71-08dc6030f680",
        "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:21.7999 (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 cOGGgVD83D+6OOG8Z+eTBAOunZF9wvAiUWjSCualcbCghaUh/u0PL8sPGgPtlSLpOuBgAR/KSRgCpSJu1Tb2VxmEs+JD9K00NGGqOLA/ca4=",
        "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": "Add a new data structure to hold the process private data, and modify\nlogic to make sure only get 'pf_dev' from the process private data.\n\nSigned-off-by: Chaoyong He <chaoyong.he@corigine.com>\nReviewed-by: Long Wu <long.wu@corigine.com>\nReviewed-by: Peng Zhang <peng.zhang@corigine.com>\n---\n drivers/net/nfp/flower/nfp_flower.c           |  71 ++++++------\n drivers/net/nfp/flower/nfp_flower.h           |   8 +-\n drivers/net/nfp/flower/nfp_flower_cmsg.c      |   5 +-\n drivers/net/nfp/flower/nfp_flower_cmsg.h      |   3 +-\n .../net/nfp/flower/nfp_flower_representor.c   |  85 ++++++++++----\n .../net/nfp/flower/nfp_flower_representor.h   |   3 +-\n drivers/net/nfp/flower/nfp_flower_service.c   |  32 +++---\n drivers/net/nfp/flower/nfp_flower_service.h   |  10 +-\n drivers/net/nfp/nfd3/nfp_nfd3_dp.c            |   1 +\n drivers/net/nfp/nfdk/nfp_nfdk_dp.c            |   1 +\n drivers/net/nfp/nfp_ethdev.c                  | 107 +++++++++++++-----\n drivers/net/nfp/nfp_net_common.c              |  67 +++++++----\n drivers/net/nfp/nfp_net_common.h              |  15 ++-\n drivers/net/nfp/nfp_net_flow.c                |  20 +++-\n drivers/net/nfp/nfp_rxtx.c                    |   5 +-\n drivers/net/nfp/nfp_rxtx.h                    |  10 +-\n 16 files changed, 284 insertions(+), 159 deletions(-)",
    "diff": "diff --git a/drivers/net/nfp/flower/nfp_flower.c b/drivers/net/nfp/flower/nfp_flower.c\nindex 303f6bd3f6..8dd9e23c78 100644\n--- a/drivers/net/nfp/flower/nfp_flower.c\n+++ b/drivers/net/nfp/flower/nfp_flower.c\n@@ -102,14 +102,14 @@ static const struct eth_dev_ops nfp_flower_pf_vnic_ops = {\n };\n \n static inline struct nfp_flower_representor *\n-nfp_flower_get_repr(struct nfp_net_hw *hw,\n+nfp_flower_get_repr(struct nfp_net_hw_priv *hw_priv,\n \t\tuint32_t port_id)\n {\n \tuint8_t port;\n \tstruct nfp_app_fw_flower *app_fw_flower;\n \n \t/* Obtain handle to app_fw_flower here */\n-\tapp_fw_flower = NFP_PRIV_TO_APP_FW_FLOWER(hw->pf_dev->app_fw_priv);\n+\tapp_fw_flower = NFP_PRIV_TO_APP_FW_FLOWER(hw_priv->pf_dev->app_fw_priv);\n \n \tswitch (NFP_FLOWER_CMSG_PORT_TYPE(port_id)) {\n \tcase NFP_FLOWER_CMSG_PORT_TYPE_PHYS_PORT:\n@@ -126,15 +126,15 @@ nfp_flower_get_repr(struct nfp_net_hw *hw,\n }\n \n bool\n-nfp_flower_pf_dispatch_pkts(struct nfp_net_hw *hw,\n+nfp_flower_pf_dispatch_pkts(struct nfp_net_hw_priv *hw_priv,\n \t\tstruct rte_mbuf *mbuf,\n \t\tuint32_t port_id)\n {\n \tstruct nfp_flower_representor *repr;\n \n-\trepr = nfp_flower_get_repr(hw, port_id);\n+\trepr = nfp_flower_get_repr(hw_priv, port_id);\n \tif (repr == NULL) {\n-\t\tPMD_RX_LOG(ERR, \"Can not get repr for port %u\", hw->idx);\n+\t\tPMD_RX_LOG(ERR, \"Can not get repr for port %u\", port_id);\n \t\treturn false;\n \t}\n \n@@ -189,13 +189,14 @@ nfp_flower_pf_xmit_pkts(void *tx_queue,\n \tstruct nfp_app_fw_flower *app_fw_flower;\n \n \ttxq = tx_queue;\n-\tapp_fw_flower = txq->hw->pf_dev->app_fw_priv;\n+\tapp_fw_flower = txq->hw_priv->pf_dev->app_fw_priv;\n \n \treturn app_fw_flower->nfd_func.pf_xmit_t(tx_queue, tx_pkts, nb_pkts);\n }\n \n static int\n-nfp_flower_init_vnic_common(struct nfp_net_hw *hw,\n+nfp_flower_init_vnic_common(struct nfp_net_hw_priv *hw_priv,\n+\t\tstruct nfp_net_hw *hw,\n \t\tconst char *vnic_type)\n {\n \tint err;\n@@ -205,8 +206,8 @@ nfp_flower_init_vnic_common(struct nfp_net_hw *hw,\n \tstruct nfp_pf_dev *pf_dev;\n \tstruct rte_pci_device *pci_dev;\n \n-\tpf_dev = hw->pf_dev;\n-\tpci_dev = hw->pf_dev->pci_dev;\n+\tpf_dev = hw_priv->pf_dev;\n+\tpci_dev = pf_dev->pci_dev;\n \n \tPMD_INIT_LOG(DEBUG, \"%s vNIC ctrl bar: %p\", vnic_type, hw->super.ctrl_bar);\n \n@@ -239,13 +240,15 @@ nfp_flower_init_vnic_common(struct nfp_net_hw *hw,\n }\n \n static int\n-nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw)\n+nfp_flower_init_ctrl_vnic(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct nfp_net_hw_priv *hw_priv)\n {\n \tuint16_t i;\n \tint ret = 0;\n \tuint16_t n_txq;\n \tuint16_t n_rxq;\n \tconst char *pci_name;\n+\tstruct nfp_net_hw *hw;\n \tunsigned int numa_node;\n \tstruct rte_mempool *mp;\n \tstruct nfp_net_rxq *rxq;\n@@ -253,16 +256,15 @@ nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw)\n \tstruct nfp_pf_dev *pf_dev;\n \tstruct rte_eth_dev *eth_dev;\n \tconst struct rte_memzone *tz;\n-\tstruct nfp_app_fw_flower *app_fw_flower;\n \tchar ctrl_rxring_name[RTE_MEMZONE_NAMESIZE];\n \tchar ctrl_txring_name[RTE_MEMZONE_NAMESIZE];\n \tchar ctrl_pktmbuf_pool_name[RTE_MEMZONE_NAMESIZE];\n \n \t/* Set up some pointers here for ease of use */\n-\tpf_dev = hw->pf_dev;\n-\tapp_fw_flower = NFP_PRIV_TO_APP_FW_FLOWER(pf_dev->app_fw_priv);\n+\tpf_dev = hw_priv->pf_dev;\n+\thw = app_fw_flower->ctrl_hw;\n \n-\tret = nfp_flower_init_vnic_common(hw, \"ctrl_vnic\");\n+\tret = nfp_flower_init_vnic_common(hw_priv, hw, \"ctrl_vnic\");\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Could not init pf vnic\");\n \t\treturn -EINVAL;\n@@ -397,6 +399,7 @@ nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw)\n \t\tnfp_net_reset_rx_queue(rxq);\n \n \t\trxq->hw = hw;\n+\t\trxq->hw_priv = hw_priv;\n \n \t\t/*\n \t\t * Telling the HW about the physical address of the RX ring and number\n@@ -462,6 +465,7 @@ nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw)\n \t\tnfp_net_reset_tx_queue(txq);\n \n \t\ttxq->hw = hw;\n+\t\ttxq->hw_priv = hw_priv;\n \n \t\t/*\n \t\t * Telling the HW about the physical address of the TX ring and number\n@@ -472,7 +476,7 @@ nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw)\n \t}\n \n \t/* Alloc sync memory zone */\n-\tret = nfp_flower_service_sync_alloc(app_fw_flower);\n+\tret = nfp_flower_service_sync_alloc(hw_priv);\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Alloc sync memory zone failed\");\n \t\tgoto tx_queue_setup_cleanup;\n@@ -512,21 +516,22 @@ nfp_flower_init_ctrl_vnic(struct nfp_net_hw *hw)\n }\n \n static void\n-nfp_flower_cleanup_ctrl_vnic(struct nfp_net_hw *hw)\n+nfp_flower_cleanup_ctrl_vnic(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct nfp_net_hw_priv *hw_priv)\n {\n \tuint32_t i;\n \tconst char *pci_name;\n+\tstruct nfp_net_hw *hw;\n \tstruct nfp_net_rxq *rxq;\n \tstruct nfp_net_txq *txq;\n \tstruct rte_eth_dev *eth_dev;\n-\tstruct nfp_app_fw_flower *app_fw_flower;\n \tchar ctrl_txring_name[RTE_MEMZONE_NAMESIZE];\n \tchar ctrl_rxring_name[RTE_MEMZONE_NAMESIZE];\n \n+\thw = app_fw_flower->ctrl_hw;\n \teth_dev = hw->eth_dev;\n-\tapp_fw_flower = NFP_PRIV_TO_APP_FW_FLOWER(hw->pf_dev->app_fw_priv);\n \n-\tpci_name = strchr(app_fw_flower->pf_hw->pf_dev->pci_dev->name, ':') + 1;\n+\tpci_name = strchr(hw_priv->pf_dev->pci_dev->name, ':') + 1;\n \n \tsnprintf(ctrl_txring_name, sizeof(ctrl_txring_name), \"%s_cttx_ring\", pci_name);\n \tfor (i = 0; i < hw->max_tx_queues; i++) {\n@@ -548,7 +553,7 @@ nfp_flower_cleanup_ctrl_vnic(struct nfp_net_hw *hw)\n \t\t}\n \t}\n \n-\tnfp_flower_service_sync_free(app_fw_flower);\n+\tnfp_flower_service_sync_free(hw_priv);\n \trte_free(eth_dev->data->tx_queues);\n \trte_free(eth_dev->data->rx_queues);\n \trte_mempool_free(app_fw_flower->ctrl_pktmbuf_pool);\n@@ -634,7 +639,7 @@ nfp_flower_nfd_func_register(struct nfp_app_fw_flower *app_fw_flower)\n }\n \n int\n-nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n+nfp_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv,\n \t\tconst struct nfp_dev_info *dev_info)\n {\n \tint ret;\n@@ -644,6 +649,7 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n \tstruct nfp_net_hw *pf_hw;\n \tstruct nfp_net_hw *ctrl_hw;\n \tstruct nfp_app_fw_flower *app_fw_flower;\n+\tstruct nfp_pf_dev *pf_dev = hw_priv->pf_dev;\n \n \tnuma_node = rte_socket_id();\n \n@@ -702,11 +708,10 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n \t/* Fill in the PF vNIC and populate app struct */\n \tapp_fw_flower->pf_hw = pf_hw;\n \tpf_hw->super.ctrl_bar = pf_dev->ctrl_bar;\n-\tpf_hw->pf_dev = pf_dev;\n \tpf_hw->cpp = pf_dev->cpp;\n \tpf_hw->dev_info = dev_info;\n \n-\tret = nfp_flower_init_vnic_common(app_fw_flower->pf_hw, \"pf_vnic\");\n+\tret = nfp_flower_init_vnic_common(hw_priv, pf_hw, \"pf_vnic\");\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Could not initialize flower PF vNIC\");\n \t\tgoto pf_cpp_area_cleanup;\n@@ -728,11 +733,10 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n \t}\n \n \t/* Now populate the ctrl vNIC */\n-\tctrl_hw->pf_dev = pf_dev;\n \tctrl_hw->cpp = pf_dev->cpp;\n \tctrl_hw->dev_info = dev_info;\n \n-\tret = nfp_flower_init_ctrl_vnic(app_fw_flower->ctrl_hw);\n+\tret = nfp_flower_init_ctrl_vnic(app_fw_flower, hw_priv);\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Could not initialize flower ctrl vNIC\");\n \t\tgoto ctrl_cpp_area_cleanup;\n@@ -746,14 +750,14 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n \t}\n \n \t/* Start up flower services */\n-\tret = nfp_flower_service_start(app_fw_flower);\n+\tret = nfp_flower_service_start(app_fw_flower, hw_priv);\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Could not enable flower services\");\n \t\tret = -ESRCH;\n \t\tgoto ctrl_vnic_cleanup;\n \t}\n \n-\tret = nfp_flower_repr_create(app_fw_flower);\n+\tret = nfp_flower_repr_create(app_fw_flower, hw_priv);\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Could not create representor ports\");\n \t\tgoto ctrl_vnic_service_stop;\n@@ -762,9 +766,9 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n \treturn 0;\n \n ctrl_vnic_service_stop:\n-\tnfp_flower_service_stop(app_fw_flower);\n+\tnfp_flower_service_stop(app_fw_flower, hw_priv);\n ctrl_vnic_cleanup:\n-\tnfp_flower_cleanup_ctrl_vnic(app_fw_flower->ctrl_hw);\n+\tnfp_flower_cleanup_ctrl_vnic(app_fw_flower, hw_priv);\n ctrl_cpp_area_cleanup:\n \tnfp_cpp_area_free(ctrl_hw->ctrl_area);\n pf_cpp_area_cleanup:\n@@ -782,12 +786,13 @@ nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n }\n \n void\n-nfp_uninit_app_fw_flower(struct nfp_pf_dev *pf_dev)\n+nfp_uninit_app_fw_flower(struct nfp_net_hw_priv *hw_priv)\n {\n \tstruct nfp_app_fw_flower *app_fw_flower;\n+\tstruct nfp_pf_dev *pf_dev = hw_priv->pf_dev;\n \n \tapp_fw_flower = pf_dev->app_fw_priv;\n-\tnfp_flower_cleanup_ctrl_vnic(app_fw_flower->ctrl_hw);\n+\tnfp_flower_cleanup_ctrl_vnic(app_fw_flower, hw_priv);\n \tnfp_cpp_area_free(app_fw_flower->ctrl_hw->ctrl_area);\n \tnfp_cpp_area_free(pf_dev->ctrl_area);\n \trte_free(app_fw_flower->pf_hw);\n@@ -799,7 +804,7 @@ nfp_uninit_app_fw_flower(struct nfp_pf_dev *pf_dev)\n }\n \n int\n-nfp_secondary_init_app_fw_flower(struct nfp_pf_dev *pf_dev)\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@@ -812,7 +817,7 @@ nfp_secondary_init_app_fw_flower(struct nfp_pf_dev *pf_dev)\n \t\treturn -ENODEV;\n \t}\n \n-\teth_dev->process_private = pf_dev;\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;\ndiff --git a/drivers/net/nfp/flower/nfp_flower.h b/drivers/net/nfp/flower/nfp_flower.h\nindex 8393de66c5..5cc29dcc87 100644\n--- a/drivers/net/nfp/flower/nfp_flower.h\n+++ b/drivers/net/nfp/flower/nfp_flower.h\n@@ -104,11 +104,11 @@ nfp_flower_support_decap_v2(const struct nfp_app_fw_flower *app_fw_flower)\n \treturn app_fw_flower->ext_features & NFP_FL_FEATS_DECAP_V2;\n }\n \n-int nfp_init_app_fw_flower(struct nfp_pf_dev *pf_dev,\n+int nfp_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv,\n \t\tconst struct nfp_dev_info *dev_info);\n-void nfp_uninit_app_fw_flower(struct nfp_pf_dev *pf_dev);\n-int nfp_secondary_init_app_fw_flower(struct nfp_pf_dev *pf_dev);\n-bool nfp_flower_pf_dispatch_pkts(struct nfp_net_hw *hw,\n+void nfp_uninit_app_fw_flower(struct nfp_net_hw_priv *hw_priv);\n+int nfp_secondary_init_app_fw_flower(struct nfp_net_hw_priv *hw_priv);\n+bool nfp_flower_pf_dispatch_pkts(struct nfp_net_hw_priv *hw_priv,\n \t\tstruct rte_mbuf *mbuf,\n \t\tuint32_t port_id);\n uint16_t nfp_flower_pf_xmit_pkts(void *tx_queue, struct rte_mbuf **tx_pkts,\ndiff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.c b/drivers/net/nfp/flower/nfp_flower_cmsg.c\nindex eefeb0d887..2a0e9afe90 100644\n--- a/drivers/net/nfp/flower/nfp_flower_cmsg.c\n+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.c\n@@ -81,7 +81,8 @@ nfp_flower_cmsg_mac_repr_fill(struct rte_mbuf *m,\n }\n \n int\n-nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower)\n+nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct nfp_eth_table *nfp_eth_table)\n {\n \tuint8_t i;\n \tuint16_t cnt;\n@@ -89,7 +90,6 @@ nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower)\n \tuint32_t nbi_port;\n \tuint32_t phys_port;\n \tstruct rte_mbuf *mbuf;\n-\tstruct nfp_eth_table *nfp_eth_table;\n \n \tmbuf = rte_pktmbuf_alloc(app_fw_flower->ctrl_pktmbuf_pool);\n \tif (mbuf == NULL) {\n@@ -100,7 +100,6 @@ nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower)\n \tnfp_flower_cmsg_mac_repr_init(mbuf, app_fw_flower);\n \n \t/* Fill in the mac repr cmsg */\n-\tnfp_eth_table = app_fw_flower->pf_hw->pf_dev->nfp_eth_table;\n \tfor (i = 0; i < app_fw_flower->num_phyport_reprs; i++) {\n \t\tnbi = nfp_eth_table->ports[i].nbi;\n \t\tnbi_port = nfp_eth_table->ports[i].base;\ndiff --git a/drivers/net/nfp/flower/nfp_flower_cmsg.h b/drivers/net/nfp/flower/nfp_flower_cmsg.h\nindex c94ea706bb..afaf733ef7 100644\n--- a/drivers/net/nfp/flower/nfp_flower_cmsg.h\n+++ b/drivers/net/nfp/flower/nfp_flower_cmsg.h\n@@ -975,7 +975,8 @@ struct nfp_fl_act_mark {\n \trte_be32_t mark;\n };\n \n-int nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower);\n+int nfp_flower_cmsg_mac_repr(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct nfp_eth_table *nfp_eth_table);\n int nfp_flower_cmsg_repr_reify(struct nfp_app_fw_flower *app_fw_flower,\n \t\tstruct nfp_flower_representor *repr);\n int nfp_flower_cmsg_port_mod(struct nfp_app_fw_flower *app_fw_flower,\ndiff --git a/drivers/net/nfp/flower/nfp_flower_representor.c b/drivers/net/nfp/flower/nfp_flower_representor.c\nindex d4c3c30682..934f078dca 100644\n--- a/drivers/net/nfp/flower/nfp_flower_representor.c\n+++ b/drivers/net/nfp/flower/nfp_flower_representor.c\n@@ -83,17 +83,17 @@ nfp_flower_repr_dev_infos_get(__rte_unused struct rte_eth_dev *dev,\n static int\n nfp_flower_repr_dev_start(struct rte_eth_dev *dev)\n {\n+\tuint16_t i;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_flower_representor *repr;\n \tstruct nfp_app_fw_flower *app_fw_flower;\n-\tuint16_t i;\n \n \trepr = dev->data->dev_private;\n+\thw_priv = dev->process_private;\n \tapp_fw_flower = repr->app_fw_flower;\n \n-\tif (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT) {\n-\t\tnfp_eth_set_configured(app_fw_flower->pf_hw->pf_dev->cpp,\n-\t\t\t\trepr->nfp_idx, 1);\n-\t}\n+\tif (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT)\n+\t\tnfp_eth_set_configured(hw_priv->pf_dev->cpp, repr->nfp_idx, 1);\n \n \tnfp_flower_cmsg_port_mod(app_fw_flower, repr->port_id, true);\n \n@@ -108,19 +108,19 @@ nfp_flower_repr_dev_start(struct rte_eth_dev *dev)\n static int\n nfp_flower_repr_dev_stop(struct rte_eth_dev *dev)\n {\n+\tuint16_t i;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_flower_representor *repr;\n \tstruct nfp_app_fw_flower *app_fw_flower;\n-\tuint16_t i;\n \n \trepr = dev->data->dev_private;\n+\thw_priv = dev->process_private;\n \tapp_fw_flower = repr->app_fw_flower;\n \n \tnfp_flower_cmsg_port_mod(app_fw_flower, repr->port_id, false);\n \n-\tif (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT) {\n-\t\tnfp_eth_set_configured(app_fw_flower->pf_hw->pf_dev->cpp,\n-\t\t\t\trepr->nfp_idx, 0);\n-\t}\n+\tif (repr->repr_type == NFP_REPR_TYPE_PHYS_PORT)\n+\t\tnfp_eth_set_configured(hw_priv->pf_dev->cpp, repr->nfp_idx, 0);\n \n \tfor (i = 0; i < dev->data->nb_rx_queues; i++)\n \t\tdev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STOPPED;\n@@ -408,8 +408,8 @@ static int\n nfp_flower_repr_dev_close(struct rte_eth_dev *dev)\n {\n \tuint16_t i;\n-\tstruct nfp_net_hw *hw;\n \tstruct nfp_pf_dev *pf_dev;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_flower_representor *repr;\n \tstruct nfp_app_fw_flower *app_fw_flower;\n \n@@ -417,9 +417,10 @@ nfp_flower_repr_dev_close(struct rte_eth_dev *dev)\n \t\treturn 0;\n \n \trepr = dev->data->dev_private;\n+\thw_priv = dev->process_private;\n+\n \tapp_fw_flower = repr->app_fw_flower;\n-\thw = app_fw_flower->pf_hw;\n-\tpf_dev = hw->pf_dev;\n+\tpf_dev = hw_priv->pf_dev;\n \n \tif (pf_dev->app_fw_id != NFP_APP_FW_FLOWER_NIC)\n \t\treturn -EINVAL;\n@@ -442,14 +443,14 @@ nfp_flower_repr_dev_close(struct rte_eth_dev *dev)\n \t\treturn 0;\n \n \t/* Stop flower service first */\n-\tnfp_flower_service_stop(app_fw_flower);\n+\tnfp_flower_service_stop(app_fw_flower, hw_priv);\n \n \t/* Disable cpp service */\n \tnfp_service_disable(&pf_dev->cpp_service_info);\n \n \t/* Now it is safe to free all PF resources */\n-\tnfp_uninit_app_fw_flower(pf_dev);\n-\tnfp_pf_uninit(pf_dev);\n+\tnfp_uninit_app_fw_flower(hw_priv);\n+\tnfp_pf_uninit(hw_priv);\n \n \treturn 0;\n }\n@@ -708,8 +709,43 @@ nfp_flower_repr_free_all(struct nfp_app_fw_flower *app_fw_flower)\n \t}\n }\n \n+static void\n+nfp_flower_repr_priv_init(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct nfp_net_hw_priv *hw_priv)\n+{\n+\tuint32_t i;\n+\tstruct rte_eth_dev *eth_dev;\n+\tstruct nfp_flower_representor *repr;\n+\n+\trepr = app_fw_flower->pf_repr;\n+\tif (repr != NULL) {\n+\t\teth_dev = repr->eth_dev;\n+\t\tif (eth_dev != NULL)\n+\t\t\teth_dev->process_private = hw_priv;\n+\t}\n+\n+\tfor (i = 0; i < NFP_MAX_PHYPORTS; i++) {\n+\t\trepr = app_fw_flower->phy_reprs[i];\n+\t\tif (repr != NULL) {\n+\t\t\teth_dev = repr->eth_dev;\n+\t\t\tif (eth_dev != NULL)\n+\t\t\t\teth_dev->process_private = hw_priv;\n+\t\t}\n+\t}\n+\n+\tfor (i = 0; i < MAX_FLOWER_VFS; i++) {\n+\t\trepr = app_fw_flower->vf_reprs[i];\n+\t\tif (repr != NULL) {\n+\t\t\teth_dev = repr->eth_dev;\n+\t\t\tif (eth_dev != NULL)\n+\t\t\t\teth_dev->process_private = hw_priv;\n+\t\t}\n+\t}\n+}\n+\n static int\n-nfp_flower_repr_alloc(struct nfp_app_fw_flower *app_fw_flower)\n+nfp_flower_repr_alloc(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct nfp_net_hw_priv *hw_priv)\n {\n \tint i;\n \tint ret;\n@@ -723,11 +759,11 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower *app_fw_flower)\n \t\t.app_fw_flower    = app_fw_flower,\n \t};\n \n-\tnfp_eth_table = app_fw_flower->pf_hw->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \teth_dev = app_fw_flower->ctrl_hw->eth_dev;\n \n \t/* Send a NFP_FLOWER_CMSG_TYPE_MAC_REPR cmsg to hardware */\n-\tret = nfp_flower_cmsg_mac_repr(app_fw_flower);\n+\tret = nfp_flower_cmsg_mac_repr(app_fw_flower, nfp_eth_table);\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"Cloud not send mac repr cmsgs\");\n \t\treturn ret;\n@@ -739,7 +775,7 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower *app_fw_flower)\n \t/* PF vNIC reprs get a random MAC address */\n \trte_eth_random_addr(flower_repr.mac_addr.addr_bytes);\n \n-\tpci_dev = app_fw_flower->pf_hw->pf_dev->pci_dev;\n+\tpci_dev = hw_priv->pf_dev->pci_dev;\n \n \tpci_name = strchr(pci_dev->name, ':') + 1;\n \n@@ -813,6 +849,8 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower *app_fw_flower)\n \tif (i < app_fw_flower->num_vf_reprs)\n \t\tgoto repr_free;\n \n+\tnfp_flower_repr_priv_init(app_fw_flower, hw_priv);\n+\n \treturn 0;\n \n repr_free:\n@@ -822,7 +860,8 @@ nfp_flower_repr_alloc(struct nfp_app_fw_flower *app_fw_flower)\n }\n \n int\n-nfp_flower_repr_create(struct nfp_app_fw_flower *app_fw_flower)\n+nfp_flower_repr_create(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct nfp_net_hw_priv *hw_priv)\n {\n \tint ret;\n \tstruct nfp_pf_dev *pf_dev;\n@@ -832,7 +871,7 @@ nfp_flower_repr_create(struct nfp_app_fw_flower *app_fw_flower)\n \t\t.nb_representor_ports = 0\n \t};\n \n-\tpf_dev = app_fw_flower->pf_hw->pf_dev;\n+\tpf_dev = hw_priv->pf_dev;\n \tpci_dev = pf_dev->pci_dev;\n \n \t/* Allocate a switch domain for the flower app */\n@@ -876,7 +915,7 @@ nfp_flower_repr_create(struct nfp_app_fw_flower *app_fw_flower)\n \tPMD_INIT_LOG(INFO, \"%d number of VF reprs\", app_fw_flower->num_vf_reprs);\n \tPMD_INIT_LOG(INFO, \"%d number of phyport reprs\", app_fw_flower->num_phyport_reprs);\n \n-\tret = nfp_flower_repr_alloc(app_fw_flower);\n+\tret = nfp_flower_repr_alloc(app_fw_flower, hw_priv);\n \tif (ret != 0) {\n \t\tPMD_INIT_LOG(ERR, \"representors allocation failed\");\n \t\tret = -EINVAL;\ndiff --git a/drivers/net/nfp/flower/nfp_flower_representor.h b/drivers/net/nfp/flower/nfp_flower_representor.h\nindex 7a4e7ecfc1..41965f6e0e 100644\n--- a/drivers/net/nfp/flower/nfp_flower_representor.h\n+++ b/drivers/net/nfp/flower/nfp_flower_representor.h\n@@ -23,7 +23,8 @@ struct nfp_flower_representor {\n \tstruct rte_eth_dev *eth_dev;\n };\n \n-int nfp_flower_repr_create(struct nfp_app_fw_flower *app_fw_flower);\n+int nfp_flower_repr_create(struct nfp_app_fw_flower *app_fw_flower,\n+\t\tstruct nfp_net_hw_priv *hw_priv);\n bool nfp_flower_repr_is_vf(struct nfp_flower_representor *repr);\n \n #endif /* __NFP_FLOWER_REPRESENTOR_H__ */\ndiff --git a/drivers/net/nfp/flower/nfp_flower_service.c b/drivers/net/nfp/flower/nfp_flower_service.c\nindex 5e8811fe24..515b4abef0 100644\n--- a/drivers/net/nfp/flower/nfp_flower_service.c\n+++ b/drivers/net/nfp/flower/nfp_flower_service.c\n@@ -28,9 +28,9 @@ struct nfp_flower_service {\n };\n \n static struct nfp_flower_service *\n-nfp_flower_service_handle_get(struct nfp_app_fw_flower *app)\n+nfp_flower_service_handle_get(struct nfp_net_hw_priv *hw_priv)\n {\n-\treturn app->pf_hw->pf_dev->process_share.fl_service;\n+\treturn hw_priv->pf_dev->process_share.fl_service;\n }\n \n static int\n@@ -100,13 +100,13 @@ nfp_flower_service_insert(struct nfp_app_fw_flower *app,\n }\n \n int\n-nfp_flower_service_start(void *app_fw_flower)\n+nfp_flower_service_start(void *app_fw_flower,\n+\t\tstruct nfp_net_hw_priv *hw_priv)\n {\n \tint ret;\n \tstruct nfp_flower_service *service_handle;\n-\tstruct nfp_app_fw_flower *app = app_fw_flower;\n \n-\tservice_handle = nfp_flower_service_handle_get(app);\n+\tservice_handle = nfp_flower_service_handle_get(hw_priv);\n \tif (service_handle == NULL) {\n \t\tPMD_DRV_LOG(ERR, \"Can not get service handle\");\n \t\treturn -EINVAL;\n@@ -122,7 +122,7 @@ nfp_flower_service_start(void *app_fw_flower)\n \t}\n \n \t/* Insert the NIC to flower service slot */\n-\tret = nfp_flower_service_insert(app, service_handle);\n+\tret = nfp_flower_service_insert(app_fw_flower, service_handle);\n \tif (ret == MAX_FLOWER_SERVICE_SLOT) {\n \t\tPMD_DRV_LOG(ERR, \"Flower ctrl vnic service slot over %u\",\n \t\t\t\tMAX_FLOWER_SERVICE_SLOT);\n@@ -133,14 +133,14 @@ nfp_flower_service_start(void *app_fw_flower)\n }\n \n void\n-nfp_flower_service_stop(void *app_fw_flower)\n+nfp_flower_service_stop(void *app_fw_flower,\n+\t\tstruct nfp_net_hw_priv *hw_priv)\n {\n \tuint16_t slot;\n \tuint16_t count;\n \tstruct nfp_flower_service *service_handle;\n-\tstruct nfp_app_fw_flower *app = app_fw_flower;\n \n-\tservice_handle = nfp_flower_service_handle_get(app);\n+\tservice_handle = nfp_flower_service_handle_get(hw_priv);\n \tif (service_handle == NULL) {\n \t\tPMD_DRV_LOG(ERR, \"Can not get service handle\");\n \t\treturn;\n@@ -149,7 +149,7 @@ nfp_flower_service_stop(void *app_fw_flower)\n \trte_spinlock_lock(&service_handle->spinlock);\n \tfor (slot = 0; slot < MAX_FLOWER_SERVICE_SLOT; slot++) {\n \t\t/* The app only in one slot */\n-\t\tif (service_handle->slots[slot] != app)\n+\t\tif (service_handle->slots[slot] != app_fw_flower)\n \t\t\tcontinue;\n \n \t\tservice_handle->slots[slot] = NULL;\n@@ -157,7 +157,7 @@ nfp_flower_service_stop(void *app_fw_flower)\n \trte_spinlock_unlock(&service_handle->spinlock);\n \n \t/* Determine whether to disable service */\n-\tcount = nfp_sync_handle_count_get(app->pf_hw->pf_dev->sync, NULL,\n+\tcount = nfp_sync_handle_count_get(hw_priv->pf_dev->sync, NULL,\n \t\t\tservice_handle);\n \tif (count > 1)\n \t\treturn;\n@@ -167,11 +167,10 @@ nfp_flower_service_stop(void *app_fw_flower)\n }\n \n int\n-nfp_flower_service_sync_alloc(void *app_fw_flower)\n+nfp_flower_service_sync_alloc(struct nfp_net_hw_priv *hw_priv)\n {\n \tstruct nfp_flower_service *service_handle;\n-\tstruct nfp_app_fw_flower *app = app_fw_flower;\n-\tstruct nfp_pf_dev *pf_dev = app->pf_hw->pf_dev;\n+\tstruct nfp_pf_dev *pf_dev = hw_priv->pf_dev;\n \n \tservice_handle = nfp_sync_handle_alloc(pf_dev->sync, NULL,\n \t\t\tNFP_SYNC_MAGIC_FL_SERVICE,\n@@ -185,10 +184,9 @@ nfp_flower_service_sync_alloc(void *app_fw_flower)\n }\n \n void\n-nfp_flower_service_sync_free(void *app_fw_flower)\n+nfp_flower_service_sync_free(struct nfp_net_hw_priv *hw_priv)\n {\n-\tstruct nfp_app_fw_flower *app = app_fw_flower;\n-\tstruct nfp_pf_dev *pf_dev = app->pf_hw->pf_dev;\n+\tstruct nfp_pf_dev *pf_dev = hw_priv->pf_dev;\n \n \tnfp_sync_handle_free(pf_dev->sync, NULL, pf_dev->process_share.fl_service);\n \ndiff --git a/drivers/net/nfp/flower/nfp_flower_service.h b/drivers/net/nfp/flower/nfp_flower_service.h\nindex a75780274f..2fbe4fa601 100644\n--- a/drivers/net/nfp/flower/nfp_flower_service.h\n+++ b/drivers/net/nfp/flower/nfp_flower_service.h\n@@ -6,12 +6,12 @@\n #ifndef __NFP_FLOWER_SERVICE_H__\n #define __NFP_FLOWER_SERVICE_H__\n \n-struct nfp_flower_service;\n+#include \"../nfp_net_common.h\"\n \n-int nfp_flower_service_start(void *app_fw_flower);\n-void nfp_flower_service_stop(void *app_fw_flower);\n+int nfp_flower_service_start(void *app_fw_flower, struct nfp_net_hw_priv *hw_priv);\n+void nfp_flower_service_stop(void *app_fw_flower, struct nfp_net_hw_priv *hw_priv);\n \n-int nfp_flower_service_sync_alloc(void *app_fw_flower);\n-void nfp_flower_service_sync_free(void *app_fw_flower);\n+int nfp_flower_service_sync_alloc(struct nfp_net_hw_priv *hw_priv);\n+void nfp_flower_service_sync_free(struct nfp_net_hw_priv *hw_priv);\n \n #endif /* __NFP_FLOWER_SERVICE_H__ */\ndiff --git a/drivers/net/nfp/nfd3/nfp_nfd3_dp.c b/drivers/net/nfp/nfd3/nfp_nfd3_dp.c\nindex 253872f4a1..681a63eacd 100644\n--- a/drivers/net/nfp/nfd3/nfp_nfd3_dp.c\n+++ b/drivers/net/nfp/nfd3/nfp_nfd3_dp.c\n@@ -469,6 +469,7 @@ nfp_net_nfd3_tx_queue_setup(struct rte_eth_dev *dev,\n \tnfp_net_reset_tx_queue(txq);\n \n \ttxq->hw = hw;\n+\ttxq->hw_priv = dev->process_private;\n \n \t/*\n \t * Telling the HW about the physical address of the TX ring and number\ndiff --git a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\nindex 41cdfd3a40..83eaec9c24 100644\n--- a/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\n+++ b/drivers/net/nfp/nfdk/nfp_nfdk_dp.c\n@@ -555,6 +555,7 @@ nfp_net_nfdk_tx_queue_setup(struct rte_eth_dev *dev,\n \n \tdev->data->tx_queues[queue_idx] = txq;\n \ttxq->hw = hw;\n+\ttxq->hw_priv = dev->process_private;\n \n \t/*\n \t * Telling the HW about the physical address of the TX ring and number\ndiff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c\nindex 98d8e87028..58e155e92b 100644\n--- a/drivers/net/nfp/nfp_ethdev.c\n+++ b/drivers/net/nfp/nfp_ethdev.c\n@@ -103,12 +103,14 @@ nfp_net_pf_read_mac(struct nfp_app_fw_nic *app_fw_nic,\n \t\tuint16_t port)\n {\n \tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_eth_table *nfp_eth_table;\n \n \t/* Grab a pointer to the correct physical port */\n \thw = app_fw_nic->ports[port];\n+\thw_priv = hw->eth_dev->process_private;\n \n-\tnfp_eth_table = app_fw_nic->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \n \trte_ether_addr_copy(&nfp_eth_table->ports[port].mac_addr, &hw->super.mac_addr);\n }\n@@ -183,8 +185,7 @@ nfp_net_nfp4000_speed_configure_check(uint16_t port_id,\n }\n \n static int\n-nfp_net_speed_configure(struct rte_eth_dev *dev,\n-\t\tstruct nfp_net_hw *net_hw)\n+nfp_net_speed_configure(struct rte_eth_dev *dev)\n {\n \tint ret;\n \tuint32_t speed_capa;\n@@ -193,11 +194,13 @@ nfp_net_speed_configure(struct rte_eth_dev *dev,\n \tuint32_t configure_speed;\n \tstruct nfp_eth_table_port *eth_port;\n \tstruct nfp_eth_table *nfp_eth_table;\n+\tstruct nfp_net_hw *net_hw = dev->data->dev_private;\n+\tstruct nfp_net_hw_priv *hw_priv = dev->process_private;\n \n-\tnfp_eth_table = net_hw->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \teth_port = &nfp_eth_table->ports[net_hw->idx];\n \n-\tspeed_capa = net_hw->pf_dev->speed_capa;\n+\tspeed_capa = hw_priv->pf_dev->speed_capa;\n \tif (speed_capa == 0) {\n \t\tPMD_DRV_LOG(ERR, \"Speed_capa is invalid.\");\n \t\treturn -EINVAL;\n@@ -272,12 +275,14 @@ nfp_net_start(struct rte_eth_dev *dev)\n \tstruct nfp_net_hw *net_hw;\n \tstruct nfp_pf_dev *pf_dev;\n \tstruct rte_eth_rxmode *rxmode;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_app_fw_nic *app_fw_nic;\n \tstruct rte_pci_device *pci_dev = RTE_ETH_DEV_TO_PCI(dev);\n \tstruct rte_intr_handle *intr_handle = pci_dev->intr_handle;\n \n \tnet_hw = dev->data->dev_private;\n-\tpf_dev = net_hw->pf_dev;\n+\thw_priv = dev->process_private;\n+\tpf_dev = hw_priv->pf_dev;\n \tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(pf_dev->app_fw_priv);\n \thw = &net_hw->super;\n \n@@ -288,7 +293,7 @@ nfp_net_start(struct rte_eth_dev *dev)\n \tnfp_net_enable_queues(dev);\n \n \t/* Configure the port speed and the auto-negotiation mode. */\n-\tret = nfp_net_speed_configure(dev, net_hw);\n+\tret = nfp_net_speed_configure(dev);\n \tif (ret < 0) {\n \t\tPMD_DRV_LOG(ERR, \"Failed to set the speed and auto-negotiation mode.\");\n \t\treturn ret;\n@@ -400,7 +405,7 @@ nfp_net_start(struct rte_eth_dev *dev)\n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY)\n \t\tcpp = net_hw->cpp;\n \telse\n-\t\tcpp = ((struct nfp_pf_dev *)(dev->process_private))->cpp;\n+\t\tcpp = pf_dev->cpp;\n \n \t/* Configure the physical port up */\n \tnfp_eth_set_configured(cpp, net_hw->nfp_idx, 1);\n@@ -437,13 +442,15 @@ nfp_net_set_link_up(struct rte_eth_dev *dev)\n {\n \tstruct nfp_cpp *cpp;\n \tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \thw = dev->data->dev_private;\n+\thw_priv = dev->process_private;\n \n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY)\n \t\tcpp = hw->cpp;\n \telse\n-\t\tcpp = ((struct nfp_pf_dev *)(dev->process_private))->cpp;\n+\t\tcpp = hw_priv->pf_dev->cpp;\n \n \treturn nfp_eth_set_configured(cpp, hw->nfp_idx, 1);\n }\n@@ -454,13 +461,15 @@ nfp_net_set_link_down(struct rte_eth_dev *dev)\n {\n \tstruct nfp_cpp *cpp;\n \tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \thw = dev->data->dev_private;\n+\thw_priv = dev->process_private;\n \n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY)\n \t\tcpp = hw->cpp;\n \telse\n-\t\tcpp = ((struct nfp_pf_dev *)(dev->process_private))->cpp;\n+\t\tcpp = hw_priv->pf_dev->cpp;\n \n \treturn nfp_eth_set_configured(cpp, hw->nfp_idx, 0);\n }\n@@ -573,11 +582,13 @@ static void\n nfp_net_uninit(struct rte_eth_dev *eth_dev)\n {\n \tstruct nfp_net_hw *net_hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \tnet_hw = eth_dev->data->dev_private;\n+\thw_priv = eth_dev->process_private;\n \n \tif ((net_hw->super.cap_ext & NFP_NET_CFG_CTRL_FLOW_STEER) != 0)\n-\t\tnfp_net_flow_priv_uninit(net_hw->pf_dev, net_hw->idx);\n+\t\tnfp_net_flow_priv_uninit(hw_priv->pf_dev, net_hw->idx);\n \n \trte_free(net_hw->eth_xstats_base);\n \tif ((net_hw->super.cap & NFP_NET_CFG_CTRL_TXRWB) != 0)\n@@ -612,8 +623,10 @@ nfp_uninit_app_fw_nic(struct nfp_pf_dev *pf_dev)\n }\n \n void\n-nfp_pf_uninit(struct nfp_pf_dev *pf_dev)\n+nfp_pf_uninit(struct nfp_net_hw_priv *hw_priv)\n {\n+\tstruct nfp_pf_dev *pf_dev = hw_priv->pf_dev;\n+\n \tnfp_cpp_area_release_free(pf_dev->qc_area);\n \tfree(pf_dev->sym_tbl);\n \tif (pf_dev->multi_pf.enabled) {\n@@ -626,15 +639,19 @@ nfp_pf_uninit(struct nfp_pf_dev *pf_dev)\n \tnfp_cpp_free(pf_dev->cpp);\n \tnfp_sync_free(pf_dev->sync);\n \trte_free(pf_dev);\n+\trte_free(hw_priv);\n }\n \n static int\n-nfp_pf_secondary_uninit(struct nfp_pf_dev *pf_dev)\n+nfp_pf_secondary_uninit(struct nfp_net_hw_priv *hw_priv)\n {\n+\tstruct nfp_pf_dev *pf_dev = hw_priv->pf_dev;\n+\n \tfree(pf_dev->sym_tbl);\n \tnfp_cpp_free(pf_dev->cpp);\n \tnfp_sync_free(pf_dev->sync);\n \trte_free(pf_dev);\n+\trte_free(hw_priv);\n \n \treturn 0;\n }\n@@ -648,8 +665,11 @@ nfp_net_close(struct rte_eth_dev *dev)\n \tstruct nfp_net_hw *hw;\n \tstruct nfp_pf_dev *pf_dev;\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 \n+\thw_priv = dev->process_private;\n+\n \t/*\n \t * In secondary process, a released eth device can be found by its name\n \t * in shared memory.\n@@ -660,12 +680,12 @@ nfp_net_close(struct rte_eth_dev *dev)\n \t\tif (dev->state == RTE_ETH_DEV_UNUSED)\n \t\t\treturn 0;\n \n-\t\tnfp_pf_secondary_uninit(dev->process_private);\n+\t\tnfp_pf_secondary_uninit(hw_priv);\n \t\treturn 0;\n \t}\n \n \thw = dev->data->dev_private;\n-\tpf_dev = hw->pf_dev;\n+\tpf_dev = hw_priv->pf_dev;\n \tpci_dev = RTE_ETH_DEV_TO_PCI(dev);\n \tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(pf_dev->app_fw_priv);\n \n@@ -707,7 +727,7 @@ nfp_net_close(struct rte_eth_dev *dev)\n \t\t\tnfp_net_dev_interrupt_handler, (void *)dev);\n \n \tnfp_uninit_app_fw_nic(pf_dev);\n-\tnfp_pf_uninit(pf_dev);\n+\tnfp_pf_uninit(hw_priv);\n \n \treturn 0;\n }\n@@ -887,13 +907,15 @@ nfp_net_init(struct rte_eth_dev *eth_dev)\n \tstruct nfp_net_hw *net_hw;\n \tstruct nfp_pf_dev *pf_dev;\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 \n \tpci_dev = RTE_ETH_DEV_TO_PCI(eth_dev);\n \tnet_hw = eth_dev->data->dev_private;\n \n \t/* Use backpointer here to the PF of this eth_dev */\n-\tpf_dev = net_hw->pf_dev;\n+\thw_priv = eth_dev->process_private;\n+\tpf_dev = hw_priv->pf_dev;\n \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@@ -915,8 +937,8 @@ nfp_net_init(struct rte_eth_dev *eth_dev)\n \t\tuint32_t min_size;\n \n \t\thw->ctrl_bar = pf_dev->ctrl_bar;\n-\t\tmin_size = NFP_MAC_STATS_SIZE * net_hw->pf_dev->nfp_eth_table->max_index;\n-\t\tnet_hw->mac_stats_bar = nfp_rtsym_map(net_hw->pf_dev->sym_tbl, \"_mac_stats\",\n+\t\tmin_size = NFP_MAC_STATS_SIZE * pf_dev->nfp_eth_table->max_index;\n+\t\tnet_hw->mac_stats_bar = nfp_rtsym_map(pf_dev->sym_tbl, \"_mac_stats\",\n \t\t\t\tmin_size, &net_hw->mac_stats_area);\n \t\tif (net_hw->mac_stats_bar == NULL) {\n \t\t\tPMD_INIT_LOG(ERR, \"nfp_rtsym_map fails for _mac_stats_bar\");\n@@ -1472,7 +1494,7 @@ nfp_enable_multi_pf(struct nfp_pf_dev *pf_dev)\n }\n \n static int\n-nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\n+nfp_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv,\n \t\tconst struct nfp_dev_info *dev_info)\n {\n \tuint8_t i;\n@@ -1487,6 +1509,7 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\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 \n \tnfp_eth_table = pf_dev->nfp_eth_table;\n \tPMD_INIT_LOG(INFO, \"Total physical ports: %d\", nfp_eth_table->count);\n@@ -1529,7 +1552,6 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\n \n \t/* Populate coreNIC app properties */\n \tapp_fw_nic->total_phyports = total_vnics;\n-\tapp_fw_nic->pf_dev = pf_dev;\n \tif (total_vnics > 1)\n \t\tapp_fw_nic->multiport = true;\n \n@@ -1580,13 +1602,13 @@ nfp_init_app_fw_nic(struct nfp_pf_dev *pf_dev,\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 = 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@@ -1792,6 +1814,7 @@ nfp_pf_init(struct rte_pci_device *pci_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+\tstruct nfp_net_hw_priv *hw_priv;\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@@ -1810,13 +1833,20 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \t\treturn -ENODEV;\n \t}\n \n+\thw_priv = rte_zmalloc(NULL, sizeof(*hw_priv), 0);\n+\tif (hw_priv == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Can not alloc memory for hw priv data\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n \t/* Allocate memory for the PF \"device\" */\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-\t\treturn -ENOMEM;\n+\t\tret = -ENOMEM;\n+\t\tgoto hw_priv_free;\n \t}\n \n \tsync = nfp_sync_alloc();\n@@ -1937,6 +1967,8 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \n \tPMD_INIT_LOG(DEBUG, \"qc_bar address: %p\", pf_dev->qc_bar);\n \n+\thw_priv->pf_dev = pf_dev;\n+\n \t/*\n \t * PF initialization has been done at this point. Call app specific\n \t * init code now.\n@@ -1950,7 +1982,7 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \t\t}\n \n \t\tPMD_INIT_LOG(INFO, \"Initializing coreNIC\");\n-\t\tret = nfp_init_app_fw_nic(pf_dev, dev_info);\n+\t\tret = nfp_init_app_fw_nic(hw_priv, dev_info);\n \t\tif (ret != 0) {\n \t\t\tPMD_INIT_LOG(ERR, \"Could not initialize coreNIC!\");\n \t\t\tgoto hwqueues_cleanup;\n@@ -1958,7 +1990,7 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \t\tbreak;\n \tcase NFP_APP_FW_FLOWER_NIC:\n \t\tPMD_INIT_LOG(INFO, \"Initializing Flower\");\n-\t\tret = nfp_init_app_fw_flower(pf_dev, dev_info);\n+\t\tret = nfp_init_app_fw_flower(hw_priv, dev_info);\n \t\tif (ret != 0) {\n \t\t\tPMD_INIT_LOG(ERR, \"Could not initialize Flower!\");\n \t\t\tgoto hwqueues_cleanup;\n@@ -1996,12 +2028,14 @@ nfp_pf_init(struct rte_pci_device *pci_dev)\n \tnfp_sync_free(sync);\n pf_cleanup:\n \trte_free(pf_dev);\n+hw_priv_free:\n+\trte_free(hw_priv);\n \n \treturn ret;\n }\n \n static int\n-nfp_secondary_init_app_fw_nic(struct nfp_pf_dev *pf_dev)\n+nfp_secondary_init_app_fw_nic(struct nfp_net_hw_priv *hw_priv)\n {\n \tuint32_t i;\n \tint err = 0;\n@@ -2010,6 +2044,7 @@ nfp_secondary_init_app_fw_nic(struct nfp_pf_dev *pf_dev)\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 \t/* Read the number of vNIC's created for the PF */\n \tfunction_id = (pf_dev->pci_dev->addr.function) & 0x07;\n@@ -2039,7 +2074,7 @@ nfp_secondary_init_app_fw_nic(struct nfp_pf_dev *pf_dev)\n \t\t\tbreak;\n \t\t}\n \n-\t\teth_dev->process_private = pf_dev;\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@@ -2065,6 +2100,7 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_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+\tstruct nfp_net_hw_priv *hw_priv;\n \tconst struct nfp_dev_info *dev_info;\n \tchar app_name[RTE_ETH_NAME_MAX_LEN];\n \n@@ -2082,12 +2118,19 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)\n \t\treturn -ENODEV;\n \t}\n \n+\thw_priv = rte_zmalloc(NULL, sizeof(*hw_priv), 0);\n+\tif (hw_priv == NULL) {\n+\t\tPMD_INIT_LOG(ERR, \"Can not alloc memory for hw priv data\");\n+\t\treturn -ENOMEM;\n+\t}\n+\n \t/* Allocate memory for the PF \"device\" */\n \tsnprintf(name, sizeof(name), \"nfp_pf%d\", 0);\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-\t\treturn -ENOMEM;\n+\t\tret = -ENOMEM;\n+\t\tgoto hw_priv_free;\n \t}\n \n \tsync = nfp_sync_alloc();\n@@ -2143,11 +2186,13 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)\n \tpf_dev->pci_dev = pci_dev;\n \tpf_dev->sync = sync;\n \n+\thw_priv->pf_dev = pf_dev;\n+\n \t/* Call app specific init code now */\n \tswitch (app_fw_id) {\n \tcase NFP_APP_FW_CORE_NIC:\n \t\tPMD_INIT_LOG(INFO, \"Initializing coreNIC\");\n-\t\tret = nfp_secondary_init_app_fw_nic(pf_dev);\n+\t\tret = nfp_secondary_init_app_fw_nic(hw_priv);\n \t\tif (ret != 0) {\n \t\t\tPMD_INIT_LOG(ERR, \"Could not initialize coreNIC!\");\n \t\t\tgoto sym_tbl_cleanup;\n@@ -2155,7 +2200,7 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)\n \t\tbreak;\n \tcase NFP_APP_FW_FLOWER_NIC:\n \t\tPMD_INIT_LOG(INFO, \"Initializing Flower\");\n-\t\tret = nfp_secondary_init_app_fw_flower(pf_dev);\n+\t\tret = nfp_secondary_init_app_fw_flower(hw_priv);\n \t\tif (ret != 0) {\n \t\t\tPMD_INIT_LOG(ERR, \"Could not initialize Flower!\");\n \t\t\tgoto sym_tbl_cleanup;\n@@ -2177,6 +2222,8 @@ nfp_pf_secondary_init(struct rte_pci_device *pci_dev)\n \tnfp_sync_free(sync);\n pf_cleanup:\n \trte_free(pf_dev);\n+hw_priv_free:\n+\trte_free(hw_priv);\n \n \treturn ret;\n }\ndiff --git a/drivers/net/nfp/nfp_net_common.c b/drivers/net/nfp/nfp_net_common.c\nindex da1a7e7be1..60d77b6178 100644\n--- a/drivers/net/nfp/nfp_net_common.c\n+++ b/drivers/net/nfp/nfp_net_common.c\n@@ -685,6 +685,7 @@ nfp_net_allmulticast_disable(struct rte_eth_dev *dev)\n static int\n nfp_net_speed_aneg_update(struct rte_eth_dev *dev,\n \t\tstruct nfp_net_hw *hw,\n+\t\tstruct nfp_net_hw_priv *hw_priv,\n \t\tstruct rte_eth_link *link)\n {\n \tuint32_t i;\n@@ -700,11 +701,11 @@ nfp_net_speed_aneg_update(struct rte_eth_dev *dev,\n \t\t\treturn -EIO;\n \t\t}\n \n-\t\thw->pf_dev->nfp_eth_table->ports[hw->idx] = nfp_eth_table->ports[hw->idx];\n+\t\thw_priv->pf_dev->nfp_eth_table->ports[hw->idx] = nfp_eth_table->ports[hw->idx];\n \t\tfree(nfp_eth_table);\n \t}\n \n-\tnfp_eth_table = hw->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \teth_port = &nfp_eth_table->ports[hw->idx];\n \tspeed = eth_port->speed;\n \n@@ -730,10 +731,12 @@ nfp_net_link_update_common(struct rte_eth_dev *dev,\n {\n \tint ret;\n \tuint32_t nn_link_status;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n+\thw_priv = dev->process_private;\n \tif (link->link_status == RTE_ETH_LINK_UP) {\n-\t\tif (hw->pf_dev != NULL) {\n-\t\t\tret = nfp_net_speed_aneg_update(dev, hw, link);\n+\t\tif (hw_priv->pf_dev != NULL) {\n+\t\t\tret = nfp_net_speed_aneg_update(dev, hw, hw_priv, link);\n \t\t\tif (ret != 0) {\n \t\t\t\tPMD_DRV_LOG(DEBUG, \"Failed to update speed and aneg.\");\n \t\t\t\treturn ret;\n@@ -775,8 +778,10 @@ nfp_net_link_update(struct rte_eth_dev *dev,\n \tstruct nfp_net_hw *hw;\n \tuint32_t nn_link_status;\n \tstruct rte_eth_link link;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \thw = nfp_net_get_hw(dev);\n+\thw_priv = dev->process_private;\n \n \tmemset(&link, 0, sizeof(struct rte_eth_link));\n \n@@ -796,7 +801,7 @@ nfp_net_link_update(struct rte_eth_dev *dev,\n \t * Not applicable for VFs as the associated PF is still attached to the\n \t * kernel driver.\n \t */\n-\tif (hw->pf_dev != NULL)\n+\tif (hw_priv != NULL && hw_priv->pf_dev != NULL)\n \t\tnfp_net_notify_port_speed(hw, &link);\n \n \treturn ret;\n@@ -1173,8 +1178,10 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n \tuint16_t min_tx_desc;\n \tuint16_t max_tx_desc;\n \tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \thw = nfp_net_get_hw(dev);\n+\thw_priv = dev->process_private;\n \n \tnfp_net_rx_desc_limits(hw, &min_rx_desc, &max_rx_desc);\n \tnfp_net_tx_desc_limits(hw, &min_tx_desc, &max_tx_desc);\n@@ -1274,8 +1281,8 @@ nfp_net_infos_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n \t}\n \n \t/* Only PF supports getting speed capability. */\n-\tif (hw->pf_dev != NULL)\n-\t\tdev_info->speed_capa = hw->pf_dev->speed_capa;\n+\tif (hw_priv != NULL && hw_priv->pf_dev != NULL)\n+\t\tdev_info->speed_capa = hw_priv->pf_dev->speed_capa;\n \n \treturn 0;\n }\n@@ -2135,10 +2142,10 @@ nfp_net_get_mip_name(struct nfp_net_hw *hw,\n }\n \n static void\n-nfp_net_get_app_name(struct nfp_net_hw *hw,\n+nfp_net_get_app_name(struct nfp_net_hw_priv *hw_priv,\n \t\tchar *app_name)\n {\n-\tswitch (hw->pf_dev->app_fw_id) {\n+\tswitch (hw_priv->pf_dev->app_fw_id) {\n \tcase NFP_APP_FW_CORE_NIC:\n \t\tsnprintf(app_name, FW_VER_LEN, \"%s\", \"nic\");\n \t\tbreak;\n@@ -2161,11 +2168,13 @@ nfp_net_firmware_version_get(struct rte_eth_dev *dev,\n \tchar app_name[FW_VER_LEN];\n \tchar nsp_version[FW_VER_LEN];\n \tchar vnic_version[FW_VER_LEN];\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \tif (fw_size < FW_VER_LEN)\n \t\treturn FW_VER_LEN;\n \n \thw = nfp_net_get_hw(dev);\n+\thw_priv = dev->process_private;\n \n \tif (!rte_eth_dev_is_repr(dev)) {\n \t\tsnprintf(vnic_version, FW_VER_LEN, \"%d.%d.%d.%d\",\n@@ -2177,7 +2186,7 @@ nfp_net_firmware_version_get(struct rte_eth_dev *dev,\n \n \tnfp_net_get_nsp_info(hw, nsp_version);\n \tnfp_net_get_mip_name(hw, mip_name);\n-\tnfp_net_get_app_name(hw, app_name);\n+\tnfp_net_get_app_name(hw_priv, app_name);\n \n \tsnprintf(fw_version, FW_VER_LEN, \"%s %s %s %s\",\n \t\t\tvnic_version, nsp_version, mip_name, app_name);\n@@ -2212,8 +2221,10 @@ nfp_net_stop(struct rte_eth_dev *dev)\n {\n \tstruct nfp_cpp *cpp;\n \tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \thw = nfp_net_get_hw(dev);\n+\thw_priv = dev->process_private;\n \n \tnfp_net_disable_queues(dev);\n \n@@ -2224,7 +2235,7 @@ nfp_net_stop(struct rte_eth_dev *dev)\n \tif (rte_eal_process_type() == RTE_PROC_PRIMARY)\n \t\tcpp = hw->cpp;\n \telse\n-\t\tcpp = ((struct nfp_pf_dev *)(dev->process_private))->cpp;\n+\t\tcpp = hw_priv->pf_dev->cpp;\n \n \tnfp_eth_set_configured(cpp, hw->nfp_idx, 0);\n \n@@ -2255,15 +2266,15 @@ int\n nfp_net_flow_ctrl_get(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_fc_conf *fc_conf)\n {\n-\tstruct nfp_net_hw *net_hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_eth_table *nfp_eth_table;\n \tstruct nfp_eth_table_port *eth_port;\n \n-\tnet_hw = nfp_net_get_hw(dev);\n-\tif (net_hw->pf_dev == NULL)\n+\thw_priv = dev->process_private;\n+\tif (hw_priv == NULL || hw_priv->pf_dev == NULL)\n \t\treturn -EINVAL;\n \n-\tnfp_eth_table = net_hw->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \teth_port = &nfp_eth_table->ports[dev->data->port_id];\n \n \t/* Currently only RX/TX switch are supported */\n@@ -2319,15 +2330,17 @@ nfp_net_flow_ctrl_set(struct rte_eth_dev *dev,\n \tint ret;\n \tstruct nfp_net_hw *net_hw;\n \tenum rte_eth_fc_mode set_mode;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tenum rte_eth_fc_mode original_mode;\n \tstruct nfp_eth_table *nfp_eth_table;\n \tstruct nfp_eth_table_port *eth_port;\n \n \tnet_hw = nfp_net_get_hw(dev);\n-\tif (net_hw->pf_dev == NULL)\n+\thw_priv = dev->process_private;\n+\tif (hw_priv == NULL || hw_priv->pf_dev == NULL)\n \t\treturn -EINVAL;\n \n-\tnfp_eth_table = net_hw->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \teth_port = &nfp_eth_table->ports[net_hw->idx];\n \n \toriginal_mode = nfp_net_get_pause_mode(eth_port);\n@@ -2355,14 +2368,16 @@ nfp_net_fec_get_capability(struct rte_eth_dev *dev,\n \tuint16_t speed;\n \tstruct nfp_net_hw *hw;\n \tuint32_t supported_fec;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_eth_table *nfp_eth_table;\n \tstruct nfp_eth_table_port *eth_port;\n \n \thw = nfp_net_get_hw(dev);\n-\tif (hw->pf_dev == NULL)\n+\thw_priv = dev->process_private;\n+\tif (hw_priv == NULL || hw_priv->pf_dev == NULL)\n \t\treturn -EINVAL;\n \n-\tnfp_eth_table = hw->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \teth_port = &nfp_eth_table->ports[hw->idx];\n \n \tspeed = eth_port->speed;\n@@ -2412,20 +2427,22 @@ nfp_net_fec_get(struct rte_eth_dev *dev,\n \t\tuint32_t *fec_capa)\n {\n \tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_eth_table *nfp_eth_table;\n \tstruct nfp_eth_table_port *eth_port;\n \n \thw = nfp_net_get_hw(dev);\n-\tif (hw->pf_dev == NULL)\n+\thw_priv = dev->process_private;\n+\tif (hw_priv == NULL || hw_priv->pf_dev == NULL)\n \t\treturn -EINVAL;\n \n \tif (dev->data->dev_link.link_status == RTE_ETH_LINK_DOWN) {\n \t\tnfp_eth_table = nfp_eth_read_ports(hw->cpp);\n-\t\thw->pf_dev->nfp_eth_table->ports[hw->idx] = nfp_eth_table->ports[hw->idx];\n+\t\thw_priv->pf_dev->nfp_eth_table->ports[hw->idx] = nfp_eth_table->ports[hw->idx];\n \t\tfree(nfp_eth_table);\n \t}\n \n-\tnfp_eth_table = hw->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \teth_port = &nfp_eth_table->ports[hw->idx];\n \n \tif (!nfp_eth_can_support_fec(eth_port)) {\n@@ -2473,14 +2490,16 @@ nfp_net_fec_set(struct rte_eth_dev *dev,\n \tenum nfp_eth_fec fec;\n \tstruct nfp_net_hw *hw;\n \tuint32_t supported_fec;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_eth_table *nfp_eth_table;\n \tstruct nfp_eth_table_port *eth_port;\n \n \thw = nfp_net_get_hw(dev);\n-\tif (hw->pf_dev == NULL)\n+\thw_priv = dev->process_private;\n+\tif (hw_priv == NULL || hw_priv->pf_dev == NULL)\n \t\treturn -EINVAL;\n \n-\tnfp_eth_table = hw->pf_dev->nfp_eth_table;\n+\tnfp_eth_table = hw_priv->pf_dev->nfp_eth_table;\n \teth_port = &nfp_eth_table->ports[hw->idx];\n \n \tsupported_fec = nfp_eth_supported_fec_modes(eth_port);\ndiff --git a/drivers/net/nfp/nfp_net_common.h b/drivers/net/nfp/nfp_net_common.h\nindex 8066e77e6f..8dbe2fb973 100644\n--- a/drivers/net/nfp/nfp_net_common.h\n+++ b/drivers/net/nfp/nfp_net_common.h\n@@ -12,7 +12,6 @@\n #include <nfp_dev.h>\n #include <rte_spinlock.h>\n \n-#include \"flower/nfp_flower_service.h\"\n #include \"nfpcore/nfp_sync.h\"\n #include \"nfp_net_ctrl.h\"\n #include \"nfp_service.h\"\n@@ -86,6 +85,8 @@ struct nfp_multi_pf {\n \tuint8_t *beat_addr;\n };\n \n+struct nfp_flower_service;\n+\n struct nfp_process_share {\n \tstruct nfp_flower_service *fl_service;\n };\n@@ -145,9 +146,6 @@ struct nfp_net_priv {\n };\n \n struct nfp_app_fw_nic {\n-\t/** Backpointer to the PF device */\n-\tstruct nfp_pf_dev *pf_dev;\n-\n \t/**\n \t * Array of physical ports belonging to this CoreNIC app.\n \t * This is really a list of vNIC's, one for each physical port.\n@@ -158,13 +156,14 @@ struct nfp_app_fw_nic {\n \tuint8_t total_phyports;\n };\n \n+struct nfp_net_hw_priv {\n+\tstruct nfp_pf_dev *pf_dev;\n+};\n+\n struct nfp_net_hw {\n \t/** The parent class */\n \tstruct nfp_hw super;\n \n-\t/** Backpointer to the PF this port belongs to */\n-\tstruct nfp_pf_dev *pf_dev;\n-\n \t/** Backpointer to the eth_dev of this port */\n \tstruct rte_eth_dev *eth_dev;\n \n@@ -314,7 +313,7 @@ int nfp_net_flow_ctrl_get(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_fc_conf *fc_conf);\n int nfp_net_flow_ctrl_set(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_fc_conf *fc_conf);\n-void nfp_pf_uninit(struct nfp_pf_dev *pf_dev);\n+void nfp_pf_uninit(struct nfp_net_hw_priv *hw_priv);\n int nfp_net_fec_get_capability(struct rte_eth_dev *dev,\n \t\tstruct rte_eth_fec_capa *speed_fec_capa,\n \t\tunsigned int num);\ndiff --git a/drivers/net/nfp/nfp_net_flow.c b/drivers/net/nfp/nfp_net_flow.c\nindex ea743eed73..b0d1a57d99 100644\n--- a/drivers/net/nfp/nfp_net_flow.c\n+++ b/drivers/net/nfp/nfp_net_flow.c\n@@ -658,10 +658,12 @@ nfp_net_flow_setup(struct rte_eth_dev *dev,\n \tstruct nfp_net_priv *priv;\n \tstruct rte_flow *nfp_flow;\n \tstruct rte_flow *flow_find;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_app_fw_nic *app_fw_nic;\n \n \thw = dev->data->dev_private;\n-\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw->pf_dev->app_fw_priv);\n+\thw_priv = dev->process_private;\n+\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw_priv->pf_dev->app_fw_priv);\n \tpriv = app_fw_nic->ports[hw->idx]->priv;\n \n \tret = nfp_net_flow_calculate_items(items, &match_len);\n@@ -775,10 +777,12 @@ nfp_net_flow_validate(struct rte_eth_dev *dev,\n \tstruct nfp_net_hw *hw;\n \tstruct rte_flow *nfp_flow;\n \tstruct nfp_net_priv *priv;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_app_fw_nic *app_fw_nic;\n \n \thw = dev->data->dev_private;\n-\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw->pf_dev->app_fw_priv);\n+\thw_priv = dev->process_private;\n+\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw_priv->pf_dev->app_fw_priv);\n \tpriv = app_fw_nic->ports[hw->idx]->priv;\n \n \tnfp_flow = nfp_net_flow_setup(dev, attr, items, actions);\n@@ -811,10 +815,12 @@ nfp_net_flow_create(struct rte_eth_dev *dev,\n \tstruct nfp_net_hw *hw;\n \tstruct rte_flow *nfp_flow;\n \tstruct nfp_net_priv *priv;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_app_fw_nic *app_fw_nic;\n \n \thw = dev->data->dev_private;\n-\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw->pf_dev->app_fw_priv);\n+\thw_priv = dev->process_private;\n+\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw_priv->pf_dev->app_fw_priv);\n \tpriv = app_fw_nic->ports[hw->idx]->priv;\n \n \tnfp_flow = nfp_net_flow_setup(dev, attr, items, actions);\n@@ -861,10 +867,12 @@ nfp_net_flow_destroy(struct rte_eth_dev *dev,\n \tstruct nfp_net_hw *hw;\n \tstruct nfp_net_priv *priv;\n \tstruct rte_flow *flow_find;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_app_fw_nic *app_fw_nic;\n \n \thw = dev->data->dev_private;\n-\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw->pf_dev->app_fw_priv);\n+\thw_priv = dev->process_private;\n+\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw_priv->pf_dev->app_fw_priv);\n \tpriv = app_fw_nic->ports[hw->idx]->priv;\n \n \t/* Find the flow in flow hash table */\n@@ -920,10 +928,12 @@ nfp_net_flow_flush(struct rte_eth_dev *dev,\n \tstruct nfp_net_hw *hw;\n \tstruct rte_flow *nfp_flow;\n \tstruct rte_hash *flow_table;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \tstruct nfp_app_fw_nic *app_fw_nic;\n \n \thw = dev->data->dev_private;\n-\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw->pf_dev->app_fw_priv);\n+\thw_priv = dev->process_private;\n+\tapp_fw_nic = NFP_PRIV_TO_APP_FW_NIC(hw_priv->pf_dev->app_fw_priv);\n \tflow_table = app_fw_nic->ports[hw->idx]->priv->flow_table;\n \n \twhile (rte_hash_iterate(flow_table, &next_key, &next_data, &iter) >= 0) {\ndiff --git a/drivers/net/nfp/nfp_rxtx.c b/drivers/net/nfp/nfp_rxtx.c\nindex f9c4636688..12f362a4f4 100644\n--- a/drivers/net/nfp/nfp_rxtx.c\n+++ b/drivers/net/nfp/nfp_rxtx.c\n@@ -418,6 +418,7 @@ nfp_net_recv_pkts(void *rx_queue,\n \tstruct nfp_net_dp_buf *rxb;\n \tstruct nfp_net_rx_desc *rxds;\n \tuint16_t avail_multiplexed = 0;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \trxq = rx_queue;\n \tif (unlikely(rxq == NULL)) {\n@@ -430,6 +431,7 @@ nfp_net_recv_pkts(void *rx_queue,\n \t}\n \n \thw = rxq->hw;\n+\thw_priv = rxq->hw_priv;\n \n \twhile (avail + avail_multiplexed < nb_pkts) {\n \t\trxb = &rxq->rxbufs[rxq->rd_p];\n@@ -520,7 +522,7 @@ nfp_net_recv_pkts(void *rx_queue,\n \n \t\tif (((meta.flags >> NFP_NET_META_PORTID) & 0x1) == 0) {\n \t\t\trx_pkts[avail++] = mb;\n-\t\t} else if (nfp_flower_pf_dispatch_pkts(hw, mb, meta.port_id)) {\n+\t\t} else if (nfp_flower_pf_dispatch_pkts(hw_priv, mb, meta.port_id)) {\n \t\t\tavail_multiplexed++;\n \t\t} else {\n \t\t\trte_pktmbuf_free(mb);\n@@ -684,6 +686,7 @@ nfp_net_rx_queue_setup(struct rte_eth_dev *dev,\n \tnfp_net_reset_rx_queue(rxq);\n \n \trxq->hw = hw;\n+\trxq->hw_priv = dev->process_private;\n \n \t/*\n \t * Telling the HW about the physical address of the RX ring and number\ndiff --git a/drivers/net/nfp/nfp_rxtx.h b/drivers/net/nfp/nfp_rxtx.h\nindex 0aa73a6432..8cd3649882 100644\n--- a/drivers/net/nfp/nfp_rxtx.h\n+++ b/drivers/net/nfp/nfp_rxtx.h\n@@ -30,6 +30,7 @@ struct nfp_tx_ipsec_desc_msg {\n struct nfp_net_txq {\n \t/** Backpointer to nfp_net structure */\n \tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \t/**\n \t * For each descriptor keep a reference to the mbuf and\n@@ -69,8 +70,8 @@ struct nfp_net_txq {\n \tuint16_t data_pending;\n \n \t/**\n-\t * At this point 50 bytes have been used for all the fields in the\n-\t * TX critical path. We have room for 14 bytes and still all placed\n+\t * At this point 58 bytes have been used for all the fields in the\n+\t * TX critical path. We have room for 6 bytes and still all placed\n \t * in a cache line.\n \t */\n \tuint64_t dma;\n@@ -138,6 +139,7 @@ struct nfp_net_rx_desc {\n struct nfp_net_rxq {\n \t/** Backpointer to nfp_net structure */\n \tstruct nfp_net_hw *hw;\n+\tstruct nfp_net_hw_priv *hw_priv;\n \n \t/**\n \t * Point to the base addresses of the freelist queue\n@@ -188,8 +190,8 @@ struct nfp_net_rxq {\n \tuint16_t qidx;\n \n \t/**\n-\t * At this point 54 bytes have been used for all the fields in the\n-\t * RX critical path. We have room for 10 bytes and still all placed\n+\t * At this point 62 bytes have been used for all the fields in the\n+\t * RX critical path. We have room for 2 bytes and still all placed\n \t * in a cache line.\n \t */\n \n",
    "prefixes": [
        "v2",
        "4/8"
    ]
}