break;
                        }
 
-               /* read request */
-               if (i+1 < num && (msg[i+1].flags & I2C_M_RD)) {
+               if (msg[i].flags & I2C_M_RD) {
+                       /* read only */
+                       u8 obuf[3], ibuf[1+msg[i].len];
+                       obuf[0] = 0;
+                       obuf[1] = msg[i].len;
+                       obuf[2] = msg[i].addr;
+                       if (cxusb_ctrl_msg(d, CMD_I2C_READ,
+                                          obuf, 3,
+                                          ibuf, 1+msg[i].len) < 0) {
+                               warn("i2c read failed");
+                               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 */
                        u8 obuf[3+msg[i].len], ibuf[1+msg[i+1].len];
                        obuf[0] = msg[i].len;
                        obuf[1] = msg[i+1].len;
                        memcpy(msg[i+1].buf, &ibuf[1], msg[i+1].len);
 
                        i++;
-               } else { /* write */
+               } else {
+                       /* write only */
                        u8 obuf[2+msg[i].len], ibuf;
                        obuf[0] = msg[i].addr;
                        obuf[1] = msg[i].len;