aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/tpm/tpm.c
diff options
context:
space:
mode:
authorStefan Berger <stefanb@linux.vnet.ibm.com>2011-03-30 12:13:27 -0400
committerRajiv Andrade <srajiv@linux.vnet.ibm.com>2011-07-12 17:53:07 -0400
commite3e1a1e169d4e7f73c60ded937ebe24526bc6427 (patch)
tree7851fd1700d3c40d5c03be60bb5c8942cb64b061 /drivers/char/tpm/tpm.c
parent829bf0675272d24ba0056f5f79e09544464f0c8d (diff)
tpm: Adjust interface timeouts if they are too small
Adjust the interface timeouts if they are found to be too small, i.e., if they are returned in milliseconds rather than microseconds as we heared from Infineon that some (old) Infineon TPMs do. Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> Signed-off-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com>
Diffstat (limited to 'drivers/char/tpm/tpm.c')
-rw-r--r--drivers/char/tpm/tpm.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index 0a475c7fe5ce..533ae359cb28 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -534,6 +534,7 @@ void tpm_get_timeouts(struct tpm_chip *chip)
534 struct duration_t *duration_cap; 534 struct duration_t *duration_cap;
535 ssize_t rc; 535 ssize_t rc;
536 u32 timeout; 536 u32 timeout;
537 unsigned int scale = 1;
537 538
538 tpm_cmd.header.in = tpm_getcap_header; 539 tpm_cmd.header.in = tpm_getcap_header;
539 tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP; 540 tpm_cmd.params.getcap_in.cap = TPM_CAP_PROP;
@@ -553,17 +554,21 @@ void tpm_get_timeouts(struct tpm_chip *chip)
553 timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout; 554 timeout_cap = &tpm_cmd.params.getcap_out.cap.timeout;
554 /* Don't overwrite default if value is 0 */ 555 /* Don't overwrite default if value is 0 */
555 timeout = be32_to_cpu(timeout_cap->a); 556 timeout = be32_to_cpu(timeout_cap->a);
557 if (timeout && timeout < 1000) {
558 /* timeouts in msec rather usec */
559 scale = 1000;
560 }
556 if (timeout) 561 if (timeout)
557 chip->vendor.timeout_a = usecs_to_jiffies(timeout); 562 chip->vendor.timeout_a = usecs_to_jiffies(timeout * scale);
558 timeout = be32_to_cpu(timeout_cap->b); 563 timeout = be32_to_cpu(timeout_cap->b);
559 if (timeout) 564 if (timeout)
560 chip->vendor.timeout_b = usecs_to_jiffies(timeout); 565 chip->vendor.timeout_b = usecs_to_jiffies(timeout * scale);
561 timeout = be32_to_cpu(timeout_cap->c); 566 timeout = be32_to_cpu(timeout_cap->c);
562 if (timeout) 567 if (timeout)
563 chip->vendor.timeout_c = usecs_to_jiffies(timeout); 568 chip->vendor.timeout_c = usecs_to_jiffies(timeout * scale);
564 timeout = be32_to_cpu(timeout_cap->d); 569 timeout = be32_to_cpu(timeout_cap->d);
565 if (timeout) 570 if (timeout)
566 chip->vendor.timeout_d = usecs_to_jiffies(timeout); 571 chip->vendor.timeout_d = usecs_to_jiffies(timeout * scale);
567 572
568duration: 573duration:
569 tpm_cmd.header.in = tpm_getcap_header; 574 tpm_cmd.header.in = tpm_getcap_header;