1 From 9e5b1b12226d5a501fbc6706ca090e00d18a01ad Mon Sep 17 00:00:00 2001
2 From: Marcin Obara <marcin_obara@users.sourceforge.net>
3 Date: Wed, 15 Oct 2008 22:04:34 -0700
4 Subject: [PATCH] tpm: correct tpm timeouts to jiffies conversion
6 References: bnc#425747 FATE304221
8 This patch fixes timeouts conversion to jiffies, by replacing
9 msecs_to_jiffies() calls with usecs_to_jiffies(). According to TCG TPM
10 Specification Version 1.2 Revision 103 (pages 166, 167) TPM timeouts and
11 durations are returned in microseconds (usec) not in miliseconds (msec).
13 This fixes a long hang while loading TPM driver, if TPM chip starts in
14 "Idle" state instead of "Ready" state. Without this patch - 'modprobe'
15 may hang for 30 seconds or more.
17 Signed-off-by: Marcin Obara <marcin_obara@users.sourceforge.net>
18 Cc: Marcel Selhorst <tpm@selhorst.net>
19 Cc: Kylene Jo Hall <kjhall@us.ibm.com>
20 Cc: Jiri Slaby <jirislaby@gmail.com>
21 Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
22 Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
23 Signed-off-by: Jiri Slaby <jslaby@suse.cz>
25 drivers/char/tpm/tpm.c | 14 +++++++-------
26 1 files changed, 7 insertions(+), 7 deletions(-)
28 diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
29 index 1fee703..6b5a0e0 100644
30 --- a/drivers/char/tpm/tpm.c
31 +++ b/drivers/char/tpm/tpm.c
32 @@ -525,19 +525,19 @@ void tpm_get_timeouts(struct tpm_chip *chip)
34 be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_1_IDX)));
36 - chip->vendor.timeout_a = msecs_to_jiffies(timeout);
37 + chip->vendor.timeout_a = usecs_to_jiffies(timeout);
39 be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_2_IDX)));
41 - chip->vendor.timeout_b = msecs_to_jiffies(timeout);
42 + chip->vendor.timeout_b = usecs_to_jiffies(timeout);
44 be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_3_IDX)));
46 - chip->vendor.timeout_c = msecs_to_jiffies(timeout);
47 + chip->vendor.timeout_c = usecs_to_jiffies(timeout);
49 be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_4_IDX)));
51 - chip->vendor.timeout_d = msecs_to_jiffies(timeout);
52 + chip->vendor.timeout_d = usecs_to_jiffies(timeout);
55 memcpy(data, tpm_cap, sizeof(tpm_cap));
56 @@ -554,15 +554,15 @@ duration:
59 chip->vendor.duration[TPM_SHORT] =
60 - msecs_to_jiffies(be32_to_cpu
61 + usecs_to_jiffies(be32_to_cpu
63 TPM_GET_CAP_RET_UINT32_1_IDX))));
64 chip->vendor.duration[TPM_MEDIUM] =
65 - msecs_to_jiffies(be32_to_cpu
66 + usecs_to_jiffies(be32_to_cpu
68 TPM_GET_CAP_RET_UINT32_2_IDX))));
69 chip->vendor.duration[TPM_LONG] =
70 - msecs_to_jiffies(be32_to_cpu
71 + usecs_to_jiffies(be32_to_cpu
73 TPM_GET_CAP_RET_UINT32_3_IDX))));