media: dtv5100: fix control-request directions
authorJohan Hovold <johan@kernel.org>
Fri, 21 May 2021 13:28:38 +0000 (15:28 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 20 Jul 2021 14:17:47 +0000 (16:17 +0200)
commit 8c8b9a9be2afa8bd6a72ad1130532baab9fab89d upstream.

The direction of the pipe argument must match the request-type direction
bit or control requests may fail depending on the host-controller-driver
implementation.

Fix the control requests which erroneously used usb_rcvctrlpipe().

Fixes: 8466028be792 ("V4L/DVB (8734): Initial support for AME DTV-5100 USB2.0 DVB-T")
Cc: stable@vger.kernel.org # 2.6.28
Signed-off-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/media/usb/dvb-usb/dtv5100.c

index 2fa2abd3e726317b848974cae66f941257db430c..07fd0bbf9b8029e803d10784af094d2ea0321770 100644 (file)
@@ -35,6 +35,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
                           u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
 {
        struct dtv5100_state *st = d->priv;
+       unsigned int pipe;
        u8 request;
        u8 type;
        u16 value;
@@ -43,6 +44,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
        switch (wlen) {
        case 1:
                /* write { reg }, read { value } */
+               pipe = usb_rcvctrlpipe(d->udev, 0);
                request = (addr == DTV5100_DEMOD_ADDR ? DTV5100_DEMOD_READ :
                                                        DTV5100_TUNER_READ);
                type = USB_TYPE_VENDOR | USB_DIR_IN;
@@ -50,6 +52,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
                break;
        case 2:
                /* write { reg, value } */
+               pipe = usb_sndctrlpipe(d->udev, 0);
                request = (addr == DTV5100_DEMOD_ADDR ? DTV5100_DEMOD_WRITE :
                                                        DTV5100_TUNER_WRITE);
                type = USB_TYPE_VENDOR | USB_DIR_OUT;
@@ -63,7 +66,7 @@ static int dtv5100_i2c_msg(struct dvb_usb_device *d, u8 addr,
 
        memcpy(st->data, rbuf, rlen);
        msleep(1); /* avoid I2C errors */
-       return usb_control_msg(d->udev, usb_rcvctrlpipe(d->udev, 0), request,
+       return usb_control_msg(d->udev, pipe, request,
                               type, value, index, st->data, rlen,
                               DTV5100_USB_TIMEOUT);
 }
@@ -150,7 +153,7 @@ static int dtv5100_probe(struct usb_interface *intf,
 
        /* initialize non qt1010/zl10353 part? */
        for (i = 0; dtv5100_init[i].request; i++) {
-               ret = usb_control_msg(udev, usb_rcvctrlpipe(udev, 0),
+               ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
                                      dtv5100_init[i].request,
                                      USB_TYPE_VENDOR | USB_DIR_OUT,
                                      dtv5100_init[i].value,