@@ -1854,7 +1854,8 @@ i40e_status i40e_aq_get_link_info(struct i40e_hw *hw,
1854
1854
else
1855
1855
hw_link_info -> lse_enable = false;
1856
1856
1857
- if ((hw -> aq .fw_maj_ver < 4 || (hw -> aq .fw_maj_ver == 4 &&
1857
+ if ((hw -> mac .type == I40E_MAC_XL710 ) &&
1858
+ (hw -> aq .fw_maj_ver < 4 || (hw -> aq .fw_maj_ver == 4 &&
1858
1859
hw -> aq .fw_min_ver < 40 )) && hw_link_info -> phy_type == 0xE )
1859
1860
hw_link_info -> phy_type = I40E_PHY_TYPE_10GBASE_SFPP_CU ;
1860
1861
@@ -2168,6 +2169,40 @@ enum i40e_status_code i40e_aq_set_vsi_uc_promisc_on_vlan(struct i40e_hw *hw,
2168
2169
return status ;
2169
2170
}
2170
2171
2172
+ /**
2173
+ * i40e_aq_set_vsi_bc_promisc_on_vlan
2174
+ * @hw: pointer to the hw struct
2175
+ * @seid: vsi number
2176
+ * @enable: set broadcast promiscuous enable/disable for a given VLAN
2177
+ * @vid: The VLAN tag filter - capture any broadcast packet with this VLAN tag
2178
+ * @cmd_details: pointer to command details structure or NULL
2179
+ **/
2180
+ i40e_status i40e_aq_set_vsi_bc_promisc_on_vlan (struct i40e_hw * hw ,
2181
+ u16 seid , bool enable , u16 vid ,
2182
+ struct i40e_asq_cmd_details * cmd_details )
2183
+ {
2184
+ struct i40e_aq_desc desc ;
2185
+ struct i40e_aqc_set_vsi_promiscuous_modes * cmd =
2186
+ (struct i40e_aqc_set_vsi_promiscuous_modes * )& desc .params .raw ;
2187
+ i40e_status status ;
2188
+ u16 flags = 0 ;
2189
+
2190
+ i40e_fill_default_direct_cmd_desc (& desc ,
2191
+ i40e_aqc_opc_set_vsi_promiscuous_modes );
2192
+
2193
+ if (enable )
2194
+ flags |= I40E_AQC_SET_VSI_PROMISC_BROADCAST ;
2195
+
2196
+ cmd -> promiscuous_flags = cpu_to_le16 (flags );
2197
+ cmd -> valid_flags = cpu_to_le16 (I40E_AQC_SET_VSI_PROMISC_BROADCAST );
2198
+ cmd -> seid = cpu_to_le16 (seid );
2199
+ cmd -> vlan_tag = cpu_to_le16 (vid | I40E_AQC_SET_VSI_VLAN_VALID );
2200
+
2201
+ status = i40e_asq_send_command (hw , & desc , NULL , 0 , cmd_details );
2202
+
2203
+ return status ;
2204
+ }
2205
+
2171
2206
/**
2172
2207
* i40e_aq_set_vsi_broadcast
2173
2208
* @hw: pointer to the hw struct
@@ -3147,6 +3182,14 @@ static void i40e_parse_discover_capabilities(struct i40e_hw *hw, void *buff,
3147
3182
break ;
3148
3183
case I40E_AQ_CAP_ID_MNG_MODE :
3149
3184
p -> management_mode = number ;
3185
+ if (major_rev > 1 ) {
3186
+ p -> mng_protocols_over_mctp = logical_id ;
3187
+ i40e_debug (hw , I40E_DEBUG_INIT ,
3188
+ "HW Capability: Protocols over MCTP = %d\n" ,
3189
+ p -> mng_protocols_over_mctp );
3190
+ } else {
3191
+ p -> mng_protocols_over_mctp = 0 ;
3192
+ }
3150
3193
break ;
3151
3194
case I40E_AQ_CAP_ID_NPAR_ACTIVE :
3152
3195
p -> npar_enable = number ;
@@ -4396,7 +4439,92 @@ i40e_status i40e_aq_configure_partition_bw(struct i40e_hw *hw,
4396
4439
}
4397
4440
4398
4441
/**
4399
- * i40e_read_phy_register
4442
+ * i40e_read_phy_register_clause22
4443
+ * @hw: pointer to the HW structure
4444
+ * @reg: register address in the page
4445
+ * @phy_adr: PHY address on MDIO interface
4446
+ * @value: PHY register value
4447
+ *
4448
+ * Reads specified PHY register value
4449
+ **/
4450
+ i40e_status i40e_read_phy_register_clause22 (struct i40e_hw * hw ,
4451
+ u16 reg , u8 phy_addr , u16 * value )
4452
+ {
4453
+ i40e_status status = I40E_ERR_TIMEOUT ;
4454
+ u8 port_num = (u8 )hw -> func_caps .mdio_port_num ;
4455
+ u32 command = 0 ;
4456
+ u16 retry = 1000 ;
4457
+
4458
+ command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT ) |
4459
+ (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT ) |
4460
+ (I40E_MDIO_CLAUSE22_OPCODE_READ_MASK ) |
4461
+ (I40E_MDIO_CLAUSE22_STCODE_MASK ) |
4462
+ (I40E_GLGEN_MSCA_MDICMD_MASK );
4463
+ wr32 (hw , I40E_GLGEN_MSCA (port_num ), command );
4464
+ do {
4465
+ command = rd32 (hw , I40E_GLGEN_MSCA (port_num ));
4466
+ if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK )) {
4467
+ status = 0 ;
4468
+ break ;
4469
+ }
4470
+ udelay (10 );
4471
+ retry -- ;
4472
+ } while (retry );
4473
+
4474
+ if (status ) {
4475
+ i40e_debug (hw , I40E_DEBUG_PHY ,
4476
+ "PHY: Can't write command to external PHY.\n" );
4477
+ } else {
4478
+ command = rd32 (hw , I40E_GLGEN_MSRWD (port_num ));
4479
+ * value = (command & I40E_GLGEN_MSRWD_MDIRDDATA_MASK ) >>
4480
+ I40E_GLGEN_MSRWD_MDIRDDATA_SHIFT ;
4481
+ }
4482
+
4483
+ return status ;
4484
+ }
4485
+
4486
+ /**
4487
+ * i40e_write_phy_register_clause22
4488
+ * @hw: pointer to the HW structure
4489
+ * @reg: register address in the page
4490
+ * @phy_adr: PHY address on MDIO interface
4491
+ * @value: PHY register value
4492
+ *
4493
+ * Writes specified PHY register value
4494
+ **/
4495
+ i40e_status i40e_write_phy_register_clause22 (struct i40e_hw * hw ,
4496
+ u16 reg , u8 phy_addr , u16 value )
4497
+ {
4498
+ i40e_status status = I40E_ERR_TIMEOUT ;
4499
+ u8 port_num = (u8 )hw -> func_caps .mdio_port_num ;
4500
+ u32 command = 0 ;
4501
+ u16 retry = 1000 ;
4502
+
4503
+ command = value << I40E_GLGEN_MSRWD_MDIWRDATA_SHIFT ;
4504
+ wr32 (hw , I40E_GLGEN_MSRWD (port_num ), command );
4505
+
4506
+ command = (reg << I40E_GLGEN_MSCA_DEVADD_SHIFT ) |
4507
+ (phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT ) |
4508
+ (I40E_MDIO_CLAUSE22_OPCODE_WRITE_MASK ) |
4509
+ (I40E_MDIO_CLAUSE22_STCODE_MASK ) |
4510
+ (I40E_GLGEN_MSCA_MDICMD_MASK );
4511
+
4512
+ wr32 (hw , I40E_GLGEN_MSCA (port_num ), command );
4513
+ do {
4514
+ command = rd32 (hw , I40E_GLGEN_MSCA (port_num ));
4515
+ if (!(command & I40E_GLGEN_MSCA_MDICMD_MASK )) {
4516
+ status = 0 ;
4517
+ break ;
4518
+ }
4519
+ udelay (10 );
4520
+ retry -- ;
4521
+ } while (retry );
4522
+
4523
+ return status ;
4524
+ }
4525
+
4526
+ /**
4527
+ * i40e_read_phy_register_clause45
4400
4528
* @hw: pointer to the HW structure
4401
4529
* @page: registers page number
4402
4530
* @reg: register address in the page
@@ -4405,9 +4533,8 @@ i40e_status i40e_aq_configure_partition_bw(struct i40e_hw *hw,
4405
4533
*
4406
4534
* Reads specified PHY register value
4407
4535
**/
4408
- i40e_status i40e_read_phy_register (struct i40e_hw * hw ,
4409
- u8 page , u16 reg , u8 phy_addr ,
4410
- u16 * value )
4536
+ i40e_status i40e_read_phy_register_clause45 (struct i40e_hw * hw ,
4537
+ u8 page , u16 reg , u8 phy_addr , u16 * value )
4411
4538
{
4412
4539
i40e_status status = I40E_ERR_TIMEOUT ;
4413
4540
u32 command = 0 ;
@@ -4417,8 +4544,8 @@ i40e_status i40e_read_phy_register(struct i40e_hw *hw,
4417
4544
command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT ) |
4418
4545
(page << I40E_GLGEN_MSCA_DEVADD_SHIFT ) |
4419
4546
(phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT ) |
4420
- (I40E_MDIO_OPCODE_ADDRESS ) |
4421
- (I40E_MDIO_STCODE ) |
4547
+ (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK ) |
4548
+ (I40E_MDIO_CLAUSE45_STCODE_MASK ) |
4422
4549
(I40E_GLGEN_MSCA_MDICMD_MASK ) |
4423
4550
(I40E_GLGEN_MSCA_MDIINPROGEN_MASK );
4424
4551
wr32 (hw , I40E_GLGEN_MSCA (port_num ), command );
@@ -4440,8 +4567,8 @@ i40e_status i40e_read_phy_register(struct i40e_hw *hw,
4440
4567
4441
4568
command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT ) |
4442
4569
(phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT ) |
4443
- (I40E_MDIO_OPCODE_READ ) |
4444
- (I40E_MDIO_STCODE ) |
4570
+ (I40E_MDIO_CLAUSE45_OPCODE_READ_MASK ) |
4571
+ (I40E_MDIO_CLAUSE45_STCODE_MASK ) |
4445
4572
(I40E_GLGEN_MSCA_MDICMD_MASK ) |
4446
4573
(I40E_GLGEN_MSCA_MDIINPROGEN_MASK );
4447
4574
status = I40E_ERR_TIMEOUT ;
@@ -4471,7 +4598,7 @@ i40e_status i40e_read_phy_register(struct i40e_hw *hw,
4471
4598
}
4472
4599
4473
4600
/**
4474
- * i40e_write_phy_register
4601
+ * i40e_write_phy_register_clause45
4475
4602
* @hw: pointer to the HW structure
4476
4603
* @page: registers page number
4477
4604
* @reg: register address in the page
@@ -4480,9 +4607,8 @@ i40e_status i40e_read_phy_register(struct i40e_hw *hw,
4480
4607
*
4481
4608
* Writes value to specified PHY register
4482
4609
**/
4483
- i40e_status i40e_write_phy_register (struct i40e_hw * hw ,
4484
- u8 page , u16 reg , u8 phy_addr ,
4485
- u16 value )
4610
+ i40e_status i40e_write_phy_register_clause45 (struct i40e_hw * hw ,
4611
+ u8 page , u16 reg , u8 phy_addr , u16 value )
4486
4612
{
4487
4613
i40e_status status = I40E_ERR_TIMEOUT ;
4488
4614
u32 command = 0 ;
@@ -4492,8 +4618,8 @@ i40e_status i40e_write_phy_register(struct i40e_hw *hw,
4492
4618
command = (reg << I40E_GLGEN_MSCA_MDIADD_SHIFT ) |
4493
4619
(page << I40E_GLGEN_MSCA_DEVADD_SHIFT ) |
4494
4620
(phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT ) |
4495
- (I40E_MDIO_OPCODE_ADDRESS ) |
4496
- (I40E_MDIO_STCODE ) |
4621
+ (I40E_MDIO_CLAUSE45_OPCODE_ADDRESS_MASK ) |
4622
+ (I40E_MDIO_CLAUSE45_STCODE_MASK ) |
4497
4623
(I40E_GLGEN_MSCA_MDICMD_MASK ) |
4498
4624
(I40E_GLGEN_MSCA_MDIINPROGEN_MASK );
4499
4625
wr32 (hw , I40E_GLGEN_MSCA (port_num ), command );
@@ -4517,8 +4643,8 @@ i40e_status i40e_write_phy_register(struct i40e_hw *hw,
4517
4643
4518
4644
command = (page << I40E_GLGEN_MSCA_DEVADD_SHIFT ) |
4519
4645
(phy_addr << I40E_GLGEN_MSCA_PHYADD_SHIFT ) |
4520
- (I40E_MDIO_OPCODE_WRITE ) |
4521
- (I40E_MDIO_STCODE ) |
4646
+ (I40E_MDIO_CLAUSE45_OPCODE_WRITE_MASK ) |
4647
+ (I40E_MDIO_CLAUSE45_STCODE_MASK ) |
4522
4648
(I40E_GLGEN_MSCA_MDICMD_MASK ) |
4523
4649
(I40E_GLGEN_MSCA_MDIINPROGEN_MASK );
4524
4650
status = I40E_ERR_TIMEOUT ;
@@ -4580,14 +4706,16 @@ i40e_status i40e_blink_phy_link_led(struct i40e_hw *hw,
4580
4706
4581
4707
for (gpio_led_port = 0 ; gpio_led_port < 3 ; gpio_led_port ++ ,
4582
4708
led_addr ++ ) {
4583
- status = i40e_read_phy_register (hw , I40E_PHY_COM_REG_PAGE ,
4584
- led_addr , phy_addr , & led_reg );
4709
+ status = i40e_read_phy_register_clause45 (hw ,
4710
+ I40E_PHY_COM_REG_PAGE ,
4711
+ led_addr , phy_addr ,
4712
+ & led_reg );
4585
4713
if (status )
4586
4714
goto phy_blinking_end ;
4587
4715
led_ctl = led_reg ;
4588
4716
if (led_reg & I40E_PHY_LED_LINK_MODE_MASK ) {
4589
4717
led_reg = 0 ;
4590
- status = i40e_write_phy_register (hw ,
4718
+ status = i40e_write_phy_register_clause45 (hw ,
4591
4719
I40E_PHY_COM_REG_PAGE ,
4592
4720
led_addr , phy_addr ,
4593
4721
led_reg );
@@ -4599,29 +4727,28 @@ i40e_status i40e_blink_phy_link_led(struct i40e_hw *hw,
4599
4727
4600
4728
if (time > 0 && interval > 0 ) {
4601
4729
for (i = 0 ; i < time * 1000 ; i += interval ) {
4602
- status = i40e_read_phy_register (hw ,
4603
- I40E_PHY_COM_REG_PAGE ,
4604
- led_addr , phy_addr ,
4605
- & led_reg );
4730
+ status = i40e_read_phy_register_clause45 (hw ,
4731
+ I40E_PHY_COM_REG_PAGE ,
4732
+ led_addr , phy_addr , & led_reg );
4606
4733
if (status )
4607
4734
goto restore_config ;
4608
4735
if (led_reg & I40E_PHY_LED_MANUAL_ON )
4609
4736
led_reg = 0 ;
4610
4737
else
4611
4738
led_reg = I40E_PHY_LED_MANUAL_ON ;
4612
- status = i40e_write_phy_register (hw ,
4613
- I40E_PHY_COM_REG_PAGE ,
4614
- led_addr , phy_addr ,
4615
- led_reg );
4739
+ status = i40e_write_phy_register_clause45 (hw ,
4740
+ I40E_PHY_COM_REG_PAGE ,
4741
+ led_addr , phy_addr , led_reg );
4616
4742
if (status )
4617
4743
goto restore_config ;
4618
4744
msleep (interval );
4619
4745
}
4620
4746
}
4621
4747
4622
4748
restore_config :
4623
- status = i40e_write_phy_register (hw , I40E_PHY_COM_REG_PAGE , led_addr ,
4624
- phy_addr , led_ctl );
4749
+ status = i40e_write_phy_register_clause45 (hw ,
4750
+ I40E_PHY_COM_REG_PAGE ,
4751
+ led_addr , phy_addr , led_ctl );
4625
4752
4626
4753
phy_blinking_end :
4627
4754
return status ;
@@ -4652,8 +4779,10 @@ i40e_status i40e_led_get_phy(struct i40e_hw *hw, u16 *led_addr,
4652
4779
4653
4780
for (gpio_led_port = 0 ; gpio_led_port < 3 ; gpio_led_port ++ ,
4654
4781
temp_addr ++ ) {
4655
- status = i40e_read_phy_register (hw , I40E_PHY_COM_REG_PAGE ,
4656
- temp_addr , phy_addr , & reg_val );
4782
+ status = i40e_read_phy_register_clause45 (hw ,
4783
+ I40E_PHY_COM_REG_PAGE ,
4784
+ temp_addr , phy_addr ,
4785
+ & reg_val );
4657
4786
if (status )
4658
4787
return status ;
4659
4788
* val = reg_val ;
@@ -4686,41 +4815,42 @@ i40e_status i40e_led_set_phy(struct i40e_hw *hw, bool on,
4686
4815
i = rd32 (hw , I40E_PFGEN_PORTNUM );
4687
4816
port_num = (u8 )(i & I40E_PFGEN_PORTNUM_PORT_NUM_MASK );
4688
4817
phy_addr = i40e_get_phy_address (hw , port_num );
4689
-
4690
- status = i40e_read_phy_register (hw , I40E_PHY_COM_REG_PAGE , led_addr ,
4691
- phy_addr , & led_reg );
4818
+ status = i40e_read_phy_register_clause45 (hw , I40E_PHY_COM_REG_PAGE ,
4819
+ led_addr , phy_addr , & led_reg );
4692
4820
if (status )
4693
4821
return status ;
4694
4822
led_ctl = led_reg ;
4695
4823
if (led_reg & I40E_PHY_LED_LINK_MODE_MASK ) {
4696
4824
led_reg = 0 ;
4697
- status = i40e_write_phy_register (hw , I40E_PHY_COM_REG_PAGE ,
4698
- led_addr , phy_addr , led_reg );
4825
+ status = i40e_write_phy_register_clause45 (hw ,
4826
+ I40E_PHY_COM_REG_PAGE ,
4827
+ led_addr , phy_addr ,
4828
+ led_reg );
4699
4829
if (status )
4700
4830
return status ;
4701
4831
}
4702
- status = i40e_read_phy_register (hw , I40E_PHY_COM_REG_PAGE ,
4703
- led_addr , phy_addr , & led_reg );
4832
+ status = i40e_read_phy_register_clause45 (hw , I40E_PHY_COM_REG_PAGE ,
4833
+ led_addr , phy_addr , & led_reg );
4704
4834
if (status )
4705
4835
goto restore_config ;
4706
4836
if (on )
4707
4837
led_reg = I40E_PHY_LED_MANUAL_ON ;
4708
4838
else
4709
4839
led_reg = 0 ;
4710
- status = i40e_write_phy_register (hw , I40E_PHY_COM_REG_PAGE ,
4711
- led_addr , phy_addr , led_reg );
4840
+ status = i40e_write_phy_register_clause45 (hw , I40E_PHY_COM_REG_PAGE ,
4841
+ led_addr , phy_addr , led_reg );
4712
4842
if (status )
4713
4843
goto restore_config ;
4714
4844
if (mode & I40E_PHY_LED_MODE_ORIG ) {
4715
4845
led_ctl = (mode & I40E_PHY_LED_MODE_MASK );
4716
- status = i40e_write_phy_register (hw ,
4846
+ status = i40e_write_phy_register_clause45 (hw ,
4717
4847
I40E_PHY_COM_REG_PAGE ,
4718
4848
led_addr , phy_addr , led_ctl );
4719
4849
}
4720
4850
return status ;
4721
4851
restore_config :
4722
- status = i40e_write_phy_register (hw , I40E_PHY_COM_REG_PAGE , led_addr ,
4723
- phy_addr , led_ctl );
4852
+ status = i40e_write_phy_register_clause45 (hw , I40E_PHY_COM_REG_PAGE ,
4853
+ led_addr , phy_addr , led_ctl );
4724
4854
return status ;
4725
4855
}
4726
4856
0 commit comments