Message ID | 20180620051803.12206-2-peda@axentia.se (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Wed, Jun 20, 2018 at 07:17:54AM +0200, Peter Rosin wrote: > Locking the root adapter for __i2c_transfer will deadlock if the > device sits behind a mux-locked I2C mux. Switch to the finer-grained > i2c_lock_bus with the I2C_LOCK_SEGMENT flag. If the device does not > sit behind a mux-locked mux, the two locking variants are equivalent. > > Signed-off-by: Peter Rosin <peda@axentia.se> Studied enough so that I can give Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Do not have hardware to test this, however. /Jarkko
On 25.06.2018 12:24, Jarkko Sakkinen wrote: > On Wed, Jun 20, 2018 at 07:17:54AM +0200, Peter Rosin wrote: >> Locking the root adapter for __i2c_transfer will deadlock if the >> device sits behind a mux-locked I2C mux. Switch to the finer-grained >> i2c_lock_bus with the I2C_LOCK_SEGMENT flag. If the device does not >> sit behind a mux-locked mux, the two locking variants are equivalent. >> >> Signed-off-by: Peter Rosin <peda@axentia.se> > > Studied enough so that I can give > > Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > > Do not have hardware to test this, however. I don't have a mux-locked I2C mux either, but at least I can confirm that this change did not break my existing test setup (SLB9635/SLB9645 on Raspberry Pi 2B). Tested-by: Alexander Steffen <Alexander.Steffen@infineon.com> Alexander
On Tue, 2018-06-26 at 12:07 +0200, Alexander Steffen wrote: > On 25.06.2018 12:24, Jarkko Sakkinen wrote: > > On Wed, Jun 20, 2018 at 07:17:54AM +0200, Peter Rosin wrote: > > > Locking the root adapter for __i2c_transfer will deadlock if the > > > device sits behind a mux-locked I2C mux. Switch to the finer-grained > > > i2c_lock_bus with the I2C_LOCK_SEGMENT flag. If the device does not > > > sit behind a mux-locked mux, the two locking variants are equivalent. > > > > > > Signed-off-by: Peter Rosin <peda@axentia.se> > > > > Studied enough so that I can give > > > > Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > > > > Do not have hardware to test this, however. > > I don't have a mux-locked I2C mux either, but at least I can confirm > that this change did not break my existing test setup (SLB9635/SLB9645 > on Raspberry Pi 2B). > > Tested-by: Alexander Steffen <Alexander.Steffen@infineon.com> > > Alexander Given the scope of the change and since analogous change works for every other subsystem, this should be enough! Thank you. /Jarkko
On Tue, 2018-06-26 at 15:05 +0300, Jarkko Sakkinen wrote: > On Tue, 2018-06-26 at 12:07 +0200, Alexander Steffen wrote: > > On 25.06.2018 12:24, Jarkko Sakkinen wrote: > > > On Wed, Jun 20, 2018 at 07:17:54AM +0200, Peter Rosin wrote: > > > > Locking the root adapter for __i2c_transfer will deadlock if the > > > > device sits behind a mux-locked I2C mux. Switch to the finer-grained > > > > i2c_lock_bus with the I2C_LOCK_SEGMENT flag. If the device does not > > > > sit behind a mux-locked mux, the two locking variants are equivalent. > > > > > > > > Signed-off-by: Peter Rosin <peda@axentia.se> > > > > > > Studied enough so that I can give > > > > > > Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> > > > > > > Do not have hardware to test this, however. > > > > I don't have a mux-locked I2C mux either, but at least I can confirm > > that this change did not break my existing test setup (SLB9635/SLB9645 > > on Raspberry Pi 2B). > > > > Tested-by: Alexander Steffen <Alexander.Steffen@infineon.com> > > > > Alexander > > Given the scope of the change and since analogous change works for > every other subsystem, this should be enough! Thank you. It is now applied to my tree (master). I will move it to the next branch once James has updated security/next-general. /Jarkko
diff --git a/drivers/char/tpm/tpm_i2c_infineon.c b/drivers/char/tpm/tpm_i2c_infineon.c index 6116cd05e228..9086edc9066b 100644 --- a/drivers/char/tpm/tpm_i2c_infineon.c +++ b/drivers/char/tpm/tpm_i2c_infineon.c @@ -117,7 +117,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len) /* Lock the adapter for the duration of the whole sequence. */ if (!tpm_dev.client->adapter->algo->master_xfer) return -EOPNOTSUPP; - i2c_lock_adapter(tpm_dev.client->adapter); + i2c_lock_bus(tpm_dev.client->adapter, I2C_LOCK_SEGMENT); if (tpm_dev.chip_type == SLB9645) { /* use a combined read for newer chips @@ -192,7 +192,7 @@ static int iic_tpm_read(u8 addr, u8 *buffer, size_t len) } out: - i2c_unlock_adapter(tpm_dev.client->adapter); + i2c_unlock_bus(tpm_dev.client->adapter, I2C_LOCK_SEGMENT); /* take care of 'guard time' */ usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI); @@ -224,7 +224,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len, if (!tpm_dev.client->adapter->algo->master_xfer) return -EOPNOTSUPP; - i2c_lock_adapter(tpm_dev.client->adapter); + i2c_lock_bus(tpm_dev.client->adapter, I2C_LOCK_SEGMENT); /* prepend the 'register address' to the buffer */ tpm_dev.buf[0] = addr; @@ -243,7 +243,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len, usleep_range(sleep_low, sleep_hi); } - i2c_unlock_adapter(tpm_dev.client->adapter); + i2c_unlock_bus(tpm_dev.client->adapter, I2C_LOCK_SEGMENT); /* take care of 'guard time' */ usleep_range(SLEEP_DURATION_LOW, SLEEP_DURATION_HI);
Locking the root adapter for __i2c_transfer will deadlock if the device sits behind a mux-locked I2C mux. Switch to the finer-grained i2c_lock_bus with the I2C_LOCK_SEGMENT flag. If the device does not sit behind a mux-locked mux, the two locking variants are equivalent. Signed-off-by: Peter Rosin <peda@axentia.se> --- drivers/char/tpm/tpm_i2c_infineon.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)