Skip to content

Commit 2e45d3f

Browse files
aloktionJeff Kirsher
authored andcommitted
i40e: Add support for X710 B/P & SFP+ cards
New device ids are created to support X710 backplane and SFP+ cards. This patch adds in i40e driver support for 2.5GbaseT and 5GbaseT speed. It's implemented by checking I40E_CAP_PHY_TYPE_2_5GBASE_T, I40E_CAP_PHY_TYPE_5GBASE_T bits from f/w and setting corresponding bits in ethtool link ksettings supported and advertising masks. Signed-off-by: Aleksandr Loktionov <[email protected]> Signed-off-by: Alice Michael <[email protected]> Tested-by: Andrew Bowers <[email protected]> Signed-off-by: Jeff Kirsher <[email protected]>
1 parent c004804 commit 2e45d3f

File tree

6 files changed

+74
-2
lines changed

6 files changed

+74
-2
lines changed

drivers/net/ethernet/intel/i40e/i40e_adminq_cmd.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1888,6 +1888,8 @@ enum i40e_aq_phy_type {
18881888
I40E_PHY_TYPE_25GBASE_LR = 0x22,
18891889
I40E_PHY_TYPE_25GBASE_AOC = 0x23,
18901890
I40E_PHY_TYPE_25GBASE_ACC = 0x24,
1891+
I40E_PHY_TYPE_2_5GBASE_T = 0x30,
1892+
I40E_PHY_TYPE_5GBASE_T = 0x31,
18911893
I40E_PHY_TYPE_MAX,
18921894
I40E_PHY_TYPE_NOT_SUPPORTED_HIGH_TEMP = 0xFD,
18931895
I40E_PHY_TYPE_EMPTY = 0xFE,
@@ -1929,19 +1931,25 @@ enum i40e_aq_phy_type {
19291931
BIT_ULL(I40E_PHY_TYPE_25GBASE_SR) | \
19301932
BIT_ULL(I40E_PHY_TYPE_25GBASE_LR) | \
19311933
BIT_ULL(I40E_PHY_TYPE_25GBASE_AOC) | \
1932-
BIT_ULL(I40E_PHY_TYPE_25GBASE_ACC))
1934+
BIT_ULL(I40E_PHY_TYPE_25GBASE_ACC) | \
1935+
BIT_ULL(I40E_PHY_TYPE_2_5GBASE_T) | \
1936+
BIT_ULL(I40E_PHY_TYPE_5GBASE_T))
19331937

1938+
#define I40E_LINK_SPEED_2_5GB_SHIFT 0x0
19341939
#define I40E_LINK_SPEED_100MB_SHIFT 0x1
19351940
#define I40E_LINK_SPEED_1000MB_SHIFT 0x2
19361941
#define I40E_LINK_SPEED_10GB_SHIFT 0x3
19371942
#define I40E_LINK_SPEED_40GB_SHIFT 0x4
19381943
#define I40E_LINK_SPEED_20GB_SHIFT 0x5
19391944
#define I40E_LINK_SPEED_25GB_SHIFT 0x6
1945+
#define I40E_LINK_SPEED_5GB_SHIFT 0x7
19401946

