@@ -3365,6 +3365,7 @@ static void be_irq_unregister(struct be_adapter *adapter)
3365
3365
3366
3366
static void be_rx_qs_destroy (struct be_adapter * adapter )
3367
3367
{
3368
+ struct rss_info * rss = & adapter -> rss_info ;
3368
3369
struct be_queue_info * q ;
3369
3370
struct be_rx_obj * rxo ;
3370
3371
int i ;
@@ -3391,6 +3392,12 @@ static void be_rx_qs_destroy(struct be_adapter *adapter)
3391
3392
}
3392
3393
be_queue_free (adapter , q );
3393
3394
}
3395
+
3396
+ if (rss -> rss_flags ) {
3397
+ rss -> rss_flags = RSS_ENABLE_NONE ;
3398
+ be_cmd_rss_config (adapter , rss -> rsstable , rss -> rss_flags ,
3399
+ 128 , rss -> rss_hkey );
3400
+ }
3394
3401
}
3395
3402
3396
3403
static void be_disable_if_filters (struct be_adapter * adapter )
@@ -3511,20 +3518,21 @@ static int be_rx_qs_create(struct be_adapter *adapter)
3511
3518
if (!BEx_chip (adapter ))
3512
3519
rss -> rss_flags |= RSS_ENABLE_UDP_IPV4 |
3513
3520
RSS_ENABLE_UDP_IPV6 ;
3521
+
3522
+ netdev_rss_key_fill (rss_key , RSS_HASH_KEY_LEN );
3523
+ rc = be_cmd_rss_config (adapter , rss -> rsstable , rss -> rss_flags ,
3524
+ RSS_INDIR_TABLE_LEN , rss_key );
3525
+ if (rc ) {
3526
+ rss -> rss_flags = RSS_ENABLE_NONE ;
3527
+ return rc ;
3528
+ }
3529
+
3530
+ memcpy (rss -> rss_hkey , rss_key , RSS_HASH_KEY_LEN );
3514
3531
} else {
3515
3532
/* Disable RSS, if only default RX Q is created */
3516
3533
rss -> rss_flags = RSS_ENABLE_NONE ;
3517
3534
}
3518
3535
3519
- netdev_rss_key_fill (rss_key , RSS_HASH_KEY_LEN );
3520
- rc = be_cmd_rss_config (adapter , rss -> rsstable , rss -> rss_flags ,
3521
- RSS_INDIR_TABLE_LEN , rss_key );
3522
- if (rc ) {
3523
- rss -> rss_flags = RSS_ENABLE_NONE ;
3524
- return rc ;
3525
- }
3526
-
3527
- memcpy (rss -> rss_hkey , rss_key , RSS_HASH_KEY_LEN );
3528
3536
3529
3537
/* Post 1 less than RXQ-len to avoid head being equal to tail,
3530
3538
* which is a queue empty condition
@@ -4306,6 +4314,23 @@ static int be_setup_queues(struct be_adapter *adapter)
4306
4314
return status ;
4307
4315
}
4308
4316
4317
+ static int be_if_create (struct be_adapter * adapter )
4318
+ {
4319
+ u32 en_flags = BE_IF_FLAGS_RSS | BE_IF_FLAGS_DEFQ_RSS ;
4320
+ u32 cap_flags = be_if_cap_flags (adapter );
4321
+ int status ;
4322
+
4323
+ if (adapter -> cfg_num_qs == 1 )
4324
+ cap_flags &= ~(BE_IF_FLAGS_DEFQ_RSS | BE_IF_FLAGS_RSS );
4325
+
4326
+ en_flags &= cap_flags ;
4327
+ /* will enable all the needed filter flags in be_open() */
4328
+ status = be_cmd_if_create (adapter , be_if_cap_flags (adapter ), en_flags ,
4329
+ & adapter -> if_handle , 0 );
4330
+
4331
+ return status ;
4332
+ }
4333
+
4309
4334
int be_update_queues (struct be_adapter * adapter )
4310
4335
{
4311
4336
struct net_device * netdev = adapter -> netdev ;
@@ -4323,13 +4348,20 @@ int be_update_queues(struct be_adapter *adapter)
4323
4348
be_msix_disable (adapter );
4324
4349
4325
4350
be_clear_queues (adapter );
4351
+ status = be_cmd_if_destroy (adapter , adapter -> if_handle , 0 );
4352
+ if (status )
4353
+ return status ;
4326
4354
4327
4355
if (!msix_enabled (adapter )) {
4328
4356
status = be_msix_enable (adapter );
4329
4357
if (status )
4330
4358
return status ;
4331
4359
}
4332
4360
4361
+ status = be_if_create (adapter );
4362
+ if (status )
4363
+ return status ;
4364
+
4333
4365
status = be_setup_queues (adapter );
4334
4366
if (status )
4335
4367
return status ;
@@ -4394,7 +4426,6 @@ static int be_func_init(struct be_adapter *adapter)
4394
4426
static int be_setup (struct be_adapter * adapter )
4395
4427
{
4396
4428
struct device * dev = & adapter -> pdev -> dev ;
4397
- u32 en_flags ;
4398
4429
int status ;
4399
4430
4400
4431
status = be_func_init (adapter );
@@ -4427,10 +4458,7 @@ static int be_setup(struct be_adapter *adapter)
4427
4458
goto err ;
4428
4459
4429
4460
/* will enable all the needed filter flags in be_open() */
4430
- en_flags = BE_IF_FLAGS_RSS | BE_IF_FLAGS_DEFQ_RSS ;
4431
- en_flags = en_flags & be_if_cap_flags (adapter );
4432
- status = be_cmd_if_create (adapter , be_if_cap_flags (adapter ), en_flags ,
4433
- & adapter -> if_handle , 0 );
4461
+ status = be_if_create (adapter );
4434
4462
if (status )
4435
4463
goto err ;
4436
4464
@@ -4803,7 +4831,7 @@ static void be_netdev_init(struct net_device *netdev)
4803
4831
netdev -> hw_features |= NETIF_F_SG | NETIF_F_TSO | NETIF_F_TSO6 |
4804
4832
NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM | NETIF_F_RXCSUM |
4805
4833
NETIF_F_HW_VLAN_CTAG_TX ;
4806
- if (be_multi_rxq ( adapter ))
4834
+ if (( be_if_cap_flags ( adapter ) & BE_IF_FLAGS_RSS ))
4807
4835
netdev -> hw_features |= NETIF_F_RXHASH ;
4808
4836
4809
4837
netdev -> features |= netdev -> hw_features |
0 commit comments