| From c4ff4b829ef9e6353c0b133b7adb564a68054979 Mon Sep 17 00:00:00 2001 |
| From: Rajiv Andrade <srajiv@linux.vnet.ibm.com> |
| Date: Fri, 12 Nov 2010 22:30:02 +0100 |
| Subject: TPM: Long default timeout fix |
| |
| From: Rajiv Andrade <srajiv@linux.vnet.ibm.com> |
| |
| commit c4ff4b829ef9e6353c0b133b7adb564a68054979 upstream. |
| |
| If duration variable value is 0 at this point, it's because |
| chip->vendor.duration wasn't filled by tpm_get_timeouts() yet. |
| This patch sets then the lowest timeout just to give enough |
| time for tpm_get_timeouts() to further succeed. |
| |
| This fix avoids long boot times in case another entity attempts |
| to send commands to the TPM when the TPM isn't accessible. |
| |
| Signed-off-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com> |
| Signed-off-by: James Morris <jmorris@namei.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| drivers/char/tpm/tpm.c | 10 ++++++---- |
| 1 file changed, 6 insertions(+), 4 deletions(-) |
| |
| --- a/drivers/char/tpm/tpm.c |
| +++ b/drivers/char/tpm/tpm.c |
| @@ -353,12 +353,14 @@ unsigned long tpm_calc_ordinal_duration( |
| tpm_protected_ordinal_duration[ordinal & |
| TPM_PROTECTED_ORDINAL_MASK]; |
| |
| - if (duration_idx != TPM_UNDEFINED) |
| + if (duration_idx != TPM_UNDEFINED) { |
| duration = chip->vendor.duration[duration_idx]; |
| - if (duration <= 0) |
| + /* if duration is 0, it's because chip->vendor.duration wasn't */ |
| + /* filled yet, so we set the lowest timeout just to give enough */ |
| + /* time for tpm_get_timeouts() to succeed */ |
| + return (duration <= 0 ? HZ : duration); |
| + } else |
| return 2 * 60 * HZ; |
| - else |
| - return duration; |
| } |
| EXPORT_SYMBOL_GPL(tpm_calc_ordinal_duration); |
| |