Skip to content

Commit 047a2d3

Browse files
Michael Chankuba-moo
authored andcommitted
bnxt_en: Report the new ethtool link modes in the new firmware interface
Add new look up entries to convert the new supported speeds, advertised speeds, etc to ethtool link modes. Reviewed-by: Damodharam Ammepalli <damodharam.ammepalli@broadcom.com> Signed-off-by: Michael Chan <michael.chan@broadcom.com> Link: https://lore.kernel.org/r/20231201223924.26955-15-michael.chan@broadcom.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1 parent 7b60cf2 commit 047a2d3

File tree

1 file changed

+151
-20
lines changed

1 file changed

+151
-20
lines changed

drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

Lines changed: 151 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1577,6 +1577,22 @@ static const enum bnxt_media_type bnxt_phy_types[] = {
15771577
[PORT_PHY_QCFG_RESP_PHY_TYPE_100G_BASESR2] = BNXT_MEDIA_SR,
15781578
[PORT_PHY_QCFG_RESP_PHY_TYPE_100G_BASELR2] = BNXT_MEDIA_LR_ER_FR,
15791579
[PORT_PHY_QCFG_RESP_PHY_TYPE_100G_BASEER2] = BNXT_MEDIA_LR_ER_FR,
1580+
[PORT_PHY_QCFG_RESP_PHY_TYPE_100G_BASECR] = BNXT_MEDIA_CR,
1581+
[PORT_PHY_QCFG_RESP_PHY_TYPE_100G_BASESR] = BNXT_MEDIA_SR,
1582+
[PORT_PHY_QCFG_RESP_PHY_TYPE_100G_BASELR] = BNXT_MEDIA_LR_ER_FR,
1583+
[PORT_PHY_QCFG_RESP_PHY_TYPE_100G_BASEER] = BNXT_MEDIA_LR_ER_FR,
1584+
[PORT_PHY_QCFG_RESP_PHY_TYPE_200G_BASECR2] = BNXT_MEDIA_CR,
1585+
[PORT_PHY_QCFG_RESP_PHY_TYPE_200G_BASESR2] = BNXT_MEDIA_SR,
1586+
[PORT_PHY_QCFG_RESP_PHY_TYPE_200G_BASELR2] = BNXT_MEDIA_LR_ER_FR,
1587+
[PORT_PHY_QCFG_RESP_PHY_TYPE_200G_BASEER2] = BNXT_MEDIA_LR_ER_FR,
1588+
[PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASECR8] = BNXT_MEDIA_CR,
1589+
[PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASESR8] = BNXT_MEDIA_SR,
1590+
[PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASELR8] = BNXT_MEDIA_LR_ER_FR,
1591+
[PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASEER8] = BNXT_MEDIA_LR_ER_FR,
1592+
[PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASECR4] = BNXT_MEDIA_CR,
1593+
[PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASESR4] = BNXT_MEDIA_SR,
1594+
[PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASELR4] = BNXT_MEDIA_LR_ER_FR,
1595+
[PORT_PHY_QCFG_RESP_PHY_TYPE_400G_BASEER4] = BNXT_MEDIA_LR_ER_FR,
15801596
};
15811597

15821598
static enum bnxt_media_type
@@ -1604,6 +1620,7 @@ enum bnxt_link_speed_indices {
16041620
BNXT_LINK_SPEED_50GB_IDX,
16051621
BNXT_LINK_SPEED_100GB_IDX,
16061622
BNXT_LINK_SPEED_200GB_IDX,
1623+
BNXT_LINK_SPEED_400GB_IDX,
16071624
__BNXT_LINK_SPEED_END
16081625
};
16091626

