Skip to content

Commit fea41bd

Browse files
Pavan Chebbikuba-moo
authored andcommitted
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: Kalesh AP <[email protected]> Signed-off-by: Pavan Chebbi <[email protected]> Signed-off-by: Michael Chan <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
1 parent a4c1116 commit fea41bd

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt.c

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9925,6 +9925,53 @@ static int bnxt_alloc_rfs_vnics(struct bnxt *bp)
99259925
return rc;
99269926
}
99279927

9928+
void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
9929+
bool all)
9930+
{
9931+
if (!all)
9932+
return;
9933+
9934+
list_del(&rss_ctx->list);
9935+
bp->num_rss_ctx--;
9936+
clear_bit(rss_ctx->index, bp->rss_ctx_bmap);
9937+
kfree(rss_ctx);
9938+
}
9939+
9940+
struct bnxt_rss_ctx *bnxt_alloc_rss_ctx(struct bnxt *bp)
9941+
{
9942+
struct bnxt_rss_ctx *rss_ctx = NULL;
9943+
9944+
rss_ctx = kzalloc(sizeof(*rss_ctx), GFP_KERNEL);
9945+
if (rss_ctx) {
9946+
rss_ctx->vnic.rss_ctx = rss_ctx;
9947+
list_add_tail(&rss_ctx->list, &bp->rss_ctx_list);
9948+
bp->num_rss_ctx++;
9949+
}
9950+
return rss_ctx;
9951+
}
9952+
9953+
void bnxt_clear_rss_ctxs(struct bnxt *bp, bool all)
9954+
{
9955+
struct bnxt_rss_ctx *rss_ctx, *tmp;
9956+
9957+
list_for_each_entry_safe(rss_ctx, tmp, &bp->rss_ctx_list, list)
9958+
bnxt_del_one_rss_ctx(bp, rss_ctx, all);
9959+
9960+
if (all)
9961+
bitmap_free(bp->rss_ctx_bmap);
9962+
}
9963+
9964+
static void bnxt_init_multi_rss_ctx(struct bnxt *bp)
9965+
{
9966+
bp->rss_ctx_bmap = bitmap_zalloc(BNXT_RSS_CTX_BMAP_LEN, GFP_KERNEL);
9967+
if (bp->rss_ctx_bmap) {
9968+
/* burn index 0 since we cannot have context 0 */
9969+
__set_bit(0, bp->rss_ctx_bmap);
9970+
INIT_LIST_HEAD(&bp->rss_ctx_list);
9971+
bp->rss_cap |= BNXT_RSS_CAP_MULTI_RSS_CTX;
9972+
}
9973+
}
9974+
99289975
/* Allow PF, trusted VFs and VFs with default VLAN to be in promiscuous mode */
99299976
static bool bnxt_promisc_ok(struct bnxt *bp)
99309977
{
@@ -14612,6 +14659,8 @@ static void bnxt_remove_one(struct pci_dev *pdev)
1461214659
unregister_netdev(dev);
1461314660
bnxt_free_l2_filters(bp, true);
1461414661
bnxt_free_ntp_fltrs(bp, true);
14662+
if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
14663+
bnxt_clear_rss_ctxs(bp, true);
1461514664
clear_bit(BNXT_STATE_IN_FW_RESET, &bp->state);
1461614665
/* Flush any pending tasks */
1461714666
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)
1522315272

1522415273
INIT_LIST_HEAD(&bp->usr_fltr_list);
1522515274

15275+
if (BNXT_SUPPORTS_NTUPLE_VNIC(bp))
15276+
bnxt_init_multi_rss_ctx(bp);
15277+
1522615278
rc = register_netdev(dev);
1522715279
if (rc)
1522815280
goto init_err_cleanup;
@@ -15243,6 +15295,8 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
1524315295
bnxt_clear_int_mode(bp);
1524415296

1524515297
init_err_pci_clean:
15298+
if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
15299+
bnxt_clear_rss_ctxs(bp, true);
1524615300
bnxt_hwrm_func_drv_unrgtr(bp);
1524715301
bnxt_free_hwrm_resources(bp);
1524815302
bnxt_hwmon_uninit(bp);

