@@ -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
15821598static 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
18031883static 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
18851988static 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
19012012static void
@@ -1940,22 +2051,42 @@ static void bnxt_update_speed(u32 *delta, bool installed_media, u16 *speeds,
19402051static 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