aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/tpm/tpm.c
diff options
context:
space:
mode:
authorRajiv Andrade <srajiv@linux.vnet.ibm.com>2011-11-01 15:00:52 -0400
committerRajiv Andrade <srajiv@linux.vnet.ibm.com>2011-11-16 06:57:11 -0500
commitb9e3238aa36db33aa0d0bd44ef85297c45627aac (patch)
tree5c9d90539b5730df66d8dfa26f025b2be898a006 /drivers/char/tpm/tpm.c
parent2f592f2a7d74c66763a6903edd04109132674d73 (diff)
TPM: fix transmit_cmd error logic
It's incorrect to assume that buffers returned by the TPM 10 bytes long are always error reports. This patches parses the error field in its header instead. The error report is now being printed using dev_err() instead of dev_dbg(), making it easier for users to provide more detailed bug reports. Signed-off-by: Rajiv Andrade <srajiv@linux.vnet.ibm.com>
Diffstat (limited to 'drivers/char/tpm/tpm.c')
-rw-r--r--drivers/char/tpm/tpm.c15
1 files changed, 8 insertions, 7 deletions
diff --git a/drivers/char/tpm/tpm.c b/drivers/char/tpm/tpm.c
index efd24bbb5cb..67335af0ec2 100644
--- a/drivers/char/tpm/tpm.c
+++ b/drivers/char/tpm/tpm.c
@@ -438,7 +438,6 @@ out:
438} 438}
439 439
440#define TPM_DIGEST_SIZE 20 440#define TPM_DIGEST_SIZE 20
441#define TPM_ERROR_SIZE 10
442#define TPM_RET_CODE_IDX 6 441#define TPM_RET_CODE_IDX 6
443 442
444enum tpm_capabilities { 443enum tpm_capabilities {
@@ -467,12 +466,14 @@ static ssize_t transmit_cmd(struct tpm_chip *chip, struct tpm_cmd_t *cmd,
467 len = tpm_transmit(chip,(u8 *) cmd, len); 466 len = tpm_transmit(chip,(u8 *) cmd, len);
468 if (len < 0) 467 if (len < 0)
469 return len; 468 return len;
470 if (len == TPM_ERROR_SIZE) { 469 else if (len < TPM_HEADER_SIZE)
471 err = be32_to_cpu(cmd->header.out.return_code); 470 return -EFAULT;
472 dev_dbg(chip->dev, "A TPM error (%d) occurred %s\n", err, desc); 471
473 return err; 472 err = be32_to_cpu(cmd->header.out.return_code);
474 } 473 if (err != 0)
475 return 0; 474 dev_err(chip->dev, "A TPM error (%d) occurred %s\n", err, desc);
475
476 return err;
476} 477}
477 478
478#define TPM_INTERNAL_RESULT_SIZE 200 479#define TPM_INTERNAL_RESULT_SIZE 200