u8 *wbuf, u16 wlen, u8 *rbuf, u16 rlen)
 {
        struct dtv5100_state *st = d->priv;
+       unsigned int pipe;
        u8 request;
        u8 type;
        u16 value;
        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;
                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;
 
        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);
 }
 
        /* 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,