1 /* $Id: kcapi.c,v 1.1.2.8 2004/03/26 19:57:20 armin Exp $
3 * Kernel CAPI 2.0 Module
5 * Copyright 1999 by Carsten Paeth <calle@calle.de>
6 * Copyright 2002 by Kai Germaschewski <kai@germaschewski.name>
8 * This software may be used and distributed according to the terms
9 * of the GNU General Public License, incorporated herein by reference.
16 #include <linux/module.h>
18 #include <linux/interrupt.h>
19 #include <linux/ioport.h>
20 #include <linux/proc_fs.h>
21 #include <linux/sched.h>
22 #include <linux/seq_file.h>
23 #include <linux/skbuff.h>
24 #include <linux/workqueue.h>
25 #include <linux/capi.h>
26 #include <linux/kernelcapi.h>
27 #include <linux/init.h>
28 #include <linux/moduleparam.h>
29 #include <linux/delay.h>
30 #include <asm/uaccess.h>
31 #include <linux/isdn/capicmd.h>
32 #include <linux/isdn/capiutil.h>
34 #include <linux/b1lli.h>
36 #include <linux/mutex.h>
38 static int showcapimsgs
= 0;
40 MODULE_DESCRIPTION("CAPI4Linux: kernel CAPI layer");
41 MODULE_AUTHOR("Carsten Paeth");
42 MODULE_LICENSE("GPL");
43 module_param(showcapimsgs
, uint
, 0);
45 /* ------------------------------------------------------------- */
47 struct capictr_event
{
48 struct work_struct work
;
53 /* ------------------------------------------------------------- */
55 static struct capi_version driver_version
= {2, 0, 1, 1<<4};
56 static char driver_serial
[CAPI_SERIAL_LEN
] = "0004711";
57 static char capi_manufakturer
[64] = "AVM Berlin";
59 #define NCCI2CTRL(ncci) (((ncci) >> 24) & 0x7f)
61 LIST_HEAD(capi_drivers
);
62 DEFINE_MUTEX(capi_drivers_lock
);
64 static DEFINE_RWLOCK(application_lock
);
65 static DEFINE_MUTEX(controller_mutex
);
67 struct capi20_appl
*capi_applications
[CAPI_MAXAPPL
];
68 struct capi_ctr
*capi_controller
[CAPI_MAXCONTR
];
70 static int ncontrollers
;
72 static BLOCKING_NOTIFIER_HEAD(ctr_notifier_list
);
74 /* -------- controller ref counting -------------------------------------- */
76 static inline struct capi_ctr
*
77 capi_ctr_get(struct capi_ctr
*ctr
)
79 if (!try_module_get(ctr
->owner
))
85 capi_ctr_put(struct capi_ctr
*ctr
)
87 module_put(ctr
->owner
);
90 /* ------------------------------------------------------------- */
92 static inline struct capi_ctr
*get_capi_ctr_by_nr(u16 contr
)
94 if (contr
- 1 >= CAPI_MAXCONTR
)
97 return capi_controller
[contr
- 1];
100 static inline struct capi20_appl
*get_capi_appl_by_nr(u16 applid
)
102 if (applid
- 1 >= CAPI_MAXAPPL
)
105 return capi_applications
[applid
- 1];
108 /* -------- util functions ------------------------------------ */
110 static inline int capi_cmd_valid(u8 cmd
)
115 case CAPI_CONNECT_ACTIVE
:
116 case CAPI_CONNECT_B3_ACTIVE
:
117 case CAPI_CONNECT_B3
:
118 case CAPI_CONNECT_B3_T90_ACTIVE
:
120 case CAPI_DISCONNECT_B3
:
121 case CAPI_DISCONNECT
:
125 case CAPI_MANUFACTURER
:
127 case CAPI_SELECT_B_PROTOCOL
:
133 static inline int capi_subcmd_valid(u8 subcmd
)
145 /* ------------------------------------------------------------ */
148 register_appl(struct capi_ctr
*ctr
, u16 applid
, capi_register_params
*rparam
)
150 ctr
= capi_ctr_get(ctr
);
153 ctr
->register_appl(ctr
, applid
, rparam
);
155 printk(KERN_WARNING
"%s: cannot get controller resources\n",
160 static void release_appl(struct capi_ctr
*ctr
, u16 applid
)
162 DBG("applid %#x", applid
);
164 ctr
->release_appl(ctr
, applid
);
168 static void notify_up(u32 contr
)
170 struct capi20_appl
*ap
;
171 struct capi_ctr
*ctr
;
174 if (showcapimsgs
& 1)
175 printk(KERN_DEBUG
"kcapi: notify up contr %d\n", contr
);
177 ctr
= get_capi_ctr_by_nr(contr
);
179 if (ctr
->state
== CAPI_CTR_RUNNING
)
182 ctr
->state
= CAPI_CTR_RUNNING
;
184 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
185 ap
= get_capi_appl_by_nr(applid
);
186 if (!ap
|| ap
->release_in_progress
)
188 register_appl(ctr
, applid
, &ap
->rparam
);
191 printk(KERN_WARNING
"%s: invalid contr %d\n", __func__
, contr
);
194 static void ctr_down(struct capi_ctr
*ctr
)
196 struct capi20_appl
*ap
;
199 if (ctr
->state
== CAPI_CTR_DETECTED
)
202 ctr
->state
= CAPI_CTR_DETECTED
;
204 memset(ctr
->manu
, 0, sizeof(ctr
->manu
));
205 memset(&ctr
->version
, 0, sizeof(ctr
->version
));
206 memset(&ctr
->profile
, 0, sizeof(ctr
->profile
));
207 memset(ctr
->serial
, 0, sizeof(ctr
->serial
));
209 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
210 ap
= get_capi_appl_by_nr(applid
);
211 if (ap
&& !ap
->release_in_progress
)
216 static void notify_down(u32 contr
)
218 struct capi_ctr
*ctr
;
220 if (showcapimsgs
& 1)
221 printk(KERN_DEBUG
"kcapi: notify down contr %d\n", contr
);
223 ctr
= get_capi_ctr_by_nr(contr
);
227 printk(KERN_WARNING
"%s: invalid contr %d\n", __func__
, contr
);
231 notify_handler(struct notifier_block
*nb
, unsigned long val
, void *v
)
246 static void do_notify_work(struct work_struct
*work
)
248 struct capictr_event
*event
=
249 container_of(work
, struct capictr_event
, work
);
251 blocking_notifier_call_chain(&ctr_notifier_list
, event
->type
,
252 (void *)(long)event
->controller
);
257 * The notifier will result in adding/deleteing of devices. Devices can
258 * only removed in user process, not in bh.
260 static int notify_push(unsigned int event_type
, u32 controller
)
262 struct capictr_event
*event
= kmalloc(sizeof(*event
), GFP_ATOMIC
);
267 INIT_WORK(&event
->work
, do_notify_work
);
268 event
->type
= event_type
;
269 event
->controller
= controller
;
271 schedule_work(&event
->work
);
275 int register_capictr_notifier(struct notifier_block
*nb
)
277 return blocking_notifier_chain_register(&ctr_notifier_list
, nb
);
279 EXPORT_SYMBOL_GPL(register_capictr_notifier
);
281 int unregister_capictr_notifier(struct notifier_block
*nb
)
283 return blocking_notifier_chain_unregister(&ctr_notifier_list
, nb
);
285 EXPORT_SYMBOL_GPL(unregister_capictr_notifier
);
287 /* -------- Receiver ------------------------------------------ */
289 static void recv_handler(struct work_struct
*work
)
292 struct capi20_appl
*ap
=
293 container_of(work
, struct capi20_appl
, recv_work
);
295 if ((!ap
) || (ap
->release_in_progress
))
298 mutex_lock(&ap
->recv_mtx
);
299 while ((skb
= skb_dequeue(&ap
->recv_queue
))) {
300 if (CAPIMSG_CMD(skb
->data
) == CAPI_DATA_B3_IND
)
305 ap
->recv_message(ap
, skb
);
307 mutex_unlock(&ap
->recv_mtx
);
311 * capi_ctr_handle_message() - handle incoming CAPI message
312 * @ctr: controller descriptor structure.
313 * @appl: application ID.
316 * Called by hardware driver to pass a CAPI message to the application.
319 void capi_ctr_handle_message(struct capi_ctr
*ctr
, u16 appl
,
322 struct capi20_appl
*ap
;
328 if (ctr
->state
!= CAPI_CTR_RUNNING
) {
329 cdb
= capi_message2str(skb
->data
);
331 printk(KERN_INFO
"kcapi: controller [%03d] not active, got: %s",
335 printk(KERN_INFO
"kcapi: controller [%03d] not active, cannot trace\n",
340 cmd
= CAPIMSG_COMMAND(skb
->data
);
341 subcmd
= CAPIMSG_SUBCOMMAND(skb
->data
);
342 if (cmd
== CAPI_DATA_B3
&& subcmd
== CAPI_IND
) {
344 if (ctr
->traceflag
> 2)
351 showctl
|= (ctr
->traceflag
& 1);
354 printk(KERN_DEBUG
"kcapi: got [%03d] id#%d %s len=%u\n",
355 ctr
->cnr
, CAPIMSG_APPID(skb
->data
),
356 capi_cmd2str(cmd
, subcmd
),
357 CAPIMSG_LEN(skb
->data
));
359 cdb
= capi_message2str(skb
->data
);
361 printk(KERN_DEBUG
"kcapi: got [%03d] %s\n",
365 printk(KERN_DEBUG
"kcapi: got [%03d] id#%d %s len=%u, cannot trace\n",
366 ctr
->cnr
, CAPIMSG_APPID(skb
->data
),
367 capi_cmd2str(cmd
, subcmd
),
368 CAPIMSG_LEN(skb
->data
));
373 read_lock_irqsave(&application_lock
, flags
);
374 ap
= get_capi_appl_by_nr(CAPIMSG_APPID(skb
->data
));
375 if ((!ap
) || (ap
->release_in_progress
)) {
376 read_unlock_irqrestore(&application_lock
, flags
);
377 cdb
= capi_message2str(skb
->data
);
379 printk(KERN_ERR
"kcapi: handle_message: applid %d state released (%s)\n",
380 CAPIMSG_APPID(skb
->data
), cdb
->buf
);
383 printk(KERN_ERR
"kcapi: handle_message: applid %d state released (%s) cannot trace\n",
384 CAPIMSG_APPID(skb
->data
),
385 capi_cmd2str(cmd
, subcmd
));
388 skb_queue_tail(&ap
->recv_queue
, skb
);
389 schedule_work(&ap
->recv_work
);
390 read_unlock_irqrestore(&application_lock
, flags
);
398 EXPORT_SYMBOL(capi_ctr_handle_message
);
401 * capi_ctr_ready() - signal CAPI controller ready
402 * @ctr: controller descriptor structure.
404 * Called by hardware driver to signal that the controller is up and running.
407 void capi_ctr_ready(struct capi_ctr
*ctr
)
409 printk(KERN_NOTICE
"kcapi: controller [%03d] \"%s\" ready.\n",
410 ctr
->cnr
, ctr
->name
);
412 notify_push(CAPICTR_UP
, ctr
->cnr
);
415 EXPORT_SYMBOL(capi_ctr_ready
);
418 * capi_ctr_down() - signal CAPI controller not ready
419 * @ctr: controller descriptor structure.
421 * Called by hardware driver to signal that the controller is down and
422 * unavailable for use.
425 void capi_ctr_down(struct capi_ctr
*ctr
)
427 printk(KERN_NOTICE
"kcapi: controller [%03d] down.\n", ctr
->cnr
);
429 notify_push(CAPICTR_DOWN
, ctr
->cnr
);
432 EXPORT_SYMBOL(capi_ctr_down
);
435 * capi_ctr_suspend_output() - suspend controller
436 * @ctr: controller descriptor structure.
438 * Called by hardware driver to stop data flow.
441 void capi_ctr_suspend_output(struct capi_ctr
*ctr
)
444 printk(KERN_DEBUG
"kcapi: controller [%03d] suspend\n",
450 EXPORT_SYMBOL(capi_ctr_suspend_output
);
453 * capi_ctr_resume_output() - resume controller
454 * @ctr: controller descriptor structure.
456 * Called by hardware driver to resume data flow.
459 void capi_ctr_resume_output(struct capi_ctr
*ctr
)
462 printk(KERN_DEBUG
"kcapi: controller [%03d] resumed\n",
468 EXPORT_SYMBOL(capi_ctr_resume_output
);
470 /* ------------------------------------------------------------- */
473 * attach_capi_ctr() - register CAPI controller
474 * @ctr: controller descriptor structure.
476 * Called by hardware driver to register a controller with the CAPI subsystem.
477 * Return value: 0 on success, error code < 0 on error
480 int attach_capi_ctr(struct capi_ctr
*ctr
)
484 mutex_lock(&controller_mutex
);
486 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
487 if (!capi_controller
[i
])
490 if (i
== CAPI_MAXCONTR
) {
491 mutex_unlock(&controller_mutex
);
492 printk(KERN_ERR
"kcapi: out of controller slots\n");
495 capi_controller
[i
] = ctr
;
497 mutex_unlock(&controller_mutex
);
499 ctr
->nrecvctlpkt
= 0;
500 ctr
->nrecvdatapkt
= 0;
501 ctr
->nsentctlpkt
= 0;
502 ctr
->nsentdatapkt
= 0;
504 ctr
->state
= CAPI_CTR_DETECTED
;
506 ctr
->traceflag
= showcapimsgs
;
508 sprintf(ctr
->procfn
, "capi/controllers/%d", ctr
->cnr
);
509 ctr
->procent
= proc_create_data(ctr
->procfn
, 0, NULL
, ctr
->proc_fops
, ctr
);
512 printk(KERN_NOTICE
"kcapi: controller [%03d]: %s attached\n",
513 ctr
->cnr
, ctr
->name
);
517 EXPORT_SYMBOL(attach_capi_ctr
);
520 * detach_capi_ctr() - unregister CAPI controller
521 * @ctr: controller descriptor structure.
523 * Called by hardware driver to remove the registration of a controller
524 * with the CAPI subsystem.
525 * Return value: 0 on success, error code < 0 on error
528 int detach_capi_ctr(struct capi_ctr
*ctr
)
535 remove_proc_entry(ctr
->procfn
, NULL
);
538 capi_controller
[ctr
->cnr
- 1] = NULL
;
539 printk(KERN_NOTICE
"kcapi: controller [%03d]: %s unregistered\n",
540 ctr
->cnr
, ctr
->name
);
545 EXPORT_SYMBOL(detach_capi_ctr
);
548 * register_capi_driver() - register CAPI driver
549 * @driver: driver descriptor structure.
551 * Called by hardware driver to register itself with the CAPI subsystem.
554 void register_capi_driver(struct capi_driver
*driver
)
556 mutex_lock(&capi_drivers_lock
);
557 list_add_tail(&driver
->list
, &capi_drivers
);
558 mutex_unlock(&capi_drivers_lock
);
561 EXPORT_SYMBOL(register_capi_driver
);
564 * unregister_capi_driver() - unregister CAPI driver
565 * @driver: driver descriptor structure.
567 * Called by hardware driver to unregister itself from the CAPI subsystem.
570 void unregister_capi_driver(struct capi_driver
*driver
)
572 mutex_lock(&capi_drivers_lock
);
573 list_del(&driver
->list
);
574 mutex_unlock(&capi_drivers_lock
);
577 EXPORT_SYMBOL(unregister_capi_driver
);
579 /* ------------------------------------------------------------- */
580 /* -------- CAPI2.0 Interface ---------------------------------- */
581 /* ------------------------------------------------------------- */
584 * capi20_isinstalled() - CAPI 2.0 operation CAPI_INSTALLED
586 * Return value: CAPI result code (CAPI_NOERROR if at least one ISDN controller
587 * is ready for use, CAPI_REGNOTINSTALLED otherwise)
590 u16
capi20_isinstalled(void)
593 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
594 if (capi_controller
[i
] &&
595 capi_controller
[i
]->state
== CAPI_CTR_RUNNING
)
598 return CAPI_REGNOTINSTALLED
;
601 EXPORT_SYMBOL(capi20_isinstalled
);
604 * capi20_register() - CAPI 2.0 operation CAPI_REGISTER
605 * @ap: CAPI application descriptor structure.
607 * Register an application's presence with CAPI.
608 * A unique application ID is assigned and stored in @ap->applid.
609 * After this function returns successfully, the message receive
610 * callback function @ap->recv_message() may be called at any time
611 * until capi20_release() has been called for the same @ap.
612 * Return value: CAPI result code
615 u16
capi20_register(struct capi20_appl
*ap
)
623 if (ap
->rparam
.datablklen
< 128)
624 return CAPI_LOGBLKSIZETOSMALL
;
626 write_lock_irqsave(&application_lock
, flags
);
628 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
629 if (capi_applications
[applid
- 1] == NULL
)
632 if (applid
> CAPI_MAXAPPL
) {
633 write_unlock_irqrestore(&application_lock
, flags
);
634 return CAPI_TOOMANYAPPLS
;
638 capi_applications
[applid
- 1] = ap
;
641 ap
->nrecvdatapkt
= 0;
643 ap
->nsentdatapkt
= 0;
644 mutex_init(&ap
->recv_mtx
);
645 skb_queue_head_init(&ap
->recv_queue
);
646 INIT_WORK(&ap
->recv_work
, recv_handler
);
647 ap
->release_in_progress
= 0;
649 write_unlock_irqrestore(&application_lock
, flags
);
651 mutex_lock(&controller_mutex
);
652 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
653 if (!capi_controller
[i
] ||
654 capi_controller
[i
]->state
!= CAPI_CTR_RUNNING
)
656 register_appl(capi_controller
[i
], applid
, &ap
->rparam
);
658 mutex_unlock(&controller_mutex
);
660 if (showcapimsgs
& 1) {
661 printk(KERN_DEBUG
"kcapi: appl %d up\n", applid
);
667 EXPORT_SYMBOL(capi20_register
);
670 * capi20_release() - CAPI 2.0 operation CAPI_RELEASE
671 * @ap: CAPI application descriptor structure.
673 * Terminate an application's registration with CAPI.
674 * After this function returns successfully, the message receive
675 * callback function @ap->recv_message() will no longer be called.
676 * Return value: CAPI result code
679 u16
capi20_release(struct capi20_appl
*ap
)
684 DBG("applid %#x", ap
->applid
);
686 write_lock_irqsave(&application_lock
, flags
);
687 ap
->release_in_progress
= 1;
688 capi_applications
[ap
->applid
- 1] = NULL
;
689 write_unlock_irqrestore(&application_lock
, flags
);
691 mutex_lock(&controller_mutex
);
692 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
693 if (!capi_controller
[i
] ||
694 capi_controller
[i
]->state
!= CAPI_CTR_RUNNING
)
696 release_appl(capi_controller
[i
], ap
->applid
);
698 mutex_unlock(&controller_mutex
);
700 flush_scheduled_work();
701 skb_queue_purge(&ap
->recv_queue
);
703 if (showcapimsgs
& 1) {
704 printk(KERN_DEBUG
"kcapi: appl %d down\n", ap
->applid
);
710 EXPORT_SYMBOL(capi20_release
);
713 * capi20_put_message() - CAPI 2.0 operation CAPI_PUT_MESSAGE
714 * @ap: CAPI application descriptor structure.
715 * @skb: CAPI message.
717 * Transfer a single message to CAPI.
718 * Return value: CAPI result code
721 u16
capi20_put_message(struct capi20_appl
*ap
, struct sk_buff
*skb
)
723 struct capi_ctr
*ctr
;
727 DBG("applid %#x", ap
->applid
);
729 if (ncontrollers
== 0)
730 return CAPI_REGNOTINSTALLED
;
731 if ((ap
->applid
== 0) || ap
->release_in_progress
)
732 return CAPI_ILLAPPNR
;
734 || !capi_cmd_valid(CAPIMSG_COMMAND(skb
->data
))
735 || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb
->data
)))
736 return CAPI_ILLCMDORSUBCMDORMSGTOSMALL
;
737 ctr
= get_capi_ctr_by_nr(CAPIMSG_CONTROLLER(skb
->data
));
738 if (!ctr
|| ctr
->state
!= CAPI_CTR_RUNNING
) {
739 ctr
= get_capi_ctr_by_nr(1); /* XXX why? */
740 if (!ctr
|| ctr
->state
!= CAPI_CTR_RUNNING
)
741 return CAPI_REGNOTINSTALLED
;
744 return CAPI_SENDQUEUEFULL
;
746 cmd
= CAPIMSG_COMMAND(skb
->data
);
747 subcmd
= CAPIMSG_SUBCOMMAND(skb
->data
);
749 if (cmd
== CAPI_DATA_B3
&& subcmd
== CAPI_REQ
) {
752 if (ctr
->traceflag
> 2)
760 showctl
|= (ctr
->traceflag
& 1);
763 printk(KERN_DEBUG
"kcapi: put [%03d] id#%d %s len=%u\n",
764 CAPIMSG_CONTROLLER(skb
->data
),
765 CAPIMSG_APPID(skb
->data
),
766 capi_cmd2str(cmd
, subcmd
),
767 CAPIMSG_LEN(skb
->data
));
769 _cdebbuf
*cdb
= capi_message2str(skb
->data
);
771 printk(KERN_DEBUG
"kcapi: put [%03d] %s\n",
772 CAPIMSG_CONTROLLER(skb
->data
),
776 printk(KERN_DEBUG
"kcapi: put [%03d] id#%d %s len=%u cannot trace\n",
777 CAPIMSG_CONTROLLER(skb
->data
),
778 CAPIMSG_APPID(skb
->data
),
779 capi_cmd2str(cmd
, subcmd
),
780 CAPIMSG_LEN(skb
->data
));
783 return ctr
->send_message(ctr
, skb
);
786 EXPORT_SYMBOL(capi20_put_message
);
789 * capi20_get_manufacturer() - CAPI 2.0 operation CAPI_GET_MANUFACTURER
790 * @contr: controller number.
791 * @buf: result buffer (64 bytes).
793 * Retrieve information about the manufacturer of the specified ISDN controller
794 * or (for @contr == 0) the driver itself.
795 * Return value: CAPI result code
798 u16
capi20_get_manufacturer(u32 contr
, u8
*buf
)
800 struct capi_ctr
*ctr
;
803 strlcpy(buf
, capi_manufakturer
, CAPI_MANUFACTURER_LEN
);
806 ctr
= get_capi_ctr_by_nr(contr
);
807 if (!ctr
|| ctr
->state
!= CAPI_CTR_RUNNING
)
808 return CAPI_REGNOTINSTALLED
;
809 strlcpy(buf
, ctr
->manu
, CAPI_MANUFACTURER_LEN
);
813 EXPORT_SYMBOL(capi20_get_manufacturer
);
816 * capi20_get_version() - CAPI 2.0 operation CAPI_GET_VERSION
817 * @contr: controller number.
818 * @verp: result structure.
820 * Retrieve version information for the specified ISDN controller
821 * or (for @contr == 0) the driver itself.
822 * Return value: CAPI result code
825 u16
capi20_get_version(u32 contr
, struct capi_version
*verp
)
827 struct capi_ctr
*ctr
;
830 *verp
= driver_version
;
833 ctr
= get_capi_ctr_by_nr(contr
);
834 if (!ctr
|| ctr
->state
!= CAPI_CTR_RUNNING
)
835 return CAPI_REGNOTINSTALLED
;
837 memcpy(verp
, &ctr
->version
, sizeof(capi_version
));
841 EXPORT_SYMBOL(capi20_get_version
);
844 * capi20_get_serial() - CAPI 2.0 operation CAPI_GET_SERIAL_NUMBER
845 * @contr: controller number.
846 * @serial: result buffer (8 bytes).
848 * Retrieve the serial number of the specified ISDN controller
849 * or (for @contr == 0) the driver itself.
850 * Return value: CAPI result code
853 u16
capi20_get_serial(u32 contr
, u8
*serial
)
855 struct capi_ctr
*ctr
;
858 strlcpy(serial
, driver_serial
, CAPI_SERIAL_LEN
);
861 ctr
= get_capi_ctr_by_nr(contr
);
862 if (!ctr
|| ctr
->state
!= CAPI_CTR_RUNNING
)
863 return CAPI_REGNOTINSTALLED
;
865 strlcpy(serial
, ctr
->serial
, CAPI_SERIAL_LEN
);
869 EXPORT_SYMBOL(capi20_get_serial
);
872 * capi20_get_profile() - CAPI 2.0 operation CAPI_GET_PROFILE
873 * @contr: controller number.
874 * @profp: result structure.
876 * Retrieve capability information for the specified ISDN controller
877 * or (for @contr == 0) the number of installed controllers.
878 * Return value: CAPI result code
881 u16
capi20_get_profile(u32 contr
, struct capi_profile
*profp
)
883 struct capi_ctr
*ctr
;
886 profp
->ncontroller
= ncontrollers
;
889 ctr
= get_capi_ctr_by_nr(contr
);
890 if (!ctr
|| ctr
->state
!= CAPI_CTR_RUNNING
)
891 return CAPI_REGNOTINSTALLED
;
893 memcpy(profp
, &ctr
->profile
, sizeof(struct capi_profile
));
897 EXPORT_SYMBOL(capi20_get_profile
);
900 static int old_capi_manufacturer(unsigned int cmd
, void __user
*data
)
902 avmb1_loadandconfigdef ldef
;
903 avmb1_extcarddef cdef
;
905 capicardparams cparams
;
906 struct capi_ctr
*ctr
;
907 struct capi_driver
*driver
= NULL
;
914 case AVMB1_ADDCARD_WITH_TYPE
:
915 if (cmd
== AVMB1_ADDCARD
) {
916 if ((retval
= copy_from_user(&cdef
, data
,
917 sizeof(avmb1_carddef
))))
919 cdef
.cardtype
= AVM_CARDTYPE_B1
;
921 if ((retval
= copy_from_user(&cdef
, data
,
922 sizeof(avmb1_extcarddef
))))
925 cparams
.port
= cdef
.port
;
926 cparams
.irq
= cdef
.irq
;
927 cparams
.cardnr
= cdef
.cardnr
;
929 mutex_lock(&capi_drivers_lock
);
931 switch (cdef
.cardtype
) {
932 case AVM_CARDTYPE_B1
:
933 list_for_each(l
, &capi_drivers
) {
934 driver
= list_entry(l
, struct capi_driver
, list
);
935 if (strcmp(driver
->name
, "b1isa") == 0)
939 case AVM_CARDTYPE_T1
:
940 list_for_each(l
, &capi_drivers
) {
941 driver
= list_entry(l
, struct capi_driver
, list
);
942 if (strcmp(driver
->name
, "t1isa") == 0)
951 printk(KERN_ERR
"kcapi: driver not loaded.\n");
953 } else if (!driver
->add_card
) {
954 printk(KERN_ERR
"kcapi: driver has no add card function.\n");
957 retval
= driver
->add_card(driver
, &cparams
);
959 mutex_unlock(&capi_drivers_lock
);
963 case AVMB1_LOAD_AND_CONFIG
:
965 if (cmd
== AVMB1_LOAD
) {
966 if (copy_from_user(&ldef
, data
,
967 sizeof(avmb1_loaddef
)))
969 ldef
.t4config
.len
= 0;
970 ldef
.t4config
.data
= NULL
;
972 if (copy_from_user(&ldef
, data
,
973 sizeof(avmb1_loadandconfigdef
)))
976 ctr
= get_capi_ctr_by_nr(ldef
.contr
);
979 ctr
= capi_ctr_get(ctr
);
982 if (ctr
->load_firmware
== NULL
) {
983 printk(KERN_DEBUG
"kcapi: load: no load function\n");
988 if (ldef
.t4file
.len
<= 0) {
989 printk(KERN_DEBUG
"kcapi: load: invalid parameter: length of t4file is %d ?\n", ldef
.t4file
.len
);
993 if (ldef
.t4file
.data
== NULL
) {
994 printk(KERN_DEBUG
"kcapi: load: invalid parameter: dataptr is 0\n");
999 ldata
.firmware
.user
= 1;
1000 ldata
.firmware
.data
= ldef
.t4file
.data
;
1001 ldata
.firmware
.len
= ldef
.t4file
.len
;
1002 ldata
.configuration
.user
= 1;
1003 ldata
.configuration
.data
= ldef
.t4config
.data
;
1004 ldata
.configuration
.len
= ldef
.t4config
.len
;
1006 if (ctr
->state
!= CAPI_CTR_DETECTED
) {
1007 printk(KERN_INFO
"kcapi: load: contr=%d not in detect state\n", ldef
.contr
);
1011 ctr
->state
= CAPI_CTR_LOADING
;
1013 retval
= ctr
->load_firmware(ctr
, &ldata
);
1016 ctr
->state
= CAPI_CTR_DETECTED
;
1021 while (ctr
->state
!= CAPI_CTR_RUNNING
) {
1023 msleep_interruptible(100); /* 0.1 sec */
1025 if (signal_pending(current
)) {
1033 case AVMB1_RESETCARD
:
1034 if (copy_from_user(&rdef
, data
, sizeof(avmb1_resetdef
)))
1036 ctr
= get_capi_ctr_by_nr(rdef
.contr
);
1040 if (ctr
->state
== CAPI_CTR_DETECTED
)
1043 ctr
->reset_ctr(ctr
);
1045 while (ctr
->state
> CAPI_CTR_DETECTED
) {
1047 msleep_interruptible(100); /* 0.1 sec */
1049 if (signal_pending(current
))
1060 * capi20_manufacturer() - CAPI 2.0 operation CAPI_MANUFACTURER
1064 * Perform manufacturer specific command.
1065 * Return value: CAPI result code
1068 int capi20_manufacturer(unsigned int cmd
, void __user
*data
)
1070 struct capi_ctr
*ctr
;
1075 case AVMB1_LOAD_AND_CONFIG
:
1076 case AVMB1_RESETCARD
:
1077 case AVMB1_GET_CARDINFO
:
1078 case AVMB1_REMOVECARD
:
1079 return old_capi_manufacturer(cmd
, data
);
1081 case KCAPI_CMD_TRACE
:
1085 if (copy_from_user(&fdef
, data
, sizeof(kcapi_flagdef
)))
1088 ctr
= get_capi_ctr_by_nr(fdef
.contr
);
1092 ctr
->traceflag
= fdef
.flag
;
1093 printk(KERN_INFO
"kcapi: contr [%03d] set trace=%d\n",
1094 ctr
->cnr
, ctr
->traceflag
);
1097 case KCAPI_CMD_ADDCARD
:
1099 struct list_head
*l
;
1100 struct capi_driver
*driver
= NULL
;
1101 capicardparams cparams
;
1105 if ((retval
= copy_from_user(&cdef
, data
, sizeof(cdef
))))
1108 cparams
.port
= cdef
.port
;
1109 cparams
.irq
= cdef
.irq
;
1110 cparams
.membase
= cdef
.membase
;
1111 cparams
.cardnr
= cdef
.cardnr
;
1112 cparams
.cardtype
= 0;
1113 cdef
.driver
[sizeof(cdef
.driver
)-1] = 0;
1115 mutex_lock(&capi_drivers_lock
);
1117 list_for_each(l
, &capi_drivers
) {
1118 driver
= list_entry(l
, struct capi_driver
, list
);
1119 if (strcmp(driver
->name
, cdef
.driver
) == 0)
1122 if (driver
== NULL
) {
1123 printk(KERN_ERR
"kcapi: driver \"%s\" not loaded.\n",
1126 } else if (!driver
->add_card
) {
1127 printk(KERN_ERR
"kcapi: driver \"%s\" has no add card function.\n", cdef
.driver
);
1130 retval
= driver
->add_card(driver
, &cparams
);
1132 mutex_unlock(&capi_drivers_lock
);
1137 printk(KERN_ERR
"kcapi: manufacturer command %d unknown.\n",
1145 EXPORT_SYMBOL(capi20_manufacturer
);
1147 /* ------------------------------------------------------------- */
1148 /* -------- Init & Cleanup ------------------------------------- */
1149 /* ------------------------------------------------------------- */
1152 * init / exit functions
1155 static struct notifier_block capictr_nb
= {
1156 .notifier_call
= notify_handler
,
1157 .priority
= INT_MAX
,
1160 static int __init
kcapi_init(void)
1164 register_capictr_notifier(&capictr_nb
);
1166 err
= cdebug_init();
1172 static void __exit
kcapi_exit(void)
1176 /* make sure all notifiers are finished */
1177 flush_scheduled_work();
1181 module_init(kcapi_init
);
1182 module_exit(kcapi_exit
);