Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7216ebc5 authored by Christophe Ricard's avatar Christophe Ricard Committed by Peter Huewe
Browse files

tpm/st33zp24: Add proper wait for ordinal duration in case of irq mode



In case the driver is configured to use irq, we are not waiting the answer
for a duration period to see the DATA_AVAIL status bit to raise but at
maximum timeout_c. This may result in critical failure as we will
not wait long enough for the command completion.

Reviewed-by: default avatarJason Gunthorpe <jason.gunthorpe@obsidianresearch.com>
Signed-off-by: default avatarChristophe Ricard <christophe-h.ricard@st.com>
Fixes: bf38b871 ("tpm/tpm_i2c_stm_st33: Split tpm_i2c_tpm_st33 in 2
layers (core + phy)")
Reviewed-by: default avatarPeter Huewe <peterhuewe@gmx.de>
Signed-off-by: default avatarPeter Huewe <peterhuewe@gmx.de>
parent 6b37729b
Loading
Loading
Loading
Loading
+11 −1
Original line number Diff line number Diff line
@@ -393,7 +393,7 @@ static irqreturn_t tpm_ioserirq_handler(int irq, void *dev_id)
static int st33zp24_send(struct tpm_chip *chip, unsigned char *buf,
			 size_t len)
{
	u32 status, i, size;
	u32 status, i, size, ordinal;
	int burstcnt = 0;
	int ret;
	u8 data;
@@ -456,6 +456,16 @@ static int st33zp24_send(struct tpm_chip *chip, unsigned char *buf,
	if (ret < 0)
		goto out_err;

	if (chip->vendor.irq) {
		ordinal = be32_to_cpu(*((__be32 *) (buf + 6)));

		ret = wait_for_stat(chip, TPM_STS_DATA_AVAIL | TPM_STS_VALID,
				tpm_calc_ordinal_duration(chip, ordinal),
				&chip->vendor.read_queue, false);
		if (ret < 0)
			goto out_err;
	}

	return len;
out_err:
	st33zp24_cancel(chip);