[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