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 <linux/slab.h>
31 #include <asm/uaccess.h>
32 #include <linux/isdn/capicmd.h>
33 #include <linux/isdn/capiutil.h>
35 #include <linux/b1lli.h>
37 #include <linux/mutex.h>
38 #include <linux/rcupdate.h>
40 static int showcapimsgs
= 0;
42 MODULE_DESCRIPTION("CAPI4Linux: kernel CAPI layer");
43 MODULE_AUTHOR("Carsten Paeth");
44 MODULE_LICENSE("GPL");
45 module_param(showcapimsgs
, uint
, 0);
47 /* ------------------------------------------------------------- */
49 struct capictr_event
{
50 struct work_struct work
;
55 /* ------------------------------------------------------------- */
57 static struct capi_version driver_version
= {2, 0, 1, 1<<4};
58 static char driver_serial
[CAPI_SERIAL_LEN
] = "0004711";
59 static char capi_manufakturer
[64] = "AVM Berlin";
61 #define NCCI2CTRL(ncci) (((ncci) >> 24) & 0x7f)
63 LIST_HEAD(capi_drivers
);
64 DEFINE_MUTEX(capi_drivers_lock
);
66 struct capi_ctr
*capi_controller
[CAPI_MAXCONTR
];
67 DEFINE_MUTEX(capi_controller_lock
);
69 struct capi20_appl
*capi_applications
[CAPI_MAXAPPL
];
71 static int ncontrollers
;
73 static BLOCKING_NOTIFIER_HEAD(ctr_notifier_list
);
75 /* -------- controller ref counting -------------------------------------- */
77 static inline struct capi_ctr
*
78 capi_ctr_get(struct capi_ctr
*ctr
)
80 if (!try_module_get(ctr
->owner
))
86 capi_ctr_put(struct capi_ctr
*ctr
)
88 module_put(ctr
->owner
);
91 /* ------------------------------------------------------------- */
93 static inline struct capi_ctr
*get_capi_ctr_by_nr(u16 contr
)
95 if (contr
- 1 >= CAPI_MAXCONTR
)
98 return capi_controller
[contr
- 1];
101 static inline struct capi20_appl
*__get_capi_appl_by_nr(u16 applid
)
103 lockdep_assert_held(&capi_controller_lock
);
105 if (applid
- 1 >= CAPI_MAXAPPL
)
108 return capi_applications
[applid
- 1];
111 static inline struct capi20_appl
*get_capi_appl_by_nr(u16 applid
)
113 if (applid
- 1 >= CAPI_MAXAPPL
)
116 return rcu_dereference(capi_applications
[applid
- 1]);
119 /* -------- util functions ------------------------------------ */
121 static inline int capi_cmd_valid(u8 cmd
)
126 case CAPI_CONNECT_ACTIVE
:
127 case CAPI_CONNECT_B3_ACTIVE
:
128 case CAPI_CONNECT_B3
:
129 case CAPI_CONNECT_B3_T90_ACTIVE
:
131 case CAPI_DISCONNECT_B3
:
132 case CAPI_DISCONNECT
:
136 case CAPI_MANUFACTURER
:
138 case CAPI_SELECT_B_PROTOCOL
:
144 static inline int capi_subcmd_valid(u8 subcmd
)
156 /* ------------------------------------------------------------ */
159 register_appl(struct capi_ctr
*ctr
, u16 applid
, capi_register_params
*rparam
)
161 ctr
= capi_ctr_get(ctr
);
164 ctr
->register_appl(ctr
, applid
, rparam
);
166 printk(KERN_WARNING
"%s: cannot get controller resources\n",
171 static void release_appl(struct capi_ctr
*ctr
, u16 applid
)
173 DBG("applid %#x", applid
);
175 ctr
->release_appl(ctr
, applid
);
179 static void notify_up(u32 contr
)
181 struct capi20_appl
*ap
;
182 struct capi_ctr
*ctr
;
185 mutex_lock(&capi_controller_lock
);
187 if (showcapimsgs
& 1)
188 printk(KERN_DEBUG
"kcapi: notify up contr %d\n", contr
);
190 ctr
= get_capi_ctr_by_nr(contr
);
192 if (ctr
->state
== CAPI_CTR_RUNNING
)
195 ctr
->state
= CAPI_CTR_RUNNING
;
197 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
198 ap
= __get_capi_appl_by_nr(applid
);
200 register_appl(ctr
, applid
, &ap
->rparam
);
203 wake_up_interruptible_all(&ctr
->state_wait_queue
);
205 printk(KERN_WARNING
"%s: invalid contr %d\n", __func__
, contr
);
208 mutex_unlock(&capi_controller_lock
);
211 static void ctr_down(struct capi_ctr
*ctr
, int new_state
)
213 struct capi20_appl
*ap
;
216 if (ctr
->state
== CAPI_CTR_DETECTED
|| ctr
->state
== CAPI_CTR_DETACHED
)
219 ctr
->state
= new_state
;
221 memset(ctr
->manu
, 0, sizeof(ctr
->manu
));
222 memset(&ctr
->version
, 0, sizeof(ctr
->version
));
223 memset(&ctr
->profile
, 0, sizeof(ctr
->profile
));
224 memset(ctr
->serial
, 0, sizeof(ctr
->serial
));
226 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
227 ap
= __get_capi_appl_by_nr(applid
);
232 wake_up_interruptible_all(&ctr
->state_wait_queue
);
235 static void notify_down(u32 contr
)
237 struct capi_ctr
*ctr
;
239 mutex_lock(&capi_controller_lock
);
241 if (showcapimsgs
& 1)
242 printk(KERN_DEBUG
"kcapi: notify down contr %d\n", contr
);
244 ctr
= get_capi_ctr_by_nr(contr
);
246 ctr_down(ctr
, CAPI_CTR_DETECTED
);
248 printk(KERN_WARNING
"%s: invalid contr %d\n", __func__
, contr
);
250 mutex_unlock(&capi_controller_lock
);
254 notify_handler(struct notifier_block
*nb
, unsigned long val
, void *v
)
269 static void do_notify_work(struct work_struct
*work
)
271 struct capictr_event
*event
=
272 container_of(work
, struct capictr_event
, work
);
274 blocking_notifier_call_chain(&ctr_notifier_list
, event
->type
,
275 (void *)(long)event
->controller
);
280 * The notifier will result in adding/deleteing of devices. Devices can
281 * only removed in user process, not in bh.
283 static int notify_push(unsigned int event_type
, u32 controller
)
285 struct capictr_event
*event
= kmalloc(sizeof(*event
), GFP_ATOMIC
);
290 INIT_WORK(&event
->work
, do_notify_work
);
291 event
->type
= event_type
;
292 event
->controller
= controller
;
294 schedule_work(&event
->work
);
298 int register_capictr_notifier(struct notifier_block
*nb
)
300 return blocking_notifier_chain_register(&ctr_notifier_list
, nb
);
302 EXPORT_SYMBOL_GPL(register_capictr_notifier
);
304 int unregister_capictr_notifier(struct notifier_block
*nb
)
306 return blocking_notifier_chain_unregister(&ctr_notifier_list
, nb
);
308 EXPORT_SYMBOL_GPL(unregister_capictr_notifier
);
310 /* -------- Receiver ------------------------------------------ */
312 static void recv_handler(struct work_struct
*work
)
315 struct capi20_appl
*ap
=
316 container_of(work
, struct capi20_appl
, recv_work
);
318 if ((!ap
) || (ap
->release_in_progress
))
321 mutex_lock(&ap
->recv_mtx
);
322 while ((skb
= skb_dequeue(&ap
->recv_queue
))) {
323 if (CAPIMSG_CMD(skb
->data
) == CAPI_DATA_B3_IND
)
328 ap
->recv_message(ap
, skb
);
330 mutex_unlock(&ap
->recv_mtx
);
334 * capi_ctr_handle_message() - handle incoming CAPI message
335 * @ctr: controller descriptor structure.
336 * @appl: application ID.
339 * Called by hardware driver to pass a CAPI message to the application.
342 void capi_ctr_handle_message(struct capi_ctr
*ctr
, u16 appl
,
345 struct capi20_appl
*ap
;
350 if (ctr
->state
!= CAPI_CTR_RUNNING
) {
351 cdb
= capi_message2str(skb
->data
);
353 printk(KERN_INFO
"kcapi: controller [%03d] not active, got: %s",
357 printk(KERN_INFO
"kcapi: controller [%03d] not active, cannot trace\n",
362 cmd
= CAPIMSG_COMMAND(skb
->data
);
363 subcmd
= CAPIMSG_SUBCOMMAND(skb
->data
);
364 if (cmd
== CAPI_DATA_B3
&& subcmd
== CAPI_IND
) {
366 if (ctr
->traceflag
> 2)
373 showctl
|= (ctr
->traceflag
& 1);
376 printk(KERN_DEBUG
"kcapi: got [%03d] id#%d %s len=%u\n",
377 ctr
->cnr
, CAPIMSG_APPID(skb
->data
),
378 capi_cmd2str(cmd
, subcmd
),
379 CAPIMSG_LEN(skb
->data
));
381 cdb
= capi_message2str(skb
->data
);
383 printk(KERN_DEBUG
"kcapi: got [%03d] %s\n",
387 printk(KERN_DEBUG
"kcapi: got [%03d] id#%d %s len=%u, cannot trace\n",
388 ctr
->cnr
, CAPIMSG_APPID(skb
->data
),
389 capi_cmd2str(cmd
, subcmd
),
390 CAPIMSG_LEN(skb
->data
));
396 ap
= get_capi_appl_by_nr(CAPIMSG_APPID(skb
->data
));
399 cdb
= capi_message2str(skb
->data
);
401 printk(KERN_ERR
"kcapi: handle_message: applid %d state released (%s)\n",
402 CAPIMSG_APPID(skb
->data
), cdb
->buf
);
405 printk(KERN_ERR
"kcapi: handle_message: applid %d state released (%s) cannot trace\n",
406 CAPIMSG_APPID(skb
->data
),
407 capi_cmd2str(cmd
, subcmd
));
410 skb_queue_tail(&ap
->recv_queue
, skb
);
411 schedule_work(&ap
->recv_work
);
420 EXPORT_SYMBOL(capi_ctr_handle_message
);
423 * capi_ctr_ready() - signal CAPI controller ready
424 * @ctr: controller descriptor structure.
426 * Called by hardware driver to signal that the controller is up and running.
429 void capi_ctr_ready(struct capi_ctr
*ctr
)
431 printk(KERN_NOTICE
"kcapi: controller [%03d] \"%s\" ready.\n",
432 ctr
->cnr
, ctr
->name
);
434 notify_push(CAPICTR_UP
, ctr
->cnr
);
437 EXPORT_SYMBOL(capi_ctr_ready
);
440 * capi_ctr_down() - signal CAPI controller not ready
441 * @ctr: controller descriptor structure.
443 * Called by hardware driver to signal that the controller is down and
444 * unavailable for use.
447 void capi_ctr_down(struct capi_ctr
*ctr
)
449 printk(KERN_NOTICE
"kcapi: controller [%03d] down.\n", ctr
->cnr
);
451 notify_push(CAPICTR_DOWN
, ctr
->cnr
);
454 EXPORT_SYMBOL(capi_ctr_down
);
457 * capi_ctr_suspend_output() - suspend controller
458 * @ctr: controller descriptor structure.
460 * Called by hardware driver to stop data flow.
462 * Note: The caller is responsible for synchronizing concurrent state changes
463 * as well as invocations of capi_ctr_handle_message.
466 void capi_ctr_suspend_output(struct capi_ctr
*ctr
)
469 printk(KERN_DEBUG
"kcapi: controller [%03d] suspend\n",
475 EXPORT_SYMBOL(capi_ctr_suspend_output
);
478 * capi_ctr_resume_output() - resume controller
479 * @ctr: controller descriptor structure.
481 * Called by hardware driver to resume data flow.
483 * Note: The caller is responsible for synchronizing concurrent state changes
484 * as well as invocations of capi_ctr_handle_message.
487 void capi_ctr_resume_output(struct capi_ctr
*ctr
)
490 printk(KERN_DEBUG
"kcapi: controller [%03d] resumed\n",
496 EXPORT_SYMBOL(capi_ctr_resume_output
);
498 /* ------------------------------------------------------------- */
501 * attach_capi_ctr() - register CAPI controller
502 * @ctr: controller descriptor structure.
504 * Called by hardware driver to register a controller with the CAPI subsystem.
505 * Return value: 0 on success, error code < 0 on error
508 int attach_capi_ctr(struct capi_ctr
*ctr
)
512 mutex_lock(&capi_controller_lock
);
514 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
515 if (!capi_controller
[i
])
518 if (i
== CAPI_MAXCONTR
) {
519 mutex_unlock(&capi_controller_lock
);
520 printk(KERN_ERR
"kcapi: out of controller slots\n");
523 capi_controller
[i
] = ctr
;
525 ctr
->nrecvctlpkt
= 0;
526 ctr
->nrecvdatapkt
= 0;
527 ctr
->nsentctlpkt
= 0;
528 ctr
->nsentdatapkt
= 0;
530 ctr
->state
= CAPI_CTR_DETECTED
;
532 ctr
->traceflag
= showcapimsgs
;
533 init_waitqueue_head(&ctr
->state_wait_queue
);
535 sprintf(ctr
->procfn
, "capi/controllers/%d", ctr
->cnr
);
536 ctr
->procent
= proc_create_data(ctr
->procfn
, 0, NULL
, ctr
->proc_fops
, ctr
);
540 mutex_unlock(&capi_controller_lock
);
542 printk(KERN_NOTICE
"kcapi: controller [%03d]: %s attached\n",
543 ctr
->cnr
, ctr
->name
);
547 EXPORT_SYMBOL(attach_capi_ctr
);
550 * detach_capi_ctr() - unregister CAPI controller
551 * @ctr: controller descriptor structure.
553 * Called by hardware driver to remove the registration of a controller
554 * with the CAPI subsystem.
555 * Return value: 0 on success, error code < 0 on error
558 int detach_capi_ctr(struct capi_ctr
*ctr
)
562 mutex_lock(&capi_controller_lock
);
564 ctr_down(ctr
, CAPI_CTR_DETACHED
);
566 if (capi_controller
[ctr
->cnr
- 1] != ctr
) {
570 capi_controller
[ctr
->cnr
- 1] = NULL
;
574 remove_proc_entry(ctr
->procfn
, NULL
);
576 printk(KERN_NOTICE
"kcapi: controller [%03d]: %s unregistered\n",
577 ctr
->cnr
, ctr
->name
);
580 mutex_unlock(&capi_controller_lock
);
585 EXPORT_SYMBOL(detach_capi_ctr
);
588 * register_capi_driver() - register CAPI driver
589 * @driver: driver descriptor structure.
591 * Called by hardware driver to register itself with the CAPI subsystem.
594 void register_capi_driver(struct capi_driver
*driver
)
596 mutex_lock(&capi_drivers_lock
);
597 list_add_tail(&driver
->list
, &capi_drivers
);
598 mutex_unlock(&capi_drivers_lock
);
601 EXPORT_SYMBOL(register_capi_driver
);
604 * unregister_capi_driver() - unregister CAPI driver
605 * @driver: driver descriptor structure.
607 * Called by hardware driver to unregister itself from the CAPI subsystem.
610 void unregister_capi_driver(struct capi_driver
*driver
)
612 mutex_lock(&capi_drivers_lock
);
613 list_del(&driver
->list
);
614 mutex_unlock(&capi_drivers_lock
);
617 EXPORT_SYMBOL(unregister_capi_driver
);
619 /* ------------------------------------------------------------- */
620 /* -------- CAPI2.0 Interface ---------------------------------- */
621 /* ------------------------------------------------------------- */
624 * capi20_isinstalled() - CAPI 2.0 operation CAPI_INSTALLED
626 * Return value: CAPI result code (CAPI_NOERROR if at least one ISDN controller
627 * is ready for use, CAPI_REGNOTINSTALLED otherwise)
630 u16
capi20_isinstalled(void)
632 u16 ret
= CAPI_REGNOTINSTALLED
;
635 mutex_lock(&capi_controller_lock
);
637 for (i
= 0; i
< CAPI_MAXCONTR
; i
++)
638 if (capi_controller
[i
] &&
639 capi_controller
[i
]->state
== CAPI_CTR_RUNNING
) {
644 mutex_unlock(&capi_controller_lock
);
649 EXPORT_SYMBOL(capi20_isinstalled
);
652 * capi20_register() - CAPI 2.0 operation CAPI_REGISTER
653 * @ap: CAPI application descriptor structure.
655 * Register an application's presence with CAPI.
656 * A unique application ID is assigned and stored in @ap->applid.
657 * After this function returns successfully, the message receive
658 * callback function @ap->recv_message() may be called at any time
659 * until capi20_release() has been called for the same @ap.
660 * Return value: CAPI result code
663 u16
capi20_register(struct capi20_appl
*ap
)
670 if (ap
->rparam
.datablklen
< 128)
671 return CAPI_LOGBLKSIZETOSMALL
;
674 ap
->nrecvdatapkt
= 0;
676 ap
->nsentdatapkt
= 0;
677 mutex_init(&ap
->recv_mtx
);
678 skb_queue_head_init(&ap
->recv_queue
);
679 INIT_WORK(&ap
->recv_work
, recv_handler
);
680 ap
->release_in_progress
= 0;
682 mutex_lock(&capi_controller_lock
);
684 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
685 if (capi_applications
[applid
- 1] == NULL
)
688 if (applid
> CAPI_MAXAPPL
) {
689 mutex_unlock(&capi_controller_lock
);
690 return CAPI_TOOMANYAPPLS
;
694 capi_applications
[applid
- 1] = ap
;
696 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
697 if (!capi_controller
[i
] ||
698 capi_controller
[i
]->state
!= CAPI_CTR_RUNNING
)
700 register_appl(capi_controller
[i
], applid
, &ap
->rparam
);
703 mutex_unlock(&capi_controller_lock
);
705 if (showcapimsgs
& 1) {
706 printk(KERN_DEBUG
"kcapi: appl %d up\n", applid
);
712 EXPORT_SYMBOL(capi20_register
);
715 * capi20_release() - CAPI 2.0 operation CAPI_RELEASE
716 * @ap: CAPI application descriptor structure.
718 * Terminate an application's registration with CAPI.
719 * After this function returns successfully, the message receive
720 * callback function @ap->recv_message() will no longer be called.
721 * Return value: CAPI result code
724 u16
capi20_release(struct capi20_appl
*ap
)
728 DBG("applid %#x", ap
->applid
);
730 mutex_lock(&capi_controller_lock
);
732 ap
->release_in_progress
= 1;
733 capi_applications
[ap
->applid
- 1] = NULL
;
737 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
738 if (!capi_controller
[i
] ||
739 capi_controller
[i
]->state
!= CAPI_CTR_RUNNING
)
741 release_appl(capi_controller
[i
], ap
->applid
);
744 mutex_unlock(&capi_controller_lock
);
746 flush_scheduled_work();
747 skb_queue_purge(&ap
->recv_queue
);
749 if (showcapimsgs
& 1) {
750 printk(KERN_DEBUG
"kcapi: appl %d down\n", ap
->applid
);
756 EXPORT_SYMBOL(capi20_release
);
759 * capi20_put_message() - CAPI 2.0 operation CAPI_PUT_MESSAGE
760 * @ap: CAPI application descriptor structure.
761 * @skb: CAPI message.
763 * Transfer a single message to CAPI.
764 * Return value: CAPI result code
767 u16
capi20_put_message(struct capi20_appl
*ap
, struct sk_buff
*skb
)
769 struct capi_ctr
*ctr
;
773 DBG("applid %#x", ap
->applid
);
775 if (ncontrollers
== 0)
776 return CAPI_REGNOTINSTALLED
;
777 if ((ap
->applid
== 0) || ap
->release_in_progress
)
778 return CAPI_ILLAPPNR
;
780 || !capi_cmd_valid(CAPIMSG_COMMAND(skb
->data
))
781 || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb
->data
)))
782 return CAPI_ILLCMDORSUBCMDORMSGTOSMALL
;
785 * The controller reference is protected by the existence of the
786 * application passed to us. We assume that the caller properly
787 * synchronizes this service with capi20_release.
789 ctr
= get_capi_ctr_by_nr(CAPIMSG_CONTROLLER(skb
->data
));
790 if (!ctr
|| ctr
->state
!= CAPI_CTR_RUNNING
)
791 return CAPI_REGNOTINSTALLED
;
793 return CAPI_SENDQUEUEFULL
;
795 cmd
= CAPIMSG_COMMAND(skb
->data
);
796 subcmd
= CAPIMSG_SUBCOMMAND(skb
->data
);
798 if (cmd
== CAPI_DATA_B3
&& subcmd
== CAPI_REQ
) {
801 if (ctr
->traceflag
> 2)
809 showctl
|= (ctr
->traceflag
& 1);
812 printk(KERN_DEBUG
"kcapi: put [%03d] id#%d %s len=%u\n",
813 CAPIMSG_CONTROLLER(skb
->data
),
814 CAPIMSG_APPID(skb
->data
),
815 capi_cmd2str(cmd
, subcmd
),
816 CAPIMSG_LEN(skb
->data
));
818 _cdebbuf
*cdb
= capi_message2str(skb
->data
);
820 printk(KERN_DEBUG
"kcapi: put [%03d] %s\n",
821 CAPIMSG_CONTROLLER(skb
->data
),
825 printk(KERN_DEBUG
"kcapi: put [%03d] id#%d %s len=%u cannot trace\n",
826 CAPIMSG_CONTROLLER(skb
->data
),
827 CAPIMSG_APPID(skb
->data
),
828 capi_cmd2str(cmd
, subcmd
),
829 CAPIMSG_LEN(skb
->data
));
832 return ctr
->send_message(ctr
, skb
);
835 EXPORT_SYMBOL(capi20_put_message
);
838 * capi20_get_manufacturer() - CAPI 2.0 operation CAPI_GET_MANUFACTURER
839 * @contr: controller number.
840 * @buf: result buffer (64 bytes).
842 * Retrieve information about the manufacturer of the specified ISDN controller
843 * or (for @contr == 0) the driver itself.
844 * Return value: CAPI result code
847 u16
capi20_get_manufacturer(u32 contr
, u8
*buf
)
849 struct capi_ctr
*ctr
;
853 strlcpy(buf
, capi_manufakturer
, CAPI_MANUFACTURER_LEN
);
857 mutex_lock(&capi_controller_lock
);
859 ctr
= get_capi_ctr_by_nr(contr
);
860 if (ctr
&& ctr
->state
== CAPI_CTR_RUNNING
) {
861 strlcpy(buf
, ctr
->manu
, CAPI_MANUFACTURER_LEN
);
864 ret
= CAPI_REGNOTINSTALLED
;
866 mutex_unlock(&capi_controller_lock
);
870 EXPORT_SYMBOL(capi20_get_manufacturer
);
873 * capi20_get_version() - CAPI 2.0 operation CAPI_GET_VERSION
874 * @contr: controller number.
875 * @verp: result structure.
877 * Retrieve version information for the specified ISDN controller
878 * or (for @contr == 0) the driver itself.
879 * Return value: CAPI result code
882 u16
capi20_get_version(u32 contr
, struct capi_version
*verp
)
884 struct capi_ctr
*ctr
;
888 *verp
= driver_version
;
892 mutex_lock(&capi_controller_lock
);
894 ctr
= get_capi_ctr_by_nr(contr
);
895 if (ctr
&& ctr
->state
== CAPI_CTR_RUNNING
) {
896 memcpy(verp
, &ctr
->version
, sizeof(capi_version
));
899 ret
= CAPI_REGNOTINSTALLED
;
901 mutex_unlock(&capi_controller_lock
);
905 EXPORT_SYMBOL(capi20_get_version
);
908 * capi20_get_serial() - CAPI 2.0 operation CAPI_GET_SERIAL_NUMBER
909 * @contr: controller number.
910 * @serial: result buffer (8 bytes).
912 * Retrieve the serial number of the specified ISDN controller
913 * or (for @contr == 0) the driver itself.
914 * Return value: CAPI result code
917 u16
capi20_get_serial(u32 contr
, u8
*serial
)
919 struct capi_ctr
*ctr
;
923 strlcpy(serial
, driver_serial
, CAPI_SERIAL_LEN
);
927 mutex_lock(&capi_controller_lock
);
929 ctr
= get_capi_ctr_by_nr(contr
);
930 if (ctr
&& ctr
->state
== CAPI_CTR_RUNNING
) {
931 strlcpy(serial
, ctr
->serial
, CAPI_SERIAL_LEN
);
934 ret
= CAPI_REGNOTINSTALLED
;
936 mutex_unlock(&capi_controller_lock
);
940 EXPORT_SYMBOL(capi20_get_serial
);
943 * capi20_get_profile() - CAPI 2.0 operation CAPI_GET_PROFILE
944 * @contr: controller number.
945 * @profp: result structure.
947 * Retrieve capability information for the specified ISDN controller
948 * or (for @contr == 0) the number of installed controllers.
949 * Return value: CAPI result code
952 u16
capi20_get_profile(u32 contr
, struct capi_profile
*profp
)
954 struct capi_ctr
*ctr
;
958 profp
->ncontroller
= ncontrollers
;
962 mutex_lock(&capi_controller_lock
);
964 ctr
= get_capi_ctr_by_nr(contr
);
965 if (ctr
&& ctr
->state
== CAPI_CTR_RUNNING
) {
966 memcpy(profp
, &ctr
->profile
, sizeof(struct capi_profile
));
969 ret
= CAPI_REGNOTINSTALLED
;
971 mutex_unlock(&capi_controller_lock
);
975 EXPORT_SYMBOL(capi20_get_profile
);
977 /* Must be called with capi_controller_lock held. */
978 static int wait_on_ctr_state(struct capi_ctr
*ctr
, unsigned int state
)
983 ctr
= capi_ctr_get(ctr
);
988 prepare_to_wait(&ctr
->state_wait_queue
, &wait
,
991 if (ctr
->state
== state
)
993 if (ctr
->state
== CAPI_CTR_DETACHED
) {
997 if (signal_pending(current
)) {
1002 mutex_unlock(&capi_controller_lock
);
1004 mutex_lock(&capi_controller_lock
);
1006 finish_wait(&ctr
->state_wait_queue
, &wait
);
1014 static int old_capi_manufacturer(unsigned int cmd
, void __user
*data
)
1016 avmb1_loadandconfigdef ldef
;
1017 avmb1_extcarddef cdef
;
1018 avmb1_resetdef rdef
;
1019 capicardparams cparams
;
1020 struct capi_ctr
*ctr
;
1021 struct capi_driver
*driver
= NULL
;
1023 struct list_head
*l
;
1028 case AVMB1_ADDCARD_WITH_TYPE
:
1029 if (cmd
== AVMB1_ADDCARD
) {
1030 if ((retval
= copy_from_user(&cdef
, data
,
1031 sizeof(avmb1_carddef
))))
1033 cdef
.cardtype
= AVM_CARDTYPE_B1
;
1035 if ((retval
= copy_from_user(&cdef
, data
,
1036 sizeof(avmb1_extcarddef
))))
1039 cparams
.port
= cdef
.port
;
1040 cparams
.irq
= cdef
.irq
;
1041 cparams
.cardnr
= cdef
.cardnr
;
1043 mutex_lock(&capi_drivers_lock
);
1045 switch (cdef
.cardtype
) {
1046 case AVM_CARDTYPE_B1
:
1047 list_for_each(l
, &capi_drivers
) {
1048 driver
= list_entry(l
, struct capi_driver
, list
);
1049 if (strcmp(driver
->name
, "b1isa") == 0)
1053 case AVM_CARDTYPE_T1
:
1054 list_for_each(l
, &capi_drivers
) {
1055 driver
= list_entry(l
, struct capi_driver
, list
);
1056 if (strcmp(driver
->name
, "t1isa") == 0)
1065 printk(KERN_ERR
"kcapi: driver not loaded.\n");
1067 } else if (!driver
->add_card
) {
1068 printk(KERN_ERR
"kcapi: driver has no add card function.\n");
1071 retval
= driver
->add_card(driver
, &cparams
);
1073 mutex_unlock(&capi_drivers_lock
);
1077 case AVMB1_LOAD_AND_CONFIG
:
1079 if (cmd
== AVMB1_LOAD
) {
1080 if (copy_from_user(&ldef
, data
,
1081 sizeof(avmb1_loaddef
)))
1083 ldef
.t4config
.len
= 0;
1084 ldef
.t4config
.data
= NULL
;
1086 if (copy_from_user(&ldef
, data
,
1087 sizeof(avmb1_loadandconfigdef
)))
1091 mutex_lock(&capi_controller_lock
);
1093 ctr
= get_capi_ctr_by_nr(ldef
.contr
);
1096 goto load_unlock_out
;
1099 if (ctr
->load_firmware
== NULL
) {
1100 printk(KERN_DEBUG
"kcapi: load: no load function\n");
1102 goto load_unlock_out
;
1105 if (ldef
.t4file
.len
<= 0) {
1106 printk(KERN_DEBUG
"kcapi: load: invalid parameter: length of t4file is %d ?\n", ldef
.t4file
.len
);
1108 goto load_unlock_out
;
1110 if (ldef
.t4file
.data
== NULL
) {
1111 printk(KERN_DEBUG
"kcapi: load: invalid parameter: dataptr is 0\n");
1113 goto load_unlock_out
;
1116 ldata
.firmware
.user
= 1;
1117 ldata
.firmware
.data
= ldef
.t4file
.data
;
1118 ldata
.firmware
.len
= ldef
.t4file
.len
;
1119 ldata
.configuration
.user
= 1;
1120 ldata
.configuration
.data
= ldef
.t4config
.data
;
1121 ldata
.configuration
.len
= ldef
.t4config
.len
;
1123 if (ctr
->state
!= CAPI_CTR_DETECTED
) {
1124 printk(KERN_INFO
"kcapi: load: contr=%d not in detect state\n", ldef
.contr
);
1126 goto load_unlock_out
;
1128 ctr
->state
= CAPI_CTR_LOADING
;
1130 retval
= ctr
->load_firmware(ctr
, &ldata
);
1132 ctr
->state
= CAPI_CTR_DETECTED
;
1133 goto load_unlock_out
;
1136 retval
= wait_on_ctr_state(ctr
, CAPI_CTR_RUNNING
);
1139 mutex_unlock(&capi_controller_lock
);
1142 case AVMB1_RESETCARD
:
1143 if (copy_from_user(&rdef
, data
, sizeof(avmb1_resetdef
)))
1148 mutex_lock(&capi_controller_lock
);
1150 ctr
= get_capi_ctr_by_nr(rdef
.contr
);
1153 goto reset_unlock_out
;
1156 if (ctr
->state
== CAPI_CTR_DETECTED
)
1157 goto reset_unlock_out
;
1159 if (ctr
->reset_ctr
== NULL
) {
1160 printk(KERN_DEBUG
"kcapi: reset: no reset function\n");
1162 goto reset_unlock_out
;
1165 ctr
->reset_ctr(ctr
);
1167 retval
= wait_on_ctr_state(ctr
, CAPI_CTR_DETECTED
);
1170 mutex_unlock(&capi_controller_lock
);
1178 * capi20_manufacturer() - CAPI 2.0 operation CAPI_MANUFACTURER
1182 * Perform manufacturer specific command.
1183 * Return value: CAPI result code
1186 int capi20_manufacturer(unsigned int cmd
, void __user
*data
)
1188 struct capi_ctr
*ctr
;
1194 case AVMB1_LOAD_AND_CONFIG
:
1195 case AVMB1_RESETCARD
:
1196 case AVMB1_GET_CARDINFO
:
1197 case AVMB1_REMOVECARD
:
1198 return old_capi_manufacturer(cmd
, data
);
1200 case KCAPI_CMD_TRACE
:
1204 if (copy_from_user(&fdef
, data
, sizeof(kcapi_flagdef
)))
1207 mutex_lock(&capi_controller_lock
);
1209 ctr
= get_capi_ctr_by_nr(fdef
.contr
);
1211 ctr
->traceflag
= fdef
.flag
;
1212 printk(KERN_INFO
"kcapi: contr [%03d] set trace=%d\n",
1213 ctr
->cnr
, ctr
->traceflag
);
1218 mutex_unlock(&capi_controller_lock
);
1222 case KCAPI_CMD_ADDCARD
:
1224 struct list_head
*l
;
1225 struct capi_driver
*driver
= NULL
;
1226 capicardparams cparams
;
1229 if ((retval
= copy_from_user(&cdef
, data
, sizeof(cdef
))))
1232 cparams
.port
= cdef
.port
;
1233 cparams
.irq
= cdef
.irq
;
1234 cparams
.membase
= cdef
.membase
;
1235 cparams
.cardnr
= cdef
.cardnr
;
1236 cparams
.cardtype
= 0;
1237 cdef
.driver
[sizeof(cdef
.driver
)-1] = 0;
1239 mutex_lock(&capi_drivers_lock
);
1241 list_for_each(l
, &capi_drivers
) {
1242 driver
= list_entry(l
, struct capi_driver
, list
);
1243 if (strcmp(driver
->name
, cdef
.driver
) == 0)
1246 if (driver
== NULL
) {
1247 printk(KERN_ERR
"kcapi: driver \"%s\" not loaded.\n",
1250 } else if (!driver
->add_card
) {
1251 printk(KERN_ERR
"kcapi: driver \"%s\" has no add card function.\n", cdef
.driver
);
1254 retval
= driver
->add_card(driver
, &cparams
);
1256 mutex_unlock(&capi_drivers_lock
);
1261 printk(KERN_ERR
"kcapi: manufacturer command %d unknown.\n",
1269 EXPORT_SYMBOL(capi20_manufacturer
);
1271 /* ------------------------------------------------------------- */
1272 /* -------- Init & Cleanup ------------------------------------- */
1273 /* ------------------------------------------------------------- */
1276 * init / exit functions
1279 static struct notifier_block capictr_nb
= {
1280 .notifier_call
= notify_handler
,
1281 .priority
= INT_MAX
,
1284 static int __init
kcapi_init(void)
1288 register_capictr_notifier(&capictr_nb
);
1290 err
= cdebug_init();
1296 static void __exit
kcapi_exit(void)
1300 /* make sure all notifiers are finished */
1301 flush_scheduled_work();
1305 module_init(kcapi_init
);
1306 module_exit(kcapi_exit
);