|
@@ -531,6 +531,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
u8 comp_codes_10g = 0;
|
|
u8 comp_codes_10g = 0;
|
|
u8 oui_bytes[3] = {0, 0, 0};
|
|
u8 oui_bytes[3] = {0, 0, 0};
|
|
u8 cable_tech = 0;
|
|
u8 cable_tech = 0;
|
|
|
|
+ u8 cable_spec = 0;
|
|
u16 enforce_sfp = 0;
|
|
u16 enforce_sfp = 0;
|
|
|
|
|
|
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
|
|
if (hw->mac.ops.get_media_type(hw) != ixgbe_media_type_fiber) {
|
|
@@ -580,14 +581,30 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
else
|
|
else
|
|
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
|
hw->phy.sfp_type = ixgbe_sfp_type_unknown;
|
|
} else if (hw->mac.type == ixgbe_mac_82599EB) {
|
|
} else if (hw->mac.type == ixgbe_mac_82599EB) {
|
|
- if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
|
|
|
|
|
+ if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
|
|
if (hw->bus.lan_id == 0)
|
|
if (hw->bus.lan_id == 0)
|
|
hw->phy.sfp_type =
|
|
hw->phy.sfp_type =
|
|
ixgbe_sfp_type_da_cu_core0;
|
|
ixgbe_sfp_type_da_cu_core0;
|
|
else
|
|
else
|
|
hw->phy.sfp_type =
|
|
hw->phy.sfp_type =
|
|
ixgbe_sfp_type_da_cu_core1;
|
|
ixgbe_sfp_type_da_cu_core1;
|
|
- else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
|
|
|
|
|
|
+ } else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE) {
|
|
|
|
+ hw->phy.ops.read_i2c_eeprom(
|
|
|
|
+ hw, IXGBE_SFF_CABLE_SPEC_COMP,
|
|
|
|
+ &cable_spec);
|
|
|
|
+ if (cable_spec &
|
|
|
|
+ IXGBE_SFF_DA_SPEC_ACTIVE_LIMITING) {
|
|
|
|
+ if (hw->bus.lan_id == 0)
|
|
|
|
+ hw->phy.sfp_type =
|
|
|
|
+ ixgbe_sfp_type_da_act_lmt_core0;
|
|
|
|
+ else
|
|
|
|
+ hw->phy.sfp_type =
|
|
|
|
+ ixgbe_sfp_type_da_act_lmt_core1;
|
|
|
|
+ } else {
|
|
|
|
+ hw->phy.sfp_type =
|
|
|
|
+ ixgbe_sfp_type_unknown;
|
|
|
|
+ }
|
|
|
|
+ } else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
|
|
if (hw->bus.lan_id == 0)
|
|
if (hw->bus.lan_id == 0)
|
|
hw->phy.sfp_type =
|
|
hw->phy.sfp_type =
|
|
ixgbe_sfp_type_srlr_core0;
|
|
ixgbe_sfp_type_srlr_core0;
|
|
@@ -637,10 +654,14 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
switch (vendor_oui) {
|
|
switch (vendor_oui) {
|
|
case IXGBE_SFF_VENDOR_OUI_TYCO:
|
|
case IXGBE_SFF_VENDOR_OUI_TYCO:
|
|
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
|
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
|
- hw->phy.type = ixgbe_phy_tw_tyco;
|
|
|
|
|
|
+ hw->phy.type =
|
|
|
|
+ ixgbe_phy_sfp_passive_tyco;
|
|
break;
|
|
break;
|
|
case IXGBE_SFF_VENDOR_OUI_FTL:
|
|
case IXGBE_SFF_VENDOR_OUI_FTL:
|
|
- hw->phy.type = ixgbe_phy_sfp_ftl;
|
|
|
|
|
|
+ if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
|
|
|
+ hw->phy.type = ixgbe_phy_sfp_ftl_active;
|
|
|
|
+ else
|
|
|
|
+ hw->phy.type = ixgbe_phy_sfp_ftl;
|
|
break;
|
|
break;
|
|
case IXGBE_SFF_VENDOR_OUI_AVAGO:
|
|
case IXGBE_SFF_VENDOR_OUI_AVAGO:
|
|
hw->phy.type = ixgbe_phy_sfp_avago;
|
|
hw->phy.type = ixgbe_phy_sfp_avago;
|
|
@@ -650,7 +671,11 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
break;
|
|
break;
|
|
default:
|
|
default:
|
|
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
|
if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
|
|
- hw->phy.type = ixgbe_phy_tw_unknown;
|
|
|
|
|
|
+ hw->phy.type =
|
|
|
|
+ ixgbe_phy_sfp_passive_unknown;
|
|
|
|
+ else if (cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE)
|
|
|
|
+ hw->phy.type =
|
|
|
|
+ ixgbe_phy_sfp_active_unknown;
|
|
else
|
|
else
|
|
hw->phy.type = ixgbe_phy_sfp_unknown;
|
|
hw->phy.type = ixgbe_phy_sfp_unknown;
|
|
break;
|
|
break;
|
|
@@ -658,7 +683,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
|
|
}
|
|
}
|
|
|
|
|
|
/* All passive DA cables are supported */
|
|
/* All passive DA cables are supported */
|
|
- if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
|
|
|
|
|
|
+ if (cable_tech & (IXGBE_SFF_DA_PASSIVE_CABLE |
|
|
|
|
+ IXGBE_SFF_DA_ACTIVE_CABLE)) {
|
|
status = 0;
|
|
status = 0;
|
|
goto out;
|
|
goto out;
|
|
}
|
|
}
|