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

Commit 537d58a0 authored by Peter P Waskiewicz Jr's avatar Peter P Waskiewicz Jr Committed by David S. Miller
Browse files

ixgbe: Change Direct Attach Twinax cable detection for SFP+ NICs



The SFF specification for Direct Attach cable detection has now been
ratified.  Previously, DA cable detect was looking at the Twinaxial bit in
byte 9 of the SFP+ EEPROM.  The spec now defines active and passive DA
cables in byte 8 of the SFP+ EEPROM.  This patch changes the cable
detection for both 82598 and 82599 SFP+ adapters to conform to the new
spec.

Signed-off-by: default avatarPeter P Waskiewicz Jr <peter.p.waskiewicz.jr@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent aa5aec88
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -527,7 +527,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
	u8 comp_codes_1g = 0;
	u8 comp_codes_10g = 0;
	u8 oui_bytes[3] = {0, 0, 0};
	u8 transmission_media = 0;
	u8 cable_tech = 0;
	u16 enforce_sfp = 0;

	status = hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_IDENTIFIER,
@@ -543,8 +543,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
		                            &comp_codes_1g);
		hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_10GBE_COMP_CODES,
		                            &comp_codes_10g);
		hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_TRANSMISSION_MEDIA,
		                            &transmission_media);
		hw->phy.ops.read_i2c_eeprom(hw, IXGBE_SFF_CABLE_TECHNOLOGY,
		                            &cable_tech);

		/* ID Module
		 * =========
@@ -557,7 +557,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
		 * 6    SFP_SR/LR_CORE1 - 82599-specific
		 */
		if (hw->mac.type == ixgbe_mac_82598EB) {
			if (transmission_media & IXGBE_SFF_TWIN_AX_CAPABLE)
			if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
				hw->phy.sfp_type = ixgbe_sfp_type_da_cu;
			else if (comp_codes_10g & IXGBE_SFF_10GBASESR_CAPABLE)
				hw->phy.sfp_type = ixgbe_sfp_type_sr;
@@ -566,7 +566,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
			else
				hw->phy.sfp_type = ixgbe_sfp_type_unknown;
		} else if (hw->mac.type == ixgbe_mac_82599EB) {
			if (transmission_media & IXGBE_SFF_TWIN_AX_CAPABLE)
			if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
				if (hw->bus.lan_id == 0)
					hw->phy.sfp_type =
					             ixgbe_sfp_type_da_cu_core0;
@@ -621,8 +621,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)

			switch (vendor_oui) {
			case IXGBE_SFF_VENDOR_OUI_TYCO:
				if (transmission_media &
				    IXGBE_SFF_TWIN_AX_CAPABLE)
				if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
					hw->phy.type = ixgbe_phy_tw_tyco;
				break;
			case IXGBE_SFF_VENDOR_OUI_FTL:
@@ -635,8 +634,7 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
				hw->phy.type = ixgbe_phy_sfp_intel;
				break;
			default:
				if (transmission_media &
				    IXGBE_SFF_TWIN_AX_CAPABLE)
				if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE)
					hw->phy.type = ixgbe_phy_tw_unknown;
				else
					hw->phy.type = ixgbe_phy_sfp_unknown;
@@ -644,8 +642,8 @@ s32 ixgbe_identify_sfp_module_generic(struct ixgbe_hw *hw)
			}
		}

		/* All DA cables are supported */
		if (transmission_media & IXGBE_SFF_TWIN_AX_CAPABLE) {
		/* All passive DA cables are supported */
		if (cable_tech & IXGBE_SFF_DA_PASSIVE_CABLE) {
			status = 0;
			goto out;
		}
+2 −2
Original line number Diff line number Diff line
@@ -39,10 +39,10 @@
#define IXGBE_SFF_VENDOR_OUI_BYTE2   0x27
#define IXGBE_SFF_1GBE_COMP_CODES    0x6
#define IXGBE_SFF_10GBE_COMP_CODES   0x3
#define IXGBE_SFF_TRANSMISSION_MEDIA 0x9
#define IXGBE_SFF_CABLE_TECHNOLOGY   0x8

/* Bitmasks */
#define IXGBE_SFF_TWIN_AX_CAPABLE            0x80
#define IXGBE_SFF_DA_PASSIVE_CABLE           0x4
#define IXGBE_SFF_1GBASESX_CAPABLE           0x1
#define IXGBE_SFF_1GBASELX_CAPABLE           0x2
#define IXGBE_SFF_10GBASESR_CAPABLE          0x10