diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c')
-rw-r--r-- | drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c index bf9f82f4b1ae..24117709d6a2 100644 --- a/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c +++ b/drivers/net/ethernet/intel/ixgbe/ixgbe_phy.c | |||
@@ -1582,13 +1582,21 @@ static s32 ixgbe_clock_out_i2c_bit(struct ixgbe_hw *hw, bool data) | |||
1582 | **/ | 1582 | **/ |
1583 | static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) | 1583 | static void ixgbe_raise_i2c_clk(struct ixgbe_hw *hw, u32 *i2cctl) |
1584 | { | 1584 | { |
1585 | *i2cctl |= IXGBE_I2C_CLK_OUT; | 1585 | u32 i = 0; |
1586 | 1586 | u32 timeout = IXGBE_I2C_CLOCK_STRETCHING_TIMEOUT; | |
1587 | IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); | 1587 | u32 i2cctl_r = 0; |
1588 | IXGBE_WRITE_FLUSH(hw); | ||
1589 | 1588 | ||
1590 | /* SCL rise time (1000ns) */ | 1589 | for (i = 0; i < timeout; i++) { |
1591 | udelay(IXGBE_I2C_T_RISE); | 1590 | *i2cctl |= IXGBE_I2C_CLK_OUT; |
1591 | IXGBE_WRITE_REG(hw, IXGBE_I2CCTL, *i2cctl); | ||
1592 | IXGBE_WRITE_FLUSH(hw); | ||
1593 | /* SCL rise time (1000ns) */ | ||
1594 | udelay(IXGBE_I2C_T_RISE); | ||
1595 | |||
1596 | i2cctl_r = IXGBE_READ_REG(hw, IXGBE_I2CCTL); | ||
1597 | if (i2cctl_r & IXGBE_I2C_CLK_IN) | ||
1598 | break; | ||
1599 | } | ||
1592 | } | 1600 | } |
1593 | 1601 | ||
1594 | /** | 1602 | /** |