@@ -4023,7 +4023,10 @@ int be_cmd_get_acpi_wol_cap(struct be_adapter *adapter)
4023
4023
resp = (struct be_cmd_resp_acpi_wol_magic_config_v1 * )cmd .va ;
4024
4024
4025
4025
adapter -> wol_cap = resp -> wol_settings ;
4026
- if (adapter -> wol_cap & BE_WOL_CAP )
4026
+
4027
+ /* Non-zero macaddr indicates WOL is enabled */
4028
+ if (adapter -> wol_cap & BE_WOL_CAP &&
4029
+ !is_zero_ether_addr (resp -> magic_mac ))
4027
4030
adapter -> wol_en = true;
4028
4031
}
4029
4032
err :
@@ -4360,9 +4363,35 @@ int be_cmd_get_func_config(struct be_adapter *adapter, struct be_resources *res)
4360
4363
return status ;
4361
4364
}
4362
4365
4366
+ /* This routine returns a list of all the NIC PF_nums in the adapter */
4367
+ u16 be_get_nic_pf_num_list (u8 * buf , u32 desc_count , u16 * nic_pf_nums )
4368
+ {
4369
+ struct be_res_desc_hdr * hdr = (struct be_res_desc_hdr * )buf ;
4370
+ struct be_pcie_res_desc * pcie = NULL ;
4371
+ int i ;
4372
+ u16 nic_pf_count = 0 ;
4373
+
4374
+ for (i = 0 ; i < desc_count ; i ++ ) {
4375
+ if (hdr -> desc_type == PCIE_RESOURCE_DESC_TYPE_V0 ||
4376
+ hdr -> desc_type == PCIE_RESOURCE_DESC_TYPE_V1 ) {
4377
+ pcie = (struct be_pcie_res_desc * )hdr ;
4378
+ if (pcie -> pf_state && (pcie -> pf_type == MISSION_NIC ||
4379
+ pcie -> pf_type == MISSION_RDMA )) {
4380
+ nic_pf_nums [nic_pf_count ++ ] = pcie -> pf_num ;
4381
+ }
4382
+ }
4383
+
4384
+ hdr -> desc_len = hdr -> desc_len ? : RESOURCE_DESC_SIZE_V0 ;
4385
+ hdr = (void * )hdr + hdr -> desc_len ;
4386
+ }
4387
+ return nic_pf_count ;
4388
+ }
4389
+
4363
4390
/* Will use MBOX only if MCCQ has not been created */
4364
4391
int be_cmd_get_profile_config (struct be_adapter * adapter ,
4365
- struct be_resources * res , u8 query , u8 domain )
4392
+ struct be_resources * res ,
4393
+ struct be_port_resources * port_res ,
4394
+ u8 profile_type , u8 query , u8 domain )
4366
4395
{
4367
4396
struct be_cmd_resp_get_profile_config * resp ;
4368
4397
struct be_cmd_req_get_profile_config * req ;
@@ -4389,7 +4418,7 @@ int be_cmd_get_profile_config(struct be_adapter *adapter,
4389
4418
4390
4419
if (!lancer_chip (adapter ))
4391
4420
req -> hdr .version = 1 ;
4392
- req -> type = ACTIVE_PROFILE_TYPE ;
4421
+ req -> type = profile_type ;
4393
4422
req -> hdr .domain = domain ;
4394
4423
4395
4424
/* When QUERY_MODIFIABLE_FIELDS_TYPE bit is set, cmd returns the
@@ -4406,6 +4435,28 @@ int be_cmd_get_profile_config(struct be_adapter *adapter,
4406
4435
resp = cmd .va ;
4407
4436
desc_count = le16_to_cpu (resp -> desc_count );
4408
4437
4438
+ if (port_res ) {
4439
+ u16 nic_pf_cnt = 0 , i ;
4440
+ u16 nic_pf_num_list [MAX_NIC_FUNCS ];
4441
+
4442
+ nic_pf_cnt = be_get_nic_pf_num_list (resp -> func_param ,
4443
+ desc_count ,
4444
+ nic_pf_num_list );
4445
+
4446
+ for (i = 0 ; i < nic_pf_cnt ; i ++ ) {
4447
+ nic = be_get_func_nic_desc (resp -> func_param , desc_count ,
4448
+ nic_pf_num_list [i ]);
4449
+ if (nic -> link_param == adapter -> port_num ) {
4450
+ port_res -> nic_pfs ++ ;
4451
+ pcie = be_get_pcie_desc (resp -> func_param ,
4452
+ desc_count ,
4453
+ nic_pf_num_list [i ]);
4454
+ port_res -> max_vfs += le16_to_cpu (pcie -> num_vfs );
4455
+ }
4456
+ }
4457
+ return status ;
4458
+ }
4459
+
4409
4460
pcie = be_get_pcie_desc (resp -> func_param , desc_count ,
4410
4461
adapter -> pf_num );
4411
4462
if (pcie )
@@ -4465,7 +4516,7 @@ static int be_cmd_set_profile_config(struct be_adapter *adapter, void *desc,
4465
4516
}
4466
4517
4467
4518
/* Mark all fields invalid */
4468
- static void be_reset_nic_desc (struct be_nic_res_desc * nic )
4519
+ void be_reset_nic_desc (struct be_nic_res_desc * nic )
4469
4520
{
4470
4521
memset (nic , 0 , sizeof (* nic ));
4471
4522
nic -> unicast_mac_count = 0xFFFF ;
@@ -4534,73 +4585,9 @@ int be_cmd_config_qos(struct be_adapter *adapter, u32 max_rate, u16 link_speed,
4534
4585
1 , version , domain );
4535
4586
}
4536
4587
4537
- static void be_fill_vf_res_template (struct be_adapter * adapter ,
4538
- struct be_resources pool_res ,
4539
- u16 num_vfs , u16 num_vf_qs ,
4540
- struct be_nic_res_desc * nic_vft )
4541
- {
4542
- u32 vf_if_cap_flags = pool_res .vf_if_cap_flags ;
4543
- struct be_resources res_mod = {0 };
4544
-
4545
- /* Resource with fields set to all '1's by GET_PROFILE_CONFIG cmd,
4546
- * which are modifiable using SET_PROFILE_CONFIG cmd.
4547
- */
4548
- be_cmd_get_profile_config (adapter , & res_mod , RESOURCE_MODIFIABLE , 0 );
4549
-
4550
- /* If RSS IFACE capability flags are modifiable for a VF, set the
4551
- * capability flag as valid and set RSS and DEFQ_RSS IFACE flags if
4552
- * more than 1 RSSQ is available for a VF.
4553
- * Otherwise, provision only 1 queue pair for VF.
4554
- */
4555
- if (res_mod .vf_if_cap_flags & BE_IF_FLAGS_RSS ) {
4556
- nic_vft -> flags |= BIT (IF_CAPS_FLAGS_VALID_SHIFT );
4557
- if (num_vf_qs > 1 ) {
4558
- vf_if_cap_flags |= BE_IF_FLAGS_RSS ;
4559
- if (pool_res .if_cap_flags & BE_IF_FLAGS_DEFQ_RSS )
4560
- vf_if_cap_flags |= BE_IF_FLAGS_DEFQ_RSS ;
4561
- } else {
4562
- vf_if_cap_flags &= ~(BE_IF_FLAGS_RSS |
4563
- BE_IF_FLAGS_DEFQ_RSS );
4564
- }
4565
- } else {
4566
- num_vf_qs = 1 ;
4567
- }
4568
-
4569
- if (res_mod .vf_if_cap_flags & BE_IF_FLAGS_VLAN_PROMISCUOUS ) {
4570
- nic_vft -> flags |= BIT (IF_CAPS_FLAGS_VALID_SHIFT );
4571
- vf_if_cap_flags &= ~BE_IF_FLAGS_VLAN_PROMISCUOUS ;
4572
- }
4573
-
4574
- nic_vft -> cap_flags = cpu_to_le32 (vf_if_cap_flags );
4575
- nic_vft -> rq_count = cpu_to_le16 (num_vf_qs );
4576
- nic_vft -> txq_count = cpu_to_le16 (num_vf_qs );
4577
- nic_vft -> rssq_count = cpu_to_le16 (num_vf_qs );
4578
- nic_vft -> cq_count = cpu_to_le16 (pool_res .max_cq_count /
4579
- (num_vfs + 1 ));
4580
-
4581
- /* Distribute unicast MACs, VLANs, IFACE count and MCCQ count equally
4582
- * among the PF and it's VFs, if the fields are changeable
4583
- */
4584
- if (res_mod .max_uc_mac == FIELD_MODIFIABLE )
4585
- nic_vft -> unicast_mac_count = cpu_to_le16 (pool_res .max_uc_mac /
4586
- (num_vfs + 1 ));
4587
-
4588
- if (res_mod .max_vlans == FIELD_MODIFIABLE )
4589
- nic_vft -> vlan_count = cpu_to_le16 (pool_res .max_vlans /
4590
- (num_vfs + 1 ));
4591
-
4592
- if (res_mod .max_iface_count == FIELD_MODIFIABLE )
4593
- nic_vft -> iface_count = cpu_to_le16 (pool_res .max_iface_count /
4594
- (num_vfs + 1 ));
4595
-
4596
- if (res_mod .max_mcc_count == FIELD_MODIFIABLE )
4597
- nic_vft -> mcc_count = cpu_to_le16 (pool_res .max_mcc_count /
4598
- (num_vfs + 1 ));
4599
- }
4600
-
4601
4588
int be_cmd_set_sriov_config (struct be_adapter * adapter ,
4602
4589
struct be_resources pool_res , u16 num_vfs ,
4603
- u16 num_vf_qs )
4590
+ struct be_resources * vft_res )
4604
4591
{
4605
4592
struct {
4606
4593
struct be_pcie_res_desc pcie ;
@@ -4620,12 +4607,26 @@ int be_cmd_set_sriov_config(struct be_adapter *adapter,
4620
4607
be_reset_nic_desc (& desc .nic_vft );
4621
4608
desc .nic_vft .hdr .desc_type = NIC_RESOURCE_DESC_TYPE_V1 ;
4622
4609
desc .nic_vft .hdr .desc_len = RESOURCE_DESC_SIZE_V1 ;
4623
- desc .nic_vft .flags = BIT (VFT_SHIFT ) | BIT (IMM_SHIFT ) | BIT (NOSV_SHIFT );
4610
+ desc .nic_vft .flags = vft_res -> flags | BIT (VFT_SHIFT ) |
4611
+ BIT (IMM_SHIFT ) | BIT (NOSV_SHIFT );
4624
4612
desc .nic_vft .pf_num = adapter -> pdev -> devfn ;
4625
4613
desc .nic_vft .vf_num = 0 ;
4626
-
4627
- be_fill_vf_res_template (adapter , pool_res , num_vfs , num_vf_qs ,
4628
- & desc .nic_vft );
4614
+ desc .nic_vft .cap_flags = cpu_to_le32 (vft_res -> vf_if_cap_flags );
4615
+ desc .nic_vft .rq_count = cpu_to_le16 (vft_res -> max_rx_qs );
4616
+ desc .nic_vft .txq_count = cpu_to_le16 (vft_res -> max_tx_qs );
4617
+ desc .nic_vft .rssq_count = cpu_to_le16 (vft_res -> max_rss_qs );
4618
+ desc .nic_vft .cq_count = cpu_to_le16 (vft_res -> max_cq_count );
4619
+
4620
+ if (vft_res -> max_uc_mac )
4621
+ desc .nic_vft .unicast_mac_count =
4622
+ cpu_to_le16 (vft_res -> max_uc_mac );
4623
+ if (vft_res -> max_vlans )
4624
+ desc .nic_vft .vlan_count = cpu_to_le16 (vft_res -> max_vlans );
4625
+ if (vft_res -> max_iface_count )
4626
+ desc .nic_vft .iface_count =
4627
+ cpu_to_le16 (vft_res -> max_iface_count );
4628
+ if (vft_res -> max_mcc_count )
4629
+ desc .nic_vft .mcc_count = cpu_to_le16 (vft_res -> max_mcc_count );
4629
4630
4630
4631
return be_cmd_set_profile_config (adapter , & desc ,
4631
4632
2 * RESOURCE_DESC_SIZE_V1 , 2 , 1 , 0 );
0 commit comments