From nobody Thu Oct 2 06:18:02 2025 Received: from mail-pf1-f228.google.com (mail-pf1-f228.google.com [209.85.210.228]) (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 8BF27322A26 for ; Fri, 19 Sep 2025 17:48:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304099; cv=none; b=AWHwzaOpgffSHFNOsbfeU5XRHckBL2IBiVdBOFSg11mSn25EoZEeyzC7LxEEM9Amv0blD782agapfNvB6Rdoo2A3vGyy2CuRYfCOG/bJ1saneefdJRvTYw6U5uCr9NAZecGR8Wlzf9fptooudIgjS2CHBxBxWe4UA81zNB4g74U= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304099; c=relaxed/simple; bh=G1NiFDz8oZhTB5nWROQ4ml+rvTNq7sXuFIg0das2/hA=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lTM626nerVkq+HuxPC56DOIyWHwAhw2HQAdsWi0WNrh+fJG+gxlujzB/kz+gPVRq1qrHYwubb/UsjEUOQzenVOTF+bXds2ZgrAtclubea8OnL4ImFvqlQm9qDI38uB1sF4HO6AxLPAe+2ssDNg8EV8OGP3L3O13fdyb5+xUy6rU= 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=DjYPDON/; arc=none smtp.client-ip=209.85.210.228 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="DjYPDON/" Received: by mail-pf1-f228.google.com with SMTP id d2e1a72fcca58-77d94c6562fso2153274b3a.2 for ; Fri, 19 Sep 2025 10:48:17 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304097; x=1758908897; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=IUECdZ3lR6R7TzQiSPdeZzqdUGndQHKhb6XoefEvstI=; b=QTjJFrfrJySCcrJtezX/rp16/Ua7NVX3dI/70tSWj4SAD40eFDLjDb7LgaF6RY1XDC ggDx66tFGHXsDYnBb90CHCltY7SUcOfLFE2Hae0TkkTAKppqwV2K2oB/6R1d61OEjxTl kISvCFMWKgHdBt2iPPjsUY+TH0TFe6YTnEfGvLyQWpMYRsec0y/VFt8xvl8e8Bje8a+H L6baA3ZmXOpI27fIx98Q27mF5ySJ64ba8SOdrYDAI/4uEFY2Sh3XCEK/tmrQZcJ8JWXM zj0CziL2vxUK00N06eceobBGv8fcM5YI+A6hQjbOAq29+DjkH5qU9c+79cJTJr+vjIGb xRnw== X-Forwarded-Encrypted: i=1; AJvYcCXdDqiiDjOgNRq84KHaRKfr5TbP1V0HTr2mbR9gSr/CJ+kJR0E8cLqAzrIdIjV2KoRXRaKHZMjfjoHiESc=@vger.kernel.org X-Gm-Message-State: AOJu0YyaNUz2Fi5EJwygruWjBuDKt3/+gPBT0uUnI5fE4hchcs91LY60 Dcqfq5haYCrYN+tszzGwfX4b9B5pExC4cSDouu/gmGgRWBo5f+VGLX69TVrdu2fnXG7yhETPfbn qedIfJhRWHeMxD+guXBD9VY7HAcaEZHCCtu+U2KkTL0sZYnDDg9OFSMoYd9+rTU+vGh61vKyeSr EuO68hYKLFsO6kzqSnKHuVhXEsVSCaMcpJLRzVvE6OXR3p8axWV+R6gk3TdX8yp2KRm8tZDVb2r ypZrtNQ/rcI6LcbG0Bx2s+Y5cpo X-Gm-Gg: ASbGncsbDaHEzOJFO/hppOQOv2yJGNmiPH7lQLs+7ZS/lLNpL6tiIO+fQtntcUfkBm8 mfNedONyllIamrDNw06nBGrU5NOIcOETE0Qy9VIF8KjHVhstYe4pXdNExE9CxVVNjid2ZEMEk/E 7a9JaqCrOI3SI1qaGe9daaMJZ7mihlvGvrFMk9QqiChCVwDz1Ko0K9zL8+6mbqgzzrmMC1ryj3x 8uiM5z4D1C40zaQM7hVV+Rurf87o2Jb+HcsnWun587sK21WEiQXE8/78gZfqIjHyilpMtkEuNIH hQNxrzdLnCfZaslUSq9t5sqmLinmUl37/X2eRFVhmsvbHWgx8G3f5/QS/w6w+W7d5AbfsuIFRhI jn9Sz1+1kJ98ztfQ/9mSzoXqup29qwtNvPBb5TKi2De8q0HBvjeoYmKUYVF8yx13pOETH/Keh1m nN4oNwe/wG X-Google-Smtp-Source: AGHT+IGq4aZkpXu1Juryb4xeYkgXUV6KQdQpPprxeEcF86IehYwxs+GkOQ2K9bqteKC5TCPVAlUwYgmdsMYa X-Received: by 2002:a05:6a20:431f:b0:248:4d59:93e6 with SMTP id adf61e73a8af0-2925bacdf47mr6412710637.19.1758304096750; Fri, 19 Sep 2025 10:48:16 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-118.dlp.protect.broadcom.com. [144.49.247.118]) by smtp-relay.gmail.com with ESMTPS id 41be03b00d2f7-b54ff35e6fcsm330256a12.5.2025.09.19.10.48.16 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:16 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pl1-f197.google.com with SMTP id d9443c01a7336-244581ce13aso45385935ad.2 for ; Fri, 19 Sep 2025 10:48:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304095; x=1758908895; 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=IUECdZ3lR6R7TzQiSPdeZzqdUGndQHKhb6XoefEvstI=; b=DjYPDON/9WC3qYN/pMI9IbVrR1dgMMHtl5odkKYlVNesngznbmm4ha2nTiV3x3krEn CG+b7RgglE8CcqrJVmYt+QArt7wnEaJEmIvplM9YlVeUGW40ON94gR86JWF2BxxSF6uB HTMp+n4qDXATwhLSWMbkS/cyWHBY6mphYKzds= X-Forwarded-Encrypted: i=1; AJvYcCUXpPRAEiDng7MXtgpF98gFhcVJs+6SCtIfbZturykN6gF2uxCPyr1wAEqGFJSV3A3LUayUitk3YRp+fyE=@vger.kernel.org X-Received: by 2002:a17:902:d511:b0:24c:ce43:e60b with SMTP id d9443c01a7336-269ba45c0a8mr65982305ad.18.1758304094998; Fri, 19 Sep 2025 10:48:14 -0700 (PDT) X-Received: by 2002:a17:902:d511:b0:24c:ce43:e60b with SMTP id d9443c01a7336-269ba45c0a8mr65982075ad.18.1758304094681; Fri, 19 Sep 2025 10:48:14 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:14 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 01/10] bng_en: make bnge_alloc_ring() self-unwind on failure Date: Fri, 19 Sep 2025 23:17:32 +0530 Message-ID: <20250919174742.24969-2-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Ensure bnge_alloc_ring() frees any intermediate allocations when it fails. This enables later patches to rely on this self-unwinding behavior. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- drivers/net/ethernet/broadcom/bnge/bnge_rmem.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.c b/drivers/net/e= thernet/broadcom/bnge/bnge_rmem.c index 52ada65943a..98b4e9f55bc 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_rmem.c @@ -95,7 +95,7 @@ int bnge_alloc_ring(struct bnge_dev *bd, struct bnge_ring= _mem_info *rmem) &rmem->dma_arr[i], GFP_KERNEL); if (!rmem->pg_arr[i]) - return -ENOMEM; + goto err_free_ring; =20 if (rmem->ctx_mem) bnge_init_ctx_mem(rmem->ctx_mem, rmem->pg_arr[i], @@ -116,10 +116,13 @@ int bnge_alloc_ring(struct bnge_dev *bd, struct bnge_= ring_mem_info *rmem) if (rmem->vmem_size) { *rmem->vmem =3D vzalloc(rmem->vmem_size); if (!(*rmem->vmem)) - return -ENOMEM; + goto err_free_ring; } - return 0; + +err_free_ring: + bnge_free_ring(bd, rmem); + return -ENOMEM; } =20 static int bnge_alloc_ctx_one_lvl(struct bnge_dev *bd, --=20 2.47.3 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-pg1-f225.google.com (mail-pg1-f225.google.com [209.85.215.225]) (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 7451830DD38 for ; Fri, 19 Sep 2025 17:48:22 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304105; cv=none; b=r7mvgh5GdG5UySUY5tryupKeU46YbUo9tv7EcVV2nn9YNHWOfvO2qOU92O69zQo6NNiPwnxOxYYS1rQjpHq1s2z2Hnp55+tMqrabHT0ZtZ0VH8bz4DQ6e/mgc2/5VKhrLL4PJSEsC0MSp2MdTE0+0RGGD07kugUXe/1TjKrGWDw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304105; c=relaxed/simple; bh=tSioBh76ztgHaRunLPiPy/xpp5bm7H71PmZ3KvPCGmc=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JNEPnMThC75GXt6jwcbr5KhqHA4i/gxkRHOaBfU8eqYW6rwjsra8TOAcqfpoFUBZ6PitRrhZ2ig+V4wY/ZES8sJIOLp8LpGMiDTyvBBVoHnu69SBqXqJXAnM8ROaasDX+sbRhs2NXEsQ27JCGGubWzM9z8V6++bFFI8FxIXSi9g= 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=aI4QB4IF; arc=none smtp.client-ip=209.85.215.225 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="aI4QB4IF" Received: by mail-pg1-f225.google.com with SMTP id 41be03b00d2f7-b4f7053cc38so1754275a12.2 for ; Fri, 19 Sep 2025 10:48:22 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304102; x=1758908902; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lBMjH3N5qgu1sCIAKLqnq9+co6BI8/e3t/FWpv77o6o=; b=jjbXY47I6SieOGdk17avpHZX3NLyCkMRh6fj3GPC3C6wtVLUAQdrJwxz6wY6gCMHNO xrpVh0/TjrueQhhHjDL+G/hIlsNCnWV1anqi3vDoHZHh8O+m6LOpuPBD0kiq2hDizpHm B2ks+kbmqA3X6u3SO4g0IkkmUi1udjjivbO04zvAUL2cDJ86MoT1EQxHjLHb224IvdQ5 lA1KO8Xb/uXpuM7P2MtvqZNruOpJMCi6RL4V0VCAYpH0B2cw7EreRVbnC5L8J/BTnGkp 3dLNPMBai8ZlL30JQfqrnP5iXY1+ikvNxDV0apz+qH/c40GRmZpsDS3v0mtLUN/Ji69e 7PLg== X-Forwarded-Encrypted: i=1; AJvYcCUFrL2gYxf4vCILbkkS2D3vV8kA7dIR66aQjjteUYyjJN/wZl8NY3mdYZYDESh1tqYpXU2sqIP0IoEEokc=@vger.kernel.org X-Gm-Message-State: AOJu0Yz06mCFMQDNYloxam57g1EaSf43pVbhw4ywyKK1Zg62tcslN3Oj pahwg2NDgNl9PJS1MLAxGJUZYBEqQ9KEFERKHvIB4blNYMs3R8ljUypcI8zB44RbFmuOCzQINzt QZ8ONtjsNrqe9yuuZGcmb/OSxp/Nov/S071uKrXknrLumxtIs6MvfvRbI7zH6nRzfRcyY0GdC+H AiyL+Tf3f2XGL+B+ri7iu5pnd5rMnNRokm5/+oOfC3QjRfEbFTfGI4N9MJSkz8K/9Lked1MDOmb /oj6SvcOAXe8BV562UeAP+VlwHJ X-Gm-Gg: ASbGncsug4DOVJ8uKmSn5bPF7LaA5bTaKVJ3rMBiIpuy+DdAcFqRDKr7S+Z/7pMxTfD tGp+Ac+np/qTD3UeISjXOzWzRtZT9kynBSFPPzBCJL4YEjdPfhAknTbwt/KF7R4kLFEvulahfar stUgdBLFLwO/s9z0xE3mhY9DGOUyaCpD42cOn3g4+bPEi/e0xS/72qyU8PeSZrpP6Q9+5l/I2JX jcBT+QZUdGaDWr7eDikc2LcHUknfBe4ff4OPwn5uy0X8T7DJZflBpsymBhkPc0LoOL1X37PiQtG 3ftM1XbMYUBZxwUptC3AIoDrZ5CiPxl7ToSkfuJ1SHF2XWZAhtUyO2PQJwEsaSKFj5PGPrL+Kvh awuJAjOc80y+mlCTjnEv4JwFLN2jSYLHmC8K8ecNAT/d87YjtrMkovQvyvhyirQvaaxFkh3SljZ 1eV6bEFMvm X-Google-Smtp-Source: AGHT+IGGTsADGnHStiiHl0VwvHkdcnDYNYjiW+KcyBsWrkBdreF1gJ291DH8p+GZVbNKQLNHoUM1bCCO7//9 X-Received: by 2002:a17:90b:3146:b0:330:604a:1009 with SMTP id 98e67ed59e1d1-3309834c31fmr5381453a91.23.1758304101685; Fri, 19 Sep 2025 10:48:21 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-118.dlp.protect.broadcom.com. [144.49.247.118]) by smtp-relay.gmail.com with ESMTPS id 41be03b00d2f7-b5513a2f6b2sm203408a12.4.2025.09.19.10.48.21 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:21 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pg1-f198.google.com with SMTP id 41be03b00d2f7-b522037281bso1778625a12.3 for ; Fri, 19 Sep 2025 10:48:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304100; x=1758908900; 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=lBMjH3N5qgu1sCIAKLqnq9+co6BI8/e3t/FWpv77o6o=; b=aI4QB4IFXm3s+EdCdv2ZatUUTlKxzxhHGh0OttzKIMpd07PriV8XPtJVjer7sp+/k4 9eEW1LkM56akTWRMPl0mk2I5aFXc+RHFdloSm7F8Vh7GlsEfQ4aeQdD49VMomcIjN2Nw SfrMPGjm60YE+mDtXQ83yB9/Tzc5EaeGs7cz8= X-Forwarded-Encrypted: i=1; AJvYcCU5/j7emrSTUjM/37+unaRfAm1iC+D93vJnLyAYzOcE5dlypVr64eU6jJsVd5eBLHV2mW/kXafSkfSAlF8=@vger.kernel.org X-Received: by 2002:a05:6a20:244c:b0:243:f5ba:aa82 with SMTP id adf61e73a8af0-2926c3ca963mr5866458637.30.1758304099653; Fri, 19 Sep 2025 10:48:19 -0700 (PDT) X-Received: by 2002:a05:6a20:244c:b0:243:f5ba:aa82 with SMTP id adf61e73a8af0-2926c3ca963mr5866445637.30.1758304099243; Fri, 19 Sep 2025 10:48:19 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:18 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 02/10] bng_en: Add initial support for RX and TX rings Date: Fri, 19 Sep 2025 23:17:33 +0530 Message-ID: <20250919174742.24969-3-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Allocate data structures to support RX, AGG, and TX rings. While data structures for RX/AGG rings are allocated, initialise the page pool accordingly. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- drivers/net/ethernet/broadcom/Kconfig | 1 + drivers/net/ethernet/broadcom/bnge/bnge.h | 1 + .../net/ethernet/broadcom/bnge/bnge_netdev.c | 344 +++++++++++++++++- .../net/ethernet/broadcom/bnge/bnge_netdev.h | 89 ++++- .../net/ethernet/broadcom/bnge/bnge_rmem.c | 58 +++ .../net/ethernet/broadcom/bnge/bnge_rmem.h | 12 + 6 files changed, 503 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/broadcom/Kconfig b/drivers/net/ethernet/b= roadcom/Kconfig index 0fc10e6c690..9fdef874f5c 100644 --- a/drivers/net/ethernet/broadcom/Kconfig +++ b/drivers/net/ethernet/broadcom/Kconfig @@ -257,6 +257,7 @@ config BNGE tristate "Broadcom Ethernet device support" depends on PCI select NET_DEVLINK + select PAGE_POOL help This driver supports Broadcom 50/100/200/400/800 gigabit Ethernet cards. The module will be called bng_en. To compile this driver as a module, diff --git a/drivers/net/ethernet/broadcom/bnge/bnge.h b/drivers/net/ethern= et/broadcom/bnge/bnge.h index 6fb3683b6b0..03e55b931f7 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge.h @@ -129,6 +129,7 @@ struct bnge_dev { =20 unsigned long state; #define BNGE_STATE_DRV_REGISTERED 0 +#define BNGE_STATE_OPEN 1 =20 u64 fw_cap; =20 diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index 02254934f3d..c25a793b8ae 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -14,10 +14,332 @@ #include #include #include +#include =20 #include "bnge.h" #include "bnge_hwrm_lib.h" #include "bnge_ethtool.h" +#include "bnge_rmem.h" + +#define BNGE_RING_TO_TC_OFF(bd, tx) \ + ((tx) % (bd)->tx_nr_rings_per_tc) + +#define BNGE_RING_TO_TC(bd, tx) \ + ((tx) / (bd)->tx_nr_rings_per_tc) + +static bool bnge_separate_head_pool(struct bnge_rx_ring_info *rxr) +{ + return rxr->need_head_pool || PAGE_SIZE > BNGE_RX_PAGE_SIZE; +} + +static void bnge_free_rx_rings(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + for (i =3D 0; i < bd->rx_nr_rings; i++) { + struct bnge_rx_ring_info *rxr =3D &bn->rx_ring[i]; + struct bnge_ring_struct *ring; + + page_pool_destroy(rxr->page_pool); + page_pool_destroy(rxr->head_pool); + rxr->page_pool =3D rxr->head_pool =3D NULL; + + kfree(rxr->rx_agg_bmap); + rxr->rx_agg_bmap =3D NULL; + + ring =3D &rxr->rx_ring_struct; + bnge_free_ring(bd, &ring->ring_mem); + + ring =3D &rxr->rx_agg_ring_struct; + bnge_free_ring(bd, &ring->ring_mem); + } +} + +static int bnge_alloc_rx_page_pool(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr, + int numa_node) +{ + const unsigned int agg_size_fac =3D PAGE_SIZE / BNGE_RX_PAGE_SIZE; + const unsigned int rx_size_fac =3D PAGE_SIZE / SZ_4K; + struct page_pool_params pp =3D { 0 }; + struct bnge_dev *bd =3D bn->bd; + struct page_pool *pool; + + pp.pool_size =3D bn->rx_agg_ring_size / agg_size_fac; + pp.nid =3D numa_node; + pp.netdev =3D bn->netdev; + pp.dev =3D bd->dev; + pp.dma_dir =3D bn->rx_dir; + pp.max_len =3D PAGE_SIZE; + pp.flags =3D PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV | + PP_FLAG_ALLOW_UNREADABLE_NETMEM; + pp.queue_idx =3D rxr->bnapi->index; + + pool =3D page_pool_create(&pp); + if (IS_ERR(pool)) + return PTR_ERR(pool); + rxr->page_pool =3D pool; + + rxr->need_head_pool =3D page_pool_is_unreadable(pool); + if (bnge_separate_head_pool(rxr)) { + pp.pool_size =3D min(bn->rx_ring_size / rx_size_fac, 1024); + pp.flags =3D PP_FLAG_DMA_MAP | PP_FLAG_DMA_SYNC_DEV; + pool =3D page_pool_create(&pp); + if (IS_ERR(pool)) + goto err_destroy_pp; + } else { + page_pool_get(pool); + } + rxr->head_pool =3D pool; + return 0; + +err_destroy_pp: + page_pool_destroy(rxr->page_pool); + rxr->page_pool =3D NULL; + return PTR_ERR(pool); +} + +static void bnge_enable_rx_page_pool(struct bnge_rx_ring_info *rxr) +{ + page_pool_enable_direct_recycling(rxr->head_pool, &rxr->bnapi->napi); + page_pool_enable_direct_recycling(rxr->page_pool, &rxr->bnapi->napi); +} + +static int bnge_alloc_rx_agg_bmap(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr) +{ + u16 mem_size; + + rxr->rx_agg_bmap_size =3D bn->rx_agg_ring_mask + 1; + mem_size =3D rxr->rx_agg_bmap_size / 8; + rxr->rx_agg_bmap =3D kzalloc(mem_size, GFP_KERNEL); + if (!rxr->rx_agg_bmap) + return -ENOMEM; + + return 0; +} + +static int bnge_alloc_rx_rings(struct bnge_net *bn) +{ + int i, rc =3D 0, agg_rings =3D 0, cpu; + struct bnge_dev *bd =3D bn->bd; + + if (bnge_is_agg_reqd(bd)) + agg_rings =3D 1; + + for (i =3D 0; i < bd->rx_nr_rings; i++) { + struct bnge_rx_ring_info *rxr =3D &bn->rx_ring[i]; + struct bnge_ring_struct *ring; + int cpu_node; + + ring =3D &rxr->rx_ring_struct; + + cpu =3D cpumask_local_spread(i, dev_to_node(bd->dev)); + cpu_node =3D cpu_to_node(cpu); + netdev_dbg(bn->netdev, "Allocating page pool for rx_ring[%d] on numa_nod= e: %d\n", + i, cpu_node); + rc =3D bnge_alloc_rx_page_pool(bn, rxr, cpu_node); + if (rc) + goto err_free_rx_rings; + bnge_enable_rx_page_pool(rxr); + + rc =3D bnge_alloc_ring(bd, &ring->ring_mem); + if (rc) + goto err_free_rx_rings; + + ring->grp_idx =3D i; + if (agg_rings) { + ring =3D &rxr->rx_agg_ring_struct; + rc =3D bnge_alloc_ring(bd, &ring->ring_mem); + if (rc) + goto err_free_rx_rings; + + ring->grp_idx =3D i; + rc =3D bnge_alloc_rx_agg_bmap(bn, rxr); + if (rc) + goto err_free_rx_rings; + } + } + return rc; + +err_free_rx_rings: + bnge_free_rx_rings(bn); + return rc; +} + +static void bnge_free_tx_rings(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + for (i =3D 0; i < bd->tx_nr_rings; i++) { + struct bnge_tx_ring_info *txr =3D &bn->tx_ring[i]; + struct bnge_ring_struct *ring; + + ring =3D &txr->tx_ring_struct; + + bnge_free_ring(bd, &ring->ring_mem); + } +} + +static int bnge_alloc_tx_rings(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i, j, rc; + + for (i =3D 0, j =3D 0; i < bd->tx_nr_rings; i++) { + struct bnge_tx_ring_info *txr =3D &bn->tx_ring[i]; + struct bnge_ring_struct *ring; + u8 qidx; + + ring =3D &txr->tx_ring_struct; + + rc =3D bnge_alloc_ring(bd, &ring->ring_mem); + if (rc) + goto err_free_tx_rings; + + ring->grp_idx =3D txr->bnapi->index; + qidx =3D bd->tc_to_qidx[j]; + ring->queue_id =3D bd->q_info[qidx].queue_id; + if (BNGE_RING_TO_TC_OFF(bd, i) =3D=3D (bd->tx_nr_rings_per_tc - 1)) + j++; + } + return 0; + +err_free_tx_rings: + bnge_free_tx_rings(bn); + return rc; +} + +static void bnge_free_core(struct bnge_net *bn) +{ + bnge_free_tx_rings(bn); + bnge_free_rx_rings(bn); + kfree(bn->tx_ring_map); + bn->tx_ring_map =3D NULL; + kfree(bn->tx_ring); + bn->tx_ring =3D NULL; + kfree(bn->rx_ring); + bn->rx_ring =3D NULL; + kfree(bn->bnapi); + bn->bnapi =3D NULL; +} + +static int bnge_alloc_core(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i, j, size, arr_size; + int rc =3D -ENOMEM; + void *bnapi; + + arr_size =3D L1_CACHE_ALIGN(sizeof(struct bnge_napi *) * + bd->nq_nr_rings); + size =3D L1_CACHE_ALIGN(sizeof(struct bnge_napi)); + bnapi =3D kzalloc(arr_size + size * bd->nq_nr_rings, GFP_KERNEL); + if (!bnapi) + return rc; + + bn->bnapi =3D bnapi; + bnapi +=3D arr_size; + for (i =3D 0; i < bd->nq_nr_rings; i++, bnapi +=3D size) { + struct bnge_nq_ring_info *nqr; + + bn->bnapi[i] =3D bnapi; + bn->bnapi[i]->index =3D i; + bn->bnapi[i]->bn =3D bn; + nqr =3D &bn->bnapi[i]->nq_ring; + nqr->ring_struct.ring_mem.flags =3D BNGE_RMEM_RING_PTE_FLAG; + } + + bn->rx_ring =3D kcalloc(bd->rx_nr_rings, + sizeof(struct bnge_rx_ring_info), + GFP_KERNEL); + if (!bn->rx_ring) + goto err_free_core; + + for (i =3D 0; i < bd->rx_nr_rings; i++) { + struct bnge_rx_ring_info *rxr =3D &bn->rx_ring[i]; + + rxr->rx_ring_struct.ring_mem.flags =3D + BNGE_RMEM_RING_PTE_FLAG; + rxr->rx_agg_ring_struct.ring_mem.flags =3D + BNGE_RMEM_RING_PTE_FLAG; + rxr->bnapi =3D bn->bnapi[i]; + bn->bnapi[i]->rx_ring =3D &bn->rx_ring[i]; + } + + bn->tx_ring =3D kcalloc(bd->tx_nr_rings, + sizeof(struct bnge_tx_ring_info), + GFP_KERNEL); + if (!bn->tx_ring) + goto err_free_core; + + bn->tx_ring_map =3D kcalloc(bd->tx_nr_rings, sizeof(u16), + GFP_KERNEL); + if (!bn->tx_ring_map) + goto err_free_core; + + if (bd->flags & BNGE_EN_SHARED_CHNL) + j =3D 0; + else + j =3D bd->rx_nr_rings; + + for (i =3D 0; i < bd->tx_nr_rings; i++) { + struct bnge_tx_ring_info *txr =3D &bn->tx_ring[i]; + struct bnge_napi *bnapi2; + int k; + + txr->tx_ring_struct.ring_mem.flags =3D BNGE_RMEM_RING_PTE_FLAG; + bn->tx_ring_map[i] =3D i; + k =3D j + BNGE_RING_TO_TC_OFF(bd, i); + + bnapi2 =3D bn->bnapi[k]; + txr->txq_index =3D i; + txr->tx_napi_idx =3D + BNGE_RING_TO_TC(bd, txr->txq_index); + bnapi2->tx_ring[txr->tx_napi_idx] =3D txr; + txr->bnapi =3D bnapi2; + } + + bnge_init_ring_struct(bn); + + rc =3D bnge_alloc_rx_rings(bn); + if (rc) + goto err_free_core; + + rc =3D bnge_alloc_tx_rings(bn); + if (rc) + goto err_free_core; + return 0; + +err_free_core: + bnge_free_core(bn); + return rc; +} + +static int bnge_open_core(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int rc; + + netif_carrier_off(bn->netdev); + + rc =3D bnge_reserve_rings(bd); + if (rc) { + netdev_err(bn->netdev, "bnge_reserve_rings err: %d\n", rc); + return rc; + } + + rc =3D bnge_alloc_core(bn); + if (rc) { + netdev_err(bn->netdev, "bnge_alloc_core err: %d\n", rc); + return rc; + } + + set_bit(BNGE_STATE_OPEN, &bd->state); + return 0; +} =20 static netdev_tx_t bnge_start_xmit(struct sk_buff *skb, struct net_device = *dev) { @@ -28,11 +350,30 @@ static netdev_tx_t bnge_start_xmit(struct sk_buff *skb= , struct net_device *dev) =20 static int bnge_open(struct net_device *dev) { - return 0; + struct bnge_net *bn =3D netdev_priv(dev); + int rc; + + rc =3D bnge_open_core(bn); + if (rc) + netdev_err(dev, "bnge_open_core err: %d\n", rc); + + return rc; +} + +static void bnge_close_core(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + + clear_bit(BNGE_STATE_OPEN, &bd->state); + bnge_free_core(bn); } =20 static int bnge_close(struct net_device *dev) { + struct bnge_net *bn =3D netdev_priv(dev); + + bnge_close_core(bn); + return 0; } =20 @@ -238,6 +579,7 @@ int bnge_netdev_alloc(struct bnge_dev *bd, int max_irqs) =20 bn->rx_ring_size =3D BNGE_DEFAULT_RX_RING_SIZE; bn->tx_ring_size =3D BNGE_DEFAULT_TX_RING_SIZE; + bn->rx_dir =3D DMA_FROM_DEVICE; =20 bnge_set_tpa_flags(bd); bnge_set_ring_params(bd); diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index a650d71a58d..92bae665f59 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -113,7 +113,7 @@ struct bnge_sw_rx_bd { }; =20 struct bnge_sw_rx_agg_bd { - struct page *page; + netmem_ref netmem; unsigned int offset; dma_addr_t mapping; }; @@ -164,6 +164,14 @@ struct bnge_net { struct hlist_head l2_fltr_hash_tbl[BNGE_L2_FLTR_HASH_SIZE]; u32 hash_seed; u64 toeplitz_prefix; + + struct bnge_napi **bnapi; + + struct bnge_rx_ring_info *rx_ring; + struct bnge_tx_ring_info *tx_ring; + + u16 *tx_ring_map; + enum dma_data_direction rx_dir; }; =20 #define BNGE_DEFAULT_RX_RING_SIZE 511 @@ -203,4 +211,83 @@ void bnge_set_ring_params(struct bnge_dev *bd); #define BNGE_MAX_RX_JUM_DESC_CNT (RX_DESC_CNT * MAX_RX_AGG_PAGES - 1) #define BNGE_MAX_TX_DESC_CNT (TX_DESC_CNT * MAX_TX_PAGES - 1) =20 +#define BNGE_MAX_TXR_PER_NAPI 8 + +#define bnge_for_each_napi_tx(iter, bnapi, txr) \ + for (iter =3D 0, txr =3D (bnapi)->tx_ring[0]; txr; \ + txr =3D (iter < BNGE_MAX_TXR_PER_NAPI - 1) ? \ + (bnapi)->tx_ring[++iter] : NULL) + +struct bnge_cp_ring_info { + struct bnge_napi *bnapi; + dma_addr_t *desc_mapping; + struct tx_cmp **desc_ring; + struct bnge_ring_struct ring_struct; +}; + +struct bnge_nq_ring_info { + struct bnge_napi *bnapi; + dma_addr_t *desc_mapping; + struct nqe_cn **desc_ring; + struct bnge_ring_struct ring_struct; +}; + +struct bnge_rx_ring_info { + struct bnge_napi *bnapi; + struct bnge_cp_ring_info *rx_cpr; + u16 rx_prod; + u16 rx_agg_prod; + u16 rx_sw_agg_prod; + u16 rx_next_cons; + + struct rx_bd *rx_desc_ring[MAX_RX_PAGES]; + struct bnge_sw_rx_bd *rx_buf_ring; + + struct rx_bd *rx_agg_desc_ring[MAX_RX_AGG_PAGES]; + struct bnge_sw_rx_agg_bd *rx_agg_buf_ring; + + unsigned long *rx_agg_bmap; + u16 rx_agg_bmap_size; + + dma_addr_t rx_desc_mapping[MAX_RX_PAGES]; + dma_addr_t rx_agg_desc_mapping[MAX_RX_AGG_PAGES]; + + struct bnge_ring_struct rx_ring_struct; + struct bnge_ring_struct rx_agg_ring_struct; + struct page_pool *page_pool; + struct page_pool *head_pool; + bool need_head_pool; +}; + +struct bnge_tx_ring_info { + struct bnge_napi *bnapi; + struct bnge_cp_ring_info *tx_cpr; + u16 tx_prod; + u16 tx_cons; + u16 tx_hw_cons; + u16 txq_index; + u8 tx_napi_idx; + u8 kick_pending; + + struct tx_bd *tx_desc_ring[MAX_TX_PAGES]; + struct bnge_sw_tx_bd *tx_buf_ring; + + dma_addr_t tx_desc_mapping[MAX_TX_PAGES]; + + u32 dev_state; +#define BNGE_DEV_STATE_CLOSING 0x1 + + struct bnge_ring_struct tx_ring_struct; +}; + +struct bnge_napi { + struct napi_struct napi; + struct bnge_net *bn; + int index; + + struct bnge_nq_ring_info nq_ring; + struct bnge_rx_ring_info *rx_ring; + struct bnge_tx_ring_info *tx_ring[BNGE_MAX_TXR_PER_NAPI]; +}; + #endif /* _BNGE_NETDEV_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.c b/drivers/net/e= thernet/broadcom/bnge/bnge_rmem.c index 98b4e9f55bc..79f5ce2e5d0 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_rmem.c @@ -439,3 +439,61 @@ int bnge_alloc_ctx_mem(struct bnge_dev *bd) =20 return 0; } + +void bnge_init_ring_struct(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i, j; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_ring_mem_info *rmem; + struct bnge_nq_ring_info *nqr; + struct bnge_rx_ring_info *rxr; + struct bnge_tx_ring_info *txr; + struct bnge_ring_struct *ring; + + nqr =3D &bnapi->nq_ring; + ring =3D &nqr->ring_struct; + rmem =3D &ring->ring_mem; + rmem->nr_pages =3D bn->cp_nr_pages; + rmem->page_size =3D HW_CMPD_RING_SIZE; + rmem->pg_arr =3D (void **)nqr->desc_ring; + rmem->dma_arr =3D nqr->desc_mapping; + rmem->vmem_size =3D 0; + + rxr =3D bnapi->rx_ring; + if (!rxr) + goto skip_rx; + + ring =3D &rxr->rx_ring_struct; + rmem =3D &ring->ring_mem; + rmem->nr_pages =3D bn->rx_nr_pages; + rmem->page_size =3D HW_RXBD_RING_SIZE; + rmem->pg_arr =3D (void **)rxr->rx_desc_ring; + rmem->dma_arr =3D rxr->rx_desc_mapping; + rmem->vmem_size =3D SW_RXBD_RING_SIZE * bn->rx_nr_pages; + rmem->vmem =3D (void **)&rxr->rx_buf_ring; + + ring =3D &rxr->rx_agg_ring_struct; + rmem =3D &ring->ring_mem; + rmem->nr_pages =3D bn->rx_agg_nr_pages; + rmem->page_size =3D HW_RXBD_RING_SIZE; + rmem->pg_arr =3D (void **)rxr->rx_agg_desc_ring; + rmem->dma_arr =3D rxr->rx_agg_desc_mapping; + rmem->vmem_size =3D SW_RXBD_AGG_RING_SIZE * bn->rx_agg_nr_pages; + rmem->vmem =3D (void **)&rxr->rx_agg_buf_ring; + +skip_rx: + bnge_for_each_napi_tx(j, bnapi, txr) { + ring =3D &txr->tx_ring_struct; + rmem =3D &ring->ring_mem; + rmem->nr_pages =3D bn->tx_nr_pages; + rmem->page_size =3D HW_TXBD_RING_SIZE; + rmem->pg_arr =3D (void **)txr->tx_desc_ring; + rmem->dma_arr =3D txr->tx_desc_mapping; + rmem->vmem_size =3D SW_TXBD_RING_SIZE * bn->tx_nr_pages; + rmem->vmem =3D (void **)&txr->tx_buf_ring; + } + } +} diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h b/drivers/net/e= thernet/broadcom/bnge/bnge_rmem.h index 300f1d8268e..162a66c7983 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h @@ -6,6 +6,7 @@ =20 struct bnge_ctx_mem_type; struct bnge_dev; +struct bnge_net; =20 #define PTU_PTE_VALID 0x1UL #define PTU_PTE_LAST 0x2UL @@ -180,9 +181,20 @@ struct bnge_ctx_mem_info { struct bnge_ctx_mem_type ctx_arr[BNGE_CTX_V2_MAX]; }; =20 +struct bnge_ring_struct { + struct bnge_ring_mem_info ring_mem; + + union { + u16 grp_idx; + u16 map_idx; /* Used by NQs */ + }; + u8 queue_id; +}; + int bnge_alloc_ring(struct bnge_dev *bd, struct bnge_ring_mem_info *rmem); void bnge_free_ring(struct bnge_dev *bd, struct bnge_ring_mem_info *rmem); int bnge_alloc_ctx_mem(struct bnge_dev *bd); void bnge_free_ctx_mem(struct bnge_dev *bd); +void bnge_init_ring_struct(struct bnge_net *bn); =20 #endif /* _BNGE_RMEM_H_ */ --=20 2.47.3 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-oo1-f97.google.com (mail-oo1-f97.google.com [209.85.161.97]) (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 3A137322DBC for ; Fri, 19 Sep 2025 17:48:26 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.161.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304110; cv=none; b=Q4adbm1LV0VvmCeJJxKEz66ZGbHBMJqZn0b19X4nEh1ZTvSCT3Nk6i8fLaWFwwYG+m4DC/XZqQ1QRlUTR+C+AzmlU51lI31u5UYcVEhx1NngOtT5eyx7Ro8yQT/Ja6D7N62VcBc7m4cZ3NYHaPI0+PksK4UAUM1a+StJIUrT+Tc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304110; c=relaxed/simple; bh=986ZgAiHCAzs5+S/kSV/dnX5tedqBxDFKoy2aeHmjAQ=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JASqVs1x0JjtKsP9dy2QHDlbiJLDdXKSeh1dJpum6osN/waNHJifQbF8lnxiuvV3BHIgIB8ekw84H+WCFDOxltIE+zGWPs/SPUus2qzuBD3WEaKYwxQGCc42igFRkHusizKEqqByRHvjRhIPVIu6LB0VAjpsP4dusrfiwU2l6CM= 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=DP771FA7; arc=none smtp.client-ip=209.85.161.97 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="DP771FA7" Received: by mail-oo1-f97.google.com with SMTP id 006d021491bc7-626190c9c1eso764686eaf.0 for ; Fri, 19 Sep 2025 10:48:26 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304106; x=1758908906; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=w4/gA5U/tnXX8j6mDLvEdMncKn+aFLon9l2ymHb15JQ=; b=nC91fM4pHX1uEuGNR6yW92g5BlQGL1duyeNYqMj5GGmEINhqLsJqaTBZ9OZwKSb3mS kWubO2YnT3UWjQJLvsdowOL440/cWJcKrR1VT9ZHFbSbQKay2P6Y+nnl4p/AzDrlZtlF sTyi+s5PqA6XY9i9i+rRxMN2W12m+4m6ybrCCUD5bsXBXYDvD304HO0f9RCGvMVuXtnQ FQU2dt9PTTIAeivBqRwcAX9KEH8xGsgwDG+9vP+SVWT81J52eR0cZUVaSN9LlD/yXvdI x9LZXvRTsP60D8ulA1tyxYMdxdY9Q0xqtWJt0V5IOFtKBFn8UUnfpUzV3qgRHnlQveqL Lo0g== X-Forwarded-Encrypted: i=1; AJvYcCVqv/37eXm670HpXNHfnMjmGRAXHzVJLc06zLPJvFnC6hXEC0YSiaNON4oZNgPXa2akcUBhgW50s1asDjQ=@vger.kernel.org X-Gm-Message-State: AOJu0YyB7nBBaUQwohozCdgjA8RenJL4kjxb2a4ABo5z5yqVEzvqEFrq CNd/hpCCoF1ArvBTaGHBu27L5f5UN9fUznITsbf4qode3PpG76uIqVWL5J26LEFHCk+VdgewTV/ EMl2WDkgmyeqEm8GQlOXNkf8o465MuQLNCMvIyFuWZQ0Xd6lv1kVsVIhFEPubeBFa3UM2+FqxYf Lg5CAcBZ2Li+fU9l0reyqP4351kGToW2ZC2V9I48bvFSL9SBbMtWkW0NCaeH/rQfVhdPg3v+saZ LEAU/iNRBTBFyJxPsHnEtsum+h5 X-Gm-Gg: ASbGncvYSZ79gFmK1bmJRhlZ8e4w5+u/bb4PV8MMDJhiPUhumgTwyyL5JSjjkkHlNib 48dNa1EYeI9BF9/gPPi0u2WMmfKixO6IMmjPZ0VoU1Chx+eyXm9JO1TPjrUm5vspTO7+rCCApp8 4g+RhtzMbGO5OefL5yBA6HrGqOvALffp8mIslEgmajJqjxh7MLpbcVOftSG2T+5fAHalV6KN9cA UJzy3BLzR3dGF2x+qBWdy0NTfKbWIUnoThJGI4/lRY9mTr/m4h/hdSuWnLGDbzjVfuvBm4p2ZwU ZSGSf0x35UTDgcVlYiW6r+4lr5b6NMf91tu0MHlzhwHi+dXzVkGqHsAL/Zqv1wUJbRQjCJqXZg5 xjxJMuaz+pbD+/HIFGOPSrCARuVAGtkk/r/x1PZzLmPdKjsduvgFD5J3y8PJzVf5v2nSfK9NSu1 +az/yUAXey X-Google-Smtp-Source: AGHT+IGNlTcRxoxMJFZGRnSeialp6725ngLLu3vKGFTcqXrOIo+v6XBcGDlRVVGhf2/yzFPoBWkgTqCHqXKP X-Received: by 2002:a05:6808:1b21:b0:43b:9e0b:4bff with SMTP id 5614622812f47-43d6c19efb1mr1967555b6e.19.1758304106009; Fri, 19 Sep 2025 10:48:26 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-118.dlp.protect.broadcom.com. [144.49.247.118]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-336e1bc7fbcsm551418fac.0.2025.09.19.10.48.25 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:26 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pj1-f70.google.com with SMTP id 98e67ed59e1d1-32df881dce2so2376945a91.2 for ; Fri, 19 Sep 2025 10:48:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304104; x=1758908904; 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=w4/gA5U/tnXX8j6mDLvEdMncKn+aFLon9l2ymHb15JQ=; b=DP771FA7JfrHBcLOZlelno5nDhgMEji2QzVMBI2rWTv1lPdnK2iWBG4IfhYCBG3gyN otonVhpbL4DYwfK7E0i8A0OeD4hiT6/sqkRem/aFmeaQzgM3cKkx9d2ZUDmEFMgaDm+E HDR847W52IC/+x986Ks+Nkyn5dtHoHBk516h8= X-Forwarded-Encrypted: i=1; AJvYcCUbtWN7S+CpDDSCkCn3mOqll6iIuRMGZtZUUEa2MF6hBuiPWD6DzrPnlKht05//z/cSI1tzl/VgYOSthpg=@vger.kernel.org X-Received: by 2002:a17:90b:3f48:b0:329:cb75:fef2 with SMTP id 98e67ed59e1d1-33097fd0cfemr5398409a91.3.1758304104277; Fri, 19 Sep 2025 10:48:24 -0700 (PDT) X-Received: by 2002:a17:90b:3f48:b0:329:cb75:fef2 with SMTP id 98e67ed59e1d1-33097fd0cfemr5398389a91.3.1758304103677; Fri, 19 Sep 2025 10:48:23 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.19 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:23 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 03/10] bng_en: Add initial support for CP and NQ rings Date: Fri, 19 Sep 2025 23:17:34 +0530 Message-ID: <20250919174742.24969-4-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Allocate CP and NQ related data structures and add support to associate NQ and CQ rings. Also, add the association of NQ, NAPI, and interrupts. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- drivers/net/ethernet/broadcom/bnge/bnge.h | 1 + .../net/ethernet/broadcom/bnge/bnge_netdev.c | 413 ++++++++++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 10 + .../net/ethernet/broadcom/bnge/bnge_resc.c | 2 +- 4 files changed, 425 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge.h b/drivers/net/ethern= et/broadcom/bnge/bnge.h index 03e55b931f7..c536c0cc66e 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge.h @@ -215,5 +215,6 @@ static inline bool bnge_is_agg_reqd(struct bnge_dev *bd) } =20 bool bnge_aux_registered(struct bnge_dev *bd); +u16 bnge_aux_get_msix(struct bnge_dev *bd); =20 #endif /* _BNGE_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index c25a793b8ae..67da7001427 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -27,6 +27,233 @@ #define BNGE_RING_TO_TC(bd, tx) \ ((tx) / (bd)->tx_nr_rings_per_tc) =20 +#define BNGE_TC_TO_RING_BASE(bd, tc) \ + ((tc) * (bd)->tx_nr_rings_per_tc) + +static void bnge_free_nq_desc_arr(struct bnge_nq_ring_info *nqr) +{ + struct bnge_ring_struct *ring =3D &nqr->ring_struct; + + kfree(nqr->desc_ring); + nqr->desc_ring =3D NULL; + ring->ring_mem.pg_arr =3D NULL; + kfree(nqr->desc_mapping); + nqr->desc_mapping =3D NULL; + ring->ring_mem.dma_arr =3D NULL; +} + +static void bnge_free_cp_desc_arr(struct bnge_cp_ring_info *cpr) +{ + struct bnge_ring_struct *ring =3D &cpr->ring_struct; + + kfree(cpr->desc_ring); + cpr->desc_ring =3D NULL; + ring->ring_mem.pg_arr =3D NULL; + kfree(cpr->desc_mapping); + cpr->desc_mapping =3D NULL; + ring->ring_mem.dma_arr =3D NULL; +} + +static int bnge_alloc_nq_desc_arr(struct bnge_nq_ring_info *nqr, int n) +{ + nqr->desc_ring =3D kcalloc(n, sizeof(*nqr->desc_ring), GFP_KERNEL); + if (!nqr->desc_ring) + return -ENOMEM; + + nqr->desc_mapping =3D kcalloc(n, sizeof(*nqr->desc_mapping), GFP_KERNEL); + if (!nqr->desc_mapping) + goto err_free_desc_ring; + return 0; + +err_free_desc_ring: + kfree(nqr->desc_ring); + nqr->desc_ring =3D NULL; + return -ENOMEM; +} + +static int bnge_alloc_cp_desc_arr(struct bnge_cp_ring_info *cpr, int n) +{ + cpr->desc_ring =3D kcalloc(n, sizeof(*cpr->desc_ring), GFP_KERNEL); + if (!cpr->desc_ring) + return -ENOMEM; + + cpr->desc_mapping =3D kcalloc(n, sizeof(*cpr->desc_mapping), GFP_KERNEL); + if (!cpr->desc_mapping) + goto err_free_desc_ring; + return 0; + +err_free_desc_ring: + kfree(cpr->desc_ring); + cpr->desc_ring =3D NULL; + return -ENOMEM; +} + +static void bnge_free_nq_arrays(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + + bnge_free_nq_desc_arr(&bnapi->nq_ring); + } +} + +static int bnge_alloc_nq_arrays(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i, rc; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + + rc =3D bnge_alloc_nq_desc_arr(&bnapi->nq_ring, bn->cp_nr_pages); + if (rc) + goto err_free_nq_arrays; + } + return 0; + +err_free_nq_arrays: + bnge_free_nq_arrays(bn); + return rc; +} + +static void bnge_free_nq_tree(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_nq_ring_info *nqr; + struct bnge_ring_struct *ring; + int j; + + nqr =3D &bnapi->nq_ring; + ring =3D &nqr->ring_struct; + + bnge_free_ring(bd, &ring->ring_mem); + + if (!nqr->cp_ring_arr) + continue; + + for (j =3D 0; j < nqr->cp_ring_count; j++) { + struct bnge_cp_ring_info *cpr =3D &nqr->cp_ring_arr[j]; + + ring =3D &cpr->ring_struct; + bnge_free_ring(bd, &ring->ring_mem); + bnge_free_cp_desc_arr(cpr); + } + kfree(nqr->cp_ring_arr); + nqr->cp_ring_arr =3D NULL; + nqr->cp_ring_count =3D 0; + } +} + +static int alloc_one_cp_ring(struct bnge_net *bn, + struct bnge_cp_ring_info *cpr) +{ + struct bnge_ring_mem_info *rmem; + struct bnge_ring_struct *ring; + struct bnge_dev *bd =3D bn->bd; + int rc; + + rc =3D bnge_alloc_cp_desc_arr(cpr, bn->cp_nr_pages); + if (rc) + return -ENOMEM; + ring =3D &cpr->ring_struct; + rmem =3D &ring->ring_mem; + rmem->nr_pages =3D bn->cp_nr_pages; + rmem->page_size =3D HW_CMPD_RING_SIZE; + rmem->pg_arr =3D (void **)cpr->desc_ring; + rmem->dma_arr =3D cpr->desc_mapping; + rmem->flags =3D BNGE_RMEM_RING_PTE_FLAG; + rc =3D bnge_alloc_ring(bd, rmem); + if (rc) + goto err_free_cp_desc_arr; + return rc; + +err_free_cp_desc_arr: + bnge_free_cp_desc_arr(cpr); + return rc; +} + +static int bnge_alloc_nq_tree(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i, j, ulp_msix, rc; + int tcs =3D 1; + + ulp_msix =3D bnge_aux_get_msix(bd); + for (i =3D 0, j =3D 0; i < bd->nq_nr_rings; i++) { + bool sh =3D !!(bd->flags & BNGE_EN_SHARED_CHNL); + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_nq_ring_info *nqr; + struct bnge_cp_ring_info *cpr; + struct bnge_ring_struct *ring; + int cp_count =3D 0, k; + int rx =3D 0, tx =3D 0; + + nqr =3D &bnapi->nq_ring; + nqr->bnapi =3D bnapi; + ring =3D &nqr->ring_struct; + + rc =3D bnge_alloc_ring(bd, &ring->ring_mem); + if (rc) + goto err_free_nq_tree; + + ring->map_idx =3D ulp_msix + i; + + if (i < bd->rx_nr_rings) { + cp_count++; + rx =3D 1; + } + + if ((sh && i < bd->tx_nr_rings) || + (!sh && i >=3D bd->rx_nr_rings)) { + cp_count +=3D tcs; + tx =3D 1; + } + + nqr->cp_ring_arr =3D kcalloc(cp_count, sizeof(*cpr), + GFP_KERNEL); + if (!nqr->cp_ring_arr) { + rc =3D -ENOMEM; + goto err_free_nq_tree; + } + + nqr->cp_ring_count =3D cp_count; + + for (k =3D 0; k < cp_count; k++) { + cpr =3D &nqr->cp_ring_arr[k]; + rc =3D alloc_one_cp_ring(bn, cpr); + if (rc) + goto err_free_nq_tree; + + cpr->bnapi =3D bnapi; + cpr->cp_idx =3D k; + if (!k && rx) { + bn->rx_ring[i].rx_cpr =3D cpr; + cpr->cp_ring_type =3D BNGE_NQ_HDL_TYPE_RX; + } else { + int n, tc =3D k - rx; + + n =3D BNGE_TC_TO_RING_BASE(bd, tc) + j; + bn->tx_ring[n].tx_cpr =3D cpr; + cpr->cp_ring_type =3D BNGE_NQ_HDL_TYPE_TX; + } + } + if (tx) + j++; + } + return 0; + +err_free_nq_tree: + bnge_free_nq_tree(bn); + return rc; +} + static bool bnge_separate_head_pool(struct bnge_rx_ring_info *rxr) { return rxr->need_head_pool || PAGE_SIZE > BNGE_RX_PAGE_SIZE; @@ -216,6 +443,8 @@ static void bnge_free_core(struct bnge_net *bn) { bnge_free_tx_rings(bn); bnge_free_rx_rings(bn); + bnge_free_nq_tree(bn); + bnge_free_nq_arrays(bn); kfree(bn->tx_ring_map); bn->tx_ring_map =3D NULL; kfree(bn->tx_ring); @@ -302,6 +531,10 @@ static int bnge_alloc_core(struct bnge_net *bn) txr->bnapi =3D bnapi2; } =20 + rc =3D bnge_alloc_nq_arrays(bn); + if (rc) + goto err_free_core; + bnge_init_ring_struct(bn); =20 rc =3D bnge_alloc_rx_rings(bn); @@ -309,6 +542,10 @@ static int bnge_alloc_core(struct bnge_net *bn) goto err_free_core; =20 rc =3D bnge_alloc_tx_rings(bn); + if (rc) + goto err_free_core; + + rc =3D bnge_alloc_nq_tree(bn); if (rc) goto err_free_core; return 0; @@ -318,6 +555,166 @@ static int bnge_alloc_core(struct bnge_net *bn) return rc; } =20 +static int bnge_cp_num_to_irq_num(struct bnge_net *bn, int n) +{ + struct bnge_napi *bnapi =3D bn->bnapi[n]; + struct bnge_nq_ring_info *nqr; + + nqr =3D &bnapi->nq_ring; + + return nqr->ring_struct.map_idx; +} + +static irqreturn_t bnge_msix(int irq, void *dev_instance) +{ + /* NAPI scheduling to be added in a future patch */ + return IRQ_HANDLED; +} + +static void bnge_setup_msix(struct bnge_net *bn) +{ + struct net_device *dev =3D bn->netdev; + struct bnge_dev *bd =3D bn->bd; + int len, i; + + len =3D sizeof(bd->irq_tbl[0].name); + for (i =3D 0; i < bd->nq_nr_rings; i++) { + int map_idx =3D bnge_cp_num_to_irq_num(bn, i); + char *attr; + + if (bd->flags & BNGE_EN_SHARED_CHNL) + attr =3D "TxRx"; + else if (i < bd->rx_nr_rings) + attr =3D "rx"; + else + attr =3D "tx"; + + snprintf(bd->irq_tbl[map_idx].name, len, "%s-%s-%d", dev->name, + attr, i); + bd->irq_tbl[map_idx].handler =3D bnge_msix; + } +} + +static int bnge_setup_interrupts(struct bnge_net *bn) +{ + struct net_device *dev =3D bn->netdev; + struct bnge_dev *bd =3D bn->bd; + + bnge_setup_msix(bn); + + return netif_set_real_num_queues(dev, bd->tx_nr_rings, bd->rx_nr_rings); +} + +static void bnge_free_irq(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + struct bnge_irq *irq; + int i; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + int map_idx =3D bnge_cp_num_to_irq_num(bn, i); + + irq =3D &bd->irq_tbl[map_idx]; + if (irq->requested) { + if (irq->have_cpumask) { + irq_set_affinity_hint(irq->vector, NULL); + free_cpumask_var(irq->cpu_mask); + irq->have_cpumask =3D 0; + } + free_irq(irq->vector, bn->bnapi[i]); + } + + irq->requested =3D 0; + } +} + +static int bnge_request_irq(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i, rc; + + rc =3D bnge_setup_interrupts(bn); + if (rc) { + netdev_err(bn->netdev, "bnge_setup_interrupts err: %d\n", rc); + return rc; + } + for (i =3D 0; i < bd->nq_nr_rings; i++) { + int map_idx =3D bnge_cp_num_to_irq_num(bn, i); + struct bnge_irq *irq =3D &bd->irq_tbl[map_idx]; + + rc =3D request_irq(irq->vector, irq->handler, 0, irq->name, + bn->bnapi[i]); + if (rc) + goto err_free_irq; + + netif_napi_set_irq_locked(&bn->bnapi[i]->napi, irq->vector); + irq->requested =3D 1; + + if (zalloc_cpumask_var(&irq->cpu_mask, GFP_KERNEL)) { + int numa_node =3D dev_to_node(&bd->pdev->dev); + + irq->have_cpumask =3D 1; + cpumask_set_cpu(cpumask_local_spread(i, numa_node), + irq->cpu_mask); + rc =3D irq_set_affinity_hint(irq->vector, irq->cpu_mask); + if (rc) { + netdev_warn(bn->netdev, + "Set affinity failed, IRQ =3D %d\n", + irq->vector); + goto err_free_irq; + } + } + } + return 0; + +err_free_irq: + bnge_free_irq(bn); + return rc; +} + +static int bnge_napi_poll(struct napi_struct *napi, int budget) +{ + int work_done =3D 0; + + /* defer NAPI implementation to next patch series */ + napi_complete_done(napi, work_done); + + return work_done; +} + +static void bnge_init_napi(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + struct bnge_napi *bnapi; + int i; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + bnapi =3D bn->bnapi[i]; + netif_napi_add_config_locked(bn->netdev, &bnapi->napi, + bnge_napi_poll, bnapi->index); + } +} + +static void bnge_del_napi(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + for (i =3D 0; i < bd->rx_nr_rings; i++) + netif_queue_set_napi(bn->netdev, i, NETDEV_QUEUE_TYPE_RX, NULL); + for (i =3D 0; i < bd->tx_nr_rings; i++) + netif_queue_set_napi(bn->netdev, i, NETDEV_QUEUE_TYPE_TX, NULL); + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + + __netif_napi_del_locked(&bnapi->napi); + } + + /* Wait for RCU grace period after removing NAPI instances */ + synchronize_net(); +} + static int bnge_open_core(struct bnge_net *bn) { struct bnge_dev *bd =3D bn->bd; @@ -337,8 +734,20 @@ static int bnge_open_core(struct bnge_net *bn) return rc; } =20 + bnge_init_napi(bn); + rc =3D bnge_request_irq(bn); + if (rc) { + netdev_err(bn->netdev, "bnge_request_irq err: %d\n", rc); + goto err_del_napi; + } + set_bit(BNGE_STATE_OPEN, &bd->state); return 0; + +err_del_napi: + bnge_del_napi(bn); + bnge_free_core(bn); + return rc; } =20 static netdev_tx_t bnge_start_xmit(struct sk_buff *skb, struct net_device = *dev) @@ -365,6 +774,9 @@ static void bnge_close_core(struct bnge_net *bn) struct bnge_dev *bd =3D bn->bd; =20 clear_bit(BNGE_STATE_OPEN, &bd->state); + bnge_free_irq(bn); + bnge_del_napi(bn); + bnge_free_core(bn); } =20 @@ -587,6 +999,7 @@ int bnge_netdev_alloc(struct bnge_dev *bd, int max_irqs) bnge_init_l2_fltr_tbl(bn); bnge_init_mac_addr(bd); =20 + netdev->request_ops_lock =3D true; rc =3D register_netdev(netdev); if (rc) { dev_err(bd->dev, "Register netdev failed rc: %d\n", rc); diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index 92bae665f59..bccddae09fa 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -133,6 +133,9 @@ enum { =20 #define BNGE_NET_EN_TPA (BNGE_NET_EN_GRO | BNGE_NET_EN_LRO) =20 +#define BNGE_NQ_HDL_TYPE_RX 0x00 +#define BNGE_NQ_HDL_TYPE_TX 0x01 + struct bnge_net { struct bnge_dev *bd; struct net_device *netdev; @@ -172,6 +175,8 @@ struct bnge_net { =20 u16 *tx_ring_map; enum dma_data_direction rx_dir; + + int total_irqs; }; =20 #define BNGE_DEFAULT_RX_RING_SIZE 511 @@ -223,6 +228,8 @@ struct bnge_cp_ring_info { dma_addr_t *desc_mapping; struct tx_cmp **desc_ring; struct bnge_ring_struct ring_struct; + u8 cp_ring_type; + u8 cp_idx; }; =20 struct bnge_nq_ring_info { @@ -230,6 +237,9 @@ struct bnge_nq_ring_info { dma_addr_t *desc_mapping; struct nqe_cn **desc_ring; struct bnge_ring_struct ring_struct; + + int cp_ring_count; + struct bnge_cp_ring_info *cp_ring_arr; }; =20 struct bnge_rx_ring_info { diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c b/drivers/net/e= thernet/broadcom/bnge/bnge_resc.c index c79a3607a1b..5597af1b3b7 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.c @@ -46,7 +46,7 @@ static int bnge_aux_get_dflt_msix(struct bnge_dev *bd) return min_t(int, roce_msix, num_online_cpus() + 1); } =20 -static u16 bnge_aux_get_msix(struct bnge_dev *bd) +u16 bnge_aux_get_msix(struct bnge_dev *bd) { if (bnge_is_roce_en(bd)) return bd->aux_num_msix; --=20 2.47.3 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-qv1-f98.google.com (mail-qv1-f98.google.com [209.85.219.98]) (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 CE3BB322DBA for ; Fri, 19 Sep 2025 17:48:30 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.98 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304112; cv=none; b=f9R2JKs+IRMUms8tCqypTRXC3G8qg6TIC9eMH9VYetLX2LtOt+D3M+T2O+YACsbXhdCr7MLoZlQ1qnJnWANPO2qLqx2qLqwQhs2r7NuJAquml1wwm+YfHAsV5zV4SlRVwhPVG0WmxyFp8j7uxk8reg/OwzezX/zeHcWYMW/4yRI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304112; c=relaxed/simple; bh=+U9VwpQDZKnRhyDKJWqrh6t+vRxcUQAWmT+i2EwSPZE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=fO+jAZglcMfO9rhGKYK1wsw/6FewAne31+zdKvsPlGcUIIF3azhOtOBYxfe2YJykYZWqPcyeCC0tGtxi8AidnwrP2Ylqe1DKE620tIvWkyoQbE/3pUtO2tqvI5SYtVIoQriNbWh5vuwIHY6n+xTjxhSU/OmM4U393cT2ffsfYbc= 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=dAquKlJr; arc=none smtp.client-ip=209.85.219.98 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="dAquKlJr" Received: by mail-qv1-f98.google.com with SMTP id 6a1803df08f44-77766aae080so26389906d6.1 for ; Fri, 19 Sep 2025 10:48:30 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304110; x=1758908910; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=3WEPji3RS1+RhxYXPlyiCS/AdggPdPHkCGhc0sRkgSk=; b=su0kbgX0N8j4f9fi/tEZFc3YDyK7zBSLT0CjAlSxF3R0FnidlaLFfWZejvbTUz/rh5 veGsSgxi1x4iFyYVO5bbIfhWU3FLHCNtePKilgjlnNB8ulWlsBJYIMwSCyjPjBuRr6+I gsFgouyQrYuQF3tf05Kg75iuEy1AhXHQx9ZoBw/bGInpgqq8/2Rclf76mYcNbWXdHJss 5YzvfhEcRO1iuZafEd9/T2y1EJv6ELPPyiydfNEd982kjiJ4tLwg1qM9tu60YCH2urVf BEc4dwSR307YQBTM+cnr+sNZsrDvGl4m1GeixIZvse32hv9KwlyH4J1ivPZIUBHyhbI9 sH/g== X-Forwarded-Encrypted: i=1; AJvYcCXrZiKO8SCUu2Uekdt8UE9Y/XnYWoRfd+YVhQ+CWfchYShTKHPUB+E3lm3R8sKDU7nbWkUUbnDRXno7oXU=@vger.kernel.org X-Gm-Message-State: AOJu0YwmwhbpcM1tfsaV6XrR65VQdB54GtPCCEr84i0/saSYfXFzetkx a+uHsp/TChojFrl1At+EMyvzxjGCchdR6RSR2/+9+ajd4rftlqwy+Yme1iAIghVasiyeLnJ2hLX 0O2sFJM8odHsWrrTpBZ6VfAQWifYMphgxUh2AulR7v42nXENCE9M/d+q5s9pvx3H++cPUQj6gAt d9M0ePgtz1dp+Rta2W5XFWQg/e2tkelVLhJJy6qFCRZqJP/Db+NZbcG+bSy+vbJEH+fDLqDE0B0 SSbSj6tWzp+ZU4qCLHFLhywZhTV X-Gm-Gg: ASbGncuNMb/qCVJsftbGnQXw0I6/+b+0K9VJ25Asy00SDn3pKq4fBGdV25U7Qd+UqLj D2pny7GEEXctEiv6jO3TdiPDgTsbUqdNE4H5HMJq2A8jiXBRGqKz0c59BisqxYmW/xnY9YVze3F +qRySfExfKRWRlFgOSqnyPRLzhDYe2rO7T67fbgg617rZlWhJZHWXJC9En636Sz3yW7YFZ9x5jr TUQ9qMp+quw/9DPK3feYct898NGBXja8anS/Up9A1kDDhN0mR7nkI5G6IyYSGt2hM9cuYSIvcbv /66CL83jd8q+/HC3Zg5Cvd4b5iFCrOOKiqTVM4Oea+B4fg/rmerSjowM4jyfFARhLZxAdp9+bnC 0hjoZtoVGCQnWQJRwDqDmrAR6ij+O9jR0uVJMFya40tGFiqnj6c+PucaEKMlX2bGvtZ4ZpUhpjr U0QNVzVNE2 X-Google-Smtp-Source: AGHT+IEFk9if4O8L17t0gs5C0URynsBr1Z4Q+0J/jKhZTAU8caM9u95mme3KqVdRd3lF1kG4UrMGAFehQDmo X-Received: by 2002:a05:6214:500c:b0:78e:8752:826e with SMTP id 6a1803df08f44-798b90ce5d4mr44970706d6.7.1758304109791; Fri, 19 Sep 2025 10:48:29 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-119.dlp.protect.broadcom.com. [144.49.247.119]) by smtp-relay.gmail.com with ESMTPS id 6a1803df08f44-79343ef2d8dsm3434696d6.2.2025.09.19.10.48.29 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:29 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-77f14f6a553so388578b3a.1 for ; Fri, 19 Sep 2025 10:48:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304108; x=1758908908; 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=3WEPji3RS1+RhxYXPlyiCS/AdggPdPHkCGhc0sRkgSk=; b=dAquKlJrq+3NkkIqZs+L7w0jc+Od82FjEsYOxVxVlyacVmtAS9K7caJrco5dRApWGV x1DB0iH6pQeVNiDkTcnhF/nO0+6ATje/ZXQFrvy0SgTtWuLNChW1c7yHY2SjRvaWN++1 fpuXuoTR9Ll+Q5D5JAAAphHPOUstsZJidMBGU= X-Forwarded-Encrypted: i=1; AJvYcCX1rQjLgzqZ0EWzorcz3PXnQrC68tWHrpZdXVHaJL8Uwlzl6nmeBRn/06jUiZq+mLXJzonqBdpsEv1/2Wc=@vger.kernel.org X-Received: by 2002:a05:6a20:e212:b0:263:a022:983e with SMTP id adf61e73a8af0-28467929cfamr12118989637.29.1758304108533; Fri, 19 Sep 2025 10:48:28 -0700 (PDT) X-Received: by 2002:a05:6a20:e212:b0:263:a022:983e with SMTP id adf61e73a8af0-28467929cfamr12118957637.29.1758304108074; Fri, 19 Sep 2025 10:48:28 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:27 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 04/10] bng_en: Introduce VNIC Date: Fri, 19 Sep 2025 23:17:35 +0530 Message-ID: <20250919174742.24969-5-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e 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 | 121 ++++++++++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 30 +++++ 2 files changed, 151 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index 67da7001427..df05e6ea271 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -439,12 +439,122 @@ static int bnge_alloc_tx_rings(struct bnge_net *bn) return rc; } =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, 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; + + vnic->uc_list =3D kmalloc(mem_size, GFP_KERNEL); + if (!vnic->uc_list) + goto err_free_vnic_attributes; + } + + 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) + goto err_free_vnic_attributes; + } + + /* Allocate rss table and hash key */ + 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) + goto err_free_vnic_attributes; + + 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; + +err_free_vnic_attributes: + bnge_free_vnic_attributes(bn); + return -ENOMEM; +} + +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_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_vnics(bn); kfree(bn->tx_ring_map); bn->tx_ring_map =3D NULL; kfree(bn->tx_ring); @@ -531,6 +641,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; @@ -546,6 +660,13 @@ static int bnge_alloc_core(struct bnge_net *bn) goto err_free_core; =20 rc =3D bnge_alloc_nq_tree(bn); + if (rc) + goto err_free_core; + + 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; diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index bccddae09fa..115297dd82c 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -176,6 +176,8 @@ struct bnge_net { u16 *tx_ring_map; enum dma_data_direction rx_dir; =20 + struct bnge_vnic_info *vnic_info; + int nr_vnics; int total_irqs; }; =20 @@ -300,4 +302,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 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-io1-f99.google.com (mail-io1-f99.google.com [209.85.166.99]) (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 BD0C8323414 for ; Fri, 19 Sep 2025 17:48:35 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.99 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304117; cv=none; b=NYeJwqjvXhA6D1fA9VgdOGSBYwPlxytkZMmELGGppHfG6dHzcrMM4mOra60g8pKLMVtn7hlOX2uuL9+a/sV3SPCz5P/oa8K/SQsst+N2IzF90PohlWQf1HqSyaAMrWAC0hllw9x3UnmGPUfc24TLrx7fER53gqGYDD971ue5kEo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304117; c=relaxed/simple; bh=lnfezG8VyIGZ/WTj0Vt5pgVwkJXMU2oog07QRNCkswM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C5JYJLuppsLm05Jiseh2Zd9Vg6eHbw0U1mOBIDHFfE4rd2240uYAbD8p5Er/gCfFLqJH+VQaZkJ9t1NRTy80qoaDbx/U7LJdWs684ZTVaAZZ4IkjOTLdXbxrZ4mT5u2c3XncGWj0mITD4gd5FRJ0affghbBMngRdu8aKdFcwMOg= 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=HcjyfNpF; arc=none smtp.client-ip=209.85.166.99 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="HcjyfNpF" Received: by mail-io1-f99.google.com with SMTP id ca18e2360f4ac-88758c2a133so211820639f.0 for ; Fri, 19 Sep 2025 10:48:35 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304115; x=1758908915; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bnJXUu4JK2DcGo43AyLTZEWYsUCAvh8a5G8goJOjFss=; b=geVU91IgcBBmA40QIIqlmB6CXKDlZ9oOAGxSgQMfvDsANswTp217hhCokzGEkhUOmi /5aMCxkzXEO5Y0MesLO4sfpPLmJyGoTkQiWGy0twaYRsumHTjFbBJgybJ65t8eOAVRS0 G1dJBphHEAJMqvdK5ZyxwBUcsvewykXwvKCIBlZdK6fDtjMYcPlzRp8ldcOdotlhKBUk 61NGKKauO2jWLMQpzHoGcNby875sNJcvzH9BeZAhvSfSV5GZsBKyGt7HLdtX6JqienHY j8XQUEg41mQVjtrwrdOwQCTXOpEdpgp1BwKfKnOeXSA8QqMKZPcFQKYnkIZNn/D+Ba86 0Y0w== X-Forwarded-Encrypted: i=1; AJvYcCVD/8DON2WVXU/v5/ByXcQOsQTSYk1s1tlv+4HyUX8/3H+HNBy5QLly9aN+9zn/YNuI6GsL2q40HK92AWk=@vger.kernel.org X-Gm-Message-State: AOJu0Yw+UhF0vzCMLAME1yEBbiOPpWhF2ogBvRHAHmaGj64dDewrZPG7 TE6BoIP51VzCk5TMMayTxauBqkFIgJpMAYeoOVBPh32ec1xBJWVArf4Mr9c/3OfU49VPCSaWXfA EYUZCzVb7Xml1DVkBJaE7Ux7RPKf18ITG42ZWi2Hyt4M7xNSA6zWkwlDzMIf8+yCpkMfKeuA76K mhyexcYnXCIlvkI4h9To6Y12PWS67YRmh8Hp4W13v4Z6zy7ZJeomlvmAUfjvuTic5VS2Yu75mPt 87ShZeDvwDqkuAgJJQuhxIT2F/k X-Gm-Gg: ASbGncvU69nSc2WKgYCDFI+vcVZKQDq9MgT+8n8ja+fJu0Gb7Ic7miT24kb6MkYWGBe sMKh/PkhUnElJ0+7aqpKqMeBgU+MJqgWPtyRl24I2kXD5vx1xyurJBWalPR8s3Tg+Y6+JNTt0LF 2PMb8Vfg4Uaa2Yq7S+r20dj2THYjhw124FCto65YuBrPZnKq5sehVjBudoOY+9ExTgBKhMbAchT NUkDiV9cHyk3UKItt/GDkqFINF3NcoUVJsu0SPMWlexPoHOUxpgpfT4uJwkSFIukOW7zdLIpwrC Or+gToxGEr1I83Wxm84WmAbWh0Il6NumSv3yXs3JoucD/9tgxvYYJkT0rmzfryyAvjaNTer6OHA 1SocfGZGfl88LAqra2VE3grvREjCpgesq7T3brkOiTHcCw5WoSoCWS6W99Pu3l9qA8cGoLcEXMi 5/9r0BSpZY X-Google-Smtp-Source: AGHT+IErZ6NJTU+qZsz5wMGEZ+8vAIGta9PkKZrqLoenlKI1lboYECJPtRdTvp/OXPYc/e0FCoXbUmyw4lBH X-Received: by 2002:a05:6e02:2782:b0:424:8030:2f86 with SMTP id e9e14a558f8ab-42481999b99mr79947455ab.29.1758304114551; Fri, 19 Sep 2025 10:48:34 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-119.dlp.protect.broadcom.com. [144.49.247.119]) by smtp-relay.gmail.com with ESMTPS id e9e14a558f8ab-42485b0e2b9sm1122955ab.39.2025.09.19.10.48.34 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:34 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pg1-f199.google.com with SMTP id 41be03b00d2f7-b5527f0d39bso623721a12.2 for ; Fri, 19 Sep 2025 10:48:33 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304113; x=1758908913; 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=bnJXUu4JK2DcGo43AyLTZEWYsUCAvh8a5G8goJOjFss=; b=HcjyfNpFOJRDBL611j8fUXAb3lEC778OFJXHQlSXEQBcK6YGkOXdkGR6Sg0UmDOFwC EvQm8/kFrEd5Yd9se5oLLUQ6gXhEd+v7BC8ekepLVlzxO/0MeYiug73Ic/yNBMbjrMAO tEHwL3TOHpVoZROx4jAIOL5BAEmzJk4eIjty0= X-Forwarded-Encrypted: i=1; AJvYcCXTICrdu6IOPllxch57RI9bnRu77Iq7Bs3i8dZ50tC6DDQvIEQUQf8cxIEXHZpA7JVwVg4DOveghCSdXAQ=@vger.kernel.org X-Received: by 2002:a05:6a20:918f:b0:245:fb85:ef69 with SMTP id adf61e73a8af0-2927154c935mr6911031637.40.1758304113001; Fri, 19 Sep 2025 10:48:33 -0700 (PDT) X-Received: by 2002:a05:6a20:918f:b0:245:fb85:ef69 with SMTP id adf61e73a8af0-2927154c935mr6911004637.40.1758304112510; Fri, 19 Sep 2025 10:48:32 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.28 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:32 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 05/10] bng_en: Initialise core resources Date: Fri, 19 Sep 2025 23:17:36 +0530 Message-ID: <20250919174742.24969-6-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Add initial settings to all core resources, such as the RX, AGG, TX, CQ, and NQ rings, as well as the VNIC. This will help enable these resources in future patches. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- .../net/ethernet/broadcom/bnge/bnge_netdev.c | 210 ++++++++++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 50 +++++ .../net/ethernet/broadcom/bnge/bnge_rmem.h | 1 + 3 files changed, 261 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index df05e6ea271..c3418b3fe05 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -547,6 +547,33 @@ static void bnge_free_vnics(struct bnge_net *bn) bn->nr_vnics =3D 0; } =20 +static void bnge_free_ring_grps(struct bnge_net *bn) +{ + kfree(bn->grp_info); + bn->grp_info =3D NULL; +} + +static int bnge_init_ring_grps(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + bn->grp_info =3D kcalloc(bd->nq_nr_rings, + sizeof(struct bnge_ring_grp_info), + GFP_KERNEL); + if (!bn->grp_info) + return -ENOMEM; + for (i =3D 0; i < bd->nq_nr_rings; i++) { + bn->grp_info[i].fw_stats_ctx =3D INVALID_HW_RING_ID; + bn->grp_info[i].fw_grp_id =3D INVALID_HW_RING_ID; + bn->grp_info[i].rx_fw_ring_id =3D INVALID_HW_RING_ID; + bn->grp_info[i].agg_fw_ring_id =3D INVALID_HW_RING_ID; + bn->grp_info[i].nq_fw_ring_id =3D INVALID_HW_RING_ID; + } + + return 0; +} + static void bnge_free_core(struct bnge_net *bn) { bnge_free_vnic_attributes(bn); @@ -554,6 +581,7 @@ static void bnge_free_core(struct bnge_net *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; @@ -692,6 +720,167 @@ static irqreturn_t bnge_msix(int irq, void *dev_insta= nce) return IRQ_HANDLED; } =20 +static void bnge_init_nq_tree(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i, j; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_nq_ring_info *nqr =3D &bn->bnapi[i]->nq_ring; + struct bnge_ring_struct *ring =3D &nqr->ring_struct; + + ring->fw_ring_id =3D INVALID_HW_RING_ID; + for (j =3D 0; j < nqr->cp_ring_count; j++) { + struct bnge_cp_ring_info *cpr =3D &nqr->cp_ring_arr[j]; + + ring =3D &cpr->ring_struct; + ring->fw_ring_id =3D INVALID_HW_RING_ID; + } + } +} + +static void bnge_init_rxbd_pages(struct bnge_ring_struct *ring, u32 type) +{ + struct rx_bd **rx_desc_ring; + u32 prod; + int i; + + rx_desc_ring =3D (struct rx_bd **)ring->ring_mem.pg_arr; + for (i =3D 0, prod =3D 0; i < ring->ring_mem.nr_pages; i++) { + struct rx_bd *rxbd =3D rx_desc_ring[i]; + int j; + + for (j =3D 0; j < RX_DESC_CNT; j++, rxbd++, prod++) { + rxbd->rx_bd_len_flags_type =3D cpu_to_le32(type); + rxbd->rx_bd_opaque =3D prod; + } + } +} + +static void bnge_init_one_rx_ring_rxbd(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr) +{ + struct bnge_ring_struct *ring; + u32 type; + + type =3D (bn->rx_buf_use_size << RX_BD_LEN_SHIFT) | + RX_BD_TYPE_RX_PACKET_BD | RX_BD_FLAGS_EOP; + + if (NET_IP_ALIGN =3D=3D 2) + type |=3D RX_BD_FLAGS_SOP; + + ring =3D &rxr->rx_ring_struct; + bnge_init_rxbd_pages(ring, type); + ring->fw_ring_id =3D INVALID_HW_RING_ID; +} + +static void bnge_init_one_agg_ring_rxbd(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr) +{ + struct bnge_ring_struct *ring; + u32 type; + + ring =3D &rxr->rx_agg_ring_struct; + ring->fw_ring_id =3D INVALID_HW_RING_ID; + if (bnge_is_agg_reqd(bn->bd)) { + type =3D ((u32)BNGE_RX_PAGE_SIZE << RX_BD_LEN_SHIFT) | + RX_BD_TYPE_RX_AGG_BD | RX_BD_FLAGS_SOP; + + bnge_init_rxbd_pages(ring, type); + } +} + +static void bnge_init_one_rx_ring_pair(struct bnge_net *bn, int ring_nr) +{ + struct bnge_rx_ring_info *rxr; + + rxr =3D &bn->rx_ring[ring_nr]; + bnge_init_one_rx_ring_rxbd(bn, rxr); + + netif_queue_set_napi(bn->netdev, ring_nr, NETDEV_QUEUE_TYPE_RX, + &rxr->bnapi->napi); + + bnge_init_one_agg_ring_rxbd(bn, rxr); +} + +static void bnge_init_rx_rings(struct bnge_net *bn) +{ + int i; + +#define BNGE_RX_OFFSET (NET_SKB_PAD + NET_IP_ALIGN) +#define BNGE_RX_DMA_OFFSET NET_SKB_PAD + bn->rx_offset =3D BNGE_RX_OFFSET; + bn->rx_dma_offset =3D BNGE_RX_DMA_OFFSET; + + for (i =3D 0; i < bn->bd->rx_nr_rings; i++) + bnge_init_one_rx_ring_pair(bn, i); +} + +static void bnge_init_tx_rings(struct bnge_net *bn) +{ + int i; + + bn->tx_wake_thresh =3D max(bn->tx_ring_size / 2, BNGE_MIN_TX_DESC_CNT); + + for (i =3D 0; i < bn->bd->tx_nr_rings; i++) { + struct bnge_tx_ring_info *txr =3D &bn->tx_ring[i]; + struct bnge_ring_struct *ring =3D &txr->tx_ring_struct; + + ring->fw_ring_id =3D INVALID_HW_RING_ID; + + netif_queue_set_napi(bn->netdev, i, NETDEV_QUEUE_TYPE_TX, + &txr->bnapi->napi); + } +} + +static void bnge_init_vnics(struct bnge_net *bn) +{ + struct bnge_vnic_info *vnic0 =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + int i; + + for (i =3D 0; i < bn->nr_vnics; i++) { + struct bnge_vnic_info *vnic =3D &bn->vnic_info[i]; + int j; + + vnic->fw_vnic_id =3D INVALID_HW_RING_ID; + vnic->vnic_id =3D i; + for (j =3D 0; j < BNGE_MAX_CTX_PER_VNIC; j++) + vnic->fw_rss_cos_lb_ctx[j] =3D INVALID_HW_RING_ID; + + if (bn->vnic_info[i].rss_hash_key) { + if (i =3D=3D BNGE_VNIC_DEFAULT) { + u8 *key =3D (void *)vnic->rss_hash_key; + int k; + + if (!bn->rss_hash_key_valid && + !bn->rss_hash_key_updated) { + get_random_bytes(bn->rss_hash_key, + HW_HASH_KEY_SIZE); + bn->rss_hash_key_updated =3D true; + } + + memcpy(vnic->rss_hash_key, bn->rss_hash_key, + HW_HASH_KEY_SIZE); + + if (!bn->rss_hash_key_updated) + continue; + + bn->rss_hash_key_updated =3D false; + bn->rss_hash_key_valid =3D true; + + bn->toeplitz_prefix =3D 0; + for (k =3D 0; k < 8; k++) { + bn->toeplitz_prefix <<=3D 8; + bn->toeplitz_prefix |=3D key[k]; + } + } else { + memcpy(vnic->rss_hash_key, vnic0->rss_hash_key, + HW_HASH_KEY_SIZE); + } + } + } +} + static void bnge_setup_msix(struct bnge_net *bn) { struct net_device *dev =3D bn->netdev; @@ -836,6 +1025,20 @@ static void bnge_del_napi(struct bnge_net *bn) synchronize_net(); } =20 +static int bnge_init_nic(struct bnge_net *bn) +{ + int rc; + + bnge_init_nq_tree(bn); + bnge_init_rx_rings(bn); + bnge_init_tx_rings(bn); + rc =3D bnge_init_ring_grps(bn); + if (rc) + return rc; + bnge_init_vnics(bn); + return rc; +} + static int bnge_open_core(struct bnge_net *bn) { struct bnge_dev *bd =3D bn->bd; @@ -862,9 +1065,16 @@ static int bnge_open_core(struct bnge_net *bn) goto err_del_napi; } =20 + rc =3D bnge_init_nic(bn); + if (rc) { + netdev_err(bn->netdev, "bnge_init_nic err: %d\n", rc); + goto err_free_irq; + } set_bit(BNGE_STATE_OPEN, &bd->state); return 0; =20 +err_free_irq: + bnge_free_irq(bn); err_del_napi: bnge_del_napi(bn); bnge_free_core(bn); diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index 115297dd82c..10bd29a833e 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -118,6 +118,20 @@ struct bnge_sw_rx_agg_bd { dma_addr_t mapping; }; =20 +#define HWRM_RING_ALLOC_TX 0x1 +#define HWRM_RING_ALLOC_RX 0x2 +#define HWRM_RING_ALLOC_AGG 0x4 +#define HWRM_RING_ALLOC_CMPL 0x8 +#define HWRM_RING_ALLOC_NQ 0x10 + +struct bnge_ring_grp_info { + u16 fw_stats_ctx; + u16 fw_grp_id; + u16 rx_fw_ring_id; + u16 agg_fw_ring_id; + u16 nq_fw_ring_id; +}; + #define BNGE_RX_COPY_THRESH 256 =20 #define BNGE_HW_FEATURE_VLAN_ALL_RX \ @@ -133,6 +147,28 @@ enum { =20 #define BNGE_NET_EN_TPA (BNGE_NET_EN_GRO | BNGE_NET_EN_LRO) =20 +/* Minimum TX BDs for a TX packet with MAX_SKB_FRAGS + 1. We need one extra + * BD because the first TX BD is always a long BD. + */ +#define BNGE_MIN_TX_DESC_CNT (MAX_SKB_FRAGS + 2) + +#define RX_RING(bn, x) (((x) & (bn)->rx_ring_mask) >> (BNGE_PAGE_SHIFT - 4= )) +#define RX_AGG_RING(bn, x) (((x) & (bn)->rx_agg_ring_mask) >> \ + (BNGE_PAGE_SHIFT - 4)) +#define RX_IDX(x) ((x) & (RX_DESC_CNT - 1)) + +#define TX_RING(bn, x) (((x) & (bn)->tx_ring_mask) >> (BNGE_PAGE_SHIFT - 4= )) +#define TX_IDX(x) ((x) & (TX_DESC_CNT - 1)) + +#define CP_RING(x) (((x) & ~(CP_DESC_CNT - 1)) >> (BNGE_PAGE_SHIFT - 4)) +#define CP_IDX(x) ((x) & (CP_DESC_CNT - 1)) + +#define RING_RX(bn, idx) ((idx) & (bn)->rx_ring_mask) +#define NEXT_RX(idx) ((idx) + 1) + +#define RING_RX_AGG(bn, idx) ((idx) & (bn)->rx_agg_ring_mask) +#define NEXT_RX_AGG(idx) ((idx) + 1) + #define BNGE_NQ_HDL_TYPE_RX 0x00 #define BNGE_NQ_HDL_TYPE_TX 0x01 =20 @@ -176,9 +212,19 @@ struct bnge_net { u16 *tx_ring_map; enum dma_data_direction rx_dir; =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; + + u32 tx_wake_thresh; + u16 rx_offset; + u16 rx_dma_offset; + + u8 rss_hash_key[HW_HASH_KEY_SIZE]; + u8 rss_hash_key_valid:1; + u8 rss_hash_key_updated:1; }; =20 #define BNGE_DEFAULT_RX_RING_SIZE 511 @@ -307,6 +353,9 @@ struct bnge_napi { #define BNGE_MAX_UC_ADDRS 4 =20 struct bnge_vnic_info { + u16 fw_vnic_id; +#define BNGE_MAX_CTX_PER_VNIC 8 + u16 fw_rss_cos_lb_ctx[BNGE_MAX_CTX_PER_VNIC]; u8 *uc_list; dma_addr_t rss_table_dma_addr; __le16 *rss_table; @@ -329,5 +378,6 @@ struct bnge_vnic_info { #define BNGE_VNIC_RSS_FLAG 1 #define BNGE_VNIC_MCAST_FLAG 4 #define BNGE_VNIC_UCAST_FLAG 8 + u32 vnic_id; }; #endif /* _BNGE_NETDEV_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h b/drivers/net/e= thernet/broadcom/bnge/bnge_rmem.h index 162a66c7983..0e7684e2071 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h @@ -184,6 +184,7 @@ struct bnge_ctx_mem_info { struct bnge_ring_struct { struct bnge_ring_mem_info ring_mem; =20 + u16 fw_ring_id; union { u16 grp_idx; u16 map_idx; /* Used by NQs */ --=20 2.47.3 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-oa1-f97.google.com (mail-oa1-f97.google.com [209.85.160.97]) (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 9F0E9323F7E for ; Fri, 19 Sep 2025 17:48:40 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.97 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304122; cv=none; b=iemFzkuzbRMjyq56UTY4zLnbYysItJujwdLUDj+CtdXUYIRGkzirnynMTZZ4hAQsGuVixvYH2mNj+wCUmkY9cDo1xEANmQnhABpKeNze1hdqK84sSupsRPLYUYBO0F3+kEbHOXCccuIE2Dyas0kWRoMgkmSeXmlEofUXZj3zf5M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304122; c=relaxed/simple; bh=OfLpipZFBCTyYHs+O8EIrtSKEHVWT2EoKmMEO5+PU6A=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=tx7+DzeUEasg28mQm6v9TeuRyrYUjvhuspVP045IjkL7/wH70ra49T9d61HzDJLHWs3W430lLqtRgbDLBHZl8sf+19ZEI6StnAZj/0/aoQRhnw1inNDmI8YKkzYmC/7tw5dt0eU3FKgHYIIxPloEDPk0db5hf74oqfkNYf1GMZA= 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=OMftSBq1; arc=none smtp.client-ip=209.85.160.97 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="OMftSBq1" Received: by mail-oa1-f97.google.com with SMTP id 586e51a60fabf-30cceb749d7so1000119fac.2 for ; Fri, 19 Sep 2025 10:48:40 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304119; x=1758908919; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XW0/1Cei49q5/klZoX7Q0m/rGvA4O6wvwJ9Vo850vrE=; b=OJxjrZ4anIiw9anO4Zs4GF4SVVqiw+wE00RuzkK6LDBm38wWk3uDeW16Z63vksDu2r Yo0jAm/mvnCXJCSMbk9aqxfsjzb4Qkqk8mj0lVzeM7zKrvWiki/cAtwzUClHyRwMPCaS xwikpDWY3jM+fuvRzNkiZ4qAmHVNf7NlskC4lyY27h6Eyd01CcsnP+0WeM2FYCVtPkwL bBuzhZjKRkmL4r2wetieqJ9f9ZHDXyrO3EgoRuLoH8pWtL9cjr62Za3AV1lRJqbBGcQZ Uy+j1hw11Sa0wkH0VVFU1Eq3VVOt3gRLXPhb/I0yEonFI4rYHMLjw4dwp8a84PmC1Wyx q3Lg== X-Forwarded-Encrypted: i=1; AJvYcCWKQGB38FpsrwNVhfKh0UXSH1frk9OlrgtLpURiv5dF7DaZoh06kxegmRFZqE86vpoKJkHa/jZJxCmTUXw=@vger.kernel.org X-Gm-Message-State: AOJu0YzByGVdbeAT0WIBnC1PsN13j/73iRF+EDcvEeDW3yk2FBZ3Expn LpOmHG+KwIOdUdvr+9Ebv6aZVRI29t/T1bGl+0kavgDRebZhy/Zp+CB8F5QJzyRooPkvjn3jY98 lTlfJqkI1yrztIYlyLNIcqm3KNlYoEUqn34kN7Yu7xZ6hGXzN0bITHDqLC0yEkRleo6nFqam4au OmNh3quewQvNUn453E4C9O/h9RrhERGyS9xOX4IpKZVRd208n3l0BecLMZl98Wfz2XMTy9Ouu24 3lKOB7lAyk0E++8UgkGXoGhPPOx X-Gm-Gg: ASbGncuXMvK12r7b4mXi6O5chDvPyjSJ5O9sJHHJLIWzdP+VkcOt4KThy7NqFjW4Ezd 5zq+vrbIuDiaxmXuth2LIOqQ6Z9isgUa6wsEJNy9bCBYMOZhD/739MqE/sPpo5waGsDVQdgJhZN NZ5NH1tW5DwV7JUyPfXHFUqURPQbZZXZyfqXkEz4/s9+shWh8104MgcFUzIhnL+64B3Yl1i7tzM 0m97wrN7p7vIPc77iYqtmlI8zgYJGnJSsEBawy78BvOiVn7eGbUemU+mPabQtb5oCZ+4pXXkxhY l/6CyajB8fivsbcOpcXoww/FVeTzs8sb4n2XL8hoqtin9ExBnQWIeKIQqjl5rKUq7Oo4SldtLyl 1NY4IzYGAT44THGHKgehIm90CND4cxp8boCxWNM85XTc+TH0gM1iR2GkuYbxSicRB1J5oU4gsEi YzjC69YmAc X-Google-Smtp-Source: AGHT+IEv2AVqFugzppDx9Bun72F6G0d+YI6+wws07KE/W8hn/tyPKdH0ydrL0PXO2SAy+QU7K/jSAd0X39Mg X-Received: by 2002:a05:6870:353:b0:315:3103:6e7a with SMTP id 586e51a60fabf-33bb67fa8dfmr2136515fac.43.1758304119408; Fri, 19 Sep 2025 10:48:39 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-121.dlp.protect.broadcom.com. [144.49.247.121]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-336e6eb0a53sm559009fac.26.2025.09.19.10.48.39 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:39 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pj1-f69.google.com with SMTP id 98e67ed59e1d1-32eb18b5529so2088084a91.2 for ; Fri, 19 Sep 2025 10:48:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304118; x=1758908918; 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=XW0/1Cei49q5/klZoX7Q0m/rGvA4O6wvwJ9Vo850vrE=; b=OMftSBq1rmahEpL9HIvGbxgQpawizmsB+82tjsdl2okYNrCVnX1fS6NymWLMyTCvGB Sp+Vj+Z/l98RDSRMOrSBIMBTZiRbS1MyyWdZH33JD/ft3LaZGw5KABlIJlbEVQrWqnEw rYWAgkZkTFY2DKxzIyksOliED29fgTsHBIJ60= X-Forwarded-Encrypted: i=1; AJvYcCVTO35h/2mqnBt7FVVgPDV1iceZh2nnjmc2vrawlr9F8reouliEMl4Oiw+IL7c97e9jAwwWHMeJ+LY+CvE=@vger.kernel.org X-Received: by 2002:a17:90b:562f:b0:330:bca5:13d9 with SMTP id 98e67ed59e1d1-330bca51b24mr1722749a91.32.1758304117764; Fri, 19 Sep 2025 10:48:37 -0700 (PDT) X-Received: by 2002:a17:90b:562f:b0:330:bca5:13d9 with SMTP id 98e67ed59e1d1-330bca51b24mr1722727a91.32.1758304117235; Fri, 19 Sep 2025 10:48:37 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:36 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 06/10] bng_en: Allocate packet buffers Date: Fri, 19 Sep 2025 23:17:37 +0530 Message-ID: <20250919174742.24969-7-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Populate packet buffers into the RX and AGG rings while these rings are being initialized. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- .../net/ethernet/broadcom/bnge/bnge_netdev.c | 288 +++++++++++++++++- 1 file changed, 287 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index c3418b3fe05..1ccc027c021 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -259,6 +259,76 @@ static bool bnge_separate_head_pool(struct bnge_rx_rin= g_info *rxr) return rxr->need_head_pool || PAGE_SIZE > BNGE_RX_PAGE_SIZE; } =20 +static void bnge_free_one_rx_ring_bufs(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr) +{ + int i, max_idx; + + if (!rxr->rx_buf_ring) + return; + + max_idx =3D bn->rx_nr_pages * RX_DESC_CNT; + + for (i =3D 0; i < max_idx; i++) { + struct bnge_sw_rx_bd *rx_buf =3D &rxr->rx_buf_ring[i]; + void *data =3D rx_buf->data; + + if (!data) + continue; + + rx_buf->data =3D NULL; + page_pool_free_va(rxr->head_pool, data, true); + } +} + +static void bnge_free_one_agg_ring_bufs(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr) +{ + int i, max_idx; + + if (!rxr->rx_agg_buf_ring) + return; + + max_idx =3D bn->rx_agg_nr_pages * RX_DESC_CNT; + + for (i =3D 0; i < max_idx; i++) { + struct bnge_sw_rx_agg_bd *rx_agg_buf =3D &rxr->rx_agg_buf_ring[i]; + netmem_ref netmem =3D rx_agg_buf->netmem; + + if (!netmem) + continue; + + rx_agg_buf->netmem =3D 0; + __clear_bit(i, rxr->rx_agg_bmap); + + page_pool_recycle_direct_netmem(rxr->page_pool, netmem); + } +} + +static void bnge_free_one_rx_ring_pair_bufs(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr) +{ + bnge_free_one_rx_ring_bufs(bn, rxr); + bnge_free_one_agg_ring_bufs(bn, rxr); +} + +static void bnge_free_rx_ring_pair_bufs(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + if (!bn->rx_ring) + return; + + for (i =3D 0; i < bd->rx_nr_rings; i++) + bnge_free_one_rx_ring_pair_bufs(bn, &bn->rx_ring[i]); +} + +static void bnge_free_all_rings_bufs(struct bnge_net *bn) +{ + bnge_free_rx_ring_pair_bufs(bn); +} + static void bnge_free_rx_rings(struct bnge_net *bn) { struct bnge_dev *bd =3D bn->bd; @@ -739,6 +809,194 @@ static void bnge_init_nq_tree(struct bnge_net *bn) } } =20 +static netmem_ref __bnge_alloc_rx_netmem(struct bnge_net *bn, + dma_addr_t *mapping, + struct bnge_rx_ring_info *rxr, + unsigned int *offset, + gfp_t gfp) +{ + netmem_ref netmem; + + if (PAGE_SIZE > BNGE_RX_PAGE_SIZE) { + netmem =3D page_pool_alloc_frag_netmem(rxr->page_pool, offset, + BNGE_RX_PAGE_SIZE, gfp); + } else { + netmem =3D page_pool_alloc_netmems(rxr->page_pool, gfp); + *offset =3D 0; + } + if (!netmem) + return 0; + + *mapping =3D page_pool_get_dma_addr_netmem(netmem) + *offset; + return netmem; +} + +static u8 *__bnge_alloc_rx_frag(struct bnge_net *bn, dma_addr_t *mapping, + struct bnge_rx_ring_info *rxr, + gfp_t gfp) +{ + unsigned int offset; + struct page *page; + + page =3D page_pool_alloc_frag(rxr->head_pool, &offset, + bn->rx_buf_size, gfp); + if (!page) + return NULL; + + *mapping =3D page_pool_get_dma_addr(page) + bn->rx_dma_offset + offset; + return page_address(page) + offset; +} + +static int bnge_alloc_rx_data(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr, + u16 prod, gfp_t gfp) +{ + struct bnge_sw_rx_bd *rx_buf =3D &rxr->rx_buf_ring[RING_RX(bn, prod)]; + struct rx_bd *rxbd; + dma_addr_t mapping; + u8 *data; + + rxbd =3D &rxr->rx_desc_ring[RX_RING(bn, prod)][RX_IDX(prod)]; + data =3D __bnge_alloc_rx_frag(bn, &mapping, rxr, gfp); + if (!data) + return -ENOMEM; + + rx_buf->data =3D data; + rx_buf->data_ptr =3D data + bn->rx_offset; + rx_buf->mapping =3D mapping; + + rxbd->rx_bd_haddr =3D cpu_to_le64(mapping); + + return 0; +} + +static int bnge_alloc_one_rx_ring_bufs(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr, + int ring_nr) +{ + u32 prod =3D rxr->rx_prod; + int i, rc =3D 0; + + for (i =3D 0; i < bn->rx_ring_size; i++) { + rc =3D bnge_alloc_rx_data(bn, rxr, prod, GFP_KERNEL); + if (rc) + break; + prod =3D NEXT_RX(prod); + } + + /* Abort if not a single buffer can be allocated */ + if (rc && !i) { + netdev_err(bn->netdev, + "RX ring %d: allocated %d/%d buffers, abort\n", + ring_nr, i, bn->rx_ring_size); + return rc; + } + + rxr->rx_prod =3D prod; + + if (i < bn->rx_ring_size) + netdev_warn(bn->netdev, + "RX ring %d: allocated %d/%d buffers, continuing\n", + ring_nr, i, bn->rx_ring_size); + return 0; +} + +static u16 bnge_find_next_agg_idx(struct bnge_rx_ring_info *rxr, u16 idx) +{ + u16 next, max =3D rxr->rx_agg_bmap_size; + + next =3D find_next_zero_bit(rxr->rx_agg_bmap, max, idx); + if (next >=3D max) + next =3D find_first_zero_bit(rxr->rx_agg_bmap, max); + return next; +} + +static int bnge_alloc_rx_netmem(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr, + u16 prod, gfp_t gfp) +{ + struct bnge_sw_rx_agg_bd *rx_agg_buf; + u16 sw_prod =3D rxr->rx_sw_agg_prod; + unsigned int offset =3D 0; + struct rx_bd *rxbd; + dma_addr_t mapping; + netmem_ref netmem; + + rxbd =3D &rxr->rx_agg_desc_ring[RX_AGG_RING(bn, prod)][RX_IDX(prod)]; + netmem =3D __bnge_alloc_rx_netmem(bn, &mapping, rxr, &offset, gfp); + if (!netmem) + return -ENOMEM; + + if (unlikely(test_bit(sw_prod, rxr->rx_agg_bmap))) + sw_prod =3D bnge_find_next_agg_idx(rxr, sw_prod); + + __set_bit(sw_prod, rxr->rx_agg_bmap); + rx_agg_buf =3D &rxr->rx_agg_buf_ring[sw_prod]; + rxr->rx_sw_agg_prod =3D RING_RX_AGG(bn, NEXT_RX_AGG(sw_prod)); + + rx_agg_buf->netmem =3D netmem; + rx_agg_buf->offset =3D offset; + rx_agg_buf->mapping =3D mapping; + rxbd->rx_bd_haddr =3D cpu_to_le64(mapping); + rxbd->rx_bd_opaque =3D sw_prod; + return 0; +} + +static int bnge_alloc_one_agg_ring_bufs(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr, + int ring_nr) +{ + u32 prod =3D rxr->rx_agg_prod; + int i, rc =3D 0; + + for (i =3D 0; i < bn->rx_agg_ring_size; i++) { + rc =3D bnge_alloc_rx_netmem(bn, rxr, prod, GFP_KERNEL); + if (rc) + break; + prod =3D NEXT_RX_AGG(prod); + } + + if (rc && i < MAX_SKB_FRAGS) { + netdev_err(bn->netdev, + "Agg ring %d: allocated %d/%d buffers (min %d), abort\n", + ring_nr, i, bn->rx_agg_ring_size, MAX_SKB_FRAGS); + goto err_free_one_agg_ring_bufs; + } + + rxr->rx_agg_prod =3D prod; + + if (i < bn->rx_agg_ring_size) + netdev_warn(bn->netdev, + "Agg ring %d: allocated %d/%d buffers, continuing\n", + ring_nr, i, bn->rx_agg_ring_size); + return 0; + +err_free_one_agg_ring_bufs: + bnge_free_one_agg_ring_bufs(bn, rxr); + return -ENOMEM; +} + +static int bnge_alloc_one_rx_ring_pair_bufs(struct bnge_net *bn, int ring_= nr) +{ + struct bnge_rx_ring_info *rxr =3D &bn->rx_ring[ring_nr]; + int rc; + + rc =3D bnge_alloc_one_rx_ring_bufs(bn, rxr, ring_nr); + if (rc) + return rc; + + if (bnge_is_agg_reqd(bn->bd)) { + rc =3D bnge_alloc_one_agg_ring_bufs(bn, rxr, ring_nr); + if (rc) + goto err_free_one_rx_ring_bufs; + } + return 0; + +err_free_one_rx_ring_bufs: + bnge_free_one_rx_ring_bufs(bn, rxr); + return rc; +} + static void bnge_init_rxbd_pages(struct bnge_ring_struct *ring, u32 type) { struct rx_bd **rx_desc_ring; @@ -803,6 +1061,22 @@ static void bnge_init_one_rx_ring_pair(struct bnge_ne= t *bn, int ring_nr) bnge_init_one_agg_ring_rxbd(bn, rxr); } =20 +static int bnge_alloc_rx_ring_pair_bufs(struct bnge_net *bn) +{ + int i, rc; + + for (i =3D 0; i < bn->bd->rx_nr_rings; i++) { + rc =3D bnge_alloc_one_rx_ring_pair_bufs(bn, i); + if (rc) + goto err_free_rx_ring_pair_bufs; + } + return 0; + +err_free_rx_ring_pair_bufs: + bnge_free_rx_ring_pair_bufs(bn); + return rc; +} + static void bnge_init_rx_rings(struct bnge_net *bn) { int i; @@ -1030,13 +1304,24 @@ static int bnge_init_nic(struct bnge_net *bn) int rc; =20 bnge_init_nq_tree(bn); + bnge_init_rx_rings(bn); + rc =3D bnge_alloc_rx_ring_pair_bufs(bn); + if (rc) + return rc; + bnge_init_tx_rings(bn); + rc =3D bnge_init_ring_grps(bn); if (rc) - return rc; + goto err_free_rx_ring_pair_bufs; + bnge_init_vnics(bn); return rc; + +err_free_rx_ring_pair_bufs: + bnge_free_rx_ring_pair_bufs(bn); + return rc; } =20 static int bnge_open_core(struct bnge_net *bn) @@ -1105,6 +1390,7 @@ static void bnge_close_core(struct bnge_net *bn) struct bnge_dev *bd =3D bn->bd; =20 clear_bit(BNGE_STATE_OPEN, &bd->state); + bnge_free_all_rings_bufs(bn); bnge_free_irq(bn); bnge_del_napi(bn); =20 --=20 2.47.3 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-il1-f225.google.com (mail-il1-f225.google.com [209.85.166.225]) (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 3E235326D76 for ; Fri, 19 Sep 2025 17:48:44 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.166.225 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304127; cv=none; b=EaCBekVZdfjJkvQw+r3IEZoxuKba/GSlqyIp1HmVqVVrUhs5nD7c1Vwr/TchwEy0ViWHFrVWUMXTZ3dkX1V27Qm8VbrTn40uxdjIXy24tl+Vk3jS+zkNXfMLIiwJITfCn/4TEutPmBqlUBPVq99yHM5zFUl+Ua6pWKiOY8Q9/iw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304127; c=relaxed/simple; bh=4ySHLREyUAtWjLh82gQtAIXKkbuM/Pq0RWplAHVjlNI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=IMVkzQL2nFoZGWoFfs8weauNTnAfeqOLwEiG+EMR0j3uMvtIOGHzQmvun2mJikDusgNpmqxa2C9H1NcixKus4HoVTnQOfzJtUFyesaSkZ/p8wBec7YPyaa09JOSBxCZ7GYt7ZqefRXtNJctlJGyxT0bTpjo+BHZycQWHQ33xG38= 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=gM1fSlBS; arc=none smtp.client-ip=209.85.166.225 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="gM1fSlBS" Received: by mail-il1-f225.google.com with SMTP id e9e14a558f8ab-42403719c73so23577015ab.0 for ; Fri, 19 Sep 2025 10:48:44 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304124; x=1758908924; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=9iQIDq5dTw5x1Y6mcj+DSZeu2XXA5UkkoVmQGpR+sJs=; b=lC0Oe/u/GlJ1tt+PWWJIUxgJuBWc/2xmObI0BdGccYhrxmrGs37uz6IjVgEwXSRToy 9lRKLtQWFK0JdWuYhTcwYKiKf61nYlOUaosbGI4eHzP9kWXMTQuM+NDBJX2jiCqYnMmU W9pOJ2o6j2ZU7L58SR05jC0ymFXouk/96UvGcFSImDg1x8z6OPnT73IfBuI0wWQAMcvi 08uJ55zs/hoD48Mz4ERH5Y6zBZTKobsTL6tOi1wELFedbZozV0rUuYeiYh2nQLwHixU+ /hiH4RWereDYPhB41YXBM2HGKz6pdEojvmZTy88tkshd+/NfnFQBQMK7g1oSjmc4DGRU d4WA== X-Forwarded-Encrypted: i=1; AJvYcCWshO1CjolNqDBQ6Lq3p9ygqkIw5isJ/NNVWh5ocxUaRJY+d2YrcKGMDfZMKgasy4CoQ1mMe/MJp0yjc9E=@vger.kernel.org X-Gm-Message-State: AOJu0YzxQjWUHcY/cp5rFl3x6J55ImBSanaWbVuwTZH1P5RgRtfCRYLk AS7oRfVTeDv5fYby5vmhT5qJaTqwXswvCnAFc+Rtp7HjyR72XdayHDqgcvTz6WcQR1uc8wNYOfd QHAfyDPyEc6eLN2ULxkTUf05vhE2FfcxmWSAEu3Qm1gfMN/bhQyKWbXbgdekJ36wNKagwfoDpCp z4dxCOJVNXPhfB5PBhtdDcnohkFN4nB7I9FOOfFKdxCiKo0UlH7tnkR/c/D8apSwSX5HqKHIVoO nLmcGU+J9WGq3kl69rJ8nB34pJP X-Gm-Gg: ASbGnctYZAxxqSWp6jRWSdiEWxrZmVq08sASLkDXqv8Cngi/a3uRAxCdRQ7TPDjjBaz j/JB/b0x7kri9cAaiUR67vk0xh68dsCZ0NOdcGg6D+t+zm0gd6V+v4fqYDI8NUZOzhJDqm5g2rk hqcm3BvLwyOiWV5pbIH4tg2f4L8Cmb94unx8O+ELrpLtlJ6wEXVZ/tgQzvxxOx3nCBlO2fALPEo xKlpKewNju8vlkzx54Jiz+DUqYZg6NH+9lzrzJ47HcNg2gFDTxeDhoOpMbEQr+G8cfGCdgIYRcb uu5hh23+DBL6UiTSSb8j9GQ+MQIF5xg2BE6YQ2K19YkxxCG8uop/psFsanoUrB5DDrzQ4lOPVFk qNJF2HzOW0Hk12EyNy7jjEYEJ/W7gcPGmWwpqyf9R97kTE/IJEwLC3n+I0kGtH4VJ4ujPWErgn9 +bAsQ8fbWS X-Google-Smtp-Source: AGHT+IFYqlPkwPz5DOUO7GCVqibVex6pKBsEKuKKU9G/BAIwPxeh1de/KRSHAVeFwH46YMqPAPEtmQWr6ymQ X-Received: by 2002:a05:6e02:2192:b0:423:fb44:e8c9 with SMTP id e9e14a558f8ab-42481911752mr60423425ab.11.1758304123972; Fri, 19 Sep 2025 10:48:43 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-118.dlp.protect.broadcom.com. [144.49.247.118]) by smtp-relay.gmail.com with ESMTPS id 8926c6da1cb9f-53d535be444sm347909173.33.2025.09.19.10.48.43 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:43 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pg1-f197.google.com with SMTP id 41be03b00d2f7-b5527f0d39bso623858a12.2 for ; Fri, 19 Sep 2025 10:48:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304122; x=1758908922; 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=9iQIDq5dTw5x1Y6mcj+DSZeu2XXA5UkkoVmQGpR+sJs=; b=gM1fSlBSWRw9g1bmkALPC5Qd+VzRzY2hpUkQrKC6JRrdtPcreRjAB6kKl+DKwZocUF jtQLg5Sn/p7NpFiMR5CsOYdks2bcLxYnsDdp1TIgN86l45uPHqnhFeNuQZsZG5r40smU MkKM9I8m+nsgPPL7BC+FHGn8tGA0w/sKX/9es= X-Forwarded-Encrypted: i=1; AJvYcCU8oPx+il/KrltmIivqQC/RD7ZYyiMjHJ+GMknf37GUoxTHigC1ml/5LbgR0dOVvIkMyR0xPaOzUZVXDPk=@vger.kernel.org X-Received: by 2002:a05:6a20:7483:b0:262:c083:bb2e with SMTP id adf61e73a8af0-2925991ad89mr6111965637.8.1758304122186; Fri, 19 Sep 2025 10:48:42 -0700 (PDT) X-Received: by 2002:a05:6a20:7483:b0:262:c083:bb2e with SMTP id adf61e73a8af0-2925991ad89mr6111935637.8.1758304121763; Fri, 19 Sep 2025 10:48:41 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.37 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:41 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 07/10] bng_en: Allocate stat contexts Date: Fri, 19 Sep 2025 23:17:38 +0530 Message-ID: <20250919174742.24969-8-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Allocate the hardware statistics context with the firmware and register DMA memory required for ring statistics. This helps the driver to collect ring statistics provided by the firmware. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- .../ethernet/broadcom/bnge/bnge_hwrm_lib.c | 56 ++++++++++ .../ethernet/broadcom/bnge/bnge_hwrm_lib.h | 2 + .../net/ethernet/broadcom/bnge/bnge_netdev.c | 104 ++++++++++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 12 ++ 4 files changed, 174 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.c index 5c178fade06..8f20b880c11 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c @@ -701,3 +701,59 @@ int bnge_hwrm_queue_qportcfg(struct bnge_dev *bd) bnge_hwrm_req_drop(bd, req); return rc; } + +void bnge_hwrm_stat_ctx_free(struct bnge_net *bn) +{ + struct hwrm_stat_ctx_free_input *req; + struct bnge_dev *bd =3D bn->bd; + int i; + + if (bnge_hwrm_req_init(bd, req, HWRM_STAT_CTX_FREE)) + return; + + bnge_hwrm_req_hold(bd, req); + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_nq_ring_info *nqr =3D &bnapi->nq_ring; + + if (nqr->hw_stats_ctx_id !=3D INVALID_STATS_CTX_ID) { + req->stat_ctx_id =3D cpu_to_le32(nqr->hw_stats_ctx_id); + bnge_hwrm_req_send(bd, req); + + nqr->hw_stats_ctx_id =3D INVALID_STATS_CTX_ID; + } + } + bnge_hwrm_req_drop(bd, req); +} + +int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn) +{ + struct hwrm_stat_ctx_alloc_output *resp; + struct hwrm_stat_ctx_alloc_input *req; + struct bnge_dev *bd =3D bn->bd; + int rc, i; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_STAT_CTX_ALLOC); + if (rc) + return rc; + + req->stats_dma_length =3D cpu_to_le16(bd->hw_ring_stats_size); + req->update_period_ms =3D cpu_to_le32(bn->stats_coal_ticks / 1000); + + resp =3D bnge_hwrm_req_hold(bd, req); + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_nq_ring_info *nqr =3D &bnapi->nq_ring; + + req->stats_dma_addr =3D cpu_to_le64(nqr->stats.hw_stats_map); + + rc =3D bnge_hwrm_req_send(bd, req); + if (rc) + break; + + nqr->hw_stats_ctx_id =3D le32_to_cpu(resp->stat_ctx_id); + bn->grp_info[i].fw_stats_ctx =3D nqr->hw_stats_ctx_id; + } + bnge_hwrm_req_drop(bd, req); + return rc; +} diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.h index 6c03923eb55..1c3fd02d7e0 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h @@ -24,4 +24,6 @@ int bnge_hwrm_func_qcfg(struct bnge_dev *bd); int bnge_hwrm_func_resc_qcaps(struct bnge_dev *bd); int bnge_hwrm_queue_qportcfg(struct bnge_dev *bd); =20 +void bnge_hwrm_stat_ctx_free(struct bnge_net *bn); +int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn); #endif /* _BNGE_HWRM_LIB_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index 1ccc027c021..9f1deb60dd2 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -30,6 +30,73 @@ #define BNGE_TC_TO_RING_BASE(bd, tc) \ ((tc) * (bd)->tx_nr_rings_per_tc) =20 +static void bnge_free_stats_mem(struct bnge_net *bn, + struct bnge_stats_mem *stats) +{ + struct bnge_dev *bd =3D bn->bd; + + if (stats->hw_stats) { + dma_free_coherent(bd->dev, stats->len, stats->hw_stats, + stats->hw_stats_map); + stats->hw_stats =3D NULL; + } +} + +static int bnge_alloc_stats_mem(struct bnge_net *bn, + struct bnge_stats_mem *stats) +{ + struct bnge_dev *bd =3D bn->bd; + + stats->hw_stats =3D dma_alloc_coherent(bd->dev, stats->len, + &stats->hw_stats_map, GFP_KERNEL); + if (!stats->hw_stats) + return -ENOMEM; + + return 0; +} + +static void bnge_free_ring_stats(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + if (!bn->bnapi) + return; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_nq_ring_info *nqr =3D &bnapi->nq_ring; + + bnge_free_stats_mem(bn, &nqr->stats); + } +} + +static int bnge_alloc_ring_stats(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + u32 size, i; + int rc; + + size =3D bd->hw_ring_stats_size; + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_nq_ring_info *nqr =3D &bnapi->nq_ring; + + nqr->stats.len =3D size; + rc =3D bnge_alloc_stats_mem(bn, &nqr->stats); + if (rc) + goto err_free_ring_stats; + + nqr->hw_stats_ctx_id =3D INVALID_STATS_CTX_ID; + } + return 0; + +err_free_ring_stats: + bnge_free_ring_stats(bn); + return rc; +} + static void bnge_free_nq_desc_arr(struct bnge_nq_ring_info *nqr) { struct bnge_ring_struct *ring =3D &nqr->ring_struct; @@ -651,6 +718,7 @@ static void bnge_free_core(struct bnge_net *bn) bnge_free_rx_rings(bn); bnge_free_nq_tree(bn); bnge_free_nq_arrays(bn); + bnge_free_ring_stats(bn); bnge_free_ring_grps(bn); bnge_free_vnics(bn); kfree(bn->tx_ring_map); @@ -739,6 +807,10 @@ static int bnge_alloc_core(struct bnge_net *bn) txr->bnapi =3D bnapi2; } =20 + rc =3D bnge_alloc_ring_stats(bn); + if (rc) + goto err_free_core; + rc =3D bnge_alloc_vnics(bn); if (rc) goto err_free_core; @@ -1189,6 +1261,11 @@ static int bnge_setup_interrupts(struct bnge_net *bn) return netif_set_real_num_queues(dev, bd->tx_nr_rings, bd->rx_nr_rings); } =20 +static void bnge_hwrm_resource_free(struct bnge_net *bn, bool close_path) +{ + bnge_hwrm_stat_ctx_free(bn); +} + static void bnge_free_irq(struct bnge_net *bn) { struct bnge_dev *bd =3D bn->bd; @@ -1256,6 +1333,25 @@ static int bnge_request_irq(struct bnge_net *bn) return rc; } =20 +static int bnge_init_chip(struct bnge_net *bn) +{ + int rc; + +#define BNGE_DEF_STATS_COAL_TICKS 1000000 + bn->stats_coal_ticks =3D BNGE_DEF_STATS_COAL_TICKS; + + rc =3D bnge_hwrm_stat_ctx_alloc(bn); + if (rc) { + netdev_err(bn->netdev, "hwrm stat ctx alloc failure rc: %d\n", rc); + goto err_out; + } + return 0; + +err_out: + bnge_hwrm_resource_free(bn, 0); + return rc; +} + static int bnge_napi_poll(struct napi_struct *napi, int budget) { int work_done =3D 0; @@ -1317,6 +1413,14 @@ static int bnge_init_nic(struct bnge_net *bn) goto err_free_rx_ring_pair_bufs; =20 bnge_init_vnics(bn); + + rc =3D bnge_init_chip(bn); + if (rc) + goto err_free_ring_grps; + return rc; + +err_free_ring_grps: + bnge_free_ring_grps(bn); return rc; =20 err_free_rx_ring_pair_bufs: diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index 10bd29a833e..55497c4e7fb 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -225,6 +225,7 @@ struct bnge_net { u8 rss_hash_key[HW_HASH_KEY_SIZE]; u8 rss_hash_key_valid:1; u8 rss_hash_key_updated:1; + u32 stats_coal_ticks; }; =20 #define BNGE_DEFAULT_RX_RING_SIZE 511 @@ -271,6 +272,14 @@ void bnge_set_ring_params(struct bnge_dev *bd); txr =3D (iter < BNGE_MAX_TXR_PER_NAPI - 1) ? \ (bnapi)->tx_ring[++iter] : NULL) =20 +struct bnge_stats_mem { + u64 *sw_stats; + u64 *hw_masks; + void *hw_stats; + dma_addr_t hw_stats_map; + int len; +}; + struct bnge_cp_ring_info { struct bnge_napi *bnapi; dma_addr_t *desc_mapping; @@ -286,6 +295,9 @@ struct bnge_nq_ring_info { struct nqe_cn **desc_ring; struct bnge_ring_struct ring_struct; =20 + struct bnge_stats_mem stats; + u32 hw_stats_ctx_id; + int cp_ring_count; struct bnge_cp_ring_info *cp_ring_arr; }; --=20 2.47.3 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-oa1-f99.google.com (mail-oa1-f99.google.com [209.85.160.99]) (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 C8CCE327A0F for ; Fri, 19 Sep 2025 17:48:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.99 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304132; cv=none; b=mVFoZ3wEz95vUvJIlnuf2Meg8Li4xK/YZImdGPup++EMiYV4tbPg9R1LLOn84DTzuO0UzSAZw4gbatSSzda6o2lznBCKtrwFpXPKFQf1Ug6R57J4mPC4lwf4aRD8yu687TGmDNy6qSSTEc4CNnUpobnrydMmnv6QryUCHfs8apk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304132; c=relaxed/simple; bh=Bvsa44P5TyVrfE0QtAPtXnbUfjcSuyB8KosdicgP5F0=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=hn2at2C4TQ0E0JFFTQrrGAeH1KjxVVKwH6hCpJ+HObMYzIfgxieduyPAmmNse0fFEgyWT90S27KyHFky+K6R8gh8M2FrhuFM6M8NWRUU7UY3TNR+Alg+wM3wi7WRii9r9E+f76OoGnhDZTVAe5qXKY20shZhAbV0Hfs0Bko0ryM= 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=acLClCK6; arc=none smtp.client-ip=209.85.160.99 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="acLClCK6" Received: by mail-oa1-f99.google.com with SMTP id 586e51a60fabf-30ccec59b4bso1723439fac.3 for ; Fri, 19 Sep 2025 10:48:49 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304129; x=1758908929; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bn7TJKsAJbyeAqEEgCqe6vra+522uaYdimbrjAXEOfc=; b=kWzq9TsnBhkKZyaAN0cfYGQb8hgOOQcNiXx9IIQCjMGUkAvfR1w7iKDcDVDnYHLIJA h2EfoCjOBbmDRKG75/NmLV8jlIagPWEmuGFzq4EB2icVde5S6D9XaCVWxVuUwVjqfvVE 2Pj+F3i2xVcCRPUvgvX0rOeDBmV+rTOvyYYmjxQf34/hDhc1kguJzG7ccfltNHmWVtSb G0dxbMR/ZDsYF6IodjlCGjFDm0g7FWRmivi6OCm6PpeM/LWtDBXGdkmZhh2ze2p+0oF5 iO/dRQoF8/EAwLT0kSjvxn6B4Jp5xc6xgTOQrC+IWTqj6ViEktHOAPerFU5Y/ALEAGo8 aMng== X-Forwarded-Encrypted: i=1; AJvYcCXIhM+kfQepDbF73BzVCaCyLCtfdooSftyZPZXGUs9eRBJwSNVBBpAAHTZfeDtb5uqmHHRL7Wr/j4/vKJY=@vger.kernel.org X-Gm-Message-State: AOJu0YwaQ75U5l+gnNhppdfS2h7AMGK9xJPzijMnTGUdPO1wwvewRsM5 VV+zB4JDSCG+ddOeC39TAEmyX3KLc3G6N88qetwQzs4QRTSGS4AjVJsKviM3Trv7D3GBD3gubkt iyh1oS1UiZqk0rtMB3fjz7Hj/it5X31h74lfokwoKuWWni3ugg67ZvItB97LlpI14vuclMCyUq0 dbelj0UfTAs7xJSkyk3LJATOVCcSQmgHuacF4XEG63G1wNaKVUqa46CExVVKlcLePPGGCR38cQQ TPlqXb9fJUp4iGEXQplyh3gSP26 X-Gm-Gg: ASbGncv+PBm9CC4Mlwu1HYdDFtout3N6Zh/r03Jm4fsV4dYprq0ETEyv+1W8JKWNWGh BCD+cR7qRaf3wJFHye4WDP03qi6bQDmyr4HZURecLfSw+N79Gl+Z3Pkl6SZVZOutBsjNsvGnODa r5nvD9pIG9X3GGRbvu/RuMYQgBgWxZ2xG3TO9g96u/E/jkijUi4nnUAws6GRzzwKGHJRaylAOYF wRC7QkSQ6B+CLcreo4pWhBP9FPVkERGghxfemVmVRzz6PjWcusAHyebq4t8ZkAzMYw9iJXMWfvl 4BJmA60CkzxRBveudaEGNKJKOJTt4IqGtmReoQHzQXlBmggx6hOCPOoWMXoXdMOBHQmrQGzxGOy 9JYsJ6Y/yiljY0JmWTbPaVJ/FwjSEAl9+UaSdqlF8kow8SB0fymiLgyQPhzOdNN0Pls5hZ0a+nf hhzMBdEVeH X-Google-Smtp-Source: AGHT+IF9lC2R27L/xU/1hOiD3/ZVZllBcssUNn9YAXdXc1mZjQoslmEOBk2I+bEUhrMONejNc5dYpIsLcq/F X-Received: by 2002:a05:6870:9a22:b0:316:8c45:3959 with SMTP id 586e51a60fabf-33bb3aa4f75mr1992919fac.7.1758304128680; Fri, 19 Sep 2025 10:48:48 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-100.dlp.protect.broadcom.com. [144.49.247.100]) by smtp-relay.gmail.com with ESMTPS id 586e51a60fabf-336e6eb0af3sm549231fac.25.2025.09.19.10.48.48 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:48 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pf1-f199.google.com with SMTP id d2e1a72fcca58-77e5a77a25aso1586370b3a.3 for ; Fri, 19 Sep 2025 10:48:47 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304127; x=1758908927; 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=bn7TJKsAJbyeAqEEgCqe6vra+522uaYdimbrjAXEOfc=; b=acLClCK640ekBgJd1Ceb4r+BFdMIQSqABIGRKwurkqjR+xEPrYvUouQVOezPv5R2ea bJWJEfU4prE7cx7+YDkND3+KtlIPS8cTtHiGi3cg9cbDLvrD6a9zS05v7GNyrhJmh/gU jwGoB2/BuRiDMug1uMImaxapZ4EVVAV1ccsTc= X-Forwarded-Encrypted: i=1; AJvYcCX+XfovwPfkkSFvx80vaOqMCzj2bsSH/1pQF3UPlfp+25H35DeuAUuIK5W5wkXS9zmCdERLn+H0G41bGEk=@vger.kernel.org X-Received: by 2002:a05:6a21:999a:b0:245:ff00:5332 with SMTP id adf61e73a8af0-2925991ad72mr6183449637.7.1758304126813; Fri, 19 Sep 2025 10:48:46 -0700 (PDT) X-Received: by 2002:a05:6a21:999a:b0:245:ff00:5332 with SMTP id adf61e73a8af0-2925991ad72mr6183422637.7.1758304126348; Fri, 19 Sep 2025 10:48:46 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.42 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:45 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 08/10] bng_en: Register rings with the firmware Date: Fri, 19 Sep 2025 23:17:39 +0530 Message-ID: <20250919174742.24969-9-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Enable ring functionality by registering RX, AGG, TX, CMPL, and NQ rings with the firmware. Initialise the doorbells associated with the rings. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- drivers/net/ethernet/broadcom/bnge/bnge.h | 24 ++ .../net/ethernet/broadcom/bnge/bnge_core.c | 4 + drivers/net/ethernet/broadcom/bnge/bnge_db.h | 34 ++ .../ethernet/broadcom/bnge/bnge_hwrm_lib.c | 147 ++++++++ .../ethernet/broadcom/bnge/bnge_hwrm_lib.h | 6 + .../net/ethernet/broadcom/bnge/bnge_netdev.c | 349 ++++++++++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 16 + .../net/ethernet/broadcom/bnge/bnge_rmem.h | 1 + 8 files changed, 581 insertions(+) create mode 100644 drivers/net/ethernet/broadcom/bnge/bnge_db.h diff --git a/drivers/net/ethernet/broadcom/bnge/bnge.h b/drivers/net/ethern= et/broadcom/bnge/bnge.h index c536c0cc66e..aee65a6c980 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge.h @@ -102,6 +102,10 @@ struct bnge_dev { u16 chip_num; u8 chip_rev; =20 +#if BITS_PER_LONG =3D=3D 32 + /* ensure atomic 64-bit doorbell writes on 32-bit systems. */ + spinlock_t db_lock; +#endif int db_offset; /* db_offset within db_size */ int db_size; =20 @@ -214,6 +218,26 @@ static inline bool bnge_is_agg_reqd(struct bnge_dev *b= d) return true; } =20 +static inline void bnge_writeq(struct bnge_dev *bd, u64 val, + void __iomem *addr) +{ +#if BITS_PER_LONG =3D=3D 32 + spin_lock(&bd->db_lock); + lo_hi_writeq(val, addr); + spin_unlock(&bd->db_lock); +#else + writeq(val, addr); +#endif +} + +/* For TX and RX ring doorbells */ +static inline void bnge_db_write(struct bnge_dev *bd, struct bnge_db_info = *db, + u32 idx) +{ + bnge_writeq(bd, db->db_key64 | DB_RING_IDX(db, idx), + db->doorbell); +} + bool bnge_aux_registered(struct bnge_dev *bd); u16 bnge_aux_get_msix(struct bnge_dev *bd); =20 diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_core.c b/drivers/net/e= thernet/broadcom/bnge/bnge_core.c index 68da656f289..304b1e4d5a0 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_core.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_core.c @@ -296,6 +296,10 @@ static int bnge_probe_one(struct pci_dev *pdev, const = struct pci_device_id *ent) goto err_config_uninit; } =20 +#if BITS_PER_LONG =3D=3D 32 + spin_lock_init(&bd->db_lock); +#endif + rc =3D bnge_alloc_irqs(bd); if (rc) { dev_err(&pdev->dev, "Error IRQ allocation rc =3D %d\n", rc); diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_db.h b/drivers/net/eth= ernet/broadcom/bnge/bnge_db.h new file mode 100644 index 00000000000..950ed582f1d --- /dev/null +++ b/drivers/net/ethernet/broadcom/bnge/bnge_db.h @@ -0,0 +1,34 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (c) 2025 Broadcom */ + +#ifndef _BNGE_DB_H_ +#define _BNGE_DB_H_ + +/* 64-bit doorbell */ +#define DBR_EPOCH_SFT 24 +#define DBR_TOGGLE_SFT 25 +#define DBR_XID_SFT 32 +#define DBR_PATH_L2 (0x1ULL << 56) +#define DBR_VALID (0x1ULL << 58) +#define DBR_TYPE_SQ (0x0ULL << 60) +#define DBR_TYPE_SRQ (0x2ULL << 60) +#define DBR_TYPE_CQ (0x4ULL << 60) +#define DBR_TYPE_CQ_ARMALL (0x6ULL << 60) +#define DBR_TYPE_NQ (0xaULL << 60) +#define DBR_TYPE_NQ_ARM (0xbULL << 60) +#define DBR_TYPE_NQ_MASK (0xeULL << 60) + +struct bnge_db_info { + void __iomem *doorbell; + u64 db_key64; + u32 db_ring_mask; + u32 db_epoch_mask; + u8 db_epoch_shift; +}; + +#define DB_EPOCH(db, idx) (((idx) & (db)->db_epoch_mask) << \ + ((db)->db_epoch_shift)) +#define DB_RING_IDX(db, idx) (((idx) & (db)->db_ring_mask) | \ + DB_EPOCH(db, idx)) + +#endif /* _BNGE_DB_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.c index 8f20b880c11..b44e0f4ed7c 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c @@ -757,3 +757,150 @@ int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn) bnge_hwrm_req_drop(bd, req); return rc; } + +int hwrm_ring_free_send_msg(struct bnge_net *bn, + struct bnge_ring_struct *ring, + u32 ring_type, int cmpl_ring_id) +{ + struct hwrm_ring_free_input *req; + struct bnge_dev *bd =3D bn->bd; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_RING_FREE); + if (rc) + goto exit; + + req->cmpl_ring =3D cpu_to_le16(cmpl_ring_id); + req->ring_type =3D ring_type; + req->ring_id =3D cpu_to_le16(ring->fw_ring_id); + + bnge_hwrm_req_hold(bd, req); + rc =3D bnge_hwrm_req_send(bd, req); + bnge_hwrm_req_drop(bd, req); +exit: + if (rc) { + netdev_err(bd->netdev, "hwrm_ring_free type %d failed. rc:%d\n", ring_ty= pe, rc); + return -EIO; + } + return 0; +} + +int hwrm_ring_alloc_send_msg(struct bnge_net *bn, + struct bnge_ring_struct *ring, + u32 ring_type, u32 map_index) +{ + struct bnge_ring_mem_info *rmem =3D &ring->ring_mem; + struct bnge_ring_grp_info *grp_info; + struct hwrm_ring_alloc_output *resp; + struct hwrm_ring_alloc_input *req; + struct bnge_dev *bd =3D bn->bd; + u16 ring_id, flags =3D 0; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_RING_ALLOC); + if (rc) + goto exit; + + req->enables =3D 0; + if (rmem->nr_pages > 1) { + req->page_tbl_addr =3D cpu_to_le64(rmem->dma_pg_tbl); + /* Page size is in log2 units */ + req->page_size =3D BNGE_PAGE_SHIFT; + req->page_tbl_depth =3D 1; + } else { + req->page_tbl_addr =3D cpu_to_le64(rmem->dma_arr[0]); + } + req->fbo =3D 0; + /* Association of ring index with doorbell index and MSIX number */ + req->logical_id =3D cpu_to_le16(map_index); + + switch (ring_type) { + case HWRM_RING_ALLOC_TX: { + struct bnge_tx_ring_info *txr; + + txr =3D container_of(ring, struct bnge_tx_ring_info, + tx_ring_struct); + req->ring_type =3D RING_ALLOC_REQ_RING_TYPE_TX; + /* Association of transmit ring with completion ring */ + grp_info =3D &bn->grp_info[ring->grp_idx]; + req->cmpl_ring_id =3D cpu_to_le16(bnge_cp_ring_for_tx(txr)); + req->length =3D cpu_to_le32(bn->tx_ring_mask + 1); + req->stat_ctx_id =3D cpu_to_le32(grp_info->fw_stats_ctx); + req->queue_id =3D cpu_to_le16(ring->queue_id); + req->flags =3D cpu_to_le16(flags); + break; + } + case HWRM_RING_ALLOC_RX: + req->ring_type =3D RING_ALLOC_REQ_RING_TYPE_RX; + req->length =3D cpu_to_le32(bn->rx_ring_mask + 1); + + /* Association of rx ring with stats context */ + grp_info =3D &bn->grp_info[ring->grp_idx]; + req->rx_buf_size =3D cpu_to_le16(bn->rx_buf_use_size); + req->stat_ctx_id =3D cpu_to_le32(grp_info->fw_stats_ctx); + req->enables |=3D + cpu_to_le32(RING_ALLOC_REQ_ENABLES_RX_BUF_SIZE_VALID); + if (NET_IP_ALIGN =3D=3D 2) + flags =3D RING_ALLOC_REQ_FLAGS_RX_SOP_PAD; + req->flags =3D cpu_to_le16(flags); + break; + case HWRM_RING_ALLOC_AGG: + req->ring_type =3D RING_ALLOC_REQ_RING_TYPE_RX_AGG; + /* Association of agg ring with rx ring */ + grp_info =3D &bn->grp_info[ring->grp_idx]; + req->rx_ring_id =3D cpu_to_le16(grp_info->rx_fw_ring_id); + req->rx_buf_size =3D cpu_to_le16(BNGE_RX_PAGE_SIZE); + req->stat_ctx_id =3D cpu_to_le32(grp_info->fw_stats_ctx); + req->enables |=3D + cpu_to_le32(RING_ALLOC_REQ_ENABLES_RX_RING_ID_VALID | + RING_ALLOC_REQ_ENABLES_RX_BUF_SIZE_VALID); + req->length =3D cpu_to_le32(bn->rx_agg_ring_mask + 1); + break; + case HWRM_RING_ALLOC_CMPL: + req->ring_type =3D RING_ALLOC_REQ_RING_TYPE_L2_CMPL; + req->length =3D cpu_to_le32(bn->cp_ring_mask + 1); + /* Association of cp ring with nq */ + grp_info =3D &bn->grp_info[map_index]; + req->nq_ring_id =3D cpu_to_le16(grp_info->nq_fw_ring_id); + req->cq_handle =3D cpu_to_le64(ring->handle); + req->enables |=3D + cpu_to_le32(RING_ALLOC_REQ_ENABLES_NQ_RING_ID_VALID); + break; + case HWRM_RING_ALLOC_NQ: + req->ring_type =3D RING_ALLOC_REQ_RING_TYPE_NQ; + req->length =3D cpu_to_le32(bn->cp_ring_mask + 1); + req->int_mode =3D RING_ALLOC_REQ_INT_MODE_MSIX; + break; + default: + netdev_err(bn->netdev, "hwrm alloc invalid ring type %d\n", ring_type); + return -EINVAL; + } + + resp =3D bnge_hwrm_req_hold(bd, req); + rc =3D bnge_hwrm_req_send(bd, req); + ring_id =3D le16_to_cpu(resp->ring_id); + bnge_hwrm_req_drop(bd, req); + +exit: + if (rc) { + netdev_err(bd->netdev, "hwrm_ring_alloc type %d failed. rc:%d\n", ring_t= ype, rc); + return -EIO; + } + ring->fw_ring_id =3D ring_id; + return rc; +} + +int bnge_hwrm_set_async_event_cr(struct bnge_dev *bd, int idx) +{ + struct hwrm_func_cfg_input *req; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_FUNC_CFG); + if (rc) + return rc; + + req->fid =3D cpu_to_le16(0xffff); + req->enables =3D cpu_to_le32(FUNC_CFG_REQ_ENABLES_ASYNC_EVENT_CR); + req->async_event_cr =3D cpu_to_le16(idx); + return bnge_hwrm_req_send(bd, req); +} diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.h index 1c3fd02d7e0..b2e2ec47be2 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h @@ -26,4 +26,10 @@ int bnge_hwrm_queue_qportcfg(struct bnge_dev *bd); =20 void bnge_hwrm_stat_ctx_free(struct bnge_net *bn); int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn); +int hwrm_ring_free_send_msg(struct bnge_net *bn, struct bnge_ring_struct *= ring, + u32 ring_type, int cmpl_ring_id); +int hwrm_ring_alloc_send_msg(struct bnge_net *bn, + struct bnge_ring_struct *ring, + u32 ring_type, u32 map_index); +int bnge_hwrm_set_async_event_cr(struct bnge_dev *bd, int idx); #endif /* _BNGE_HWRM_LIB_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index 9f1deb60dd2..af9e25f0384 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -846,6 +846,28 @@ static int bnge_alloc_core(struct bnge_net *bn) return rc; } =20 +u16 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr) +{ + return rxr->rx_cpr->ring_struct.fw_ring_id; +} + +u16 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr) +{ + return txr->tx_cpr->ring_struct.fw_ring_id; +} + +static void bnge_db_nq(struct bnge_net *bn, struct bnge_db_info *db, u32 i= dx) +{ + bnge_writeq(bn->bd, db->db_key64 | DBR_TYPE_NQ_MASK | + DB_RING_IDX(db, idx), db->doorbell); +} + +static void bnge_db_cq(struct bnge_net *bn, struct bnge_db_info *db, u32 i= dx) +{ + bnge_writeq(bn->bd, db->db_key64 | DBR_TYPE_CQ_ARMALL | + DB_RING_IDX(db, idx), db->doorbell); +} + static int bnge_cp_num_to_irq_num(struct bnge_net *bn, int n) { struct bnge_napi *bnapi =3D bn->bnapi[n]; @@ -1227,6 +1249,326 @@ static void bnge_init_vnics(struct bnge_net *bn) } } =20 +static void bnge_set_db_mask(struct bnge_net *bn, struct bnge_db_info *db, + u32 ring_type) +{ + switch (ring_type) { + case HWRM_RING_ALLOC_TX: + db->db_ring_mask =3D bn->tx_ring_mask; + break; + case HWRM_RING_ALLOC_RX: + db->db_ring_mask =3D bn->rx_ring_mask; + break; + case HWRM_RING_ALLOC_AGG: + db->db_ring_mask =3D bn->rx_agg_ring_mask; + break; + case HWRM_RING_ALLOC_CMPL: + case HWRM_RING_ALLOC_NQ: + db->db_ring_mask =3D bn->cp_ring_mask; + break; + } + db->db_epoch_mask =3D db->db_ring_mask + 1; + db->db_epoch_shift =3D DBR_EPOCH_SFT - ilog2(db->db_epoch_mask); +} + +static void bnge_set_db(struct bnge_net *bn, struct bnge_db_info *db, + u32 ring_type, u32 map_idx, u32 xid) +{ + struct bnge_dev *bd =3D bn->bd; + + switch (ring_type) { + case HWRM_RING_ALLOC_TX: + db->db_key64 =3D DBR_PATH_L2 | DBR_TYPE_SQ; + break; + case HWRM_RING_ALLOC_RX: + case HWRM_RING_ALLOC_AGG: + db->db_key64 =3D DBR_PATH_L2 | DBR_TYPE_SRQ; + break; + case HWRM_RING_ALLOC_CMPL: + db->db_key64 =3D DBR_PATH_L2; + break; + case HWRM_RING_ALLOC_NQ: + db->db_key64 =3D DBR_PATH_L2; + break; + } + db->db_key64 |=3D ((u64)xid << DBR_XID_SFT) | DBR_VALID; + + db->doorbell =3D bd->bar1 + bd->db_offset; + bnge_set_db_mask(bn, db, ring_type); +} + +static int bnge_hwrm_cp_ring_alloc(struct bnge_net *bn, + struct bnge_cp_ring_info *cpr) +{ + const u32 type =3D HWRM_RING_ALLOC_CMPL; + struct bnge_napi *bnapi =3D cpr->bnapi; + struct bnge_ring_struct *ring; + u32 map_idx =3D bnapi->index; + int rc; + + ring =3D &cpr->ring_struct; + ring->handle =3D BNGE_SET_NQ_HDL(cpr); + rc =3D hwrm_ring_alloc_send_msg(bn, ring, type, map_idx); + if (rc) + return rc; + + bnge_set_db(bn, &cpr->cp_db, type, map_idx, ring->fw_ring_id); + bnge_db_cq(bn, &cpr->cp_db, cpr->cp_raw_cons); + + return 0; +} + +static int bnge_hwrm_tx_ring_alloc(struct bnge_net *bn, + struct bnge_tx_ring_info *txr, u32 tx_idx) +{ + struct bnge_ring_struct *ring =3D &txr->tx_ring_struct; + const u32 type =3D HWRM_RING_ALLOC_TX; + int rc; + + rc =3D hwrm_ring_alloc_send_msg(bn, ring, type, tx_idx); + if (rc) + return rc; + + bnge_set_db(bn, &txr->tx_db, type, tx_idx, ring->fw_ring_id); + + return 0; +} + +static int bnge_hwrm_rx_agg_ring_alloc(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr) +{ + struct bnge_ring_struct *ring =3D &rxr->rx_agg_ring_struct; + u32 type =3D HWRM_RING_ALLOC_AGG; + struct bnge_dev *bd =3D bn->bd; + u32 grp_idx =3D ring->grp_idx; + u32 map_idx; + int rc; + + map_idx =3D grp_idx + bd->rx_nr_rings; + rc =3D hwrm_ring_alloc_send_msg(bn, ring, type, map_idx); + if (rc) + return rc; + + bnge_set_db(bn, &rxr->rx_agg_db, type, map_idx, + ring->fw_ring_id); + bnge_db_write(bn->bd, &rxr->rx_agg_db, rxr->rx_agg_prod); + bnge_db_write(bn->bd, &rxr->rx_db, rxr->rx_prod); + bn->grp_info[grp_idx].agg_fw_ring_id =3D ring->fw_ring_id; + + return 0; +} + +static int bnge_hwrm_rx_ring_alloc(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr) +{ + struct bnge_ring_struct *ring =3D &rxr->rx_ring_struct; + struct bnge_napi *bnapi =3D rxr->bnapi; + u32 type =3D HWRM_RING_ALLOC_RX; + u32 map_idx =3D bnapi->index; + int rc; + + rc =3D hwrm_ring_alloc_send_msg(bn, ring, type, map_idx); + if (rc) + return rc; + + bnge_set_db(bn, &rxr->rx_db, type, map_idx, ring->fw_ring_id); + bn->grp_info[map_idx].rx_fw_ring_id =3D ring->fw_ring_id; + + return 0; +} + +static int bnge_hwrm_ring_alloc(struct bnge_net *bn) +{ + struct bnge_dev *bd =3D bn->bd; + bool agg_rings; + int i, rc =3D 0; + + agg_rings =3D !!(bnge_is_agg_reqd(bd)); + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_nq_ring_info *nqr =3D &bnapi->nq_ring; + struct bnge_ring_struct *ring =3D &nqr->ring_struct; + u32 type =3D HWRM_RING_ALLOC_NQ; + u32 map_idx =3D ring->map_idx; + unsigned int vector; + + vector =3D bd->irq_tbl[map_idx].vector; + disable_irq_nosync(vector); + rc =3D hwrm_ring_alloc_send_msg(bn, ring, type, map_idx); + if (rc) { + enable_irq(vector); + goto err_out; + } + bnge_set_db(bn, &nqr->nq_db, type, map_idx, ring->fw_ring_id); + bnge_db_nq(bn, &nqr->nq_db, nqr->nq_raw_cons); + enable_irq(vector); + bn->grp_info[i].nq_fw_ring_id =3D ring->fw_ring_id; + + if (!i) { + rc =3D bnge_hwrm_set_async_event_cr(bd, ring->fw_ring_id); + if (rc) + netdev_warn(bn->netdev, "Failed to set async event completion ring.\n"= ); + } + } + + for (i =3D 0; i < bd->tx_nr_rings; i++) { + struct bnge_tx_ring_info *txr =3D &bn->tx_ring[i]; + + rc =3D bnge_hwrm_cp_ring_alloc(bn, txr->tx_cpr); + if (rc) + goto err_out; + rc =3D bnge_hwrm_tx_ring_alloc(bn, txr, i); + if (rc) + goto err_out; + } + + for (i =3D 0; i < bd->rx_nr_rings; i++) { + struct bnge_rx_ring_info *rxr =3D &bn->rx_ring[i]; + struct bnge_cp_ring_info *cpr; + struct bnge_ring_struct *ring; + struct bnge_napi *bnapi; + u32 map_idx, type; + + rc =3D bnge_hwrm_rx_ring_alloc(bn, rxr); + if (rc) + goto err_out; + /* If we have agg rings, post agg buffers first. */ + if (!agg_rings) + bnge_db_write(bn->bd, &rxr->rx_db, rxr->rx_prod); + + cpr =3D rxr->rx_cpr; + bnapi =3D rxr->bnapi; + type =3D HWRM_RING_ALLOC_CMPL; + map_idx =3D bnapi->index; + + ring =3D &cpr->ring_struct; + ring->handle =3D BNGE_SET_NQ_HDL(cpr); + rc =3D hwrm_ring_alloc_send_msg(bn, ring, type, map_idx); + if (rc) + goto err_out; + bnge_set_db(bn, &cpr->cp_db, type, map_idx, + ring->fw_ring_id); + bnge_db_cq(bn, &cpr->cp_db, cpr->cp_raw_cons); + } + + if (agg_rings) { + for (i =3D 0; i < bd->rx_nr_rings; i++) { + rc =3D bnge_hwrm_rx_agg_ring_alloc(bn, &bn->rx_ring[i]); + if (rc) + goto err_out; + } + } +err_out: + return rc; +} + +static void bnge_hwrm_rx_ring_free(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr, + bool close_path) +{ + struct bnge_ring_struct *ring =3D &rxr->rx_ring_struct; + u32 grp_idx =3D rxr->bnapi->index; + u32 cmpl_ring_id; + + if (ring->fw_ring_id =3D=3D INVALID_HW_RING_ID) + return; + + cmpl_ring_id =3D bnge_cp_ring_for_rx(rxr); + hwrm_ring_free_send_msg(bn, ring, + RING_FREE_REQ_RING_TYPE_RX, + close_path ? cmpl_ring_id : + INVALID_HW_RING_ID); + ring->fw_ring_id =3D INVALID_HW_RING_ID; + bn->grp_info[grp_idx].rx_fw_ring_id =3D INVALID_HW_RING_ID; +} + +static void bnge_hwrm_rx_agg_ring_free(struct bnge_net *bn, + struct bnge_rx_ring_info *rxr, + bool close_path) +{ + struct bnge_ring_struct *ring =3D &rxr->rx_agg_ring_struct; + u32 grp_idx =3D rxr->bnapi->index; + u32 cmpl_ring_id; + + if (ring->fw_ring_id =3D=3D INVALID_HW_RING_ID) + return; + + cmpl_ring_id =3D bnge_cp_ring_for_rx(rxr); + hwrm_ring_free_send_msg(bn, ring, RING_FREE_REQ_RING_TYPE_RX_AGG, + close_path ? cmpl_ring_id : + INVALID_HW_RING_ID); + ring->fw_ring_id =3D INVALID_HW_RING_ID; + bn->grp_info[grp_idx].agg_fw_ring_id =3D INVALID_HW_RING_ID; +} + +static void bnge_hwrm_tx_ring_free(struct bnge_net *bn, + struct bnge_tx_ring_info *txr, + bool close_path) +{ + struct bnge_ring_struct *ring =3D &txr->tx_ring_struct; + u32 cmpl_ring_id; + + if (ring->fw_ring_id =3D=3D INVALID_HW_RING_ID) + return; + + cmpl_ring_id =3D close_path ? bnge_cp_ring_for_tx(txr) : + INVALID_HW_RING_ID; + hwrm_ring_free_send_msg(bn, ring, RING_FREE_REQ_RING_TYPE_TX, + cmpl_ring_id); + ring->fw_ring_id =3D INVALID_HW_RING_ID; +} + +static void bnge_hwrm_cp_ring_free(struct bnge_net *bn, + struct bnge_cp_ring_info *cpr) +{ + struct bnge_ring_struct *ring; + + ring =3D &cpr->ring_struct; + if (ring->fw_ring_id =3D=3D INVALID_HW_RING_ID) + return; + + hwrm_ring_free_send_msg(bn, ring, RING_FREE_REQ_RING_TYPE_L2_CMPL, + INVALID_HW_RING_ID); + ring->fw_ring_id =3D INVALID_HW_RING_ID; +} + +static void bnge_hwrm_ring_free(struct bnge_net *bn, bool close_path) +{ + struct bnge_dev *bd =3D bn->bd; + int i; + + if (!bn->bnapi) + return; + + for (i =3D 0; i < bd->tx_nr_rings; i++) + bnge_hwrm_tx_ring_free(bn, &bn->tx_ring[i], close_path); + + for (i =3D 0; i < bd->rx_nr_rings; i++) { + bnge_hwrm_rx_ring_free(bn, &bn->rx_ring[i], close_path); + bnge_hwrm_rx_agg_ring_free(bn, &bn->rx_ring[i], close_path); + } + + for (i =3D 0; i < bd->nq_nr_rings; i++) { + struct bnge_napi *bnapi =3D bn->bnapi[i]; + struct bnge_nq_ring_info *nqr; + struct bnge_ring_struct *ring; + int j; + + nqr =3D &bnapi->nq_ring; + for (j =3D 0; j < nqr->cp_ring_count && nqr->cp_ring_arr; j++) + bnge_hwrm_cp_ring_free(bn, &nqr->cp_ring_arr[j]); + + ring =3D &nqr->ring_struct; + if (ring->fw_ring_id !=3D INVALID_HW_RING_ID) { + hwrm_ring_free_send_msg(bn, ring, + RING_FREE_REQ_RING_TYPE_NQ, + INVALID_HW_RING_ID); + ring->fw_ring_id =3D INVALID_HW_RING_ID; + bn->grp_info[i].nq_fw_ring_id =3D INVALID_HW_RING_ID; + } + } +} + static void bnge_setup_msix(struct bnge_net *bn) { struct net_device *dev =3D bn->netdev; @@ -1263,6 +1605,7 @@ static int bnge_setup_interrupts(struct bnge_net *bn) =20 static void bnge_hwrm_resource_free(struct bnge_net *bn, bool close_path) { + bnge_hwrm_ring_free(bn, close_path); bnge_hwrm_stat_ctx_free(bn); } =20 @@ -1345,6 +1688,12 @@ static int bnge_init_chip(struct bnge_net *bn) netdev_err(bn->netdev, "hwrm stat ctx alloc failure rc: %d\n", rc); goto err_out; } + + rc =3D bnge_hwrm_ring_alloc(bn); + if (rc) { + netdev_err(bn->netdev, "hwrm ring alloc failure rc: %d\n", rc); + goto err_out; + } return 0; =20 err_out: diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index 55497c4e7fb..a5d6b808d75 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -5,6 +5,8 @@ #define _BNGE_NETDEV_H_ =20 #include +#include +#include "bnge_db.h" =20 struct tx_bd { __le32 tx_bd_len_flags_type; @@ -169,6 +171,7 @@ enum { #define RING_RX_AGG(bn, idx) ((idx) & (bn)->rx_agg_ring_mask) #define NEXT_RX_AGG(idx) ((idx) + 1) =20 +#define BNGE_NQ_HDL_TYPE_SHIFT 24 #define BNGE_NQ_HDL_TYPE_RX 0x00 #define BNGE_NQ_HDL_TYPE_TX 0x01 =20 @@ -272,6 +275,9 @@ void bnge_set_ring_params(struct bnge_dev *bd); txr =3D (iter < BNGE_MAX_TXR_PER_NAPI - 1) ? \ (bnapi)->tx_ring[++iter] : NULL) =20 +#define BNGE_SET_NQ_HDL(cpr) \ + (((cpr)->cp_ring_type << BNGE_NQ_HDL_TYPE_SHIFT) | (cpr)->cp_idx) + struct bnge_stats_mem { u64 *sw_stats; u64 *hw_masks; @@ -287,6 +293,8 @@ struct bnge_cp_ring_info { struct bnge_ring_struct ring_struct; u8 cp_ring_type; u8 cp_idx; + u32 cp_raw_cons; + struct bnge_db_info cp_db; }; =20 struct bnge_nq_ring_info { @@ -294,6 +302,8 @@ struct bnge_nq_ring_info { dma_addr_t *desc_mapping; struct nqe_cn **desc_ring; struct bnge_ring_struct ring_struct; + u32 nq_raw_cons; + struct bnge_db_info nq_db; =20 struct bnge_stats_mem stats; u32 hw_stats_ctx_id; @@ -309,6 +319,8 @@ struct bnge_rx_ring_info { u16 rx_agg_prod; u16 rx_sw_agg_prod; u16 rx_next_cons; + struct bnge_db_info rx_db; + struct bnge_db_info rx_agg_db; =20 struct rx_bd *rx_desc_ring[MAX_RX_PAGES]; struct bnge_sw_rx_bd *rx_buf_ring; @@ -338,6 +350,7 @@ struct bnge_tx_ring_info { u16 txq_index; u8 tx_napi_idx; u8 kick_pending; + struct bnge_db_info tx_db; =20 struct tx_bd *tx_desc_ring[MAX_TX_PAGES]; struct bnge_sw_tx_bd *tx_buf_ring; @@ -392,4 +405,7 @@ struct bnge_vnic_info { #define BNGE_VNIC_UCAST_FLAG 8 u32 vnic_id; }; + +u16 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr); +u16 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr); #endif /* _BNGE_NETDEV_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h b/drivers/net/e= thernet/broadcom/bnge/bnge_rmem.h index 0e7684e2071..341c7f81ed0 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_rmem.h @@ -189,6 +189,7 @@ struct bnge_ring_struct { u16 grp_idx; u16 map_idx; /* Used by NQs */ }; + u32 handle; u8 queue_id; }; =20 --=20 2.47.3 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-qk1-f228.google.com (mail-qk1-f228.google.com [209.85.222.228]) (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 759F4327A0D for ; Fri, 19 Sep 2025 17:48:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.228 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304136; cv=none; b=ovxaq0/u6UMe86mvA4OoqDrMPP4QWbod1CI1sTkbcZwgrS1yOCp4Yn3hITJxASHAs3WiGV58DIN0YooiyivGidtEZlV3b5iYlV2x/YasDFyt0r3SRyMvu58r3lyiOZiqbWrYynfHdynS85OOcDu5MOizsfeivCC9PUfzVJjlREk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304136; c=relaxed/simple; bh=h+0O3X3qE/J4P8TeOAi/T2g76QRbbJD4LLBTaUl5oNw=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=o8C2kuWLgc2HaZr982JEVUqFvw3XV4WpsFrFqV85ddbsdsmFyh4xI1lB0602Cerr+tCny8DQfwLkZ07MTlDgLpJe8UCfLVNb67kmCJ+SSr8+gN6WY4+Px76OmLDazlLXVwEni3FvRo4ekL/jLmU7yn4mE4/Vmx0+0JGD5bbf0EI= 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=GzR3Qqbw; arc=none smtp.client-ip=209.85.222.228 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="GzR3Qqbw" Received: by mail-qk1-f228.google.com with SMTP id af79cd13be357-8275237837fso217058785a.2 for ; Fri, 19 Sep 2025 10:48:54 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304133; x=1758908933; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lg7IpjAoonvj8zuSqYiXKVx8q8NhkLOpEVs1NCWenSw=; b=mzb8QSyO6fWmFQhZKc0jc0kmqVUYocg81yFpJpiLsd+TTeFUtB66xHci+3doZj3HIh dn1HYyK0OpI0AYf5ItaZSAky8gC6g15l+gvyEaanENkjcTaCSdJ4OrLqbrjcRxDQTaAo FXTInYm2f2MgQdtUYlc1tvBJu+FQS8xMojVRbUqRfXkl4hF+NeYv3V1ugDtUvxVcHSZy OE89tle1NCXaTQqpbgVlAWSlWAgrvr5DyChCiIxFVRS7waSd/O3vLvtP+2UGdK1MbEhr LeQHt+/MbnTYg/TYnDbkABRQAG8XuB/Hw1VuikqrJlYXTdkxLeUuaBE90zJ1SKLfeYAE HEuQ== X-Forwarded-Encrypted: i=1; AJvYcCUJQT2HsFcHSqToMACTKSCCPgC0+eCUsEBuiFVvaf/GygG0yWsQspElPw7huCg1lfHZhHkHas+PZXnF4PA=@vger.kernel.org X-Gm-Message-State: AOJu0YxvNk8mKiiTnwfA+97Ob5LL9FhYcUv4yvBw+6u8Nx2TndoTWvl9 7yeLtaUdI47sLMU+PQneE1N7kLQ/UURKYDdp87greJ5S4pvlXq1wY43ZD7ltAMVKLRtJHAPpKoo IbFy4gju86DEkL1O+ea/PvfIvwLdiKjY6AwSGz9JQLwUhEomSlSmhx/OpWjciUjQwlN6MEoN+i7 lukWbxsZ1/XoW/Pmw/KW3Fkao4+ETpjKigCj84NyKhuODz9nQxkwJ9IoVV6pc6s9sQOSTNh2jRN bt66A32P6IcJexzD6lvllVHEX9E X-Gm-Gg: ASbGncuWahhvrWx08CVnkSk6DnHJch4BZMJhQh0O34X8VBBncED/bKO0iSQ/3VWZynM kDJpXVZXvwih9691MUFG6xWduaHm25tKN1K+d92DLwEVrIgbkEXq+LqVPWMuZbOIbXZsoY/HSj0 3cwu5ys6no1NXrxoCUdYPc9pTKDxQy/1EAYdkHQhfxD1XQ9vbRXuJOtk2gfBbiExDbL7pgSNupe 5a2IhL9vKUkM95al3Hj9zoJ5aWwPj9uO7cZ0CzMWIpGpyYtjCLpGSF6wNz6lK1lHovrrznO8TUp R/8zayQhcAU4jp0lOVtYF1kYjf7AYo4YOONsOgxsTz3Qg6fTjSuDO3+YaQHsdoh5TTSrgo1dIsG IWg6Ms6i97OjBFF0ZzhS301GFquA+wUZFuG3hBDO6iuX1cbs9G7bUp9koeLTY2F6/H+DdVHaVvT njlNptdLWU X-Google-Smtp-Source: AGHT+IFcZ3aYzTpwtdE/iKW9IT8VH4SLbzfEe//B1Wt8gin8dkuY9ZCfLjBrBWKLQ7U8YJem6PV67JWfoT12 X-Received: by 2002:a05:620a:4092:b0:810:44f8:7b3b with SMTP id af79cd13be357-83ba438b1bamr542563885a.33.1758304133189; Fri, 19 Sep 2025 10:48:53 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-118.dlp.protect.broadcom.com. [144.49.247.118]) by smtp-relay.gmail.com with ESMTPS id af79cd13be357-8363363c85asm47325285a.8.2025.09.19.10.48.52 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:53 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-3234811cab3so2430423a91.3 for ; Fri, 19 Sep 2025 10:48:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304131; x=1758908931; 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=lg7IpjAoonvj8zuSqYiXKVx8q8NhkLOpEVs1NCWenSw=; b=GzR3QqbwLjg2N4fSld2/uNl7K9tVGIyJjaR4X89AVtX4nWhaZDS1c8klVVhwMaLla1 mVmfy9ZsvWNohq8+5bOqBKNrVYC9O8IwkT+rzImN2CDC5nVMs6L4nidfsXaL43Rj/fcQ rfdcdhHzKHAmNOUA3crYT2amGKploMJLRh1HM= X-Forwarded-Encrypted: i=1; AJvYcCXovq2fXeAUwVK3EgepHJoj73EJaFuQVizaQpj+wAN52wmwvN/f3mP88w64T3K2N7dFpKNH5I4esQFDzvQ=@vger.kernel.org X-Received: by 2002:a17:90b:3dc7:b0:32e:5cba:ae11 with SMTP id 98e67ed59e1d1-3309836d2cemr4406172a91.28.1758304131349; Fri, 19 Sep 2025 10:48:51 -0700 (PDT) X-Received: by 2002:a17:90b:3dc7:b0:32e:5cba:ae11 with SMTP id 98e67ed59e1d1-3309836d2cemr4406148a91.28.1758304130854; Fri, 19 Sep 2025 10:48:50 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:50 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 09/10] bng_en: Register default VNIC Date: Fri, 19 Sep 2025 23:17:40 +0530 Message-ID: <20250919174742.24969-10-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Allocate the default VNIC with the firmware and configure its RSS, HDS, and Jumbo parameters. Add related functions to support VNIC configuration for these parameters. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- drivers/net/ethernet/broadcom/bnge/bnge.h | 1 + .../net/ethernet/broadcom/bnge/bnge_core.c | 12 + .../ethernet/broadcom/bnge/bnge_hwrm_lib.c | 207 ++++++++++++++++++ .../ethernet/broadcom/bnge/bnge_hwrm_lib.h | 19 ++ .../net/ethernet/broadcom/bnge/bnge_netdev.c | 122 +++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 3 + .../net/ethernet/broadcom/bnge/bnge_resc.c | 4 +- .../net/ethernet/broadcom/bnge/bnge_resc.h | 2 + 8 files changed, 368 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge.h b/drivers/net/ethern= et/broadcom/bnge/bnge.h index aee65a6c980..7aed5f81cd5 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge.h @@ -160,6 +160,7 @@ struct bnge_dev { u16 rss_indir_tbl_entries; =20 u32 rss_cap; + u32 rss_hash_cfg; =20 u16 rx_nr_rings; u16 tx_nr_rings; diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_core.c b/drivers/net/e= thernet/broadcom/bnge/bnge_core.c index 304b1e4d5a0..2c72dd34d50 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_core.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_core.c @@ -96,6 +96,16 @@ static void bnge_fw_unregister_dev(struct bnge_dev *bd) bnge_free_ctx_mem(bd); } =20 +static void bnge_set_dflt_rss_hash_type(struct bnge_dev *bd) +{ + bd->rss_hash_cfg =3D VNIC_RSS_CFG_REQ_HASH_TYPE_IPV4 | + VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV4 | + VNIC_RSS_CFG_REQ_HASH_TYPE_IPV6 | + VNIC_RSS_CFG_REQ_HASH_TYPE_TCP_IPV6 | + VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV4 | + VNIC_RSS_CFG_REQ_HASH_TYPE_UDP_IPV6; +} + static int bnge_fw_register_dev(struct bnge_dev *bd) { int rc; @@ -137,6 +147,8 @@ static int bnge_fw_register_dev(struct bnge_dev *bd) goto err_func_unrgtr; } =20 + bnge_set_dflt_rss_hash_type(bd); + return 0; =20 err_func_unrgtr: diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.c index b44e0f4ed7c..ae780939828 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c @@ -6,6 +6,8 @@ #include #include #include +#include +#include =20 #include "bnge.h" #include "bnge_hwrm.h" @@ -702,6 +704,211 @@ int bnge_hwrm_queue_qportcfg(struct bnge_dev *bd) return rc; } =20 +int bnge_hwrm_vnic_set_hds(struct bnge_net *bn, struct bnge_vnic_info *vni= c) +{ + u16 hds_thresh =3D (u16)bn->netdev->cfg_pending->hds_thresh; + struct hwrm_vnic_plcmodes_cfg_input *req; + struct bnge_dev *bd =3D bn->bd; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_PLCMODES_CFG); + if (rc) + return rc; + + req->flags =3D cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_JUMBO_PLACEMENT); + req->enables =3D cpu_to_le32(BNGE_PLC_EN_JUMBO_THRES_VALID); + req->jumbo_thresh =3D cpu_to_le16(bn->rx_buf_use_size); + + if (bnge_is_agg_reqd(bd)) { + req->flags |=3D cpu_to_le32(VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV4 | + VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV6); + req->enables |=3D + cpu_to_le32(BNGE_PLC_EN_HDS_THRES_VALID); + req->hds_threshold =3D cpu_to_le16(hds_thresh); + } + req->vnic_id =3D cpu_to_le32(vnic->fw_vnic_id); + return bnge_hwrm_req_send(bd, req); +} + +int bnge_hwrm_vnic_ctx_alloc(struct bnge_dev *bd, + struct bnge_vnic_info *vnic, u16 ctx_idx) +{ + struct hwrm_vnic_rss_cos_lb_ctx_alloc_output *resp; + struct hwrm_vnic_rss_cos_lb_ctx_alloc_input *req; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_RSS_COS_LB_CTX_ALLOC); + if (rc) + return rc; + + resp =3D bnge_hwrm_req_hold(bd, req); + rc =3D bnge_hwrm_req_send(bd, req); + if (!rc) + vnic->fw_rss_cos_lb_ctx[ctx_idx] =3D + le16_to_cpu(resp->rss_cos_lb_ctx_id); + bnge_hwrm_req_drop(bd, req); + + return rc; +} + +static void +__bnge_hwrm_vnic_set_rss(struct bnge_net *bn, + struct hwrm_vnic_rss_cfg_input *req, + struct bnge_vnic_info *vnic) +{ + struct bnge_dev *bd =3D bn->bd; + + bnge_fill_hw_rss_tbl(bn, vnic); + req->flags |=3D VNIC_RSS_CFG_REQ_FLAGS_IPSEC_HASH_TYPE_CFG_SUPPORT; + + req->hash_type =3D cpu_to_le32(bd->rss_hash_cfg); + req->hash_mode_flags =3D VNIC_RSS_CFG_REQ_HASH_MODE_FLAGS_DEFAULT; + req->ring_grp_tbl_addr =3D cpu_to_le64(vnic->rss_table_dma_addr); + req->hash_key_tbl_addr =3D cpu_to_le64(vnic->rss_hash_key_dma_addr); +} + +int bnge_hwrm_vnic_set_rss(struct bnge_net *bn, + struct bnge_vnic_info *vnic, bool set_rss) +{ + struct hwrm_vnic_rss_cfg_input *req; + struct bnge_dev *bd =3D bn->bd; + dma_addr_t ring_tbl_map; + u32 i, nr_ctxs; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_RSS_CFG); + if (rc) + return rc; + + req->vnic_id =3D cpu_to_le16(vnic->fw_vnic_id); + if (!set_rss) + return bnge_hwrm_req_send(bd, req); + + __bnge_hwrm_vnic_set_rss(bn, req, vnic); + ring_tbl_map =3D vnic->rss_table_dma_addr; + nr_ctxs =3D bnge_cal_nr_rss_ctxs(bd->rx_nr_rings); + + bnge_hwrm_req_hold(bd, req); + for (i =3D 0; i < nr_ctxs; ring_tbl_map +=3D BNGE_RSS_TABLE_SIZE, i++) { + req->ring_grp_tbl_addr =3D cpu_to_le64(ring_tbl_map); + req->ring_table_pair_index =3D i; + req->rss_ctx_idx =3D cpu_to_le16(vnic->fw_rss_cos_lb_ctx[i]); + rc =3D bnge_hwrm_req_send(bd, req); + if (rc) + goto exit; + } + +exit: + bnge_hwrm_req_drop(bd, req); + return rc; +} + +int bnge_hwrm_vnic_cfg(struct bnge_net *bn, struct bnge_vnic_info *vnic) +{ + struct bnge_rx_ring_info *rxr =3D &bn->rx_ring[0]; + struct hwrm_vnic_cfg_input *req; + struct bnge_dev *bd =3D bn->bd; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_CFG); + if (rc) + return rc; + + req->default_rx_ring_id =3D + cpu_to_le16(rxr->rx_ring_struct.fw_ring_id); + req->default_cmpl_ring_id =3D + cpu_to_le16(bnge_cp_ring_for_rx(rxr)); + req->enables =3D + cpu_to_le32(VNIC_CFG_REQ_ENABLES_DEFAULT_RX_RING_ID | + VNIC_CFG_REQ_ENABLES_DEFAULT_CMPL_RING_ID); + vnic->mru =3D bd->netdev->mtu + ETH_HLEN + VLAN_HLEN; + req->mru =3D cpu_to_le16(vnic->mru); + + req->vnic_id =3D cpu_to_le16(vnic->fw_vnic_id); + + if (bd->flags & BNGE_EN_STRIP_VLAN) + req->flags |=3D cpu_to_le32(VNIC_CFG_REQ_FLAGS_VLAN_STRIP_MODE); + if (vnic->vnic_id =3D=3D BNGE_VNIC_DEFAULT && bnge_aux_registered(bd)) + req->flags |=3D cpu_to_le32(BNGE_VNIC_CFG_ROCE_DUAL_MODE); + + return bnge_hwrm_req_send(bd, req); +} + +void bnge_hwrm_update_rss_hash_cfg(struct bnge_net *bn) +{ + struct bnge_vnic_info *vnic =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + struct hwrm_vnic_rss_qcfg_output *resp; + struct hwrm_vnic_rss_qcfg_input *req; + struct bnge_dev *bd =3D bn->bd; + + if (bnge_hwrm_req_init(bd, req, HWRM_VNIC_RSS_QCFG)) + return; + + req->vnic_id =3D cpu_to_le16(vnic->fw_vnic_id); + /* all contexts configured to same hash_type, zero always exists */ + req->rss_ctx_idx =3D cpu_to_le16(vnic->fw_rss_cos_lb_ctx[0]); + resp =3D bnge_hwrm_req_hold(bd, req); + if (!bnge_hwrm_req_send(bd, req)) + bd->rss_hash_cfg =3D + le32_to_cpu(resp->hash_type) ?: bd->rss_hash_cfg; + bnge_hwrm_req_drop(bd, req); +} + +int bnge_hwrm_vnic_alloc(struct bnge_dev *bd, struct bnge_vnic_info *vnic, + unsigned int nr_rings) +{ + struct hwrm_vnic_alloc_output *resp; + struct hwrm_vnic_alloc_input *req; + unsigned int i; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_VNIC_ALLOC); + if (rc) + return rc; + + for (i =3D 0; i < BNGE_MAX_CTX_PER_VNIC; i++) + vnic->fw_rss_cos_lb_ctx[i] =3D INVALID_HW_RING_ID; + if (vnic->vnic_id =3D=3D BNGE_VNIC_DEFAULT) + req->flags =3D cpu_to_le32(VNIC_ALLOC_REQ_FLAGS_DEFAULT); + + resp =3D bnge_hwrm_req_hold(bd, req); + rc =3D bnge_hwrm_req_send(bd, req); + if (!rc) + vnic->fw_vnic_id =3D le32_to_cpu(resp->vnic_id); + bnge_hwrm_req_drop(bd, req); + return rc; +} + +void bnge_hwrm_vnic_free_one(struct bnge_dev *bd, struct bnge_vnic_info *v= nic) +{ + if (vnic->fw_vnic_id !=3D INVALID_HW_RING_ID) { + struct hwrm_vnic_free_input *req; + + if (bnge_hwrm_req_init(bd, req, HWRM_VNIC_FREE)) + return; + + req->vnic_id =3D cpu_to_le32(vnic->fw_vnic_id); + + bnge_hwrm_req_send(bd, req); + vnic->fw_vnic_id =3D INVALID_HW_RING_ID; + } +} + +void bnge_hwrm_vnic_ctx_free_one(struct bnge_dev *bd, + struct bnge_vnic_info *vnic, u16 ctx_idx) +{ + struct hwrm_vnic_rss_cos_lb_ctx_free_input *req; + + if (bnge_hwrm_req_init(bd, req, HWRM_VNIC_RSS_COS_LB_CTX_FREE)) + return; + + req->rss_cos_lb_ctx_id =3D + cpu_to_le16(vnic->fw_rss_cos_lb_ctx[ctx_idx]); + + bnge_hwrm_req_send(bd, req); + vnic->fw_rss_cos_lb_ctx[ctx_idx] =3D INVALID_HW_RING_ID; +} + void bnge_hwrm_stat_ctx_free(struct bnge_net *bn) { struct hwrm_stat_ctx_free_input *req; diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.h index b2e2ec47be2..09517ffb1a2 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h @@ -4,6 +4,13 @@ #ifndef _BNGE_HWRM_LIB_H_ #define _BNGE_HWRM_LIB_H_ =20 +#define BNGE_PLC_EN_JUMBO_THRES_VALID \ + VNIC_PLCMODES_CFG_REQ_ENABLES_JUMBO_THRESH_VALID +#define BNGE_PLC_EN_HDS_THRES_VALID \ + VNIC_PLCMODES_CFG_REQ_ENABLES_HDS_THRESHOLD_VALID +#define BNGE_VNIC_CFG_ROCE_DUAL_MODE \ + VNIC_CFG_REQ_FLAGS_ROCE_DUAL_VNIC_MODE + int bnge_hwrm_ver_get(struct bnge_dev *bd); int bnge_hwrm_func_reset(struct bnge_dev *bd); int bnge_hwrm_fw_set_time(struct bnge_dev *bd); @@ -24,6 +31,18 @@ int bnge_hwrm_func_qcfg(struct bnge_dev *bd); int bnge_hwrm_func_resc_qcaps(struct bnge_dev *bd); int bnge_hwrm_queue_qportcfg(struct bnge_dev *bd); =20 +int bnge_hwrm_vnic_set_hds(struct bnge_net *bn, struct bnge_vnic_info *vni= c); +int bnge_hwrm_vnic_ctx_alloc(struct bnge_dev *bd, + struct bnge_vnic_info *vnic, u16 ctx_idx); +int bnge_hwrm_vnic_set_rss(struct bnge_net *bn, + struct bnge_vnic_info *vnic, bool set_rss); +int bnge_hwrm_vnic_cfg(struct bnge_net *bn, struct bnge_vnic_info *vnic); +void bnge_hwrm_update_rss_hash_cfg(struct bnge_net *bn); +int bnge_hwrm_vnic_alloc(struct bnge_dev *bd, struct bnge_vnic_info *vnic, + unsigned int nr_rings); +void bnge_hwrm_vnic_free_one(struct bnge_dev *bd, struct bnge_vnic_info *v= nic); +void bnge_hwrm_vnic_ctx_free_one(struct bnge_dev *bd, + struct bnge_vnic_info *vnic, u16 ctx_idx); void bnge_hwrm_stat_ctx_free(struct bnge_net *bn); int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn); int hwrm_ring_free_send_msg(struct bnge_net *bn, struct bnge_ring_struct *= ring, diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index af9e25f0384..accc62aec66 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -1462,6 +1462,104 @@ static int bnge_hwrm_ring_alloc(struct bnge_net *bn) return rc; } =20 +void bnge_fill_hw_rss_tbl(struct bnge_net *bn, struct bnge_vnic_info *vnic) +{ + __le16 *ring_tbl =3D vnic->rss_table; + struct bnge_rx_ring_info *rxr; + struct bnge_dev *bd =3D bn->bd; + u16 tbl_size, i; + + tbl_size =3D bnge_get_rxfh_indir_size(bd); + + for (i =3D 0; i < tbl_size; i++) { + u16 ring_id, j; + + j =3D bd->rss_indir_tbl[i]; + rxr =3D &bn->rx_ring[j]; + + ring_id =3D rxr->rx_ring_struct.fw_ring_id; + *ring_tbl++ =3D cpu_to_le16(ring_id); + ring_id =3D bnge_cp_ring_for_rx(rxr); + *ring_tbl++ =3D cpu_to_le16(ring_id); + } +} + +static int bnge_hwrm_vnic_rss_cfg(struct bnge_net *bn, + struct bnge_vnic_info *vnic) +{ + int rc; + + rc =3D bnge_hwrm_vnic_set_rss(bn, vnic, true); + if (rc) { + netdev_err(bn->netdev, "hwrm vnic %d set rss failure rc: %d\n", + vnic->vnic_id, rc); + return rc; + } + rc =3D bnge_hwrm_vnic_cfg(bn, vnic); + if (rc) + netdev_err(bn->netdev, "hwrm vnic %d cfg failure rc: %d\n", + vnic->vnic_id, rc); + return rc; +} + +static int bnge_setup_vnic(struct bnge_net *bn, struct bnge_vnic_info *vni= c) +{ + struct bnge_dev *bd =3D bn->bd; + int rc, i, nr_ctxs; + + nr_ctxs =3D bnge_cal_nr_rss_ctxs(bd->rx_nr_rings); + for (i =3D 0; i < nr_ctxs; i++) { + rc =3D bnge_hwrm_vnic_ctx_alloc(bd, vnic, i); + if (rc) { + netdev_err(bn->netdev, "hwrm vnic %d ctx %d alloc failure rc: %d\n", + vnic->vnic_id, i, rc); + return -ENOMEM; + } + bn->rsscos_nr_ctxs++; + } + + rc =3D bnge_hwrm_vnic_rss_cfg(bn, vnic); + if (rc) + return rc; + + if (bnge_is_agg_reqd(bd)) { + rc =3D bnge_hwrm_vnic_set_hds(bn, vnic); + if (rc) + netdev_err(bn->netdev, "hwrm vnic %d set hds failure rc: %d\n", + vnic->vnic_id, rc); + } + return rc; +} + +static void bnge_hwrm_vnic_free(struct bnge_net *bn) +{ + int i; + + for (i =3D 0; i < bn->nr_vnics; i++) + bnge_hwrm_vnic_free_one(bn->bd, &bn->vnic_info[i]); +} + +static void bnge_hwrm_vnic_ctx_free(struct bnge_net *bn) +{ + int i, j; + + for (i =3D 0; i < bn->nr_vnics; i++) { + struct bnge_vnic_info *vnic =3D &bn->vnic_info[i]; + + for (j =3D 0; j < BNGE_MAX_CTX_PER_VNIC; j++) { + if (vnic->fw_rss_cos_lb_ctx[j] !=3D INVALID_HW_RING_ID) + bnge_hwrm_vnic_ctx_free_one(bn->bd, vnic, j); + } + } + bn->rsscos_nr_ctxs =3D 0; +} + +static void bnge_clear_vnic(struct bnge_net *bn) +{ + bnge_hwrm_vnic_free(bn); + bnge_hwrm_vnic_ctx_free(bn); +} + static void bnge_hwrm_rx_ring_free(struct bnge_net *bn, struct bnge_rx_ring_info *rxr, bool close_path) @@ -1605,6 +1703,7 @@ static int bnge_setup_interrupts(struct bnge_net *bn) =20 static void bnge_hwrm_resource_free(struct bnge_net *bn, bool close_path) { + bnge_clear_vnic(bn); bnge_hwrm_ring_free(bn, close_path); bnge_hwrm_stat_ctx_free(bn); } @@ -1678,6 +1777,8 @@ static int bnge_request_irq(struct bnge_net *bn) =20 static int bnge_init_chip(struct bnge_net *bn) { + struct bnge_vnic_info *vnic =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + struct bnge_dev *bd =3D bn->bd; int rc; =20 #define BNGE_DEF_STATS_COAL_TICKS 1000000 @@ -1694,6 +1795,19 @@ static int bnge_init_chip(struct bnge_net *bn) netdev_err(bn->netdev, "hwrm ring alloc failure rc: %d\n", rc); goto err_out; } + + rc =3D bnge_hwrm_vnic_alloc(bd, vnic, bd->rx_nr_rings); + if (rc) { + netdev_err(bn->netdev, "hwrm vnic alloc failure rc: %d\n", rc); + goto err_out; + } + + rc =3D bnge_setup_vnic(bn, vnic); + if (rc) + goto err_out; + + if (bd->rss_cap & BNGE_RSS_CAP_RSS_HASH_TYPE_DELTA) + bnge_hwrm_update_rss_hash_cfg(bn); return 0; =20 err_out: @@ -1838,11 +1952,19 @@ static int bnge_open(struct net_device *dev) return rc; } =20 +static int bnge_shutdown_nic(struct bnge_net *bn) +{ + /* TODO: close_path =3D 0 until we make NAPI functional */ + bnge_hwrm_resource_free(bn, 0); + return 0; +} + static void bnge_close_core(struct bnge_net *bn) { struct bnge_dev *bd =3D bn->bd; =20 clear_bit(BNGE_STATE_OPEN, &bd->state); + bnge_shutdown_nic(bn); bnge_free_all_rings_bufs(bn); bnge_free_irq(bn); bnge_del_napi(bn); diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index a5d6b808d75..53979914c51 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -228,6 +228,7 @@ struct bnge_net { u8 rss_hash_key[HW_HASH_KEY_SIZE]; u8 rss_hash_key_valid:1; u8 rss_hash_key_updated:1; + int rsscos_nr_ctxs; u32 stats_coal_ticks; }; =20 @@ -381,6 +382,7 @@ struct bnge_vnic_info { u16 fw_vnic_id; #define BNGE_MAX_CTX_PER_VNIC 8 u16 fw_rss_cos_lb_ctx[BNGE_MAX_CTX_PER_VNIC]; + u16 mru; u8 *uc_list; dma_addr_t rss_table_dma_addr; __le16 *rss_table; @@ -408,4 +410,5 @@ struct bnge_vnic_info { =20 u16 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr); u16 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr); +void bnge_fill_hw_rss_tbl(struct bnge_net *bn, struct bnge_vnic_info *vnic= ); #endif /* _BNGE_NETDEV_H_ */ diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c b/drivers/net/e= thernet/broadcom/bnge/bnge_resc.c index 5597af1b3b7..62ebe03a0dc 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.c @@ -164,7 +164,7 @@ static int bnge_adjust_rings(struct bnge_dev *bd, u16 *= rx, return bnge_fix_rings_count(rx, tx, max_nq, sh); } =20 -static int bnge_cal_nr_rss_ctxs(u16 rx_rings) +int bnge_cal_nr_rss_ctxs(u16 rx_rings) { if (!rx_rings) return 0; @@ -184,7 +184,7 @@ static u16 bnge_get_total_vnics(struct bnge_dev *bd, u1= 6 rx_rings) return 1; } =20 -static u32 bnge_get_rxfh_indir_size(struct bnge_dev *bd) +u32 bnge_get_rxfh_indir_size(struct bnge_dev *bd) { return bnge_cal_nr_rss_ctxs(bd->rx_nr_rings) * BNGE_RSS_TABLE_ENTRIES; diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_resc.h b/drivers/net/e= thernet/broadcom/bnge/bnge_resc.h index 54ef1c7d882..0d6213b2758 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_resc.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_resc.h @@ -72,6 +72,8 @@ void bnge_free_irqs(struct bnge_dev *bd); int bnge_net_init_dflt_config(struct bnge_dev *bd); void bnge_net_uninit_dflt_config(struct bnge_dev *bd); void bnge_aux_init_dflt_config(struct bnge_dev *bd); +u32 bnge_get_rxfh_indir_size(struct bnge_dev *bd); +int bnge_cal_nr_rss_ctxs(u16 rx_rings); =20 static inline u32 bnge_adjust_pow_two(u32 total_ent, u16 ent_per_blk) --=20 2.47.3 From nobody Thu Oct 2 06:18:02 2025 Received: from mail-pf1-f226.google.com (mail-pf1-f226.google.com [209.85.210.226]) (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 BB4E7322761 for ; Fri, 19 Sep 2025 17:48:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.226 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304140; cv=none; b=DvmT9LGGjmeU1i30xlN/6AtzzkypNe1OoSKQBwUMKGfLUn93rYJhcjiWFaXxrY5LVFhbiS++F5geCQTyYA3A+URrZi1e8BFFHSpHidkXowK8TQ+CDDaVUKqK3Au94reGtiXldziIIVkipe2VvfrNv6M33mtfs2gEM+LwZusBeBc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1758304140; c=relaxed/simple; bh=pMScb18RKmKVQrllpBuXf0eC88Ayov5OuMNoJV+eB50=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=lxy9qV9JUo1vRzgQkcVbpBVo7tysEsFpzUzdTUTiDngSNYLoNIqy2Ec7Ry2tJfyHy2KGL1XMjAQ1VzmTCGW/h13txCkerlinIoBxM64LIqCUDbF8wPvd9hvRzFgIkfxQReR2Z8tfOHq9R4/esDE04dLmh3sXdxqaneLPR9oEM+M= 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=YpaFSqND; arc=none smtp.client-ip=209.85.210.226 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="YpaFSqND" Received: by mail-pf1-f226.google.com with SMTP id d2e1a72fcca58-77d37d71967so1755652b3a.0 for ; Fri, 19 Sep 2025 10:48:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1758304138; x=1758908938; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:dkim-signature :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Pj8ssjjneR2tLHqrvgA+LIiYw5CXVHoH84nZceX131g=; b=Ew8hI2FFXKH6qg6ymgEQGgTsKI5E46p1JkD7GxswuOuhzqS0ChAXF2RKrpUjFfnEJ7 lCZeP5HTVDoeJi5dEosuAVH0EMjKt2B6a9Fb8E3Bo1W0P9IfUF7AcE6Q1U4nRz3Q12QO hZT8PUaKLVOL6BsBTH2tkYvyyiNMIu5I9iKFW807miGBuuoBaoqPYBwRSqDut/PgDpgt FDcR67VNx5bs+iOfLSNDoYD/oPVtN4rlmn5JO1PqpkhLYbS7Q/dZATaHuD0+2ioMISVJ vMhHmdsEA905fTjYFIgEp9VgG1EaIrmuXeTFMuOKhwez0+rDdMgwCfyEeYxtxRAlLkTx Qelg== X-Forwarded-Encrypted: i=1; AJvYcCW1J17XNPVQ5KNPETlp11fyroLpfG0RQG3W8xKpFjmekCSf3PfFeuKINKDRCERVOCMrshFbWkEqiTO0MkQ=@vger.kernel.org X-Gm-Message-State: AOJu0YwjjnKiSRe6ggbVgTA+GQUIC71Wp66sLORzs9SjXLPngMJ4yJE+ twEpfm+8OADtxnB8wqR7FtfdJO349m9+J7joeir3f0FkbO9KGCWzJ6m8bIgNd2nfXioDzR8DoK+ y3+lHUeNt3wCzvH/IBsk/oLQICNmsVlP2wLQxkD8Xopek18sugcebtceried6KsxuVhUB0kwZP9 G5zCIrxLlNNeFHr/E74JfiOVTpGUl9EVAe7V4YD+vwR/u/VTQ0+MOheqbLJRAL+WnwqfQGm12Sd L42OKK0OssZDpvWy36DvTfDWtkZ X-Gm-Gg: ASbGncsaDuAcGhps2eirPLgnb6HeCoPt7NuRCXjVldd/Om0IxSsCekDpJryynOpO7QM MreI3SxsnlCvodSfW3EDafCpCNcRUNrTWBd5mLEBs4Jke3Ch/mrFTmYOqUoWOht/zn+qDorLECI 0bo4CzMXlTnvmWPe2FOjSGdVrXVNXXIcGUrbnKmzY0KB1tOmIeaM5THtJ4OIJ50Y8IbUdcU8kte PmWfl73RxsyVYwCFrv2bKZwWs96crCXPMzpUgENqfiB8/8MLBEGOAOJtxp6Gz3VW3AmiJF4lwwh Uj4UDpzC5xQJ3uhgwhrBVcOfBouQog7cIkKs9GBAeeSgDX2H/I2kCRUy/sgIWugPMAMtaQhprYo Nt4ktX+0p5jjhi7w+ljaeujyFUl6U5RMdRELsiCJ9Wltl6kyTMgC401GXz6zP/52EuaRV2lvz2c enW4uLnYsh X-Google-Smtp-Source: AGHT+IHIwt5Pz4vEs2YYEOcK72osowBuFHyxRV8X+A2mWUIItyF4l6MrYkgFf72ItPAD8eVYnBUXei8zulfz X-Received: by 2002:a05:6a21:998d:b0:246:3a6:3e47 with SMTP id adf61e73a8af0-292075102f6mr5817589637.12.1758304137889; Fri, 19 Sep 2025 10:48:57 -0700 (PDT) Received: from smtp-us-east1-p01-i01-si01.dlp.protect.broadcom.com (address-144-49-247-100.dlp.protect.broadcom.com. [144.49.247.100]) by smtp-relay.gmail.com with ESMTPS id 98e67ed59e1d1-32ea3bc873esm261263a91.1.2025.09.19.10.48.57 for (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Fri, 19 Sep 2025 10:48:57 -0700 (PDT) X-Relaying-Domain: broadcom.com X-CFilter-Loop: Reflected Received: by mail-pf1-f200.google.com with SMTP id d2e1a72fcca58-77f14f6a553so389152b3a.1 for ; Fri, 19 Sep 2025 10:48:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=broadcom.com; s=google; t=1758304136; x=1758908936; 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=Pj8ssjjneR2tLHqrvgA+LIiYw5CXVHoH84nZceX131g=; b=YpaFSqNDw3FHvW580rE9qGNzxQ8Y4OqDDgcUi91pm0bjNPMK7VsSIJ66FfK6a/dB1E VW22Y9yyoFFc+8dAvCn/QACI7bCIclsz/qhUJxqaJArBgNh1M6kPsiSIYrQGSKGXpP70 kA99lKZHNBWJuv8fyiA0uNk7XhkVZPMxrxaas= X-Forwarded-Encrypted: i=1; AJvYcCXEqd5tAX6tmrPmCvWjcDNLw07SXppKzmyO+l5031XfvcuSrQm+1jVY5/W/5KnKVUMuSHkWsQVOjO6kJNc=@vger.kernel.org X-Received: by 2002:a05:6a21:3292:b0:240:d6be:ddc with SMTP id adf61e73a8af0-2846301ce03mr13083284637.21.1758304135825; Fri, 19 Sep 2025 10:48:55 -0700 (PDT) X-Received: by 2002:a05:6a21:3292:b0:240:d6be:ddc with SMTP id adf61e73a8af0-2846301ce03mr13083259637.21.1758304135399; Fri, 19 Sep 2025 10:48:55 -0700 (PDT) Received: from hyd-csg-thor2-h1-server2.dhcp.broadcom.net ([192.19.203.250]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-b55138043b6sm3513119a12.26.2025.09.19.10.48.51 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 19 Sep 2025 10:48:54 -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, vikas.gupta@broadcom.com, Bhargava Marreddy , Rajashekar Hudumula Subject: [v8, net-next 10/10] bng_en: Configure default VNIC Date: Fri, 19 Sep 2025 23:17:41 +0530 Message-ID: <20250919174742.24969-11-bhargava.marreddy@broadcom.com> X-Mailer: git-send-email 2.47.3 In-Reply-To: <20250919174742.24969-1-bhargava.marreddy@broadcom.com> References: <20250919174742.24969-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 X-DetectorID-Processed: b00c1d49-9d2e-4205-b15f-d015386d3d5e Content-Type: text/plain; charset="utf-8" Add functions to add a filter to the VNIC to configure unicast addresses. Also, add multicast, broadcast, and promiscuous settings to the default VNIC. Signed-off-by: Bhargava Marreddy Reviewed-by: Vikas Gupta Reviewed-by: Rajashekar Hudumula --- .../ethernet/broadcom/bnge/bnge_hwrm_lib.c | 72 +++++ .../ethernet/broadcom/bnge/bnge_hwrm_lib.h | 4 + .../net/ethernet/broadcom/bnge/bnge_netdev.c | 270 ++++++++++++++++++ .../net/ethernet/broadcom/bnge/bnge_netdev.h | 40 +++ 4 files changed, 386 insertions(+) diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.c index ae780939828..198f49b40db 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.c @@ -854,6 +854,78 @@ void bnge_hwrm_update_rss_hash_cfg(struct bnge_net *bn) bnge_hwrm_req_drop(bd, req); } =20 +int bnge_hwrm_l2_filter_free(struct bnge_dev *bd, struct bnge_l2_filter *f= ltr) +{ + struct hwrm_cfa_l2_filter_free_input *req; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_CFA_L2_FILTER_FREE); + if (rc) + return rc; + + req->l2_filter_id =3D fltr->base.filter_id; + return bnge_hwrm_req_send(bd, req); +} + +int bnge_hwrm_l2_filter_alloc(struct bnge_dev *bd, struct bnge_l2_filter *= fltr) +{ + struct hwrm_cfa_l2_filter_alloc_output *resp; + struct hwrm_cfa_l2_filter_alloc_input *req; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_CFA_L2_FILTER_ALLOC); + if (rc) + return rc; + + req->flags =3D cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_FLAGS_PATH_RX); + + req->flags |=3D cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_FLAGS_OUTERMOST); + req->dst_id =3D cpu_to_le16(fltr->base.fw_vnic_id); + req->enables =3D + cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_ADDR | + CFA_L2_FILTER_ALLOC_REQ_ENABLES_DST_ID | + CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_ADDR_MASK); + ether_addr_copy(req->l2_addr, fltr->l2_key.dst_mac_addr); + eth_broadcast_addr(req->l2_addr_mask); + + if (fltr->l2_key.vlan) { + req->enables |=3D + cpu_to_le32(CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_IVLAN | + CFA_L2_FILTER_ALLOC_REQ_ENABLES_L2_IVLAN_MASK | + CFA_L2_FILTER_ALLOC_REQ_ENABLES_NUM_VLANS); + req->num_vlans =3D 1; + req->l2_ivlan =3D cpu_to_le16(fltr->l2_key.vlan); + req->l2_ivlan_mask =3D cpu_to_le16(0xfff); + } + + resp =3D bnge_hwrm_req_hold(bd, req); + rc =3D bnge_hwrm_req_send(bd, req); + if (!rc) + fltr->base.filter_id =3D resp->l2_filter_id; + + bnge_hwrm_req_drop(bd, req); + return rc; +} + +int bnge_hwrm_cfa_l2_set_rx_mask(struct bnge_dev *bd, + struct bnge_vnic_info *vnic) +{ + struct hwrm_cfa_l2_set_rx_mask_input *req; + int rc; + + rc =3D bnge_hwrm_req_init(bd, req, HWRM_CFA_L2_SET_RX_MASK); + if (rc) + return rc; + + req->vnic_id =3D cpu_to_le32(vnic->fw_vnic_id); + if (vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_MCAST) { + req->num_mc_entries =3D cpu_to_le32(vnic->mc_list_count); + req->mc_tbl_addr =3D cpu_to_le64(vnic->mc_list_mapping); + } + req->mask =3D cpu_to_le32(vnic->rx_mask); + return bnge_hwrm_req_send_silent(bd, req); +} + int bnge_hwrm_vnic_alloc(struct bnge_dev *bd, struct bnge_vnic_info *vnic, unsigned int nr_rings) { diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h b/drivers/n= et/ethernet/broadcom/bnge/bnge_hwrm_lib.h index 09517ffb1a2..042f28e84a0 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_hwrm_lib.h @@ -43,6 +43,10 @@ int bnge_hwrm_vnic_alloc(struct bnge_dev *bd, struct bng= e_vnic_info *vnic, void bnge_hwrm_vnic_free_one(struct bnge_dev *bd, struct bnge_vnic_info *v= nic); void bnge_hwrm_vnic_ctx_free_one(struct bnge_dev *bd, struct bnge_vnic_info *vnic, u16 ctx_idx); +int bnge_hwrm_l2_filter_free(struct bnge_dev *bd, struct bnge_l2_filter *f= ltr); +int bnge_hwrm_l2_filter_alloc(struct bnge_dev *bd, struct bnge_l2_filter *= fltr); +int bnge_hwrm_cfa_l2_set_rx_mask(struct bnge_dev *bd, + struct bnge_vnic_info *vnic); void bnge_hwrm_stat_ctx_free(struct bnge_net *bn); int bnge_hwrm_stat_ctx_alloc(struct bnge_net *bn); int hwrm_ring_free_send_msg(struct bnge_net *bn, struct bnge_ring_struct *= ring, diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.c index accc62aec66..832eeb960bd 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.c @@ -1531,6 +1531,230 @@ static int bnge_setup_vnic(struct bnge_net *bn, str= uct bnge_vnic_info *vnic) return rc; } =20 +static void bnge_del_l2_filter(struct bnge_net *bn, struct bnge_l2_filter = *fltr) +{ + if (!refcount_dec_and_test(&fltr->refcnt)) + return; + hlist_del_rcu(&fltr->base.hash); + kfree_rcu(fltr, base.rcu); +} + +static void bnge_init_l2_filter(struct bnge_net *bn, + struct bnge_l2_filter *fltr, + struct bnge_l2_key *key, u32 idx) +{ + struct hlist_head *head; + + ether_addr_copy(fltr->l2_key.dst_mac_addr, key->dst_mac_addr); + fltr->l2_key.vlan =3D key->vlan; + fltr->base.type =3D BNGE_FLTR_TYPE_L2; + + head =3D &bn->l2_fltr_hash_tbl[idx]; + hlist_add_head_rcu(&fltr->base.hash, head); + refcount_set(&fltr->refcnt, 1); +} + +static struct bnge_l2_filter *__bnge_lookup_l2_filter(struct bnge_net *bn, + struct bnge_l2_key *key, + u32 idx) +{ + struct bnge_l2_filter *fltr; + struct hlist_head *head; + + head =3D &bn->l2_fltr_hash_tbl[idx]; + hlist_for_each_entry_rcu(fltr, head, base.hash) { + struct bnge_l2_key *l2_key =3D &fltr->l2_key; + + if (ether_addr_equal(l2_key->dst_mac_addr, key->dst_mac_addr) && + l2_key->vlan =3D=3D key->vlan) + return fltr; + } + return NULL; +} + +static struct bnge_l2_filter *bnge_lookup_l2_filter(struct bnge_net *bn, + struct bnge_l2_key *key, + u32 idx) +{ + struct bnge_l2_filter *fltr; + + rcu_read_lock(); + fltr =3D __bnge_lookup_l2_filter(bn, key, idx); + if (fltr) + refcount_inc(&fltr->refcnt); + rcu_read_unlock(); + return fltr; +} + +static struct bnge_l2_filter *bnge_alloc_l2_filter(struct bnge_net *bn, + struct bnge_l2_key *key, + gfp_t gfp) +{ + struct bnge_l2_filter *fltr; + u32 idx; + + idx =3D jhash2(&key->filter_key, BNGE_L2_KEY_SIZE, bn->hash_seed) & + BNGE_L2_FLTR_HASH_MASK; + fltr =3D bnge_lookup_l2_filter(bn, key, idx); + if (fltr) + return fltr; + + fltr =3D kzalloc(sizeof(*fltr), gfp); + if (!fltr) + return ERR_PTR(-ENOMEM); + + bnge_init_l2_filter(bn, fltr, key, idx); + return fltr; +} + +static int bnge_hwrm_set_vnic_filter(struct bnge_net *bn, u16 vnic_id, u16= idx, + const u8 *mac_addr) +{ + struct bnge_l2_filter *fltr; + struct bnge_l2_key key; + int rc; + + ether_addr_copy(key.dst_mac_addr, mac_addr); + key.vlan =3D 0; + fltr =3D bnge_alloc_l2_filter(bn, &key, GFP_KERNEL); + if (IS_ERR(fltr)) + return PTR_ERR(fltr); + + fltr->base.fw_vnic_id =3D bn->vnic_info[vnic_id].fw_vnic_id; + rc =3D bnge_hwrm_l2_filter_alloc(bn->bd, fltr); + if (rc) + goto err_del_l2_filter; + bn->vnic_info[vnic_id].l2_filters[idx] =3D fltr; + return rc; + +err_del_l2_filter: + bnge_del_l2_filter(bn, fltr); + return rc; +} + +static bool bnge_mc_list_updated(struct bnge_net *bn, u32 *rx_mask) +{ + struct bnge_vnic_info *vnic =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + struct net_device *dev =3D bn->netdev; + struct netdev_hw_addr *ha; + int mc_count =3D 0, off =3D 0; + bool update =3D false; + u8 *haddr; + + netdev_for_each_mc_addr(ha, dev) { + if (mc_count >=3D BNGE_MAX_MC_ADDRS) { + *rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST; + vnic->mc_list_count =3D 0; + return false; + } + haddr =3D ha->addr; + if (!ether_addr_equal(haddr, vnic->mc_list + off)) { + memcpy(vnic->mc_list + off, haddr, ETH_ALEN); + update =3D true; + } + off +=3D ETH_ALEN; + mc_count++; + } + if (mc_count) + *rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_MCAST; + + if (mc_count !=3D vnic->mc_list_count) { + vnic->mc_list_count =3D mc_count; + update =3D true; + } + return update; +} + +static bool bnge_uc_list_updated(struct bnge_net *bn) +{ + struct bnge_vnic_info *vnic =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + struct net_device *dev =3D bn->netdev; + struct netdev_hw_addr *ha; + int off =3D 0; + + if (netdev_uc_count(dev) !=3D (vnic->uc_filter_count - 1)) + return true; + + netdev_for_each_uc_addr(ha, dev) { + if (!ether_addr_equal(ha->addr, vnic->uc_list + off)) + return true; + + off +=3D ETH_ALEN; + } + return false; +} + +static bool bnge_promisc_ok(struct bnge_net *bn) +{ + return true; +} + +static int bnge_cfg_def_vnic(struct bnge_net *bn) +{ + struct bnge_vnic_info *vnic =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + struct net_device *dev =3D bn->netdev; + struct bnge_dev *bd =3D bn->bd; + struct netdev_hw_addr *ha; + int i, off =3D 0, rc; + bool uc_update; + + netif_addr_lock_bh(dev); + uc_update =3D bnge_uc_list_updated(bn); + netif_addr_unlock_bh(dev); + + if (!uc_update) + goto skip_uc; + + for (i =3D 1; i < vnic->uc_filter_count; i++) { + struct bnge_l2_filter *fltr =3D vnic->l2_filters[i]; + + bnge_hwrm_l2_filter_free(bd, fltr); + bnge_del_l2_filter(bn, fltr); + } + + vnic->uc_filter_count =3D 1; + + netif_addr_lock_bh(dev); + if (netdev_uc_count(dev) > (BNGE_MAX_UC_ADDRS - 1)) { + vnic->rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS; + } else { + netdev_for_each_uc_addr(ha, dev) { + memcpy(vnic->uc_list + off, ha->addr, ETH_ALEN); + off +=3D ETH_ALEN; + vnic->uc_filter_count++; + } + } + netif_addr_unlock_bh(dev); + + for (i =3D 1, off =3D 0; i < vnic->uc_filter_count; i++, off +=3D ETH_ALE= N) { + rc =3D bnge_hwrm_set_vnic_filter(bn, 0, i, vnic->uc_list + off); + if (rc) { + netdev_err(dev, "HWRM vnic filter failure rc: %d\n", rc); + vnic->uc_filter_count =3D i; + return rc; + } + } + +skip_uc: + if ((vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS) && + !bnge_promisc_ok(bn)) + vnic->rx_mask &=3D ~CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS; + rc =3D bnge_hwrm_cfa_l2_set_rx_mask(bd, vnic); + if (rc && (vnic->rx_mask & CFA_L2_SET_RX_MASK_REQ_MASK_MCAST)) { + netdev_info(dev, "Failed setting MC filters rc: %d, turning on ALL_MCAST= mode\n", + rc); + vnic->rx_mask &=3D ~CFA_L2_SET_RX_MASK_REQ_MASK_MCAST; + vnic->rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST; + vnic->mc_list_count =3D 0; + rc =3D bnge_hwrm_cfa_l2_set_rx_mask(bd, vnic); + } + if (rc) + netdev_err(dev, "HWRM cfa l2 rx mask failure rc: %d\n", + rc); + + return rc; +} + static void bnge_hwrm_vnic_free(struct bnge_net *bn) { int i; @@ -1554,8 +1778,24 @@ static void bnge_hwrm_vnic_ctx_free(struct bnge_net = *bn) bn->rsscos_nr_ctxs =3D 0; } =20 +static void bnge_hwrm_clear_vnic_filter(struct bnge_net *bn) +{ + struct bnge_vnic_info *vnic =3D &bn->vnic_info[BNGE_VNIC_DEFAULT]; + int i; + + for (i =3D 0; i < vnic->uc_filter_count; i++) { + struct bnge_l2_filter *fltr =3D vnic->l2_filters[i]; + + bnge_hwrm_l2_filter_free(bn->bd, fltr); + bnge_del_l2_filter(bn, fltr); + } + + vnic->uc_filter_count =3D 0; +} + static void bnge_clear_vnic(struct bnge_net *bn) { + bnge_hwrm_clear_vnic_filter(bn); bnge_hwrm_vnic_free(bn); bnge_hwrm_vnic_ctx_free(bn); } @@ -1808,6 +2048,36 @@ static int bnge_init_chip(struct bnge_net *bn) =20 if (bd->rss_cap & BNGE_RSS_CAP_RSS_HASH_TYPE_DELTA) bnge_hwrm_update_rss_hash_cfg(bn); + + /* Filter for default vnic 0 */ + rc =3D bnge_hwrm_set_vnic_filter(bn, 0, 0, bn->netdev->dev_addr); + if (rc) { + netdev_err(bn->netdev, "HWRM vnic filter failure rc: %d\n", rc); + goto err_out; + } + vnic->uc_filter_count =3D 1; + + vnic->rx_mask =3D 0; + + if (bn->netdev->flags & IFF_BROADCAST) + vnic->rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_BCAST; + + if (bn->netdev->flags & IFF_PROMISC) + vnic->rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_PROMISCUOUS; + + if (bn->netdev->flags & IFF_ALLMULTI) { + vnic->rx_mask |=3D CFA_L2_SET_RX_MASK_REQ_MASK_ALL_MCAST; + vnic->mc_list_count =3D 0; + } else if (bn->netdev->flags & IFF_MULTICAST) { + u32 mask =3D 0; + + bnge_mc_list_updated(bn, &mask); + vnic->rx_mask |=3D mask; + } + + rc =3D bnge_cfg_def_vnic(bn); + if (rc) + goto err_out; return 0; =20 err_out: diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h b/drivers/net= /ethernet/broadcom/bnge/bnge_netdev.h index 53979914c51..fb3b961536b 100644 --- a/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h +++ b/drivers/net/ethernet/broadcom/bnge/bnge_netdev.h @@ -6,6 +6,7 @@ =20 #include #include +#include #include "bnge_db.h" =20 struct tx_bd { @@ -383,6 +384,9 @@ struct bnge_vnic_info { #define BNGE_MAX_CTX_PER_VNIC 8 u16 fw_rss_cos_lb_ctx[BNGE_MAX_CTX_PER_VNIC]; u16 mru; + /* index 0 always dev_addr */ + struct bnge_l2_filter *l2_filters[BNGE_MAX_UC_ADDRS]; + u16 uc_filter_count; u8 *uc_list; dma_addr_t rss_table_dma_addr; __le16 *rss_table; @@ -394,6 +398,7 @@ struct bnge_vnic_info { #define BNGE_RSS_TABLE_MAX_TBL 8 #define BNGE_MAX_RSS_TABLE_SIZE \ (BNGE_RSS_TABLE_SIZE * BNGE_RSS_TABLE_MAX_TBL) + u32 rx_mask; =20 u8 *mc_list; int mc_list_size; @@ -408,6 +413,41 @@ struct bnge_vnic_info { u32 vnic_id; }; =20 +struct bnge_filter_base { + struct hlist_node hash; + struct list_head list; + __le64 filter_id; + u8 type; +#define BNGE_FLTR_TYPE_L2 2 + u8 flags; + u16 rxq; + u16 fw_vnic_id; + u16 vf_idx; + unsigned long state; +#define BNGE_FLTR_VALID 0 +#define BNGE_FLTR_FW_DELETED 2 + + struct rcu_head rcu; +}; + +struct bnge_l2_key { + union { + struct { + u8 dst_mac_addr[ETH_ALEN]; + u16 vlan; + }; + u32 filter_key; + }; +}; + +#define BNGE_L2_KEY_SIZE (sizeof(struct bnge_l2_key) / 4) +struct bnge_l2_filter { + /* base filter must be the first member */ + struct bnge_filter_base base; + struct bnge_l2_key l2_key; + refcount_t refcnt; +}; + u16 bnge_cp_ring_for_rx(struct bnge_rx_ring_info *rxr); u16 bnge_cp_ring_for_tx(struct bnge_tx_ring_info *txr); void bnge_fill_hw_rss_tbl(struct bnge_net *bn, struct bnge_vnic_info *vnic= ); --=20 2.47.3