tpm: Fix cancellation of TPM commands (polling mode)
[deliverable/linux.git] / drivers / char / tpm / tpm_tis.c
index 3615d210e60394ae0e6dff7e198c384c0d83ad07..e4e0c65df7688c7dfc565dcf8e9d21f4b4b5143d 100644 (file)
@@ -400,6 +400,19 @@ out:
        return rc;
 }
 
+static bool tpm_tis_req_canceled(struct tpm_chip *chip, u8 status)
+{
+       switch (chip->vendor.manufacturer_id) {
+       case TPM_VID_WINBOND:
+               return ((status == TPM_STS_VALID) ||
+                       (status == (TPM_STS_VALID | TPM_STS_COMMAND_READY)));
+       case TPM_VID_STM:
+               return (status == (TPM_STS_VALID | TPM_STS_COMMAND_READY));
+       default:
+               return (status == TPM_STS_COMMAND_READY);
+       }
+}
+
 static const struct file_operations tis_ops = {
        .owner = THIS_MODULE,
        .llseek = no_llseek,
@@ -445,7 +458,7 @@ static struct tpm_vendor_specific tpm_tis = {
        .cancel = tpm_tis_ready,
        .req_complete_mask = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
        .req_complete_val = TPM_STS_DATA_AVAIL | TPM_STS_VALID,
-       .req_canceled = TPM_STS_COMMAND_READY,
+       .req_canceled = tpm_tis_req_canceled,
        .attr_group = &tis_attr_grp,
        .miscdev = {
                    .fops = &tis_ops,},
This page took 0.030009 seconds and 5 git commands to generate.