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: Don Skidmore <donald.c.skidmore@intel.com>
Tested-by: Phil Schmitt <phillip.j.schmitt@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
This commit is contained in:
Don Skidmore 2012-03-15 07:36:37 +00:00 committed by Jeff Kirsher
parent be0c006814
commit 8f56e4b9ab
2 changed files with 14 additions and 5 deletions

View file

@ -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) 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;
IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); for (i = 0; i < timeout; i++) {
IXGBE_WRITE_FLUSH(hw); *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);
/* SCL rise time (1000ns) */ i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL);
udelay(IXGBE_I2C_T_RISE); if (i2cctl_r & IXGBE_I2C_CLK_IN)
break;
}
} }
/** /**

View file

@ -110,6 +110,7 @@
#define IXGBE_I2C_CLK_OUT 0x00000002 #define IXGBE_I2C_CLK_OUT 0x00000002
#define IXGBE_I2C_DATA_IN 0x00000004 #define IXGBE_I2C_DATA_IN 0x00000004
#define IXGBE_I2C_DATA_OUT 0x00000008 #define IXGBE_I2C_DATA_OUT 0x00000008
#define IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT 500
/* Interrupt Registers */ /* Interrupt Registers */
#define IXGBE_EICR 0x00800 #define IXGBE_EICR 0x00800