From nobody Wed Apr 1 22:18:27 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (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 9835D31E848; Wed, 1 Apr 2026 15:31:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775057475; cv=none; b=UULxjz97LY65V59G/WK7VY11ZZsGM1HMRvYZMVTRKGnGHodABNPMVmRiDk61SB1ws4LxZhGteOaMUsAs1wyL0RcsAsT6ifCKbdLMa+3atamo9U4oodPw760tQSWBoKJd2SAdE17lfCW3Gqp+SGltCaRFJ7KbDIgI2rLyvj6SWrY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1775057475; c=relaxed/simple; bh=ZxR9g+zCxK8pArCJ7PTFR8axACYwGxTDHOn4nO9U1U8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=d8mq1U5iJrFKH+2zklwiuiIn0B3nKokXt4EZ1E81IlKXsL2Wwx5BywX1cTdPovc9QiMpnRcxLJkyfukkFp5tYVkJLyjLjH5yN8KoqHHW+WeBYVQqc/aarAptRoQUnRRZA9n83Je+GOSVJa/qqo8ieVGaCW9ntj+WM1ynmy1a4oc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=uA0oydwT; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="uA0oydwT" Received: by smtp.kernel.org (Postfix) with ESMTPS id 51B85C2BCB7; Wed, 1 Apr 2026 15:31:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1775057475; bh=ZxR9g+zCxK8pArCJ7PTFR8axACYwGxTDHOn4nO9U1U8=; h=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From; b=uA0oydwTFgmYGiier3lyvcobLsquPjGlxR4v5y7mS1Je36CQAFHwuJ2RbD6i7Jh2r 6oMj/FWcmZHSyccf0GLx02bW2wcprmjA9MEMdrdakcA+KZbRFp/LLS5osewihZMh+K daD26feJHuF+gAx+sx/T5NGk6Wlr/zCLu3UyiCkbq5ZzHfH2ZZtDX5O7f0NQZ/Mc8s s1io8VHFb5P+4wHZ4TQTweETM1wO05kIwsleZquvI46Y6jdfU5mX0EYccBlnJ/n6xP lvcdKgtO3lNMg0nbsy/wD8uvFinWHhatlVtBzsqMjxqduFXQTLW69RSOX5zP0Sx75W tJLllct2UMIPA== Received: from aws-us-west-2-korg-lkml-1.web.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2832510F6FBF; Wed, 1 Apr 2026 15:31:15 +0000 (UTC) From: Satish Kharat via B4 Relay Date: Wed, 01 Apr 2026 08:31:13 -0700 Subject: [PATCH net-next v4 3/6] enic: detect SR-IOV VF type from PCI capability Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260401-enic-sriov-v2-prep-v4-3-d5834b2ef1b9@cisco.com> References: <20260401-enic-sriov-v2-prep-v4-0-d5834b2ef1b9@cisco.com> In-Reply-To: <20260401-enic-sriov-v2-prep-v4-0-d5834b2ef1b9@cisco.com> To: Satish Kharat , Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org X-Mailer: b4 0.13.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1775057474; l=3365; i=satishkh@cisco.com; h=from:subject:message-id; bh=EHjug9jFvuqtjK7rgKqTb+ZxcNgtnQ9ViaQc7HzlDNE=; b=vJPjAYIT6ICjjuxvqdFVbQXPctQcktrz/bLD7aFH5psIc8RpqXJlPmAIN5lvKkGG+nYtsLBlR zJn/g44P3m8A6VLlqEDzHlgHvU9A/wSzgFRamOBUOgq0t1teLkUizQs X-Developer-Key: i=satishkh@cisco.com; a=ed25519; pk=4BxbLoCGvHeIMH/PbpiNVx8/2IcTjFvqcr0AD8K6WLY= X-Endpoint-Received: by B4 Relay for satishkh@cisco.com/default with auth_id=639 X-Original-From: Satish Kharat Reply-To: satishkh@cisco.com From: Satish Kharat Read the VF device ID from the SR-IOV PCI capability at probe time to determine whether the PF is configured for V1, USNIC, or V2 virtual functions. Store the result in enic->vf_type for use by subsequent SR-IOV operations. The VF type is a firmware-configured property (set via UCSM, CIMC, Intersight etc) that is immutable from the driver's perspective. Only PFs are probed for this capability; VFs and dynamic vnics skip detection. Signed-off-by: Satish Kharat --- drivers/net/ethernet/cisco/enic/enic.h | 8 +++++++ drivers/net/ethernet/cisco/enic/enic_main.c | 37 +++++++++++++++++++++++++= ++++ 2 files changed, 45 insertions(+) diff --git a/drivers/net/ethernet/cisco/enic/enic.h b/drivers/net/ethernet/= cisco/enic/enic.h index 366c65d072fc..0fd9cd917132 100644 --- a/drivers/net/ethernet/cisco/enic/enic.h +++ b/drivers/net/ethernet/cisco/enic/enic.h @@ -225,6 +225,13 @@ struct enic_rq { struct page_pool *pool; } ____cacheline_aligned; =20 +enum enic_vf_type { + ENIC_VF_TYPE_NONE, + ENIC_VF_TYPE_V1, + ENIC_VF_TYPE_USNIC, + ENIC_VF_TYPE_V2, +}; + /* Per-instance private data structure */ struct enic { struct net_device *netdev; @@ -252,6 +259,7 @@ struct enic { #ifdef CONFIG_PCI_IOV u16 num_vfs; #endif + enum enic_vf_type vf_type; spinlock_t enic_api_lock; bool enic_api_busy; struct enic_port_profile *pp; diff --git a/drivers/net/ethernet/cisco/enic/enic_main.c b/drivers/net/ethe= rnet/cisco/enic/enic_main.c index e16dfbcd2c22..acd05350ec1a 100644 --- a/drivers/net/ethernet/cisco/enic/enic_main.c +++ b/drivers/net/ethernet/cisco/enic/enic_main.c @@ -67,6 +67,7 @@ #define PCI_DEVICE_ID_CISCO_VIC_ENET_DYN 0x0044 /* enet dynamic vnic = */ #define PCI_DEVICE_ID_CISCO_VIC_ENET_VF 0x0071 /* enet SRIOV VF */ #define PCI_DEVICE_ID_CISCO_VIC_ENET_VF_V2 0x02b7 /* enet SRIOV V2 VF */ +#define PCI_DEVICE_ID_CISCO_VIC_ENET_VF_USNIC 0x00cf /* enet USNIC VF */ =20 /* Supported devices */ static const struct pci_device_id enic_id_table[] =3D { @@ -2621,6 +2622,41 @@ static void enic_iounmap(struct enic *enic) iounmap(enic->bar[i].vaddr); } =20 +#ifdef CONFIG_PCI_IOV +static void enic_sriov_detect_vf_type(struct enic *enic) +{ + struct pci_dev *pdev =3D enic->pdev; + int pos; + u16 vf_dev_id; + + if (enic_is_sriov_vf(enic) || enic_is_dynamic(enic)) + return; + + pos =3D pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_SRIOV); + if (!pos) { + enic->vf_type =3D ENIC_VF_TYPE_NONE; + return; + } + + pci_read_config_word(pdev, pos + PCI_SRIOV_VF_DID, &vf_dev_id); + + switch (vf_dev_id) { + case PCI_DEVICE_ID_CISCO_VIC_ENET_VF: + enic->vf_type =3D ENIC_VF_TYPE_V1; + break; + case PCI_DEVICE_ID_CISCO_VIC_ENET_VF_USNIC: + enic->vf_type =3D ENIC_VF_TYPE_USNIC; + break; + case PCI_DEVICE_ID_CISCO_VIC_ENET_VF_V2: + enic->vf_type =3D ENIC_VF_TYPE_V2; + break; + default: + enic->vf_type =3D ENIC_VF_TYPE_NONE; + break; + } +} +#endif + static int enic_probe(struct pci_dev *pdev, const struct pci_device_id *en= t) { struct device *dev =3D &pdev->dev; @@ -2734,6 +2770,7 @@ static int enic_probe(struct pci_dev *pdev, const str= uct pci_device_id *ent) num_pps =3D enic->num_vfs; } } + enic_sriov_detect_vf_type(enic); #endif =20 /* Allocate structure for port profiles */ --=20 2.43.0