summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
Diffstat (limited to 'drivers')
-rw-r--r--drivers/tpm/slb9635_i2c/tpm_tis_i2c.c65
1 files changed, 43 insertions, 22 deletions
diff --git a/drivers/tpm/slb9635_i2c/tpm_tis_i2c.c b/drivers/tpm/slb9635_i2c/tpm_tis_i2c.c
index c72d782e5a3..e1b60565e47 100644
--- a/drivers/tpm/slb9635_i2c/tpm_tis_i2c.c
+++ b/drivers/tpm/slb9635_i2c/tpm_tis_i2c.c
@@ -109,6 +109,8 @@ int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
uint myaddr = addr;
/* we have to use uint here, uchar hangs the board */
+ debug("%s: len %d", __func__, len);
+
for (count = 0; count < MAX_COUNT; count++) {
rc = i2c_write(tpm_dev.addr, 0, 0, (uchar *) &myaddr, 1);
if (rc == 0)
@@ -136,6 +138,7 @@ int iic_tpm_read(u8 addr, u8 *buffer, size_t len)
stats.read.ok++;
stats.read.ok_retries += count;
}
+ debug(" = %d (retry_count=%d)\n", rc, count);
if (rc)
return -rc;
@@ -150,6 +153,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
int count;
/* prepare send buffer */
+ debug("%s: len %d", __func__, len);
tpm_dev.buf[0] = addr;
memcpy(&(tpm_dev.buf[1]), buffer, len);
@@ -168,6 +172,7 @@ static int iic_tpm_write_generic(u8 addr, u8 *buffer, size_t len,
stats.write.ok++;
stats.write.ok_retries += count;
}
+ debug(" = %d (retry_count=%d)\n", rc, count);
if (rc)
return -rc;
@@ -238,22 +243,27 @@ static int check_locality(struct tpm_chip *chip, int loc)
u8 buf;
int rc;
+ debug("(%s: loc=%d, ", __func__, loc);
rc = iic_tpm_read(TPM_ACCESS(loc), &buf, 1);
- if (rc < 0)
- return rc;
-
- if ((buf & (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) ==
- (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) {
- chip->vendor.locality = loc;
- return loc;
+ if (rc >= 0) {
+ if ((buf & (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) ==
+ (TPM_ACCESS_ACTIVE_LOCALITY | TPM_ACCESS_VALID)) {
+ chip->vendor.locality = loc;
+ rc = loc;
+ } else {
+ rc = -1;
+ }
}
+ debug("= %d) ", rc);
- return -1;
+ return rc;
}
static void release_locality(struct tpm_chip *chip, int loc, int force)
{
u8 buf;
+
+ debug("%s\n", __func__);
if (iic_tpm_read(TPM_ACCESS(loc), &buf, 1) < 0)
return;
@@ -268,29 +278,39 @@ static int request_locality(struct tpm_chip *chip, int loc)
{
unsigned long start, stop;
u8 buf = TPM_ACCESS_REQUEST_USE;
+ int err;
- if (check_locality(chip, loc) >= 0)
- return loc; /* we already have the locality */
-
- iic_tpm_write(TPM_ACCESS(loc), &buf, 1);
+ debug("%s: loc=%d ", __func__, loc);
+ if (check_locality(chip, loc) >= 0) {
+ err = loc; /* we already have the locality */
+ } else {
+ err = -1;
+ iic_tpm_write(TPM_ACCESS(loc), &buf, 1);
- /* wait for burstcount */
- start = get_timer(0);
- stop = chip->vendor.timeout_a;
- do {
- if (check_locality(chip, loc) >= 0)
- return loc;
- msleep(TPM_TIMEOUT);
- } while (get_timer(start) < stop);
+ /* wait for burstcount */
+ start = get_timer(0);
+ stop = chip->vendor.timeout_a;
+ do {
+ if (check_locality(chip, loc) >= 0)
+ return loc;
+ msleep(TPM_TIMEOUT);
+ } while (get_timer(start) < stop);
+ }
- return -1;
+ debug(" = %d\n", err);
+ return err;
}
static u8 tpm_tis_i2c_status(struct tpm_chip *chip)
{
/* NOTE: since i2c read may fail, return 0 in this case --> time-out */
u8 buf;
- if (iic_tpm_read(TPM_STS(chip->vendor.locality), &buf, 1) < 0)
+ int err;
+
+ debug("%s [", __func__);
+ err = iic_tpm_read(TPM_STS(chip->vendor.locality), &buf, 1);
+ debug("] = 0x%x\n", err < 0 ? 0 : buf);
+ if (err < 0)
return 0;
else
return buf;
@@ -396,6 +416,7 @@ static int tpm_tis_i2c_recv(struct tpm_chip *chip, u8 *buf, size_t count)
goto out;
}
+ /* This may do nothing if there is nothing more to read */
size += recv_data(chip, &buf[TPM_HEADER_SIZE],
expected - TPM_HEADER_SIZE);
if (size < expected) {