aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char
diff options
context:
space:
mode:
authorPeter Huewe <peter.huewe@infineon.com>2017-03-02 08:03:13 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-05-25 09:44:31 -0400
commitd513cf24e240f8c7a9127b566b915ce9730fd23e (patch)
tree5cb421952d9a1c5c2d7dbe45ec1d291f89609eb4 /drivers/char
parentdaa432c1a65a541b413111328f8aea61161ad372 (diff)
tpm_tis_spi: Check correct byte for wait state indicator
commit e110cc69dc2ad679d6d478df636b99b14e6fbbc9 upstream. Wait states are signaled in the last byte received from the TPM in response to the header, not the first byte. Check rx_buf[3] instead of rx_buf[0]. Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy") Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com> Signed-off-by: Peter Huewe <peter.huewe@infineon.com> Reviewed-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Tested-by: Benoit Houyere <benoit.houyere@st.com> Signed-off-by: Jarkko Sakkinen <jarkko.sakkinen@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/char')
-rw-r--r--drivers/char/tpm/tpm_tis_spi.c36
1 files changed, 18 insertions, 18 deletions
diff --git a/drivers/char/tpm/tpm_tis_spi.c b/drivers/char/tpm/tpm_tis_spi.c
index b515ce755f12..f0e23011098b 100644
--- a/drivers/char/tpm/tpm_tis_spi.c
+++ b/drivers/char/tpm/tpm_tis_spi.c
@@ -86,25 +86,25 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
86 if (ret < 0) 86 if (ret < 0)
87 goto exit; 87 goto exit;
88 88
89 phy->tx_buf[0] = 0; 89 if ((phy->rx_buf[3] & 0x01) == 0) {
90 90 // handle SPI wait states
91 /* According to TCG PTP specification, if there is no TPM present at 91 phy->tx_buf[0] = 0;
92 * all, then the design has a weak pull-up on MISO. If a TPM is not 92
93 * present, a pull-up on MISO means that the SB controller sees a 1, 93 for (i = 0; i < TPM_RETRY; i++) {
94 * and will latch in 0xFF on the read. 94 spi_xfer.len = 1;
95 */ 95 spi_message_init(&m);
96 for (i = 0; (phy->rx_buf[0] & 0x01) == 0 && i < TPM_RETRY; i++) { 96 spi_message_add_tail(&spi_xfer, &m);
97 spi_xfer.len = 1; 97 ret = spi_sync_locked(phy->spi_device, &m);
98 spi_message_init(&m); 98 if (ret < 0)
99 spi_message_add_tail(&spi_xfer, &m); 99 goto exit;
100 ret = spi_sync_locked(phy->spi_device, &m); 100 if (phy->rx_buf[0] & 0x01)
101 if (ret < 0) 101 break;
102 }
103
104 if (i == TPM_RETRY) {
105 ret = -ETIMEDOUT;
102 goto exit; 106 goto exit;
103 } 107 }
104
105 if (i == TPM_RETRY) {
106 ret = -ETIMEDOUT;
107 goto exit;
108 } 108 }
109 109
110 spi_xfer.cs_change = 0; 110 spi_xfer.cs_change = 0;