diff options
| author | Roel Kluin <roel.kluin@gmail.com> | 2009-03-28 16:34:42 -0400 |
|---|---|---|
| committer | Jean Delvare <khali@linux-fr.org> | 2009-03-28 16:34:42 -0400 |
| commit | 94d78e180c0323422854bc1718e657ac2d0cac1b (patch) | |
| tree | 7db1c35614e593f80ee17c10915dda76d2ee2836 | |
| parent | 0c168ceb9e1898a7f2895e80ce9915835b083bd3 (diff) | |
i2c-algo-pcf: Handle timeout correctly
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>
| -rw-r--r-- | drivers/i2c/algos/i2c-algo-pcf.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/drivers/i2c/algos/i2c-algo-pcf.c b/drivers/i2c/algos/i2c-algo-pcf.c index 5906986d013b..65a769f3ae79 100644 --- a/drivers/i2c/algos/i2c-algo-pcf.c +++ b/drivers/i2c/algos/i2c-algo-pcf.c | |||
| @@ -115,15 +115,17 @@ static int wait_for_bb(struct i2c_algo_pcf_data *adap) | |||
| 115 | 115 | ||
| 116 | status = get_pcf(adap, 1); | 116 | status = get_pcf(adap, 1); |
| 117 | 117 | ||
| 118 | while (timeout-- && !(status & I2C_PCF_BB)) { | 118 | while (!(status & I2C_PCF_BB) && --timeout) { |
| 119 | udelay(100); /* wait for 100 us */ | 119 | udelay(100); /* wait for 100 us */ |
| 120 | status = get_pcf(adap, 1); | 120 | status = get_pcf(adap, 1); |
| 121 | } | 121 | } |
| 122 | 122 | ||
| 123 | if (timeout <= 0) | 123 | if (timeout == 0) { |
| 124 | printk(KERN_ERR "Timeout waiting for Bus Busy\n"); | 124 | printk(KERN_ERR "Timeout waiting for Bus Busy\n"); |
| 125 | return -ETIMEDOUT; | ||
| 126 | } | ||
| 125 | 127 | ||
| 126 | return timeout <= 0; | 128 | return 0; |
| 127 | } | 129 | } |
| 128 | 130 | ||
| 129 | static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status) | 131 | 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) | |||
| 133 | 135 | ||
| 134 | *status = get_pcf(adap, 1); | 136 | *status = get_pcf(adap, 1); |
| 135 | 137 | ||
| 136 | while (timeout-- && (*status & I2C_PCF_PIN)) { | 138 | while ((*status & I2C_PCF_PIN) && --timeout) { |
| 137 | adap->waitforpin(adap->data); | 139 | adap->waitforpin(adap->data); |
| 138 | *status = get_pcf(adap, 1); | 140 | *status = get_pcf(adap, 1); |
| 139 | } | 141 | } |
| @@ -142,10 +144,10 @@ static int wait_for_pin(struct i2c_algo_pcf_data *adap, int *status) | |||
| 142 | return -EINTR; | 144 | return -EINTR; |
| 143 | } | 145 | } |
| 144 | 146 | ||
| 145 | if (timeout <= 0) | 147 | if (timeout == 0) |
| 146 | return -1; | 148 | return -ETIMEDOUT; |
| 147 | else | 149 | |
| 148 | return 0; | 150 | return 0; |
| 149 | } | 151 | } |
| 150 | 152 | ||
| 151 | /* | 153 | /* |
