Skip to content

Commit f3b70b6

Browse files
ccpalexjarkkojs
authored andcommitted
tpm: tis_i2c: Limit read bursts to I2C_SMBUS_BLOCK_MAX (32) bytes
Underlying I2C bus drivers not always support longer transfers and imx-lpi2c for instance doesn't. SLB 9673 offers 427-bytes packets. Visible symptoms are: tpm tpm0: Error left over data tpm tpm0: tpm_transmit: tpm_recv: error -5 tpm_tis_i2c: probe of 1-002e failed with error -5 Cc: [email protected] # v5.20+ Fixes: bbc23a0 ("tpm: Add tpm_tis_i2c backend for tpm_tis_core") Tested-by: Michael Haener <[email protected]> Signed-off-by: Alexander Sverdlin <[email protected]> Reviewed-by: Jarkko Sakkinen <[email protected]> Reviewed-by: Jerry Snitselaar <[email protected]> Signed-off-by: Jarkko Sakkinen <[email protected]>
1 parent f0afba4 commit f3b70b6

File tree

1 file changed

+22
-15
lines changed

1 file changed

+22
-15
lines changed

drivers/char/tpm/tpm_tis_i2c.c

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -189,21 +189,28 @@ static int tpm_tis_i2c_read_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
189189
int ret;
190190

191191
for (i = 0; i < TPM_RETRY; i++) {
192-
/* write register */
193-
msg.len = sizeof(reg);
194-
msg.buf = &reg;
195-
msg.flags = 0;
196-
ret = tpm_tis_i2c_retry_transfer_until_ack(data, &msg);
197-
if (ret < 0)
198-
return ret;
199-
200-
/* read data */
201-
msg.buf = result;
202-
msg.len = len;
203-
msg.flags = I2C_M_RD;
204-
ret = tpm_tis_i2c_retry_transfer_until_ack(data, &msg);
205-
if (ret < 0)
206-
return ret;
192+
u16 read = 0;
193+
194+
while (read < len) {
195+
/* write register */
196+
msg.len = sizeof(reg);
197+
msg.buf = &reg;
198+
msg.flags = 0;
199+
ret = tpm_tis_i2c_retry_transfer_until_ack(data, &msg);
200+
if (ret < 0)
201+
return ret;
202+
203+
/* read data */
204+
msg.buf = result + read;
205+
msg.len = len - read;
206+
msg.flags = I2C_M_RD;
207+
if (msg.len > I2C_SMBUS_BLOCK_MAX)
208+
msg.len = I2C_SMBUS_BLOCK_MAX;
209+
ret = tpm_tis_i2c_retry_transfer_until_ack(data, &msg);
210+
if (ret < 0)
211+
return ret;
212+
read += msg.len;
213+
}
207214

208215
ret = tpm_tis_i2c_sanity_check_read(reg, len, result);
209216
if (ret == 0)

0 commit comments

Comments
 (0)