dvb-usb-urb.c 2.5 KB
Newer Older
1 2
/* dvb-usb-urb.c is part of the DVB USB library.
 *
3
 * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
4 5
 * see dvb-usb-init.c for copyright information.
 *
6
 * This file keeps functions for initializing and handling the
7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
 * USB and URB stuff.
 */
#include "dvb-usb-common.h"

int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf,
	u16 rlen, int delay_ms)
{
	int actlen,ret = -ENOMEM;

	if (d->props.generic_bulk_ctrl_endpoint == 0) {
		err("endpoint for generic control not specified.");
		return -EINVAL;
	}

	if (wbuf == NULL || wlen == 0)
		return -EINVAL;

24
	if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
25 26
		return ret;

27
	deb_xfer(">>> ");
28 29 30 31
	debug_dump(wbuf,wlen,deb_xfer);

	ret = usb_bulk_msg(d->udev,usb_sndbulkpipe(d->udev,
			d->props.generic_bulk_ctrl_endpoint), wbuf,wlen,&actlen,
32
			2000);
33 34 35 36 37 38 39 40 41 42 43 44 45

	if (ret)
		err("bulk message failed: %d (%d/%d)",ret,wlen,actlen);
	else
		ret = actlen != wlen ? -1 : 0;

	/* an answer is expected, and no error before */
	if (!ret && rbuf && rlen) {
		if (delay_ms)
			msleep(delay_ms);

		ret = usb_bulk_msg(d->udev,usb_rcvbulkpipe(d->udev,
				d->props.generic_bulk_ctrl_endpoint),rbuf,rlen,&actlen,
46
				2000);
47 48 49

		if (ret)
			err("recv bulk message failed: %d",ret);
50 51
		else {
			deb_xfer("<<< ");
52
			debug_dump(rbuf,actlen,deb_xfer);
53
		}
54 55
	}

56
	mutex_unlock(&d->usb_mutex);
57 58 59 60 61 62 63 64 65 66
	return ret;
}
EXPORT_SYMBOL(dvb_usb_generic_rw);

int dvb_usb_generic_write(struct dvb_usb_device *d, u8 *buf, u16 len)
{
	return dvb_usb_generic_rw(d,buf,len,NULL,0,0);
}
EXPORT_SYMBOL(dvb_usb_generic_write);

67
static void dvb_usb_data_complete(struct usb_data_stream *stream, u8 *buffer, size_t length)
68
{
69 70 71
	struct dvb_usb_adapter *adap = stream->user_priv;
	if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
		dvb_dmx_swfilter(&adap->demux, buffer, length);
72 73
}

74 75 76 77 78 79 80
static void dvb_usb_data_complete_204(struct usb_data_stream *stream, u8 *buffer, size_t length)
{
	struct dvb_usb_adapter *adap = stream->user_priv;
	if (adap->feedcount > 0 && adap->state & DVB_USB_ADAP_STATE_DVB)
		dvb_dmx_swfilter_204(&adap->demux, buffer, length);
}

81
int dvb_usb_adapter_stream_init(struct dvb_usb_adapter *adap)
82
{
83
	adap->stream.udev      = adap->dev->udev;
84 85 86
	if (adap->props.caps & DVB_USB_ADAP_RECEIVES_204_BYTE_TS)
		adap->stream.complete = dvb_usb_data_complete_204;
	else
87 88 89
	adap->stream.complete  = dvb_usb_data_complete;
	adap->stream.user_priv = adap;
	return usb_urb_init(&adap->stream, &adap->props.stream);
90 91
}

92
int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter *adap)
93
{
94
	return usb_urb_exit(&adap->stream);
95
}
新手
引导
客服 返回
顶部