i2c-algo-pcf: Handle timeout correctly
authorRoel Kluin <roel.kluin@gmail.com>
Sat, 28 Mar 2009 20:34:42 +0000 (21:34 +0100)
committerJean Delvare <khali@linux-fr.org>
Sat, 28 Mar 2009 20:34:42 +0000 (21:34 +0100)
With a postfix decrement these timeouts reach -1 rather than 0, but after the
loop it is tested whether they have become 0.

As pointed out by Jean Delvare, the msg_num should be tested before the timeout.
With the current order, you could exit with a timeout error while all the
messages were successfully transferred.

Signed-off-by: Roel Kluin <roel.kluin@gmail.com>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Acked-by: Eric Brower <ebrower@gmail.com>
drivers/i2c/algos/i2c-algo-pcf.c

index 5906986d013b1d9018a8ac4b8a130fb70890776b..65a769f3ae7985020b813afb643a8f2eba056d9a 100644 (file)
@@ -115,15 +115,17 @@ static int wait_for_bb(struct i2c_algo_pcf_data *adap)
 
        status = get_pcf(adap, 1);
 
-       while (timeout-- && !(status & I2C_PCF_BB)) {
+       while (!(status & I2C_PCF_BB) && --timeout) {
                udelay(100); /* wait for 100 us */
                status = get_pcf(adap, 1);
        }
 
-       if (timeout <= 0)
+       if (timeout == 0) {
                printk(KERN_ERR "Timeout waiting for Bus Busy\n");
+               return -ETIMEDOUT;
+       }
 
-       return timeout <= 0;
+       return 0;
 }
 
 static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status)
@@ -133,7 +135,7 @@ static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status)
 
        *status = get_pcf(adap, 1);
 
-       while (timeout-- && (*status & I2C_PCF_PIN)) {
+       while ((*status & I2C_PCF_PIN) && --timeout) {
                adap->waitforpin(adap->data);
                *status = get_pcf(adap, 1);
        }
@@ -142,10 +144,10 @@ static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status)
                return -EINTR;
        }
 
-       if (timeout <= 0)
-               return -1;
-       else
-               return 0;
+       if (timeout == 0)
+               return -ETIMEDOUT;
+
+       return 0;
 }
 
 /*