From nobody Sat Oct 4 19:16:41 2025 Received: from mail-pg1-f175.google.com (mail-pg1-f175.google.com [209.85.215.175]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7EA3E287517 for ; Wed, 13 Aug 2025 16:29:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.175 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755102580; cv=none; b=lZxI+oebMb0uDutqQovZCnFgZdXit8pLcw8rRgK5Jz0e57897k1rqFafkzTFIbLPLxiLWiSvfzS/Gy3eVVYhKvqrZnLsaxGb4QvwFvOhHTknfIDxYSRKwbfTE7pt6WlO1nxwBW1odICDYsg7+KqH42K7FYViJmkv7E9fij81uRc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1755102580; c=relaxed/simple; bh=iw8SGquvm45ZFKLgJCjIx8yYp7F5uG5XpiJ73moYtr0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ZKH6RczcmkS2l/OEFNW4cE7Cg2W24yH+JLXW2HbXSCMLQQGz6r0M/6PlP8HIHrut2qQAZ+MQIlJBSv9Dw65XZJTyZxHgRukEyEeEGFwTVWtfAoA2Qc2cCes1iRJx6U+ctFBcqq+6S7ci7bornCtdkqrIktiBHxsKdedpyA8gprk= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com; spf=fail smtp.mailfrom=broadcom.com; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b=ed/Yut4t; arc=none smtp.client-ip=209.85.215.175 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=broadcom.com Authentication-Results: smtp.subspace.kernel.org; spf=fail smtp.mailfrom=broadcom.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=broadcom.com header.i=@broadcom.com header.b="ed/Yut4t" Received: by mail-pg1-f175.google.com with SMTP id 41be03b00d2f7-b423b13e2c3so5271550a12.3 for ; Wed, 13 Aug 2025 09:29:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1755102578; x=1755707378; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=EEoDHzkcg5tJ2N8bNpHdrnQzYqgUq2Qmt5OBLm8otMs=; b=ed/Yut4tFn3nSgdY8suTN1CLJmLLMIsL6sFAMYmHY9BWKNuNp0oKf7KL9zTGuab0wj YATLGK/SWlmI4qmFDipNZ8MPKycCebJAoYaD2zLnwEochI3XXoPubPisbg879Wyf2SZe tioJBM79+3wcYcDABaNpeSNdKWOKm+/H82r6o= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1755102578; x=1755707378; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=EEoDHzkcg5tJ2N8bNpHdrnQzYqgUq2Qmt5OBLm8otMs=; b=G/wPvviV7EZb2ioVpsaWH/bv27P2SGFdxdWWFDd0SpKeVF/2yMkXsnsHKkzau/IjdC s4dJSAV5I6F8grXXmvZAuFkY7TTKVvxUvSJ5AQ5pUbw+RCaSIIWPkKpMmekJgQK/gEF3 tI0wVR2A+TYTfbcWznBf/R9HuWhW4iXa6nQ2vdjT5zl1pk/mgVp6peGWgrD/RGiZ15TH BQRwbVPDQLKi7ZNjcZRmycG9W8jGyK8nDSCBGD6R7neleaDvcs3643+4OFt0Pa7O/wm9 SqLtm8ydmEBrep8dXyswwSXF1IeBNV+XFRvN2dNo3LU6haLn9FTSm7/jCaVY5tINqVU0 cWeg== X-Forwarded-Encrypted: i=1; AJvYcCWFBHxeLoeyGK9TDSX4k4fUC1jkI8JZCf7Ty792m1h5pYHt2oEmK0eT8WH+VsO3d0e4lY9PnC2KAul4+vA=@vger.kernel.org X-Gm-Message-State: AOJu0YyH3/OsJc0WHbytNLpzA9I4zLhreeutpcH5RmBKi70LaGCNKRr6 qk2kjsF2bQDWWOzzLRmw1pMv+69KMwAlG1PTRagJ0kdHrYtdmh2DUkEBWQ/Hyr9sfw== X-Gm-Gg: ASbGncv02Mc4+YLIADpwwPJPlg1002nYI4IFpiOJ+A64U/TRKW3lz2lMln/dw6V4hcW fgM6ChEtA9BOYGq2hGLj79fAIzVgDnCxJrdrLhM7aGSTrTjiU7Et7/xdDw4FTsoqQN9hhaz+4L5 Dd2woAoq4UvwmrYR2B9oqED3zTA5RA0kldLVuCQN+Q2mc+F1cRI7fEv9vRdnkfg3mp8aeRoKnsy 9hv9mEw3OqUSKtRr4e5tr7OUc6GmDnjvC/G5Xr2t7As45zvuKSHsnWXNLrJHR1NfzU7E8dE0+DI 8bDhVSc2w8SCvFcuUATCa/7bFO//UNqthXt2jdT9sWxi6f1e5cpazv0ey6Dizd42OQNsxdUlnsr 7mwuy8I9HzTP1KdpsurK8pE0NOkeE1TcN+mB+/d5x5T4zjcwttQaU9jGRzKO+KYhlRFT8GAANo6 IuS865G9UvXXu0fzzt+iimLTBIVQ== X-Google-Smtp-Source: AGHT+IF5RJpW/b15g+Ujeh2JdwFSPQTgxJYcfq4yB2To8AQZ9p12zehv9r++1ejCNtfh8A9fggrtOg== X-Received: by 2002:a17:902:da83:b0:240:50c9:7f26 with SMTP id d9443c01a7336-2430d0b8231mr53716025ad.13.1755102577600; Wed, 13 Aug 2025 09:29:37 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-241d1f0f7bfsm329311915ad.41.2025.08.13.09.29.33 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 13 Aug 2025 09:29:37 -0700 (PDT) From: Bhargava Marreddy To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, andrew+netdev@lunn.ch, horms@kernel.org Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, michael.chan@broadcom.com, pavan.chebbi@broadcom.com, vsrama-krishna.nemani@broadcom.com, Bhargava Marreddy , Vikas Gupta , Rajashekar Hudumula Subject: [net-next 3/9] bng_en: Introduce VNIC Date: Wed, 13 Aug 2025 21:55:57 +0000 Message-ID: <20250813215603.76526-4-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250813215603.76526-1-bhargava.marreddy@broadcom.com> References: <20250813215603.76526-1-bhargava.marreddy@broadcom.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add the VNIC-specific structures and DMA memory necessary to support UC/MC and RSS functionality. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- .../net/ethernet/broadcom/bnge/bnge_netdev.c | 130 ++++++++++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 30 ++++ 2 files changed, 160 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index 5df12bb86f8..e76a7d1f6ec 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -427,6 +427,123 @@ static int bnge_alloc_tx_rings(struct bnge_net *bn) return 0; } =20 +static void bnge_free_vnic_attributes(struct bnge_net *bn) +{ + struct pci_dev *pdev =3D bn->bd->pdev; + struct bnge_vnic_info *vnic; + int i; + + if (!bn->vnic_info) + return; + + for (i =3D 0; i < bn->nr_vnics; i++) { + vnic =3D &bn->vnic_info[i]; + + kfree(vnic->uc_list); + vnic->uc_list =3D NULL; + + if (vnic->mc_list) { + dma_free_coherent(&pdev->dev, vnic->mc_list_size, + vnic->mc_list, vnic->mc_list_mapping); + vnic->mc_list =3D NULL; + } + + if (vnic->rss_table) { + dma_free_coherent(&pdev->dev, vnic->rss_table_size, + vnic->rss_table, + vnic->rss_table_dma_addr); + vnic->rss_table =3D NULL; + } + + vnic->rss_hash_key =3D NULL; + vnic->flags =3D 0; + } +} + +static int bnge_alloc_vnic_attributes(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + struct bnge_vnic_info *vnic; + int i, rc =3D 0, size; + + for (i =3D 0; i < bn->nr_vnics; i++) { + vnic =3D &bn->vnic_info[i]; + + if (vnic->flags & BNGE_VNIC_UCAST_FLAG) { + int mem_size =3D (BNGE_MAX_UC_ADDRS - 1) * ETH_ALEN; + + if (mem_size > 0) { + vnic->uc_list =3D kmalloc(mem_size, GFP_KERNEL); + if (!vnic->uc_list) { + rc =3D -ENOMEM; + goto out; + } + } + } + + if (vnic->flags & BNGE_VNIC_MCAST_FLAG) { + vnic->mc_list_size =3D BNGE_MAX_MC_ADDRS * ETH_ALEN; + vnic->mc_list =3D + dma_alloc_coherent(bd->dev, + vnic->mc_list_size, + &vnic->mc_list_mapping, + GFP_KERNEL); + if (!vnic->mc_list) { + rc =3D -ENOMEM; + goto out; + } + } + + /* Allocate rss table and hash key */ + size =3D L1_CACHE_ALIGN(HW_HASH_INDEX_SIZE * sizeof(u16)); + size =3D L1_CACHE_ALIGN(BNGE_MAX_RSS_TABLE_SIZE); + + vnic->rss_table_size =3D size + HW_HASH_KEY_SIZE; + vnic->rss_table =3D dma_alloc_coherent(bd->dev, + vnic->rss_table_size, + &vnic->rss_table_dma_addr, + GFP_KERNEL); + if (!vnic->rss_table) { + rc =3D -ENOMEM; + goto out; + } + + vnic->rss_hash_key =3D ((void *)vnic->rss_table) + size; + vnic->rss_hash_key_dma_addr =3D vnic->rss_table_dma_addr + size; + } + + return 0; + +out: + return rc; +} + +static int bnge_alloc_vnics(struct bnge_net *bn) +{ + int num_vnics; + + /* Allocate only 1 VNIC for now + * Additional VNICs will be added based on RFS/NTUPLE in future patches + */ + num_vnics =3D 1; + + bn->vnic_info =3D kcalloc(num_vnics, sizeof(struct bnge_vnic_info), + GFP_KERNEL); + if (!bn->vnic_info) + return -ENOMEM; + + bn->nr_vnics =3D num_vnics; + + return 0; +} + +static void bnge_free_vnics(struct bnge_net *bn) +{ + kfree(bn->vnic_info); + bn->vnic_info =3D NULL; + bn->nr_vnics =3D 0; +} + static void bnge_free_ring_grps(struct bnge_net *bn) { kfree(bn->grp_info); @@ -435,11 +552,13 @@ static void bnge_free_ring_grps(struct bnge_net *bn) =20 static void bnge_free_core(struct bnge_net *bn) { + bnge_free_vnic_attributes(bn); bnge_free_tx_rings(bn); bnge_free_rx_rings(bn); bnge_free_nq_tree(bn); bnge_free_nq_arrays(bn); bnge_free_ring_grps(bn); + bnge_free_vnics(bn); kfree(bn->tx_ring_map); bn->tx_ring_map =3D NULL; kfree(bn->tx_ring); @@ -526,6 +645,10 @@ static int bnge_alloc_core(struct bnge_net *bn) txr->bnapi =3D bnapi2; } =20 + rc =3D bnge_alloc_vnics(bn); + if (rc) + goto err_free_core; + rc =3D bnge_alloc_nq_arrays(bn); if (rc) goto err_free_core; @@ -544,6 +667,13 @@ static int bnge_alloc_core(struct bnge_net *bn) if (rc) goto err_free_core; =20 + bn->vnic_info[BNGE_VNIC_DEFAULT].flags |=3D BNGE_VNIC_RSS_FLAG | + BNGE_VNIC_MCAST_FLAG | + BNGE_VNIC_UCAST_FLAG; + rc =3D bnge_alloc_vnic_attributes(bn); + if (rc) + goto err_free_core; + return 0; =20 err_free_core: diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index 665a20380de..8bc0d09e041 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -177,6 +177,8 @@ struct bnge_net { =20 /* grp_info indexed by napi/nq index */ struct bnge_ring_grp_info *grp_info; + struct bnge_vnic_info *vnic_info; + int nr_vnics; int total_irqs; }; =20 @@ -301,4 +303,32 @@ struct bnge_napi { struct bnge_tx_ring_info *tx_ring[BNGE_MAX_TXR_PER_NAPI]; }; =20 +#define INVALID_STATS_CTX_ID -1 +#define BNGE_VNIC_DEFAULT 0 +#define BNGE_MAX_UC_ADDRS 4 + +struct bnge_vnic_info { + u8 *uc_list; + dma_addr_t rss_table_dma_addr; + __le16 *rss_table; + dma_addr_t rss_hash_key_dma_addr; + u64 *rss_hash_key; + int rss_table_size; +#define BNGE_RSS_TABLE_ENTRIES 64 +#define BNGE_RSS_TABLE_SIZE (BNGE_RSS_TABLE_ENTRIES * 4) +#define BNGE_RSS_TABLE_MAX_TBL 8 +#define BNGE_MAX_RSS_TABLE_SIZE \ + (BNGE_RSS_TABLE_SIZE * BNGE_RSS_TABLE_MAX_TBL) + + u8 *mc_list; + int mc_list_size; + int mc_list_count; + dma_addr_t mc_list_mapping; +#define BNGE_MAX_MC_ADDRS 16 + + u32 flags; +#define BNGE_VNIC_RSS_FLAG 1 +#define BNGE_VNIC_MCAST_FLAG 4 +#define BNGE_VNIC_UCAST_FLAG 8 +}; #endif /* _BNGE_NETDEV_H_ */ --=20 2.47.3