summaryrefslogtreecommitdiffstats
path: root/drivers/char/tpm
diff options
context:
space:
mode:
authorPeter Huewe <peter.huewe@infineon.com>2017-03-02 08:03:13 -0500
committerJarkko Sakkinen <jarkko.sakkinen@linux.intel.com>2017-04-03 15:46:01 -0400
commite110cc69dc2ad679d6d478df636b99b14e6fbbc9 (patch)
tree55029043595c6bec5e6e50cf90f91a9b4ad81d6c /drivers/char/tpm
parent975094ddc369a32f27210248bdd9bbd153061b00 (diff)
tpm_tis_spi: Check correct byte for wait state indicator
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]. Cc: <stable@vger.kernel.org> 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>
Diffstat (limited to 'drivers/char/tpm')
-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 639614f2d415..62f50b6c9ef6 100644
--- a/drivers/char/tpm/tpm_tis_spi.c
+++ b/drivers/char/tpm/tpm_tis_spi.c
@@ -85,25 +85,25 @@ static int tpm_tis_spi_transfer(struct tpm_tis_data *data, u32 addr, u16 len,
85 if (ret < 0) 85 if (ret < 0)
86 goto exit; 86 goto exit;
87 87
88 phy->tx_buf[0] = 0; 88 if ((phy->rx_buf[3] & 0x01) == 0) {
89 89 // handle SPI wait states
90 /* According to TCG PTP specification, if there is no TPM present at 90 phy->tx_buf[0] = 0;
91 * all, then the design has a weak pull-up on MISO. If a TPM is not 91
92 * present, a pull-up on MISO means that the SB controller sees a 1, 92 for (i = 0; i < TPM_RETRY; i++) {
93 * and will latch in 0xFF on the read. 93 spi_xfer.len = 1;
94 */ 94 spi_message_init(&m);
95 for (i = 0; (phy->rx_buf[0] & 0x01) == 0 && i < TPM_RETRY; i++) { 95 spi_message_add_tail(&spi_xfer, &m);
96 spi_xfer.len = 1; 96 ret = spi_sync_locked(phy->spi_device, &m);
97 spi_message_init(&m); 97 if (ret < 0)
98 spi_message_add_tail(&spi_xfer, &m); 98 goto exit;
99 ret = spi_sync_locked(phy->spi_device, &m); 99 if (phy->rx_buf[0] & 0x01)
100 if (ret < 0) 100 break;
101 }
102
103 if (i == TPM_RETRY) {
104 ret = -ETIMEDOUT;
101 goto exit; 105 goto exit;
102 } 106 }
103
104 if (i == TPM_RETRY) {
105 ret = -ETIMEDOUT;
106 goto exit;
107 } 107 }
108 108
109 spi_xfer.cs_change = 0; 109 spi_xfer.cs_change = 0;