| .. | .. |
|---|
| 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 | |
|---|
| .. | .. |
|---|
| 238 | 239 | #define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d |
|---|
| 239 | 240 | #define XGBE_SFP_BASE_BR_10GBE_MIN 0x64 |
|---|
| 240 | 241 | #define XGBE_SFP_BASE_BR_10GBE_MAX 0x68 |
|---|
| 242 | +#define XGBE_MOLEX_SFP_BASE_BR_10GBE_MAX 0x78 |
|---|
| 241 | 243 | |
|---|
| 242 | 244 | #define XGBE_SFP_BASE_CU_CABLE_LEN 18 |
|---|
| 243 | 245 | |
|---|
| .. | .. |
|---|
| 282 | 284 | |
|---|
| 283 | 285 | #define XGBE_BEL_FUSE_VENDOR "BEL-FUSE " |
|---|
| 284 | 286 | #define XGBE_BEL_FUSE_PARTNO "1GBT-SFP06 " |
|---|
| 287 | + |
|---|
| 288 | +#define XGBE_MOLEX_VENDOR "Molex Inc. " |
|---|
| 285 | 289 | |
|---|
| 286 | 290 | struct xgbe_sfp_ascii { |
|---|
| 287 | 291 | union { |
|---|
| .. | .. |
|---|
| 833 | 837 | break; |
|---|
| 834 | 838 | case XGBE_SFP_SPEED_10000: |
|---|
| 835 | 839 | min = XGBE_SFP_BASE_BR_10GBE_MIN; |
|---|
| 836 | | - max = XGBE_SFP_BASE_BR_10GBE_MAX; |
|---|
| 840 | + if (memcmp(&sfp_eeprom->base[XGBE_SFP_BASE_VENDOR_NAME], |
|---|
| 841 | + XGBE_MOLEX_VENDOR, XGBE_SFP_BASE_VENDOR_NAME_LEN) == 0) |
|---|
| 842 | + max = XGBE_MOLEX_SFP_BASE_BR_10GBE_MAX; |
|---|
| 843 | + else |
|---|
| 844 | + max = XGBE_SFP_BASE_BR_10GBE_MAX; |
|---|
| 837 | 845 | break; |
|---|
| 838 | 846 | default: |
|---|
| 839 | 847 | return false; |
|---|
| .. | .. |
|---|
| 857 | 865 | |
|---|
| 858 | 866 | static bool xgbe_phy_finisar_phy_quirks(struct xgbe_prv_data *pdata) |
|---|
| 859 | 867 | { |
|---|
| 868 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; |
|---|
| 860 | 869 | struct xgbe_phy_data *phy_data = pdata->phy_data; |
|---|
| 861 | 870 | unsigned int phy_id = phy_data->phydev->phy_id; |
|---|
| 862 | 871 | |
|---|
| .. | .. |
|---|
| 878 | 887 | phy_write(phy_data->phydev, 0x04, 0x0d01); |
|---|
| 879 | 888 | phy_write(phy_data->phydev, 0x00, 0x9140); |
|---|
| 880 | 889 | |
|---|
| 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; |
|---|
| 890 | + linkmode_set_bit_array(phy_10_100_features_array, |
|---|
| 891 | + ARRAY_SIZE(phy_10_100_features_array), |
|---|
| 892 | + supported); |
|---|
| 893 | + linkmode_set_bit_array(phy_gbit_features_array, |
|---|
| 894 | + ARRAY_SIZE(phy_gbit_features_array), |
|---|
| 895 | + supported); |
|---|
| 896 | + |
|---|
| 897 | + linkmode_copy(phy_data->phydev->supported, supported); |
|---|
| 898 | + |
|---|
| 899 | + phy_support_asym_pause(phy_data->phydev); |
|---|
| 884 | 900 | |
|---|
| 885 | 901 | netif_dbg(pdata, drv, pdata->netdev, |
|---|
| 886 | 902 | "Finisar PHY quirk in place\n"); |
|---|
| .. | .. |
|---|
| 890 | 906 | |
|---|
| 891 | 907 | static bool xgbe_phy_belfuse_phy_quirks(struct xgbe_prv_data *pdata) |
|---|
| 892 | 908 | { |
|---|
| 909 | + __ETHTOOL_DECLARE_LINK_MODE_MASK(supported) = { 0, }; |
|---|
| 893 | 910 | struct xgbe_phy_data *phy_data = pdata->phy_data; |
|---|
| 894 | 911 | struct xgbe_sfp_eeprom *sfp_eeprom = &phy_data->sfp_eeprom; |
|---|
| 895 | 912 | unsigned int phy_id = phy_data->phydev->phy_id; |
|---|
| .. | .. |
|---|
| 953 | 970 | reg = phy_read(phy_data->phydev, 0x00); |
|---|
| 954 | 971 | phy_write(phy_data->phydev, 0x00, reg & ~0x00800); |
|---|
| 955 | 972 | |
|---|
| 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; |
|---|
| 973 | + linkmode_set_bit_array(phy_10_100_features_array, |
|---|
| 974 | + ARRAY_SIZE(phy_10_100_features_array), |
|---|
| 975 | + supported); |
|---|
| 976 | + linkmode_set_bit_array(phy_gbit_features_array, |
|---|
| 977 | + ARRAY_SIZE(phy_gbit_features_array), |
|---|
| 978 | + supported); |
|---|
| 979 | + linkmode_copy(phy_data->phydev->supported, supported); |
|---|
| 980 | + phy_support_asym_pause(phy_data->phydev); |
|---|
| 959 | 981 | |
|---|
| 960 | 982 | netif_dbg(pdata, drv, pdata->netdev, |
|---|
| 961 | 983 | "BelFuse PHY quirk in place\n"); |
|---|
| .. | .. |
|---|
| 977 | 999 | struct ethtool_link_ksettings *lks = &pdata->phy.lks; |
|---|
| 978 | 1000 | struct xgbe_phy_data *phy_data = pdata->phy_data; |
|---|
| 979 | 1001 | struct phy_device *phydev; |
|---|
| 980 | | - u32 advertising; |
|---|
| 981 | 1002 | int ret; |
|---|
| 982 | 1003 | |
|---|
| 983 | 1004 | /* If we already have a PHY, just return */ |
|---|
| .. | .. |
|---|
| 1037 | 1058 | |
|---|
| 1038 | 1059 | xgbe_phy_external_phy_quirks(pdata); |
|---|
| 1039 | 1060 | |
|---|
| 1040 | | - ethtool_convert_link_mode_to_legacy_u32(&advertising, |
|---|
| 1041 | | - lks->link_modes.advertising); |
|---|
| 1042 | | - phydev->advertising &= advertising; |
|---|
| 1061 | + linkmode_and(phydev->advertising, phydev->advertising, |
|---|
| 1062 | + lks->link_modes.advertising); |
|---|
| 1043 | 1063 | |
|---|
| 1044 | 1064 | phy_start_aneg(phy_data->phydev); |
|---|
| 1045 | 1065 | |
|---|
| .. | .. |
|---|
| 1138 | 1158 | } |
|---|
| 1139 | 1159 | |
|---|
| 1140 | 1160 | /* Determine the type of SFP */ |
|---|
| 1141 | | - if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR) |
|---|
| 1161 | + if (phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE && |
|---|
| 1162 | + xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000)) |
|---|
| 1163 | + phy_data->sfp_base = XGBE_SFP_BASE_10000_CR; |
|---|
| 1164 | + else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR) |
|---|
| 1142 | 1165 | phy_data->sfp_base = XGBE_SFP_BASE_10000_SR; |
|---|
| 1143 | 1166 | else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_LR) |
|---|
| 1144 | 1167 | phy_data->sfp_base = XGBE_SFP_BASE_10000_LR; |
|---|
| .. | .. |
|---|
| 1154 | 1177 | phy_data->sfp_base = XGBE_SFP_BASE_1000_CX; |
|---|
| 1155 | 1178 | else if (sfp_base[XGBE_SFP_BASE_1GBE_CC] & XGBE_SFP_BASE_1GBE_CC_T) |
|---|
| 1156 | 1179 | 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 | 1180 | |
|---|
| 1161 | 1181 | switch (phy_data->sfp_base) { |
|---|
| 1162 | 1182 | case XGBE_SFP_BASE_1000_T: |
|---|
| .. | .. |
|---|
| 1218 | 1238 | for (cc = 0; len; buf++, len--) |
|---|
| 1219 | 1239 | cc += *buf; |
|---|
| 1220 | 1240 | |
|---|
| 1221 | | - return (cc == cc_in) ? true : false; |
|---|
| 1241 | + return cc == cc_in; |
|---|
| 1222 | 1242 | } |
|---|
| 1223 | 1243 | |
|---|
| 1224 | 1244 | static int xgbe_phy_sfp_read_eeprom(struct xgbe_prv_data *pdata) |
|---|
| .. | .. |
|---|
| 1498 | 1518 | if (!phy_data->phydev) |
|---|
| 1499 | 1519 | return; |
|---|
| 1500 | 1520 | |
|---|
| 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; |
|---|
| 1521 | + lcl_adv = linkmode_adv_to_lcl_adv_t(phy_data->phydev->advertising); |
|---|
| 1505 | 1522 | |
|---|
| 1506 | 1523 | if (phy_data->phydev->pause) { |
|---|
| 1507 | 1524 | XGBE_SET_LP_ADV(lks, Pause); |
|---|
| .. | .. |
|---|
| 1628 | 1645 | if (ad_reg & 0x80) { |
|---|
| 1629 | 1646 | switch (phy_data->port_mode) { |
|---|
| 1630 | 1647 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 1648 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 1631 | 1649 | mode = XGBE_MODE_KR; |
|---|
| 1632 | 1650 | break; |
|---|
| 1633 | 1651 | default: |
|---|
| .. | .. |
|---|
| 1637 | 1655 | } else if (ad_reg & 0x20) { |
|---|
| 1638 | 1656 | switch (phy_data->port_mode) { |
|---|
| 1639 | 1657 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 1658 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 1640 | 1659 | mode = XGBE_MODE_KX_1000; |
|---|
| 1641 | 1660 | break; |
|---|
| 1642 | 1661 | case XGBE_PORT_MODE_1000BASE_X: |
|---|
| .. | .. |
|---|
| 1776 | 1795 | |
|---|
| 1777 | 1796 | switch (phy_data->port_mode) { |
|---|
| 1778 | 1797 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 1798 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 1779 | 1799 | XGBE_SET_ADV(dlks, 10000baseKR_Full); |
|---|
| 1780 | 1800 | break; |
|---|
| 1781 | 1801 | case XGBE_PORT_MODE_BACKPLANE_2500: |
|---|
| .. | .. |
|---|
| 1819 | 1839 | { |
|---|
| 1820 | 1840 | struct ethtool_link_ksettings *lks = &pdata->phy.lks; |
|---|
| 1821 | 1841 | struct xgbe_phy_data *phy_data = pdata->phy_data; |
|---|
| 1822 | | - u32 advertising; |
|---|
| 1823 | 1842 | int ret; |
|---|
| 1824 | 1843 | |
|---|
| 1825 | 1844 | ret = xgbe_phy_find_phy_device(pdata); |
|---|
| .. | .. |
|---|
| 1829 | 1848 | if (!phy_data->phydev) |
|---|
| 1830 | 1849 | return 0; |
|---|
| 1831 | 1850 | |
|---|
| 1832 | | - ethtool_convert_link_mode_to_legacy_u32(&advertising, |
|---|
| 1833 | | - lks->link_modes.advertising); |
|---|
| 1834 | | - |
|---|
| 1835 | 1851 | phy_data->phydev->autoneg = pdata->phy.autoneg; |
|---|
| 1836 | | - phy_data->phydev->advertising = phy_data->phydev->supported & |
|---|
| 1837 | | - advertising; |
|---|
| 1852 | + linkmode_and(phy_data->phydev->advertising, |
|---|
| 1853 | + phy_data->phydev->supported, |
|---|
| 1854 | + lks->link_modes.advertising); |
|---|
| 1838 | 1855 | |
|---|
| 1839 | 1856 | if (pdata->phy.autoneg != AUTONEG_ENABLE) { |
|---|
| 1840 | 1857 | phy_data->phydev->speed = pdata->phy.speed; |
|---|
| .. | .. |
|---|
| 1871 | 1888 | switch (phy_data->port_mode) { |
|---|
| 1872 | 1889 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 1873 | 1890 | return XGBE_AN_MODE_CL73; |
|---|
| 1891 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 1874 | 1892 | case XGBE_PORT_MODE_BACKPLANE_2500: |
|---|
| 1875 | 1893 | return XGBE_AN_MODE_NONE; |
|---|
| 1876 | 1894 | case XGBE_PORT_MODE_1000BASE_T: |
|---|
| .. | .. |
|---|
| 2197 | 2215 | |
|---|
| 2198 | 2216 | switch (phy_data->port_mode) { |
|---|
| 2199 | 2217 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 2218 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 2200 | 2219 | return xgbe_phy_switch_bp_mode(pdata); |
|---|
| 2201 | 2220 | case XGBE_PORT_MODE_BACKPLANE_2500: |
|---|
| 2202 | 2221 | return xgbe_phy_switch_bp_2500_mode(pdata); |
|---|
| .. | .. |
|---|
| 2292 | 2311 | |
|---|
| 2293 | 2312 | switch (phy_data->port_mode) { |
|---|
| 2294 | 2313 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 2314 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 2295 | 2315 | return xgbe_phy_get_bp_mode(speed); |
|---|
| 2296 | 2316 | case XGBE_PORT_MODE_BACKPLANE_2500: |
|---|
| 2297 | 2317 | return xgbe_phy_get_bp_2500_mode(speed); |
|---|
| .. | .. |
|---|
| 2467 | 2487 | |
|---|
| 2468 | 2488 | switch (phy_data->port_mode) { |
|---|
| 2469 | 2489 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 2490 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 2470 | 2491 | return xgbe_phy_use_bp_mode(pdata, mode); |
|---|
| 2471 | 2492 | case XGBE_PORT_MODE_BACKPLANE_2500: |
|---|
| 2472 | 2493 | return xgbe_phy_use_bp_2500_mode(pdata, mode); |
|---|
| .. | .. |
|---|
| 2556 | 2577 | |
|---|
| 2557 | 2578 | switch (phy_data->port_mode) { |
|---|
| 2558 | 2579 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 2580 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 2559 | 2581 | return xgbe_phy_valid_speed_bp_mode(speed); |
|---|
| 2560 | 2582 | case XGBE_PORT_MODE_BACKPLANE_2500: |
|---|
| 2561 | 2583 | return xgbe_phy_valid_speed_bp_2500_mode(speed); |
|---|
| .. | .. |
|---|
| 2841 | 2863 | |
|---|
| 2842 | 2864 | switch (phy_data->port_mode) { |
|---|
| 2843 | 2865 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 2866 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 2844 | 2867 | if ((phy_data->port_speeds & XGBE_PHY_PORT_SPEED_1000) || |
|---|
| 2845 | 2868 | (phy_data->port_speeds & XGBE_PHY_PORT_SPEED_10000)) |
|---|
| 2846 | 2869 | return false; |
|---|
| .. | .. |
|---|
| 2893 | 2916 | |
|---|
| 2894 | 2917 | switch (phy_data->port_mode) { |
|---|
| 2895 | 2918 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 2919 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 2896 | 2920 | case XGBE_PORT_MODE_BACKPLANE_2500: |
|---|
| 2897 | 2921 | if (phy_data->conn_type == XGBE_CONN_TYPE_BACKPLANE) |
|---|
| 2898 | 2922 | return false; |
|---|
| .. | .. |
|---|
| 3209 | 3233 | /* Backplane support */ |
|---|
| 3210 | 3234 | case XGBE_PORT_MODE_BACKPLANE: |
|---|
| 3211 | 3235 | XGBE_SET_SUP(lks, Autoneg); |
|---|
| 3236 | + fallthrough; |
|---|
| 3237 | + case XGBE_PORT_MODE_BACKPLANE_NO_AUTONEG: |
|---|
| 3212 | 3238 | XGBE_SET_SUP(lks, Pause); |
|---|
| 3213 | 3239 | XGBE_SET_SUP(lks, Asym_Pause); |
|---|
| 3214 | 3240 | XGBE_SET_SUP(lks, Backplane); |
|---|