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
|| wbuf
== NULL
|| wlen
== 0)
19 if (d
->props
.generic_bulk_ctrl_endpoint
== 0) {
20 err("endpoint for generic control not specified.");
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_response
?
46 d
->props
.generic_bulk_ctrl_endpoint_response
:
47 d
->props
.generic_bulk_ctrl_endpoint
),rbuf
,rlen
,&actlen
,
51 err("recv bulk message failed: %d",ret
);
54 debug_dump(rbuf
,actlen
,deb_xfer
);
58 mutex_unlock(&d
->usb_mutex
);
61 EXPORT_SYMBOL(dvb_usb_generic_rw
);
63 int dvb_usb_generic_write(struct dvb_usb_device
*d
, u8
*buf
, u16 len
)
65 return dvb_usb_generic_rw(d
,buf
,len
,NULL
,0,0);
67 EXPORT_SYMBOL(dvb_usb_generic_write
);
69 static void dvb_usb_data_complete(struct usb_data_stream
*stream
, u8
*buffer
, size_t length
)
71 struct dvb_usb_adapter
*adap
= stream
->user_priv
;
72 if (adap
->feedcount
> 0 && adap
->state
& DVB_USB_ADAP_STATE_DVB
)
73 dvb_dmx_swfilter(&adap
->demux
, buffer
, length
);
76 static void dvb_usb_data_complete_204(struct usb_data_stream
*stream
, u8
*buffer
, size_t length
)
78 struct dvb_usb_adapter
*adap
= stream
->user_priv
;
79 if (adap
->feedcount
> 0 && adap
->state
& DVB_USB_ADAP_STATE_DVB
)
80 dvb_dmx_swfilter_204(&adap
->demux
, buffer
, length
);
83 int dvb_usb_adapter_stream_init(struct dvb_usb_adapter
*adap
)
85 adap
->stream
.udev
= adap
->dev
->udev
;
86 if (adap
->props
.caps
& DVB_USB_ADAP_RECEIVES_204_BYTE_TS
)
87 adap
->stream
.complete
= dvb_usb_data_complete_204
;
89 adap
->stream
.complete
= dvb_usb_data_complete
;
90 adap
->stream
.user_priv
= adap
;
91 return usb_urb_init(&adap
->stream
, &adap
->props
.stream
);
94 int dvb_usb_adapter_stream_exit(struct dvb_usb_adapter
*adap
)
96 return usb_urb_exit(&adap
->stream
);