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

Commit 8f56e4b9 authored by Don Skidmore's avatar Don Skidmore Committed by Jeff Kirsher
Browse files

ixgbe: add I2C clock stretching



This patch adds support for I2C clock stretching which is required per
SFF-8636.  Customers with passive DA cables implement clock stretching
would fail without this patch.

Signed-off-by: default avatarDon Skidmore <donald.c.skidmore@intel.com>
Tested-by: default avatarPhil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
parent be0c0068
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -1582,13 +1582,21 @@ static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data)
 **/
static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl)
{
	*i2cctl |= IXGBE_I2C_CLK_OUT;
	u32 i = 0;
	u32 timeout = IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT;
	u32 i2cctl_r = 0;

	for (i = 0; i < timeout; i++) {
		*i2cctl |= IXGBE_I2C_CLK_OUT;
		IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl);
		IXGBE_WRITE_FLUSH(hw);

		/* SCL rise time (1000ns) */
		udelay(IXGBE_I2C_T_RISE);

		i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
		if (i2cctl_r & IXGBE_I2C_CLK_IN)
			break;
	}
}

/**
+1 −0
Original line number Diff line number Diff line
@@ -110,6 +110,7 @@
#define IXGBE_I2C_CLK_OUT   0x00000002
#define IXGBE_I2C_DATA_IN   0x00000004
#define IXGBE_I2C_DATA_OUT  0x00000008
#define IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT	500

/* Interrupt Registers */
#define IXGBE_EICR      0x00800