| .. | .. |
|---|
| 189 | 189 | XGBE_SFP_CABLE_UNKNOWN = 0, |
|---|
| 190 | 190 | XGBE_SFP_CABLE_ACTIVE, |
|---|
| 191 | 191 | XGBE_SFP_CABLE_PASSIVE, |
|---|
| 192 | + XGBE_SFP_CABLE_FIBER, |
|---|
| 192 | 193 | }; |
|---|
| 193 | 194 | |
|---|
| 194 | 195 | enum xgbe_sfp_base { |
|---|
| .. | .. |
|---|
| 236 | 237 | |
|---|
| 237 | 238 | #define XGBE_SFP_BASE_BR 12 |
|---|
| 238 | 239 | #define XGBE_SFP_BASE_BR_1GBE_MIN 0x0a |
|---|
| 239 | | -#define XGBE_SFP_BASE_BR_1GBE_MAX 0x0d |
|---|
| 240 | 240 | #define XGBE_SFP_BASE_BR_10GBE_MIN 0x64 |
|---|
| 241 | | -#define XGBE_SFP_BASE_BR_10GBE_MAX 0x68 |
|---|
| 242 | | -#define XGBE_MOLEX_SFP_BASE_BR_10GBE_MAX 0x78 |
|---|
| 243 | 241 | |
|---|
| 244 | 242 | #define XGBE_SFP_BASE_CU_CABLE_LEN 18 |
|---|
| 245 | 243 | |
|---|
| .. | .. |
|---|
| 826 | 824 | static bool xgbe_phy_sfp_bit_rate(struct xgbe_sfp_eeprom *sfp_eeprom, |
|---|
| 827 | 825 | enum xgbe_sfp_speed sfp_speed) |
|---|
| 828 | 826 | { |
|---|
| 829 | | - u8 *sfp_base, min, max; |
|---|
| 827 | + u8 *sfp_base, min; |
|---|
| 830 | 828 | |
|---|
| 831 | 829 | sfp_base = sfp_eeprom->base; |
|---|
| 832 | 830 | |
|---|
| 833 | 831 | switch (sfp_speed) { |
|---|
| 834 | 832 | case XGBE_SFP_SPEED_1000: |
|---|
| 835 | 833 | min = XGBE_SFP_BASE_BR_1GBE_MIN; |
|---|
| 836 | | - max = XGBE_SFP_BASE_BR_1GBE_MAX; |
|---|
| 837 | 834 | break; |
|---|
| 838 | 835 | case XGBE_SFP_SPEED_10000: |
|---|
| 839 | 836 | min = XGBE_SFP_BASE_BR_10GBE_MIN; |
|---|
| 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; |
|---|
| 845 | 837 | break; |
|---|
| 846 | 838 | default: |
|---|
| 847 | 839 | return false; |
|---|
| 848 | 840 | } |
|---|
| 849 | 841 | |
|---|
| 850 | | - return ((sfp_base[XGBE_SFP_BASE_BR] >= min) && |
|---|
| 851 | | - (sfp_base[XGBE_SFP_BASE_BR] <= max)); |
|---|
| 842 | + return sfp_base[XGBE_SFP_BASE_BR] >= min; |
|---|
| 852 | 843 | } |
|---|
| 853 | 844 | |
|---|
| 854 | 845 | static void xgbe_phy_free_phy_device(struct xgbe_prv_data *pdata) |
|---|
| .. | .. |
|---|
| 1149 | 1140 | phy_data->sfp_tx_fault = xgbe_phy_check_sfp_tx_fault(phy_data); |
|---|
| 1150 | 1141 | phy_data->sfp_rx_los = xgbe_phy_check_sfp_rx_los(phy_data); |
|---|
| 1151 | 1142 | |
|---|
| 1152 | | - /* Assume ACTIVE cable unless told it is PASSIVE */ |
|---|
| 1143 | + /* Assume FIBER cable unless told otherwise */ |
|---|
| 1153 | 1144 | if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_PASSIVE) { |
|---|
| 1154 | 1145 | phy_data->sfp_cable = XGBE_SFP_CABLE_PASSIVE; |
|---|
| 1155 | 1146 | phy_data->sfp_cable_len = sfp_base[XGBE_SFP_BASE_CU_CABLE_LEN]; |
|---|
| 1156 | | - } else { |
|---|
| 1147 | + } else if (sfp_base[XGBE_SFP_BASE_CABLE] & XGBE_SFP_BASE_CABLE_ACTIVE) { |
|---|
| 1157 | 1148 | phy_data->sfp_cable = XGBE_SFP_CABLE_ACTIVE; |
|---|
| 1149 | + } else { |
|---|
| 1150 | + phy_data->sfp_cable = XGBE_SFP_CABLE_FIBER; |
|---|
| 1158 | 1151 | } |
|---|
| 1159 | 1152 | |
|---|
| 1160 | 1153 | /* Determine the type of SFP */ |
|---|
| 1161 | | - if (phy_data->sfp_cable == XGBE_SFP_CABLE_PASSIVE && |
|---|
| 1154 | + if (phy_data->sfp_cable != XGBE_SFP_CABLE_FIBER && |
|---|
| 1162 | 1155 | xgbe_phy_sfp_bit_rate(sfp_eeprom, XGBE_SFP_SPEED_10000)) |
|---|
| 1163 | 1156 | phy_data->sfp_base = XGBE_SFP_BASE_10000_CR; |
|---|
| 1164 | 1157 | else if (sfp_base[XGBE_SFP_BASE_10GBE_CC] & XGBE_SFP_BASE_10GBE_CC_SR) |
|---|