1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27#include <linux/slab.h>
28#include <linux/module.h>
29#include <linux/init.h>
30#include <linux/devfs_fs_kernel.h>
31#undef DEBUG
32#include <linux/usb.h>
33#include "auerchain.h"
34#include "auerbuf.h"
35#include "auerchar.h"
36#include "auerserv.h"
37#include "auermain.h"
38#include "auerisdn.h"
39
40
41
42#ifdef DEBUG
43#define dump( desc, adr, len) \
44do { \
45 unsigned int u; \
46 printk (KERN_DEBUG); \
47 printk (desc); \
48 for (u = 0; u < len; u++) \
49 printk (" %02X", adr[u] & 0xFF); \
50 printk ("\n"); \
51} while (0)
52#else
53#define dump( desc, adr, len)
54#endif
55
56
57
58#define DRIVER_VERSION "1.2.7"
59#define DRIVER_AUTHOR "Wolfgang Mües <wolfgang@iksw-muees.de>"
60#define DRIVER_DESC "Auerswald PBX/System Telephone usb driver"
61
62
63
64
65
66extern devfs_handle_t usb_devfs_handle;
67
68
69struct auerswald *auerdev_table[AUER_MAX_DEVICES];
70
71
72struct semaphore auerdev_table_mutex;
73
74
75
76static void auerswald_ctrlread_complete(struct urb *urb);
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107static int auerswald_status_retry(int status)
108{
109 switch (status) {
110 case 0:
111 case -ETIMEDOUT:
112 case -EOVERFLOW:
113 case -EFBIG:
114 case -EAGAIN:
115 case -EPROTO:
116 case -EILSEQ:
117 case -ENOSR:
118 case -EREMOTEIO:
119 return 1;
120 }
121 return 0;
122}
123
124
125
126void auerchar_ctrlwrite_complete(struct urb *urb)
127{
128 struct auerbuf *bp = (struct auerbuf *) urb->context;
129 struct auerswald *cp =
130 ((struct auerswald *) ((char *) (bp->list) -
131 (unsigned
132 long) (&((struct auerswald *) 0)->
133 bufctl)));
134 dbg("auerchar_ctrlwrite_complete called");
135
136
137 auerbuf_releasebuf(bp);
138
139 wake_up(&cp->bufferwait);
140}
141
142
143static void auerswald_ctrlread_wretcomplete(struct urb *urb)
144{
145 struct auerbuf *bp = (struct auerbuf *) urb->context;
146 struct auerswald *cp;
147 int ret;
148 dbg("auerswald_ctrlread_wretcomplete called");
149 dbg("complete with status: %d", urb->status);
150 cp = ((struct auerswald *) ((char *) (bp->list) -
151 (unsigned
152 long) (&((struct auerswald *) 0)->
153 bufctl)));
154
155
156 if (!auerswald_status_retry(urb->status) || !cp->usbdev) {
157
158 err("control dummy: transmission error %d, can not retry",
159 urb->status);
160 auerbuf_releasebuf(bp);
161
162 wake_up(&cp->bufferwait);
163 return;
164 }
165
166
167 bp->dr->bRequestType = AUT_RREQ;
168 bp->dr->bRequest = AUV_RBLOCK;
169 bp->dr->wLength = bp->dr->wValue;
170 bp->dr->wValue = cpu_to_le16(1);
171
172 FILL_CONTROL_URB(bp->urbp, cp->usbdev,
173 usb_rcvctrlpipe(cp->usbdev, 0),
174 (unsigned char *) bp->dr, bp->bufp,
175 le16_to_cpu(bp->dr->wLength),
176 (usb_complete_t) auerswald_ctrlread_complete, bp);
177
178
179 ret = auerchain_submit_urb_list(&cp->controlchain, bp->urbp, 1);
180 if (ret) {
181 dbg("auerswald_ctrlread_complete: nonzero result of auerchain_submit_urb_list %d", ret);
182 bp->urbp->status = ret;
183 auerswald_ctrlread_complete(bp->urbp);
184 }
185}
186
187
188static void auerswald_ctrlread_complete(struct urb *urb)
189{
190 unsigned int serviceid;
191 struct auerswald *cp;
192 struct auerscon *scp;
193 struct auerbuf *bp = (struct auerbuf *) urb->context;
194 int ret;
195 dbg("auerswald_ctrlread_complete called");
196
197 cp = ((struct auerswald *) ((char *) (bp->list) -
198 (unsigned
199 long) (&((struct auerswald *) 0)->
200 bufctl)));
201
202
203 if (urb->status) {
204 dbg("complete with non-zero status: %d", urb->status);
205
206 if (!auerswald_status_retry(urb->status)
207 || !cp->usbdev || (cp->version < AUV_RETRY)
208 || (bp->retries >= AU_RETRIES)) {
209
210 err("control read: transmission error %d, can not retry", urb->status);
211 auerbuf_releasebuf(bp);
212
213 wake_up(&cp->bufferwait);
214 return;
215 }
216 bp->retries++;
217 dbg("Retry count = %d", bp->retries);
218
219 bp->dr->bRequestType = AUT_WREQ;
220 bp->dr->bRequest = AUV_DUMMY;
221 bp->dr->wValue = bp->dr->wLength;
222
223 bp->dr->wLength = cpu_to_le16(32);
224 FILL_CONTROL_URB(bp->urbp, cp->usbdev,
225 usb_sndctrlpipe(cp->usbdev, 0),
226 (unsigned char *) bp->dr, bp->bufp, 32,
227 (usb_complete_t)
228 auerswald_ctrlread_wretcomplete, bp);
229
230
231 ret =
232 auerchain_submit_urb_list(&cp->controlchain, bp->urbp,
233 1);
234 if (ret) {
235 dbg("auerswald_ctrlread_complete: nonzero result of auerchain_submit_urb_list %d", ret);
236 bp->urbp->status = ret;
237 auerswald_ctrlread_wretcomplete(bp->urbp);
238 }
239 return;
240 }
241
242
243 bp->len = urb->actual_length;
244 serviceid = bp->bufp[0] & AUH_TYPEMASK;
245 dbg("Paket with serviceid %d and %d bytes received", serviceid,
246 bp->len);
247
248
249 scp = cp->services[serviceid];
250 if (scp) {
251
252 scp->dispatch(scp, bp);
253 }
254
255
256 auerbuf_releasebuf(bp);
257
258 wake_up(&cp->bufferwait);
259}
260
261
262
263
264
265
266
267static void auerswald_int_complete(struct urb *urb)
268{
269 unsigned int channelid;
270 unsigned int bytecount;
271 int ret;
272 struct auerbuf *bp = NULL;
273 struct auerswald *cp = (struct auerswald *) urb->context;
274
275 dbg("auerswald_int_complete called");
276
277
278 if (urb->status != 0) {
279 dbg("nonzero URB status = %d", urb->status);
280 return;
281 }
282
283
284 if (urb->actual_length < AU_IRQMINSIZE) {
285 dbg("invalid data length received: %d bytes",
286 urb->actual_length);
287 return;
288 }
289
290
291 if (cp->intbufp[0] != AU_IRQCMDID) {
292 dbg("invalid command received: %d", cp->intbufp[0]);
293 return;
294 }
295
296
297 if (cp->intbufp[1] != AU_BLOCKRDY) {
298 dbg("invalid command type received: %d", cp->intbufp[1]);
299 return;
300 }
301
302
303 channelid = cp->intbufp[2];
304 bytecount = le16_to_cpup(&cp->intbufp[3]);
305
306
307 if (channelid >= AUH_TYPESIZE) {
308 dbg("invalid channel id received: %d", channelid);
309 return;
310 }
311
312
313 if (bytecount > (cp->maxControlLength + AUH_SIZE)) {
314 dbg("invalid byte count received: %d", bytecount);
315 return;
316 }
317 dbg("Service Channel = %d", channelid);
318 dbg("Byte Count = %d", bytecount);
319
320
321 bp = auerbuf_getbuf(&cp->bufctl);
322
323 if (!bp) {
324 dbg("auerswald_int_complete: no data buffer available");
325
326
327
328
329
330
331 return;
332 }
333
334
335 bp->dr->bRequestType = AUT_RREQ;
336 bp->dr->bRequest = AUV_RBLOCK;
337 bp->dr->wValue = cpu_to_le16(0);
338 bp->dr->wIndex = cpu_to_le16(channelid | AUH_DIRECT | AUH_UNSPLIT);
339 bp->dr->wLength = cpu_to_le16(bytecount);
340 FILL_CONTROL_URB(bp->urbp, cp->usbdev,
341 usb_rcvctrlpipe(cp->usbdev, 0),
342 (unsigned char *) bp->dr, bp->bufp, bytecount,
343 (usb_complete_t) auerswald_ctrlread_complete, bp);
344
345
346 ret = auerchain_submit_urb(&cp->controlchain, bp->urbp);
347 if (ret) {
348 dbg("auerswald_int_complete: nonzero result of auerchain_submit_urb %d", ret);
349 bp->urbp->status = ret;
350 auerswald_ctrlread_complete(bp->urbp);
351
352 }
353}
354
355
356
357
358static void auerswald_int_free(struct auerswald *cp)
359{
360 if (cp->inturbp) {
361 usb_free_urb(cp->inturbp);
362 cp->inturbp = NULL;
363 }
364 kfree(cp->intbufp);
365}
366
367
368
369
370
371static int auerswald_int_open(struct auerswald *cp)
372{
373 int ret;
374 struct usb_endpoint_descriptor *ep;
375 int irqsize;
376 dbg("auerswald_int_open");
377
378 ep = usb_epnum_to_ep_desc(cp->usbdev, USB_DIR_IN | AU_IRQENDP);
379 if (!ep) {
380 ret = -EFAULT;
381 goto intoend;
382 }
383 irqsize = ep->wMaxPacketSize;
384 cp->irqsize = irqsize;
385
386
387 if (!cp->inturbp) {
388 cp->inturbp = usb_alloc_urb(0);
389 if (!cp->inturbp) {
390 ret = -ENOMEM;
391 goto intoend;
392 }
393 }
394 if (!cp->intbufp) {
395 cp->intbufp = (char *) kmalloc(irqsize, GFP_KERNEL);
396 if (!cp->intbufp) {
397 ret = -ENOMEM;
398 goto intoend;
399 }
400 }
401
402 FILL_INT_URB(cp->inturbp, cp->usbdev,
403 usb_rcvintpipe(cp->usbdev, AU_IRQENDP), cp->intbufp,
404 irqsize, auerswald_int_complete, cp, ep->bInterval);
405
406 cp->inturbp->status = 0;
407 ret = usb_submit_urb(cp->inturbp);
408
409 intoend:
410 if (ret < 0) {
411
412 dbg("auerswald_int_open: activation of int endpoint failed");
413
414
415 auerswald_int_free(cp);
416 }
417 return ret;
418}
419
420
421
422
423
424static int auerswald_int_release(struct auerswald *cp)
425{
426 int ret = 0;
427 dbg("auerswald_int_release");
428
429
430 if (cp->inturbp) {
431 ret = usb_unlink_urb(cp->inturbp);
432 if (ret)
433 dbg("nonzero int unlink result received: %d", ret);
434 }
435
436
437 auerswald_int_free(cp);
438
439 return ret;
440}
441
442
443
444
445
446void auerswald_delete(struct auerswald *cp)
447{
448 dbg("auerswald_delete");
449 if (cp == NULL)
450 return;
451
452
453 wake_up(&cp->bufferwait);
454
455
456 auerisdn_disconnect(cp);
457 auerswald_int_release(cp);
458 auerchain_free(&cp->controlchain);
459 auerbuf_free_buffers(&cp->bufctl);
460
461
462 kfree(cp);
463}
464
465
466
467
468
469
470int auerswald_addservice(struct auerswald *cp, struct auerscon *scp)
471{
472 int ret;
473
474
475 if (!cp->usbdev) {
476 dbg("usbdev == NULL");
477 return -EIO;
478 }
479
480
481 if (cp->services[scp->id]) {
482 dbg("service is busy");
483 return -EBUSY;
484 }
485
486
487 cp->services[scp->id] = scp;
488
489
490 ret = auerchain_control_msg(&cp->controlchain,
491 cp->usbdev,
492 usb_sndctrlpipe(cp->usbdev, 0),
493 AUV_CHANNELCTL,
494 AUT_WREQ,
495 0x01,
496 scp->id,
497 NULL,
498 0,
499 HZ * 2);
500 if (ret < 0) {
501 dbg("auerswald_addservice: auerchain_control_msg returned error code %d", ret);
502
503 cp->services[scp->id] = NULL;
504 return ret;
505 }
506
507 dbg("auerswald_addservice: channel open OK");
508 return 0;
509}
510
511
512
513
514void auerswald_removeservice(struct auerswald *cp, struct auerscon *scp)
515{
516 dbg("auerswald_removeservice called");
517
518
519 if (scp->id == AUH_UNASSIGNED)
520 return;
521
522
523 if (cp->usbdev && !cp->disconnecting) {
524
525 int ret = auerchain_control_msg(&cp->controlchain,
526 cp->usbdev,
527 usb_sndctrlpipe(cp->usbdev, 0),
528 AUV_CHANNELCTL,
529 AUT_WREQ,
530 0x00,
531 scp->id,
532 NULL,
533 0,
534 HZ * 2);
535 if (ret < 0) {
536 dbg("auerswald_removeservice: auerchain_control_msg returned error code %d", ret);
537 } else {
538 dbg("auerswald_removeservice: channel close OK");
539 }
540 }
541
542
543 cp->services[scp->id] = NULL;
544 scp->id = AUH_UNASSIGNED;
545}
546
547
548
549
550static struct file_operations auerswald_fops = {
551 owner:THIS_MODULE,
552 llseek:auerchar_llseek,
553 read:auerchar_read,
554 write:auerchar_write,
555 ioctl:auerchar_ioctl,
556 open:auerchar_open,
557 release:auerchar_release,
558};
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581static void *auerswald_probe(struct usb_device *usbdev, unsigned int ifnum,
582 const struct usb_device_id *id)
583{
584 struct auerswald *cp = NULL;
585 DECLARE_WAIT_QUEUE_HEAD(wqh);
586 unsigned int dtindex;
587 unsigned int u = 0;
588 char *pbuf;
589 int ret;
590
591 dbg("probe: vendor id 0x%x, device id 0x%x ifnum:%d",
592 usbdev->descriptor.idVendor, usbdev->descriptor.idProduct,
593 ifnum);
594
595
596 if (usbdev->descriptor.idVendor != ID_AUERSWALD)
597 return NULL;
598
599
600 if (ifnum != 0)
601 return NULL;
602
603
604 MOD_INC_USE_COUNT;
605
606
607 cp = kmalloc(sizeof(struct auerswald), GFP_KERNEL);
608 if (cp == NULL) {
609 err("out of memory");
610 goto pfail;
611 }
612
613
614 memset(cp, 0, sizeof(struct auerswald));
615 init_MUTEX(&cp->mutex);
616 cp->usbdev = usbdev;
617 auerchain_init(&cp->controlchain);
618 auerbuf_init(&cp->bufctl);
619 init_waitqueue_head(&cp->bufferwait);
620 auerisdn_init_dev(cp);
621
622
623 down(&auerdev_table_mutex);
624 for (dtindex = 0; dtindex < AUER_MAX_DEVICES; ++dtindex) {
625 if (auerdev_table[dtindex] == NULL)
626 break;
627 }
628 if (dtindex >= AUER_MAX_DEVICES) {
629 err("more than %d devices plugged in, can not handle this device", AUER_MAX_DEVICES);
630 up(&auerdev_table_mutex);
631 goto pfail;
632 }
633
634
635 sprintf(cp->name, AU_PREFIX "%d", dtindex);
636
637
638 cp->dtindex = dtindex;
639 auerdev_table[dtindex] = cp;
640 up(&auerdev_table_mutex);
641
642
643 cp->devfs = devfs_register(usb_devfs_handle, cp->name,
644 DEVFS_FL_DEFAULT, USB_MAJOR,
645 AUER_MINOR_BASE + dtindex,
646 S_IFCHR | S_IRUGO | S_IWUGO,
647 &auerswald_fops, NULL);
648
649
650 cp->version = cp->usbdev->descriptor.bcdDevice;
651 dbg("Version is %X", cp->version);
652
653
654 sleep_on_timeout(&wqh, HZ / 3);
655
656
657
658 ret =
659 usb_string(cp->usbdev, AUSI_DEVICE, cp->dev_desc,
660 AUSI_DLEN - 1);
661 if (ret >= 0) {
662 u += ret;
663
664 memcpy(&cp->dev_desc[u], ",Ser# ", 6);
665 u += 6;
666 ret =
667 usb_string(cp->usbdev, AUSI_SERIALNR, &cp->dev_desc[u],
668 AUSI_DLEN - u - 1);
669 if (ret >= 0) {
670 u += ret;
671
672 memcpy(&cp->dev_desc[u], ", ", 2);
673 u += 2;
674 ret =
675 usb_string(cp->usbdev, AUSI_MSN,
676 &cp->dev_desc[u],
677 AUSI_DLEN - u - 1);
678 if (ret >= 0) {
679 u += ret;
680 }
681 }
682 }
683 cp->dev_desc[u] = '\0';
684 info("device is a %s", cp->dev_desc);
685
686
687 pbuf = (char *) kmalloc(2, GFP_KERNEL);
688 if (!pbuf) {
689 err("out of memory");
690 goto pfail;
691 }
692 ret = usb_control_msg(cp->usbdev,
693 usb_rcvctrlpipe(cp->usbdev, 0),
694 AUV_GETINFO,
695 AUT_RREQ,
696 0,
697 AUDI_MBCTRANS,
698 pbuf,
699 2,
700 HZ * 2);
701 if (ret == 2) {
702 cp->maxControlLength = le16_to_cpup(pbuf);
703 kfree(pbuf);
704 dbg("setup: max. allowed control transfersize is %d bytes",
705 cp->maxControlLength);
706 } else {
707 kfree(pbuf);
708 err("setup: getting max. allowed control transfer length failed with error %d", ret);
709 goto pfail;
710 }
711
712 if (auerchain_setup(&cp->controlchain, AUCH_ELEMENTS)) {
713 err("out of memory");
714 goto pfail;
715 }
716
717
718 if (auerbuf_setup
719 (&cp->bufctl, AU_RBUFFERS * 2,
720 cp->maxControlLength + AUH_SIZE)) {
721 err("out of memory");
722 goto pfail;
723 }
724
725
726 if (auerswald_int_open(cp)) {
727 err("int endpoint failed");
728 goto pfail;
729 }
730
731
732 if (auerisdn_probe(cp)) {
733 err("hisax connect failed");
734 goto pfail;
735 }
736
737
738 return cp;
739
740
741 pfail:auerswald_delete(cp);
742 MOD_DEC_USE_COUNT;
743 return NULL;
744}
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759static void auerswald_disconnect(struct usb_device *usbdev,
760 void *driver_context)
761{
762 struct auerswald *cp = (struct auerswald *) driver_context;
763 unsigned int u;
764
765
766 cp->disconnecting = 1;
767 down(&cp->mutex);
768 info("device /dev/usb/%s now disconnecting", cp->name);
769
770
771
772 down(&auerdev_table_mutex);
773 auerdev_table[cp->dtindex] = NULL;
774 up(&auerdev_table_mutex);
775
776
777
778 devfs_unregister(cp->devfs);
779
780
781 auerisdn_disconnect(cp);
782
783
784 auerswald_int_release(cp);
785
786
787
788
789
790
791 auerchain_free(&cp->controlchain);
792
793 if (cp->open_count == 0) {
794 struct auerscon *scp;
795
796 up(&cp->mutex);
797
798
799
800 scp = cp->services[AUH_DCHANNEL];
801 if (scp)
802 scp->disconnect(scp);
803 auerswald_delete(cp);
804 } else {
805
806
807
808 cp->usbdev = NULL;
809 up(&cp->mutex);
810
811 wake_up(&cp->bufferwait);
812
813 for (u = 0; u < AUH_TYPESIZE; u++) {
814 struct auerscon *scp = cp->services[u];
815 if (scp)
816 scp->disconnect(scp);
817 }
818 }
819
820
821 MOD_DEC_USE_COUNT;
822}
823
824
825
826
827
828static struct usb_device_id auerswald_ids[] = {
829 {USB_DEVICE(ID_AUERSWALD, 0x00C0)},
830 {USB_DEVICE(ID_AUERSWALD, 0x00DB)},
831 {USB_DEVICE(ID_AUERSWALD, 0x00DC)},
832 {USB_DEVICE(ID_AUERSWALD, 0x00DD)},
833 {USB_DEVICE(ID_AUERSWALD, 0x00F1)},
834 {USB_DEVICE(ID_AUERSWALD, 0x00F2)},
835 {}
836};
837
838
839MODULE_DEVICE_TABLE(usb, auerswald_ids);
840
841
842static struct usb_driver auerswald_driver = {
843 name:"auerswald",
844 probe:auerswald_probe,
845 disconnect:auerswald_disconnect,
846 fops:&auerswald_fops,
847 minor:AUER_MINOR_BASE,
848 id_table:auerswald_ids,
849};
850
851
852
853
854
855
856
857
858static int __init auerswald_init(void)
859{
860 int result;
861 dbg("init");
862
863
864 memset(&auerdev_table, 0, sizeof(auerdev_table));
865 init_MUTEX(&auerdev_table_mutex);
866 auerisdn_init();
867
868
869
870 result = usb_register(&auerswald_driver);
871 if (result < 0) {
872 err("driver could not be registered");
873 return -1;
874 }
875 return 0;
876}
877
878
879
880
881static void __exit auerswald_cleanup(void)
882{
883 dbg("cleanup");
884 auerisdn_cleanup();
885 usb_deregister(&auerswald_driver);
886}
887
888
889
890
891MODULE_AUTHOR(DRIVER_AUTHOR);
892MODULE_DESCRIPTION(DRIVER_DESC);
893MODULE_LICENSE("GPL");
894
895module_init(auerswald_init);
896module_exit(auerswald_cleanup);
897
898
899