Commit f3b70b6e authored by Alexander Sverdlin's avatar Alexander Sverdlin Committed by Jarkko Sakkinen
Browse files

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: stable@vger.kernel.org # v5.20+
Fixes: bbc23a07 ("tpm: Add tpm_tis_i2c backend for tpm_tis_core")
Tested-by: default avatarMichael Haener <michael.haener@siemens.com>
Signed-off-by: default avatarAlexander Sverdlin <alexander.sverdlin@siemens.com>
Reviewed-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
Reviewed-by: default avatarJerry Snitselaar <jsnitsel@redhat.com>
Signed-off-by: default avatarJarkko Sakkinen <jarkko@kernel.org>
parent f0afba40
Loading
Loading
Loading
Loading
+22 −15
Original line number Diff line number Diff line
@@ -189,6 +189,9 @@ static int tpm_tis_i2c_read_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
	int ret;

	for (i = 0; i < TPM_RETRY; i++) {
		u16 read = 0;

		while (read < len) {
			/* write register */
			msg.len = sizeof(reg);
			msg.buf = &reg;
@@ -198,12 +201,16 @@ static int tpm_tis_i2c_read_bytes(struct tpm_tis_data *data, u32 addr, u16 len,
				return ret;

			/* read data */
		msg.buf = result;
		msg.len = len;
			msg.buf = result + read;
			msg.len = len - read;
			msg.flags = I2C_M_RD;
			if (msg.len > I2C_SMBUS_BLOCK_MAX)
				msg.len = I2C_SMBUS_BLOCK_MAX;
			ret = tpm_tis_i2c_retry_transfer_until_ack(data, &msg);
			if (ret < 0)
				return ret;
			read += msg.len;
		}

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