blob: 75b7ac43810d19876991e4a855dfedc586f287bc [file] [log] [blame]
Antti Palosaaric79b3392012-05-23 10:06:09 -03001/* dvb-usb-urb.c is part of the DVB USB library.
2 *
3 * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
4 * see dvb-usb-init.c for copyright information.
5 *
6 * This file keeps functions for initializing and handling the
7 * USB and URB stuff.
8 */
9#include "dvb_usb_common.h"
10
11int dvb_usbv2_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf,
12 u16 rlen, int delay_ms)
13{
Antti Palosaari4e60d952012-05-24 14:44:21 -030014 int actlen, ret = -ENOMEM;
Antti Palosaaric79b3392012-05-23 10:06:09 -030015
16 if (!d || wbuf == NULL || wlen == 0)
17 return -EINVAL;
18
Antti Palosaarif093c382012-06-12 16:25:01 -030019 if (d->props->generic_bulk_ctrl_endpoint == 0) {
Antti Palosaari65de8f92012-06-07 17:52:06 -030020 pr_err("%s: endpoint for generic control not specified\n",
Antti Palosaari23d8e632012-06-06 22:46:38 -030021 KBUILD_MODNAME);
Antti Palosaaric79b3392012-05-23 10:06:09 -030022 return -EINVAL;
23 }
24
Antti Palosaari4e60d952012-05-24 14:44:21 -030025 ret = mutex_lock_interruptible(&d->usb_mutex);
26 if (ret)
Antti Palosaaric79b3392012-05-23 10:06:09 -030027 return ret;
28
Antti Palosaari23d8e632012-06-06 22:46:38 -030029 print_hex_dump(KERN_DEBUG, KBUILD_MODNAME ": >>> ", DUMP_PREFIX_NONE,
30 32, 1, wbuf, wlen, 0);
Antti Palosaaric79b3392012-05-23 10:06:09 -030031
Antti Palosaari4e60d952012-05-24 14:44:21 -030032 ret = usb_bulk_msg(d->udev, usb_sndbulkpipe(d->udev,
Antti Palosaarif093c382012-06-12 16:25:01 -030033 d->props->generic_bulk_ctrl_endpoint), wbuf, wlen,
Antti Palosaari4e60d952012-05-24 14:44:21 -030034 &actlen, 2000);
Antti Palosaaric79b3392012-05-23 10:06:09 -030035
36 if (ret)
Antti Palosaari65de8f92012-06-07 17:52:06 -030037 pr_err("%s: bulk message failed: %d (%d/%d)\n", KBUILD_MODNAME,
Antti Palosaari23d8e632012-06-06 22:46:38 -030038 ret, wlen, actlen);
Antti Palosaaric79b3392012-05-23 10:06:09 -030039 else
40 ret = actlen != wlen ? -1 : 0;
41
42 /* an answer is expected, and no error before */
43 if (!ret && rbuf && rlen) {
44 if (delay_ms)
45 msleep(delay_ms);
46
Antti Palosaari4e60d952012-05-24 14:44:21 -030047 ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev,
Antti Palosaarif093c382012-06-12 16:25:01 -030048 d->props->generic_bulk_ctrl_endpoint_response ?
49 d->props->generic_bulk_ctrl_endpoint_response :
50 d->props->generic_bulk_ctrl_endpoint),
Antti Palosaari4e60d952012-05-24 14:44:21 -030051 rbuf, rlen, &actlen, 2000);
Antti Palosaaric79b3392012-05-23 10:06:09 -030052
53 if (ret)
Antti Palosaari65de8f92012-06-07 17:52:06 -030054 pr_err("%s: recv bulk message failed: %d\n",
Antti Palosaari23d8e632012-06-06 22:46:38 -030055 KBUILD_MODNAME, ret);
56 else
57 print_hex_dump(KERN_DEBUG, KBUILD_MODNAME ": <<< ",
Antti Palosaari36a5c2b2012-06-07 18:37:42 -030058 DUMP_PREFIX_NONE, 32, 1, rbuf, actlen,
59 0);
Antti Palosaaric79b3392012-05-23 10:06:09 -030060 }
61
62 mutex_unlock(&d->usb_mutex);
63 return ret;
64}
65EXPORT_SYMBOL(dvb_usbv2_generic_rw);
66
67int dvb_usbv2_generic_write(struct dvb_usb_device *d, u8 *buf, u16 len)
68{
Antti Palosaari4e60d952012-05-24 14:44:21 -030069 return dvb_usbv2_generic_rw(d, buf, len, NULL, 0, 0);
Antti Palosaaric79b3392012-05-23 10:06:09 -030070}
71EXPORT_SYMBOL(dvb_usbv2_generic_write);