[media] em28xx-i2c: fix the error code for unknown errors
authorFrank Schaefer <fschaefer.oss@googlemail.com>
Sun, 19 Jan 2014 21:48:35 +0000 (18:48 -0300)
committerMauro Carvalho Chehab <m.chehab@samsung.com>
Tue, 4 Feb 2014 18:43:05 +0000 (16:43 -0200)
Commit e63b009d6e "em28xx-i2c: Fix error code for I2C error transfers"
changed the code to return -ETIMEDOUT on all unknown errors.
But the proper error code for unknown errors is -EIO.
So only report -ETIMEDOUT in case of the errors 0x02 and 0x04, which
are according to Mauro Carvalho Chehab's tests related to i2c clock
stretching and return -EIO for the rest.

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
drivers/media/usb/em28xx/em28xx-i2c.c

index bd8101dfda7c4b09c4bb0e533c89605dbf1cba34..ba6433c3a6431833cba13751c8e1929b97f3b072 100644 (file)
@@ -226,10 +226,18 @@ static int em28xx_i2c_send_bytes(struct em28xx *dev, u16 addr, u8 *buf,
                 * (even with high payload) ...
                 */
        }
-       if (i2c_debug)
-               em28xx_warn("write to i2c device at 0x%x timed out (status=%i)\n",
-                           addr, ret);
-       return -ETIMEDOUT;
+
+       if (ret == 0x02 || ret == 0x04) {
+               /* NOTE: these errors seem to be related to clock stretching */
+               if (i2c_debug)
+                       em28xx_warn("write to i2c device at 0x%x timed out (status=%i)\n",
+                                   addr, ret);
+               return -ETIMEDOUT;
+       }
+
+       em28xx_warn("write to i2c device at 0x%x failed with unknown error (status=%i)\n",
+                   addr, ret);
+       return -EIO;
 }
 
 /*
@@ -279,8 +287,17 @@ static int em28xx_i2c_recv_bytes(struct em28xx *dev, u16 addr, u8 *buf, u16 len)
                return -ENXIO;
        }
 
-       em28xx_warn("unknown i2c error (status=%i)\n", ret);
-       return -ETIMEDOUT;
+       if (ret == 0x02 || ret == 0x04) {
+               /* NOTE: these errors seem to be related to clock stretching */
+               if (i2c_debug)
+                       em28xx_warn("write to i2c device at 0x%x timed out (status=%i)\n",
+                                   addr, ret);
+               return -ETIMEDOUT;
+       }
+
+       em28xx_warn("write to i2c device at 0x%x failed with unknown error (status=%i)\n",
+                   addr, ret);
+       return -EIO;
 }
 
 /*