Skip to content

Commit

Permalink
hw/p8-i2c: Fix i2c request timeout
Browse files Browse the repository at this point in the history
Commit eb146fa ("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@linux.ibm.com>
Tested-by: Andrew Donnellan <andrew.donnellan@au1.ibm.com>
Reviewed-by: Oliver O'Halloran <oohall@gmail.com>
Signed-off-by: Stewart Smith <stewart@linux.ibm.com>
  • Loading branch information
fbarrat authored and stewartsmith committed Sep 27, 2018
1 parent cc4de28 commit a800fa3
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 7 deletions.
10 changes: 4 additions & 6 deletions hw/p8-i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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");
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion include/i2c.h
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit a800fa3

Please sign in to comment.