.. | .. |
---|
166 | 166 | XGBE_PORT_MODE_10GBASE_T, |
---|
167 | 167 | XGBE_PORT_MODE_10GBASE_R, |
---|
168 | 168 | XGBE_PORT_MODE_SFP, |
---|
| 169 | + XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG, |
---|
169 | 170 | XGBE_PORT_MODE_MAX, |
---|
170 | 171 | }; |
---|
171 | 172 | |
---|
.. | .. |
---|
188 | 189 | XGBE_SFP_CABLE_UNKNOWN = 0, |
---|
189 | 190 | XGBE_SFP_CABLE_ACTIVE, |
---|
190 | 191 | XGBE_SFP_CABLE_PASSIVE, |
---|
| 192 | + XGBE_SFP_CABLE_FIBER, |
---|
191 | 193 | }; |
---|
192 | 194 | |
---|
193 | 195 | enum xgbe_sfp_base { |
---|
.. | .. |
---|
235 | 237 | |
---|
236 | 238 | #define XGBE_SFP_BASE_BR 12 |
---|
237 | 239 | #define XGBE_SFP_BASE_BR_1GBE_MIN 0x0a |
---|
238 | | -#define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d |
---|
239 | 240 | #define XGBE_SFP_BASE_BR_10GBE_MIN 0x64 |
---|
240 | | -#define XGBE_SFP_BASE_BR_10GBE_MAX 0x68 |
---|
241 | 241 | |
---|
242 | 242 | #define XGBE_SFP_BASE_CU_CABLE_LEN 18 |
---|
243 | 243 | |
---|
.. | .. |
---|
282 | 282 | |
---|
283 | 283 | #define XGBE_BEL_FUSE_VENDOR "BEL-FUSE " |
---|
284 | 284 | #define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 " |
---|
| 285 | + |
---|
| 286 | +#define XGBE_MOLEX_VENDOR "Molex Inc. " |
---|
285 | 287 | |
---|
286 | 288 | struct xgbe_sfp_ascii { |
---|
287 | 289 | union { |
---|
.. | .. |
---|
822 | 824 | static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom, |
---|
823 | 825 | enum xgbe_sfp_speed sfp_speed) |
---|
824 | 826 | { |
---|
825 | | - u8 *sfp_base, min, max; |
---|
| 827 | + u8 *sfp_base, min; |
---|
826 | 828 | |
---|
827 | 829 | sfp_base = sfp_eeprom->base; |
---|
828 | 830 | |
---|
829 | 831 | switch (sfp_speed) { |
---|
830 | 832 | case XGBE_SFP_SPEED_1000: |
---|
831 | 833 | min = XGBE_SFP_BASE_BR_1GBE_MIN; |
---|
832 | | - max = XGBE_SFP_BASE_BR_1GBE_MAX; |
---|
833 | 834 | break; |
---|
834 | 835 | case XGBE_SFP_SPEED_10000: |
---|
835 | 836 | min = XGBE_SFP_BASE_BR_10GBE_MIN; |
---|
836 | | - max = XGBE_SFP_BASE_BR_10GBE_MAX; |
---|
837 | 837 | break; |
---|
838 | 838 | default: |
---|
839 | 839 | return false; |
---|
840 | 840 | } |
---|
841 | 841 | |
---|
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; |
---|
844 | 843 | } |
---|
845 | 844 | |
---|
846 | 845 | static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata) |
---|
.. | .. |
---|
857 | 856 | |
---|
858 | 857 | static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata) |
---|
859 | 858 | { |
---|
| 859 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; |
---|
860 | 860 | struct xgbe_phy_data *phy_data = pdata->phy_data; |
---|
861 | 861 | unsigned int phy_id = phy_data->phydev->phy_id; |
---|
862 | 862 | |
---|
.. | .. |
---|
878 | 878 | phy_write(phy_data->phydev, 0x04, 0x0d01); |
---|
879 | 879 | phy_write(phy_data->phydev, 0x00, 0x9140); |
---|
880 | 880 | |
---|
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); |
---|
884 | 891 | |
---|
885 | 892 | netif_dbg(pdata, drv, pdata->netdev, |
---|
886 | 893 | "Finisar PHY quirk in place\n"); |
---|
.. | .. |
---|
890 | 897 | |
---|
891 | 898 | static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata) |
---|
892 | 899 | { |
---|
| 900 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; |
---|
893 | 901 | struct xgbe_phy_data *phy_data = pdata->phy_data; |
---|
894 | 902 | struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom; |
---|
895 | 903 | unsigned int phy_id = phy_data->phydev->phy_id; |
---|
.. | .. |
---|
953 | 961 | reg = phy_read(phy_data->phydev, 0x00); |
---|
954 | 962 | phy_write(phy_data->phydev, 0x00, reg & ~0x00800); |
---|
955 | 963 | |
---|
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); |
---|
959 | 972 | |
---|
960 | 973 | netif_dbg(pdata, drv, pdata->netdev, |
---|
961 | 974 | "BelFuse PHY quirk in place\n"); |
---|
.. | .. |
---|
977 | 990 | struct ethtool_link_ksettings *lks = &pdata->phy.lks; |
---|
978 | 991 | struct xgbe_phy_data *phy_data = pdata->phy_data; |
---|
979 | 992 | struct phy_device *phydev; |
---|
980 | | - u32 advertising; |
---|
981 | 993 | int ret; |
---|
982 | 994 | |
---|
983 | 995 | /* If we already have a PHY, just return */ |
---|
.. | .. |
---|
1037 | 1049 | |
---|
1038 | 1050 | xgbe_phy_external_phy_quirks(pdata); |
---|
1039 | 1051 | |
---|
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); |
---|
1043 | 1054 | |
---|
1044 | 1055 | phy_start_aneg(phy_data->phydev); |
---|
1045 | 1056 | |
---|
.. | .. |
---|
1129 | 1140 | phy_data->sfp_tx_fault = xgbe_phy_check_sfp_tx_fault(phy_data); |
---|
1130 | 1141 | phy_data->sfp_rx_los = xgbe_phy_check_sfp_rx_los(phy_data); |
---|
1131 | 1142 | |
---|
1132 | | - /* Assume ACTIVE cable unless told it is PASSIVE */ |
---|
| 1143 | + /* Assume FIBER cable unless told otherwise */ |
---|
1133 | 1144 | if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) { |
---|
1134 | 1145 | phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE; |
---|
1135 | 1146 | 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) { |
---|
1137 | 1148 | phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE; |
---|
| 1149 | + } else { |
---|
| 1150 | + phy_data->sfp_cable = XGBE_SFP_CABLE_FIBER; |
---|
1138 | 1151 | } |
---|
1139 | 1152 | |
---|
1140 | 1153 | /* 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) |
---|
1142 | 1158 | phy_data->sfp_base = XGBE_SFP_BASE_10000_SR; |
---|
1143 | 1159 | else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR) |
---|
1144 | 1160 | phy_data->sfp_base = XGBE_SFP_BASE_10000_LR; |
---|
.. | .. |
---|
1154 | 1170 | phy_data->sfp_base = XGBE_SFP_BASE_1000_CX; |
---|
1155 | 1171 | else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T) |
---|
1156 | 1172 | 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; |
---|
1160 | 1173 | |
---|
1161 | 1174 | switch (phy_data->sfp_base) { |
---|
1162 | 1175 | case XGBE_SFP_BASE_1000_T: |
---|
.. | .. |
---|
1218 | 1231 | for (cc = 0; len; buf++, len--) |
---|
1219 | 1232 | cc += *buf; |
---|
1220 | 1233 | |
---|
1221 | | - return (cc == cc_in) ? true : false; |
---|
| 1234 | + return cc == cc_in; |
---|
1222 | 1235 | } |
---|
1223 | 1236 | |
---|
1224 | 1237 | static int xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata) |
---|
.. | .. |
---|
1498 | 1511 | if (!phy_data->phydev) |
---|
1499 | 1512 | return; |
---|
1500 | 1513 | |
---|
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); |
---|
1505 | 1515 | |
---|
1506 | 1516 | if (phy_data->phydev->pause) { |
---|
1507 | 1517 | XGBE_SET_LP_ADV(lks, Pause); |
---|
.. | .. |
---|
1628 | 1638 | if (ad_reg & 0x80) { |
---|
1629 | 1639 | switch (phy_data->port_mode) { |
---|
1630 | 1640 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 1641 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
1631 | 1642 | mode = XGBE_MODE_KR; |
---|
1632 | 1643 | break; |
---|
1633 | 1644 | default: |
---|
.. | .. |
---|
1637 | 1648 | } else if (ad_reg & 0x20) { |
---|
1638 | 1649 | switch (phy_data->port_mode) { |
---|
1639 | 1650 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 1651 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
1640 | 1652 | mode = XGBE_MODE_KX_1000; |
---|
1641 | 1653 | break; |
---|
1642 | 1654 | case XGBE_PORT_MODE_1000BASE_X: |
---|
.. | .. |
---|
1776 | 1788 | |
---|
1777 | 1789 | switch (phy_data->port_mode) { |
---|
1778 | 1790 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 1791 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
1779 | 1792 | XGBE_SET_ADV(dlks, 10000baseKR_Full); |
---|
1780 | 1793 | break; |
---|
1781 | 1794 | case XGBE_PORT_MODE_BACKPLANE_2500: |
---|
.. | .. |
---|
1819 | 1832 | { |
---|
1820 | 1833 | struct ethtool_link_ksettings *lks = &pdata->phy.lks; |
---|
1821 | 1834 | struct xgbe_phy_data *phy_data = pdata->phy_data; |
---|
1822 | | - u32 advertising; |
---|
1823 | 1835 | int ret; |
---|
1824 | 1836 | |
---|
1825 | 1837 | ret = xgbe_phy_find_phy_device(pdata); |
---|
.. | .. |
---|
1829 | 1841 | if (!phy_data->phydev) |
---|
1830 | 1842 | return 0; |
---|
1831 | 1843 | |
---|
1832 | | - ethtool_convert_link_mode_to_legacy_u32(&advertising, |
---|
1833 | | - lks->link_modes.advertising); |
---|
1834 | | - |
---|
1835 | 1844 | 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); |
---|
1838 | 1848 | |
---|
1839 | 1849 | if (pdata->phy.autoneg != AUTONEG_ENABLE) { |
---|
1840 | 1850 | phy_data->phydev->speed = pdata->phy.speed; |
---|
.. | .. |
---|
1871 | 1881 | switch (phy_data->port_mode) { |
---|
1872 | 1882 | case XGBE_PORT_MODE_BACKPLANE: |
---|
1873 | 1883 | return XGBE_AN_MODE_CL73; |
---|
| 1884 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
1874 | 1885 | case XGBE_PORT_MODE_BACKPLANE_2500: |
---|
1875 | 1886 | return XGBE_AN_MODE_NONE; |
---|
1876 | 1887 | case XGBE_PORT_MODE_1000BASE_T: |
---|
.. | .. |
---|
2197 | 2208 | |
---|
2198 | 2209 | switch (phy_data->port_mode) { |
---|
2199 | 2210 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 2211 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
2200 | 2212 | return xgbe_phy_switch_bp_mode(pdata); |
---|
2201 | 2213 | case XGBE_PORT_MODE_BACKPLANE_2500: |
---|
2202 | 2214 | return xgbe_phy_switch_bp_2500_mode(pdata); |
---|
.. | .. |
---|
2292 | 2304 | |
---|
2293 | 2305 | switch (phy_data->port_mode) { |
---|
2294 | 2306 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 2307 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
2295 | 2308 | return xgbe_phy_get_bp_mode(speed); |
---|
2296 | 2309 | case XGBE_PORT_MODE_BACKPLANE_2500: |
---|
2297 | 2310 | return xgbe_phy_get_bp_2500_mode(speed); |
---|
.. | .. |
---|
2467 | 2480 | |
---|
2468 | 2481 | switch (phy_data->port_mode) { |
---|
2469 | 2482 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 2483 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
2470 | 2484 | return xgbe_phy_use_bp_mode(pdata, mode); |
---|
2471 | 2485 | case XGBE_PORT_MODE_BACKPLANE_2500: |
---|
2472 | 2486 | return xgbe_phy_use_bp_2500_mode(pdata, mode); |
---|
.. | .. |
---|
2556 | 2570 | |
---|
2557 | 2571 | switch (phy_data->port_mode) { |
---|
2558 | 2572 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 2573 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
2559 | 2574 | return xgbe_phy_valid_speed_bp_mode(speed); |
---|
2560 | 2575 | case XGBE_PORT_MODE_BACKPLANE_2500: |
---|
2561 | 2576 | return xgbe_phy_valid_speed_bp_2500_mode(speed); |
---|
.. | .. |
---|
2841 | 2856 | |
---|
2842 | 2857 | switch (phy_data->port_mode) { |
---|
2843 | 2858 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 2859 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
2844 | 2860 | if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) || |
---|
2845 | 2861 | (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)) |
---|
2846 | 2862 | return false; |
---|
.. | .. |
---|
2893 | 2909 | |
---|
2894 | 2910 | switch (phy_data->port_mode) { |
---|
2895 | 2911 | case XGBE_PORT_MODE_BACKPLANE: |
---|
| 2912 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
2896 | 2913 | case XGBE_PORT_MODE_BACKPLANE_2500: |
---|
2897 | 2914 | if (phy_data->conn_type == XGBE_CONN_TYPE_BACKPLANE) |
---|
2898 | 2915 | return false; |
---|
.. | .. |
---|
3209 | 3226 | /* Backplane support */ |
---|
3210 | 3227 | case XGBE_PORT_MODE_BACKPLANE: |
---|
3211 | 3228 | XGBE_SET_SUP(lks, Autoneg); |
---|
| 3229 | + fallthrough; |
---|
| 3230 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
---|
3212 | 3231 | XGBE_SET_SUP(lks, Pause); |
---|
3213 | 3232 | XGBE_SET_SUP(lks, Asym_Pause); |
---|
3214 | 3233 | XGBE_SET_SUP(lks, Backplane); |
---|