ixgbe: add 1Gbps support for QSFP+
This patch adds GB speed support for QSFP+ modules. Autonegotiation is not supported with QSFP+. The user will have to set the desired speed on both link partners using ethtool advertise setting. Signed-off-by: Emil Tantilov <emil.s.tantilov@intel.com> Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com> Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
parent
31c7d2b06b
commit
61aaf9e807
|
@ -379,8 +379,13 @@ static s32 ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
|
||||||
|
|
||||||
if (hw->phy.multispeed_fiber) {
|
if (hw->phy.multispeed_fiber) {
|
||||||
*speed |= IXGBE_LINK_SPEED_10GB_FULL |
|
*speed |= IXGBE_LINK_SPEED_10GB_FULL |
|
||||||
IXGBE_LINK_SPEED_1GB_FULL;
|
IXGBE_LINK_SPEED_1GB_FULL;
|
||||||
*autoneg = true;
|
|
||||||
|
/* QSFP must not enable auto-negotiation */
|
||||||
|
if (hw->phy.media_type == ixgbe_media_type_fiber_qsfp)
|
||||||
|
*autoneg = false;
|
||||||
|
else
|
||||||
|
*autoneg = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -700,13 +705,18 @@ static s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Set the module link speed */
|
/* Set the module link speed */
|
||||||
if (hw->phy.media_type == ixgbe_media_type_fiber_fixed) {
|
switch (hw->phy.media_type) {
|
||||||
ixgbe_set_fiber_fixed_speed(hw,
|
case ixgbe_media_type_fiber:
|
||||||
IXGBE_LINK_SPEED_10GB_FULL);
|
|
||||||
} else {
|
|
||||||
esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5);
|
esdp_reg |= (IXGBE_ESDP_SDP5_DIR | IXGBE_ESDP_SDP5);
|
||||||
IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg);
|
IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg);
|
||||||
IXGBE_WRITE_FLUSH(hw);
|
IXGBE_WRITE_FLUSH(hw);
|
||||||
|
break;
|
||||||
|
case ixgbe_media_type_fiber_qsfp:
|
||||||
|
/* QSFP module automatically detects MAC link speed */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
hw_dbg(hw, "Unexpected media type.\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow module to change analog characteristics (1G->10G) */
|
/* Allow module to change analog characteristics (1G->10G) */
|
||||||
|
@ -757,14 +767,23 @@ static s32 ixgbe_setup_mac_link_multispeed_fiber(struct ixgbe_hw *hw,
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Set the module link speed */
|
/* Set the module link speed */
|
||||||
if (hw->phy.media_type == ixgbe_media_type_fiber_fixed) {
|
switch (hw->phy.media_type) {
|
||||||
|
case ixgbe_media_type_fiber_fixed:
|
||||||
ixgbe_set_fiber_fixed_speed(hw,
|
ixgbe_set_fiber_fixed_speed(hw,
|
||||||
IXGBE_LINK_SPEED_1GB_FULL);
|
IXGBE_LINK_SPEED_1GB_FULL);
|
||||||
} else {
|
break;
|
||||||
|
case ixgbe_media_type_fiber:
|
||||||
esdp_reg &= ~IXGBE_ESDP_SDP5;
|
esdp_reg &= ~IXGBE_ESDP_SDP5;
|
||||||
esdp_reg |= IXGBE_ESDP_SDP5_DIR;
|
esdp_reg |= IXGBE_ESDP_SDP5_DIR;
|
||||||
IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg);
|
IXGBE_WRITE_REG(hw, IXGBE_ESDP, esdp_reg);
|
||||||
IXGBE_WRITE_FLUSH(hw);
|
IXGBE_WRITE_FLUSH(hw);
|
||||||
|
break;
|
||||||
|
case ixgbe_media_type_fiber_qsfp:
|
||||||
|
/* QSFP module automatically detects MAC link speed */
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
hw_dbg(hw, "Unexpected media type.\n");
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Allow module to change analog characteristics (10G->1G) */
|
/* Allow module to change analog characteristics (10G->1G) */
|
||||||
|
|
|
@ -311,9 +311,6 @@ static int ixgbe_set_settings(struct net_device *netdev,
|
||||||
* this function does not support duplex forcing, but can
|
* this function does not support duplex forcing, but can
|
||||||
* limit the advertising of the adapter to the specified speed
|
* limit the advertising of the adapter to the specified speed
|
||||||
*/
|
*/
|
||||||
if (ecmd->autoneg == AUTONEG_DISABLE)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
if (ecmd->advertising & ~ecmd->supported)
|
if (ecmd->advertising & ~ecmd->supported)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
|
@ -1205,6 +1205,12 @@ s32 ixgbe_identify_qsfp_module_generic(struct ixgbe_hw *hw)
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
goto err_read_i2c_eeprom;
|
goto err_read_i2c_eeprom;
|
||||||
|
|
||||||
|
status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_QSFP_1GBE_COMP,
|
||||||
|
&comp_codes_1g);
|
||||||
|
|
||||||
|
if (status != 0)
|
||||||
|
goto err_read_i2c_eeprom;
|
||||||
|
|
||||||
if (comp_codes_10g & IXGBE_SFF_QSFP_DA_PASSIVE_CABLE) {
|
if (comp_codes_10g & IXGBE_SFF_QSFP_DA_PASSIVE_CABLE) {
|
||||||
hw->phy.type = ixgbe_phy_qsfp_passive_unknown;
|
hw->phy.type = ixgbe_phy_qsfp_passive_unknown;
|
||||||
if (hw->bus.lan_id == 0)
|
if (hw->bus.lan_id == 0)
|
||||||
|
|
Loading…
Reference in New Issue