Commit 9e5b1b12 authored by Marcin Obara's avatar Marcin Obara Committed by Linus Torvalds

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: default avatarMarcin 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: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 612de10d
...@@ -525,19 +525,19 @@ void tpm_get_timeouts(struct tpm_chip *chip) ...@@ -525,19 +525,19 @@ void tpm_get_timeouts(struct tpm_chip *chip)
timeout = timeout =
be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_1_IDX))); be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_1_IDX)));
if (timeout) if (timeout)
chip->vendor.timeout_a = msecs_to_jiffies(timeout); chip->vendor.timeout_a = usecs_to_jiffies(timeout);
timeout = timeout =
be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_2_IDX))); be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_2_IDX)));
if (timeout) if (timeout)
chip->vendor.timeout_b = msecs_to_jiffies(timeout); chip->vendor.timeout_b = usecs_to_jiffies(timeout);
timeout = timeout =
be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_3_IDX))); be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_3_IDX)));
if (timeout) if (timeout)
chip->vendor.timeout_c = msecs_to_jiffies(timeout); chip->vendor.timeout_c = usecs_to_jiffies(timeout);
timeout = timeout =
be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_4_IDX))); be32_to_cpu(*((__be32 *) (data + TPM_GET_CAP_RET_UINT32_4_IDX)));
if (timeout) if (timeout)
chip->vendor.timeout_d = msecs_to_jiffies(timeout); chip->vendor.timeout_d = usecs_to_jiffies(timeout);
duration: duration:
memcpy(data, tpm_cap, sizeof(tpm_cap)); memcpy(data, tpm_cap, sizeof(tpm_cap));
...@@ -554,15 +554,15 @@ void tpm_get_timeouts(struct tpm_chip *chip) ...@@ -554,15 +554,15 @@ void tpm_get_timeouts(struct tpm_chip *chip)
return; return;
chip->vendor.duration[TPM_SHORT] = chip->vendor.duration[TPM_SHORT] =
msecs_to_jiffies(be32_to_cpu usecs_to_jiffies(be32_to_cpu
(*((__be32 *) (data + (*((__be32 *) (data +
TPM_GET_CAP_RET_UINT32_1_IDX)))); TPM_GET_CAP_RET_UINT32_1_IDX))));
chip->vendor.duration[TPM_MEDIUM] = chip->vendor.duration[TPM_MEDIUM] =
msecs_to_jiffies(be32_to_cpu usecs_to_jiffies(be32_to_cpu
(*((__be32 *) (data + (*((__be32 *) (data +
TPM_GET_CAP_RET_UINT32_2_IDX)))); TPM_GET_CAP_RET_UINT32_2_IDX))));
chip->vendor.duration[TPM_LONG] = chip->vendor.duration[TPM_LONG] =
msecs_to_jiffies(be32_to_cpu usecs_to_jiffies(be32_to_cpu
(*((__be32 *) (data + (*((__be32 *) (data +
TPM_GET_CAP_RET_UINT32_3_IDX)))); TPM_GET_CAP_RET_UINT32_3_IDX))));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment