1 /* dvb-usb-urb.c is part of the DVB USB library.
3 * Copyright (C) 2004-6 Patrick Boettcher (patrick.boettcher@desy.de)
4 * see dvb-usb-init.c for copyright information.
6 * This file keeps functions for initializing and handling the
9 #include "dvb-usb-common.h"
11 int dvb_usb_generic_rw(struct dvb_usb_device
*d
, u8
*wbuf
, u16 wlen
, u8
*rbuf
,
12 u16 rlen
, int delay_ms
)
14 int actlen
,ret
= -ENOMEM
;
16 if (d
->props
.generic_bulk_ctrl_endpoint
== 0) {
17 err("endpoint for generic control not specified.");
21 if (wbuf
== NULL
|| wlen
== 0)
24 if ((ret
= mutex_lock_interruptible(&d
->usb_mutex
)))
28 debug_dump(wbuf
,wlen
,deb_xfer
);
30 ret
= usb_bulk_msg(d
->udev
,usb_sndbulkpipe(d
->udev
,
31 d
->props
.generic_bulk_ctrl_endpoint
), wbuf
,wlen
,&actlen
,
35 err("bulk message failed: %d (%d/%d)",ret
,wlen
,actlen
);
37 ret
= actlen
!= wlen
? -1 : 0;
39 /* an answer is expected, and no error before */
40 if (!ret
&& rbuf
&& rlen
) {
44 ret
= usb_bulk_msg(d
->udev
,usb_rcvbulkpipe(d
->udev
,
45 d
->props
.generic_bulk_ctrl_endpoint
),rbuf
,rlen
,&actlen
,
49 err("recv bulk message failed: %d",ret
);
52 debug_dump(rbuf
,actlen
,deb_xfer
);
56 mutex_unlock(&d
->usb_mutex
);
59 EXPORT_SYMBOL(dvb_usb_generic_rw
);
61 int dvb_usb_generic_write(struct dvb_usb_device
*d
, u8
*buf
, u16 len
)
63 return dvb_usb_generic_rw(d
,buf
,len
,NULL
,0,0);
65 EXPORT_SYMBOL(dvb_usb_generic_write
);
67 static void dvb_usb_data_complete(struct usb_data_stream
*stream
, u8
*buffer
, size_t length
)
69 struct dvb_usb_adapter
*adap
= stream
->user_priv
;
70 if (adap
->feedcount
> 0 && adap
->state
& DVB_USB_ADAP_STATE_DVB
)
71 dvb_dmx_swfilter(&adap
->demux
, buffer
, length
);
74 static void dvb_usb_data_complete_204(struct usb_data_stream
*stream
, u8
*buffer
, size_t length
)
76 struct dvb_usb_adapter
*adap
= stream
->user_priv
;
77 if (adap
->feedcount
> 0 && adap
->state
& DVB_USB_ADAP_STATE_DVB
)
78 dvb_dmx_swfilter_204(&adap
->demux
, buffer
, length
);
81 int dvb_usb_adapter_stream_init(struct dvb_usb_adapter
*adap
)
83 adap
->stream
.udev
= adap
->dev
->udev
;
84 if (adap
->props
.caps
& DVB_USB_ADAP_RECEIVES_204_BYTE_TS
)
85 adap
->stream
.complete
= dvb_usb_data_complete_204
;
87 adap
->stream
.complete
= dvb_usb_data_complete
;
88 adap
->stream
.user_priv
= adap
;
89 return usb_urb_init(&adap
->stream
, &adap
->props
.stream
);
92 int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter
*adap
)
94 return usb_urb_exit(&adap
->stream
);