diff options
author | Marcin Obara <marcin_obara@users.sourceforge.net> | 2008-10-16 01:04:34 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-10-16 14:21:49 -0400 |
commit | 9e5b1b12226d5a501fbc6706ca090e00d18a01ad (patch) | |
tree | 4d2a7b40739e94e15b3bb525043abb0689b4d4cd | |
parent | 612de10db06c0704a66bbe7fd13990cb1c2cb958 (diff) |
tpm: correct tpm timeouts to jiffies conversion
This patch fixes timeouts conversion to jiffies, by replacing
msecs_to_jiffies() calls with usecs_to_jiffies(). According to TCG TPM
Specification Version 1.2 Revision 103 (pages 166, 167) TPM timeouts and
durations are returned in microseconds (usec) not in miliseconds (msec).
This fixes a long hang while loading TPM driver, if TPM chip starts in
"Idle" state instead of "Ready" state. Without this patch - 'modprobe'
may hang for 30 seconds or more.
Signed-off-by: Marcin Obara <marcin_obara@users.sourceforge.net>
Cc: Marcel Selhorst <tpm@selhorst.net>
Cc: Kylene Jo Hall <kjhall@us.ibm.com>
Cc: Jiri Slaby <jirislaby@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | drivers/char/tpm/tpm.c | 14 |
1 files changed, 7 insertions, 7 deletions
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c index 1fee7034a386..6b5a0e0127a7 100644 --- a/drivers/char/tpm/tpm.c +++ b/drivers/char/tpm/tpm.c | |||
@@ -525,19 +525,19 @@ void tpm_get_timeouts(struct tpm_chip *chip) | |||
525 | timeout = | 525 | timeout = |
526 | be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_1_IDX))); | 526 | be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_1_IDX))); |
527 | if (timeout) | 527 | if (timeout) |
528 | chip->vendor.timeout_a = msecs_to_jiffies(timeout); | 528 | chip->vendor.timeout_a = usecs_to_jiffies(timeout); |
529 | timeout = | 529 | timeout = |
530 | be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_2_IDX))); | 530 | be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_2_IDX))); |
531 | if (timeout) | 531 | if (timeout) |
532 | chip->vendor.timeout_b = msecs_to_jiffies(timeout); | 532 | chip->vendor.timeout_b = usecs_to_jiffies(timeout); |
533 | timeout = | 533 | timeout = |
534 | be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_3_IDX))); | 534 | be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_3_IDX))); |
535 | if (timeout) | 535 | if (timeout) |
536 | chip->vendor.timeout_c = msecs_to_jiffies(timeout); | 536 | chip->vendor.timeout_c = usecs_to_jiffies(timeout); |
537 | timeout = | 537 | timeout = |
538 | be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_4_IDX))); | 538 | be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_4_IDX))); |
539 | if (timeout) | 539 | if (timeout) |
540 | chip->vendor.timeout_d = msecs_to_jiffies(timeout); | 540 | chip->vendor.timeout_d = usecs_to_jiffies(timeout); |
541 | 541 | ||
542 | duration: | 542 | duration: |
543 | memcpy(data, tpm_cap, sizeof(tpm_cap)); | 543 | memcpy(data, tpm_cap, sizeof(tpm_cap)); |
@@ -554,15 +554,15 @@ duration: | |||
554 | return; | 554 | return; |
555 | 555 | ||
556 | chip->vendor.duration[TPM_SHORT] = | 556 | chip->vendor.duration[TPM_SHORT] = |
557 | msecs_to_jiffies(be32_to_cpu | 557 | usecs_to_jiffies(be32_to_cpu |
558 | (*((__be32 *) (data + | 558 | (*((__be32 *) (data + |
559 | TPM_GET_CAP_RET_UINT32_1_IDX)))); | 559 | TPM_GET_CAP_RET_UINT32_1_IDX)))); |
560 | chip->vendor.duration[TPM_MEDIUM] = | 560 | chip->vendor.duration[TPM_MEDIUM] = |
561 | msecs_to_jiffies(be32_to_cpu | 561 | usecs_to_jiffies(be32_to_cpu |
562 | (*((__be32 *) (data + | 562 | (*((__be32 *) (data + |
563 | TPM_GET_CAP_RET_UINT32_2_IDX)))); | 563 | TPM_GET_CAP_RET_UINT32_2_IDX)))); |
564 | chip->vendor.duration[TPM_LONG] = | 564 | chip->vendor.duration[TPM_LONG] = |
565 | msecs_to_jiffies(be32_to_cpu | 565 | usecs_to_jiffies(be32_to_cpu |
566 | (*((__be32 *) (data + | 566 | (*((__be32 *) (data + |
567 | TPM_GET_CAP_RET_UINT32_3_IDX)))); | 567 | TPM_GET_CAP_RET_UINT32_3_IDX)))); |
568 | } | 568 | } |