Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 61aaf9e8 authored by Emil Tantilov's avatar Emil Tantilov Committed by Jeff Kirsher
Browse files

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: default avatarEmil Tantilov <emil.s.tantilov@intel.com>
Tested-by: default avatarPhil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent 31c7d2b0
Loading
Loading
Loading
Loading
+27 −8
Original line number Original line Diff line number Diff line
@@ -380,6 +380,11 @@ 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;

		/* QSFP must not enable auto-negotiation */
		if (hw->phy.media_type == ixgbe_media_type_fiber_qsfp)
			*autoneg = false;
		else
			*autoneg = true;
			*autoneg = true;
	}
	}


@@ -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) */
+0 −3
Original line number Original line Diff line number Diff line
@@ -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;


+6 −0
Original line number Original line Diff line number Diff line
@@ -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)