[Skiboot] [PATCH] hw/p8-i2c: Fix i2c request timeout

Andrew Donnellan andrew.donnellan at au1.ibm.com
Thu Sep 20 12:44:38 AEST 2018


On 20/9/18 3:05 am, Frederic Barrat wrote:
> Commit eb146fac9685 ("core/i2c: Move the timeout field into
> i2c_request") simplified a bit how a request timeout is
> handled. However there's now some confusion between milliseconds and
> timebase increments when defining or using the timeout values, which
> breaks i2c requests made for opencapi, and probably others too.
> 
> This patch declares all the timeout in milliseconds and just converts
> to timebase at the end of the chain, as needed.
> 
> Signed-off-by: Frederic Barrat <fbarrat at linux.ibm.com>

This fixes problems I've been seeing.

Tested-by: Andrew Donnellan <andrew.donnellan at au1.ibm.com>

> ---
>   hw/p8-i2c.c   | 10 ++++------
>   include/i2c.h |  2 +-
>   2 files changed, 5 insertions(+), 7 deletions(-)
> 
> diff --git a/hw/p8-i2c.c b/hw/p8-i2c.c
> index fa5af7cc..a45769c0 100644
> --- a/hw/p8-i2c.c
> +++ b/hw/p8-i2c.c
> @@ -374,7 +374,7 @@ static void p8_i2c_reset_timeout(struct p8_i2c_master *master,
>   	uint64_t now = mftb();
>   
>   	master->last_update = now;
> -	schedule_timer_at(&master->timeout, now + req->timeout);
> +	schedule_timer_at(&master->timeout, now + msecs_to_tb(req->timeout));
>   }
>   
>   static int p8_i2c_prog_watermark(struct p8_i2c_master *master)
> @@ -854,7 +854,7 @@ static void p8_i2c_check_status(struct p8_i2c_master *master)
>   	port = container_of(req->bus, struct p8_i2c_master_port, bus);
>   	now = mftb();
>   
> -	deadline = master->last_update + req->timeout;
> +	deadline = master->last_update + msecs_to_tb(req->timeout);
>   
>   	if (status & I2C_STAT_ANY_ERR)
>   		p8_i2c_status_error(port, req, status & I2C_STAT_ANY_ERR, now);
> @@ -1584,7 +1584,6 @@ static void p8_i2c_init_one(struct dt_node *i2cm, enum p8_i2c_master_type type)
>   		I2C_TIMEOUT_POLL_MS;
>   
>   	dt_for_each_child(i2cm, i2cm_port) {
> -		uint64_t timeout_ms;
>   		uint32_t speed;
>   
>   		port->port_num = dt_prop_get_u32(i2cm_port, "reg");
> @@ -1598,9 +1597,8 @@ static void p8_i2c_init_one(struct dt_node *i2cm, enum p8_i2c_master_type type)
>   		port->bus.queue_req = p8_i2c_queue_request;
>   		port->bus.run_req = p8_i2c_run_request;
>   
> -		timeout_ms = dt_prop_get_u32_def(i2cm_port, "timeout-ms",
> -						default_timeout);
> -		port->byte_timeout = msecs_to_tb(timeout_ms);
> +		port->byte_timeout = dt_prop_get_u32_def(i2cm_port,
> +						"timeout-ms", default_timeout);
>   
>   		i2c_add_bus(&port->bus);
>   		list_add_tail(&master->ports, &port->link);
> diff --git a/include/i2c.h b/include/i2c.h
> index 67f8b995..a06cca0d 100644
> --- a/include/i2c.h
> +++ b/include/i2c.h
> @@ -61,7 +61,7 @@ struct i2c_request {
>   					      int rc, struct i2c_request *req);
>   	void			*user_data;	/* Client data */
>   	int			retries;
> -	uint64_t		timeout;
> +	uint64_t		timeout;	/* in ms */
>   };
>   
>   /* Generic i2c */
> 

-- 
Andrew Donnellan              OzLabs, ADL Canberra
andrew.donnellan at au1.ibm.com  IBM Australia Limited



More information about the Skiboot mailing list