Commit 483dd5f3 authored by Birger Koblitz's avatar Birger Koblitz Committed by Tony Nguyen
Browse files

ixgbe: Add 10G-BX support



Add support for 10G-BX modules, i.e. 10GBit Ethernet over a single strand
Single-Mode fiber.
The initialization of a 10G-BX SFP+ is the same as for a 10G SX/LX module,
and is identified according to SFF-8472 table 5-3, footnote 3 by the
10G Ethernet Compliance Codes field being empty, the Nominal Bit
Rate being compatible with 12.5GBit, and the module being a fiber module
with a Single Mode fiber link length.

This was tested using a Lightron WSPXG-HS3LC-IEA 1270/1330nm 10km
transceiver:
$ sudo ethtool -m enp1s0f1
   Identifier                          : 0x03 (SFP)
   Extended identifier                 : 0x04 (GBIC/SFP defined by 2-wire interface ID)
   Connector                           : 0x07 (LC)
   Transceiver codes                   : 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
   Encoding                            : 0x01 (8B/10B)
   BR Nominal                          : 10300MBd
   Rate identifier                     : 0x00 (unspecified)
   Length (SMF)                        : 10km
   Length (OM2)                        : 0m
   Length (OM1)                        : 0m
   Length (Copper or Active cable)     : 0m
   Length (OM3)                        : 0m
   Laser wavelength                    : 1330nm
   Vendor name                         : Lightron Inc.
   Vendor OUI                          : 00:13:c5
   Vendor PN                           : WSPXG-HS3LC-IEA
   Vendor rev                          : 0000
   Option values                       : 0x00 0x1a
   Option                              : TX_DISABLE implemented
   BR margin max                       : 0%
   BR margin min                       : 0%
   Vendor SN                           : S142228617
   Date code                           : 140611
   Optical diagnostics support         : Yes

Signed-off-by: default avatarBirger Koblitz <mail@birger-koblitz.de>
Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
Reviewed-by: default avatarPaul Menzel <pmenzel@molgen.mpg.de>
Reviewed-by: default avatarAleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: default avatarRinitha S <sx.rinitha@intel.com>
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 2769e6c3
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -342,6 +342,13 @@ static int ixgbe_get_link_capabilities_82599(struct ixgbe_hw *hw,
		return 0;
	}

	if (hw->phy.sfp_type == ixgbe_sfp_type_10g_bx_core0 ||
	    hw->phy.sfp_type == ixgbe_sfp_type_10g_bx_core1) {
		*speed = IXGBE_LINK_SPEED_10GB_FULL;
		*autoneg = false;
		return 0;
	}

	/*
	 * Determine link capabilities based on the stored value of AUTOC,
	 * which represents EEPROM defaults.  If AUTOC value has not been
+2 −0
Original line number Diff line number Diff line
@@ -351,6 +351,8 @@ static int ixgbe_get_link_ksettings(struct net_device *netdev,
		case ixgbe_sfp_type_1g_lx_core1:
		case ixgbe_sfp_type_1g_bx_core0:
		case ixgbe_sfp_type_1g_bx_core1:
		case ixgbe_sfp_type_10g_bx_core0:
		case ixgbe_sfp_type_10g_bx_core1:
			ethtool_link_ksettings_add_link_mode(cmd, supported,
							     FIBRE);
			ethtool_link_ksettings_add_link_mode(cmd, advertising,
+40 −5
Original line number Diff line number Diff line
@@ -1534,8 +1534,10 @@ int ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
	struct ixgbe_adapter *adapter = hw->back;
	u8 oui_bytes[3] = {0, 0, 0};
	u8 bitrate_nominal = 0;
	u8 sm_length_100m = 0;
	u8 comp_codes_10g = 0;
	u8 comp_codes_1g = 0;
	u8 sm_length_km = 0;
	u16 enforce_sfp = 0;
	u32 vendor_oui = 0;
	u8 identifier = 0;
@@ -1678,6 +1680,33 @@ int ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
			else
				hw->phy.sfp_type =
					ixgbe_sfp_type_1g_bx_core1;
		/* Support Ethernet 10G-BX, checking the Bit Rate
		 * Nominal Value as per SFF-8472 to be 12.5 Gb/s (67h) and
		 * Single Mode fibre with at least 1km link length
		 */
		} else if ((!comp_codes_10g) && (bitrate_nominal == 0x67) &&
			   (!(cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)) &&
			   (!(cable_tech & IXGBE_SFF_DA_ACTIVE_CABLE))) {
			status = hw->phy.ops.read_i2c_eeprom(hw,
					    IXGBE_SFF_SM_LENGTH_KM,
					    &sm_length_km);
			if (status != 0)
				goto err_read_i2c_eeprom;
			status = hw->phy.ops.read_i2c_eeprom(hw,
					    IXGBE_SFF_SM_LENGTH_100M,
					    &sm_length_100m);
			if (status != 0)
				goto err_read_i2c_eeprom;
			if (sm_length_km > 0 || sm_length_100m >= 10) {
				if (hw->bus.lan_id == 0)
					hw->phy.sfp_type =
						ixgbe_sfp_type_10g_bx_core0;
				else
					hw->phy.sfp_type =
						ixgbe_sfp_type_10g_bx_core1;
			} else {
				hw->phy.sfp_type = ixgbe_sfp_type_unknown;
			}
		} else {
			hw->phy.sfp_type = ixgbe_sfp_type_unknown;
		}
