forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/net/ethernet/amd/xgbe/xgbe-phy-v2.c
....@@ -166,6 +166,7 @@
166166 XGBE_PORT_MODE_10GBASE_T,
167167 XGBE_PORT_MODE_10GBASE_R,
168168 XGBE_PORT_MODE_SFP,
169
+ XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG,
169170 XGBE_PORT_MODE_MAX,
170171 };
171172
....@@ -188,6 +189,7 @@
188189 XGBE_SFP_CABLE_UNKNOWN = 0,
189190 XGBE_SFP_CABLE_ACTIVE,
190191 XGBE_SFP_CABLE_PASSIVE,
192
+ XGBE_SFP_CABLE_FIBER,
191193 };
192194
193195 enum xgbe_sfp_base {
....@@ -235,9 +237,7 @@
235237
236238 #define XGBE_SFP_BASE_BR 12
237239 #define XGBE_SFP_BASE_BR_1GBE_MIN 0x0a
238
-#define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d
239240 #define XGBE_SFP_BASE_BR_10GBE_MIN 0x64
240
-#define XGBE_SFP_BASE_BR_10GBE_MAX 0x68
241241
242242 #define XGBE_SFP_BASE_CU_CABLE_LEN 18
243243
....@@ -282,6 +282,8 @@
282282
283283 #define XGBE_BEL_FUSE_VENDOR "BEL-FUSE "
284284 #define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 "
285
+
286
+#define XGBE_MOLEX_VENDOR "Molex Inc. "
285287
286288 struct xgbe_sfp_ascii {
287289 union {
....@@ -822,25 +824,22 @@
822824 static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom,
823825 enum xgbe_sfp_speed sfp_speed)
824826 {
825
- u8 *sfp_base, min, max;
827
+ u8 *sfp_base, min;
826828
827829 sfp_base = sfp_eeprom->base;
828830
829831 switch (sfp_speed) {
830832 case XGBE_SFP_SPEED_1000:
831833 min = XGBE_SFP_BASE_BR_1GBE_MIN;
832
- max = XGBE_SFP_BASE_BR_1GBE_MAX;
833834 break;
834835 case XGBE_SFP_SPEED_10000:
835836 min = XGBE_SFP_BASE_BR_10GBE_MIN;
836
- max = XGBE_SFP_BASE_BR_10GBE_MAX;
837837 break;
838838 default:
839839 return false;
840840 }
841841
842
- return ((sfp_base[XGBE_SFP_BASE_BR] >= min) &&
843
- (sfp_base[XGBE_SFP_BASE_BR] <= max));
842
+ return sfp_base[XGBE_SFP_BASE_BR] >= min;
844843 }
845844
846845 static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata)
....@@ -857,6 +856,7 @@
857856
858857 static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata)
859858 {
859
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };
860860 struct xgbe_phy_data *phy_data = pdata->phy_data;
861861 unsigned int phy_id = phy_data->phydev->phy_id;
862862
....@@ -878,9 +878,16 @@
878878 phy_write(phy_data->phydev, 0x04, 0x0d01);
879879 phy_write(phy_data->phydev, 0x00, 0x9140);
880880
881
- phy_data->phydev->supported = PHY_GBIT_FEATURES;
882
- phy_data->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
883
- phy_data->phydev->advertising = phy_data->phydev->supported;
881
+ linkmode_set_bit_array(phy_10_100_features_array,
882
+ ARRAY_SIZE(phy_10_100_features_array),
883
+ supported);
884
+ linkmode_set_bit_array(phy_gbit_features_array,
885
+ ARRAY_SIZE(phy_gbit_features_array),
886
+ supported);
887
+
888
+ linkmode_copy(phy_data->phydev->supported, supported);
889
+
890
+ phy_support_asym_pause(phy_data->phydev);
884891
885892 netif_dbg(pdata, drv, pdata->netdev,
886893 "Finisar PHY quirk in place\n");
....@@ -890,6 +897,7 @@
890897
891898 static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata)
892899 {
900
+ __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, };
893901 struct xgbe_phy_data *phy_data = pdata->phy_data;
894902 struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom;
895903 unsigned int phy_id = phy_data->phydev->phy_id;
....@@ -953,9 +961,14 @@
953961 reg = phy_read(phy_data->phydev, 0x00);
954962 phy_write(phy_data->phydev, 0x00, reg & ~0x00800);
955963
956
- phy_data->phydev->supported = PHY_GBIT_FEATURES;
957
- phy_data->phydev->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
958
- phy_data->phydev->advertising = phy_data->phydev->supported;
964
+ linkmode_set_bit_array(phy_10_100_features_array,
965
+ ARRAY_SIZE(phy_10_100_features_array),
966
+ supported);
967
+ linkmode_set_bit_array(phy_gbit_features_array,
968
+ ARRAY_SIZE(phy_gbit_features_array),
969
+ supported);
970
+ linkmode_copy(phy_data->phydev->supported, supported);
971
+ phy_support_asym_pause(phy_data->phydev);
959972
960973 netif_dbg(pdata, drv, pdata->netdev,
961974 "BelFuse PHY quirk in place\n");
....@@ -977,7 +990,6 @@
977990 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
978991 struct xgbe_phy_data *phy_data = pdata->phy_data;
979992 struct phy_device *phydev;
980
- u32 advertising;
981993 int ret;
982994
983995 /* If we already have a PHY, just return */
....@@ -1037,9 +1049,8 @@
10371049
10381050 xgbe_phy_external_phy_quirks(pdata);
10391051
1040
- ethtool_convert_link_mode_to_legacy_u32(&advertising,
1041
- lks->link_modes.advertising);
1042
- phydev->advertising &= advertising;
1052
+ linkmode_and(phydev->advertising, phydev->advertising,
1053
+ lks->link_modes.advertising);
10431054
10441055 phy_start_aneg(phy_data->phydev);
10451056
....@@ -1129,16 +1140,21 @@
11291140 phy_data->sfp_tx_fault = xgbe_phy_check_sfp_tx_fault(phy_data);
11301141 phy_data->sfp_rx_los = xgbe_phy_check_sfp_rx_los(phy_data);
11311142
1132
- /* Assume ACTIVE cable unless told it is PASSIVE */
1143
+ /* Assume FIBER cable unless told otherwise */
11331144 if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) {
11341145 phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE;
11351146 phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN];
1136
- } else {
1147
+ } else if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_ACTIVE) {
11371148 phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE;
1149
+ } else {
1150
+ phy_data->sfp_cable = XGBE_SFP_CABLE_FIBER;
11381151 }
11391152
11401153 /* Determine the type of SFP */
1141
- if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
1154
+ if (phy_data->sfp_cable != XGBE_SFP_CABLE_FIBER &&
1155
+ xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
1156
+ phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
1157
+ else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR)
11421158 phy_data->sfp_base = XGBE_SFP_BASE_10000_SR;
11431159 else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR)
11441160 phy_data->sfp_base = XGBE_SFP_BASE_10000_LR;
....@@ -1154,9 +1170,6 @@
11541170 phy_data->sfp_base = XGBE_SFP_BASE_1000_CX;
11551171 else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T)
11561172 phy_data->sfp_base = XGBE_SFP_BASE_1000_T;
1157
- else if ((phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE) &&
1158
- xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000))
1159
- phy_data->sfp_base = XGBE_SFP_BASE_10000_CR;
11601173
11611174 switch (phy_data->sfp_base) {
11621175 case XGBE_SFP_BASE_1000_T:
....@@ -1218,7 +1231,7 @@
12181231 for (cc = 0; len; buf++, len--)
12191232 cc += *buf;
12201233
1221
- return (cc == cc_in) ? true : false;
1234
+ return cc == cc_in;
12221235 }
12231236
12241237 static int xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata)
....@@ -1498,10 +1511,7 @@
14981511 if (!phy_data->phydev)
14991512 return;
15001513
1501
- if (phy_data->phydev->advertising & ADVERTISED_Pause)
1502
- lcl_adv |= ADVERTISE_PAUSE_CAP;
1503
- if (phy_data->phydev->advertising & ADVERTISED_Asym_Pause)
1504
- lcl_adv |= ADVERTISE_PAUSE_ASYM;
1514
+ lcl_adv = linkmode_adv_to_lcl_adv_t(phy_data->phydev->advertising);
15051515
15061516 if (phy_data->phydev->pause) {
15071517 XGBE_SET_LP_ADV(lks, Pause);
....@@ -1628,6 +1638,7 @@
16281638 if (ad_reg & 0x80) {
16291639 switch (phy_data->port_mode) {
16301640 case XGBE_PORT_MODE_BACKPLANE:
1641
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
16311642 mode = XGBE_MODE_KR;
16321643 break;
16331644 default:
....@@ -1637,6 +1648,7 @@
16371648 } else if (ad_reg & 0x20) {
16381649 switch (phy_data->port_mode) {
16391650 case XGBE_PORT_MODE_BACKPLANE:
1651
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
16401652 mode = XGBE_MODE_KX_1000;
16411653 break;
16421654 case XGBE_PORT_MODE_1000BASE_X:
....@@ -1776,6 +1788,7 @@
17761788
17771789 switch (phy_data->port_mode) {
17781790 case XGBE_PORT_MODE_BACKPLANE:
1791
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
17791792 XGBE_SET_ADV(dlks, 10000baseKR_Full);
17801793 break;
17811794 case XGBE_PORT_MODE_BACKPLANE_2500:
....@@ -1819,7 +1832,6 @@
18191832 {
18201833 struct ethtool_link_ksettings *lks = &pdata->phy.lks;
18211834 struct xgbe_phy_data *phy_data = pdata->phy_data;
1822
- u32 advertising;
18231835 int ret;
18241836
18251837 ret = xgbe_phy_find_phy_device(pdata);
....@@ -1829,12 +1841,10 @@
18291841 if (!phy_data->phydev)
18301842 return 0;
18311843
1832
- ethtool_convert_link_mode_to_legacy_u32(&advertising,
1833
- lks->link_modes.advertising);
1834
-
18351844 phy_data->phydev->autoneg = pdata->phy.autoneg;
1836
- phy_data->phydev->advertising = phy_data->phydev->supported &
1837
- advertising;
1845
+ linkmode_and(phy_data->phydev->advertising,
1846
+ phy_data->phydev->supported,
1847
+ lks->link_modes.advertising);
18381848
18391849 if (pdata->phy.autoneg != AUTONEG_ENABLE) {
18401850 phy_data->phydev->speed = pdata->phy.speed;
....@@ -1871,6 +1881,7 @@
18711881 switch (phy_data->port_mode) {
18721882 case XGBE_PORT_MODE_BACKPLANE:
18731883 return XGBE_AN_MODE_CL73;
1884
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
18741885 case XGBE_PORT_MODE_BACKPLANE_2500:
18751886 return XGBE_AN_MODE_NONE;
18761887 case XGBE_PORT_MODE_1000BASE_T:
....@@ -2197,6 +2208,7 @@
21972208
21982209 switch (phy_data->port_mode) {
21992210 case XGBE_PORT_MODE_BACKPLANE:
2211
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
22002212 return xgbe_phy_switch_bp_mode(pdata);
22012213 case XGBE_PORT_MODE_BACKPLANE_2500:
22022214 return xgbe_phy_switch_bp_2500_mode(pdata);
....@@ -2292,6 +2304,7 @@
22922304
22932305 switch (phy_data->port_mode) {
22942306 case XGBE_PORT_MODE_BACKPLANE:
2307
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
22952308 return xgbe_phy_get_bp_mode(speed);
22962309 case XGBE_PORT_MODE_BACKPLANE_2500:
22972310 return xgbe_phy_get_bp_2500_mode(speed);
....@@ -2467,6 +2480,7 @@
24672480
24682481 switch (phy_data->port_mode) {
24692482 case XGBE_PORT_MODE_BACKPLANE:
2483
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
24702484 return xgbe_phy_use_bp_mode(pdata, mode);
24712485 case XGBE_PORT_MODE_BACKPLANE_2500:
24722486 return xgbe_phy_use_bp_2500_mode(pdata, mode);
....@@ -2556,6 +2570,7 @@
25562570
25572571 switch (phy_data->port_mode) {
25582572 case XGBE_PORT_MODE_BACKPLANE:
2573
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
25592574 return xgbe_phy_valid_speed_bp_mode(speed);
25602575 case XGBE_PORT_MODE_BACKPLANE_2500:
25612576 return xgbe_phy_valid_speed_bp_2500_mode(speed);
....@@ -2841,6 +2856,7 @@
28412856
28422857 switch (phy_data->port_mode) {
28432858 case XGBE_PORT_MODE_BACKPLANE:
2859
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
28442860 if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) ||
28452861 (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000))
28462862 return false;
....@@ -2893,6 +2909,7 @@
28932909
28942910 switch (phy_data->port_mode) {
28952911 case XGBE_PORT_MODE_BACKPLANE:
2912
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
28962913 case XGBE_PORT_MODE_BACKPLANE_2500:
28972914 if (phy_data->conn_type == XGBE_CONN_TYPE_BACKPLANE)
28982915 return false;
....@@ -3209,6 +3226,8 @@
32093226 /* Backplane support */
32103227 case XGBE_PORT_MODE_BACKPLANE:
32113228 XGBE_SET_SUP(lks, Autoneg);
3229
+ fallthrough;
3230
+ case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG:
32123231 XGBE_SET_SUP(lks, Pause);
32133232 XGBE_SET_SUP(lks, Asym_Pause);
32143233 XGBE_SET_SUP(lks, Backplane);