dabusb.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923
  1. /*****************************************************************************/
  2. /*
  3. * dabusb.c -- dab usb driver.
  4. *
  5. * Copyright (C) 1999 Deti Fliegl (deti@fliegl.de)
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * This program is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. *
  21. *
  22. *
  23. * $Id: dabusb.c,v 1.54 2000/07/24 21:39:39 deti Exp $
  24. *
  25. */
  26. /*****************************************************************************/
  27. #include <linux/module.h>
  28. #include <linux/socket.h>
  29. #include <linux/list.h>
  30. #include <linux/vmalloc.h>
  31. #include <linux/slab.h>
  32. #include <linux/smp_lock.h>
  33. #include <linux/init.h>
  34. #include <asm/uaccess.h>
  35. #include <asm/atomic.h>
  36. #include <linux/delay.h>
  37. #include <linux/usb.h>
  38. #include <linux/mutex.h>
  39. #include <linux/firmware.h>
  40. #include <linux/ihex.h>
  41. #include "dabusb.h"
  42. /*
  43. * Version Information
  44. */
  45. #define DRIVER_VERSION "v1.54"
  46. #define DRIVER_AUTHOR "Deti Fliegl, deti@fliegl.de"
  47. #define DRIVER_DESC "DAB-USB Interface Driver for Linux (c)1999"
  48. /* --------------------------------------------------------------------- */
  49. #ifdef CONFIG_USB_DYNAMIC_MINORS
  50. #define NRDABUSB 256
  51. #else
  52. #define NRDABUSB 4
  53. #endif
  54. /*-------------------------------------------------------------------*/
  55. static dabusb_t dabusb[NRDABUSB];
  56. static int buffers = 256;
  57. static struct usb_driver dabusb_driver;
  58. /*-------------------------------------------------------------------*/
  59. static int dabusb_add_buf_tail (pdabusb_t s, struct list_head *dst, struct list_head *src)
  60. {
  61. unsigned long flags;
  62. struct list_head *tmp;
  63. int ret = 0;
  64. spin_lock_irqsave (&s->lock, flags);
  65. if (list_empty (src)) {
  66. // no elements in source buffer
  67. ret = -1;
  68. goto err;
  69. }
  70. tmp = src->next;
  71. list_move_tail (tmp, dst);
  72. err: spin_unlock_irqrestore (&s->lock, flags);
  73. return ret;
  74. }
  75. /*-------------------------------------------------------------------*/
  76. #ifdef DEBUG
  77. static void dump_urb (struct urb *urb)
  78. {
  79. dbg("urb :%p", urb);
  80. dbg("dev :%p", urb->dev);
  81. dbg("pipe :%08X", urb->pipe);
  82. dbg("status :%d", urb->status);
  83. dbg("transfer_flags :%08X", urb->transfer_flags);
  84. dbg("transfer_buffer :%p", urb->transfer_buffer);
  85. dbg("transfer_buffer_length:%d", urb->transfer_buffer_length);
  86. dbg("actual_length :%d", urb->actual_length);
  87. dbg("setup_packet :%p", urb->setup_packet);
  88. dbg("start_frame :%d", urb->start_frame);
  89. dbg("number_of_packets :%d", urb->number_of_packets);
  90. dbg("interval :%d", urb->interval);
  91. dbg("error_count :%d", urb->error_count);
  92. dbg("context :%p", urb->context);
  93. dbg("complete :%p", urb->complete);
  94. }
  95. #endif
  96. /*-------------------------------------------------------------------*/
  97. static int dabusb_cancel_queue (pdabusb_t s, struct list_head *q)
  98. {
  99. unsigned long flags;
  100. pbuff_t b;
  101. dbg("dabusb_cancel_queue");
  102. spin_lock_irqsave (&s->lock, flags);
  103. list_for_each_entry(b, q, buff_list) {
  104. #ifdef DEBUG
  105. dump_urb(b->purb);
  106. #endif
  107. usb_unlink_urb (b->purb);
  108. }
  109. spin_unlock_irqrestore (&s->lock, flags);
  110. return 0;
  111. }
  112. /*-------------------------------------------------------------------*/
  113. static int dabusb_free_queue (struct list_head *q)
  114. {
  115. struct list_head *tmp;
  116. struct list_head *p;
  117. pbuff_t b;
  118. dbg("dabusb_free_queue");
  119. for (p = q->next; p != q;) {
  120. b = list_entry (p, buff_t, buff_list);
  121. #ifdef DEBUG
  122. dump_urb(b->purb);
  123. #endif
  124. kfree(b->purb->transfer_buffer);
  125. usb_free_urb(b->purb);
  126. tmp = p->next;
  127. list_del (p);
  128. kfree (b);
  129. p = tmp;
  130. }
  131. return 0;
  132. }
  133. /*-------------------------------------------------------------------*/
  134. static int dabusb_free_buffers (pdabusb_t s)
  135. {
  136. unsigned long flags;
  137. dbg("dabusb_free_buffers");
  138. spin_lock_irqsave(&s->lock, flags);
  139. dabusb_free_queue (&s->free_buff_list);
  140. dabusb_free_queue (&s->rec_buff_list);
  141. spin_unlock_irqrestore(&s->lock, flags);
  142. s->got_mem = 0;
  143. return 0;
  144. }
  145. /*-------------------------------------------------------------------*/
  146. static void dabusb_iso_complete (struct urb *purb)
  147. {
  148. pbuff_t b = purb->context;
  149. pdabusb_t s = b->s;
  150. int i;
  151. int len;
  152. int dst = 0;
  153. void *buf = purb->transfer_buffer;
  154. dbg("dabusb_iso_complete");
  155. // process if URB was not killed
  156. if (purb->status != -ENOENT) {
  157. unsigned int pipe = usb_rcvisocpipe (purb->dev, _DABUSB_ISOPIPE);
  158. int pipesize = usb_maxpacket (purb->dev, pipe, usb_pipeout (pipe));
  159. for (i = 0; i < purb->number_of_packets; i++)
  160. if (!purb->iso_frame_desc[i].status) {
  161. len = purb->iso_frame_desc[i].actual_length;
  162. if (len <= pipesize) {
  163. memcpy (buf + dst, buf + purb->iso_frame_desc[i].offset, len);
  164. dst += len;
  165. }
  166. else
  167. dev_err(&purb->dev->dev,
  168. "dabusb_iso_complete: invalid len %d\n", len);
  169. }
  170. else
  171. dev_warn(&purb->dev->dev, "dabusb_iso_complete: corrupted packet status: %d\n", purb->iso_frame_desc[i].status);
  172. if (dst != purb->actual_length)
  173. dev_err(&purb->dev->dev,
  174. "dst!=purb->actual_length:%d!=%d\n",
  175. dst, purb->actual_length);
  176. }
  177. if (atomic_dec_and_test (&s->pending_io) && !s->remove_pending && s->state != _stopped) {
  178. s->overruns++;
  179. dev_err(&purb->dev->dev, "overrun (%d)\n", s->overruns);
  180. }
  181. wake_up (&s->wait);
  182. }
  183. /*-------------------------------------------------------------------*/
  184. static int dabusb_alloc_buffers (pdabusb_t s)
  185. {
  186. int transfer_len = 0;
  187. pbuff_t b;
  188. unsigned int pipe = usb_rcvisocpipe (s->usbdev, _DABUSB_ISOPIPE);
  189. int pipesize = usb_maxpacket (s->usbdev, pipe, usb_pipeout (pipe));
  190. int packets = _ISOPIPESIZE / pipesize;
  191. int transfer_buffer_length = packets * pipesize;
  192. int i;
  193. dbg("dabusb_alloc_buffers pipesize:%d packets:%d transfer_buffer_len:%d",
  194. pipesize, packets, transfer_buffer_length);
  195. while (transfer_len < (s->total_buffer_size << 10)) {
  196. b = kzalloc(sizeof (buff_t), GFP_KERNEL);
  197. if (!b) {
  198. dev_err(&s->usbdev->dev,
  199. "kzalloc(sizeof(buff_t))==NULL\n");
  200. goto err;
  201. }
  202. b->s = s;
  203. b->purb = usb_alloc_urb(packets, GFP_KERNEL);
  204. if (!b->purb) {
  205. dev_err(&s->usbdev->dev, "usb_alloc_urb == NULL\n");
  206. kfree (b);
  207. goto err;
  208. }
  209. b->purb->transfer_buffer = kmalloc (transfer_buffer_length, GFP_KERNEL);
  210. if (!b->purb->transfer_buffer) {
  211. kfree (b->purb);
  212. kfree (b);
  213. dev_err(&s->usbdev->dev,
  214. "kmalloc(%d)==NULL\n", transfer_buffer_length);
  215. goto err;
  216. }
  217. b->purb->transfer_buffer_length = transfer_buffer_length;
  218. b->purb->number_of_packets = packets;
  219. b->purb->complete = dabusb_iso_complete;
  220. b->purb->context = b;
  221. b->purb->dev = s->usbdev;
  222. b->purb->pipe = pipe;
  223. b->purb->transfer_flags = URB_ISO_ASAP;
  224. for (i = 0; i < packets; i++) {
  225. b->purb->iso_frame_desc[i].offset = i * pipesize;
  226. b->purb->iso_frame_desc[i].length = pipesize;
  227. }
  228. transfer_len += transfer_buffer_length;
  229. list_add_tail (&b->buff_list, &s->free_buff_list);
  230. }
  231. s->got_mem = transfer_len;
  232. return 0;
  233. err:
  234. dabusb_free_buffers (s);
  235. return -ENOMEM;
  236. }
  237. /*-------------------------------------------------------------------*/
  238. static int dabusb_bulk (pdabusb_t s, pbulk_transfer_t pb)
  239. {
  240. int ret;
  241. unsigned int pipe;
  242. int actual_length;
  243. dbg("dabusb_bulk");
  244. if (!pb->pipe)
  245. pipe = usb_rcvbulkpipe (s->usbdev, 2);
  246. else
  247. pipe = usb_sndbulkpipe (s->usbdev, 2);
  248. ret=usb_bulk_msg(s->usbdev, pipe, pb->data, pb->size, &actual_length, 100);
  249. if(ret<0) {
  250. dev_err(&s->usbdev->dev,
  251. "usb_bulk_msg failed(%d)\n", ret);
  252. if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) {
  253. dev_err(&s->usbdev->dev, "set_interface failed\n");
  254. return -EINVAL;
  255. }
  256. }
  257. if( ret == -EPIPE ) {
  258. dev_warn(&s->usbdev->dev, "CLEAR_FEATURE request to remove STALL condition.\n");
  259. if(usb_clear_halt(s->usbdev, usb_pipeendpoint(pipe)))
  260. dev_err(&s->usbdev->dev, "request failed\n");
  261. }
  262. pb->size = actual_length;
  263. return ret;
  264. }
  265. /* --------------------------------------------------------------------- */
  266. static int dabusb_writemem (pdabusb_t s, int pos, const unsigned char *data,
  267. int len)
  268. {
  269. int ret;
  270. unsigned char *transfer_buffer = kmalloc (len, GFP_KERNEL);
  271. if (!transfer_buffer) {
  272. dev_err(&s->usbdev->dev,
  273. "dabusb_writemem: kmalloc(%d) failed.\n", len);
  274. return -ENOMEM;
  275. }
  276. memcpy (transfer_buffer, data, len);
  277. ret=usb_control_msg(s->usbdev, usb_sndctrlpipe( s->usbdev, 0 ), 0xa0, 0x40, pos, 0, transfer_buffer, len, 300);
  278. kfree (transfer_buffer);
  279. return ret;
  280. }
  281. /* --------------------------------------------------------------------- */
  282. static int dabusb_8051_reset (pdabusb_t s, unsigned char reset_bit)
  283. {
  284. dbg("dabusb_8051_reset: %d",reset_bit);
  285. return dabusb_writemem (s, CPUCS_REG, &reset_bit, 1);
  286. }
  287. /* --------------------------------------------------------------------- */
  288. static int dabusb_loadmem (pdabusb_t s, const char *fname)
  289. {
  290. int ret;
  291. const struct ihex_binrec *rec;
  292. const struct firmware *uninitialized_var(fw);
  293. dbg("Enter dabusb_loadmem (internal)");
  294. ret = request_ihex_firmware(&fw, "dabusb/firmware.fw", &s->usbdev->dev);
  295. if (ret) {
  296. dev_err(&s->usbdev->dev,
  297. "Failed to load \"dabusb/firmware.fw\": %d\n", ret);
  298. goto out;
  299. }
  300. ret = dabusb_8051_reset (s, 1);
  301. for (rec = (const struct ihex_binrec *)fw->data; rec;
  302. rec = ihex_next_binrec(rec)) {
  303. dbg("dabusb_writemem: %04X %p %d)", be32_to_cpu(rec->addr),
  304. rec->data, be16_to_cpu(rec->len));
  305. ret = dabusb_writemem(s, be32_to_cpu(rec->addr), rec->data,
  306. be16_to_cpu(rec->len));
  307. if (ret < 0) {
  308. dev_err(&s->usbdev->dev,
  309. "dabusb_writemem failed (%d %04X %p %d)\n",
  310. ret, be32_to_cpu(rec->addr),
  311. rec->data, be16_to_cpu(rec->len));
  312. break;
  313. }
  314. }
  315. ret = dabusb_8051_reset (s, 0);
  316. release_firmware(fw);
  317. out:
  318. dbg("dabusb_loadmem: exit");
  319. return ret;
  320. }
  321. /* --------------------------------------------------------------------- */
  322. static int dabusb_fpga_clear (pdabusb_t s, pbulk_transfer_t b)
  323. {
  324. b->size = 4;
  325. b->data[0] = 0x2a;
  326. b->data[1] = 0;
  327. b->data[2] = 0;
  328. b->data[3] = 0;
  329. dbg("dabusb_fpga_clear");
  330. return dabusb_bulk (s, b);
  331. }
  332. /* --------------------------------------------------------------------- */
  333. static int dabusb_fpga_init (pdabusb_t s, pbulk_transfer_t b)
  334. {
  335. b->size = 4;
  336. b->data[0] = 0x2c;
  337. b->data[1] = 0;
  338. b->data[2] = 0;
  339. b->data[3] = 0;
  340. dbg("dabusb_fpga_init");
  341. return dabusb_bulk (s, b);
  342. }
  343. /* --------------------------------------------------------------------- */
  344. static int dabusb_fpga_download (pdabusb_t s, const char *fname)
  345. {
  346. pbulk_transfer_t b = kmalloc (sizeof (bulk_transfer_t), GFP_KERNEL);
  347. const struct firmware *fw;
  348. unsigned int blen, n;
  349. int ret;
  350. dbg("Enter dabusb_fpga_download (internal)");
  351. if (!b) {
  352. dev_err(&s->usbdev->dev,
  353. "kmalloc(sizeof(bulk_transfer_t))==NULL\n");
  354. return -ENOMEM;
  355. }
  356. ret = request_firmware(&fw, "dabusb/bitstream.bin", &s->usbdev->dev);
  357. if (ret) {
  358. dev_err(&s->usbdev->dev,
  359. "Failed to load \"dabusb/bitstream.bin\": %d\n", ret);
  360. kfree(b);
  361. return ret;
  362. }
  363. b->pipe = 1;
  364. ret = dabusb_fpga_clear (s, b);
  365. mdelay (10);
  366. blen = fw->data[73] + (fw->data[72] << 8);
  367. dbg("Bitstream len: %i", blen);
  368. b->data[0] = 0x2b;
  369. b->data[1] = 0;
  370. b->data[2] = 0;
  371. b->data[3] = 60;
  372. for (n = 0; n <= blen + 60; n += 60) {
  373. // some cclks for startup
  374. b->size = 64;
  375. memcpy (b->data + 4, fw->data + 74 + n, 60);
  376. ret = dabusb_bulk (s, b);
  377. if (ret < 0) {
  378. dev_err(&s->usbdev->dev, "dabusb_bulk failed.\n");
  379. break;
  380. }
  381. mdelay (1);
  382. }
  383. ret = dabusb_fpga_init (s, b);
  384. kfree (b);
  385. release_firmware(fw);
  386. dbg("exit dabusb_fpga_download");
  387. return ret;
  388. }
  389. static int dabusb_stop (pdabusb_t s)
  390. {
  391. dbg("dabusb_stop");
  392. s->state = _stopped;
  393. dabusb_cancel_queue (s, &s->rec_buff_list);
  394. dbg("pending_io: %d", s->pending_io.counter);
  395. s->pending_io.counter = 0;
  396. return 0;
  397. }
  398. static int dabusb_startrek (pdabusb_t s)
  399. {
  400. if (!s->got_mem && s->state != _started) {
  401. dbg("dabusb_startrek");
  402. if (dabusb_alloc_buffers (s) < 0)
  403. return -ENOMEM;
  404. dabusb_stop (s);
  405. s->state = _started;
  406. s->readptr = 0;
  407. }
  408. if (!list_empty (&s->free_buff_list)) {
  409. pbuff_t end;
  410. int ret;
  411. while (!dabusb_add_buf_tail (s, &s->rec_buff_list, &s->free_buff_list)) {
  412. dbg("submitting: end:%p s->rec_buff_list:%p", s->rec_buff_list.prev, &s->rec_buff_list);
  413. end = list_entry (s->rec_buff_list.prev, buff_t, buff_list);
  414. ret = usb_submit_urb (end->purb, GFP_KERNEL);
  415. if (ret) {
  416. dev_err(&s->usbdev->dev,
  417. "usb_submit_urb returned:%d\n", ret);
  418. if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list))
  419. dev_err(&s->usbdev->dev,
  420. "startrek: dabusb_add_buf_tail failed\n");
  421. break;
  422. }
  423. else
  424. atomic_inc (&s->pending_io);
  425. }
  426. dbg("pending_io: %d",s->pending_io.counter);
  427. }
  428. return 0;
  429. }
  430. static ssize_t dabusb_read (struct file *file, char __user *buf, size_t count, loff_t * ppos)
  431. {
  432. pdabusb_t s = (pdabusb_t) file->private_data;
  433. unsigned long flags;
  434. unsigned ret = 0;
  435. int rem;
  436. int cnt;
  437. pbuff_t b;
  438. struct urb *purb = NULL;
  439. dbg("dabusb_read");
  440. if (*ppos)
  441. return -ESPIPE;
  442. if (s->remove_pending)
  443. return -EIO;
  444. if (!s->usbdev)
  445. return -EIO;
  446. while (count > 0) {
  447. dabusb_startrek (s);
  448. spin_lock_irqsave (&s->lock, flags);
  449. if (list_empty (&s->rec_buff_list)) {
  450. spin_unlock_irqrestore(&s->lock, flags);
  451. dev_err(&s->usbdev->dev,
  452. "error: rec_buf_list is empty\n");
  453. goto err;
  454. }
  455. b = list_entry (s->rec_buff_list.next, buff_t, buff_list);
  456. purb = b->purb;
  457. spin_unlock_irqrestore(&s->lock, flags);
  458. if (purb->status == -EINPROGRESS) {
  459. if (file->f_flags & O_NONBLOCK) // return nonblocking
  460. {
  461. if (!ret)
  462. ret = -EAGAIN;
  463. goto err;
  464. }
  465. interruptible_sleep_on (&s->wait);
  466. if (signal_pending (current)) {
  467. if (!ret)
  468. ret = -ERESTARTSYS;
  469. goto err;
  470. }
  471. spin_lock_irqsave (&s->lock, flags);
  472. if (list_empty (&s->rec_buff_list)) {
  473. spin_unlock_irqrestore(&s->lock, flags);
  474. dev_err(&s->usbdev->dev,
  475. "error: still no buffer available.\n");
  476. goto err;
  477. }
  478. spin_unlock_irqrestore(&s->lock, flags);
  479. s->readptr = 0;
  480. }
  481. if (s->remove_pending) {
  482. ret = -EIO;
  483. goto err;
  484. }
  485. rem = purb->actual_length - s->readptr; // set remaining bytes to copy
  486. if (count >= rem)
  487. cnt = rem;
  488. else
  489. cnt = count;
  490. dbg("copy_to_user:%p %p %d",buf, purb->transfer_buffer + s->readptr, cnt);
  491. if (copy_to_user (buf, purb->transfer_buffer + s->readptr, cnt)) {
  492. dev_err(&s->usbdev->dev, "read: copy_to_user failed\n");
  493. if (!ret)
  494. ret = -EFAULT;
  495. goto err;
  496. }
  497. s->readptr += cnt;
  498. count -= cnt;
  499. buf += cnt;
  500. ret += cnt;
  501. if (s->readptr == purb->actual_length) {
  502. // finished, take next buffer
  503. if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list))
  504. dev_err(&s->usbdev->dev,
  505. "read: dabusb_add_buf_tail failed\n");
  506. s->readptr = 0;
  507. }
  508. }
  509. err: //mutex_unlock(&s->mutex);
  510. return ret;
  511. }
  512. static int dabusb_open (struct inode *inode, struct file *file)
  513. {
  514. int devnum = iminor(inode);
  515. pdabusb_t s;
  516. if (devnum < DABUSB_MINOR || devnum >= (DABUSB_MINOR + NRDABUSB))
  517. return -EIO;
  518. s = &dabusb[devnum - DABUSB_MINOR];
  519. dbg("dabusb_open");
  520. mutex_lock(&s->mutex);
  521. while (!s->usbdev || s->opened) {
  522. mutex_unlock(&s->mutex);
  523. if (file->f_flags & O_NONBLOCK) {
  524. return -EBUSY;
  525. }
  526. msleep_interruptible(500);
  527. if (signal_pending (current)) {
  528. return -EAGAIN;
  529. }
  530. mutex_lock(&s->mutex);
  531. }
  532. if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) {
  533. mutex_unlock(&s->mutex);
  534. dev_err(&s->usbdev->dev, "set_interface failed\n");
  535. return -EINVAL;
  536. }
  537. s->opened = 1;
  538. mutex_unlock(&s->mutex);
  539. file->f_pos = 0;
  540. file->private_data = s;
  541. return nonseekable_open(inode, file);
  542. }
  543. static int dabusb_release (struct inode *inode, struct file *file)
  544. {
  545. pdabusb_t s = (pdabusb_t) file->private_data;
  546. dbg("dabusb_release");
  547. mutex_lock(&s->mutex);
  548. dabusb_stop (s);
  549. dabusb_free_buffers (s);
  550. mutex_unlock(&s->mutex);
  551. if (!s->remove_pending) {
  552. if (usb_set_interface (s->usbdev, _DABUSB_IF, 0) < 0)
  553. dev_err(&s->usbdev->dev, "set_interface failed\n");
  554. }
  555. else
  556. wake_up (&s->remove_ok);
  557. s->opened = 0;
  558. return 0;
  559. }
  560. static long dabusb_ioctl (struct file *file, unsigned int cmd, unsigned long arg)
  561. {
  562. pdabusb_t s = (pdabusb_t) file->private_data;
  563. pbulk_transfer_t pbulk;
  564. int ret = 0;
  565. int version = DABUSB_VERSION;
  566. dbg("dabusb_ioctl");
  567. lock_kernel();
  568. if (s->remove_pending) {
  569. unlock_kernel();
  570. return -EIO;
  571. }
  572. mutex_lock(&s->mutex);
  573. if (!s->usbdev) {
  574. mutex_unlock(&s->mutex);
  575. unlock_kernel();
  576. return -EIO;
  577. }
  578. switch (cmd) {
  579. case IOCTL_DAB_BULK:
  580. pbulk = kmalloc(sizeof (bulk_transfer_t), GFP_KERNEL);
  581. if (!pbulk) {
  582. ret = -ENOMEM;
  583. break;
  584. }
  585. if (copy_from_user (pbulk, (void __user *) arg, sizeof (bulk_transfer_t))) {
  586. ret = -EFAULT;
  587. kfree (pbulk);
  588. break;
  589. }
  590. ret=dabusb_bulk (s, pbulk);
  591. if(ret==0)
  592. if (copy_to_user((void __user *)arg, pbulk,
  593. sizeof(bulk_transfer_t)))
  594. ret = -EFAULT;
  595. kfree (pbulk);
  596. break;
  597. case IOCTL_DAB_OVERRUNS:
  598. ret = put_user (s->overruns, (unsigned int __user *) arg);
  599. break;
  600. case IOCTL_DAB_VERSION:
  601. ret = put_user (version, (unsigned int __user *) arg);
  602. break;
  603. default:
  604. ret = -ENOIOCTLCMD;
  605. break;
  606. }
  607. mutex_unlock(&s->mutex);
  608. unlock_kernel();
  609. return ret;
  610. }
  611. static const struct file_operations dabusb_fops =
  612. {
  613. .owner = THIS_MODULE,
  614. .llseek = no_llseek,
  615. .read = dabusb_read,
  616. .unlocked_ioctl = dabusb_ioctl,
  617. .open = dabusb_open,
  618. .release = dabusb_release,
  619. };
  620. static char *dabusb_devnode(struct device *dev, mode_t *mode)
  621. {
  622. return kasprintf(GFP_KERNEL, "usb/%s", dev_name(dev));
  623. }
  624. static struct usb_class_driver dabusb_class = {
  625. .name = "dabusb%d",
  626. .devnode = dabusb_devnode,
  627. .fops = &dabusb_fops,
  628. .minor_base = DABUSB_MINOR,
  629. };
  630. /* --------------------------------------------------------------------- */
  631. static int dabusb_probe (struct usb_interface *intf,
  632. const struct usb_device_id *id)
  633. {
  634. struct usb_device *usbdev = interface_to_usbdev(intf);
  635. int retval;
  636. pdabusb_t s;
  637. dbg("dabusb: probe: vendor id 0x%x, device id 0x%x ifnum:%d",
  638. le16_to_cpu(usbdev->descriptor.idVendor),
  639. le16_to_cpu(usbdev->descriptor.idProduct),
  640. intf->altsetting->desc.bInterfaceNumber);
  641. /* We don't handle multiple configurations */
  642. if (usbdev->descriptor.bNumConfigurations != 1)
  643. return -ENODEV;
  644. if (intf->altsetting->desc.bInterfaceNumber != _DABUSB_IF &&
  645. le16_to_cpu(usbdev->descriptor.idProduct) == 0x9999)
  646. return -ENODEV;
  647. s = &dabusb[intf->minor];
  648. mutex_lock(&s->mutex);
  649. s->remove_pending = 0;
  650. s->usbdev = usbdev;
  651. s->devnum = intf->minor;
  652. if (usb_reset_configuration (usbdev) < 0) {
  653. dev_err(&intf->dev, "reset_configuration failed\n");
  654. goto reject;
  655. }
  656. if (le16_to_cpu(usbdev->descriptor.idProduct) == 0x2131) {
  657. dabusb_loadmem (s, NULL);
  658. goto reject;
  659. }
  660. else {
  661. dabusb_fpga_download (s, NULL);
  662. if (usb_set_interface (s->usbdev, _DABUSB_IF, 0) < 0) {
  663. dev_err(&intf->dev, "set_interface failed\n");
  664. goto reject;
  665. }
  666. }
  667. dbg("bound to interface: %d", intf->altsetting->desc.bInterfaceNumber);
  668. usb_set_intfdata (intf, s);
  669. mutex_unlock(&s->mutex);
  670. retval = usb_register_dev(intf, &dabusb_class);
  671. if (retval) {
  672. usb_set_intfdata (intf, NULL);
  673. return -ENOMEM;
  674. }
  675. return 0;
  676. reject:
  677. mutex_unlock(&s->mutex);
  678. s->usbdev = NULL;
  679. return -ENODEV;
  680. }
  681. static void dabusb_disconnect (struct usb_interface *intf)
  682. {
  683. wait_queue_t __wait;
  684. pdabusb_t s = usb_get_intfdata (intf);
  685. dbg("dabusb_disconnect");
  686. init_waitqueue_entry(&__wait, current);
  687. usb_set_intfdata (intf, NULL);
  688. if (s) {
  689. usb_deregister_dev (intf, &dabusb_class);
  690. s->remove_pending = 1;
  691. wake_up (&s->wait);
  692. add_wait_queue(&s->remove_ok, &__wait);
  693. set_current_state(TASK_UNINTERRUPTIBLE);
  694. if (s->state == _started)
  695. schedule();
  696. current->state = TASK_RUNNING;
  697. remove_wait_queue(&s->remove_ok, &__wait);
  698. s->usbdev = NULL;
  699. s->overruns = 0;
  700. }
  701. }
  702. static struct usb_device_id dabusb_ids [] = {
  703. // { USB_DEVICE(0x0547, 0x2131) }, /* An2131 chip, no boot ROM */
  704. { USB_DEVICE(0x0547, 0x9999) },
  705. { } /* Terminating entry */
  706. };
  707. MODULE_DEVICE_TABLE (usb, dabusb_ids);
  708. static struct usb_driver dabusb_driver = {
  709. .name = "dabusb",
  710. .probe = dabusb_probe,
  711. .disconnect = dabusb_disconnect,
  712. .id_table = dabusb_ids,
  713. };
  714. /* --------------------------------------------------------------------- */
  715. static int __init dabusb_init (void)
  716. {
  717. int retval;
  718. unsigned u;
  719. /* initialize struct */
  720. for (u = 0; u < NRDABUSB; u++) {
  721. pdabusb_t s = &dabusb[u];
  722. memset (s, 0, sizeof (dabusb_t));
  723. mutex_init (&s->mutex);
  724. s->usbdev = NULL;
  725. s->total_buffer_size = buffers;
  726. init_waitqueue_head (&s->wait);
  727. init_waitqueue_head (&s->remove_ok);
  728. spin_lock_init (&s->lock);
  729. INIT_LIST_HEAD (&s->free_buff_list);
  730. INIT_LIST_HEAD (&s->rec_buff_list);
  731. }
  732. /* register misc device */
  733. retval = usb_register(&dabusb_driver);
  734. if (retval)
  735. goto out;
  736. dbg("dabusb_init: driver registered");
  737. printk(KERN_INFO KBUILD_MODNAME ": " DRIVER_VERSION ":"
  738. DRIVER_DESC "\n");
  739. out:
  740. return retval;
  741. }
  742. static void __exit dabusb_cleanup (void)
  743. {
  744. dbg("dabusb_cleanup");
  745. usb_deregister (&dabusb_driver);
  746. }
  747. /* --------------------------------------------------------------------- */
  748. MODULE_AUTHOR( DRIVER_AUTHOR );
  749. MODULE_DESCRIPTION( DRIVER_DESC );
  750. MODULE_LICENSE("GPL");
  751. module_param(buffers, int, 0);
  752. MODULE_PARM_DESC (buffers, "Number of buffers (default=256)");
  753. module_init (dabusb_init);
  754. module_exit (dabusb_cleanup);
  755. /* --------------------------------------------------------------------- */