dabusb.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:19k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  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/miscdevice.h>
  30. #include <linux/list.h>
  31. #include <linux/vmalloc.h>
  32. #include <linux/slab.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/smp_lock.h>
  39. #include "dabusb.h"
  40. #include "dabfirmware.h"
  41. /*
  42.  * Version Information
  43.  */
  44. #define DRIVER_VERSION "v1.54"
  45. #define DRIVER_AUTHOR "Deti Fliegl, deti@fliegl.de"
  46. #define DRIVER_DESC "DAB-USB Interface Driver for Linux (c)1999"
  47. /* --------------------------------------------------------------------- */
  48. #define NRDABUSB 4
  49. /*-------------------------------------------------------------------*/
  50. static dabusb_t dabusb[NRDABUSB];
  51. static int buffers = 256;
  52. /*-------------------------------------------------------------------*/
  53. static int dabusb_add_buf_tail (pdabusb_t s, struct list_head *dst, struct list_head *src)
  54. {
  55. unsigned long flags;
  56. struct list_head *tmp;
  57. int ret = 0;
  58. spin_lock_irqsave (&s->lock, flags);
  59. if (list_empty (src)) {
  60. // no elements in source buffer
  61. ret = -1;
  62. goto err;
  63. }
  64. tmp = src->next;
  65. list_del (tmp);
  66. list_add_tail (tmp, dst);
  67.   err: spin_unlock_irqrestore (&s->lock, flags);
  68. return ret;
  69. }
  70. /*-------------------------------------------------------------------*/
  71. #ifdef DEBUG 
  72. static void dump_urb (struct urb *purb)
  73. {
  74. dbg("urb                   :%p", purb);
  75. dbg("next                  :%p", purb->next);
  76. dbg("dev                   :%p", purb->dev);
  77. dbg("pipe                  :%08X", purb->pipe);
  78. dbg("status                :%d", purb->status);
  79. dbg("transfer_flags        :%08X", purb->transfer_flags);
  80. dbg("transfer_buffer       :%p", purb->transfer_buffer);
  81. dbg("transfer_buffer_length:%d", purb->transfer_buffer_length);
  82. dbg("actual_length         :%d", purb->actual_length);
  83. dbg("setup_packet          :%p", purb->setup_packet);
  84. dbg("start_frame           :%d", purb->start_frame);
  85. dbg("number_of_packets     :%d", purb->number_of_packets);
  86. dbg("interval              :%d", purb->interval);
  87. dbg("error_count           :%d", purb->error_count);
  88. dbg("context               :%p", purb->context);
  89. dbg("complete              :%p", purb->complete);
  90. }
  91. #endif
  92. /*-------------------------------------------------------------------*/
  93. static int dabusb_cancel_queue (pdabusb_t s, struct list_head *q)
  94. {
  95. unsigned long flags;
  96. struct list_head *p;
  97. pbuff_t b;
  98. dbg("dabusb_cancel_queue");
  99. spin_lock_irqsave (&s->lock, flags);
  100. for (p = q->next; p != q; p = p->next) {
  101. b = list_entry (p, buff_t, buff_list);
  102. #ifdef DEBUG
  103. dump_urb(b->purb);
  104. #endif
  105. usb_unlink_urb (b->purb);
  106. }
  107. spin_unlock_irqrestore (&s->lock, flags);
  108. return 0;
  109. }
  110. /*-------------------------------------------------------------------*/
  111. static int dabusb_free_queue (struct list_head *q)
  112. {
  113. struct list_head *tmp;
  114. struct list_head *p;
  115. pbuff_t b;
  116. dbg("dabusb_free_queue");
  117. for (p = q->next; p != q;) {
  118. b = list_entry (p, buff_t, buff_list);
  119. #ifdef DEBUG 
  120. dump_urb(b->purb);
  121. #endif
  122. if (b->purb->transfer_buffer)
  123. kfree (b->purb->transfer_buffer);
  124. usb_free_urb(b->purb);
  125. tmp = p->next;
  126. list_del (p);
  127. kfree (b);
  128. p = tmp;
  129. }
  130. return 0;
  131. }
  132. /*-------------------------------------------------------------------*/
  133. static int dabusb_free_buffers (pdabusb_t s)
  134. {
  135. unsigned long flags;
  136. dbg("dabusb_free_buffers");
  137. spin_lock_irqsave(&s->lock, flags);
  138. dabusb_free_queue (&s->free_buff_list);
  139. dabusb_free_queue (&s->rec_buff_list);
  140. spin_unlock_irqrestore(&s->lock, flags);
  141. s->got_mem = 0;
  142. return 0;
  143. }
  144. /*-------------------------------------------------------------------*/
  145. static void dabusb_iso_complete (struct urb *purb)
  146. {
  147. pbuff_t b = purb->context;
  148. pdabusb_t s = b->s;
  149. int i;
  150. int len;
  151. int dst = 0;
  152. void *buf = purb->transfer_buffer;
  153. dbg("dabusb_iso_complete");
  154. // process if URB was not killed
  155. if (purb->status != -ENOENT) {
  156. unsigned int pipe = usb_rcvisocpipe (purb->dev, _DABUSB_ISOPIPE);
  157. int pipesize = usb_maxpacket (purb->dev, pipe, usb_pipeout (pipe));
  158. for (i = 0; i < purb->number_of_packets; i++)
  159. if (!purb->iso_frame_desc[i].status) {
  160. len = purb->iso_frame_desc[i].actual_length;
  161. if (len <= pipesize) {
  162. memcpy (buf + dst, buf + purb->iso_frame_desc[i].offset, len);
  163. dst += len;
  164. }
  165. else
  166. err("dabusb_iso_complete: invalid len %d", len);
  167. }
  168. else
  169. warn("dabusb_iso_complete: corrupted packet status: %d", purb->iso_frame_desc[i].status);
  170. if (dst != purb->actual_length)
  171. err("dst!=purb->actual_length:%d!=%d", dst, purb->actual_length);
  172. }
  173. if (atomic_dec_and_test (&s->pending_io) && !s->remove_pending && s->state != _stopped) {
  174. s->overruns++;
  175. err("overrun (%d)", s->overruns);
  176. }
  177. wake_up (&s->wait);
  178. }
  179. /*-------------------------------------------------------------------*/
  180. static int dabusb_alloc_buffers (pdabusb_t s)
  181. {
  182. int buffers = 0;
  183. pbuff_t b;
  184. unsigned int pipe = usb_rcvisocpipe (s->usbdev, _DABUSB_ISOPIPE);
  185. int pipesize = usb_maxpacket (s->usbdev, pipe, usb_pipeout (pipe));
  186. int packets = _ISOPIPESIZE / pipesize;
  187. int transfer_buffer_length = packets * pipesize;
  188. int i;
  189. dbg("dabusb_alloc_buffers pipesize:%d packets:%d transfer_buffer_len:%d",
  190.  pipesize, packets, transfer_buffer_length);
  191. while (buffers < (s->total_buffer_size << 10)) {
  192. b = (pbuff_t) kmalloc (sizeof (buff_t), GFP_KERNEL);
  193. if (!b) {
  194. err("kmalloc(sizeof(buff_t))==NULL");
  195. goto err;
  196. }
  197. memset (b, 0, sizeof (buff_t));
  198. b->s = s;
  199. b->purb = usb_alloc_urb(packets);
  200. if (!b->purb) {
  201. err("usb_alloc_urb == NULL");
  202. kfree (b);
  203. goto err;
  204. }
  205. b->purb->transfer_buffer = kmalloc (transfer_buffer_length, GFP_KERNEL);
  206. if (!b->purb->transfer_buffer) {
  207. kfree (b->purb);
  208. kfree (b);
  209. err("kmalloc(%d)==NULL", transfer_buffer_length);
  210. goto err;
  211. }
  212. b->purb->transfer_buffer_length = transfer_buffer_length;
  213. b->purb->number_of_packets = packets;
  214. b->purb->complete = dabusb_iso_complete;
  215. b->purb->context = b;
  216. b->purb->dev = s->usbdev;
  217. b->purb->pipe = pipe;
  218. b->purb->transfer_flags = USB_ISO_ASAP;
  219. for (i = 0; i < packets; i++) {
  220. b->purb->iso_frame_desc[i].offset = i * pipesize;
  221. b->purb->iso_frame_desc[i].length = pipesize;
  222. }
  223. buffers += transfer_buffer_length;
  224. list_add_tail (&b->buff_list, &s->free_buff_list);
  225. }
  226. s->got_mem = buffers;
  227. return 0;
  228. err:
  229. dabusb_free_buffers (s);
  230. return -ENOMEM;
  231. }
  232. /*-------------------------------------------------------------------*/
  233. static int dabusb_bulk (pdabusb_t s, pbulk_transfer_t pb)
  234. {
  235. int ret;
  236. unsigned int pipe;
  237. int actual_length;
  238. dbg("dabusb_bulk");
  239. if (!pb->pipe)
  240. pipe = usb_rcvbulkpipe (s->usbdev, 2);
  241. else
  242. pipe = usb_sndbulkpipe (s->usbdev, 2);
  243. ret=usb_bulk_msg(s->usbdev, pipe, pb->data, pb->size, &actual_length, 100);
  244. if(ret<0) {
  245. err("dabusb: usb_bulk_msg failed(%d)",ret);
  246. if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) {
  247. err("set_interface failed");
  248. return -EINVAL;
  249. }
  250. }
  251. if( ret == -EPIPE ) {
  252. warn("CLEAR_FEATURE request to remove STALL condition.");
  253. if(usb_clear_halt(s->usbdev, usb_pipeendpoint(pipe)))
  254. err("request failed");
  255. }
  256. pb->size = actual_length;
  257. return ret;
  258. }
  259. /* --------------------------------------------------------------------- */
  260. static int dabusb_writemem (pdabusb_t s, int pos, unsigned char *data, int len)
  261. {
  262. int ret;
  263. unsigned char *transfer_buffer =  kmalloc (len, GFP_KERNEL);
  264. if (!transfer_buffer) {
  265. err("dabusb_writemem: kmalloc(%d) failed.", len);
  266. return -ENOMEM;
  267. }
  268. memcpy (transfer_buffer, data, len);
  269. ret=usb_control_msg(s->usbdev, usb_sndctrlpipe( s->usbdev, 0 ), 0xa0, 0x40, pos, 0, transfer_buffer, len, 300);
  270. kfree (transfer_buffer);
  271. return ret;
  272. }
  273. /* --------------------------------------------------------------------- */
  274. static int dabusb_8051_reset (pdabusb_t s, unsigned char reset_bit)
  275. {
  276. dbg("dabusb_8051_reset: %d",reset_bit);
  277. return dabusb_writemem (s, CPUCS_REG, &reset_bit, 1);
  278. }
  279. /* --------------------------------------------------------------------- */
  280. static int dabusb_loadmem (pdabusb_t s, const char *fname)
  281. {
  282. int ret;
  283. PINTEL_HEX_RECORD ptr = firmware;
  284. dbg("Enter dabusb_loadmem (internal)");
  285. ret = dabusb_8051_reset (s, 1);
  286. while (ptr->Type == 0) {
  287. dbg("dabusb_writemem: %04X %p %d)", ptr->Address, ptr->Data, ptr->Length);
  288. ret = dabusb_writemem (s, ptr->Address, ptr->Data, ptr->Length);
  289. if (ret < 0) {
  290. err("dabusb_writemem failed (%d %04X %p %d)", ret, ptr->Address, ptr->Data, ptr->Length);
  291. break;
  292. }
  293. ptr++;
  294. }
  295. ret = dabusb_8051_reset (s, 0);
  296. dbg("dabusb_loadmem: exit");
  297. return ret;
  298. }
  299. /* --------------------------------------------------------------------- */
  300. static int dabusb_fpga_clear (pdabusb_t s, pbulk_transfer_t b)
  301. {
  302. b->size = 4;
  303. b->data[0] = 0x2a;
  304. b->data[1] = 0;
  305. b->data[2] = 0;
  306. b->data[3] = 0;
  307. dbg("dabusb_fpga_clear");
  308. return dabusb_bulk (s, b);
  309. }
  310. /* --------------------------------------------------------------------- */
  311. static int dabusb_fpga_init (pdabusb_t s, pbulk_transfer_t b)
  312. {
  313. b->size = 4;
  314. b->data[0] = 0x2c;
  315. b->data[1] = 0;
  316. b->data[2] = 0;
  317. b->data[3] = 0;
  318. dbg("dabusb_fpga_init");
  319. return dabusb_bulk (s, b);
  320. }
  321. /* --------------------------------------------------------------------- */
  322. static int dabusb_fpga_download (pdabusb_t s, const char *fname)
  323. {
  324. pbulk_transfer_t b = kmalloc (sizeof (bulk_transfer_t), GFP_KERNEL);
  325. unsigned int blen, n;
  326. int ret;
  327. unsigned char *buf = bitstream;
  328. dbg("Enter dabusb_fpga_download (internal)");
  329. if (!b) {
  330. err("kmalloc(sizeof(bulk_transfer_t))==NULL");
  331. return -ENOMEM;
  332. }
  333. b->pipe = 1;
  334. ret = dabusb_fpga_clear (s, b);
  335. mdelay (10);
  336. blen = buf[73] + (buf[72] << 8);
  337. dbg("Bitstream len: %i", blen);
  338. b->data[0] = 0x2b;
  339. b->data[1] = 0;
  340. b->data[2] = 0;
  341. b->data[3] = 60;
  342. for (n = 0; n <= blen + 60; n += 60) {
  343. // some cclks for startup
  344. b->size = 64;
  345. memcpy (b->data + 4, buf + 74 + n, 60);
  346. ret = dabusb_bulk (s, b);
  347. if (ret < 0) {
  348. err("dabusb_bulk failed.");
  349. break;
  350. }
  351. mdelay (1);
  352. }
  353. ret = dabusb_fpga_init (s, b);
  354. kfree (b);
  355. dbg("exit dabusb_fpga_download");
  356. return ret;
  357. }
  358. static int dabusb_stop (pdabusb_t s)
  359. {
  360. dbg("dabusb_stop");
  361. s->state = _stopped;
  362. dabusb_cancel_queue (s, &s->rec_buff_list);
  363. dbg("pending_io: %d", s->pending_io.counter);
  364. s->pending_io.counter = 0;
  365. return 0;
  366. }
  367. static int dabusb_startrek (pdabusb_t s)
  368. {
  369. if (!s->got_mem && s->state != _started) {
  370. dbg("dabusb_startrek");
  371. if (dabusb_alloc_buffers (s) < 0)
  372. return -ENOMEM;
  373. dabusb_stop (s);
  374. s->state = _started;
  375. s->readptr = 0;
  376. }
  377. if (!list_empty (&s->free_buff_list)) {
  378. pbuff_t end;
  379. int ret;
  380. while (!dabusb_add_buf_tail (s, &s->rec_buff_list, &s->free_buff_list)) {
  381. dbg("submitting: end:%p s->rec_buff_list:%p", s->rec_buff_list.prev, &s->rec_buff_list);
  382. end = list_entry (s->rec_buff_list.prev, buff_t, buff_list);
  383. ret = usb_submit_urb (end->purb);
  384. if (ret) {
  385. err("usb_submit_urb returned:%d", ret);
  386. if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list))
  387. err("startrek: dabusb_add_buf_tail failed");
  388. break;
  389. }
  390. else
  391. atomic_inc (&s->pending_io);
  392. }
  393. dbg("pending_io: %d",s->pending_io.counter);
  394. }
  395. return 0;
  396. }
  397. static ssize_t dabusb_read (struct file *file, char *buf, size_t count, loff_t * ppos)
  398. {
  399. pdabusb_t s = (pdabusb_t) file->private_data;
  400. unsigned long flags;
  401. unsigned ret = 0;
  402. int rem;
  403. int cnt;
  404. pbuff_t b;
  405. struct urb *purb = NULL;
  406. dbg("dabusb_read");
  407. if (*ppos)
  408. return -ESPIPE;
  409. if (s->remove_pending)
  410. return -EIO;
  411. if (!s->usbdev)
  412. return -EIO;
  413. while (count > 0) {
  414. dabusb_startrek (s);
  415. spin_lock_irqsave (&s->lock, flags);
  416. if (list_empty (&s->rec_buff_list)) {
  417. spin_unlock_irqrestore(&s->lock, flags);
  418. err("error: rec_buf_list is empty");
  419. goto err;
  420. }
  421. b = list_entry (s->rec_buff_list.next, buff_t, buff_list);
  422. purb = b->purb;
  423. spin_unlock_irqrestore(&s->lock, flags);
  424. if (purb->status == -EINPROGRESS) {
  425. if (file->f_flags & O_NONBLOCK) // return nonblocking
  426.  {
  427. if (!ret)
  428. ret = -EAGAIN;
  429. goto err;
  430. }
  431. interruptible_sleep_on (&s->wait);
  432. if (signal_pending (current)) {
  433. if (!ret)
  434. ret = -ERESTARTSYS;
  435. goto err;
  436. }
  437. spin_lock_irqsave (&s->lock, flags);
  438. if (list_empty (&s->rec_buff_list)) {
  439. spin_unlock_irqrestore(&s->lock, flags);
  440. err("error: still no buffer available.");
  441. goto err;
  442. }
  443. spin_unlock_irqrestore(&s->lock, flags);
  444. s->readptr = 0;
  445. }
  446. if (s->remove_pending) {
  447. ret = -EIO;
  448. goto err;
  449. }
  450. rem = purb->actual_length - s->readptr; // set remaining bytes to copy
  451. if (count >= rem)
  452. cnt = rem;
  453. else
  454. cnt = count;
  455. dbg("copy_to_user:%p %p %d",buf, purb->transfer_buffer + s->readptr, cnt);
  456. if (copy_to_user (buf, purb->transfer_buffer + s->readptr, cnt)) {
  457. err("read: copy_to_user failed");
  458. if (!ret)
  459. ret = -EFAULT;
  460. goto err;
  461. }
  462. s->readptr += cnt;
  463. count -= cnt;
  464. buf += cnt;
  465. ret += cnt;
  466. if (s->readptr == purb->actual_length) {
  467. // finished, take next buffer
  468. if (dabusb_add_buf_tail (s, &s->free_buff_list, &s->rec_buff_list))
  469. err("read: dabusb_add_buf_tail failed");
  470. s->readptr = 0;
  471. }
  472. }
  473.       err: //up(&s->mutex);
  474. return ret;
  475. }
  476. static int dabusb_open (struct inode *inode, struct file *file)
  477. {
  478. int devnum = MINOR (inode->i_rdev);
  479. pdabusb_t s;
  480. if (devnum < DABUSB_MINOR || devnum >= (DABUSB_MINOR + NRDABUSB))
  481. return -EIO;
  482. s = &dabusb[devnum - DABUSB_MINOR];
  483. dbg("dabusb_open");
  484. down (&s->mutex);
  485. while (!s->usbdev || s->opened) {
  486. up (&s->mutex);
  487. if (file->f_flags & O_NONBLOCK) {
  488. return -EBUSY;
  489. }
  490. schedule_timeout (HZ / 2);
  491. if (signal_pending (current)) {
  492. return -EAGAIN;
  493. }
  494. down (&s->mutex);
  495. }
  496. if (usb_set_interface (s->usbdev, _DABUSB_IF, 1) < 0) {
  497. err("set_interface failed");
  498. up(&s->mutex);
  499. return -EINVAL;
  500. }
  501. s->opened = 1;
  502. up (&s->mutex);
  503. file->f_pos = 0;
  504. file->private_data = s;
  505. return 0;
  506. }
  507. static int dabusb_release (struct inode *inode, struct file *file)
  508. {
  509. pdabusb_t s = (pdabusb_t) file->private_data;
  510. dbg("dabusb_release");
  511. lock_kernel();
  512. down (&s->mutex);
  513. dabusb_stop (s);
  514. dabusb_free_buffers (s);
  515. up (&s->mutex);
  516. if (!s->remove_pending) {
  517. if (usb_set_interface (s->usbdev, _DABUSB_IF, 0) < 0)
  518. err("set_interface failed");
  519. }
  520. else
  521. wake_up (&s->remove_ok);
  522. s->opened = 0;
  523. unlock_kernel();
  524. return 0;
  525. }
  526. static int dabusb_ioctl (struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
  527. {
  528. pdabusb_t s = (pdabusb_t) file->private_data;
  529. pbulk_transfer_t pbulk;
  530. int ret = 0;
  531. int version = DABUSB_VERSION;
  532. dbg("dabusb_ioctl");
  533. if (s->remove_pending)
  534. return -EIO;
  535. down (&s->mutex);
  536. if (!s->usbdev) {
  537. up (&s->mutex);
  538. return -EIO;
  539. }
  540. switch (cmd) {
  541. case IOCTL_DAB_BULK:
  542. pbulk = (pbulk_transfer_t) kmalloc (sizeof (bulk_transfer_t), GFP_KERNEL);
  543. if (!pbulk) {
  544. ret = -ENOMEM;
  545. break;
  546. }
  547. if (copy_from_user (pbulk, (void *) arg, sizeof (bulk_transfer_t))) {
  548. ret = -EFAULT;
  549. kfree (pbulk);
  550. break;
  551. }
  552. ret=dabusb_bulk (s, pbulk);
  553. if(ret==0)
  554. ret = copy_to_user ((void *) arg, pbulk, sizeof (bulk_transfer_t));
  555. kfree (pbulk);
  556. break;
  557. case IOCTL_DAB_OVERRUNS:
  558. ret = put_user (s->overruns, (unsigned int *) arg);
  559. break;
  560. case IOCTL_DAB_VERSION:
  561. ret = put_user (version, (unsigned int *) arg);
  562. break;
  563. default:
  564. ret = -ENOIOCTLCMD;
  565. break;
  566. }
  567. up (&s->mutex);
  568. return ret;
  569. }
  570. static struct file_operations dabusb_fops =
  571. {
  572. owner: THIS_MODULE,
  573. llseek: no_llseek,
  574. read: dabusb_read,
  575. ioctl: dabusb_ioctl,
  576. open: dabusb_open,
  577. release: dabusb_release,
  578. };
  579. static int dabusb_find_struct (void)
  580. {
  581. int u;
  582. for (u = 0; u < NRDABUSB; u++) {
  583. pdabusb_t s = &dabusb[u];
  584. if (!s->usbdev)
  585. return u;
  586. }
  587. return -1;
  588. }
  589. /* --------------------------------------------------------------------- */
  590. static void *dabusb_probe (struct usb_device *usbdev, unsigned int ifnum,
  591.    const struct usb_device_id *id)
  592. {
  593. int devnum;
  594. pdabusb_t s;
  595. dbg("dabusb: probe: vendor id 0x%x, device id 0x%x ifnum:%d",
  596.   usbdev->descriptor.idVendor, usbdev->descriptor.idProduct, ifnum);
  597. /* We don't handle multiple configurations */
  598. if (usbdev->descriptor.bNumConfigurations != 1)
  599. return NULL;
  600. if (ifnum != _DABUSB_IF && usbdev->descriptor.idProduct == 0x9999)
  601. return NULL;
  602. devnum = dabusb_find_struct ();
  603. if (devnum == -1)
  604. return NULL;
  605. s = &dabusb[devnum];
  606. down (&s->mutex);
  607. s->remove_pending = 0;
  608. s->usbdev = usbdev;
  609. if (usb_set_configuration (usbdev, usbdev->config[0].bConfigurationValue) < 0) {
  610. err("set_configuration failed");
  611. goto reject;
  612. }
  613. if (usbdev->descriptor.idProduct == 0x2131) {
  614. dabusb_loadmem (s, NULL);
  615. goto reject;
  616. }
  617. else {
  618. dabusb_fpga_download (s, NULL);
  619. if (usb_set_interface (s->usbdev, _DABUSB_IF, 0) < 0) {
  620. err("set_interface failed");
  621. goto reject;
  622. }
  623. }
  624. dbg("bound to interface: %d", ifnum);
  625. up (&s->mutex);
  626. MOD_INC_USE_COUNT;
  627. return s;
  628.       reject:
  629. up (&s->mutex);
  630. s->usbdev = NULL;
  631. return NULL;
  632. }
  633. static void dabusb_disconnect (struct usb_device *usbdev, void *ptr)
  634. {
  635. pdabusb_t s = (pdabusb_t) ptr;
  636. dbg("dabusb_disconnect");
  637. s->remove_pending = 1;
  638. wake_up (&s->wait);
  639. if (s->state == _started)
  640. sleep_on (&s->remove_ok);
  641. s->usbdev = NULL;
  642. s->overruns = 0;
  643. MOD_DEC_USE_COUNT;
  644. }
  645. static struct usb_device_id dabusb_ids [] = {
  646. { USB_DEVICE(0x0547, 0x2131) },
  647. { USB_DEVICE(0x0547, 0x9999) },
  648. { } /* Terminating entry */
  649. };
  650. MODULE_DEVICE_TABLE (usb, dabusb_ids);
  651. static struct usb_driver dabusb_driver =
  652. {
  653. name: "dabusb",
  654. probe: dabusb_probe,
  655. disconnect: dabusb_disconnect,
  656. fops: &dabusb_fops,
  657. minor: DABUSB_MINOR,
  658. id_table: dabusb_ids,
  659. };
  660. /* --------------------------------------------------------------------- */
  661. static int __init dabusb_init (void)
  662. {
  663. unsigned u;
  664. /* initialize struct */
  665. for (u = 0; u < NRDABUSB; u++) {
  666. pdabusb_t s = &dabusb[u];
  667. memset (s, 0, sizeof (dabusb_t));
  668. init_MUTEX (&s->mutex);
  669. s->usbdev = NULL;
  670. s->total_buffer_size = buffers;
  671. init_waitqueue_head (&s->wait);
  672. init_waitqueue_head (&s->remove_ok);
  673. spin_lock_init (&s->lock);
  674. INIT_LIST_HEAD (&s->free_buff_list);
  675. INIT_LIST_HEAD (&s->rec_buff_list);
  676. }
  677. /* register misc device */
  678. if (usb_register(&dabusb_driver))
  679. return -1;
  680. dbg("dabusb_init: driver registered");
  681. info(DRIVER_VERSION ":" DRIVER_DESC);
  682. return 0;
  683. }
  684. static void __exit dabusb_cleanup (void)
  685. {
  686. dbg("dabusb_cleanup");
  687. usb_deregister (&dabusb_driver);
  688. }
  689. /* --------------------------------------------------------------------- */
  690. MODULE_AUTHOR( DRIVER_AUTHOR );
  691. MODULE_DESCRIPTION( DRIVER_DESC );
  692. MODULE_LICENSE("GPL");
  693. MODULE_PARM (buffers, "i");
  694. MODULE_PARM_DESC (buffers, "Number of buffers (default=256)");
  695. module_init (dabusb_init);
  696. module_exit (dabusb_cleanup);
  697. /* --------------------------------------------------------------------- */