@@ -5970,17 +5970,20 @@ bnxt_cfg_rfs_ring_tbl_idx(struct bnxt *bp,
5970
5970
struct hwrm_cfa_ntuple_filter_alloc_input * req ,
5971
5971
struct bnxt_ntuple_filter * fltr )
5972
5972
{
5973
- struct bnxt_rss_ctx * rss_ctx , * tmp ;
5974
5973
u16 rxq = fltr -> base .rxq ;
5975
5974
5976
5975
if (fltr -> base .flags & BNXT_ACT_RSS_CTX ) {
5977
- list_for_each_entry_safe ( rss_ctx , tmp , & bp -> rss_ctx_list , list ) {
5978
- if ( rss_ctx -> index == fltr -> base . fw_vnic_id ) {
5979
- struct bnxt_vnic_info * vnic = & rss_ctx -> vnic ;
5976
+ struct ethtool_rxfh_context * ctx ;
5977
+ struct bnxt_rss_ctx * rss_ctx ;
5978
+ struct bnxt_vnic_info * vnic ;
5980
5979
5981
- req -> dst_id = cpu_to_le16 (vnic -> fw_vnic_id );
5982
- break ;
5983
- }
5980
+ ctx = xa_load (& bp -> dev -> ethtool -> rss_ctx ,
5981
+ fltr -> base .fw_vnic_id );
5982
+ if (ctx ) {
5983
+ rss_ctx = ethtool_rxfh_context_priv (ctx );
5984
+ vnic = & rss_ctx -> vnic ;
5985
+
5986
+ req -> dst_id = cpu_to_le16 (vnic -> fw_vnic_id );
5984
5987
}
5985
5988
return ;
5986
5989
}
@@ -6219,33 +6222,29 @@ static u16 bnxt_cp_ring_for_tx(struct bnxt *bp, struct bnxt_tx_ring_info *txr)
6219
6222
return bnxt_cp_ring_from_grp (bp , & txr -> tx_ring_struct );
6220
6223
}
6221
6224
6222
- int bnxt_alloc_rss_indir_tbl (struct bnxt * bp , struct bnxt_rss_ctx * rss_ctx )
6225
+ static int bnxt_alloc_rss_indir_tbl (struct bnxt * bp )
6223
6226
{
6224
6227
int entries ;
6225
- u16 * tbl ;
6226
6228
6227
6229
if (bp -> flags & BNXT_FLAG_CHIP_P5_PLUS )
6228
6230
entries = BNXT_MAX_RSS_TABLE_ENTRIES_P5 ;
6229
6231
else
6230
6232
entries = HW_HASH_INDEX_SIZE ;
6231
6233
6232
6234
bp -> rss_indir_tbl_entries = entries ;
6233
- tbl = kmalloc_array (entries , sizeof (* bp -> rss_indir_tbl ), GFP_KERNEL );
6234
- if (!tbl )
6235
+ bp -> rss_indir_tbl =
6236
+ kmalloc_array (entries , sizeof (* bp -> rss_indir_tbl ), GFP_KERNEL );
6237
+ if (!bp -> rss_indir_tbl )
6235
6238
return - ENOMEM ;
6236
6239
6237
- if (rss_ctx )
6238
- rss_ctx -> rss_indir_tbl = tbl ;
6239
- else
6240
- bp -> rss_indir_tbl = tbl ;
6241
-
6242
6240
return 0 ;
6243
6241
}
6244
6242
6245
- void bnxt_set_dflt_rss_indir_tbl (struct bnxt * bp , struct bnxt_rss_ctx * rss_ctx )
6243
+ void bnxt_set_dflt_rss_indir_tbl (struct bnxt * bp ,
6244
+ struct ethtool_rxfh_context * rss_ctx )
6246
6245
{
6247
6246
u16 max_rings , max_entries , pad , i ;
6248
- u16 * rss_indir_tbl ;
6247
+ u32 * rss_indir_tbl ;
6249
6248
6250
6249
if (!bp -> rx_nr_rings )
6251
6250
return ;
@@ -6257,7 +6256,7 @@ void bnxt_set_dflt_rss_indir_tbl(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx)
6257
6256
6258
6257
max_entries = bnxt_get_rxfh_indir_size (bp -> dev );
6259
6258
if (rss_ctx )
6260
- rss_indir_tbl = & rss_ctx -> rss_indir_tbl [ 0 ] ;
6259
+ rss_indir_tbl = ethtool_rxfh_context_indir ( rss_ctx ) ;
6261
6260
else
6262
6261
rss_indir_tbl = & bp -> rss_indir_tbl [0 ];
6263
6262
@@ -6266,12 +6265,12 @@ void bnxt_set_dflt_rss_indir_tbl(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx)
6266
6265
6267
6266
pad = bp -> rss_indir_tbl_entries - max_entries ;
6268
6267
if (pad )
6269
- memset (& rss_indir_tbl [i ], 0 , pad * sizeof (u16 ));
6268
+ memset (& rss_indir_tbl [i ], 0 , pad * sizeof (* rss_indir_tbl ));
6270
6269
}
6271
6270
6272
6271
static u16 bnxt_get_max_rss_ring (struct bnxt * bp )
6273
6272
{
6274
- u16 i , tbl_size , max_ring = 0 ;
6273
+ u32 i , tbl_size , max_ring = 0 ;
6275
6274
6276
6275
if (!bp -> rss_indir_tbl )
6277
6276
return 0 ;
@@ -6282,21 +6281,6 @@ static u16 bnxt_get_max_rss_ring(struct bnxt *bp)
6282
6281
return max_ring ;
6283
6282
}
6284
6283
6285
- u16 bnxt_get_max_rss_ctx_ring (struct bnxt * bp )
6286
- {
6287
- u16 i , tbl_size , max_ring = 0 ;
6288
- struct bnxt_rss_ctx * rss_ctx ;
6289
-
6290
- tbl_size = bnxt_get_rxfh_indir_size (bp -> dev );
6291
-
6292
- list_for_each_entry (rss_ctx , & bp -> rss_ctx_list , list ) {
6293
- for (i = 0 ; i < tbl_size ; i ++ )
6294
- max_ring = max (max_ring , rss_ctx -> rss_indir_tbl [i ]);
6295
- }
6296
-
6297
- return max_ring ;
6298
- }
6299
-
6300
6284
int bnxt_get_nr_rss_ctxs (struct bnxt * bp , int rx_rings )
6301
6285
{
6302
6286
if (bp -> flags & BNXT_FLAG_CHIP_P5_PLUS ) {
@@ -6338,7 +6322,7 @@ static void bnxt_fill_hw_rss_tbl_p5(struct bnxt *bp,
6338
6322
if (vnic -> flags & BNXT_VNIC_NTUPLE_FLAG )
6339
6323
j = ethtool_rxfh_indir_default (i , bp -> rx_nr_rings );
6340
6324
else if (vnic -> flags & BNXT_VNIC_RSSCTX_FLAG )
6341
- j = vnic -> rss_ctx -> rss_indir_tbl [i ];
6325
+ j = ethtool_rxfh_context_indir ( vnic -> rss_ctx ) [i ];
6342
6326
else
6343
6327
j = bp -> rss_indir_tbl [i ];
6344
6328
rxr = & bp -> rx_ring [j ];
@@ -10210,10 +10194,12 @@ void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
10210
10194
struct bnxt_ntuple_filter * ntp_fltr ;
10211
10195
int i ;
10212
10196
10213
- bnxt_hwrm_vnic_free_one (bp , & rss_ctx -> vnic );
10214
- for (i = 0 ; i < BNXT_MAX_CTX_PER_VNIC ; i ++ ) {
10215
- if (vnic -> fw_rss_cos_lb_ctx [i ] != INVALID_HW_RING_ID )
10216
- bnxt_hwrm_vnic_ctx_free_one (bp , vnic , i );
10197
+ if (netif_running (bp -> dev )) {
10198
+ bnxt_hwrm_vnic_free_one (bp , & rss_ctx -> vnic );
10199
+ for (i = 0 ; i < BNXT_MAX_CTX_PER_VNIC ; i ++ ) {
10200
+ if (vnic -> fw_rss_cos_lb_ctx [i ] != INVALID_HW_RING_ID )
10201
+ bnxt_hwrm_vnic_ctx_free_one (bp , vnic , i );
10202
+ }
10217
10203
}
10218
10204
if (!all )
10219
10205
return ;
@@ -10234,19 +10220,17 @@ void bnxt_del_one_rss_ctx(struct bnxt *bp, struct bnxt_rss_ctx *rss_ctx,
10234
10220
dma_free_coherent (& bp -> pdev -> dev , vnic -> rss_table_size ,
10235
10221
vnic -> rss_table ,
10236
10222
vnic -> rss_table_dma_addr );
10237
- kfree (rss_ctx -> rss_indir_tbl );
10238
- list_del (& rss_ctx -> list );
10239
10223
bp -> num_rss_ctx -- ;
10240
- clear_bit (rss_ctx -> index , bp -> rss_ctx_bmap );
10241
- kfree (rss_ctx );
10242
10224
}
10243
10225
10244
10226
static void bnxt_hwrm_realloc_rss_ctx_vnic (struct bnxt * bp )
10245
10227
{
10246
10228
bool set_tpa = !!(bp -> flags & BNXT_FLAG_TPA );
10247
- struct bnxt_rss_ctx * rss_ctx , * tmp ;
10229
+ struct ethtool_rxfh_context * ctx ;
10230
+ unsigned long context ;
10248
10231
10249
- list_for_each_entry_safe (rss_ctx , tmp , & bp -> rss_ctx_list , list ) {
10232
+ xa_for_each (& bp -> dev -> ethtool -> rss_ctx , context , ctx ) {
10233
+ struct bnxt_rss_ctx * rss_ctx = ethtool_rxfh_context_priv (ctx );
10250
10234
struct bnxt_vnic_info * vnic = & rss_ctx -> vnic ;
10251
10235
10252
10236
if (bnxt_hwrm_vnic_alloc (bp , vnic , 0 , bp -> rx_nr_rings ) ||
@@ -10255,42 +10239,20 @@ static void bnxt_hwrm_realloc_rss_ctx_vnic(struct bnxt *bp)
10255
10239
netdev_err (bp -> dev , "Failed to restore RSS ctx %d\n" ,
10256
10240
rss_ctx -> index );
10257
10241
bnxt_del_one_rss_ctx (bp , rss_ctx , true);
10242
+ ethtool_rxfh_context_lost (bp -> dev , rss_ctx -> index );
10258
10243
}
10259
10244
}
10260
10245
}
10261
10246
10262
- struct bnxt_rss_ctx * bnxt_alloc_rss_ctx (struct bnxt * bp )
10263
- {
10264
- struct bnxt_rss_ctx * rss_ctx = NULL ;
10265
-
10266
- rss_ctx = kzalloc (sizeof (* rss_ctx ), GFP_KERNEL );
10267
- if (rss_ctx ) {
10268
- rss_ctx -> vnic .rss_ctx = rss_ctx ;
10269
- list_add_tail (& rss_ctx -> list , & bp -> rss_ctx_list );
10270
- bp -> num_rss_ctx ++ ;
10271
- }
10272
- return rss_ctx ;
10273
- }
10274
-
10275
- void bnxt_clear_rss_ctxs (struct bnxt * bp , bool all )
10247
+ void bnxt_clear_rss_ctxs (struct bnxt * bp )
10276
10248
{
10277
- struct bnxt_rss_ctx * rss_ctx , * tmp ;
10249
+ struct ethtool_rxfh_context * ctx ;
10250
+ unsigned long context ;
10278
10251
10279
- list_for_each_entry_safe ( rss_ctx , tmp , & bp -> rss_ctx_list , list )
10280
- bnxt_del_one_rss_ctx ( bp , rss_ctx , all );
10252
+ xa_for_each ( & bp -> dev -> ethtool -> rss_ctx , context , ctx ) {
10253
+ struct bnxt_rss_ctx * rss_ctx = ethtool_rxfh_context_priv ( ctx );
10281
10254
10282
- if (all )
10283
- bitmap_free (bp -> rss_ctx_bmap );
10284
- }
10285
-
10286
- static void bnxt_init_multi_rss_ctx (struct bnxt * bp )
10287
- {
10288
- bp -> rss_ctx_bmap = bitmap_zalloc (BNXT_RSS_CTX_BMAP_LEN , GFP_KERNEL );
10289
- if (bp -> rss_ctx_bmap ) {
10290
- /* burn index 0 since we cannot have context 0 */
10291
- __set_bit (0 , bp -> rss_ctx_bmap );
10292
- INIT_LIST_HEAD (& bp -> rss_ctx_list );
10293
- bp -> rss_cap |= BNXT_RSS_CAP_MULTI_RSS_CTX ;
10255
+ bnxt_del_one_rss_ctx (bp , rss_ctx , false);
10294
10256
}
10295
10257
}
10296
10258
@@ -12337,7 +12299,7 @@ static void __bnxt_close_nic(struct bnxt *bp, bool irq_re_init,
12337
12299
msleep (20 );
12338
12300
12339
12301
if (BNXT_SUPPORTS_MULTI_RSS_CTX (bp ))
12340
- bnxt_clear_rss_ctxs (bp , false );
12302
+ bnxt_clear_rss_ctxs (bp );
12341
12303
/* Flush rings and disable interrupts */
12342
12304
bnxt_shutdown_nic (bp , irq_re_init );
12343
12305
@@ -15252,8 +15214,7 @@ static void bnxt_remove_one(struct pci_dev *pdev)
15252
15214
15253
15215
bnxt_free_l2_filters (bp , true);
15254
15216
bnxt_free_ntp_fltrs (bp , true);
15255
- if (BNXT_SUPPORTS_MULTI_RSS_CTX (bp ))
15256
- bnxt_clear_rss_ctxs (bp , true);
15217
+ WARN_ON (bp -> num_rss_ctx );
15257
15218
clear_bit (BNXT_STATE_IN_FW_RESET , & bp -> state );
15258
15219
/* Flush any pending tasks */
15259
15220
cancel_work_sync (& bp -> sp_task );
@@ -15723,7 +15684,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
15723
15684
bp -> flags |= BNXT_FLAG_CHIP_P7 ;
15724
15685
}
15725
15686
15726
- rc = bnxt_alloc_rss_indir_tbl (bp , NULL );
15687
+ rc = bnxt_alloc_rss_indir_tbl (bp );
15727
15688
if (rc )
15728
15689
goto init_err_pci_clean ;
15729
15690
@@ -15880,8 +15841,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
15880
15841
INIT_LIST_HEAD (& bp -> usr_fltr_list );
15881
15842
15882
15843
if (BNXT_SUPPORTS_NTUPLE_VNIC (bp ))
15883
- bnxt_init_multi_rss_ctx (bp );
15884
-
15844
+ bp -> rss_cap |= BNXT_RSS_CAP_MULTI_RSS_CTX ;
15885
15845
15886
15846
rc = register_netdev (dev );
15887
15847
if (rc )
@@ -15904,8 +15864,6 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
15904
15864
bnxt_clear_int_mode (bp );
15905
15865
15906
15866
init_err_pci_clean :
15907
- if (BNXT_SUPPORTS_MULTI_RSS_CTX (bp ))
15908
- bnxt_clear_rss_ctxs (bp , true);
15909
15867
bnxt_hwrm_func_drv_unrgtr (bp );
15910
15868
bnxt_free_hwrm_resources (bp );
15911
15869
bnxt_hwmon_uninit (bp );
0 commit comments