Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 1 | /* 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 | |
| 11 | int dvb_usbv2_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf, |
| 12 | u16 rlen, int delay_ms) |
| 13 | { |
Antti Palosaari | 4e60d95 | 2012-05-24 14:44:21 -0300 | [diff] [blame] | 14 | int actlen, ret = -ENOMEM; |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 15 | |
| 16 | if (!d || wbuf == NULL || wlen == 0) |
| 17 | return -EINVAL; |
| 18 | |
Antti Palosaari | f093c38 | 2012-06-12 16:25:01 -0300 | [diff] [blame^] | 19 | if (d->props->generic_bulk_ctrl_endpoint == 0) { |
Antti Palosaari | 65de8f9 | 2012-06-07 17:52:06 -0300 | [diff] [blame] | 20 | pr_err("%s: endpoint for generic control not specified\n", |
Antti Palosaari | 23d8e63 | 2012-06-06 22:46:38 -0300 | [diff] [blame] | 21 | KBUILD_MODNAME); |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 22 | return -EINVAL; |
| 23 | } |
| 24 | |
Antti Palosaari | 4e60d95 | 2012-05-24 14:44:21 -0300 | [diff] [blame] | 25 | ret = mutex_lock_interruptible(&d->usb_mutex); |
| 26 | if (ret) |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 27 | return ret; |
| 28 | |
Antti Palosaari | 23d8e63 | 2012-06-06 22:46:38 -0300 | [diff] [blame] | 29 | print_hex_dump(KERN_DEBUG, KBUILD_MODNAME ": >>> ", DUMP_PREFIX_NONE, |
| 30 | 32, 1, wbuf, wlen, 0); |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 31 | |
Antti Palosaari | 4e60d95 | 2012-05-24 14:44:21 -0300 | [diff] [blame] | 32 | ret = usb_bulk_msg(d->udev, usb_sndbulkpipe(d->udev, |
Antti Palosaari | f093c38 | 2012-06-12 16:25:01 -0300 | [diff] [blame^] | 33 | d->props->generic_bulk_ctrl_endpoint), wbuf, wlen, |
Antti Palosaari | 4e60d95 | 2012-05-24 14:44:21 -0300 | [diff] [blame] | 34 | &actlen, 2000); |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 35 | |
| 36 | if (ret) |
Antti Palosaari | 65de8f9 | 2012-06-07 17:52:06 -0300 | [diff] [blame] | 37 | pr_err("%s: bulk message failed: %d (%d/%d)\n", KBUILD_MODNAME, |
Antti Palosaari | 23d8e63 | 2012-06-06 22:46:38 -0300 | [diff] [blame] | 38 | ret, wlen, actlen); |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 39 | 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 Palosaari | 4e60d95 | 2012-05-24 14:44:21 -0300 | [diff] [blame] | 47 | ret = usb_bulk_msg(d->udev, usb_rcvbulkpipe(d->udev, |
Antti Palosaari | f093c38 | 2012-06-12 16:25:01 -0300 | [diff] [blame^] | 48 | d->props->generic_bulk_ctrl_endpoint_response ? |
| 49 | d->props->generic_bulk_ctrl_endpoint_response : |
| 50 | d->props->generic_bulk_ctrl_endpoint), |
Antti Palosaari | 4e60d95 | 2012-05-24 14:44:21 -0300 | [diff] [blame] | 51 | rbuf, rlen, &actlen, 2000); |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 52 | |
| 53 | if (ret) |
Antti Palosaari | 65de8f9 | 2012-06-07 17:52:06 -0300 | [diff] [blame] | 54 | pr_err("%s: recv bulk message failed: %d\n", |
Antti Palosaari | 23d8e63 | 2012-06-06 22:46:38 -0300 | [diff] [blame] | 55 | KBUILD_MODNAME, ret); |
| 56 | else |
| 57 | print_hex_dump(KERN_DEBUG, KBUILD_MODNAME ": <<< ", |
Antti Palosaari | 36a5c2b | 2012-06-07 18:37:42 -0300 | [diff] [blame] | 58 | DUMP_PREFIX_NONE, 32, 1, rbuf, actlen, |
| 59 | 0); |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 60 | } |
| 61 | |
| 62 | mutex_unlock(&d->usb_mutex); |
| 63 | return ret; |
| 64 | } |
| 65 | EXPORT_SYMBOL(dvb_usbv2_generic_rw); |
| 66 | |
| 67 | int dvb_usbv2_generic_write(struct dvb_usb_device *d, u8 *buf, u16 len) |
| 68 | { |
Antti Palosaari | 4e60d95 | 2012-05-24 14:44:21 -0300 | [diff] [blame] | 69 | return dvb_usbv2_generic_rw(d, buf, len, NULL, 0, 0); |
Antti Palosaari | c79b339 | 2012-05-23 10:06:09 -0300 | [diff] [blame] | 70 | } |
| 71 | EXPORT_SYMBOL(dvb_usbv2_generic_write); |