[Skiboot] [PATCH v2 4/4] tpm_i2c_interface: decouple rc from being done with i2c request
Claudio Carvalho
cclaudio at linux.vnet.ibm.com
Thu Nov 24 14:20:16 AEDT 2016
Tested-by: Claudio Carvalho <cclaudio at linux.vnet.ibm.com>
On 11/23/2016 04:30 AM, Stewart Smith wrote:
> 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;
>
More information about the Skiboot
mailing list