@@ -1615,9 +1632,21 @@ static enum bnxt_link_speed_indices bnxt_fw_speed_idx(u16 speed)
16151632
case BNXT_LINK_SPEED_10GB: return BNXT_LINK_SPEED_10GB_IDX;
16161633
case BNXT_LINK_SPEED_25GB: return BNXT_LINK_SPEED_25GB_IDX;
16171634
case BNXT_LINK_SPEED_40GB: return BNXT_LINK_SPEED_40GB_IDX;
1618-
case BNXT_LINK_SPEED_50GB: return BNXT_LINK_SPEED_50GB_IDX;
1619-
case BNXT_LINK_SPEED_100GB: return BNXT_LINK_SPEED_100GB_IDX;
1620-
case BNXT_LINK_SPEED_200GB: return BNXT_LINK_SPEED_200GB_IDX;
1635+
case BNXT_LINK_SPEED_50GB:
1636+
case BNXT_LINK_SPEED_50GB_PAM4:
1637+
return BNXT_LINK_SPEED_50GB_IDX;
1638+
case BNXT_LINK_SPEED_100GB:
1639+
case BNXT_LINK_SPEED_100GB_PAM4:
1640+
case BNXT_LINK_SPEED_100GB_PAM4_112:
1641+
return BNXT_LINK_SPEED_100GB_IDX;
1642+
case BNXT_LINK_SPEED_200GB:
1643+
case BNXT_LINK_SPEED_200GB_PAM4:
1644+
case BNXT_LINK_SPEED_200GB_PAM4_112:
1645+
return BNXT_LINK_SPEED_200GB_IDX;
1646+
case BNXT_LINK_SPEED_400GB:
1647+
case BNXT_LINK_SPEED_400GB_PAM4:
1648+
case BNXT_LINK_SPEED_400GB_PAM4_112:
1649+
return BNXT_LINK_SPEED_400GB_IDX;
16211650
default: return BNXT_LINK_SPEED_UNKNOWN;
16221651
}
16231652
}
@@ -1690,6 +1719,12 @@ bnxt_link_modes[__BNXT_LINK_SPEED_END][BNXT_SIG_MODE_MAX][__BNXT_MEDIA_END] = {
16901719
[BNXT_MEDIA_LR_ER_FR] = ETHTOOL_LINK_MODE_100000baseLR2_ER2_FR2_Full_BIT,
16911720
[BNXT_MEDIA_KR] = ETHTOOL_LINK_MODE_100000baseKR2_Full_BIT,
16921721
},
1722+
[BNXT_SIG_MODE_PAM4_112] = {
1723+
[BNXT_MEDIA_CR] = ETHTOOL_LINK_MODE_100000baseCR_Full_BIT,
1724+
[BNXT_MEDIA_SR] = ETHTOOL_LINK_MODE_100000baseSR_Full_BIT,
1725+
[BNXT_MEDIA_KR] = ETHTOOL_LINK_MODE_100000baseKR_Full_BIT,
1726+
[BNXT_MEDIA_LR_ER_FR] = ETHTOOL_LINK_MODE_100000baseLR_ER_FR_Full_BIT,
1727+
},
16931728
},
16941729
[BNXT_LINK_SPEED_200GB_IDX] = {
16951730
[BNXT_SIG_MODE_PAM4] = {
@@ -1698,6 +1733,26 @@ bnxt_link_modes[__BNXT_LINK_SPEED_END][BNXT_SIG_MODE_MAX][__BNXT_MEDIA_END] = {
16981733
[BNXT_MEDIA_LR_ER_FR] = ETHTOOL_LINK_MODE_200000baseLR4_ER4_FR4_Full_BIT,
16991734
[BNXT_MEDIA_KR] = ETHTOOL_LINK_MODE_200000baseKR4_Full_BIT,
17001735
},
1736+
[BNXT_SIG_MODE_PAM4_112] = {
1737+
[BNXT_MEDIA_CR] = ETHTOOL_LINK_MODE_200000baseCR2_Full_BIT,
1738+
[BNXT_MEDIA_KR] = ETHTOOL_LINK_MODE_200000baseKR2_Full_BIT,
1739+
[BNXT_MEDIA_SR] = ETHTOOL_LINK_MODE_200000baseSR2_Full_BIT,
1740+
[BNXT_MEDIA_LR_ER_FR] = ETHTOOL_LINK_MODE_200000baseLR2_ER2_FR2_Full_BIT,
1741+
},
1742+
},
1743+
[BNXT_LINK_SPEED_400GB_IDX] = {
1744+
[BNXT_SIG_MODE_PAM4] = {
1745+
[BNXT_MEDIA_CR] = ETHTOOL_LINK_MODE_400000baseCR8_Full_BIT,
1746+
[BNXT_MEDIA_KR] = ETHTOOL_LINK_MODE_400000baseKR8_Full_BIT,
1747+
[BNXT_MEDIA_SR] = ETHTOOL_LINK_MODE_400000baseSR8_Full_BIT,
1748+
[BNXT_MEDIA_LR_ER_FR] = ETHTOOL_LINK_MODE_400000baseLR8_ER8_FR8_Full_BIT,
1749+
},
1750+
[BNXT_SIG_MODE_PAM4_112] = {
1751+
[BNXT_MEDIA_CR] = ETHTOOL_LINK_MODE_400000baseCR4_Full_BIT,
1752+
[BNXT_MEDIA_KR] = ETHTOOL_LINK_MODE_400000baseKR4_Full_BIT,
1753+
[BNXT_MEDIA_SR] = ETHTOOL_LINK_MODE_400000baseSR4_Full_BIT,
1754+
[BNXT_MEDIA_LR_ER_FR] = ETHTOOL_LINK_MODE_400000baseLR4_ER4_FR4_Full_BIT,
1755+
},
17011756
},
17021757
};
17031758

