From: Christophe Ricard Date: Mon, 23 Mar 2015 21:29:56 +0000 (+0100) Subject: tpm/st33zp24: Add proper wait for ordinal duration in case of irq mode X-Git-Url: https://git.karo-electronics.de/?a=commitdiff_plain;h=7216ebc51bdd62517be6878dd37555ff428a80c9;p=linux-beck.git 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: Jason Gunthorpe Signed-off-by: Christophe Ricard Fixes: bf38b8710892 ("tpm/tpm_i2c_stm_st33: Split tpm_i2c_tpm_st33 in 2 layers (core + phy)") Reviewed-by: Peter Huewe Signed-off-by: Peter Huewe --- diff --git a/drivers/char/tpm/st33zp24/st33zp24.c b/drivers/char/tpm/st33zp24/st33zp24.c index 03f254384585..8d626784cd8d 100644 --- a/drivers/char/tpm/st33zp24/st33zp24.c +++ b/drivers/char/tpm/st33zp24/st33zp24.c @@ -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);