[Skiboot] [PATCH v2 4/4] tpm_i2c_interface: decouple rc from being done with i2c request
Stewart Smith
stewart at linux.vnet.ibm.com
Wed Nov 23 17:30:08 AEDT 2016
This ensures the i2c subsystem is done with the i2c request before
we continue. Since it handles timeouts, we don't have to here.
Signed-off-by: Stewart Smith <stewart at linux.vnet.ibm.com>
--
v2: set ud.done = false to begin with
---
libstb/drivers/tpm_i2c_interface.c | 18 ++++++++++++++----
1 file changed, 14 insertions(+), 4 deletions(-)
diff --git a/libstb/drivers/tpm_i2c_interface.c b/libstb/drivers/tpm_i2c_interface.c
index 89f5ba6..cc7bf1a 100644
--- a/libstb/drivers/tpm_i2c_interface.c
+++ b/libstb/drivers/tpm_i2c_interface.c
@@ -30,9 +30,16 @@
#define REQ_COMPLETE_POLLING 5 /* Check if req is complete
in 5ms interval */
+struct tpm_i2c_userdata {
+ int rc;
+ bool done;
+};
+
void tpm_i2c_request_complete(int rc, struct i2c_request *req)
{
- *(int*)req->user_data = rc;
+ struct tpm_i2c_userdata *ud = req->user_data;
+ ud->rc = rc;
+ ud->done = true;
}
/**
@@ -58,6 +65,7 @@ int tpm_i2c_request_send(int tpm_bus_id, int tpm_dev_addr, int read_write,
struct i2c_request *req;
struct i2c_bus *bus;
uint64_t time_to_wait = 0;
+ struct tpm_i2c_userdata ud;
bus = i2c_find_bus_by_id(tpm_bus_id);
if (!bus) {
@@ -91,7 +99,8 @@ int tpm_i2c_request_send(int tpm_bus_id, int tpm_dev_addr, int read_write,
req->rw_buf = (void*) buf;
req->rw_len = buflen;
req->completion = tpm_i2c_request_complete;
- req->user_data = &rc;
+ ud.done = false;
+ req->user_data = &ud;
/*
* Set the request timeout to 10ms per byte. Otherwise, we get
@@ -101,7 +110,6 @@ int tpm_i2c_request_send(int tpm_bus_id, int tpm_dev_addr, int read_write,
timeout = (buflen + offset_bytes + 2) * I2C_BYTE_TIMEOUT_MS;
for (retries = 0; retries <= TPM_MAX_NACK_RETRIES; retries++) {
- rc = 1;
waited = 0;
i2c_set_req_timeout(req, timeout);
i2c_queue_req(req);
@@ -112,7 +120,9 @@ int tpm_i2c_request_send(int tpm_bus_id, int tpm_dev_addr, int read_write,
time_to_wait = REQ_COMPLETE_POLLING;
time_wait(time_to_wait);
waited += time_to_wait;
- } while (tb_to_msecs(waited) < timeout && rc == 1);
+ } while (!ud.done);
+
+ rc = ud.rc;
if (rc == OPAL_I2C_NACK_RCVD)
continue;
--
2.7.4
More information about the Skiboot
mailing list