Commit fea41bd7 authored by Pavan Chebbi's avatar Pavan Chebbi Committed by Jakub Kicinski
Browse files

bnxt_en: Introduce rss ctx structure, alloc/free functions



Add struct bnxt_rss_ctx, related storage lists, required
defines, and its alloc/free functions.

Later patches will use them in order to support multiple
RSS contexts.

Reviewed-by: default avatarKalesh AP <kalesh-anakkur.purayil@broadcom.com>
Signed-off-by: default avatarPavan Chebbi <pavan.chebbi@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Link: https://lore.kernel.org/r/20240325222902.220712-6-michael.chan@broadcom.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent a4c11166
Loading
Loading
Loading
Loading
+54 −0
Original line number Diff line number Diff line
@@ -9925,6 +9925,53 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
	return rc;
}

void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
			  bool all)
{
	if (!all)
		return;

	list_del(&rss_ctx->list);
	bp->num_rss_ctx--;
	clear_bit(rss_ctx->index, bp->rss_ctx_bmap);
	kfree(rss_ctx);
}

struct bnxt_rss_ctx *bnxt_alloc_rss_ctx(struct bnxt *bp)
{
	struct bnxt_rss_ctx *rss_ctx = NULL;

	rss_ctx = kzalloc(sizeof(*rss_ctx), GFP_KERNEL);
	if (rss_ctx) {
		rss_ctx->vnic.rss_ctx = rss_ctx;
		list_add_tail(&rss_ctx->list, &bp->rss_ctx_list);
		bp->num_rss_ctx++;
	}
	return rss_ctx;
}

void bnxt_clear_rss_ctxs(struct bnxt *bp, bool all)
{
	struct bnxt_rss_ctx *rss_ctx, *tmp;

	list_for_each_entry_safe(rss_ctx, tmp, &bp->rss_ctx_list, list)
		bnxt_del_one_rss_ctx(bp, rss_ctx, all);

	if (all)
		bitmap_free(bp->rss_ctx_bmap);
}

static void bnxt_init_multi_rss_ctx(struct bnxt *bp)
{
	bp->rss_ctx_bmap = bitmap_zalloc(BNXT_RSS_CTX_BMAP_LEN, GFP_KERNEL);
	if (bp->rss_ctx_bmap) {
		/* burn index 0 since we cannot have context 0 */
		__set_bit(0, bp->rss_ctx_bmap);
		INIT_LIST_HEAD(&bp->rss_ctx_list);
		bp->rss_cap |= BNXT_RSS_CAP_MULTI_RSS_CTX;
	}
}

/* Allow PF, trusted VFs and VFs with default VLAN to be in promiscuous mode */
static bool bnxt_promisc_ok(struct bnxt *bp)
{
@@ -14612,6 +14659,8 @@ static void bnxt_remove_one(struct pci_dev *pdev)
	unregister_netdev(dev);
	bnxt_free_l2_filters(bp, true);
	bnxt_free_ntp_fltrs(bp, true);
	if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
		bnxt_clear_rss_ctxs(bp, true);
	clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
	/* Flush any pending tasks */
	cancel_work_sync(&bp->sp_task);
@@ -15223,6 +15272,9 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)

	INIT_LIST_HEAD(&bp->usr_fltr_list);

	if (BNXT_SUPPORTS_NTUPLE_VNIC(bp))
		bnxt_init_multi_rss_ctx(bp);

	rc = register_netdev(dev);
	if (rc)
		goto init_err_cleanup;
@@ -15243,6 +15295,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
	bnxt_clear_int_mode(bp);

init_err_pci_clean:
	if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
		bnxt_clear_rss_ctxs(bp, true);
	bnxt_hwrm_func_drv_unrgtr(bp);
	bnxt_free_hwrm_resources(bp);
	bnxt_hwmon_uninit(bp);
+24 −0
Original line number Diff line number Diff line
@@ -1256,9 +1256,21 @@ struct bnxt_vnic_info {
#define BNXT_VNIC_UCAST_FLAG	8
#define BNXT_VNIC_RFS_NEW_RSS_FLAG	0x10
#define BNXT_VNIC_NTUPLE_FLAG		0x20
#define BNXT_VNIC_RSSCTX_FLAG		0x40
	struct bnxt_rss_ctx	*rss_ctx;
	u32		vnic_id;
};

struct bnxt_rss_ctx {
	struct list_head list;
	struct bnxt_vnic_info vnic;
	u16	*rss_indir_tbl;
	u8	index;
};

#define BNXT_MAX_ETH_RSS_CTX	32
#define BNXT_RSS_CTX_BMAP_LEN	(BNXT_MAX_ETH_RSS_CTX + 1)

struct bnxt_hw_rings {
	int tx;
	int rx;
@@ -2228,6 +2240,9 @@ struct bnxt {
	/* grp_info indexed by completion ring index */
	struct bnxt_ring_grp_info	*grp_info;
	struct bnxt_vnic_info	*vnic_info;
	struct list_head	rss_ctx_list;
	unsigned long		*rss_ctx_bmap;
	u32			num_rss_ctx;
	int			nr_vnics;
	u16			*rss_indir_tbl;
	u16			rss_indir_tbl_entries;
@@ -2242,6 +2257,7 @@ struct bnxt {
#define BNXT_RSS_CAP_AH_V6_RSS_CAP		BIT(5)
#define BNXT_RSS_CAP_ESP_V4_RSS_CAP		BIT(6)
#define BNXT_RSS_CAP_ESP_V6_RSS_CAP		BIT(7)
#define BNXT_RSS_CAP_MULTI_RSS_CTX		BIT(8)

	u8			rss_hash_key[HW_HASH_KEY_SIZE];
	u8			rss_hash_key_valid:1;
@@ -2341,6 +2357,10 @@ struct bnxt {
#define BNXT_SUPPORTS_NTUPLE_VNIC(bp)	\
	(BNXT_PF(bp) && ((bp)->fw_cap & BNXT_FW_CAP_CFA_RFS_RING_TBL_IDX_V3))

#define BNXT_SUPPORTS_MULTI_RSS_CTX(bp)				\
	(BNXT_PF(bp) && BNXT_SUPPORTS_NTUPLE_VNIC(bp) &&	\
	 ((bp)->rss_cap & BNXT_RSS_CAP_MULTI_RSS_CTX))

	u32			hwrm_spec_code;
	u16			hwrm_cmd_seq;
	u16                     hwrm_cmd_kong_seq;
@@ -2723,6 +2743,10 @@ int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all);
int bnxt_hwrm_func_qcaps(struct bnxt *bp);
int bnxt_hwrm_fw_set_time(struct bnxt *);
int bnxt_hwrm_vnic_rss_cfg_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic);
void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
			  bool all);
struct bnxt_rss_ctx *bnxt_alloc_rss_ctx(struct bnxt *bp);
void bnxt_clear_rss_ctxs(struct bnxt *bp, bool all);
int bnxt_open_nic(struct bnxt *, bool, bool);
int bnxt_half_open_nic(struct bnxt *bp);
void bnxt_half_close_nic(struct bnxt *bp);
+2 −0
Original line number Diff line number Diff line
@@ -969,6 +969,8 @@ static int bnxt_set_channels(struct net_device *dev,
	}

	bnxt_clear_usr_fltrs(bp, true);
	if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
		bnxt_clear_rss_ctxs(bp, false);
	if (netif_running(dev)) {
		if (BNXT_PF(bp)) {
			/* TODO CHIMP_FW: Send message to all VF's