]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 23 Sep 2023 08:47:04 +0000 (10:47 +0200)
[ Upstream commit 280db21e153d8810ce3b93640c63ae922bcb9e8e ]

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>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/char/tpm/tpm_tis_core.c

index 3255815585096bd50ff8711611fd01fdf398016a..9d731e265594984d00c35a0039a5ebc98024c66c 100644 (file)
@@ -364,10 +364,17 @@ static int tpm_tis_send_main(struct tpm_chip *chip, const u8 *buf, size_t len)
        int rc;
        u32 ordinal;
        unsigned long dur;
-
-       rc = tpm_tis_send_data(chip, buf, len);
-       if (rc < 0)
-               return rc;
+       unsigned int try;
+
+       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);