1 /* $Id: kcapi.c,v 1.1.1.1 2005/04/11 02:50:23 jack Exp $
3 * Kernel CAPI 2.0 Module
5 * Copyright 1999 by Carsten Paeth <calle@calle.de>
7 * This software may be used and distributed according to the terms
8 * of the GNU General Public License, incorporated herein by reference.
12 #define CONFIG_AVMB1_COMPAT
14 #include <linux/config.h>
15 #include <linux/module.h>
16 #include <linux/kernel.h>
18 #include <linux/interrupt.h>
19 #include <linux/ioport.h>
20 #include <asm/segment.h>
21 #include <linux/proc_fs.h>
22 #include <linux/skbuff.h>
23 #include <linux/tqueue.h>
24 #include <linux/capi.h>
25 #include <linux/kernelcapi.h>
26 #include <linux/locks.h>
27 #include <linux/init.h>
28 #include <asm/uaccess.h>
32 #ifdef CONFIG_AVMB1_COMPAT
33 #include <linux/b1lli.h>
36 static char *revision = "$Revision: 1.1.1.1 $";
38 /* ------------------------------------------------------------- */
41 #define CARD_DETECTED 1
42 #define CARD_LOADING 2
43 #define CARD_RUNNING 3
45 /* ------------------------------------------------------------- */
47 static int showcapimsgs = 0;
49 MODULE_DESCRIPTION("CAPI4Linux: kernel CAPI layer");
50 MODULE_AUTHOR("Carsten Paeth");
51 MODULE_LICENSE("GPL");
52 MODULE_PARM(showcapimsgs, "i");
54 /* ------------------------------------------------------------- */
57 struct msgidqueue *next;
62 struct capi_ncci *next;
68 struct msgidqueue *msgidqueue;
69 struct msgidqueue *msgidlast;
70 struct msgidqueue *msgidfree;
71 struct msgidqueue msgidpool[CAPI_MAXDATAWINDOW];
76 capi_register_params rparam;
79 void (*signal) (__u16 applid, void *param);
80 struct sk_buff_head recv_queue;
82 struct capi_ncci *nccilist;
84 unsigned long nrecvctlpkt;
85 unsigned long nrecvdatapkt;
86 unsigned long nsentctlpkt;
87 unsigned long nsentdatapkt;
90 struct capi_notifier {
91 struct capi_notifier *next;
98 /* ------------------------------------------------------------- */
100 static struct capi_version driver_version = {2, 0, 1, 1<<4};
101 static char driver_serial[CAPI_SERIAL_LEN] = "0004711";
102 static char capi_manufakturer[64] = "AVM Berlin";
104 #define APPL(a) (&applications[(a)-1])
105 #define VALID_APPLID(a) ((a) && (a) <= CAPI_MAXAPPL && APPL(a)->applid == a)
106 #define APPL_IS_FREE(a) (APPL(a)->applid == 0)
107 #define APPL_MARK_FREE(a) do{ APPL(a)->applid=0; MOD_DEC_USE_COUNT; }while(0)
108 #define APPL_MARK_USED(a) do{ APPL(a)->applid=(a); MOD_INC_USE_COUNT; }while(0)
110 #define NCCI2CTRL(ncci) (((ncci) >> 24) & 0x7f)
112 #define VALID_CARD(c) ((c) > 0 && (c) <= CAPI_MAXCONTR)
113 #define CARD(c) (&cards[(c)-1])
114 #define CARDNR(cp) ((((cp)-cards)+1) & 0xff)
116 static struct capi_appl applications[CAPI_MAXAPPL];
117 static struct capi_ctr cards[CAPI_MAXCONTR];
118 static int ncards = 0;
119 static struct sk_buff_head recv_queue;
120 static struct capi_interface_user *capi_users = 0;
121 static spinlock_t capi_users_lock = SPIN_LOCK_UNLOCKED;
122 static struct capi_driver *drivers;
123 static spinlock_t drivers_lock = SPIN_LOCK_UNLOCKED;
125 static struct tq_struct tq_state_notify;
126 static struct tq_struct tq_recv_notify;
128 /* -------- util functions ------------------------------------ */
130 static char *cardstate2str(unsigned short cardstate)
134 case CARD_FREE: return "free";
135 case CARD_DETECTED: return "detected";
136 case CARD_LOADING: return "loading";
137 case CARD_RUNNING: return "running";
141 static inline int capi_cmd_valid(__u8 cmd)
146 case CAPI_CONNECT_ACTIVE:
147 case CAPI_CONNECT_B3_ACTIVE:
148 case CAPI_CONNECT_B3:
149 case CAPI_CONNECT_B3_T90_ACTIVE:
151 case CAPI_DISCONNECT_B3:
152 case CAPI_DISCONNECT:
156 case CAPI_MANUFACTURER:
158 case CAPI_SELECT_B_PROTOCOL:
164 static inline int capi_subcmd_valid(__u8 subcmd)
176 /* -------- /proc functions ----------------------------------- */
178 * /proc/capi/applications:
179 * applid l3cnt dblkcnt dblklen #ncci recvqueuelen
181 static int proc_applications_read_proc(char *page, char **start, off_t off,
182 int count, int *eof, void *data)
184 struct capi_appl *ap;
188 for (i=0; i < CAPI_MAXAPPL; i++) {
189 ap = &applications[i];
190 if (ap->applid == 0) continue;
191 len += sprintf(page+len, "%u %d %d %d %d %d\n",
193 ap->rparam.level3cnt,
194 ap->rparam.datablkcnt,
195 ap->rparam.datablklen,
197 skb_queue_len(&ap->recv_queue));
210 if (len>count) len = count;
217 * applid ncci winsize nblk
219 static int proc_ncci_read_proc(char *page, char **start, off_t off,
220 int count, int *eof, void *data)
222 struct capi_appl *ap;
223 struct capi_ncci *np;
227 for (i=0; i < CAPI_MAXAPPL; i++) {
228 ap = &applications[i];
229 if (ap->applid == 0) continue;
230 for (np = ap->nccilist; np; np = np->next) {
231 len += sprintf(page+len, "%d 0x%x %d %d\n",
249 if (len>count) len = count;
258 static int proc_driver_read_proc(char *page, char **start, off_t off,
259 int count, int *eof, void *data)
261 struct capi_driver *driver;
264 spin_lock(&drivers_lock);
265 for (driver = drivers; driver; driver = driver->next) {
266 len += sprintf(page+len, "%-32s %d %s\n",
279 spin_unlock(&drivers_lock);
283 if (len>count) len = count;
292 static int proc_users_read_proc(char *page, char **start, off_t off,
293 int count, int *eof, void *data)
295 struct capi_interface_user *cp;
298 spin_lock(&capi_users_lock);
299 for (cp = capi_users; cp ; cp = cp->next) {
300 len += sprintf(page+len, "%s\n", cp->name);
310 spin_unlock(&capi_users_lock);
314 if (len>count) len = count;
320 * /proc/capi/controller:
321 * cnr driver cardstate name driverinfo
323 static int proc_controller_read_proc(char *page, char **start, off_t off,
324 int count, int *eof, void *data)
330 for (i=0; i < CAPI_MAXCONTR; i++) {
332 if (cp->cardstate == CARD_FREE) continue;
333 len += sprintf(page+len, "%d %-10s %-8s %-16s %s\n",
334 cp->cnr, cp->driver->name,
335 cardstate2str(cp->cardstate),
337 cp->driver->procinfo ? cp->driver->procinfo(cp) : ""
351 if (len>count) len = count;
357 * /proc/capi/applstats:
358 * applid nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
360 static int proc_applstats_read_proc(char *page, char **start, off_t off,
361 int count, int *eof, void *data)
363 struct capi_appl *ap;
367 for (i=0; i < CAPI_MAXAPPL; i++) {
368 ap = &applications[i];
369 if (ap->applid == 0) continue;
370 len += sprintf(page+len, "%u %lu %lu %lu %lu\n",
388 if (len>count) len = count;
394 * /proc/capi/contrstats:
395 * cnr nrecvctlpkt nrecvdatapkt nsentctlpkt nsentdatapkt
397 static int proc_contrstats_read_proc(char *page, char **start, off_t off,
398 int count, int *eof, void *data)
404 for (i=0; i < CAPI_MAXCONTR; i++) {
406 if (cp->cardstate == CARD_FREE) continue;
407 len += sprintf(page+len, "%d %lu %lu %lu %lu\n",
425 if (len>count) len = count;
430 static struct procfsentries {
433 int (*read_proc)(char *page, char **start, off_t off,
434 int count, int *eof, void *data);
435 struct proc_dir_entry *procent;
436 } procfsentries[] = {
437 { "capi", S_IFDIR, 0 },
438 { "capi/applications", 0 , proc_applications_read_proc },
439 { "capi/ncci", 0 , proc_ncci_read_proc },
440 { "capi/driver", 0 , proc_driver_read_proc },
441 { "capi/users", 0 , proc_users_read_proc },
442 { "capi/controller", 0 , proc_controller_read_proc },
443 { "capi/applstats", 0 , proc_applstats_read_proc },
444 { "capi/contrstats", 0 , proc_contrstats_read_proc },
445 { "capi/drivers", S_IFDIR, 0 },
446 { "capi/controllers", S_IFDIR, 0 },
449 static void proc_capi_init(void)
451 int nelem = sizeof(procfsentries)/sizeof(procfsentries[0]);
454 for (i=0; i < nelem; i++) {
455 struct procfsentries *p = procfsentries + i;
456 p->procent = create_proc_entry(p->name, p->mode, 0);
457 if (p->procent) p->procent->read_proc = p->read_proc;
461 static void proc_capi_exit(void)
463 int nelem = sizeof(procfsentries)/sizeof(procfsentries[0]);
466 for (i=nelem-1; i >= 0; i--) {
467 struct procfsentries *p = procfsentries + i;
469 remove_proc_entry(p->name, 0);
475 /* -------- Notifier handling --------------------------------- */
477 static struct capi_notifier_list{
478 struct capi_notifier *head;
479 struct capi_notifier *tail;
482 static spinlock_t notifier_lock = SPIN_LOCK_UNLOCKED;
484 static inline void notify_enqueue(struct capi_notifier *np)
486 struct capi_notifier_list *q = ¬ifier_list;
489 spin_lock_irqsave(¬ifier_lock, flags);
494 q->head = q->tail = np;
496 spin_unlock_irqrestore(¬ifier_lock, flags);
499 static inline struct capi_notifier *notify_dequeue(void)
501 struct capi_notifier_list *q = ¬ifier_list;
502 struct capi_notifier *np = 0;
505 spin_lock_irqsave(¬ifier_lock, flags);
508 if ((q->head = np->next) == 0)
512 spin_unlock_irqrestore(¬ifier_lock, flags);
516 static int notify_push(unsigned int cmd, __u32 controller,
517 __u16 applid, __u32 ncci)
519 struct capi_notifier *np;
522 np = (struct capi_notifier *)kmalloc(sizeof(struct capi_notifier), GFP_ATOMIC);
527 memset(np, 0, sizeof(struct capi_notifier));
529 np->controller = controller;
534 * The notifier will result in adding/deleteing
535 * of devices. Devices can only removed in
536 * user process, not in bh.
539 if (schedule_task(&tq_state_notify) == 0)
544 /* -------- KCI_CONTRUP --------------------------------------- */
546 static void notify_up(__u32 contr)
548 struct capi_interface_user *p;
550 printk(KERN_NOTICE "kcapi: notify up contr %d\n", contr);
551 spin_lock(&capi_users_lock);
552 for (p = capi_users; p; p = p->next) {
553 if (!p->callback) continue;
554 (*p->callback) (KCI_CONTRUP, contr, &CARD(contr)->profile);
556 spin_unlock(&capi_users_lock);
559 /* -------- KCI_CONTRDOWN ------------------------------------- */
561 static void notify_down(__u32 contr)
563 struct capi_interface_user *p;
564 printk(KERN_NOTICE "kcapi: notify down contr %d\n", contr);
565 spin_lock(&capi_users_lock);
566 for (p = capi_users; p; p = p->next) {
567 if (!p->callback) continue;
568 (*p->callback) (KCI_CONTRDOWN, contr, 0);
570 spin_unlock(&capi_users_lock);
573 /* -------- KCI_NCCIUP ---------------------------------------- */
575 static void notify_ncciup(__u32 contr, __u16 applid, __u32 ncci)
577 struct capi_interface_user *p;
578 struct capi_ncciinfo n;
581 /*printk(KERN_NOTICE "kcapi: notify up contr %d\n", contr);*/
582 spin_lock(&capi_users_lock);
583 for (p = capi_users; p; p = p->next) {
584 if (!p->callback) continue;
585 (*p->callback) (KCI_NCCIUP, contr, &n);
587 spin_unlock(&capi_users_lock);
590 /* -------- KCI_NCCIDOWN -------------------------------------- */
592 static void notify_nccidown(__u32 contr, __u16 applid, __u32 ncci)
594 struct capi_interface_user *p;
595 struct capi_ncciinfo n;
598 /*printk(KERN_NOTICE "kcapi: notify down contr %d\n", contr);*/
599 spin_lock(&capi_users_lock);
600 for (p = capi_users; p; p = p->next) {
601 if (!p->callback) continue;
602 (*p->callback) (KCI_NCCIDOWN, contr, &n);
604 spin_unlock(&capi_users_lock);
607 /* ------------------------------------------------------------ */
609 static void inline notify_doit(struct capi_notifier *np)
613 notify_up(np->controller);
616 notify_down(np->controller);
619 notify_ncciup(np->controller, np->applid, np->ncci);
622 notify_nccidown(np->controller, np->applid, np->ncci);
627 static void notify_handler(void *dummy)
629 struct capi_notifier *np;
631 while ((np = notify_dequeue()) != 0) {
639 /* -------- NCCI Handling ------------------------------------- */
641 static inline void mq_init(struct capi_ncci * np)
644 np->lock = SPIN_LOCK_UNLOCKED;
648 memset(np->msgidpool, 0, sizeof(np->msgidpool));
649 np->msgidfree = &np->msgidpool[0];
650 for (i = 1; i < np->winsize; i++) {
651 np->msgidpool[i].next = np->msgidfree;
652 np->msgidfree = &np->msgidpool[i];
656 static inline int mq_enqueue(struct capi_ncci * np, __u16 msgid)
658 struct msgidqueue *mq;
659 spin_lock_bh(&np->lock);
660 if ((mq = np->msgidfree) == 0) {
661 spin_unlock_bh(&np->lock);
664 np->msgidfree = mq->next;
668 np->msgidlast->next = mq;
673 spin_unlock_bh(&np->lock);
677 static inline int mq_dequeue(struct capi_ncci * np, __u16 msgid)
679 struct msgidqueue **pp;
680 spin_lock_bh(&np->lock);
681 for (pp = &np->msgidqueue; *pp; pp = &(*pp)->next) {
682 if ((*pp)->msgid == msgid) {
683 struct msgidqueue *mq = *pp;
685 if (mq == np->msgidlast)
687 mq->next = np->msgidfree;
690 spin_unlock_bh(&np->lock);
694 spin_unlock_bh(&np->lock);
698 static void controllercb_appl_registered(struct capi_ctr * card, __u16 appl)
702 static void controllercb_appl_released(struct capi_ctr * card, __u16 appl)
704 struct capi_ncci **pp, **nextpp;
705 for (pp = &APPL(appl)->nccilist; *pp; pp = nextpp) {
706 if (NCCI2CTRL((*pp)->ncci) == card->cnr) {
707 struct capi_ncci *np = *pp;
709 printk(KERN_INFO "kcapi: appl %d ncci 0x%x down!\n", appl, np->ncci);
714 nextpp = &(*pp)->next;
717 APPL(appl)->releasing--;
718 if (APPL(appl)->releasing <= 0) {
719 APPL(appl)->signal = 0;
720 APPL_MARK_FREE(appl);
721 printk(KERN_INFO "kcapi: appl %d down\n", appl);
728 static void controllercb_new_ncci(struct capi_ctr * card,
729 __u16 appl, __u32 ncci, __u32 winsize)
731 struct capi_ncci *np;
732 if (!VALID_APPLID(appl)) {
733 printk(KERN_ERR "avmb1_handle_new_ncci: illegal appl %d\n", appl);
736 if ((np = (struct capi_ncci *) kmalloc(sizeof(struct capi_ncci), GFP_ATOMIC)) == 0) {
737 printk(KERN_ERR "capi_new_ncci: alloc failed ncci 0x%x\n", ncci);
740 if (winsize > CAPI_MAXDATAWINDOW) {
741 printk(KERN_ERR "capi_new_ncci: winsize %d too big, set to %d\n",
742 winsize, CAPI_MAXDATAWINDOW);
743 winsize = CAPI_MAXDATAWINDOW;
747 np->winsize = winsize;
749 np->next = APPL(appl)->nccilist;
750 APPL(appl)->nccilist = np;
752 printk(KERN_INFO "kcapi: appl %d ncci 0x%x up\n", appl, ncci);
754 notify_push(KCI_NCCIUP, CARDNR(card), appl, ncci);
757 static void controllercb_free_ncci(struct capi_ctr * card,
758 __u16 appl, __u32 ncci)
760 struct capi_ncci **pp;
761 if (!VALID_APPLID(appl)) {
762 printk(KERN_ERR "free_ncci: illegal appl %d\n", appl);
765 for (pp = &APPL(appl)->nccilist; *pp; pp = &(*pp)->next) {
766 if ((*pp)->ncci == ncci) {
767 struct capi_ncci *np = *pp;
771 printk(KERN_INFO "kcapi: appl %d ncci 0x%x down\n", appl, ncci);
772 notify_push(KCI_NCCIDOWN, CARDNR(card), appl, ncci);
776 printk(KERN_ERR "free_ncci: ncci 0x%x not found\n", ncci);
780 static struct capi_ncci *find_ncci(struct capi_appl * app, __u32 ncci)
782 struct capi_ncci *np;
783 for (np = app->nccilist; np; np = np->next) {
784 if (np->ncci == ncci)
790 /* -------- Receiver ------------------------------------------ */
792 static void recv_handler(void *dummy)
796 while ((skb = skb_dequeue(&recv_queue)) != 0) {
797 __u16 appl = CAPIMSG_APPID(skb->data);
798 struct capi_ncci *np;
799 if (!VALID_APPLID(appl)) {
800 printk(KERN_ERR "kcapi: recv_handler: applid %d ? (%s)\n",
801 appl, capi_message2str(skb->data));
805 if (APPL(appl)->signal == 0) {
806 printk(KERN_ERR "kcapi: recv_handler: applid %d has no signal function\n",
811 if ( CAPIMSG_COMMAND(skb->data) == CAPI_DATA_B3
812 && CAPIMSG_SUBCOMMAND(skb->data) == CAPI_CONF
813 && (np = find_ncci(APPL(appl), CAPIMSG_NCCI(skb->data))) != 0
814 && mq_dequeue(np, CAPIMSG_MSGID(skb->data)) == 0) {
815 printk(KERN_ERR "kcapi: msgid %hu ncci 0x%x not on queue\n",
816 CAPIMSG_MSGID(skb->data), np->ncci);
818 if ( CAPIMSG_COMMAND(skb->data) == CAPI_DATA_B3
819 && CAPIMSG_SUBCOMMAND(skb->data) == CAPI_IND) {
820 APPL(appl)->nrecvdatapkt++;
822 APPL(appl)->nrecvctlpkt++;
824 skb_queue_tail(&APPL(appl)->recv_queue, skb);
825 (APPL(appl)->signal) (APPL(appl)->applid, APPL(appl)->param);
829 static void controllercb_handle_capimsg(struct capi_ctr * card,
830 __u16 appl, struct sk_buff *skb)
835 if (card->cardstate != CARD_RUNNING) {
836 printk(KERN_INFO "kcapi: controller %d not active, got: %s",
837 card->cnr, capi_message2str(skb->data));
840 cmd = CAPIMSG_COMMAND(skb->data);
841 subcmd = CAPIMSG_SUBCOMMAND(skb->data);
842 if (cmd == CAPI_DATA_B3 && subcmd == CAPI_IND) {
843 card->nrecvdatapkt++;
844 if (card->traceflag > 2) showctl |= 2;
847 if (card->traceflag) showctl |= 2;
849 showctl |= (card->traceflag & 1);
852 printk(KERN_DEBUG "kcapi: got [0x%lx] id#%d %s len=%u\n",
853 (unsigned long) card->cnr,
854 CAPIMSG_APPID(skb->data),
855 capi_cmd2str(cmd, subcmd),
856 CAPIMSG_LEN(skb->data));
858 printk(KERN_DEBUG "kcapi: got [0x%lx] %s\n",
859 (unsigned long) card->cnr,
860 capi_message2str(skb->data));
864 skb_queue_tail(&recv_queue, skb);
865 queue_task(&tq_recv_notify, &tq_immediate);
866 mark_bh(IMMEDIATE_BH);
873 static void controllercb_ready(struct capi_ctr * card)
877 card->cardstate = CARD_RUNNING;
879 for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
880 if (!VALID_APPLID(appl)) continue;
881 if (APPL(appl)->releasing) continue;
882 card->driver->register_appl(card, appl, &APPL(appl)->rparam);
885 printk(KERN_NOTICE "kcapi: card %d \"%s\" ready.\n",
886 CARDNR(card), card->name);
888 notify_push(KCI_CONTRUP, CARDNR(card), 0, 0);
891 static void controllercb_reseted(struct capi_ctr * card)
895 if (card->cardstate == CARD_FREE)
897 if (card->cardstate == CARD_DETECTED)
900 card->cardstate = CARD_DETECTED;
902 memset(card->manu, 0, sizeof(card->manu));
903 memset(&card->version, 0, sizeof(card->version));
904 memset(&card->profile, 0, sizeof(card->profile));
905 memset(card->serial, 0, sizeof(card->serial));
907 for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
908 struct capi_ncci **pp, **nextpp;
909 for (pp = &APPL(appl)->nccilist; *pp; pp = nextpp) {
910 if (NCCI2CTRL((*pp)->ncci) == card->cnr) {
911 struct capi_ncci *np = *pp;
913 printk(KERN_INFO "kcapi: appl %d ncci 0x%x forced down!\n", appl, np->ncci);
914 notify_push(KCI_NCCIDOWN, CARDNR(card), appl, np->ncci);
918 nextpp = &(*pp)->next;
923 printk(KERN_NOTICE "kcapi: card %d down.\n", CARDNR(card));
925 notify_push(KCI_CONTRDOWN, CARDNR(card), 0, 0);
928 static void controllercb_suspend_output(struct capi_ctr *card)
930 if (!card->blocked) {
931 printk(KERN_DEBUG "kcapi: card %d suspend\n", CARDNR(card));
936 static void controllercb_resume_output(struct capi_ctr *card)
939 printk(KERN_DEBUG "kcapi: card %d resume\n", CARDNR(card));
944 /* ------------------------------------------------------------- */
948 drivercb_attach_ctr(struct capi_driver *driver, char *name, void *driverdata)
950 struct capi_ctr *card, **pp;
953 for (i=0; i < CAPI_MAXCONTR && cards[i].cardstate != CARD_FREE; i++) ;
955 if (i == CAPI_MAXCONTR) {
956 printk(KERN_ERR "kcapi: out of controller slots\n");
960 memset(card, 0, sizeof(struct capi_ctr));
961 card->driver = driver;
962 card->cnr = CARDNR(card);
963 strncpy(card->name, name, sizeof(card->name));
964 card->cardstate = CARD_DETECTED;
966 card->driverdata = driverdata;
967 card->traceflag = showcapimsgs;
969 card->ready = controllercb_ready;
970 card->reseted = controllercb_reseted;
971 card->suspend_output = controllercb_suspend_output;
972 card->resume_output = controllercb_resume_output;
973 card->handle_capimsg = controllercb_handle_capimsg;
974 card->appl_registered = controllercb_appl_registered;
975 card->appl_released = controllercb_appl_released;
976 card->new_ncci = controllercb_new_ncci;
977 card->free_ncci = controllercb_free_ncci;
979 for (pp = &driver->controller; *pp; pp = &(*pp)->next) ;
982 driver->ncontroller++;
983 sprintf(card->procfn, "capi/controllers/%d", card->cnr);
984 card->procent = create_proc_entry(card->procfn, 0, 0);
986 card->procent->read_proc =
987 (int (*)(char *,char **,off_t,int,int *,void *))
988 driver->ctr_read_proc;
989 card->procent->data = card;
993 printk(KERN_NOTICE "kcapi: Controller %d: %s attached\n",
994 card->cnr, card->name);
998 static int drivercb_detach_ctr(struct capi_ctr *card)
1000 struct capi_driver *driver = card->driver;
1001 struct capi_ctr **pp;
1003 if (card->cardstate == CARD_FREE)
1005 if (card->cardstate != CARD_DETECTED)
1006 controllercb_reseted(card);
1007 for (pp = &driver->controller; *pp ; pp = &(*pp)->next) {
1010 driver->ncontroller--;
1015 if (card->procent) {
1016 remove_proc_entry(card->procfn, 0);
1019 card->cardstate = CARD_FREE;
1020 printk(KERN_NOTICE "kcapi: Controller %d: %s unregistered\n",
1021 card->cnr, card->name);
1025 /* ------------------------------------------------------------- */
1027 /* fallback if no driver read_proc function defined by driver */
1029 static int driver_read_proc(char *page, char **start, off_t off,
1030 int count, int *eof, void *data)
1032 struct capi_driver *driver = (struct capi_driver *)data;
1035 len += sprintf(page+len, "%-16s %s\n", "name", driver->name);
1036 len += sprintf(page+len, "%-16s %s\n", "revision", driver->revision);
1041 *start = page + off;
1042 return ((count < len-off) ? count : len-off);
1045 /* ------------------------------------------------------------- */
1047 static struct capi_driver_interface di = {
1048 drivercb_attach_ctr,
1049 drivercb_detach_ctr,
1052 struct capi_driver_interface *attach_capi_driver(struct capi_driver *driver)
1054 struct capi_driver **pp;
1057 spin_lock(&drivers_lock);
1058 for (pp = &drivers; *pp; pp = &(*pp)->next) ;
1061 spin_unlock(&drivers_lock);
1062 printk(KERN_NOTICE "kcapi: driver %s attached\n", driver->name);
1063 sprintf(driver->procfn, "capi/drivers/%s", driver->name);
1064 driver->procent = create_proc_entry(driver->procfn, 0, 0);
1065 if (driver->procent) {
1066 if (driver->driver_read_proc) {
1067 driver->procent->read_proc =
1068 (int (*)(char *,char **,off_t,int,int *,void *))
1069 driver->driver_read_proc;
1071 driver->procent->read_proc = driver_read_proc;
1073 driver->procent->data = driver;
1078 void detach_capi_driver(struct capi_driver *driver)
1080 struct capi_driver **pp;
1081 spin_lock(&drivers_lock);
1082 for (pp = &drivers; *pp && *pp != driver; pp = &(*pp)->next) ;
1085 printk(KERN_NOTICE "kcapi: driver %s detached\n", driver->name);
1087 printk(KERN_ERR "kcapi: driver %s double detach ?\n", driver->name);
1089 spin_unlock(&drivers_lock);
1090 if (driver->procent) {
1091 remove_proc_entry(driver->procfn, 0);
1092 driver->procent = 0;
1097 /* ------------------------------------------------------------- */
1098 /* -------- CAPI2.0 Interface ---------------------------------- */
1099 /* ------------------------------------------------------------- */
1101 static __u16 capi_isinstalled(void)
1104 for (i = 0; i < CAPI_MAXCONTR; i++) {
1105 if (cards[i].cardstate == CARD_RUNNING)
1106 return CAPI_NOERROR;
1108 return CAPI_REGNOTINSTALLED;
1111 static __u16 capi_register(capi_register_params * rparam, __u16 * applidp)
1116 if (rparam->datablklen < 128)
1117 return CAPI_LOGBLKSIZETOSMALL;
1119 for (appl = 1; appl <= CAPI_MAXAPPL; appl++) {
1120 if (APPL_IS_FREE(appl))
1123 if (appl > CAPI_MAXAPPL)
1124 return CAPI_TOOMANYAPPLS;
1126 APPL_MARK_USED(appl);
1127 skb_queue_head_init(&APPL(appl)->recv_queue);
1128 APPL(appl)->nncci = 0;
1130 memcpy(&APPL(appl)->rparam, rparam, sizeof(capi_register_params));
1132 for (i = 0; i < CAPI_MAXCONTR; i++) {
1133 if (cards[i].cardstate != CARD_RUNNING)
1135 cards[i].driver->register_appl(&cards[i], appl,
1136 &APPL(appl)->rparam);
1139 printk(KERN_INFO "kcapi: appl %d up\n", appl);
1141 return CAPI_NOERROR;
1144 static __u16 capi_release(__u16 applid)
1148 if (!VALID_APPLID(applid) || APPL(applid)->releasing)
1149 return CAPI_ILLAPPNR;
1150 APPL(applid)->releasing++;
1151 skb_queue_purge(&APPL(applid)->recv_queue);
1152 for (i = 0; i < CAPI_MAXCONTR; i++) {
1153 if (cards[i].cardstate != CARD_RUNNING)
1155 APPL(applid)->releasing++;
1156 cards[i].driver->release_appl(&cards[i], applid);
1158 APPL(applid)->releasing--;
1159 if (APPL(applid)->releasing <= 0) {
1160 APPL(applid)->signal = 0;
1161 APPL_MARK_FREE(applid);
1162 printk(KERN_INFO "kcapi: appl %d down\n", applid);
1164 return CAPI_NOERROR;
1167 static __u16 capi_put_message(__u16 applid, struct sk_buff *skb)
1169 struct capi_ncci *np;
1175 return CAPI_REGNOTINSTALLED;
1176 if (!VALID_APPLID(applid))
1177 return CAPI_ILLAPPNR;
1179 || !capi_cmd_valid(CAPIMSG_COMMAND(skb->data))
1180 || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb->data)))
1181 return CAPI_ILLCMDORSUBCMDORMSGTOSMALL;
1182 contr = CAPIMSG_CONTROLLER(skb->data);
1183 if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING) {
1185 if (CARD(contr)->cardstate != CARD_RUNNING)
1186 return CAPI_REGNOTINSTALLED;
1188 if (CARD(contr)->blocked)
1189 return CAPI_SENDQUEUEFULL;
1191 cmd = CAPIMSG_COMMAND(skb->data);
1192 subcmd = CAPIMSG_SUBCOMMAND(skb->data);
1194 if (cmd == CAPI_DATA_B3 && subcmd== CAPI_REQ) {
1195 if ((np = find_ncci(APPL(applid), CAPIMSG_NCCI(skb->data))) != 0
1196 && mq_enqueue(np, CAPIMSG_MSGID(skb->data)) == 0)
1197 return CAPI_SENDQUEUEFULL;
1198 CARD(contr)->nsentdatapkt++;
1199 APPL(applid)->nsentdatapkt++;
1200 if (CARD(contr)->traceflag > 2) showctl |= 2;
1202 CARD(contr)->nsentctlpkt++;
1203 APPL(applid)->nsentctlpkt++;
1204 if (CARD(contr)->traceflag) showctl |= 2;
1206 showctl |= (CARD(contr)->traceflag & 1);
1209 printk(KERN_DEBUG "kcapi: put [0x%lx] id#%d %s len=%u\n",
1210 (unsigned long) contr,
1211 CAPIMSG_APPID(skb->data),
1212 capi_cmd2str(cmd, subcmd),
1213 CAPIMSG_LEN(skb->data));
1215 printk(KERN_DEBUG "kcapi: put [0x%lx] %s\n",
1216 (unsigned long) contr,
1217 capi_message2str(skb->data));
1221 CARD(contr)->driver->send_message(CARD(contr), skb);
1222 return CAPI_NOERROR;
1225 static __u16 capi_get_message(__u16 applid, struct sk_buff **msgp)
1227 struct sk_buff *skb;
1229 if (!VALID_APPLID(applid))
1230 return CAPI_ILLAPPNR;
1231 if ((skb = skb_dequeue(&APPL(applid)->recv_queue)) == 0)
1232 return CAPI_RECEIVEQUEUEEMPTY;
1234 return CAPI_NOERROR;
1237 static __u16 capi_set_signal(__u16 applid,
1238 void (*signal) (__u16 applid, void *param),
1241 if (!VALID_APPLID(applid))
1242 return CAPI_ILLAPPNR;
1243 APPL(applid)->signal = signal;
1244 APPL(applid)->param = param;
1245 return CAPI_NOERROR;
1248 static __u16 capi_get_manufacturer(__u32 contr, __u8 buf[CAPI_MANUFACTURER_LEN])
1251 strncpy(buf, capi_manufakturer, CAPI_MANUFACTURER_LEN);
1252 return CAPI_NOERROR;
1254 if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING)
1255 return CAPI_REGNOTINSTALLED;
1257 strncpy(buf, CARD(contr)->manu, CAPI_MANUFACTURER_LEN);
1258 return CAPI_NOERROR;
1261 static __u16 capi_get_version(__u32 contr, struct capi_version *verp)
1264 *verp = driver_version;
1265 return CAPI_NOERROR;
1267 if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING)
1268 return CAPI_REGNOTINSTALLED;
1270 memcpy((void *) verp, &CARD(contr)->version, sizeof(capi_version));
1271 return CAPI_NOERROR;
1274 static __u16 capi_get_serial(__u32 contr, __u8 serial[CAPI_SERIAL_LEN])
1277 strncpy(serial, driver_serial, CAPI_SERIAL_LEN);
1278 return CAPI_NOERROR;
1280 if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING)
1281 return CAPI_REGNOTINSTALLED;
1283 strncpy((void *) serial, CARD(contr)->serial, CAPI_SERIAL_LEN);
1284 return CAPI_NOERROR;
1287 static __u16 capi_get_profile(__u32 contr, struct capi_profile *profp)
1290 profp->ncontroller = ncards;
1291 return CAPI_NOERROR;
1293 if (!VALID_CARD(contr) || CARD(contr)->cardstate != CARD_RUNNING)
1294 return CAPI_REGNOTINSTALLED;
1296 memcpy((void *) profp, &CARD(contr)->profile,
1297 sizeof(struct capi_profile));
1298 return CAPI_NOERROR;
1301 static struct capi_driver *find_driver(char *name)
1303 struct capi_driver *dp;
1304 spin_lock(&drivers_lock);
1305 for (dp = drivers; dp; dp = dp->next)
1306 if (strcmp(dp->name, name) == 0)
1308 spin_unlock(&drivers_lock);
1312 #ifdef CONFIG_AVMB1_COMPAT
1313 static int old_capi_manufacturer(unsigned int cmd, void *data)
1315 avmb1_loadandconfigdef ldef;
1316 avmb1_extcarddef cdef;
1317 avmb1_resetdef rdef;
1319 struct capi_driver *driver;
1320 struct capi_ctr *card;
1321 capicardparams cparams;
1327 case AVMB1_ADDCARD_WITH_TYPE:
1328 if (cmd == AVMB1_ADDCARD) {
1329 if ((retval = copy_from_user((void *) &cdef, data,
1330 sizeof(avmb1_carddef))))
1332 cdef.cardtype = AVM_CARDTYPE_B1;
1334 if ((retval = copy_from_user((void *) &cdef, data,
1335 sizeof(avmb1_extcarddef))))
1338 cparams.port = cdef.port;
1339 cparams.irq = cdef.irq;
1340 cparams.cardnr = cdef.cardnr;
1342 switch (cdef.cardtype) {
1343 case AVM_CARDTYPE_B1:
1344 driver = find_driver("b1isa");
1346 case AVM_CARDTYPE_T1:
1347 driver = find_driver("t1isa");
1354 printk(KERN_ERR "kcapi: driver not loaded.\n");
1357 if (!driver->add_card) {
1358 printk(KERN_ERR "kcapi: driver has no add card function.\n");
1362 return driver->add_card(driver, &cparams);
1365 case AVMB1_LOAD_AND_CONFIG:
1367 if (cmd == AVMB1_LOAD) {
1368 if ((retval = copy_from_user((void *) &ldef, data,
1369 sizeof(avmb1_loaddef))))
1371 ldef.t4config.len = 0;
1372 ldef.t4config.data = 0;
1374 if ((retval = copy_from_user((void *) &ldef, data,
1375 sizeof(avmb1_loadandconfigdef))))
1378 if (!VALID_CARD(ldef.contr))
1381 card = CARD(ldef.contr);
1382 if (card->cardstate == CARD_FREE)
1384 if (card->driver->load_firmware == 0) {
1385 printk(KERN_DEBUG "kcapi: load: driver \%s\" has no load function\n", card->driver->name);
1389 if (ldef.t4file.len <= 0) {
1390 printk(KERN_DEBUG "kcapi: load: invalid parameter: length of t4file is %d ?\n", ldef.t4file.len);
1393 if (ldef.t4file.data == 0) {
1394 printk(KERN_DEBUG "kcapi: load: invalid parameter: dataptr is 0\n");
1398 ldata.firmware.user = 1;
1399 ldata.firmware.data = ldef.t4file.data;
1400 ldata.firmware.len = ldef.t4file.len;
1401 ldata.configuration.user = 1;
1402 ldata.configuration.data = ldef.t4config.data;
1403 ldata.configuration.len = ldef.t4config.len;
1405 if (card->cardstate != CARD_DETECTED) {
1406 printk(KERN_INFO "kcapi: load: contr=%d not in detect state\n", ldef.contr);
1409 card->cardstate = CARD_LOADING;
1411 retval = card->driver->load_firmware(card, &ldata);
1414 card->cardstate = CARD_DETECTED;
1418 while (card->cardstate != CARD_RUNNING) {
1420 set_current_state(TASK_INTERRUPTIBLE);
1421 schedule_timeout(HZ/10); /* 0.1 sec */
1423 if (signal_pending(current))
1428 case AVMB1_RESETCARD:
1429 if ((retval = copy_from_user((void *) &rdef, data,
1430 sizeof(avmb1_resetdef))))
1432 if (!VALID_CARD(rdef.contr))
1434 card = CARD(rdef.contr);
1436 if (card->cardstate == CARD_FREE)
1438 if (card->cardstate == CARD_DETECTED)
1441 card->driver->reset_ctr(card);
1443 while (card->cardstate > CARD_DETECTED) {
1445 set_current_state(TASK_INTERRUPTIBLE);
1446 schedule_timeout(HZ/10); /* 0.1 sec */
1448 if (signal_pending(current))
1453 case AVMB1_GET_CARDINFO:
1454 if ((retval = copy_from_user((void *) &gdef, data,
1455 sizeof(avmb1_getdef))))
1458 if (!VALID_CARD(gdef.contr))
1461 card = CARD(gdef.contr);
1463 if (card->cardstate == CARD_FREE)
1466 gdef.cardstate = card->cardstate;
1467 if (card->driver == find_driver("t1isa"))
1468 gdef.cardtype = AVM_CARDTYPE_T1;
1469 else gdef.cardtype = AVM_CARDTYPE_B1;
1471 if ((retval = copy_to_user(data, (void *) &gdef,
1472 sizeof(avmb1_getdef))))
1477 case AVMB1_REMOVECARD:
1478 if ((retval = copy_from_user((void *) &rdef, data,
1479 sizeof(avmb1_resetdef))))
1482 if (!VALID_CARD(rdef.contr))
1484 card = CARD(rdef.contr);
1486 if (card->cardstate == CARD_FREE)
1489 if (card->cardstate != CARD_DETECTED)
1492 card->driver->remove_ctr(card);
1494 while (card->cardstate != CARD_FREE) {
1496 set_current_state(TASK_INTERRUPTIBLE);
1497 schedule_timeout(HZ/10); /* 0.1 sec */
1499 if (signal_pending(current))
1508 static int capi_manufacturer(unsigned int cmd, void *data)
1510 struct capi_ctr *card;
1514 #ifdef CONFIG_AVMB1_COMPAT
1516 case AVMB1_ADDCARD_WITH_TYPE:
1518 case AVMB1_LOAD_AND_CONFIG:
1519 case AVMB1_RESETCARD:
1520 case AVMB1_GET_CARDINFO:
1521 case AVMB1_REMOVECARD:
1522 return old_capi_manufacturer(cmd, data);
1524 case KCAPI_CMD_TRACE:
1528 if ((retval = copy_from_user((void *) &fdef, data,
1529 sizeof(kcapi_flagdef))))
1532 if (!VALID_CARD(fdef.contr))
1534 card = CARD(fdef.contr);
1535 if (card->cardstate == CARD_FREE)
1537 card->traceflag = fdef.flag;
1538 printk(KERN_INFO "kcapi: contr %d set trace=%d\n",
1539 card->cnr, card->traceflag);
1543 case KCAPI_CMD_ADDCARD:
1545 struct capi_driver *driver;
1546 capicardparams cparams;
1549 if ((retval = copy_from_user((void *) &cdef, data,
1553 cparams.port = cdef.port;
1554 cparams.irq = cdef.irq;
1555 cparams.membase = cdef.membase;
1556 cparams.cardnr = cdef.cardnr;
1557 cparams.cardtype = 0;
1558 cdef.driver[sizeof(cdef.driver)-1] = 0;
1560 if ((driver = find_driver(cdef.driver)) == 0) {
1561 printk(KERN_ERR "kcapi: driver \"%s\" not loaded.\n",
1566 if (!driver->add_card) {
1567 printk(KERN_ERR "kcapi: driver \"%s\" has no add card function.\n", cdef.driver);
1571 return driver->add_card(driver, &cparams);
1575 printk(KERN_ERR "kcapi: manufacturer command %d unknown.\n",
1583 struct capi_interface avmb1_interface =
1591 capi_get_manufacturer,
1598 /* ------------------------------------------------------------- */
1599 /* -------- Exported Functions --------------------------------- */
1600 /* ------------------------------------------------------------- */
1602 struct capi_interface *attach_capi_interface(struct capi_interface_user *userp)
1604 struct capi_interface_user *p;
1607 spin_lock(&capi_users_lock);
1608 for (p = capi_users; p; p = p->next) {
1610 spin_unlock(&capi_users_lock);
1611 printk(KERN_ERR "kcapi: double attach from %s\n",
1617 userp->next = capi_users;
1619 spin_unlock(&capi_users_lock);
1620 printk(KERN_NOTICE "kcapi: %s attached\n", userp->name);
1622 return &avmb1_interface;
1625 int detach_capi_interface(struct capi_interface_user *userp)
1627 struct capi_interface_user **pp;
1629 spin_lock(&capi_users_lock);
1630 for (pp = &capi_users; *pp; pp = &(*pp)->next) {
1633 spin_unlock(&capi_users_lock);
1635 printk(KERN_NOTICE "kcapi: %s detached\n", userp->name);
1640 spin_unlock(&capi_users_lock);
1641 printk(KERN_ERR "kcapi: double detach from %s\n", userp->name);
1645 /* ------------------------------------------------------------- */
1646 /* -------- Init & Cleanup ------------------------------------- */
1647 /* ------------------------------------------------------------- */
1649 EXPORT_SYMBOL(attach_capi_interface);
1650 EXPORT_SYMBOL(detach_capi_interface);
1651 EXPORT_SYMBOL(attach_capi_driver);
1652 EXPORT_SYMBOL(detach_capi_driver);
1655 * init / exit functions
1658 static int __init kcapi_init(void)
1665 skb_queue_head_init(&recv_queue);
1667 tq_state_notify.routine = notify_handler;
1668 tq_state_notify.data = 0;
1670 tq_recv_notify.routine = recv_handler;
1671 tq_recv_notify.data = 0;
1675 if ((p = strchr(revision, ':')) != 0 && p[1]) {
1676 strncpy(rev, p + 2, sizeof(rev));
1677 rev[sizeof(rev)-1] = 0;
1678 if ((p = strchr(rev, '$')) != 0 && p > rev)
1684 printk(KERN_NOTICE "CAPI-driver Rev %s: loaded\n", rev);
1686 printk(KERN_NOTICE "CAPI-driver Rev %s: started\n", rev);
1692 static void __exit kcapi_exit(void)
1697 if ((p = strchr(revision, ':'))) {
1699 p = strchr(rev, '$');
1706 printk(KERN_NOTICE "CAPI-driver Rev%s: unloaded\n", rev);
1709 module_init(kcapi_init);
1710 module_exit(kcapi_exit);