From patchwork Wed Aug 16 14:39:08 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Louis Peens X-Patchwork-Id: 13355328 X-Patchwork-Delegate: kuba@kernel.org Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB90E11CB4 for ; Wed, 16 Aug 2023 14:40:28 +0000 (UTC) Received: from NAM11-DM6-obe.outbound.protection.outlook.com (mail-dm6nam11on2125.outbound.protection.outlook.com [40.107.223.125]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 2FED0272C for ; Wed, 16 Aug 2023 07:40:27 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=cUujMTf6po7vXmMFDpdybbNJzdrH5gtWw5x3aJHJdA4KZVFONj8ED8qY6epKoCqfqR8g2vcmWDC59zH7ZXuD4mRPqEocrlJjIApYXOBBYMdxktz1h+ouEQ0ov1cx87wONZABVnOefVZv7kW7mfJByhCvALIh6C8z/ANsuDQUgzbMH1+1XFttX/iFK/Fa9jnHgLl1MawGZrFpurQWNfL10pj5O98xHkfEGB/o1LOiQ0mKMEgwEyJ3xdrj60A5dtdeRsbkNJCwWago+aA2iUiKufIRP2k1mt/i9mPJneEJ+NWePk908ytNwfQwOXM0B9PbzPOfoQNWanzIslPkeB1h7Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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; bh=RVUFfMqVp60K93bqETr9AAhjfji0GkRrh5Ikr8sz7F8=; b=O7jyOYD9SPQ42KdnwAlJahG6yF6DNiQpK2NzU5H3afQg1qDFM1T5ml55MAclYkY1yDb5cIiUrI2wkO7f28utDFAeUCJpXH/OZKjcyf98eR9JBiz5KKdDe1u+tqWjwYmVTJitmsNXXTxxB0UtkEuNXOELlUbee4RXKnosjMmFv0pdrKEwKlUua/AxW1qbnVJOFeVUWDN+sftka/OU6dE1STVbJmIgsNBe0krgoN4QWqrzzqKikPWb36/fIX8AVxV5p6swi72bfxfc7Wb5LHfv+i2SM96L8iZ+4V/mDtQgml60vKrhfrQduDvebawUD395Yux30bvwoMVbCDxkavrIUA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=corigine.com; dmarc=pass action=none header.from=corigine.com; dkim=pass header.d=corigine.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=corigine.onmicrosoft.com; s=selector2-corigine-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=RVUFfMqVp60K93bqETr9AAhjfji0GkRrh5Ikr8sz7F8=; b=Y/1MuXm15KpjEx4WNLlzG8fxf8sPykiVicUfGxrEc3NntSNP3JSqyifZ4bzOjc9LWZXcE7EkRv9uVRzf09+uLrVljT9rUu3xTj9jDfL9zkCMwomL4Mry79+04qDqi3XtGAVgWlM4aGlGTPRYY9yRIo3xomRvfiW2xhJiDeq8eLQ= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=corigine.com; Received: from DM6PR13MB4249.namprd13.prod.outlook.com (2603:10b6:5:7b::25) by PH0PR13MB5004.namprd13.prod.outlook.com (2603:10b6:510:7b::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6678.30; Wed, 16 Aug 2023 14:40:25 +0000 Received: from DM6PR13MB4249.namprd13.prod.outlook.com ([fe80::8de6:efe3:ad0f:2a23]) by DM6PR13MB4249.namprd13.prod.outlook.com ([fe80::8de6:efe3:ad0f:2a23%6]) with mapi id 15.20.6678.025; Wed, 16 Aug 2023 14:40:25 +0000 From: Louis Peens To: David Miller , Jakub Kicinski , Paolo Abeni Cc: Simon Horman , Yinjun Zhang , Tianyu Yuan , netdev@vger.kernel.org, oss-drivers@corigine.com Subject: [PATCH net-next v2 09/13] nfp: apply one port per PF for multi-PF setup Date: Wed, 16 Aug 2023 16:39:08 +0200 Message-Id: <20230816143912.34540-10-louis.peens@corigine.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230816143912.34540-1-louis.peens@corigine.com> References: <20230816143912.34540-1-louis.peens@corigine.com> X-ClientProxiedBy: JNXP275CA0012.ZAFP275.PROD.OUTLOOK.COM (2603:1086:0:19::24) To DM6PR13MB4249.namprd13.prod.outlook.com (2603:10b6:5:7b::25) Precedence: bulk X-Mailing-List: netdev@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: DM6PR13MB4249:EE_|PH0PR13MB5004:EE_ X-MS-Office365-Filtering-Correlation-Id: 5d305a88-a00e-4dec-7627-08db9e66ba00 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: /BKW6zQZC9L/FJ+5OSPRIMBIl+7CcHbitrOZv9ONt0wuBQRleHRHFyU67u41FtjiN3MZp/yO9y63ro1PkHEAmE8m1vJjgvZv3xdFERaHvAvaffxbJhH4Cw6IAJxLgbvbd2D7Vy+Kt7ikrohA3okYqz4t/Nts/ZoUHXi1i8EMIrm/y8Do1jD4ELvE1eBrfwX2SODTmpbW0MFjxm3fMd1le2L1K3H7aiBQpHBSCpqnZfPAxB6SZbcXlxsbsnPsAdHRuAf9pN7VMCZxEqByuXErZ3MK2gVzjHcYdo26DguML1QAR8TBZ4SRkWlP4y72yMtZoUTSxSUQxfxeBWgas0bYLM0DV0RkFyqivA/M4P3CS8uA/4sLcM31KbvBekO5hS3xcaCHxH4e8l65JwU7KrLx87XjNEe6NArSCFyi54on9Ebo2/ZeywIQJKf+NLifh1NVWoUtPC9aH3pKC0/rQRE9r0iesDsbYw7RM7C7/e6GnjjHMDVilDPZ695Nnar03MJ5aLfRKKW+2CbfV2T68ephd3wJ2+rEZP1H8rgVjDimBfpekhsqxIHO5cKCZCUtygb3PHl9UzGc2xBjcR/P6xZVvu51y4F4bzjZW3wPoJyNIthieAe7pI3or8vNEvUAuB7+PLzvyAntpg4VSnHFmiN9xDo/2kckOoIo2PHSlwMfcO6s4pro5ZDIHsYHQMsCGfwq X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DM6PR13MB4249.namprd13.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(366004)(136003)(396003)(346002)(39840400004)(376002)(451199024)(1800799009)(186009)(316002)(54906003)(66946007)(110136005)(66476007)(66556008)(12101799020)(41300700001)(5660300002)(44832011)(8936002)(8676002)(38100700002)(38350700002)(4326008)(2906002)(83380400001)(26005)(478600001)(86362001)(6512007)(52116002)(107886003)(6666004)(1076003)(36756003)(2616005)(6486002)(6506007);DIR:OUT;SFP:1102; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?q?OTihDMcuoXDSlwTnUzKA7DWDzm/H?= =?utf-8?q?HQB6oaqGaptTatoiG7A/9E1sphvxgHhTmx02AdTK6srRN9NF3omYwYScLZf5fRgoh?= =?utf-8?q?dGm9LPdxi+olX2nqyK0degStjKHpeJiHKnfl3Ul6ber2450obKbMlHph5nvnnBGHi?= =?utf-8?q?O/AHbgwvaAyAqKDiL39yxWtwiEdZZUwYMCyK7CodmsZaJNVl2PDhhCmzuFZBecj0z?= =?utf-8?q?cEbjuQoXWOBXYvNxYucz+tq6DJKEHRoM7CHmGoEjBBLufRm8LE9iU+qQn7roRvb+G?= =?utf-8?q?TNdOWc3l4w/sw4quNyDQpA5ooWGb52SdSTpTF1CjAKhGjad925N9VLrOZAcekoE0c?= =?utf-8?q?Gz/hn5EukowxiTbZ+Xg4VUUF45Wy7G0fbditQHgoX3O1M94Sk3W32JLFd60NgJy/X?= =?utf-8?q?fNRJYt+qohWxVMLEM85Ctpn4beDbNy3BfotIHrXkY5kiE4WKjIekRCTv6IRzP4u84?= =?utf-8?q?/Tk5z3qJgzKk6KTHHFccN7G50sQlXydADYlQj9bdZoFpaC3ILmbO7JjGB1gmhsmRm?= =?utf-8?q?W5jaGG2ZaWFUyJOCpZ+KPyBwulMpvm5XWxxkJYymkq/eWRIMeFzsmq22kTAEoZXKo?= =?utf-8?q?VH8sE1+D3mD2PEkXSnFfqU2O7PMXf/u9Ne5e/dsYYOudQN1fosa/BbvMkUdUIiGT7?= =?utf-8?q?R+KEumRqiQSxDJ3vFz3nuxUAUkpK1Y0h7pE+YcGoeLJP1PHSJk5IG5FLIqI06t0Ux?= =?utf-8?q?sKEa44czx35iH0/14EU98t6h3ojvc50tBr/KgNtnmWe2GBhkY0Nx73xMcA08n9pFW?= =?utf-8?q?0OCqUolhabRvJvr1NNBI6MVF1rIOiH2hZAj+t1VIG8HI2Q6sS1nshaLzOBBfh22VK?= =?utf-8?q?yoE8aLbRypjoA9w4fGxS2Ntj/OcKy+YDuE4cd6h3LkzNYGl5DquZaOkK68jt1NSQN?= =?utf-8?q?nug2xF1BBfQ0XCP5acBcIZA668hyFrpazB4TuBApXB0QHn0dU+qX5YRsezTL7x0ZM?= =?utf-8?q?+h94kGmro+9RwNkTdZC7OFGzuD8L0juV0IGNiQEirslCX8oJsX0Nj0ujnlUCouPye?= =?utf-8?q?2VdHnjix0YlrrysRA5hNhoPjZ3hoRuLQxzyTTdi02K3B19vzy7cMYnvPzm55K/nar?= =?utf-8?q?OjlAHW3mVuR9zZo03lM4KdWLBDqbN76qANlYUgPgNjActkkt4wgSnVrECPqDZELul?= =?utf-8?q?4vHXQGbxJuPK2HTT2p+j+Ztvsd97ImDe3aM27po7LduyJMnvCEZutFBEIzuFkz7vg?= =?utf-8?q?E7YRTxtuNmKvZobyqYQloyVHdlPBoKZy8lueTJdka3LI+NGfXDSygyRI7nsdoGcs/?= =?utf-8?q?Eu+qgUWwXGFzy/9dm3uRpXlr8pdcUYiPnmAyFAFm1lpwZ1nuHuezS8UOCbSP89tBY?= =?utf-8?q?yf55bBKCkj3SQNIVfz4RsAw3qT3L26nV+aRbXbO95++n5s09dJml519TOTDbhIP+d?= =?utf-8?q?jOCdaG+hFk6qfbfbLFZq/1Hn/P5oI5WGA/JClGiYAhd0SJiUDgJWFTiIr38GKo5QV?= =?utf-8?q?aHN0LknP2+Tt/Ql8m1fdNfnnRWy7phpegfmafWCHNvoRFuc7xpZiljRb3RVhHg1Pv?= =?utf-8?q?/+RY95JTBBWT6ieaN0U+PBS9PoVMm6tceA=3D=3D?= X-OriginatorOrg: corigine.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5d305a88-a00e-4dec-7627-08db9e66ba00 X-MS-Exchange-CrossTenant-AuthSource: DM6PR13MB4249.namprd13.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Aug 2023 14:40:25.1645 (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: i6K6pvfSlmKHTTNgAMUuu7ISI/qBZIj7+sMEIi2Mbk9++182SQFck86IclShmHlFlHxUXg+CN4WCPO0Ug1opMCifAoTyY2KkStpk15jQgxU= X-MS-Exchange-Transport-CrossTenantHeadersStamped: PH0PR13MB5004 X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,RCVD_IN_DNSWL_BLOCKED,RCVD_IN_MSPIKE_H2,SPF_HELO_PASS, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net X-Patchwork-Delegate: kuba@kernel.org From: Tianyu Yuan Only one port per PF is allowed in multi-PF setup. While eth_table still carries the total port info, each PF need bind itself with correct port according to PF id. Signed-off-by: Tianyu Yuan Reviewed-by: Niklas Söderlund Acked-by: Simon Horman Signed-off-by: Louis Peens --- drivers/net/ethernet/netronome/nfp/abm/main.c | 2 +- drivers/net/ethernet/netronome/nfp/bpf/main.c | 2 +- .../net/ethernet/netronome/nfp/flower/main.c | 17 ++++++++++------- drivers/net/ethernet/netronome/nfp/nfp_main.h | 6 ++++++ .../net/ethernet/netronome/nfp/nfp_net_main.c | 11 ++++++++--- drivers/net/ethernet/netronome/nfp/nfp_port.c | 4 +++- drivers/net/ethernet/netronome/nfp/nic/main.c | 3 ++- 7 files changed, 31 insertions(+), 14 deletions(-) diff --git a/drivers/net/ethernet/netronome/nfp/abm/main.c b/drivers/net/ethernet/netronome/nfp/abm/main.c index 5d3df28c648f..d4acaa15629d 100644 --- a/drivers/net/ethernet/netronome/nfp/abm/main.c +++ b/drivers/net/ethernet/netronome/nfp/abm/main.c @@ -451,7 +451,7 @@ static int nfp_abm_init(struct nfp_app *app) nfp_err(pf->cpp, "ABM NIC requires ETH table\n"); return -EINVAL; } - if (pf->max_data_vnics != pf->eth_tbl->count) { + if (pf->max_data_vnics != pf->eth_tbl->count && !pf->multi_pf.en) { nfp_err(pf->cpp, "ETH entries don't match vNICs (%d vs %d)\n", pf->max_data_vnics, pf->eth_tbl->count); return -EINVAL; diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.c b/drivers/net/ethernet/netronome/nfp/bpf/main.c index f469950c7265..3d928dfba114 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.c @@ -70,7 +70,7 @@ nfp_bpf_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id) nfp_err(pf->cpp, "No ETH table\n"); return -EINVAL; } - if (pf->max_data_vnics != pf->eth_tbl->count) { + if (pf->max_data_vnics != pf->eth_tbl->count && !pf->multi_pf.en) { nfp_err(pf->cpp, "ETH entries don't match vNICs (%d vs %d)\n", pf->max_data_vnics, pf->eth_tbl->count); return -EINVAL; diff --git a/drivers/net/ethernet/netronome/nfp/flower/main.c b/drivers/net/ethernet/netronome/nfp/flower/main.c index 565987f0a595..2e79b6d981de 100644 --- a/drivers/net/ethernet/netronome/nfp/flower/main.c +++ b/drivers/net/ethernet/netronome/nfp/flower/main.c @@ -428,10 +428,10 @@ nfp_flower_spawn_vnic_reprs(struct nfp_app *app, goto err_reprs_clean; } if (repr_type == NFP_REPR_TYPE_PF) { - port->pf_id = i; + port->pf_id = nfp_net_get_id(app->pf, i); port->vnic = priv->nn->dp.ctrl_bar; } else { - port->pf_id = 0; + port->pf_id = nfp_net_get_id(app->pf, 0); port->vf_id = i; port->vnic = app->pf->vf_cfg_mem + i * NFP_NET_CFG_BAR_SZ; @@ -496,28 +496,31 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv) struct nfp_eth_table *eth_tbl = app->pf->eth_tbl; atomic_t *replies = &priv->reify_replies; struct nfp_flower_repr_priv *repr_priv; + int err, reify_cnt, phy_reprs_num; struct nfp_repr *nfp_repr; struct sk_buff *ctrl_skb; struct nfp_reprs *reprs; - int err, reify_cnt; unsigned int i; ctrl_skb = nfp_flower_cmsg_mac_repr_start(app, eth_tbl->count); if (!ctrl_skb) return -ENOMEM; + phy_reprs_num = app->pf->multi_pf.en ? app->pf->max_data_vnics : eth_tbl->count; reprs = nfp_reprs_alloc(eth_tbl->max_index + 1); if (!reprs) { err = -ENOMEM; goto err_free_ctrl_skb; } - for (i = 0; i < eth_tbl->count; i++) { - unsigned int phys_port = eth_tbl->ports[i].index; + for (i = 0; i < phy_reprs_num; i++) { + int idx = nfp_net_get_id(app->pf, i); struct net_device *repr; + unsigned int phys_port; struct nfp_port *port; u32 cmsg_port_id; + phys_port = eth_tbl->ports[idx].index; repr = nfp_repr_alloc(app); if (!repr) { err = -ENOMEM; @@ -542,7 +545,7 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv) nfp_repr_free(repr); goto err_reprs_clean; } - err = nfp_port_init_phy_port(app->pf, app, port, i); + err = nfp_port_init_phy_port(app->pf, app, port, idx); if (err) { kfree(repr_priv); nfp_port_free(port); @@ -609,7 +612,7 @@ nfp_flower_spawn_phy_reprs(struct nfp_app *app, struct nfp_flower_priv *priv) static int nfp_flower_vnic_alloc(struct nfp_app *app, struct nfp_net *nn, unsigned int id) { - if (id > 0) { + if (id > 0 && !app->pf->multi_pf.en) { nfp_warn(app->cpp, "FlowerNIC doesn't support more than one data vNIC\n"); goto err_invalid_port; } diff --git a/drivers/net/ethernet/netronome/nfp/nfp_main.h b/drivers/net/ethernet/netronome/nfp/nfp_main.h index 7f76c718fef8..4f6763ca1c92 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_main.h +++ b/drivers/net/ethernet/netronome/nfp/nfp_main.h @@ -210,4 +210,10 @@ unsigned int nfp_net_lr2speed(unsigned int linkrate); unsigned int nfp_net_speed2lr(unsigned int speed); u8 nfp_get_pf_id(struct nfp_pf *pf); + +static inline unsigned int nfp_net_get_id(const struct nfp_pf *pf, unsigned int id) +{ + return pf->multi_pf.en ? pf->multi_pf.id : id; +} + #endif /* NFP_MAIN_H */ diff --git a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c index cbe4972ba104..98e155d79eb8 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_net_main.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_net_main.c @@ -141,7 +141,7 @@ nfp_net_pf_init_vnic(struct nfp_pf *pf, struct nfp_net *nn, unsigned int id) { int err; - nn->id = id; + nn->id = nfp_net_get_id(pf, id); if (nn->port) { err = nfp_devlink_port_register(pf->app, nn->port); @@ -183,8 +183,8 @@ nfp_net_pf_alloc_vnics(struct nfp_pf *pf, void __iomem *ctrl_bar, int err; for (i = 0; i < pf->max_data_vnics; i++) { - nn = nfp_net_pf_alloc_vnic(pf, true, ctrl_bar, qc_bar, - stride, i); + nn = nfp_net_pf_alloc_vnic(pf, true, ctrl_bar, qc_bar, stride, + nfp_net_get_id(pf, i)); if (IS_ERR(nn)) { err = PTR_ERR(nn); goto err_free_prev; @@ -707,6 +707,11 @@ int nfp_net_pci_probe(struct nfp_pf *pf) if ((int)pf->max_data_vnics < 0) return pf->max_data_vnics; + if (pf->multi_pf.en && pf->max_data_vnics != 1) { + nfp_err(pf->cpp, "Only one data_vnic per PF is supported in multiple PF setup.\n"); + return -EINVAL; + } + err = nfp_net_pci_map_mem(pf); if (err) return err; diff --git a/drivers/net/ethernet/netronome/nfp/nfp_port.c b/drivers/net/ethernet/netronome/nfp/nfp_port.c index 54640bcb70fb..c1612a464b5d 100644 --- a/drivers/net/ethernet/netronome/nfp/nfp_port.c +++ b/drivers/net/ethernet/netronome/nfp/nfp_port.c @@ -189,7 +189,9 @@ int nfp_port_init_phy_port(struct nfp_pf *pf, struct nfp_app *app, port->eth_port = &pf->eth_tbl->ports[id]; port->eth_id = pf->eth_tbl->ports[id].index; - port->netdev->dev_port = id; + if (!pf->multi_pf.en) + port->netdev->dev_port = id; + if (pf->mac_stats_mem) port->eth_stats = pf->mac_stats_mem + port->eth_id * NFP_MAC_STATS_SIZE; diff --git a/drivers/net/ethernet/netronome/nfp/nic/main.c b/drivers/net/ethernet/netronome/nfp/nic/main.c index 9dd5afe37f6e..e7a2d01bcbff 100644 --- a/drivers/net/ethernet/netronome/nfp/nic/main.c +++ b/drivers/net/ethernet/netronome/nfp/nic/main.c @@ -12,7 +12,8 @@ static int nfp_nic_init(struct nfp_app *app) { struct nfp_pf *pf = app->pf; - if (pf->eth_tbl && pf->max_data_vnics != pf->eth_tbl->count) { + if (pf->eth_tbl && pf->max_data_vnics != pf->eth_tbl->count && + !pf->multi_pf.en) { nfp_err(pf->cpp, "ETH entries don't match vNICs (%d vs %d)\n", pf->max_data_vnics, pf->eth_tbl->count); return -EINVAL;