@@ -1762,7 +1817,8 @@ static void bnxt_get_ethtool_modes(struct bnxt_link_info *link_info,
17621817
lk_ksettings->link_modes.supported);
17631818
}
17641819

1765-
if (link_info->support_auto_speeds || link_info->support_pam4_auto_speeds)
1820+
if (link_info->support_auto_speeds || link_info->support_auto_speeds2 ||
1821+
link_info->support_pam4_auto_speeds)
17661822
linkmode_set_bit(ETHTOOL_LINK_MODE_Autoneg_BIT,
17671823
lk_ksettings->link_modes.supported);
17681824

@@ -1798,6 +1854,30 @@ static const u16 bnxt_pam4_speed_masks[] = {
17981854
[BNXT_LINK_SPEED_50GB_IDX] = BNXT_LINK_PAM4_SPEED_MSK_50GB,
17991855
[BNXT_LINK_SPEED_100GB_IDX] = BNXT_LINK_PAM4_SPEED_MSK_100GB,
18001856
[BNXT_LINK_SPEED_200GB_IDX] = BNXT_LINK_PAM4_SPEED_MSK_200GB,
1857+
[__BNXT_LINK_SPEED_END - 1] = 0 /* make any legal speed a valid index */
1858+
};
1859+
1860+
static const u16 bnxt_nrz_speeds2_masks[] = {
1861+
[BNXT_LINK_SPEED_1GB_IDX] = BNXT_LINK_SPEEDS2_MSK_1GB,
1862+
[BNXT_LINK_SPEED_10GB_IDX] = BNXT_LINK_SPEEDS2_MSK_10GB,
1863+
[BNXT_LINK_SPEED_25GB_IDX] = BNXT_LINK_SPEEDS2_MSK_25GB,
1864+
[BNXT_LINK_SPEED_40GB_IDX] = BNXT_LINK_SPEEDS2_MSK_40GB,
1865+
[BNXT_LINK_SPEED_50GB_IDX] = BNXT_LINK_SPEEDS2_MSK_50GB,
1866+
[BNXT_LINK_SPEED_100GB_IDX] = BNXT_LINK_SPEEDS2_MSK_100GB,
1867+
[__BNXT_LINK_SPEED_END - 1] = 0 /* make any legal speed a valid index */
1868+
};
1869+
1870+
static const u16 bnxt_pam4_speeds2_masks[] = {
1871+
[BNXT_LINK_SPEED_50GB_IDX] = BNXT_LINK_SPEEDS2_MSK_50GB_PAM4,
1872+
[BNXT_LINK_SPEED_100GB_IDX] = BNXT_LINK_SPEEDS2_MSK_100GB_PAM4,
1873+
[BNXT_LINK_SPEED_200GB_IDX] = BNXT_LINK_SPEEDS2_MSK_200GB_PAM4,
1874+
[BNXT_LINK_SPEED_400GB_IDX] = BNXT_LINK_SPEEDS2_MSK_400GB_PAM4,
1875+
};
1876+
1877+
static const u16 bnxt_pam4_112_speeds2_masks[] = {
1878+
[BNXT_LINK_SPEED_100GB_IDX] = BNXT_LINK_SPEEDS2_MSK_100GB_PAM4_112,
1879+
[BNXT_LINK_SPEED_200GB_IDX] = BNXT_LINK_SPEEDS2_MSK_200GB_PAM4_112,
1880+
[BNXT_LINK_SPEED_400GB_IDX] = BNXT_LINK_SPEEDS2_MSK_400GB_PAM4_112,
18011881
};
18021882

