[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <fdbab5d5-63e1-49ef-a5a0-95903a469fd9@oracle.com>
Date: Fri, 16 Jan 2026 22:36:09 +0530
From: ALOK TIWARI <alok.a.tiwari@...cle.com>
To: Bhargava Marreddy <bhargava.marreddy@...adcom.com>, davem@...emloft.net,
edumazet@...gle.com, kuba@...nel.org, pabeni@...hat.com,
andrew+netdev@...n.ch, horms@...nel.org
Cc: netdev@...r.kernel.org, linux-kernel@...r.kernel.org,
michael.chan@...adcom.com, pavan.chebbi@...adcom.com,
vsrama-krishna.nemani@...adcom.com, vikas.gupta@...adcom.com,
Rajashekar Hudumula <rajashekar.hudumula@...adcom.com>
Subject: Re: [v4, net-next 2/7] bng_en: Add RX support
On 1/5/2026 12:51 PM, Bhargava Marreddy wrote:
> Add support to receive packet using NAPI, build and deliver the skb
> to stack. With help of meta data available in completions, fill the
> appropriate information in skb.
>
> Signed-off-by: Bhargava Marreddy <bhargava.marreddy@...adcom.com>
> Reviewed-by: Vikas Gupta <vikas.gupta@...adcom.com>
> Reviewed-by: Rajashekar Hudumula <rajashekar.hudumula@...adcom.com>
> ---
> drivers/net/ethernet/broadcom/bnge/Makefile | 3 +-
> .../net/ethernet/broadcom/bnge/bnge_hw_def.h | 198 ++++++
> .../net/ethernet/broadcom/bnge/bnge_netdev.c | 113 +++-
> .../net/ethernet/broadcom/bnge/bnge_netdev.h | 60 +-
> .../net/ethernet/broadcom/bnge/bnge_txrx.c | 573 ++++++++++++++++++
> .../net/ethernet/broadcom/bnge/bnge_txrx.h | 90 +++
> 6 files changed, 1016 insertions(+), 21 deletions(-)
> create mode 100644 drivers/net/ethernet/broadcom/bnge/bnge_hw_def.h
> create mode 100644 drivers/net/ethernet/broadcom/bnge/bnge_txrx.c
> create mode 100644 drivers/net/ethernet/broadcom/bnge/bnge_txrx.h
>
> +
> +static int __bnge_poll_work(struct bnge_net *bn, struct bnge_cp_ring_info *cpr,
> + int budget)
> +{
> + struct bnge_napi *bnapi = cpr->bnapi;
> + u32 raw_cons = cpr->cp_raw_cons;
> + struct tx_cmp *txcmp;
> + int rx_pkts = 0;
> + u8 event = 0;
> + u32 cons;
> +
> + cpr->has_more_work = 0;
> + cpr->had_work_done = 1;
> + while (1) {
> + u8 cmp_type;
> + int rc;
> +
> + cons = RING_CMP(bn, raw_cons);
> + txcmp = &cpr->desc_ring[CP_RING(cons)][CP_IDX(cons)];
> +
> + if (!TX_CMP_VALID(bn, txcmp, raw_cons))
> + break;
> +
> + /* The valid test of the entry must be done first before
> + * reading any further.
> + */
> + dma_rmb();
> + cmp_type = TX_CMP_TYPE(txcmp);
> + if (cmp_type == CMP_TYPE_TX_L2_CMP ||
> + cmp_type == CMP_TYPE_TX_L2_COAL_CMP) {
> + /*
> + * Tx Compl Processng
typo -> Processng
> + */
> + } else if (cmp_type >= CMP_TYPE_RX_L2_CMP &&
> + cmp_type <= CMP_TYPE_RX_L2_TPA_START_V3_CMP) {
> + if (likely(budget))
> + rc = bnge_rx_pkt(bn, cpr, &raw_cons, &event);
> + else
> + rc = bnge_force_rx_discard(bn, cpr, &raw_cons,
> + &event);
> + if (likely(rc >= 0))
> + rx_pkts += rc;
> + /* Increment rx_pkts when rc is -ENOMEM to count towards
> + * the NAPI budget. Otherwise, we may potentially loop
> + * here forever if we consistently cannot allocate
> + * buffers.
> + */
> + else if (rc == -ENOMEM && budget)
> + rx_pkts++;
> + else if (rc == -EBUSY) /* partial completion */
> + break;
> + }
> +
> + raw_cons = NEXT_RAW_CMP(raw_cons);
> +
> + if (rx_pkts && rx_pkts == budget) {
> + cpr->has_more_work = 1;
> + break;
> + }
> + }
> +
> + cpr->cp_raw_cons = raw_cons;
> + bnapi->events |= event;
> + return rx_pkts;
> +}
> diff --git a/drivers/net/ethernet/broadcom/bnge/bnge_txrx.h b/drivers/net/ethernet/broadcom/bnge/bnge_txrx.h
> new file mode 100644
> index 000000000000..b13081b0eb79
> --- /dev/null
> +++ b/drivers/net/ethernet/broadcom/bnge/bnge_txrx.h
> @@ -0,0 +1,90 @@
> +/* SPDX-License-Identifier: GPL-2.0 */
> +/* Copyright (c) 2025 Broadcom */
> +
> +#ifndef _BNGE_TXRX_H_
> +#define _BNGE_TXRX_H_
> +
> +#include <linux/bnxt/hsi.h>
> +#include "bnge_netdev.h"
> +
> +#define BNGE_MIN_PKT_SIZE 52
> +
> +#define TX_OPAQUE_IDX_MASK 0x0000ffff
> +#define TX_OPAQUE_BDS_MASK 0x00ff0000
> +#define TX_OPAQUE_BDS_SHIFT 16
> +#define TX_OPAQUE_RING_MASK 0xff000000
> +#define TX_OPAQUE_RING_SHIFT 24
> +
> +#define SET_TX_OPAQUE(bn, txr, idx, bds) \
> + (((txr)->tx_napi_idx << TX_OPAQUE_RING_SHIFT) | \
> + ((bds) << TX_OPAQUE_BDS_SHIFT) | ((idx) & (bn)->tx_ring_mask))
> +
> +#define TX_OPAQUE_IDX(opq) ((opq) & TX_OPAQUE_IDX_MASK)
> +#define TX_OPAQUE_RING(opq) (((opq) & TX_OPAQUE_RING_MASK) >> \
> + TX_OPAQUE_RING_SHIFT)
> +#define TX_OPAQUE_BDS(opq) (((opq) & TX_OPAQUE_BDS_MASK) >> \
> + TX_OPAQUE_BDS_SHIFT)
> +#define TX_OPAQUE_PROD(bn, opq) ((TX_OPAQUE_IDX(opq) + TX_OPAQUE_BDS(opq)) &\
> + (bn)->tx_ring_mask)
> +
> +/* 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 TX_CMP_VALID(bn, txcmp, raw_cons) \
> + (!!((txcmp)->tx_cmp_errors_v & cpu_to_le32(TX_CMP_V)) == \
> + !((raw_cons) & (bn)->cp_bit))
> +
> +#define RX_CMP_VALID(rxcmp1, raw_cons) \
> + (!!((rxcmp1)->rx_cmp_cfa_code_errors_v2 & cpu_to_le32(RX_CMP_V)) ==\
> + !((raw_cons) & (bn)->cp_bit))
bn is not defined in macro
> +
> +#define RX_AGG_CMP_VALID(bn, agg, raw_cons) \
> + (!!((agg)->rx_agg_cmp_v & cpu_to_le32(RX_AGG_CMP_V)) == \
> + !((raw_cons) & (bn)->cp_bit))
> +
> +#define NQ_CMP_VALID(bn, nqcmp, raw_cons) \
> + (!!((nqcmp)->v & cpu_to_le32(NQ_CN_V)) == !((raw_cons) & (bn)->cp_bit))
> +
> +#define TX_CMP_TYPE(txcmp) \
> + (le32_to_cpu((txcmp)->tx_cmp_flags_type) & CMP_TYPE)
> +
Thanks,
Alok
Powered by blists - more mailing lists