19411947
enum i40e_aq_link_speed {
19421948
I40E_LINK_SPEED_UNKNOWN = 0,
19431949
I40E_LINK_SPEED_100MB = BIT(I40E_LINK_SPEED_100MB_SHIFT),
19441950
I40E_LINK_SPEED_1GB = BIT(I40E_LINK_SPEED_1000MB_SHIFT),
1951+
I40E_LINK_SPEED_2_5GB = (1 << I40E_LINK_SPEED_2_5GB_SHIFT),
1952+
I40E_LINK_SPEED_5GB = (1 << I40E_LINK_SPEED_5GB_SHIFT),
19451953
I40E_LINK_SPEED_10GB = BIT(I40E_LINK_SPEED_10GB_SHIFT),
19461954
I40E_LINK_SPEED_40GB = BIT(I40E_LINK_SPEED_40GB_SHIFT),
19471955
I40E_LINK_SPEED_20GB = BIT(I40E_LINK_SPEED_20GB_SHIFT),
@@ -1987,6 +1995,8 @@ struct i40e_aq_get_phy_abilities_resp {
19871995
#define I40E_AQ_PHY_TYPE_EXT_25G_LR 0x08
19881996
#define I40E_AQ_PHY_TYPE_EXT_25G_AOC 0x10
19891997
#define I40E_AQ_PHY_TYPE_EXT_25G_ACC 0x20
1998+
#define I40E_AQ_PHY_TYPE_EXT_2_5GBASE_T 0x40
1999+
#define I40E_AQ_PHY_TYPE_EXT_5GBASE_T 0x80
19902000
u8 fec_cfg_curr_mod_ext_info;
19912001
#define I40E_AQ_ENABLE_FEC_KR 0x01
19922002
#define I40E_AQ_ENABLE_FEC_RS 0x02

drivers/net/ethernet/intel/i40e/i40e_common.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ static i40e_status i40e_set_mac_type(struct i40e_hw *hw)
2828
case I40E_DEV_ID_QSFP_C:
2929
case I40E_DEV_ID_10G_BASE_T:
3030
case I40E_DEV_ID_10G_BASE_T4:
31+
case I40E_DEV_ID_10G_B:
32+
case I40E_DEV_ID_10G_SFP:
3133
case I40E_DEV_ID_20G_KR2:
3234
case I40E_DEV_ID_20G_KR2_A:
3335
case I40E_DEV_ID_25G_B:
@@ -1151,6 +1153,8 @@ static enum i40e_media_type i40e_get_media_type(struct i40e_hw *hw)
11511153
break;
11521154
case I40E_PHY_TYPE_100BASE_TX:
11531155
case I40E_PHY_TYPE_1000BASE_T:
1156+
case I40E_PHY_TYPE_2_5GBASE_T:
1157+
case I40E_PHY_TYPE_5GBASE_T:
11541158
case I40E_PHY_TYPE_10GBASE_T:
11551159
media = I40E_MEDIA_TYPE_BASET;
11561160
break;
@@ -4900,6 +4904,7 @@ i40e_status i40e_read_phy_register(struct i40e_hw *hw,
49004904
break;
49014905
case I40E_DEV_ID_10G_BASE_T:
49024906
case I40E_DEV_ID_10G_BASE_T4:
4907+
case I40E_DEV_ID_10G_BASE_T_BC:
49034908
case I40E_DEV_ID_10G_BASE_T_X722:
49044909
case I40E_DEV_ID_25G_B:
49054910
case I40E_DEV_ID_25G_SFP28:

drivers/net/ethernet/intel/i40e/i40e_devids.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@
2020
#define I40E_DEV_ID_10G_BASE_T4 0x1589
2121
#define I40E_DEV_ID_25G_B 0x158A
2222
#define I40E_DEV_ID_25G_SFP28 0x158B
23+
#define I40E_DEV_ID_10G_BASE_T_BC 0x15FF
24+
#define I40E_DEV_ID_10G_B 0x104F
25+
#define I40E_DEV_ID_10G_SFP 0x104E
2326
#define I40E_DEV_ID_KX_X722 0x37CE
2427
#define I40E_DEV_ID_QSFP_X722 0x37CF
2528
#define I40E_DEV_ID_SFP_X722 0x37D0

drivers/net/ethernet/intel/i40e/i40e_ethtool.c

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -508,6 +508,20 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf,
508508
ethtool_link_ksettings_add_link_mode(ks, advertising,
509509
10000baseT_Full);
510510
}
511+
if (phy_types & I40E_CAP_PHY_TYPE_2_5GBASE_T) {
512+
ethtool_link_ksettings_add_link_mode(ks, supported,
513+
2500baseT_Full);
514+
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_2_5GB)
515+
ethtool_link_ksettings_add_link_mode(ks, advertising,
516+
2500baseT_Full);
517+
}
518+
if (phy_types & I40E_CAP_PHY_TYPE_5GBASE_T) {
519+
ethtool_link_ksettings_add_link_mode(ks, supported,
520+
5000baseT_Full);
521+
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_5GB)
522+
ethtool_link_ksettings_add_link_mode(ks, advertising,
523+
5000baseT_Full);
524+
}
511525
if (phy_types & I40E_CAP_PHY_TYPE_XLAUI ||
512526
phy_types & I40E_CAP_PHY_TYPE_XLPPI ||
513527
phy_types & I40E_CAP_PHY_TYPE_40GBASE_AOC)
@@ -674,13 +688,15 @@ static void i40e_phy_type_to_ethtool(struct i40e_pf *pf,
674688
phy_types & I40E_CAP_PHY_TYPE_25GBASE_KR ||
675689
phy_types & I40E_CAP_PHY_TYPE_25GBASE_CR ||
676690
phy_types & I40E_CAP_PHY_TYPE_20GBASE_KR2 ||
677-
phy_types & I40E_CAP_PHY_TYPE_10GBASE_T ||
678691
phy_types & I40E_CAP_PHY_TYPE_10GBASE_SR ||
679692
phy_types & I40E_CAP_PHY_TYPE_10GBASE_LR ||
680693
phy_types & I40E_CAP_PHY_TYPE_10GBASE_KX4 ||
681694
phy_types & I40E_CAP_PHY_TYPE_10GBASE_KR ||
682695
phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1_CU ||
683696
phy_types & I40E_CAP_PHY_TYPE_10GBASE_CR1 ||
697+
phy_types & I40E_CAP_PHY_TYPE_10GBASE_T ||
698+
phy_types & I40E_CAP_PHY_TYPE_5GBASE_T ||
699+
phy_types & I40E_CAP_PHY_TYPE_2_5GBASE_T ||
684700
phy_types & I40E_CAP_PHY_TYPE_1000BASE_T_OPTICAL ||
685701
phy_types & I40E_CAP_PHY_TYPE_1000BASE_T ||
686702
phy_types & I40E_CAP_PHY_TYPE_1000BASE_SX ||
@@ -790,11 +806,17 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
790806
10000baseT_Full);
791807
break;
792808
case I40E_PHY_TYPE_10GBASE_T:
809+
case I40E_PHY_TYPE_5GBASE_T:
810+
case I40E_PHY_TYPE_2_5GBASE_T:
793811
case I40E_PHY_TYPE_1000BASE_T:
794812
case I40E_PHY_TYPE_100BASE_TX:
795813
ethtool_link_ksettings_add_link_mode(ks, supported, Autoneg);
796814
ethtool_link_ksettings_add_link_mode(ks, supported,
797815
10000baseT_Full);
816+
ethtool_link_ksettings_add_link_mode(ks, supported,
817+
5000baseT_Full);
818+
ethtool_link_ksettings_add_link_mode(ks, supported,
819+
2500baseT_Full);
798820
ethtool_link_ksettings_add_link_mode(ks, supported,
799821
1000baseT_Full);
800822
ethtool_link_ksettings_add_link_mode(ks, supported,
@@ -803,6 +825,12 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
803825
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_10GB)
804826
ethtool_link_ksettings_add_link_mode(ks, advertising,
805827
10000baseT_Full);
828+
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_5GB)
829+
ethtool_link_ksettings_add_link_mode(ks, advertising,
830+
5000baseT_Full);
831+
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_2_5GB)
832+
ethtool_link_ksettings_add_link_mode(ks, advertising,
833+
2500baseT_Full);
806834
if (hw_link_info->requested_speeds & I40E_LINK_SPEED_1GB)
807835
ethtool_link_ksettings_add_link_mode(ks, advertising,
808836
1000baseT_Full);
@@ -958,6 +986,12 @@ static void i40e_get_settings_link_up(struct i40e_hw *hw,
958986
case I40E_LINK_SPEED_10GB:
959987
ks->base.speed = SPEED_10000;
960988
break;
989+
case I40E_LINK_SPEED_5GB:
990+
ks->base.speed = SPEED_5000;
991+
break;
992+
case I40E_LINK_SPEED_2_5GB:
993+
ks->base.speed = SPEED_2500;
994+
break;
961995
case I40E_LINK_SPEED_1GB:
962996
ks->base.speed = SPEED_1000;
963997
break;
@@ -1243,6 +1277,12 @@ static int i40e_set_link_ksettings(struct net_device *netdev,
12431277
ethtool_link_ksettings_test_link_mode(ks, advertising,
12441278
10000baseLR_Full))
12451279
config.link_speed |= I40E_LINK_SPEED_10GB;
1280+
if (ethtool_link_ksettings_test_link_mode(ks, advertising,
1281+
2500baseT_Full))
1282+
config.link_speed |= I40E_LINK_SPEED_2_5GB;
1283+
if (ethtool_link_ksettings_test_link_mode(ks, advertising,
1284+
5000baseT_Full))
1285+
config.link_speed |= I40E_LINK_SPEED_5GB;
12461286
if (ethtool_link_ksettings_test_link_mode(ks, advertising,
12471287
20000baseKR2_Full))
12481288
config.link_speed |= I40E_LINK_SPEED_20GB;

drivers/net/ethernet/intel/i40e/i40e_main.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ static const struct pci_device_id i40e_pci_tbl[] = {
7373
{PCI_VDEVICE(INTEL, I40E_DEV_ID_QSFP_C), 0},
7474
{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_BASE_T), 0},
7575
{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_BASE_T4), 0},
76+
{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_SFP), 0},
77+
{PCI_VDEVICE(INTEL, I40E_DEV_ID_10G_B), 0},
7678
{PCI_VDEVICE(INTEL, I40E_DEV_ID_KX_X722), 0},
7779
{PCI_VDEVICE(INTEL, I40E_DEV_ID_QSFP_X722), 0},
7880
{PCI_VDEVICE(INTEL, I40E_DEV_ID_SFP_X722), 0},
@@ -6520,6 +6522,12 @@ void i40e_print_link_message(struct i40e_vsi *vsi, bool isup)
65206522
case I40E_LINK_SPEED_10GB:
65216523
speed = "10 G";
65226524
break;
6525+
case I40E_LINK_SPEED_5GB:
6526+
speed = "5 G";
6527+
break;
6528+
case I40E_LINK_SPEED_2_5GB:
6529+
speed = "2.5 G";
6530+
break;
65236531
case I40E_LINK_SPEED_1GB:
65246532
speed = "1000 M";
65256533
break;

drivers/net/ethernet/intel/i40e/i40e_type.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -252,6 +252,12 @@ struct i40e_phy_info {
252252
I40E_PHY_TYPE_OFFSET)
253253
#define I40E_CAP_PHY_TYPE_25GBASE_ACC BIT_ULL(I40E_PHY_TYPE_25GBASE_ACC + \
254254
I40E_PHY_TYPE_OFFSET)
255+
/* Offset for 2.5G/5G PHY Types value to bit number conversion */
256+
#define I40E_PHY_TYPE_OFFSET2 (-10)
257+
#define I40E_CAP_PHY_TYPE_2_5GBASE_T BIT_ULL(I40E_PHY_TYPE_2_5GBASE_T + \
258+
I40E_PHY_TYPE_OFFSET2)
259+
#define I40E_CAP_PHY_TYPE_5GBASE_T BIT_ULL(I40E_PHY_TYPE_5GBASE_T + \
260+
I40E_PHY_TYPE_OFFSET2)
255261
#define I40E_HW_CAP_MAX_GPIO 30
256262
/* Capabilities of a PF or a VF or the whole device */
257263
struct i40e_hw_capabilities {

0 commit comments

Comments
 (0)