tpm_tis: Resend command to recover from data transfer errors
authorAlexander Steffen <Alexander.Steffen@infineon.com>
Tue, 13 Jun 2023 18:02:59 +0000 (20:02 +0200)
committerJarkko Sakkinen <jarkko@kernel.org>
Thu, 17 Aug 2023 20:12:41 +0000 (20:12 +0000)
Similar to the transmission of TPM responses, also the transmission of TPM
commands may become corrupted. Instead of aborting when detecting such
issues, try resending the command again.

Signed-off-by: Alexander Steffen <Alexander.Steffen@infineon.com>
Reviewed-by: Jarkko Sakkinen <jarkko@kernel.org>
Signed-off-by: Jarkko Sakkinen <jarkko@kernel.org>
drivers/char/tpm/tpm_tis_core.c

index 52e2dc7a9f81874370ac82b5eba55e7738247037..1b350412d8a6be95abc2fb993ee40da0606f93b9 100644 (file)
@@ -539,10 +539,17 @@ static int tpm_tis_send_main(struct tpm_chip *chip, const u8 *buf, size_t len)
        int rc;
        u32 ordinal;
        unsigned long dur;
+       unsigned int try;
 
-       rc = tpm_tis_send_data(chip, buf, len);
-       if (rc < 0)
-               return rc;
+       for (try = 0; try < TPM_RETRY; try++) {
+               rc = tpm_tis_send_data(chip, buf, len);
+               if (rc >= 0)
+                       /* Data transfer done successfully */
+                       break;
+               else if (rc != -EIO)
+                       /* Data transfer failed, not recoverable */
+                       return rc;
+       }
 
        /* go and do it */
        rc = tpm_tis_write8(priv, TPM_STS(priv->locality), TPM_STS_GO);