| .. | .. |
|---|
| 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); |
|---|