greybus: add write retry support for i2c
authorAlex Elder <elder@linaro.org>
Fri, 17 Oct 2014 10:09:21 +0000 (05:09 -0500)
committerGreg Kroah-Hartman <greg@kroah.com>
Fri, 17 Oct 2014 16:15:23 +0000 (18:15 +0200)
It is expected that i2c writes may fail, and in that case the driver
simply retries some number of times before actually treating it as a
failure.  Define a GB_OP_RETRY status, which is interpreted by the
i2c driver as an indication a retry is in order.  We just translate
that into an EAGAIN error passed back to the i2c core.

Signed-off-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <greg@kroah.com>
drivers/staging/greybus/i2c-gb.c
drivers/staging/greybus/operation.h

index c4e47ef..e1a0ed9 100644 (file)
@@ -382,9 +382,13 @@ static int gb_i2c_transfer_operation(struct gb_i2c_device *gb_i2c_dev,
 
        response = operation->response_payload;
        if (response->status) {
-               gb_connection_err(connection, "transfer response %hhu",
-                       response->status);
-               ret = -EIO;
+               if (response->status == GB_OP_RETRY) {
+                       ret = -EAGAIN;
+               } else {
+                       gb_connection_err(connection, "transfer response %hhu",
+                               response->status);
+                       ret = -EIO;
+               }
        } else {
                gb_i2c_transfer_response(msgs, msg_count, response->data);
                ret = msg_count;
index d5ec582..59aad3a 100644 (file)
@@ -16,7 +16,8 @@ enum gb_operation_status {
        GB_OP_INVALID           = 1,
        GB_OP_NO_MEMORY         = 2,
        GB_OP_INTERRUPTED       = 3,
-       GB_OP_PROTOCOL_BAD      = 4,
+       GB_OP_RETRY             = 4,
+       GB_OP_PROTOCOL_BAD      = 5,
 };
 
 /*