drivers/net/ethernet/broadcom/bnxt/bnxt.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,9 +1256,21 @@ struct bnxt_vnic_info {
12561256
#define BNXT_VNIC_UCAST_FLAG 8
12571257
#define BNXT_VNIC_RFS_NEW_RSS_FLAG 0x10
12581258
#define BNXT_VNIC_NTUPLE_FLAG 0x20
1259+
#define BNXT_VNIC_RSSCTX_FLAG 0x40
1260+
struct bnxt_rss_ctx *rss_ctx;
12591261
u32 vnic_id;
12601262
};
12611263

1264+
struct bnxt_rss_ctx {
1265+
struct list_head list;
1266+
struct bnxt_vnic_info vnic;
1267+
u16 *rss_indir_tbl;
1268+
u8 index;
1269+
};
1270+
1271+
#define BNXT_MAX_ETH_RSS_CTX 32
1272+
#define BNXT_RSS_CTX_BMAP_LEN (BNXT_MAX_ETH_RSS_CTX + 1)
1273+
12621274
struct bnxt_hw_rings {
12631275
int tx;
12641276
int rx;
@@ -2228,6 +2240,9 @@ struct bnxt {
22282240
/* grp_info indexed by completion ring index */
22292241
struct bnxt_ring_grp_info *grp_info;
22302242
struct bnxt_vnic_info *vnic_info;
2243+
struct list_head rss_ctx_list;
2244+
unsigned long *rss_ctx_bmap;
2245+
u32 num_rss_ctx;
22312246
int nr_vnics;
22322247
u16 *rss_indir_tbl;
22332248
u16 rss_indir_tbl_entries;
@@ -2242,6 +2257,7 @@ struct bnxt {
22422257
#define BNXT_RSS_CAP_AH_V6_RSS_CAP BIT(5)
22432258
#define BNXT_RSS_CAP_ESP_V4_RSS_CAP BIT(6)
22442259
#define BNXT_RSS_CAP_ESP_V6_RSS_CAP BIT(7)
2260+
#define BNXT_RSS_CAP_MULTI_RSS_CTX BIT(8)
22452261

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

2360+
#define BNXT_SUPPORTS_MULTI_RSS_CTX(bp) \
2361+
(BNXT_PF(bp) && BNXT_SUPPORTS_NTUPLE_VNIC(bp) && \
2362+
((bp)->rss_cap & BNXT_RSS_CAP_MULTI_RSS_CTX))
2363+
23442364
u32 hwrm_spec_code;
23452365
u16 hwrm_cmd_seq;
23462366
u16 hwrm_cmd_kong_seq;
@@ -2723,6 +2743,10 @@ int bnxt_hwrm_func_resc_qcaps(struct bnxt *bp, bool all);
27232743
int bnxt_hwrm_func_qcaps(struct bnxt *bp);
27242744
int bnxt_hwrm_fw_set_time(struct bnxt *);
27252745
int bnxt_hwrm_vnic_rss_cfg_p5(struct bnxt *bp, struct bnxt_vnic_info *vnic);
2746+
void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
2747+
bool all);
2748+
struct bnxt_rss_ctx *bnxt_alloc_rss_ctx(struct bnxt *bp);
2749+
void bnxt_clear_rss_ctxs(struct bnxt *bp, bool all);
27262750
int bnxt_open_nic(struct bnxt *, bool, bool);
27272751
int bnxt_half_open_nic(struct bnxt *bp);
27282752
void bnxt_half_close_nic(struct bnxt *bp);

drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -969,6 +969,8 @@ static int bnxt_set_channels(struct net_device *dev,
969969
}
970970

971971
bnxt_clear_usr_fltrs(bp, true);
972+
if (BNXT_SUPPORTS_MULTI_RSS_CTX(bp))
973+
bnxt_clear_rss_ctxs(bp, false);
972974
if (netif_running(dev)) {
973975
if (BNXT_PF(bp)) {
974976
/* TODO CHIMP_FW: Send message to all VF's

0 commit comments

Comments
 (0)