18031883
static enum bnxt_link_speed_indices
@@ -1808,12 +1888,26 @@ bnxt_encoding_speed_idx(u8 sig_mode, u16 phy_flags, u16 speed_msk)
18081888

18091889
switch (sig_mode) {
18101890
case BNXT_SIG_MODE_NRZ:
1811-
speeds = bnxt_nrz_speed_masks;
1812-
len = ARRAY_SIZE(bnxt_nrz_speed_masks);
1891+
if (phy_flags & BNXT_PHY_FL_SPEEDS2) {
1892+
speeds = bnxt_nrz_speeds2_masks;
1893+
len = ARRAY_SIZE(bnxt_nrz_speeds2_masks);
1894+
} else {
1895+
speeds = bnxt_nrz_speed_masks;
1896+
len = ARRAY_SIZE(bnxt_nrz_speed_masks);
1897+
}
18131898
break;
18141899
case BNXT_SIG_MODE_PAM4:
1815-
speeds = bnxt_pam4_speed_masks;
1816-
len = ARRAY_SIZE(bnxt_pam4_speed_masks);
1900+
if (phy_flags & BNXT_PHY_FL_SPEEDS2) {
1901+
speeds = bnxt_pam4_speeds2_masks;
1902+
len = ARRAY_SIZE(bnxt_pam4_speeds2_masks);
1903+
} else {
1904+
speeds = bnxt_pam4_speed_masks;
1905+
len = ARRAY_SIZE(bnxt_pam4_speed_masks);
1906+
}
1907+
break;
1908+
case BNXT_SIG_MODE_PAM4_112:
1909+
speeds = bnxt_pam4_112_speeds2_masks;
1910+
len = ARRAY_SIZE(bnxt_pam4_112_speeds2_masks);
18171911
break;
18181912
default:
18191913
return BNXT_LINK_SPEED_UNKNOWN;
@@ -1872,14 +1966,23 @@ bnxt_get_all_ethtool_support_speeds(struct bnxt_link_info *link_info,
18721966
struct ethtool_link_ksettings *lk_ksettings)
18731967
{
18741968
struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
1969+
u16 sp_nrz, sp_pam4, sp_pam4_112 = 0;
18751970
u16 phy_flags = bp->phy_flags;
18761971

1877-
bnxt_get_ethtool_speeds(link_info->support_speeds, media,
1878-
BNXT_SIG_MODE_NRZ, phy_flags,
1972+
if (phy_flags & BNXT_PHY_FL_SPEEDS2) {
1973+
sp_nrz = link_info->support_speeds2;
1974+
sp_pam4 = link_info->support_speeds2;
1975+
sp_pam4_112 = link_info->support_speeds2;
1976+
} else {
1977+
sp_nrz = link_info->support_speeds;
1978+
sp_pam4 = link_info->support_pam4_speeds;
1979+
}
1980+
bnxt_get_ethtool_speeds(sp_nrz, media, BNXT_SIG_MODE_NRZ, phy_flags,
18791981
lk_ksettings->link_modes.supported);
1880-
bnxt_get_ethtool_speeds(link_info->support_pam4_speeds, media,
1881-
BNXT_SIG_MODE_PAM4, phy_flags,
1982+
bnxt_get_ethtool_speeds(sp_pam4, media, BNXT_SIG_MODE_PAM4, phy_flags,
18821983
lk_ksettings->link_modes.supported);
1984+
bnxt_get_ethtool_speeds(sp_pam4_112, media, BNXT_SIG_MODE_PAM4_112,
1985+
phy_flags, lk_ksettings->link_modes.supported);
18831986
}
18841987

18851988
static void
@@ -1888,14 +1991,22 @@ bnxt_get_all_ethtool_adv_speeds(struct bnxt_link_info *link_info,
18881991
struct ethtool_link_ksettings *lk_ksettings)
18891992
{
18901993
struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
1994+
u16 sp_nrz, sp_pam4, sp_pam4_112 = 0;
18911995
u16 phy_flags = bp->phy_flags;
18921996

1893-
bnxt_get_ethtool_speeds(link_info->advertising, media,
1894-
BNXT_SIG_MODE_NRZ, phy_flags,
1997+
sp_nrz = link_info->advertising;
1998+
if (phy_flags & BNXT_PHY_FL_SPEEDS2) {
1999+
sp_pam4 = link_info->advertising;
2000+
sp_pam4_112 = link_info->advertising;
2001+
} else {
2002+
sp_pam4 = link_info->advertising_pam4;
2003+
}
2004+
bnxt_get_ethtool_speeds(sp_nrz, media, BNXT_SIG_MODE_NRZ, phy_flags,
18952005
lk_ksettings->link_modes.advertising);
1896-
bnxt_get_ethtool_speeds(link_info->advertising_pam4, media,
1897-
BNXT_SIG_MODE_PAM4, phy_flags,
2006+
bnxt_get_ethtool_speeds(sp_pam4, media, BNXT_SIG_MODE_PAM4, phy_flags,
18982007
lk_ksettings->link_modes.advertising);
2008+
bnxt_get_ethtool_speeds(sp_pam4_112, media, BNXT_SIG_MODE_PAM4_112,
2009+
phy_flags, lk_ksettings->link_modes.advertising);
18992010
}
19002011

19012012
static void
@@ -1940,22 +2051,42 @@ static void bnxt_update_speed(u32 *delta, bool installed_media, u16 *speeds,
19402051
static void bnxt_set_ethtool_speeds(struct bnxt_link_info *link_info,
19412052
const unsigned long *et_mask)
19422053
{
2054+
struct bnxt *bp = container_of(link_info, struct bnxt, link_info);
2055+
u16 const *sp_msks, *sp_pam4_msks, *sp_pam4_112_msks;
19432056
enum bnxt_media_type media = bnxt_get_media(link_info);
2057+
u16 *adv, *adv_pam4, *adv_pam4_112 = NULL;
2058+
u32 delta_pam4_112 = 0;
19442059
u32 delta_pam4 = 0;
19452060
u32 delta_nrz = 0;
19462061
int i, m;
19472062

2063+
adv = &link_info->advertising;
2064+
if (bp->phy_flags & BNXT_PHY_FL_SPEEDS2) {
2065+
adv_pam4 = &link_info->advertising;
2066+
adv_pam4_112 = &link_info->advertising;
2067+
sp_msks = bnxt_nrz_speeds2_masks;
2068+
sp_pam4_msks = bnxt_pam4_speeds2_masks;
2069+
sp_pam4_112_msks = bnxt_pam4_112_speeds2_masks;
2070+
} else {
2071+
adv_pam4 = &link_info->advertising_pam4;
2072+
sp_msks = bnxt_nrz_speed_masks;
2073+
sp_pam4_msks = bnxt_pam4_speed_masks;
2074+
}
19482075
for (i = 1; i < __BNXT_LINK_SPEED_END; i++) {
19492076
/* accept any legal media from user */
19502077
for (m = 1; m < __BNXT_MEDIA_END; m++) {
19512078
bnxt_update_speed(&delta_nrz, m == media,
1952-
&link_info->advertising,
1953-
bnxt_nrz_speed_masks[i], et_mask,
2079+
adv, sp_msks[i], et_mask,
19542080
bnxt_link_modes[i][BNXT_SIG_MODE_NRZ][m]);
19552081
bnxt_update_speed(&delta_pam4, m == media,
1956-
&link_info->advertising_pam4,
1957-
bnxt_pam4_speed_masks[i], et_mask,
2082+
adv_pam4, sp_pam4_msks[i], et_mask,
19582083
bnxt_link_modes[i][BNXT_SIG_MODE_PAM4][m]);
2084+
if (!adv_pam4_112)
2085+
continue;
2086+
2087+
bnxt_update_speed(&delta_pam4_112, m == media,
2088+
adv_pam4_112, sp_pam4_112_msks[i], et_mask,
2089+
bnxt_link_modes[i][BNXT_SIG_MODE_PAM4_112][m]);
19592090
}
19602091
}
19612092
}

0 commit comments

Comments
 (0)