forked from Minki/linux
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>
This commit is contained in:
parent
612de10db0
commit
9e5b1b1222
@ -525,19 +525,19 @@ void tpm_get_timeouts(struct tpm_chip *chip)
|
||||
timeout =
|
||||
be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_1_IDX)));
|
||||
if (timeout)
|
||||
chip->vendor.timeout_a = msecs_to_jiffies(timeout);
|
||||
chip->vendor.timeout_a = usecs_to_jiffies(timeout);
|
||||
timeout =
|
||||
be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_2_IDX)));
|
||||
if (timeout)
|
||||
chip->vendor.timeout_b = msecs_to_jiffies(timeout);
|
||||
chip->vendor.timeout_b = usecs_to_jiffies(timeout);
|
||||
timeout =
|
||||
be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_3_IDX)));
|
||||
if (timeout)
|
||||
chip->vendor.timeout_c = msecs_to_jiffies(timeout);
|
||||
chip->vendor.timeout_c = usecs_to_jiffies(timeout);
|
||||
timeout =
|
||||
be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_4_IDX)));
|
||||
if (timeout)
|
||||
chip->vendor.timeout_d = msecs_to_jiffies(timeout);
|
||||
chip->vendor.timeout_d = usecs_to_jiffies(timeout);
|
||||
|
||||
duration:
|
||||
memcpy(data, tpm_cap, sizeof(tpm_cap));
|
||||
@ -554,15 +554,15 @@ duration:
|
||||
return;
|
||||
|
||||
chip->vendor.duration[TPM_SHORT] =
|
||||
msecs_to_jiffies(be32_to_cpu
|
||||
usecs_to_jiffies(be32_to_cpu
|
||||
(*((__be32 *) (data +
|
||||
TPM_GET_CAP_RET_UINT32_1_IDX))));
|
||||
chip->vendor.duration[TPM_MEDIUM] =
|
||||
msecs_to_jiffies(be32_to_cpu
|
||||
usecs_to_jiffies(be32_to_cpu
|
||||
(*((__be32 *) (data +
|
||||
TPM_GET_CAP_RET_UINT32_2_IDX))));
|
||||
chip->vendor.duration[TPM_LONG] =
|
||||
msecs_to_jiffies(be32_to_cpu
|
||||
usecs_to_jiffies(be32_to_cpu
|
||||
(*((__be32 *) (data +
|
||||
TPM_GET_CAP_RET_UINT32_3_IDX))));
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user