voip-device.c
上传用户:weyjxb
上传日期:2020-05-18
资源大小:52k
文件大小:48k
源码类别:

多显示器编程

开发平台:

Unix_Linux

  1. /*
  2.  * voipblaster.c
  3.  * (C) Copyright 2001, 2002 by Thomas Davis (tdavis@beeble.homelinux.net)
  4.  * (C) Copyright 2001 by Michael Bosland <mike@ring.org>
  5.  *
  6.  * This program is free software; you can redistribute it and/or modify it
  7.  * under the terms of the GNU General Public License as published by the
  8.  * Free Software Foundation; either version 2 of the License, or (at your
  9.  * option) any later version.
  10.  *
  11.  * This program is distributed in the hope that it will be useful, but
  12.  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  13.  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14.  * for more details.
  15.  *
  16.  * You should have received a copy of the GNU General Public License
  17.  * along with this program; if not, write to the Free Software Foundation,
  18.  * Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  *
  20.  */
  21. #include <linux/config.h>
  22. #include <linux/module.h>
  23. #include <linux/kernel.h>
  24. #include <linux/sched.h>
  25. #include <linux/signal.h>
  26. #include <linux/errno.h>
  27. #include <linux/proc_fs.h>
  28. #include <linux/fs.h>
  29. #include <linux/poll.h>
  30. #include <linux/init.h>
  31. #include <linux/slab.h>
  32. #include <linux/spinlock.h>
  33. #include <linux/smp_lock.h>
  34. #include <linux/usb.h>
  35. #include <asm/string.h>
  36. #include "telephony.h"
  37. #include "voip-ver.h"
  38. #include "voip-config.h"
  39. #include "ixjuser.h"
  40. #include "phonedev.h"
  41. #include "voipblaster.h"
  42. /* These lines are taken from the netbsd port.  */
  43. static u_char init_1[] =
  44. {
  45.     0x3b,0x00,0x40,0x8b // first 2 bytes is length, second 2 bytes is command?
  46. };
  47. static u_char init_2[] =
  48. {
  49.     0x00,0x01,0x00,0x00,0x18,0x02,0x8f,0x00,
  50.     0x10,0x00,0x28,0x40,0x03,0x1a,0x0d,0x0c,
  51.     0xfa,0x43,0xfd,0xea,0x93,0xfe,0x1a,0x41,
  52.     0x00,0x4a,0x93,0xfe,0x2a,0x40,0x00,0x1a,
  53.     0x93,0xfe,0x3a,0x0a,0x00,0x1f,0x3c,0x00,
  54.     0x8c,0x0d,0x03,0xa3,0x23,0xa2,0xdf,0x0d,
  55.     0x0c,0x3a,0x40,0x00,0x2a,0x93,0xfe,0x4a,
  56.     0x0a,0x00,0x0f
  57. };
  58. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
  59. static struct usb_device_id voipblaster_ids[] = {
  60. { USB_DEVICE(0x1292,0x258) }, /* Vendor/Device */
  61. { },
  62. };
  63. MODULE_DEVICE_TABLE (usb, voipblaster_ids);
  64. #endif
  65. static struct usb_voipblaster *voipblaster_table[VOIP_MAX];
  66. /* lock to protect the voipblaster_table structure */
  67. static DECLARE_MUTEX (voipblaster_table_mutex);
  68. /* local function prototypes */
  69. static ssize_t voipblaster_read(struct file *file, char *buffer, size_t count, loff_t *ppos);
  70. static ssize_t voipblaster_write(struct file *file, const char *buffer, size_t count, loff_t *ppos);
  71. static int voipblaster_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);
  72. static int voipblaster_release(struct inode *inode, struct file *file);
  73. static unsigned int voipblaster_poll(struct file *file, poll_table * wait);
  74. static int voipblaster_fasync(int fd, struct file *file, int mode);
  75. /* external functions */
  76. extern void voipblaster_register_device(struct usb_voipblaster *);
  77. extern void voipblaster_proc_init(void);
  78. extern void voipblaster_proc_destroy(void);
  79. extern int voipblaster_get_status_proc(char *);
  80. extern int voipblaster_read_proc(char *page, char **start, off_t off,
  81.  int count, int *eof, void *data);
  82. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
  83. static void *voipblaster_probe(struct usb_device *dev, unsigned int ifnum, const struct usb_device_id *id);
  84. #else
  85. static void *voipblaster_probe(struct usb_device *dev, unsigned int ifnum);
  86. #endif
  87. static void voipblaster_disconnect(struct usb_device *dev, void *ptr);
  88. struct file_operations voipblaster_fops =
  89. {
  90. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
  91.         owner:          THIS_MODULE,
  92. #endif
  93.         read:           voipblaster_read,
  94.         write:          voipblaster_write,
  95.         poll:           voipblaster_poll,
  96.         ioctl:          voipblaster_ioctl,
  97.         release:        voipblaster_release,
  98.         fasync:         voipblaster_fasync
  99. };
  100. #define VOIP_DEBUG
  101. #ifdef VOIP_DEBUG
  102. static int VOIPdebug = 1;
  103. #else
  104. static int VOIPdebug = 0;
  105. #endif
  106. char VOIPversion[32];
  107. static int hertz;
  108. /* Use our own dbg macro */
  109. #undef dbg
  110. #define dbg(format, arg...) do { if (VOIPdebug) printk(KERN_DEBUG __FUNCTION__ ": " format "n" , ## arg); } while (0)
  111. #undef info
  112. #define info(format, arg...) printk(KERN_INFO __FUNCTION__ ": " format "n" , ## arg)
  113. #define get_voipblaster(b) voipblaster_table[(b)]
  114. extern __inline__ void voipblaster_kill_fasync(struct usb_voipblaster *dev, IXJ_SIGEVENT event, int dir)
  115. {
  116. dbg("minor %d, event = %d", dev->minor, event);
  117. if(dev->signals[event]) {
  118. dbg("Sending signal for event %d", event);
  119. /* Send apps notice of change */
  120. /* see config.h for macro definition */
  121. VOIP_KILL_FASYNC(dev->async_queue, dev->signals[event], dir);
  122. }
  123. }
  124. static int capabilities_check(struct usb_voipblaster *dev, struct phone_capability *pcreq)
  125. {
  126. int cnt;
  127. int retval = 0;
  128. for (cnt = 0; cnt < dev->caps; cnt++) {
  129. if (pcreq->captype == dev->caplist[cnt].captype
  130.     && pcreq->cap == dev->caplist[cnt].cap) {
  131. retval = 1;
  132. break;
  133. }
  134. }
  135. return retval;
  136. }
  137. static void add_caps(struct usb_voipblaster *j)
  138. {
  139. j->caps = 0;
  140. j->caplist[j->caps].cap = PHONE_VENDOR_VOIPBLASTER;
  141. strcpy(j->caplist[j->caps].desc, "Linux Hackers, Inc");
  142. j->caplist[j->caps].captype = vendor;
  143. j->caplist[j->caps].handle = j->caps++;
  144. j->caplist[j->caps].captype = device;
  145. switch (j->cardtype) {
  146. case CREATIVE_VOIPBLASTER:
  147. strcpy(j->caplist[j->caps].desc, "Creative VOIP Blaster/USB");
  148. break;
  149. default:
  150. strcpy(j->caplist[j->caps].desc, "Unknown Card");
  151. break;
  152. }
  153. j->caplist[j->caps].cap = j->cardtype;
  154. j->caplist[j->caps].handle = j->caps++;
  155. strcpy(j->caplist[j->caps].desc, "POTS");
  156. j->caplist[j->caps].captype = port;
  157. j->caplist[j->caps].cap = pots;
  158. j->caplist[j->caps].handle = j->caps++;
  159.   /* add devices that can do speaker/mic */
  160. switch (j->cardtype) {
  161. case CREATIVE_VOIPBLASTER:
  162. strcpy(j->caplist[j->caps].desc, "SPEAKER");
  163. j->caplist[j->caps].captype = port;
  164. j->caplist[j->caps].cap = speaker;
  165. j->caplist[j->caps].handle = j->caps++;
  166.         default:
  167.       break;
  168. }
  169. #if 0
  170.   /* add devices that can do handset */
  171. switch (j->cardtype) {
  172. case CREATIVE_VOIPBLASTER:
  173. strcpy(j->caplist[j->caps].desc, "HANDSET");
  174. j->caplist[j->caps].captype = port;
  175. j->caplist[j->caps].cap = handset;
  176. j->caplist[j->caps].handle = j->caps++;
  177. break;
  178.         default:
  179.       break;
  180. }
  181. #endif
  182. #define ENABLE_G723_63 1
  183. #if defined(ENABLE_G723_63)
  184. strcpy(j->caplist[j->caps].desc, "G.723.1 6.3kbps");
  185. j->caplist[j->caps].captype = codec;
  186. j->caplist[j->caps].cap = G723_63;
  187. j->caplist[j->caps].handle = j->caps++;
  188. #endif
  189. strcpy(j->caplist[j->caps].desc, "G.723.1 5.3kbps");
  190. j->caplist[j->caps].captype = codec;
  191. j->caplist[j->caps].cap = G723_53;
  192. j->caplist[j->caps].handle = j->caps++;
  193. }
  194. static void voipblaster_event_irq(urb_t *urb)
  195. {
  196. struct usb_voipblaster *dev = urb->context;
  197. char event;
  198. unsigned long flags;
  199. /* Received an event from the voipblaster.  Place it in the event
  200.    buffer if there is any room.  If it is DTMF data place it in the
  201.    DTMF buffer instead.  Maybe signal somebody that some new stuff
  202.    has arrived. */
  203. spin_lock_irqsave(&dev->io_lock,flags);
  204. /* Figure out what we have. */
  205. event = dev->event_data[0];
  206. dbg("Event Received: 0x%02x, dtmf_ready = %d",event, dev->ex.bits.dtmf_ready);
  207. if ((event >= VB_EVENT_DTMF0 && event <= VB_EVENT_DTMF9) 
  208. || event == VB_EVENT_DTMFSTAR || event == VB_EVENT_DTMFPND) {
  209. /* This is DTMF Information.  Convert to char and add to
  210.    the DTMF buffer if there is room available.  If not,
  211.    drop it. */
  212. char dtmf;
  213. switch (event) {
  214. case VB_EVENT_DTMFSTAR:
  215. dbg("*");
  216. dtmf = 10;
  217. break;
  218.                 case VB_EVENT_DTMFPND:
  219. dbg("#");
  220. dtmf = 12;
  221. break;
  222. case VB_EVENT_DTMF0:
  223. dbg("0");
  224. dtmf = 11;
  225. break;
  226. default:
  227. dtmf = event - VB_EVENT_DTMF0;
  228. break;
  229. }
  230.       
  231. dbg("DTMF decoded: 0x%02x", dtmf & 0xff);
  232. if (dev->dtmf_buffer_len > VB_DTMF_BUFF_LENGTH) {
  233. info("No more room for DTMF data.  Discarding");
  234. } else {
  235. /* Add this DTMF data to the end of the DTMF buffer */
  236. dev->ex.bits.dtmf_ready = 1;
  237. if (dev->ex_sig.bits.dtmf_ready) {
  238. voipblaster_kill_fasync(dev, SIG_DTMF_READY, POLL_IN);
  239. }
  240. dev->dtmf_buffer[dev->dtmf_buffer_in] = dtmf;
  241. dev->dtmf_buffer_len++;
  242. dev->dtmf_buffer_in++;
  243. if (dev->dtmf_buffer_in > VB_DTMF_BUFF_LENGTH)
  244. dev->dtmf_buffer_in = 0;
  245. }
  246. } else {
  247. /* Determine what, if any flags to set. */
  248. switch (event) {
  249. case VB_EVENT_OFFHOOK:
  250. dbg("VB_EVENT_OFFHOOK");
  251. dev->hookstate = 1;
  252. dev->ex.bits.hookstate = 1;
  253. voipblaster_kill_fasync(dev, SIG_HOOKSTATE, POLL_IN);
  254. break;
  255. case VB_EVENT_ONHOOK:
  256. dbg("VB_EVENT_ONHOOK");
  257. dev->hookstate = 0;
  258. dev->ex.bits.hookstate = 1;
  259. voipblaster_kill_fasync(dev, SIG_HOOKSTATE, POLL_IN);
  260. break;
  261. case VB_EVENT_RINGING_OFF:
  262. dbg("VB_EVENT_RINGING_OFF");
  263. dev->ringing = 0;
  264. break;
  265. case VB_EVENT_RINGING_ON:
  266. dbg("VB_EVENT_RINGING_ON");
  267. dev->ringing = 1;
  268. break;
  269. default:
  270. /* This is not DTMF data.  It is some other event */
  271. if (dev->event_buffer_len > VB_EVENT_BUFF_LENGTH) {
  272. info("No more room for EVENT data.  Discarding");
  273. } else {
  274. /* Add this EVENT data to the end of the EVENT buffer */
  275. dev->event_buffer_len++;
  276. dev->event_buffer_in++;
  277. if (dev->event_buffer_in > VB_EVENT_BUFF_LENGTH)
  278. dev->event_buffer_in = 0;
  279. dev->event_buffer[dev->event_buffer_in] = event;
  280. }
  281. dbg("got event 0x%02x", event);
  282. break;
  283. }
  284. }
  285. #if 0
  286. #if !defined(USB_INT_URB)
  287. if (dev->udev != NULL) {
  288. /* Prepare the event urb... */
  289. FILL_BULK_URB(dev->event_urb, dev->udev,
  290.       usb_rcvbulkpipe(dev->udev, 0x81),
  291.       dev->event_data, 1,
  292.       voipblaster_event_irq, dev);
  293. dbg("Starting Event URB");
  294. if (usb_submit_urb(dev->event_urb) != 0) {
  295. dbg("error with event_urb, status = %d", dev->event_urb->status);
  296. }
  297. } else {
  298. dbg("udev = NULL");
  299. }
  300. #endif
  301. #endif
  302. /* Notify driver of new event data... */
  303. dbg("waking sleeper(s)..");
  304. wake_up(&dev->event_q);
  305. wake_up(&dev->poll_q);
  306. wake_up(&dev->read_q);
  307. spin_unlock_irqrestore(&dev->io_lock,flags);
  308. }
  309. static void voipblaster_event_poll(struct usb_voipblaster *dev, int timeout)
  310. {
  311. interruptible_sleep_on_timeout(&dev->event_q, timeout);
  312. }
  313. #if 0
  314. static int voipblaster_status(struct usb_voipblaster *dev)
  315. {
  316. int retval;
  317. dbg("%d events in buffer", dev->event_buffer_len);
  318. if (dev->event_buffer_len > 0) {
  319. dev->event_buffer_len--;
  320. dev->event_buffer_out++;
  321. if (dev->event_buffer_out > VB_EVENT_BUFF_LENGTH) 
  322. dev->event_buffer_out = 0;
  323. retval = dev->event_buffer[dev->event_buffer_in];
  324. } else {
  325. retval = -1;
  326. }
  327. dbg("retval = %d", retval);
  328. return retval;
  329. }
  330. #endif
  331. static void voipblaster_cmd_irq(urb_t *urb)
  332. {
  333. struct usb_voipblaster *dev = urb->context;
  334. unsigned long flags;
  335. /* The last command was sent to the voipblaster.  If there are
  336.    any more commands send them off too.  If there aren't anymore
  337.    then unlink this urb.  This completion handler may also be
  338.    called when we unlink the URB... */
  339. dbg("URB Returned, urb->status = %d", urb->status);
  340. spin_lock_irqsave(&dev->io_lock,flags);
  341. if (urb->status != 0) {
  342. if ((urb->status != -ENOENT) && 
  343.     (urb->status != -ECONNRESET)) {
  344. dbg(" nonzero status received: %d", urb->status);
  345.                 }
  346. spin_unlock_irqrestore(&dev->io_lock,flags);
  347. goto exit;
  348.         }                        
  349. spin_unlock_irqrestore(&dev->io_lock,flags);
  350. dbg("waking sleeper..");
  351. wake_up(&dev->cmd_q);
  352.  exit:
  353. dbg("CMD completed");
  354. }
  355. static int voipblaster_cmd(struct usb_voipblaster *dev, char cmd)
  356. {
  357. /* Send a command to the voipblaster using a single shot
  358.    interupt URB.  This command will wait for completion before
  359.    returning control */
  360.  
  361. unsigned long flags;
  362. int urb_err;
  363. dbg("Queuing command: 0x%02x", cmd);
  364. /* see if we are already in the middle of a write */
  365. if (dev->cmd_urb->status == -EINPROGRESS) {
  366. dbg ("already writing");
  367. return -1;
  368. }
  369. spin_lock_irqsave(&dev->io_lock,flags);
  370. if (dev->cmd_buffer_len > VB_CMD_BUFF_LENGTH) {
  371. info(" No room in command buffer for new command");
  372. spin_unlock_irqrestore(&dev->io_lock,flags);
  373. return -1;
  374. }
  375. /* A fresh URB needs to be sent off */
  376. dbg("Submitting CMD URB");
  377. dev->cmd_data[0] = cmd;
  378. /* Prepare the command urb... */
  379. #if defined(USE_INT_URB)
  380. FILL_INT_URB(dev->cmd_urb, 
  381.      dev->udev,
  382.      usb_sndintpipe(dev->udev,0x01),
  383.      dev->cmd_data, 
  384.      1,
  385.      voipblaster_cmd_irq, 
  386.      dev,
  387.      0);
  388. #else
  389. FILL_BULK_URB(dev->cmd_urb, 
  390.      dev->udev,
  391.      usb_sndbulkpipe(dev->udev,0x01),
  392.      dev->cmd_data, 
  393.      1,
  394.      voipblaster_cmd_irq, 
  395.      dev);
  396. #endif
  397. urb_err = usb_submit_urb(dev->cmd_urb);
  398. if ( urb_err != 0) {
  399. info("error submitting CMD URB: %d, %d",dev->cmd_urb->status, urb_err);
  400. spin_unlock_irqrestore(&dev->io_lock,flags);
  401. return dev->cmd_urb->status;
  402. }
  403. spin_unlock_irqrestore(&dev->io_lock,flags);
  404. /* now wait for the IRQ to complete. */
  405. interruptible_sleep_on(&dev->cmd_q);
  406. dbg("completed");
  407. return 0;
  408. }
  409. static void voipblaster_snd_voice_irq(urb_t *urb)
  410. {
  411. struct usb_voipblaster *dev = urb->context;
  412. unsigned long flags;
  413. spin_lock_irqsave(&dev->io_lock,flags);
  414. dbg("URB Returned, urb->status = %d", urb->status);
  415.  
  416. /* The current voice block has been processed... */
  417. dev->write_buffer_len = 0;
  418. spin_unlock_irqrestore(&dev->io_lock,flags);
  419. dbg("waking sleeper..");
  420. wake_up(&dev->write_q);
  421. dbg("completed");
  422. }
  423. static int voipblaster_snd_voice(struct usb_voipblaster *dev,
  424. u_char *data, int length)
  425. {
  426. /* Send voice data to the voipblaster using a single shot
  427.    interupt URB.  This command will wait for completion before
  428.    returning control */
  429.  
  430. unsigned long flags;
  431. int i;
  432. dbg("sending %d bytes of voice data.", length);
  433. /* see if we are already in the middle of a write */
  434. if (dev->write_urb->status == -EINPROGRESS) {
  435. dbg ("already writing");
  436. return -1;
  437. }
  438. spin_lock_irqsave(&dev->io_lock,flags);
  439. if (length > VB_W_BUFF_LENGTH) {
  440. dbg("No room in write buffer for new voice data");
  441. spin_unlock_irqrestore(&dev->io_lock,flags);
  442. return -1;
  443. }
  444. /* Add this voice data to the write buffer. */
  445. for (i=0; i<length; i++) {
  446. dev->write_buffer[i] = data[i];
  447. }
  448. dev->write_buffer_len = length;
  449. /* A fresh URB needs to be sent off */
  450. dbg("submitting write URB..");
  451. /* Prepare the write urb... */
  452. #if defined(USE_INT_URB)
  453. FILL_INT_URB(dev->write_urb, dev->udev,
  454. usb_sndintpipe(dev->udev,0x2),
  455. dev->write_buffer, dev->write_buffer_len,
  456. voipblaster_snd_voice_irq, dev,
  457. 0);
  458. #else
  459. FILL_BULK_URB(dev->write_urb, dev->udev,
  460. usb_sndbulkpipe(dev->udev,0x2),
  461. dev->write_buffer, dev->write_buffer_len,
  462. voipblaster_snd_voice_irq, dev);
  463. #endif
  464. if  (usb_submit_urb(dev->write_urb) != 0) {
  465. dbg("error submitting WRITE URB: %d",dev->write_urb->status);
  466. spin_unlock_irqrestore(&dev->io_lock,flags);
  467. return dev->write_urb->status;
  468. }
  469. spin_unlock_irqrestore(&dev->io_lock,flags);
  470. dbg("sleeping..");
  471. interruptible_sleep_on(&dev->write_q);
  472. dbg("done.");
  473. return 0;
  474. }
  475. static void voipblaster_read_irq(urb_t *urb)
  476. {
  477. struct usb_voipblaster *dev = urb->context;
  478. unsigned long flags;
  479. spin_lock_irqsave(&dev->io_lock,flags);
  480. dbg("URB Returned, status = %d", urb->status);
  481. if (urb->status != 0) {
  482. if ((urb->status != -ENOENT) && 
  483.     (urb->status != -ECONNRESET)) {
  484. dbg(" - nonzero status received: %d", urb->status);
  485.                 }
  486. spin_unlock_irqrestore(&dev->io_lock,flags);
  487. goto exit;
  488.         }                        
  489. if (!dev->ispresent) {
  490. dev->ispresent = 1;
  491. memcpy(dev->dsp_version, dev->read_buffer_urb, 10);
  492. memcpy(dev->dsp_serial, &dev->read_buffer_urb[10], 10);
  493. } else {
  494. memcpy(dev->read_buffer, dev->read_buffer_urb, 20);
  495. dev->read_buffer_ready = 1;
  496. dev->read_buffer_in = 20;
  497. }
  498. /* A fresh URB needs to be sent off */
  499. dbg("submitting read URB..");
  500. /* Prepare the read urb... */
  501. FILL_BULK_URB(dev->read_urb, dev->udev,
  502. usb_rcvbulkpipe(dev->udev, 0x82),
  503. dev->read_buffer_urb, 20,
  504. voipblaster_read_irq, dev);
  505. dbg("Starting read URB");
  506. if (usb_submit_urb(dev->read_urb) != 0) {
  507. dbg("error with read_urb, status = %d", dev->read_urb->status);
  508. }
  509. spin_unlock_irqrestore(&dev->io_lock,flags);
  510. dbg("waking sleeper..");
  511. //wake_up(&dev->poll_q);
  512. wake_up(&dev->read_q);
  513.  exit:
  514. dbg("CMD completed");
  515. }
  516. /*
  517.  * voipblaster_read
  518.  */
  519. static ssize_t voipblaster_read(struct file *file, char *buffer, size_t count, loff_t *ppos)
  520. {
  521. struct usb_voipblaster *dev;
  522. int retval = 0;
  523. dev = (struct usb_voipblaster *)file->private_data;
  524. dbg("minor %d, count = %d, read_buffer_ready = %d, read_wait = %ld", dev->minor, 
  525.     count, dev->read_buffer_ready, dev->read_wait);
  526. /* lock this object */
  527. down (&dev->sem);
  528. if (dev->flags.inread) {
  529. up (&dev->sem);
  530. return -EALREADY;
  531. }
  532. dev->flags.inread = 1;
  533. #if 0
  534. while (dev->read_buffer_ready || (dev->dtmf_state && dev->flags.dtmf_oob)) {
  535. #else
  536. while (!dev->read_buffer_ready) {
  537. #endif
  538. ++dev->read_wait;
  539. if (file->f_flags & O_NONBLOCK) {
  540. dbg("O_NONBLOCK");
  541. dev->flags.inread = 0;
  542. up (&dev->sem);
  543. return -EAGAIN;
  544. }
  545. if (!dev->hookstate) {
  546. dbg("on hook..");
  547. dev->flags.inread = 0;
  548. up (&dev->sem);
  549. return 0;
  550. }
  551. interruptible_sleep_on(&dev->read_q);
  552. if (signal_pending(current)) {
  553. dbg("signal_pending");
  554. dev->flags.inread = 0;
  555. up (&dev->sem);
  556. return -EINTR;
  557. }
  558. }
  559. dev->read_buffer_ready = 0;
  560. dev->flags.inread = 0;
  561. if (copy_to_user(buffer, dev->read_buffer, dev->read_buffer_in)) {
  562. retval = -EFAULT;
  563. } else {
  564. if (count == 24 && dev->read_buffer_in == 20) {
  565. retval = count;
  566. } else {
  567. retval =  dev->read_buffer_in;
  568. dev->read_buffer_in = 0;
  569. }
  570. }
  571. up (&dev->sem);
  572. dbg("done, retval = %d", retval);
  573. return retval;
  574. #if 0
  575. /* verify that the device wasn't unplugged */
  576. if (dev->udev == NULL) {
  577. up (&dev->sem);
  578. return -ENODEV;
  579. }
  580. /* do an immediate bulk read to get data from the device */
  581. retval = usb_bulk_msg (dev->udev,
  582.        usb_rcvbulkpipe (dev->udev, 0x82),
  583.        dev->read_buffer, 20,
  584.        &count, 60);
  585. /* if the read was successful, copy the data to userspace */
  586. if (!retval) {
  587. if (copy_to_user (buffer, dev->read_buffer, count))
  588. retval = -EFAULT;
  589. else
  590. retval = count;
  591. }
  592. #endif
  593. }
  594. /**
  595.  *      skel_write_bulk_callback
  596.  */
  597. static void voipblaster_write_callback (struct urb *urb)
  598. {
  599.         struct usb_voipblaster *dev = (struct usb_voipblaster *)urb->context;
  600.         dbg("minor %d", dev->minor);
  601.         if ((urb->status != -ENOENT) && 
  602.             (urb->status != -ECONNRESET)) {
  603.                 dbg("write bulk status received: %d", urb->status);
  604.         }
  605. wake_up(&dev->write_q);
  606.         return;
  607. }
  608. /*
  609.  * voipblaster_write
  610.  */
  611.  static u_char G723count[4] = { 24, 20, 4, 1};
  612. static ssize_t voipblaster_write (struct file *file, const char *buffer, size_t count, loff_t *ppos)
  613. {
  614. struct usb_voipblaster *dev;
  615. ssize_t bytes_written = 0;
  616. int retval = 0;
  617. dev = (struct usb_voipblaster *)file->private_data;
  618. dbg("minor %d, count = %d", dev->minor, count);
  619. /* lock this object */
  620. down (&dev->sem);
  621. /* verify that the device wasn't unplugged */
  622. if (dev->udev == NULL) {
  623. retval = -ENODEV;
  624. goto exit;
  625. }
  626. /* verify that we actually have some data to write */
  627. if (count < 4) {
  628. dbg("write request of too few bytes");
  629. goto exit;
  630. }
  631. /* see if we are already in the middle of a write */
  632. if (dev->write_urb->status == -EINPROGRESS) {
  633. dbg ("already writing");
  634. goto exit;
  635. }
  636.         /* the least significant two bits of the start of the frame
  637.            tell us how big the frame really is */
  638. bytes_written = G723count[(*(u_char *)buffer)&3];
  639. /* we can only write as much as 1 urb will hold */
  640. bytes_written = (bytes_written > VB_W_BUFF_LENGTH) ? 
  641. VB_W_BUFF_LENGTH : bytes_written;
  642. if (count < bytes_written) {
  643. dbg("write request of too few bytes %d vs %d",count,bytes_written);
  644. goto exit;
  645. }
  646. /* copy the data from userspace into our urb */
  647. if (copy_from_user(dev->write_urb->transfer_buffer, buffer, 
  648.    bytes_written)) {
  649. retval = -EFAULT;
  650. goto exit;
  651. }
  652. #if 0
  653. usb_skel_debug_data (__FUNCTION__, bytes_written, 
  654.      dev->write_urb->transfer_buffer);
  655. #endif
  656. /* set up our urb */
  657. FILL_BULK_URB(dev->write_urb, dev->udev, 
  658.       usb_sndbulkpipe(dev->udev, 0x02 ),
  659.       dev->write_buffer, bytes_written,
  660.       voipblaster_write_callback, dev);
  661. /* send the data out the bulk port */
  662. if (usb_submit_urb(dev->write_urb) != 0) {
  663. err("failed submitting write urb, error %d",
  664.     dev->write_urb->status);
  665. } else { /*return full frame size or max buffer size */
  666. retval = (count > VB_W_BUFF_LENGTH) ? 
  667.                                 VB_W_BUFF_LENGTH : count;
  668. }
  669. interruptible_sleep_on(&dev->write_q);
  670. exit:
  671. /* unlock the device */
  672. up (&dev->sem);
  673. return retval;
  674. }
  675. static void voipblaster_ring_start(struct usb_voipblaster *dev)
  676. {
  677. voipblaster_cmd(dev,VB_CMD_RING_ON);
  678. voipblaster_event_poll(dev, 10000);
  679. }
  680. static void voipblaster_ring_stop(struct usb_voipblaster *dev)
  681. {
  682. voipblaster_cmd(dev,VB_CMD_RING_OFF);
  683. voipblaster_event_poll(dev, 10000);
  684. }
  685. static void voipblaster_record_start(struct usb_voipblaster *dev)
  686. {
  687. voipblaster_cmd(dev,VB_CMD_VINP_START);
  688. // voipblaster_event_poll(dev, 10000);
  689. }
  690. static void voipblaster_record_stop(struct usb_voipblaster *dev)
  691. {
  692. voipblaster_cmd(dev,VB_CMD_VINP_STOP);
  693. // voipblaster_event_poll(dev, 10000);
  694. }
  695. static void voipblaster_play_start(struct usb_voipblaster *dev)
  696. {
  697. voipblaster_cmd(dev,VB_CMD_VOUT_START);
  698. voipblaster_cmd(dev,VB_CMD_0x10);
  699. voipblaster_cmd(dev,VB_CMD_0x11);
  700. // voipblaster_event_poll(dev, 10000);
  701. }
  702. static void voipblaster_play_stop(struct usb_voipblaster *dev)
  703. {
  704. voipblaster_cmd(dev,VB_CMD_VOUT_DONE);
  705. voipblaster_event_poll(dev, 10000);
  706. }
  707. static unsigned int voipblaster_poll(struct file *file, poll_table * wait)
  708. {
  709. unsigned int mask = 0;
  710. struct usb_voipblaster *dev;
  711. dev = (struct usb_voipblaster *) file->private_data;
  712. dbg("minor = %d, read_buffer_in = %d, write_buffer_in = %d", dev->minor,
  713.     dev->read_buffer_in, dev->write_buffer_in);
  714. poll_wait(file, &(dev->poll_q), wait);
  715. poll_wait(file, &(dev->read_q), wait);
  716. dbg("poll wakeup");
  717. if (dev->read_buffer_in > 0) {
  718. dbg("read_buffer_in = %d", dev->read_buffer_in);
  719. mask |= POLLIN | POLLRDNORM; /* readable */
  720. }
  721. #if 0
  722. if (dev->write_buffer_in > 0) {
  723. mask |= POLLOUT | POLLWRNORM; /* writable */
  724. }
  725. #endif
  726. mask |= POLLOUT | POLLWRNORM; /* writable */
  727. if (dev->ex.bytes) {
  728. dbg("ex.bytes = %d", dev->ex.bytes);
  729. mask |= POLLPRI;
  730. }
  731. dbg("mask = 0x%04x", mask);
  732. return mask;
  733. }
  734. static int voipblaster_fasync(int fd, struct file *file, int mode)
  735. {
  736. struct usb_voipblaster *dev;
  737. dev = (struct usb_voipblaster *) file->private_data;
  738. dbg("minor = %d", dev->minor);
  739. return fasync_helper(fd, file, mode, &dev->async_queue);
  740. }
  741. /*
  742.  * voipblaster_ioctl
  743.  */
  744. static int voipblaster_ioctl(struct inode *inode, struct file *file, 
  745.      unsigned int cmd, unsigned long arg)
  746. {
  747. struct usb_voipblaster *dev;
  748. int retval = -ENOTTY;
  749. int raise, mant;
  750. #if 0
  751. int c;
  752. #endif
  753. dev = (struct usb_voipblaster *)file->private_data;
  754. /* lock this object */
  755. down (&dev->sem);
  756. /* verify that the device wasn't unplugged */
  757. if (dev->udev == NULL) {
  758. up (&dev->sem);
  759. return -ENODEV;
  760. }
  761. dbg("dev %d, minor %d, cmd 0x%.4x, arg 0x%.8lx", 
  762.     dev->udev->devnum, dev->minor, cmd, arg);
  763. /* fill in your device specific stuff here */
  764. if (!capable(CAP_SYS_ADMIN)) {
  765. switch (cmd) {
  766. case IXJCTL_TESTRAM:
  767. case IXJCTL_HZ:
  768. retval = -EPERM;
  769. }
  770. }
  771. switch (cmd) {
  772. case IXJCTL_TESTRAM:
  773. dbg("IXJCTL_TESTRAM");
  774. retval = 0;
  775. break;
  776. case IXJCTL_CARDTYPE:
  777. dbg("IXJCTL_CARDTYPE");
  778. retval = dev->cardtype;
  779. break;
  780. case IXJCTL_SERIAL:
  781. dbg("IXJCTL_SERIAL");
  782. retval = dev->serial;
  783. break;
  784. case IXJCTL_VERSION:
  785. dbg("IXJCTL_VERSION");
  786. if (copy_to_user((char *) arg, VOIPversion, strlen(VOIPversion)))
  787. retval = -EFAULT;
  788. break;
  789. case PHONE_RING_CADENCE:
  790. dbg("PHONE_RING_CADENCE");
  791. retval = -EPERM;
  792. break;
  793. case IXJCTL_CIDCW:
  794. dbg("IXJCTL_CIDCW");
  795. retval = -EPERM;
  796. break;
  797.         /* Binary compatbility */
  798.         case OLD_PHONE_RING_START:
  799. dbg("OLD_PHONE_RING_START");
  800.                 arg = 0;
  801.                 /* Fall through */
  802.   case PHONE_RING_START:
  803. dbg("PHONE_RING_START");
  804. memset(&dev->cid_send, 0, sizeof(PHONE_CID));
  805. voipblaster_ring_start(dev);
  806. retval = 0;
  807. break;
  808. case PHONE_RING_STOP:
  809. dbg("PHONE_RING_STOP");
  810. dev->flags.cringing = 0;
  811. if (dev->cadence_f[5].enable) {
  812. dev->cadence_f[5].state = 0;
  813. }
  814. voipblaster_ring_stop(dev);
  815. retval = 0;
  816. break;
  817. case PHONE_RING:
  818. dbg("PHONE_RING, maxrings = %d", dev->maxrings);
  819. if (dev->maxrings == 0) {
  820. dbg("setting maxrings = 2");
  821. dev->maxrings = 2;
  822. }
  823. dev->ringcnt = 0;
  824. retval = 0;
  825. while (dev->ringcnt < dev->maxrings) {
  826. voipblaster_ring_start(dev);
  827. voipblaster_event_poll(dev, 10000);
  828. dbg("poll returned; ringcnt = %d, hookstate = %d", 
  829.     dev->ringcnt, dev->hookstate);
  830. if (dev->hookstate == 1) {
  831. dbg("phone answered, stop ringing");
  832. retval = 1;
  833. break;
  834. }
  835. dev->ringcnt++;
  836. }
  837. dbg("ringcnt = %d, maxrings = %d", dev->ringcnt, dev->maxrings);
  838. if (!dev->hookstate) {
  839. voipblaster_ring_stop(dev);
  840. }
  841. break;
  842. case PHONE_EXCEPTION:
  843. dbg("PHONE_EXCEPTION");
  844. retval = dev->ex.bytes;
  845. #if 0
  846. if(dev->ex.bits.flash) {
  847. dev->flash_end = 0;
  848. dev->ex.bits.flash = 0;
  849. }
  850. #endif
  851. dev->ex.bits.pstn_ring = 0;
  852. dev->ex.bits.caller_id = 0;
  853. dev->ex.bits.pstn_wink = 0;
  854. dev->ex.bits.f0 = 0;
  855. dev->ex.bits.f1 = 0;
  856. dev->ex.bits.f2 = 0;
  857. dev->ex.bits.f3 = 0;
  858. dev->ex.bits.fc0 = 0;
  859. dev->ex.bits.fc1 = 0;
  860. dev->ex.bits.fc2 = 0;
  861. dev->ex.bits.fc3 = 0;
  862. dev->ex.bits.reserved = 0;
  863. break;
  864. case PHONE_HOOKSTATE:
  865. dbg("PHONE_HOOKSTATE");
  866. dev->ex.bits.hookstate = 0;
  867. retval = dev->hookstate;
  868. break;
  869. case IXJCTL_SET_LED:
  870. dbg("IXJCTL_SET_LED");
  871. return 0;
  872. break;
  873. case PHONE_FRAME:
  874. dbg("PHONE_FRAME");
  875. if (arg == 30) {
  876. retval = arg;
  877. } else {
  878. retval = -1;
  879. }
  880. break;
  881. case PHONE_REC_CODEC:
  882. dbg("PHONE_REC_CODEC");
  883. switch (arg) {
  884. case G723_53:
  885. dbg("G723_53");
  886. dev->rec_codec = arg;
  887. retval = 0;
  888. break;
  889. #if defined(ENABLE_G723_63)
  890. case G723_63:
  891. dbg("G723_63");
  892. dev->rec_codec = arg;
  893. retval = 0;
  894. break;
  895. #endif
  896. default:
  897. dbg("default; %ld not supported.", arg);
  898. retval = 1;
  899. break;
  900. }
  901. break;
  902. case PHONE_VAD:
  903. dbg("PHONE_VAD");
  904. #if 0
  905. blaster_vad(dev, arg);
  906. #endif
  907. break;
  908. case PHONE_REC_START:
  909. dbg("PHONE_REC_START");
  910. voipblaster_record_start(dev);
  911. retval = 0;
  912. break;
  913. case PHONE_REC_STOP:
  914. dbg("PHONE_REC_STOP");
  915. voipblaster_record_stop(dev);
  916. retval = 0;
  917. break;
  918. case PHONE_REC_DEPTH:
  919. dbg("PHONE_REC_DEPTH");
  920. #if 0
  921. set_rec_depth(dev, arg);
  922. #endif
  923. retval = 1;
  924. break;
  925. case PHONE_REC_VOLUME:
  926. dbg("PHONE_REC_VOLUME");
  927. #if 0
  928. if(arg == -1) {
  929. retval = get_rec_volume(dev);
  930. }
  931. else {
  932. set_rec_volume(dev, arg);
  933. retval = arg;
  934. }
  935. #endif
  936. break;
  937. case PHONE_REC_VOLUME_LINEAR:
  938. dbg("PHONE_REC_VOLUME_LINEAR");
  939. #if 0
  940. if(arg == -1) {
  941. retval = get_rec_volume_linear(dev);
  942. }
  943. else {
  944. set_rec_volume_linear(dev, arg);
  945. retval = arg;
  946. }
  947. #endif
  948. break;
  949. case IXJCTL_DTMF_PRESCALE:
  950. dbg("IXJCTL_DTMF_PRESCALE");
  951. #if 0
  952. if(arg == -1) {
  953. retval = get_dtmf_prescale(dev);
  954. }
  955. else {
  956. set_dtmf_prescale(dev, arg);
  957. retval = arg;
  958. }
  959. #endif
  960. break;
  961. case PHONE_REC_LEVEL:
  962. dbg("PHONE_REC_LEVEL");
  963. #if 0
  964. retval = get_rec_level(dev);
  965. #endif
  966. break;
  967. case IXJCTL_SC_RXG:
  968. dbg("IXJCTL_SC_RXG");
  969. #if 0
  970. retval = VOIPblaster_siadc(dev, arg);
  971. #endif
  972. break;
  973. case IXJCTL_SC_TXG:
  974. dbg("IXJCTL_SC_TXG");
  975. #if 0
  976. retval = VOIPblaster_sidac(dev, arg);
  977. #endif
  978. break;
  979. case IXJCTL_AEC_START:
  980. dbg("IXJCTL_AEC_START");
  981. retval = -EPERM;
  982. break;
  983. case IXJCTL_AEC_STOP:
  984. dbg("IXJCTL_AEC_STOP");
  985. retval = -EPERM;
  986. break;
  987. case IXJCTL_AEC_GET_LEVEL:
  988. dbg("IXJCTL_AEC_GET_LEVEL");
  989. retval = AEC_OFF;
  990. break;
  991. case PHONE_PLAY_CODEC:
  992. dbg("PHONE_PLAY_CODEC");
  993. #if 0
  994. retval = set_play_codec(dev, arg);
  995. #endif
  996. retval = 0;
  997. break;
  998. case PHONE_PLAY_START:
  999. dbg("PHONE_PLAY_START");
  1000. voipblaster_play_start(dev);
  1001. dev->drybuffer = 0;
  1002. retval = 0;
  1003. break;
  1004. case PHONE_PLAY_STOP:
  1005. dbg("PHONE_PLAY_STOP");
  1006. voipblaster_play_stop(dev);
  1007. retval = 0;
  1008. break;
  1009. case PHONE_PLAY_DEPTH:
  1010. dbg("PHONE_PLAY_DEPTH");
  1011. #if 0
  1012. set_play_depth(dev, arg);
  1013. #endif
  1014. break;
  1015. case PHONE_PLAY_VOLUME:
  1016. dbg("PHONE_PLAY_VOLUME");
  1017. #if 0
  1018. if (arg == -1) {
  1019. retval = get_play_volume(dev);
  1020. } else {
  1021. set_play_volume(dev, arg);
  1022. retval = arg;
  1023. }
  1024. #endif
  1025. break;
  1026. case PHONE_PLAY_VOLUME_LINEAR:
  1027. dbg("PHONE_PLAY_VOLUME_LINEAR");
  1028. #if 0
  1029. if (arg == -1) {
  1030. retval = get_play_volume_linear(dev);
  1031. } else {
  1032. set_play_volume_linear(dev, arg);
  1033. retval = arg;
  1034. }
  1035. #endif
  1036. break;
  1037. case PHONE_PLAY_LEVEL:
  1038. dbg("PHONE_PLAY_LEVEL");
  1039. #if 0
  1040. retval = get_play_level(dev);
  1041. #endif
  1042. retval = 0;
  1043. break;
  1044. case IXJCTL_DSP_TYPE:
  1045. dbg("dsp_serial[5] = 0x%02x, dsp_serial[8] = 0x%02x", 
  1046.     dev->dsp_version[5], dev->dsp_version[8]);
  1047. retval = ((dev->dsp_version[5] << 8) | (dev->dsp_version[8] & 0xff)) & 0xffff;
  1048. break;
  1049. case IXJCTL_DSP_VERSION:
  1050. dbg("dsp_serial[1] = 0x%02x, dsp_serial[2] = 0x%02x", 
  1051.     dev->dsp_version[1], dev->dsp_version[2]);
  1052. retval = ((dev->dsp_version[1] << 8) | (dev->dsp_version[2] & 0xff)) & 0xffff;
  1053. break;
  1054. case IXJCTL_HZ:
  1055. dbg("IXJCTL_HZ");
  1056. hertz = arg;
  1057. retval = 0;
  1058. break;
  1059. case IXJCTL_RATE:
  1060. dbg("IXJCTL_RATE");
  1061. retval = -EPERM;
  1062. break;
  1063. case IXJCTL_DRYBUFFER_READ:
  1064. dbg("IXJCTL_DRYBUFFER_READ");
  1065. put_user(dev->drybuffer, (unsigned long *) arg);
  1066. retval = 0;
  1067. break;
  1068. case IXJCTL_DRYBUFFER_CLEAR:
  1069. dbg("IXJCTL_DRYBUFFER_CLEAR");
  1070. dev->drybuffer = 0;
  1071. retval = 0;
  1072. break;
  1073. case IXJCTL_FRAMES_READ:
  1074. dbg("IXJCTL_FRAMES_READ");
  1075. put_user(dev->framesread, (unsigned long *) arg);
  1076. retval = 0;
  1077. break;
  1078. case IXJCTL_FRAMES_WRITTEN:
  1079. dbg("IXJCTL_FRAMES_WRITTEN");
  1080. put_user(dev->frameswritten, (unsigned long *) arg);
  1081. retval = 0;
  1082. break;
  1083. case IXJCTL_READ_WAIT:
  1084. dbg("IXJCTL_READ_WAIT");
  1085. put_user(dev->read_wait, (unsigned long *) arg);
  1086. retval = 0;
  1087. break;
  1088. case IXJCTL_WRITE_WAIT:
  1089. dbg("IXJCTL_WRITE_WAIT");
  1090. put_user(dev->write_wait, (unsigned long *) arg);
  1091. retval = 0;
  1092. break;
  1093. case PHONE_MAXRINGS:
  1094. dbg("IXJCTL_MAXRINGS");
  1095. dev->maxrings = arg;
  1096. break;
  1097. case PHONE_SET_TONE_ON_TIME:
  1098. dbg("PHONE_SET_TONE_ON_TIME");
  1099. retval = -EPERM;
  1100. break;
  1101. case PHONE_SET_TONE_OFF_TIME:
  1102. dbg("PHONE_SET_TONE_OFF_TIME");
  1103. retval = -EPERM;
  1104. break;
  1105. case PHONE_GET_TONE_ON_TIME:
  1106. dbg("PHONE_GET_TONE_ON_TIME");
  1107. retval = -EPERM;
  1108. break;
  1109. case PHONE_GET_TONE_OFF_TIME:
  1110. dbg("PHONE_GET_TONE_OFF_TIME");
  1111. retval = -EPERM;
  1112. break;
  1113. case PHONE_PLAY_TONE:
  1114. dbg("PHONE_PLAY_TONE");
  1115. retval = -EPERM;
  1116. break;
  1117. case PHONE_GET_TONE_STATE:
  1118. dbg("PHONE_GET_TONE_STATE");
  1119. retval = dev->tonestate;
  1120. break;
  1121. case PHONE_DTMF_READY:
  1122. dbg("PHONE_DTMF_READY, %d", dev->ex.bits.dtmf_ready);
  1123. retval = dev->ex.bits.dtmf_ready;
  1124. break;
  1125. case PHONE_GET_DTMF:
  1126. dbg("PHONE_GET_DTMF");
  1127. dbg("hookstate = %d, len = %d, out = %d, in = %d, retval = %d", 
  1128.     dev->hookstate, dev->dtmf_buffer_len, dev->dtmf_buffer_out,
  1129.     dev->dtmf_buffer_in, dev->dtmf_buffer[dev->dtmf_buffer_out]);
  1130. if (dev->hookstate) {
  1131. if (dev->dtmf_buffer_len > 0) {
  1132. retval = dev->dtmf_buffer[dev->dtmf_buffer_out];
  1133. dev->dtmf_buffer_out++;
  1134. dev->dtmf_buffer_len--;
  1135. if (dev->dtmf_buffer_out == VB_DTMF_BUFF_LENGTH)
  1136. dev->dtmf_buffer_out = 0;
  1137. if (dev->dtmf_buffer_len == 0) {
  1138. dev->ex.bits.dtmf_ready = 0;
  1139. dev->dtmf_buffer_out = 0;
  1140. dev->dtmf_buffer_in = 0;
  1141. }
  1142. }
  1143. }
  1144. break;
  1145. case PHONE_GET_DTMF_ASCII:
  1146. dbg("PHONE_GET_DTMF_ASCII");
  1147. if (dev->hookstate) {
  1148. if (dev->dtmf_buffer_len > 0) {
  1149. switch (dev->dtmf_buffer[dev->dtmf_buffer_out]) {
  1150. case 10:
  1151. dbg("10");
  1152. retval = 42; /* '*'; */
  1153. break;
  1154. case 11:
  1155. dbg("11");
  1156. retval = 48; /*'0'; */
  1157. break;
  1158. case 12:
  1159. dbg("12");
  1160. retval = 35; /*'#'; */
  1161. break;
  1162. case 28:
  1163. dbg("28");
  1164. retval = 65; /*'A'; */
  1165. break;
  1166. case 29:
  1167. dbg("29");
  1168. retval = 66; /*'B'; */
  1169. break;
  1170. case 30:
  1171. dbg("30");
  1172. retval = 67; /*'C'; */
  1173. break;
  1174. case 31:
  1175. dbg("31");
  1176. retval = 68; /*'D'; */
  1177. break;
  1178. default:
  1179. dbg("default");
  1180. retval = 48 + dev->dtmf_buffer[dev->dtmf_buffer_out];
  1181. break;
  1182. }
  1183. dev->dtmf_buffer_out++;
  1184. dev->dtmf_buffer_len--;
  1185. if (dev->dtmf_buffer_out == VB_DTMF_BUFF_LENGTH)
  1186. dev->dtmf_buffer_out = 0;
  1187. if (dev->dtmf_buffer_len == 0) {
  1188. dev->ex.bits.dtmf_ready = 0;
  1189. dev->dtmf_buffer_out = 0;
  1190. dev->dtmf_buffer_in = 0;
  1191. }
  1192. }
  1193. }
  1194. break;
  1195. case PHONE_DTMF_OOB:
  1196. dbg("PHONE_DTMF_OOB");
  1197. dev->flags.dtmf_oob = arg;
  1198. break;
  1199. case PHONE_DIALTONE:
  1200. dbg("PHONE_DIALTONE");
  1201. #if 0
  1202. blaster_dialtone(dev);
  1203. #endif
  1204. break;
  1205. case PHONE_BUSY:
  1206. dbg("PHONE_BUSY");
  1207. #if 0
  1208. blaster_busytone(dev);
  1209. #endif
  1210. break;
  1211. case PHONE_RINGBACK:
  1212. dbg("PHONE_RINGBACK");
  1213. #if 0
  1214. blaster_ringback(dev);
  1215. #endif
  1216. break;
  1217. case PHONE_WINK:
  1218. dbg("PHONE_WINK");
  1219. retval = -EPERM;
  1220. break;
  1221. case PHONE_CPT_STOP:
  1222. dbg("PHONE_CPT_STOP");
  1223. #if 0
  1224. blaster_cpt_stop(dev);
  1225. retval = -EPERM;
  1226. #endif
  1227. retval = 0;
  1228. break;
  1229.         case PHONE_QUERY_CODEC:
  1230.         {
  1231.                 struct phone_codec_data pd;
  1232.                 int val;
  1233.                 int proto_size[] = {
  1234.                         -1,
  1235.                         12, 10, 16, 9, 8, 48, 5,
  1236.                         40, 40, 80, 40, 40, 6
  1237.                 };
  1238. dbg("PHONE_QUERY_CODEC");
  1239.                 if (copy_from_user(&pd, (void *)arg, sizeof(pd))) {
  1240.                         retval = -EFAULT;
  1241. break;
  1242. }
  1243. #if defined(ENABLE_G723_63)
  1244.                 if (pd.type <1 || pd.type>2) {
  1245.                         retval = -EPROTONOSUPPORT;
  1246. break;
  1247. }
  1248. #else
  1249. if (pd.type != 2) {
  1250. retval = -EPROTONOSUPPORT;
  1251. break;
  1252. }
  1253. #endif
  1254. val=proto_size[pd.type];
  1255.                 pd.buf_min=pd.buf_max=pd.buf_opt=val;
  1256. dbg("type = 0x%02x", pd.type);
  1257.                 if (copy_to_user((void *)arg, &pd, sizeof(pd)))
  1258.                         retval = -EFAULT;
  1259. retval = 0;
  1260.          break;
  1261.         }
  1262. case IXJCTL_DSP_IDLE:
  1263. dbg("IXJCTL_DSP_IDLE");
  1264. retval = 0;
  1265. break;
  1266. case IXJCTL_MIXER:
  1267. dbg("IXJCTL_MIXER");
  1268. retval = -EPERM;
  1269. break;
  1270. case IXJCTL_DAA_COEFF_SET:
  1271. dbg("IXJCTL_DAA_COEFF_SET");
  1272. switch (arg) {
  1273. case DAA_US:
  1274. dbg("DAA_US");
  1275. dev->daa_country = DAA_US;
  1276. retval = 1;
  1277. break;
  1278. case DAA_UK:
  1279. dbg("DAA_UK");
  1280. retval = 0;
  1281. break;
  1282. case DAA_FRANCE:
  1283. dbg("DAA_FRANCE");
  1284. retval = 0;
  1285. break;
  1286. case DAA_GERMANY:
  1287. dbg("DAA_GERMANY");
  1288. retval = 0;
  1289. break;
  1290. case DAA_AUSTRALIA:
  1291. dbg("DAA_AUSTRALIA");
  1292. retval = 0;
  1293. break;
  1294. case DAA_JAPAN:
  1295. dbg("DAA_JAPAN");
  1296. retval = 0;
  1297. break;
  1298. default:
  1299. retval = 0;
  1300. break;
  1301. }
  1302. break;
  1303. case IXJCTL_DAA_AGAIN:
  1304. dbg("IXJCTL_DAA_AGAIN");
  1305. retval = -EPERM;
  1306. break;
  1307. case IXJCTL_PSTN_LINETEST:
  1308. dbg("IXJCTL_PSTN_LINETEST");
  1309. retval = -EPERM;
  1310. break;
  1311. case IXJCTL_VMWI:
  1312. dbg("IXJCTL_VMWI");
  1313. retval = -EPERM;
  1314. break;
  1315. case IXJCTL_CID:
  1316. dbg("IXJCTL_CID");
  1317. if (copy_to_user((char *) arg, &dev->cid, sizeof(PHONE_CID))) 
  1318. retval = -EFAULT;
  1319. dev->ex.bits.caller_id = 0;
  1320. retval = -EPERM;
  1321. break;
  1322. case IXJCTL_WINK_DURATION:
  1323. dbg("IXJCTL_WINK_DURATION");
  1324. dev->winktime = arg;
  1325. retval = -EPERM;
  1326. break;
  1327. case IXJCTL_PORT:
  1328. dbg("IXJCTL_PORT");
  1329. /* VOIP Blaster have only one port to be used (Telephone) */
  1330. if ((arg == PORT_POTS) || (arg == PORT_HANDSET)) {
  1331. dev->port = PORT_POTS;
  1332. retval = 0;
  1333. } else if (arg == PORT_QUERY) {
  1334. retval = dev->port;
  1335. } else {
  1336. retval = -EPERM;
  1337. }
  1338. break;
  1339. case IXJCTL_POTS_PSTN:
  1340. dbg("IXJCTL_POTS_PSTN");
  1341. #if 0
  1342. retval = voipblaster_set_pots(dev, arg);
  1343. #endif
  1344. break;
  1345. case PHONE_CAPABILITIES:
  1346. dbg("PHONE_CAPABILITIES");
  1347. add_caps(dev);
  1348. retval = dev->caps;
  1349. break;
  1350. case PHONE_CAPABILITIES_LIST:
  1351. dbg("PHONE_CAPABILITIES_LIST");
  1352. add_caps(dev);
  1353. if (copy_to_user((char *) arg, dev->caplist, 
  1354.  sizeof(struct phone_capability) * dev->caps)) 
  1355. retval = -EFAULT;
  1356. retval = 0;
  1357. break;
  1358. case PHONE_CAPABILITIES_CHECK:
  1359. dbg("PHONE_CAPABILITIES_CHECK");
  1360. {
  1361. struct phone_capability cap;
  1362. if (copy_from_user(&cap, (char *) arg, sizeof(cap))) 
  1363. retval = -EFAULT;
  1364. else {
  1365. add_caps(dev);
  1366. retval = capabilities_check(dev, &cap);
  1367. }
  1368. }
  1369. break;
  1370. case PHONE_PSTN_SET_STATE:
  1371. dbg("PHONE_PSTN_SET_STATE");
  1372. #if 0
  1373. daa_set_mode(dev, arg);
  1374. #endif
  1375. retval = 0;
  1376. break;
  1377. case PHONE_PSTN_GET_STATE:
  1378. dbg("PHONE_PSTN_GET_STATE");
  1379. #if 0
  1380. retval = dev->daa_mode;
  1381. #endif
  1382. dev->ex.bits.pstn_ring = 0;
  1383. retval = 0;
  1384. break;
  1385. case IXJCTL_SET_FILTER:
  1386. dbg("IXJCTL_SET_FILTER");
  1387. retval = -EPERM;
  1388. break;
  1389. case IXJCTL_SET_FILTER_RAW:
  1390. dbg("IXJCTL_SET_FILTER_RAW");
  1391. retval = -EPERM;
  1392. break;
  1393. case IXJCTL_GET_FILTER_HIST:
  1394. dbg("IXJCTL_GET_FILTER_HIST");
  1395. retval = -EINVAL;
  1396. break;
  1397. case IXJCTL_INIT_TONE:
  1398. dbg("IXJCTL_INIT_TONE");
  1399. retval = -EPERM;
  1400. break;
  1401. case IXJCTL_TONE_CADENCE:
  1402. dbg("IXJCTL_TONE_CADENCE");
  1403. retval = -EPERM;
  1404. break;
  1405. case IXJCTL_FILTER_CADENCE:
  1406. dbg("IXJCTL_FILTER_CADENCE");
  1407. retval = -EPERM;
  1408. break;
  1409. case IXJCTL_SIGCTL:
  1410. dbg("IXJCTL_SIGCTL");
  1411. if (copy_from_user(&dev->sigdef, (char *)arg, sizeof(IXJ_SIGDEF)))
  1412. retval = -EFAULT;
  1413. dbg("sigdef.event = %d, signal = %d", dev->sigdef.event, dev->sigdef.signal);
  1414. dev->signals[dev->sigdef.event] = dev->sigdef.signal;
  1415. if(dev->sigdef.event < 33) {
  1416. raise = 1;
  1417. for(mant = 0; mant < dev->sigdef.event; mant++){
  1418. raise *= 2;
  1419. }
  1420. if(dev->sigdef.signal)
  1421. dev->ex_sig.bytes |= raise; 
  1422. else
  1423. dev->ex_sig.bytes &= (raise^0xffff); 
  1424. }
  1425. retval = 0;;
  1426. break;
  1427. case IXJCTL_INTERCOM_STOP:
  1428. dbg("IXJCTL_INTERCOM_STOP");
  1429. #if 0
  1430. if(arg < 0 || arg >= IXJMAX)
  1431. return -EINVAL;
  1432. dev->intercom = -1;
  1433. blaster_record_stop(dev);
  1434. blaster_play_stop(dev);
  1435. idle(dev);
  1436. get_ixj(arg)->intercom = -1;
  1437. blaster_record_stop(get_ixj(arg));
  1438. blaster_play_stop(get_ixj(arg));
  1439. idle(get_ixj(arg));
  1440. #endif
  1441. break;
  1442. case IXJCTL_INTERCOM_START:
  1443. dbg("IXJCTL_INTERCOM_START");
  1444. #if 0
  1445. if(arg < 0 || arg >= IXJMAX)
  1446. return -EINVAL;
  1447. dev->intercom = arg;
  1448. blaster_record_start(dev);
  1449. blaster_play_start(dev);
  1450. get_ixj(arg)->intercom = board;
  1451. blaster_play_start(get_ixj(arg));
  1452. blaster_record_start(get_ixj(arg));
  1453. #endif
  1454. break;
  1455. }
  1456. dbg("phone%d ioctl end, cmd: 0x%x, arg: 0x%lx, retval: 0x%.8x", 
  1457.     dev->minor, cmd, arg, retval);
  1458. /* unlock the device */
  1459. up (&dev->sem);
  1460. /* return that we did not understand this ioctl call */
  1461. return retval;
  1462. }
  1463. static inline void voipblaster_delete (struct usb_voipblaster *dev)
  1464. {
  1465. int status;
  1466. dbg("deleting USB device %d", dev->udev->devnum);
  1467.         voipblaster_table[dev->board] = NULL;
  1468. /* Unlinking can be performed even if URB is not active */
  1469. if ((status = usb_unlink_urb(dev->cmd_urb)))
  1470. dbg("trouble unlinking Command URB on close: %d", status);
  1471. if ((status = usb_unlink_urb(dev->event_urb)))
  1472. dbg("trouble unlinking Event URB on close: %d", status);
  1473. /* Unlinking can be performed even if URB is not active */
  1474. status = usb_unlink_urb(dev->write_urb);
  1475. if (status > 0)
  1476. dbg("trouble unlinking write URB on close; status = %d", status);
  1477. /* Unlinking can be performed even if URB is not active */
  1478. status = usb_unlink_urb(dev->read_urb);
  1479. if (status != 0)
  1480. dbg("trouble unlinking read URB on close; status = %d", status);
  1481. if (dev->cq.buffer != NULL) {
  1482. dbg("freeing cq buffer");
  1483. kfree (dev->cq.buffer);
  1484. }
  1485. if (dev->rq.buffer != NULL) {
  1486. dbg("freeing rq buffer");
  1487. kfree (dev->rq.buffer);
  1488. }
  1489. if (dev->wq.buffer != NULL) {
  1490. dbg("freeing wq buffer");
  1491. kfree (dev->wq.buffer);
  1492. }
  1493. if (dev->eq.buffer != NULL) {
  1494. dbg("freeing eq buffer");
  1495. kfree (dev->eq.buffer);
  1496. }
  1497. if (dev->event_urb != NULL) {
  1498. dbg("freeing event_urb");
  1499. usb_free_urb(dev->event_urb);
  1500. }
  1501. if (dev->cmd_urb != NULL) {
  1502. dbg("freeing cmd_urb");
  1503. usb_free_urb(dev->cmd_urb);
  1504. }
  1505. if (dev->read_urb != NULL) {
  1506. dbg("freeing read_urb");
  1507. usb_free_urb(dev->read_urb);
  1508. }
  1509. if (dev->write_urb != NULL) {
  1510. dbg("freeing write_urb");
  1511. usb_free_urb(dev->write_urb);
  1512. }
  1513. kfree (dev);
  1514. }
  1515. static inline void voipblaster_flush (struct usb_voipblaster *dev)
  1516. {
  1517. dbg("flushing USB device %d", dev->udev->devnum);
  1518. dev->dtmf_buffer_in = dev->dtmf_buffer_out = dev->dtmf_buffer_len = 0;
  1519. dev->ex.bits.dtmf_ready = 0;
  1520. dev->event_buffer_in = dev->event_buffer_out = dev->event_buffer_len = 0;
  1521. dev->read_buffer_in = 0;
  1522. }
  1523. static int voipblaster_release(struct inode *inode, struct file *file)
  1524. {
  1525. struct usb_voipblaster *dev;
  1526. int retval = 0;
  1527. dev = (struct usb_voipblaster *)file->private_data;
  1528. if (dev == NULL) {
  1529. dbg ("object is NULL");
  1530. return -ENODEV;
  1531. }
  1532. dbg("VOIP blaster device %d, minor %d,  (USB dev %d) closed", dev->board, 
  1533.     dev->minor, dev->udev->devnum);
  1534. /* lock our minor table */
  1535. down (&voipblaster_table_mutex);
  1536. /* lock our device */
  1537. down (&dev->sem);
  1538. if (dev->open_count <= 0) {
  1539. dbg ("minordevice not opened");
  1540. retval = -ENODEV;
  1541. goto exit_not_opened;
  1542. }
  1543. #if 0
  1544. voipblaster_fasync(-1, file, 0);
  1545. #endif
  1546. if (dev->udev == NULL) {
  1547. /* the device was unplugged before the file was released */
  1548. up (&dev->sem);
  1549. voipblaster_delete(dev);
  1550. // MOD_DEC_USE_COUNT;
  1551. up (&voipblaster_table_mutex);
  1552. return 0;
  1553. }
  1554. /* decrement our usage count for the device */
  1555. --dev->open_count;
  1556. // MOD_DEC_USE_COUNT;
  1557. dbg("VoIP Blaster closed");
  1558. exit_not_opened:
  1559. up (&dev->sem);
  1560. up (&voipblaster_table_mutex);
  1561. return retval;
  1562. }
  1563. int voipblaster_open(struct phone_device *phone, struct file *file)
  1564. {
  1565. struct usb_voipblaster *dev;
  1566. int retval = 0;
  1567. /* increment our usage count for the module */
  1568. // MOD_INC_USE_COUNT;
  1569. /* lock our minor table and get our local data for this minor */
  1570. down (&voipblaster_table_mutex);
  1571. dev = voipblaster_table[phone->board];
  1572. if (dev == NULL) {
  1573. err("No device passed found!");
  1574. up (&voipblaster_table_mutex);
  1575. // MOD_DEC_USE_COUNT;
  1576. return -ENODEV;
  1577. }
  1578. dbg("VOIP Blaster device %d (USB device %d) open...", phone->board, dev->udev->devnum);
  1579. /* unlock the minor table */
  1580. up (&voipblaster_table_mutex);
  1581. /* lock this device */
  1582. down (&dev->sem);
  1583. /* increment our usage count for the driver */
  1584. ++dev->open_count;
  1585. /* save our object in the file's private structure */
  1586. file->private_data = dev;
  1587. voipblaster_flush(dev);
  1588. dbg("dtmf = %d", dev->ex.bits.dtmf_ready);
  1589. #if 0
  1590. /* Send off an interupt urb to retrieve voice packets from the hardware */
  1591. dbg("Starting read URB");
  1592. if (usb_submit_urb(&dev->read_urb))
  1593. return -EIO;
  1594. #endif
  1595. /* unlock this device */
  1596. up (&dev->sem);
  1597. return retval;
  1598. }
  1599. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
  1600. static void *voipblaster_probe(struct usb_device *udev, unsigned int ifnum
  1601.        ,const struct usb_device_id *id)
  1602. #else
  1603. static void *voipblaster_probe(struct usb_device *udev, unsigned int ifnum)
  1604. #endif
  1605. {
  1606. struct usb_voipblaster *dev;
  1607. int board;
  1608. int i;
  1609. int status;
  1610. dbg(__FUNCTION__);
  1611. /* allocate memory for our device state and intialize it */
  1612. dev = kmalloc (sizeof(struct usb_voipblaster), GFP_KERNEL);
  1613. if (dev == NULL) {
  1614. err ("Out of memory");
  1615. goto error;
  1616. }
  1617. down (&voipblaster_table_mutex);
  1618. for (board = 0; board < VOIP_MAX; ++board) {
  1619. if (voipblaster_table[board] == NULL)
  1620. break;
  1621. }
  1622. if (board >= VOIP_MAX) {
  1623. info ("Too many devices plugged in, can not handle this device.");
  1624. goto error;
  1625. }
  1626. dbg("allocated board %d", board);
  1627. voipblaster_table[board] = dev;
  1628. up (&voipblaster_table_mutex);
  1629. memset(dev, 0, sizeof(struct usb_voipblaster));
  1630. spin_lock_init(&dev->io_lock);
  1631. init_MUTEX (&dev->sem);
  1632. if (udev != NULL) {
  1633. dbg("udev->devnum = %d", udev->devnum);
  1634. } else {
  1635. dbg("udev is null!");
  1636. }
  1637. dev->udev = udev;
  1638. dev->interface = &udev->actconfig->interface[ifnum];
  1639. dev->board = board;
  1640. memcpy(dev->dsp_serial, "0", 1);
  1641. dbg("USB VoIP Blaster device %d", dev->udev->devnum);
  1642. dev->wq.buffer = kmalloc(256, GFP_KERNEL);
  1643. if (dev->wq.buffer == NULL) {
  1644. err("no memory for wq.buffer");
  1645. }
  1646. dev->wq.size = 256;
  1647. dev->rq.buffer = kmalloc(80, GFP_KERNEL);
  1648. if (dev->rq.buffer == NULL) {
  1649. err("no memory for rq.buffer");
  1650. }
  1651. dev->rq.size = 80;
  1652. init_waitqueue_head(&dev->cmd_q);
  1653. init_waitqueue_head(&dev->write_q);
  1654. init_waitqueue_head(&dev->read_q);
  1655. init_waitqueue_head(&dev->poll_q);
  1656. init_waitqueue_head(&dev->event_q);
  1657. dev->event_urb = usb_alloc_urb(0);
  1658. dev->cmd_urb = usb_alloc_urb(0);
  1659. dev->write_urb = usb_alloc_urb(0);
  1660. dev->read_urb = usb_alloc_urb(0);
  1661. /* Prepare the event urb... */
  1662. FILL_INT_URB(dev->event_urb, udev,
  1663. usb_rcvintpipe( udev, 0x81),
  1664. dev->event_data, 1,
  1665. voipblaster_event_irq, dev,
  1666. 30);
  1667. /* Prepare the read urb... */
  1668. FILL_BULK_URB(dev->read_urb, dev->udev,
  1669. usb_rcvbulkpipe(dev->udev,0x82),
  1670. dev->read_buffer_urb, 20,
  1671. voipblaster_read_irq, dev);
  1672. /* Send off an interupt urb to retrieve command events from the hardware */
  1673. dbg("Starting Event URB");
  1674. if ((status = usb_submit_urb(dev->event_urb)) != 0) {
  1675. dbg("error with event_urb, status = %d, %d", dev->event_urb->status, status);
  1676. }
  1677. dbg("Starting Read URB");
  1678. if (usb_submit_urb(dev->read_urb) != 0) {
  1679. dbg("error with read_urb, status = %d", dev->read_urb->status);
  1680. }
  1681. voipblaster_cmd(dev, VB_CMD_SETUP_MODE);
  1682. voipblaster_flush(dev);
  1683. voipblaster_snd_voice(dev, init_1, sizeof(init_1));
  1684. voipblaster_flush(dev);
  1685. voipblaster_snd_voice(dev, init_2, sizeof(init_2));
  1686. voipblaster_flush(dev);
  1687. voipblaster_event_poll(dev, 500);
  1688. dbg ("init done.");
  1689. dev->ringing = 1;
  1690. for (i = 0; i < 2; i++) {
  1691. int j = 10;
  1692. voipblaster_cmd(dev, VB_CMD_VOL_3);
  1693. voipblaster_cmd(dev, VB_CMD_RING_OFF);
  1694. voipblaster_cmd(dev, VB_CMD_PHONE_ON);
  1695. while (1) {
  1696. j--;
  1697. dbg("polling; j = %d, dev->ringing = %d", j, dev->ringing);
  1698. voipblaster_event_poll(dev, 100);
  1699. if (!dev->ringing) {
  1700. break;
  1701. }
  1702. if (j == 0) {
  1703. dbg ("exiting while loop..");
  1704. break;
  1705. }
  1706. }
  1707. if (!dev->ringing) {
  1708. break;
  1709. }
  1710. }
  1711. voipblaster_cmd(dev, VB_CMD_VOL_3);
  1712. voipblaster_cmd(dev, VB_CMD_MUTE_OFF);
  1713. dev->hookstate = 0;
  1714. dev->cardtype = CREATIVE_VOIPBLASTER;
  1715. dev->aec_level = AEC_OFF;
  1716. dev->play_codec = G723_53;
  1717. dev->rec_codec = G723_53;
  1718. dev->port = PORT_POTS;
  1719. snprintf(dev->serialnum, 18, "%02x:%02x:%02x:%02x:%02x:%02x",
  1720.  dev->dsp_serial[0] & 0xff, dev->dsp_serial[1] & 0xff,
  1721.  dev->dsp_serial[2] & 0xff, dev->dsp_serial[3] & 0xff,
  1722.  dev->dsp_serial[4] & 0xff, dev->dsp_serial[5] & 0xff);
  1723.  
  1724. snprintf(dev->revision, 30, "%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x",
  1725.  dev->dsp_version[0] & 0xff, dev->dsp_version[1] & 0xff,
  1726.  dev->dsp_version[2] & 0xff, dev->dsp_version[3] & 0xff,
  1727.  dev->dsp_version[4] & 0xff, dev->dsp_version[5] & 0xff,
  1728.  dev->dsp_version[6] & 0xff, dev->dsp_version[7] & 0xff,
  1729.  dev->dsp_version[8] & 0xff, dev->dsp_version[9] & 0xff);
  1730.  
  1731. dbg("serial: %s", dev->serialnum);
  1732. dbg("revision: %s", dev->revision);
  1733. voipblaster_register_device(dev);
  1734. dev->phone.f_op = &voipblaster_fops;
  1735. dev->phone.open = voipblaster_open;
  1736. dev->phone.board = board;
  1737. phone_register_device(&dev->phone, PHONE_UNIT_ANY);
  1738. dbg("USB VoIP Blaster registered with Linux Telephony sub system");
  1739. goto exit;
  1740. error:
  1741. voipblaster_delete (dev);
  1742. dev = NULL;
  1743. exit:
  1744. return dev;
  1745. }
  1746. static void voipblaster_disconnect(struct usb_device *udev, void *ptr)
  1747. {
  1748. struct usb_voipblaster *dev = (struct usb_voipblaster *) ptr;
  1749. phone_unregister_device(&dev->phone);
  1750. dbg("USB VoIP Blaster deregistered with Linux Telephony sub system");
  1751. voipblaster_deregister_device(dev);
  1752. voipblaster_delete(dev);
  1753. dbg("USB VoIP Blaster disconnected");
  1754. }
  1755. static struct usb_driver voipblaster_driver = {
  1756. name: "voipblaster",
  1757. probe: voipblaster_probe,
  1758. disconnect: voipblaster_disconnect,
  1759. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
  1760. id_table: voipblaster_ids,
  1761. #endif
  1762. fops: &voipblaster_fops,
  1763. };
  1764. int __init voipblaster_init(void)
  1765. {
  1766.         int result;
  1767. #if LINUX_VERSION_CODE > KERNEL_VERSION(2,3,0)
  1768. voipblaster_proc_init();
  1769. snprintf(VOIPversion, 32, "%d.%d.%d", VOIP_VER_MAJOR, VOIP_VER_MINOR, VOIP_BLD_VER);
  1770. #else 
  1771. /* 2.2.19 does not like create_proc_read_entry and snprintf */
  1772. sprintf(VOIPversion, "%d.%d.%d", VOIP_VER_MAJOR, VOIP_VER_MINOR, VOIP_BLD_VER);
  1773. #endif
  1774. result = usb_register(&voipblaster_driver);
  1775. if (result < 0) {
  1776. err("usb_register failed for the "__FILE__" driver. Error number %d",
  1777.     result);
  1778. return -1;
  1779. }
  1780. info(DRIVER_DESC " v%s", VOIPversion);
  1781. info("using %s", ixjuser_h_rcsid);
  1782. return 0;
  1783. }
  1784. void __exit voipblaster_exit(void)
  1785. {
  1786. voipblaster_proc_destroy();
  1787. usb_deregister(&voipblaster_driver);
  1788. }
  1789. module_init(voipblaster_init);
  1790. module_exit(voipblaster_exit);
  1791. MODULE_AUTHOR("Michael Bosland, <mike@ring.org>, Thomas Davis, <tadavis@veriomail.com>");
  1792. MODULE_DESCRIPTION("USB Driver for Creative Labs VoIP Blaster");
  1793. #ifdef MODULE_LICENSE
  1794.   MODULE_LICENSE("GPL");
  1795. #endif
  1796. /*
  1797.  * Local variables:
  1798.  *  c-indent-level: 8
  1799.  *  c-basic-offset: 8
  1800.  *  tab-width: 8
  1801.  * End:
  1802.  */