@@ -1768,7 +1797,9 @@ int ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_bx_core0 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_bx_core1)) {
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_bx_core1 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_10g_bx_core0 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_10g_bx_core1)) {
		hw->phy.type = ixgbe_phy_sfp_unsupported;
		return -EOPNOTSUPP;
	}
@@ -1786,7 +1817,9 @@ int ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_sx_core1 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_bx_core0 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_bx_core1)) {
	      hw->phy.sfp_type == ixgbe_sfp_type_1g_bx_core1 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_10g_bx_core0 ||
	      hw->phy.sfp_type == ixgbe_sfp_type_10g_bx_core1)) {
		/* Make sure we're a supported PHY type */
		if (hw->phy.type == ixgbe_phy_sfp_intel)
			return 0;
@@ -2016,20 +2049,22 @@ int ixgbe_get_sfp_init_sequence_offsets(struct ixgbe_hw *hw,
		return -EOPNOTSUPP;

	/*
	 * Limiting active cables and 1G Phys must be initialized as
	 * Limiting active cables, 10G BX and 1G Phys must be initialized as
	 * SR modules
	 */
	if (sfp_type == ixgbe_sfp_type_da_act_lmt_core0 ||
	    sfp_type == ixgbe_sfp_type_1g_lx_core0 ||
	    sfp_type == ixgbe_sfp_type_1g_cu_core0 ||
	    sfp_type == ixgbe_sfp_type_1g_sx_core0 ||
	    sfp_type == ixgbe_sfp_type_1g_bx_core0)
	    sfp_type == ixgbe_sfp_type_1g_bx_core0 ||
	    sfp_type == ixgbe_sfp_type_10g_bx_core0)
		sfp_type = ixgbe_sfp_type_srlr_core0;
	else if (sfp_type == ixgbe_sfp_type_da_act_lmt_core1 ||
		 sfp_type == ixgbe_sfp_type_1g_lx_core1 ||
		 sfp_type == ixgbe_sfp_type_1g_cu_core1 ||
		 sfp_type == ixgbe_sfp_type_1g_sx_core1 ||
		 sfp_type == ixgbe_sfp_type_1g_bx_core1)
		 sfp_type == ixgbe_sfp_type_1g_bx_core1 ||
		 sfp_type == ixgbe_sfp_type_10g_bx_core1)
		sfp_type = ixgbe_sfp_type_srlr_core1;

	/* Read offset to PHY init contents */
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@
#define IXGBE_SFF_QSFP_1GBE_COMP	0x86
#define IXGBE_SFF_QSFP_CABLE_LENGTH	0x92
#define IXGBE_SFF_QSFP_DEVICE_TECH	0x93
#define IXGBE_SFF_SM_LENGTH_KM		0xE
#define IXGBE_SFF_SM_LENGTH_100M	0xF

/* Bitmasks */
#define IXGBE_SFF_DA_PASSIVE_CABLE		0x4
+2 −0
Original line number Diff line number Diff line
@@ -3286,6 +3286,8 @@ enum ixgbe_sfp_type {
	ixgbe_sfp_type_1g_lx_core1 = 14,
	ixgbe_sfp_type_1g_bx_core0 = 15,
	ixgbe_sfp_type_1g_bx_core1 = 16,
	ixgbe_sfp_type_10g_bx_core0 = 17,
	ixgbe_sfp_type_10g_bx_core1 = 18,

	ixgbe_sfp_type_not_present = 0xFFFE,
	ixgbe_sfp_type_unknown = 0xFFFF