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

Commit 4319a797 authored by Don Skidmore's avatar Don Skidmore Committed by Jeff Kirsher
Browse files

ixgbe: Add work around for empty SFP+ cage crosstalk



It is possible on some systems that crosstalk could lead to link flap
on empty SFP+ cages.  A new NVM bit was defined to let SW know it
needs to implement the work around which consists of verifying that
there is a module in the cage before acting on the LSC.

Signed-off-by: default avatarDon Skidmore <donald.c.skidmore@intel.com>
Tested-by: default avatarAndrew Bowers <andrewx.bowers@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent a0254a70
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -803,6 +803,8 @@ struct ixgbe_adapter {

#define IXGBE_RSS_KEY_SIZE     40  /* size of RSS Hash Key in bytes */
	u32 rss_key[IXGBE_RSS_KEY_SIZE / sizeof(u32)];

	bool need_crosstalk_fix;
};

static inline u8 ixgbe_max_rss_indices(struct ixgbe_adapter *adapter)
+39 −0
Original line number Diff line number Diff line
@@ -5572,6 +5572,7 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter)
	struct pci_dev *pdev = adapter->pdev;
	unsigned int rss, fdir;
	u32 fwsm;
	u16 device_caps;
#ifdef CONFIG_IXGBE_DCB
	int j;
	struct tc_configuration *tc;
@@ -5737,6 +5738,22 @@ static int ixgbe_sw_init(struct ixgbe_adapter *adapter)
	adapter->tx_ring_count = IXGBE_DEFAULT_TXD;
	adapter->rx_ring_count = IXGBE_DEFAULT_RXD;

	/* Cache bit indicating need for crosstalk fix */
	switch (hw->mac.type) {
	case ixgbe_mac_82599EB:
	case ixgbe_mac_X550EM_x:
	case ixgbe_mac_x550em_a:
		hw->mac.ops.get_device_caps(hw, &device_caps);
		if (device_caps & IXGBE_DEVICE_CAPS_NO_CROSSTALK_WR)
			adapter->need_crosstalk_fix = false;
		else
			adapter->need_crosstalk_fix = true;
		break;
	default:
		adapter->need_crosstalk_fix = false;
		break;
	}

	/* set default work limits */
	adapter->tx_work_limit = IXGBE_DEFAULT_TX_WORK;

@@ -6659,6 +6676,18 @@ static void ixgbe_watchdog_update_link(struct ixgbe_adapter *adapter)
		link_up = true;
	}

	/* If Crosstalk fix enabled do the sanity check of making sure
	 * the SFP+ cage is empty.
	 */
	if (adapter->need_crosstalk_fix) {
		u32 sfp_cage_full;

		sfp_cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
				IXGBE_ESDP_SDP2;
		if (ixgbe_is_sfp(hw) && link_up && !sfp_cage_full)
			link_up = false;
	}

	if (adapter->ixgbe_ieee_pfc)
		pfc_en |= !!(adapter->ixgbe_ieee_pfc->pfc_en);

@@ -7005,6 +7034,16 @@ static void ixgbe_sfp_detection_subtask(struct ixgbe_adapter *adapter)
	struct ixgbe_hw *hw = &adapter->hw;
	s32 err;

	/* If crosstalk fix enabled verify the SFP+ cage is full */
	if (adapter->need_crosstalk_fix) {
		u32 sfp_cage_full;

		sfp_cage_full = IXGBE_READ_REG(hw, IXGBE_ESDP) &
				IXGBE_ESDP_SDP2;
		if (!sfp_cage_full)
			return;
	}

	/* not searching for SFP so there is nothing to do here */
	if (!(adapter->flags2 & IXGBE_FLAG2_SEARCH_FOR_SFP) &&
	    !(adapter->flags2 & IXGBE_FLAG2_SFP_NEEDS_RESET))
+1 −0
Original line number Diff line number Diff line
@@ -2124,6 +2124,7 @@ enum {
#define IXGBE_SAN_MAC_ADDR_PORT1_OFFSET  0x3
#define IXGBE_DEVICE_CAPS_ALLOW_ANY_SFP  0x1
#define IXGBE_DEVICE_CAPS_FCOE_OFFLOADS  0x2
#define IXGBE_DEVICE_CAPS_NO_CROSSTALK_WR	BIT(7)
#define IXGBE_FW_LESM_PARAMETERS_PTR     0x2
#define IXGBE_FW_LESM_STATE_1            0x1
#define IXGBE_FW_LESM_STATE_ENABLED      0x8000 /* LESM Enable bit */