if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
                return -EAGAIN;
 
+       /*
+        * I2C sub header is 5 bytes long. Meaning of those bytes are:
+        * 0: data len
+        * 1: I2C addr << 1
+        * 2: reg addr len
+        *    byte 3 and 4 can be used as reg addr
+        * 3: reg addr MSB
+        *    used when reg addr len is set to 2
+        * 4: reg addr LSB
+        *    used when reg addr len is set to 1 or 2
+        *
+        * For the simplify we do not use register addr at all.
+        * NOTE: As a firmware knows tuner type there is very small possibility
+        * there could be some tuner I2C hacks done by firmware and this may
+        * lead problems if firmware expects those bytes are used.
+        */
        if (num == 2 && !(msg[0].flags & I2C_M_RD) &&
                        (msg[1].flags & I2C_M_RD)) {
                if (msg[0].len > 40 || msg[1].len > 40) {
                                        msg[1].len);
                } else {
                        /* I2C */
-                       u8 buf[4 + msg[0].len];
+                       u8 buf[5 + msg[0].len];
                        struct usb_req req = { CMD_I2C_RD, 0, sizeof(buf),
                                        buf, msg[1].len, msg[1].buf };
                        buf[0] = msg[1].len;
                        buf[1] = msg[0].addr << 1;
-                       buf[2] = 0x01;
-                       buf[3] = 0x00;
-                       memcpy(&buf[4], msg[0].buf, msg[0].len);
+                       buf[2] = 0x00; /* reg addr len */
+                       buf[3] = 0x00; /* reg addr MSB */
+                       buf[4] = 0x00; /* reg addr LSB */
+                       memcpy(&buf[5], msg[0].buf, msg[0].len);
                        ret = af9035_ctrl_msg(d->udev, &req);
                }
        } else if (num == 1 && !(msg[0].flags & I2C_M_RD)) {
                                        msg[0].len - 3);
                } else {
                        /* I2C */
-                       u8 buf[4 + msg[0].len];
+                       u8 buf[5 + msg[0].len];
                        struct usb_req req = { CMD_I2C_WR, 0, sizeof(buf), buf,
                                        0, NULL };
                        buf[0] = msg[0].len;
                        buf[1] = msg[0].addr << 1;
-                       buf[2] = 0x01;
-                       buf[3] = 0x00;
-                       memcpy(&buf[4], msg[0].buf, msg[0].len);
+                       buf[2] = 0x00; /* reg addr len */
+                       buf[3] = 0x00; /* reg addr MSB */
+                       buf[4] = 0x00; /* reg addr LSB */
+                       memcpy(&buf[5], msg[0].buf, msg[0].len);
                        ret = af9035_ctrl_msg(d->udev, &req);
                }
        } else {