Re: [PATCH 5/5] tpm_tis_spi: Add small delay after last transfer
From: Peter Huewe <peterhuewe@gmx.de>
Date: 2017-02-17 07:27:39
Also in:
lkml
Am 17. Februar 2017 06:09:42 MEZ schrieb Christophe Ricard [off-list ref]:
Are you sure it is not better to introduce this delay directly in the rpi spi driver ? Other than that i don't see any issue with it.
Yes - it would be perfect to fix the issue in the upstream rpi spi master driver. However this only happens sporadically in some strange cases (i.e. 300-500khz, single byte transfer after having more bytes in the same #cs frame) (unrelated to the tpm) We are still looking into it, why /where it happens and how to reproduce it reliably and then file a bug/fix it. For now however the priority is to make the tpm_tis_spi driver work reliably also on the rpi, and this is what this workaround does. We can simply remove it once the rpi spi master is fixed. Peter
On 16/02/2017 08:09, Peter Huewe wrote:quoted
Testing the implementation with a Raspberry Pi 2 showed that undersomequoted
circumstances its SPI master erroneously releases the CS line beforethequoted
transfer is complete, i.e. before the end of the last clock. In thiscasequoted
the TPM ignores the transfer and misses for example the GO command.Thequoted
driver is unable to detect this communication problem and will waitfor aquoted
command response that is never going to arrive, timing outeventually.quoted
As a workaround, the small delay ensures that the CS line is heldlongquoted
enough, even with a faulty SPI master. Other SPI masters are notaffected,quoted
except for a negligible performance penalty. Cc: <redacted> Fixes: 0edbfea537d1 ("tpm/tpm_tis_spi: Add support for spi phy") Signed-off-by: Alexander Steffen <redacted> Signed-off-by: Peter Huewe <redacted> --- drivers/char/tpm/tpm_tis_spi.c | 1 + 1 file changed, 1 insertion(+)diff --git a/drivers/char/tpm/tpm_tis_spi.cb/drivers/char/tpm/tpm_tis_spi.cquoted
index b50c5b072df3..685c51bf5d7e 100644--- a/drivers/char/tpm/tpm_tis_spi.c +++ b/drivers/char/tpm/tpm_tis_spi.c@@ -110,6 +110,7 @@ static int tpm_tis_spi_transfer(structtpm_tis_data *data, u32 addr, u8 len,quoted
spi_xfer.cs_change = 0; spi_xfer.len = transfer_len; + spi_xfer.delay_usecs = 5; if (direction) { spi_xfer.tx_buf = NULL;
-- Sent from my mobile