]> err.no Git - linux-2.6/commitdiff
V4L/DVB (6627): CXUSB: handle write then read from different address
authorChris Pascoe <c.pascoe@itee.uq.edu.au>
Mon, 19 Nov 2007 06:05:09 +0000 (03:05 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Fri, 25 Jan 2008 21:02:20 +0000 (19:02 -0200)
The path to perform a read immediately after a write was not checking that
the address being read from was the same as the one that was written.

Handling this case correctly should mean that we now can handle more than
two i2c messages at a time.

Signed-off-by: Chris Pascoe <c.pascoe@itee.uq.edu.au>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/dvb/dvb-usb/cxusb.c

index 016a3780b7146f8f7b07ca943bfdc446944954ba..74eeb168f24175f2a47e3d45884431b2e1d8950c 100644 (file)
@@ -83,9 +83,6 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
        if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
                return -EAGAIN;
 
-       if (num > 2)
-               warn("more than two i2c messages at a time is not handled yet. TODO.");
-
        for (i = 0; i < num; i++) {
 
                if (d->udev->descriptor.idVendor == USB_VID_MEDION)
@@ -111,8 +108,9 @@ static int cxusb_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msg[],
                                break;
                        }
                        memcpy(msg[i].buf, &ibuf[1], msg[i].len);
-               } else if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
-                       /* write then read */
+               } else if (i+1 < num && (msg[i+1].flags & I2C_M_RD) &&
+                          msg[i].addr == msg[i+1].addr) {
+                       /* write to then read from same address */
                        u8 obuf[3+msg[i].len], ibuf[1+msg[i+1].len];
                        obuf[0] = msg[i].len;
                        obuf[1] = msg[i+1].len;