From c2e404aedd52da91fdf605e24b9d1ae7894974c5 Mon Sep 17 00:00:00 2001 From: Oliver O'Halloran Date: Fri, 17 Nov 2017 17:04:11 +1100 Subject: p8-i2c: Limit number of retry attempts Current we will attempt to start an I2C transaction until it succeeds. In the event that the OCC does not release the lock on an I2C bus this results in an async token being held forever and the kernel thread that started the transaction will block forever while waiting for an async completion message. Fix this by limiting the number of attempts to start the transaction. Signed-off-by: Oliver O'Halloran Signed-off-by: Stewart Smith --- hw/p8-i2c.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'hw/p8-i2c.c') diff --git a/hw/p8-i2c.c b/hw/p8-i2c.c index ec2f7fc..d029854 100644 --- a/hw/p8-i2c.c +++ b/hw/p8-i2c.c @@ -1303,8 +1303,16 @@ static void p8_i2c_check_work(struct p8_i2c_master *master) while (master->state == state_idle && !list_empty(&master->req_list)) { req = list_top(&master->req_list, struct i2c_request, link); rc = p8_i2c_start_request(master, req); - if (rc && rc != OPAL_BUSY) - p8_i2c_complete_request(master, req, rc); + if (rc) { + /* + * If it didn't work the first three times then + * odds are it's not going to work on the 4th. + */ + if (rc && req->retries > 3) + p8_i2c_complete_request(master, req, rc); + else + req->retries++; + } } } -- cgit v1.1