[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