1 From f5595f5baa30e009bf54d0d7653a9a0cc465be60 Mon Sep 17 00:00:00 2001
2 From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
3 Date: Fri, 8 Feb 2019 18:30:58 +0200
4 Subject: tpm: Unify the send callback behaviour
6 From: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
8 commit f5595f5baa30e009bf54d0d7653a9a0cc465be60 upstream.
10 The send() callback should never return length as it does not in every
11 driver except tpm_crb in the success case. The reason is that the main
12 transmit functionality only cares about whether the transmit was
13 successful or not and ignores the count completely.
15 Suggested-by: Stefan Berger <stefanb@linux.ibm.com>
16 Cc: stable@vger.kernel.org
17 Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com>
18 Reviewed-by: Stefan Berger <stefanb@linux.ibm.com>
19 Reviewed-by: Jerry Snitselaar <jsnitsel@redhat.com>
20 Tested-by: Alexander Steffen <Alexander.Steffen@infineon.com>
21 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
24 drivers/char/tpm/st33zp24/st33zp24.c | 2 +-
25 drivers/char/tpm/tpm-interface.c | 11 ++++++++++-
26 drivers/char/tpm/tpm_atmel.c | 2 +-
27 drivers/char/tpm/tpm_i2c_atmel.c | 6 +++++-
28 drivers/char/tpm/tpm_i2c_infineon.c | 2 +-
29 drivers/char/tpm/tpm_i2c_nuvoton.c | 2 +-
30 drivers/char/tpm/tpm_ibmvtpm.c | 8 ++++----
31 drivers/char/tpm/tpm_infineon.c | 2 +-
32 drivers/char/tpm/tpm_nsc.c | 2 +-
33 drivers/char/tpm/tpm_tis_core.c | 2 +-
34 drivers/char/tpm/tpm_vtpm_proxy.c | 3 +--
35 drivers/char/tpm/xen-tpmfront.c | 2 +-
36 12 files changed, 28 insertions(+), 16 deletions(-)
38 --- a/drivers/char/tpm/st33zp24/st33zp24.c
39 +++ b/drivers/char/tpm/st33zp24/st33zp24.c
40 @@ -436,7 +436,7 @@ static int st33zp24_send(struct tpm_chip
47 st33zp24_cancel(chip);
48 release_locality(chip);
49 --- a/drivers/char/tpm/tpm-interface.c
50 +++ b/drivers/char/tpm/tpm-interface.c
51 @@ -495,10 +495,19 @@ static ssize_t tpm_try_transmit(struct t
55 - "%s: tpm_send: error %d\n", __func__, rc);
56 + "%s: send(): error %d\n", __func__, rc);
60 + /* A sanity check. send() should just return zero on success e.g.
61 + * not the command length.
64 + dev_warn(&chip->dev,
65 + "%s: send(): invalid value %d\n", __func__, rc);
69 if (chip->flags & TPM_CHIP_FLAG_IRQ)
72 --- a/drivers/char/tpm/tpm_atmel.c
73 +++ b/drivers/char/tpm/tpm_atmel.c
74 @@ -105,7 +105,7 @@ static int tpm_atml_send(struct tpm_chip
75 iowrite8(buf[i], priv->iobase);
82 static void tpm_atml_cancel(struct tpm_chip *chip)
83 --- a/drivers/char/tpm/tpm_i2c_atmel.c
84 +++ b/drivers/char/tpm/tpm_i2c_atmel.c
85 @@ -65,7 +65,11 @@ static int i2c_atmel_send(struct tpm_chi
87 "%s(buf=%*ph len=%0zx) -> sts=%d\n", __func__,
88 (int)min_t(size_t, 64, len), buf, len, status);
97 static int i2c_atmel_recv(struct tpm_chip *chip, u8 *buf, size_t count)
98 --- a/drivers/char/tpm/tpm_i2c_infineon.c
99 +++ b/drivers/char/tpm/tpm_i2c_infineon.c
100 @@ -587,7 +587,7 @@ static int tpm_tis_i2c_send(struct tpm_c
102 iic_tpm_write(TPM_STS(tpm_dev.locality), &sts, 1);
107 tpm_tis_i2c_ready(chip);
108 /* The TPM needs some time to clean up here,
109 --- a/drivers/char/tpm/tpm_i2c_nuvoton.c
110 +++ b/drivers/char/tpm/tpm_i2c_nuvoton.c
111 @@ -469,7 +469,7 @@ static int i2c_nuvoton_send(struct tpm_c
114 dev_dbg(dev, "%s() -> %zd\n", __func__, len);
119 static bool i2c_nuvoton_req_canceled(struct tpm_chip *chip, u8 status)
120 --- a/drivers/char/tpm/tpm_ibmvtpm.c
121 +++ b/drivers/char/tpm/tpm_ibmvtpm.c
122 @@ -141,14 +141,14 @@ static int tpm_ibmvtpm_recv(struct tpm_c
126 - * tpm_ibmvtpm_send - Send tpm request
128 + * tpm_ibmvtpm_send() - Send a TPM command
129 * @chip: tpm chip struct
130 * @buf: buffer contains data to send
131 * @count: size of buffer
134 - * Number of bytes sent or < 0 on error.
138 static int tpm_ibmvtpm_send(struct tpm_chip *chip, u8 *buf, size_t count)
140 @@ -194,7 +194,7 @@ static int tpm_ibmvtpm_send(struct tpm_c
142 ibmvtpm->tpm_processing_cmd = false;
147 spin_unlock(&ibmvtpm->rtce_lock);
149 --- a/drivers/char/tpm/tpm_infineon.c
150 +++ b/drivers/char/tpm/tpm_infineon.c
151 @@ -354,7 +354,7 @@ static int tpm_inf_send(struct tpm_chip
152 for (i = 0; i < count; i++) {
153 wait_and_send(chip, buf[i]);
159 static void tpm_inf_cancel(struct tpm_chip *chip)
160 --- a/drivers/char/tpm/tpm_nsc.c
161 +++ b/drivers/char/tpm/tpm_nsc.c
162 @@ -226,7 +226,7 @@ static int tpm_nsc_send(struct tpm_chip
164 outb(NSC_COMMAND_EOC, priv->base + NSC_COMMAND);
170 static void tpm_nsc_cancel(struct tpm_chip *chip)
171 --- a/drivers/char/tpm/tpm_tis_core.c
172 +++ b/drivers/char/tpm/tpm_tis_core.c
173 @@ -485,7 +485,7 @@ static int tpm_tis_send_main(struct tpm_
182 --- a/drivers/char/tpm/tpm_vtpm_proxy.c
183 +++ b/drivers/char/tpm/tpm_vtpm_proxy.c
184 @@ -335,7 +335,6 @@ static int vtpm_proxy_is_driver_command(
185 static int vtpm_proxy_tpm_op_send(struct tpm_chip *chip, u8 *buf, size_t count)
187 struct proxy_dev *proxy_dev = dev_get_drvdata(&chip->dev);
190 if (count > sizeof(proxy_dev->buffer)) {
192 @@ -366,7 +365,7 @@ static int vtpm_proxy_tpm_op_send(struct
194 wake_up_interruptible(&proxy_dev->wq);
200 static void vtpm_proxy_tpm_op_cancel(struct tpm_chip *chip)
201 --- a/drivers/char/tpm/xen-tpmfront.c
202 +++ b/drivers/char/tpm/xen-tpmfront.c
203 @@ -173,7 +173,7 @@ static int vtpm_send(struct tpm_chip *ch
211 static int vtpm_recv(struct tpm_chip *chip, u8 *buf, size_t count)