dvb-usb-urb.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324
  1. /* dvb-usb-urb.c is part of the DVB USB library.
  2. *
  3. * Copyright (C) 2004-5 Patrick Boettcher (patrick.boettcher@desy.de)
  4. * see dvb-usb-init.c for copyright information.
  5. *
  6. * This file contains functions for initializing and handling the
  7. * USB and URB stuff.
  8. */
  9. #include "dvb-usb-common.h"
  10. int dvb_usb_generic_rw(struct dvb_usb_device *d, u8 *wbuf, u16 wlen, u8 *rbuf,
  11. u16 rlen, int delay_ms)
  12. {
  13. int actlen,ret = -ENOMEM;
  14. if (d->props.generic_bulk_ctrl_endpoint == 0) {
  15. err("endpoint for generic control not specified.");
  16. return -EINVAL;
  17. }
  18. if (wbuf == NULL || wlen == 0)
  19. return -EINVAL;
  20. if ((ret = mutex_lock_interruptible(&d->usb_mutex)))
  21. return ret;
  22. deb_xfer(">>> ");
  23. debug_dump(wbuf,wlen,deb_xfer);
  24. ret = usb_bulk_msg(d->udev,usb_sndbulkpipe(d->udev,
  25. d->props.generic_bulk_ctrl_endpoint), wbuf,wlen,&actlen,
  26. 2000);
  27. if (ret)
  28. err("bulk message failed: %d (%d/%d)",ret,wlen,actlen);
  29. else
  30. ret = actlen != wlen ? -1 : 0;
  31. /* an answer is expected, and no error before */
  32. if (!ret && rbuf && rlen) {
  33. if (delay_ms)
  34. msleep(delay_ms);
  35. ret = usb_bulk_msg(d->udev,usb_rcvbulkpipe(d->udev,
  36. d->props.generic_bulk_ctrl_endpoint),rbuf,rlen,&actlen,
  37. 2000);
  38. if (ret)
  39. err("recv bulk message failed: %d",ret);
  40. else {
  41. deb_xfer("<<< ");
  42. debug_dump(rbuf,actlen,deb_xfer);
  43. }
  44. }
  45. mutex_unlock(&d->usb_mutex);
  46. return ret;
  47. }
  48. EXPORT_SYMBOL(dvb_usb_generic_rw);
  49. int dvb_usb_generic_write(struct dvb_usb_device *d, u8 *buf, u16 len)
  50. {
  51. return dvb_usb_generic_rw(d,buf,len,NULL,0,0);
  52. }
  53. EXPORT_SYMBOL(dvb_usb_generic_write);
  54. /* URB stuff for streaming */
  55. static void dvb_usb_urb_complete(struct urb *urb, struct pt_regs *ptregs)
  56. {
  57. struct dvb_usb_device *d = urb->context;
  58. int ptype = usb_pipetype(urb->pipe);
  59. int i;
  60. u8 *b;
  61. deb_ts("'%s' urb completed. feedcount: %d, status: %d, length: %d/%d, pack_num: %d, errors: %d\n",
  62. ptype == PIPE_ISOCHRONOUS ? "isoc" : "bulk", d->feedcount,
  63. urb->status,urb->actual_length,urb->transfer_buffer_length,
  64. urb->number_of_packets,urb->error_count);
  65. switch (urb->status) {
  66. case 0: /* success */
  67. case -ETIMEDOUT: /* NAK */
  68. break;
  69. case -ECONNRESET: /* kill */
  70. case -ENOENT:
  71. case -ESHUTDOWN:
  72. return;
  73. default: /* error */
  74. deb_ts("urb completition error %d.", urb->status);
  75. break;
  76. }
  77. if (d->feedcount > 0) {
  78. if (d->state & DVB_USB_STATE_DVB) {
  79. switch (ptype) {
  80. case PIPE_ISOCHRONOUS:
  81. b = (u8 *) urb->transfer_buffer;
  82. for (i = 0; i < urb->number_of_packets; i++) {
  83. if (urb->iso_frame_desc[i].status != 0)
  84. deb_ts("iso frame descriptor has an error: %d\n",urb->iso_frame_desc[i].status);
  85. else if (urb->iso_frame_desc[i].actual_length > 0) {
  86. dvb_dmx_swfilter(&d->demux,b + urb->iso_frame_desc[i].offset,
  87. urb->iso_frame_desc[i].actual_length);
  88. }
  89. urb->iso_frame_desc[i].status = 0;
  90. urb->iso_frame_desc[i].actual_length = 0;
  91. }
  92. debug_dump(b,20,deb_ts);
  93. break;
  94. case PIPE_BULK:
  95. if (urb->actual_length > 0)
  96. dvb_dmx_swfilter(&d->demux, (u8 *) urb->transfer_buffer,urb->actual_length);
  97. break;
  98. default:
  99. err("unkown endpoint type in completition handler.");
  100. return;
  101. }
  102. }
  103. }
  104. usb_submit_urb(urb,GFP_ATOMIC);
  105. }
  106. int dvb_usb_urb_kill(struct dvb_usb_device *d)
  107. {
  108. int i;
  109. for (i = 0; i < d->urbs_submitted; i++) {
  110. deb_ts("killing URB no. %d.\n",i);
  111. /* stop the URB */
  112. usb_kill_urb(d->urb_list[i]);
  113. }
  114. d->urbs_submitted = 0;
  115. return 0;
  116. }
  117. int dvb_usb_urb_submit(struct dvb_usb_device *d)
  118. {
  119. int i,ret;
  120. for (i = 0; i < d->urbs_initialized; i++) {
  121. deb_ts("submitting URB no. %d\n",i);
  122. if ((ret = usb_submit_urb(d->urb_list[i],GFP_ATOMIC))) {
  123. err("could not submit URB no. %d - get them all back",i);
  124. dvb_usb_urb_kill(d);
  125. return ret;
  126. }
  127. d->urbs_submitted++;
  128. }
  129. return 0;
  130. }
  131. static int dvb_usb_free_stream_buffers(struct dvb_usb_device *d)
  132. {
  133. if (d->state & DVB_USB_STATE_URB_BUF) {
  134. while (d->buf_num) {
  135. d->buf_num--;
  136. deb_mem("freeing buffer %d\n",d->buf_num);
  137. usb_buffer_free(d->udev, d->buf_size,
  138. d->buf_list[d->buf_num], d->dma_addr[d->buf_num]);
  139. }
  140. kfree(d->buf_list);
  141. kfree(d->dma_addr);
  142. }
  143. d->state &= ~DVB_USB_STATE_URB_BUF;
  144. return 0;
  145. }
  146. static int dvb_usb_allocate_stream_buffers(struct dvb_usb_device *d, int num, unsigned long size)
  147. {
  148. d->buf_num = 0;
  149. d->buf_size = size;
  150. deb_mem("all in all I will use %lu bytes for streaming\n",num*size);
  151. if ((d->buf_list = kcalloc(num, sizeof(u8 *), GFP_ATOMIC)) == NULL)
  152. return -ENOMEM;
  153. if ((d->dma_addr = kcalloc(num, sizeof(dma_addr_t), GFP_ATOMIC)) == NULL) {
  154. kfree(d->buf_list);
  155. return -ENOMEM;
  156. }
  157. d->state |= DVB_USB_STATE_URB_BUF;
  158. for (d->buf_num = 0; d->buf_num < num; d->buf_num++) {
  159. deb_mem("allocating buffer %d\n",d->buf_num);
  160. if (( d->buf_list[d->buf_num] =
  161. usb_buffer_alloc(d->udev, size, SLAB_ATOMIC,
  162. &d->dma_addr[d->buf_num]) ) == NULL) {
  163. deb_mem("not enough memory for urb-buffer allocation.\n");
  164. dvb_usb_free_stream_buffers(d);
  165. return -ENOMEM;
  166. }
  167. deb_mem("buffer %d: %p (dma: %llu)\n",
  168. d->buf_num, d->buf_list[d->buf_num],
  169. (unsigned long long)d->dma_addr[d->buf_num]);
  170. memset(d->buf_list[d->buf_num],0,size);
  171. }
  172. deb_mem("allocation successful\n");
  173. return 0;
  174. }
  175. static int dvb_usb_bulk_urb_init(struct dvb_usb_device *d)
  176. {
  177. int i;
  178. if ((i = dvb_usb_allocate_stream_buffers(d,d->props.urb.count,
  179. d->props.urb.u.bulk.buffersize)) < 0)
  180. return i;
  181. /* allocate the URBs */
  182. for (i = 0; i < d->props.urb.count; i++) {
  183. if ((d->urb_list[i] = usb_alloc_urb(0,GFP_ATOMIC)) == NULL)
  184. return -ENOMEM;
  185. usb_fill_bulk_urb( d->urb_list[i], d->udev,
  186. usb_rcvbulkpipe(d->udev,d->props.urb.endpoint),
  187. d->buf_list[i],
  188. d->props.urb.u.bulk.buffersize,
  189. dvb_usb_urb_complete, d);
  190. d->urb_list[i]->transfer_flags = 0;
  191. d->urbs_initialized++;
  192. }
  193. return 0;
  194. }
  195. static int dvb_usb_isoc_urb_init(struct dvb_usb_device *d)
  196. {
  197. int i,j;
  198. if ((i = dvb_usb_allocate_stream_buffers(d,d->props.urb.count,
  199. d->props.urb.u.isoc.framesize*d->props.urb.u.isoc.framesperurb)) < 0)
  200. return i;
  201. /* allocate the URBs */
  202. for (i = 0; i < d->props.urb.count; i++) {
  203. struct urb *urb;
  204. int frame_offset = 0;
  205. if ((d->urb_list[i] =
  206. usb_alloc_urb(d->props.urb.u.isoc.framesperurb,GFP_ATOMIC)) == NULL)
  207. return -ENOMEM;
  208. urb = d->urb_list[i];
  209. urb->dev = d->udev;
  210. urb->context = d;
  211. urb->complete = dvb_usb_urb_complete;
  212. urb->pipe = usb_rcvisocpipe(d->udev,d->props.urb.endpoint);
  213. urb->transfer_flags = URB_ISO_ASAP | URB_NO_TRANSFER_DMA_MAP;
  214. urb->interval = d->props.urb.u.isoc.interval;
  215. urb->number_of_packets = d->props.urb.u.isoc.framesperurb;
  216. urb->transfer_buffer_length = d->buf_size;
  217. urb->transfer_buffer = d->buf_list[i];
  218. urb->transfer_dma = d->dma_addr[i];
  219. for (j = 0; j < d->props.urb.u.isoc.framesperurb; j++) {
  220. urb->iso_frame_desc[j].offset = frame_offset;
  221. urb->iso_frame_desc[j].length = d->props.urb.u.isoc.framesize;
  222. frame_offset += d->props.urb.u.isoc.framesize;
  223. }
  224. d->urbs_initialized++;
  225. }
  226. return 0;
  227. }
  228. int dvb_usb_urb_init(struct dvb_usb_device *d)
  229. {
  230. /*
  231. * when reloading the driver w/o replugging the device
  232. * sometimes a timeout occures, this helps
  233. */
  234. if (d->props.generic_bulk_ctrl_endpoint != 0) {
  235. usb_clear_halt(d->udev,usb_sndbulkpipe(d->udev,d->props.generic_bulk_ctrl_endpoint));
  236. usb_clear_halt(d->udev,usb_rcvbulkpipe(d->udev,d->props.generic_bulk_ctrl_endpoint));
  237. }
  238. usb_clear_halt(d->udev,usb_rcvbulkpipe(d->udev,d->props.urb.endpoint));
  239. /* allocate the array for the data transfer URBs */
  240. d->urb_list = kzalloc(d->props.urb.count * sizeof(struct urb *),GFP_KERNEL);
  241. if (d->urb_list == NULL)
  242. return -ENOMEM;
  243. d->state |= DVB_USB_STATE_URB_LIST;
  244. switch (d->props.urb.type) {
  245. case DVB_USB_BULK:
  246. return dvb_usb_bulk_urb_init(d);
  247. case DVB_USB_ISOC:
  248. return dvb_usb_isoc_urb_init(d);
  249. default:
  250. err("unkown URB-type for data transfer.");
  251. return -EINVAL;
  252. }
  253. }
  254. int dvb_usb_urb_exit(struct dvb_usb_device *d)
  255. {
  256. int i;
  257. dvb_usb_urb_kill(d);
  258. if (d->state & DVB_USB_STATE_URB_LIST) {
  259. for (i = 0; i < d->urbs_initialized; i++) {
  260. if (d->urb_list[i] != NULL) {
  261. deb_mem("freeing URB no. %d.\n",i);
  262. /* free the URBs */
  263. usb_free_urb(d->urb_list[i]);
  264. }
  265. }
  266. d->urbs_initialized = 0;
  267. /* free the urb array */
  268. kfree(d->urb_list);
  269. d->state &= ~DVB_USB_STATE_URB_LIST;
  270. }
  271. dvb_usb_free_stream_buffers(d);
  272. return 0;
  273. }