int size = 0;
        int status;
        u32 expected;
+       int rc;
 
        if (count < TPM_HEADER_SIZE) {
                size = -EIO;
                goto out;
        }
 
+       rc = tpm_tis_verify_crc(priv, (size_t)size, buf);
+       if (rc < 0) {
+               dev_err(&chip->dev, "CRC mismatch for response.\n");
+               size = rc;
+               goto out;
+       }
+
 out:
        tpm_tis_ready(chip);
        return size;
        if (rc < 0)
                return rc;
 
+       rc = tpm_tis_verify_crc(priv, len, buf);
+       if (rc < 0) {
+               dev_err(&chip->dev, "CRC mismatch for command.\n");
+               return rc;
+       }
+
        /* go and do it */
        rc = tpm_tis_write8(priv, TPM_STS(priv->locality), TPM_STS_GO);
        if (rc < 0)
 
                          u8 *result, enum tpm_tis_io_mode mode);
        int (*write_bytes)(struct tpm_tis_data *data, u32 addr, u16 len,
                           const u8 *value, enum tpm_tis_io_mode mode);
+       int (*verify_crc)(struct tpm_tis_data *data, size_t len,
+                         const u8 *value);
 };
 
 static inline int tpm_tis_read_bytes(struct tpm_tis_data *data, u32 addr,
        return rc;
 }
 
+static inline int tpm_tis_verify_crc(struct tpm_tis_data *data, size_t len,
+                                    const u8 *value)
+{
+       if (!data->phy_ops->verify_crc)
+               return 0;
+       return data->phy_ops->verify_crc(data, len, value);
+}
+
 static inline bool is_bsw(void)
 {
 #ifdef CONFIG_X86