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/signal.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 <linux/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;
41 static struct workqueue_struct
*kcapi_wq
;
43 MODULE_DESCRIPTION("CAPI4Linux: kernel CAPI layer");
44 MODULE_AUTHOR("Carsten Paeth");
45 MODULE_LICENSE("GPL");
46 module_param(showcapimsgs
, uint
, 0);
48 /* ------------------------------------------------------------- */
50 struct capictr_event
{
51 struct work_struct work
;
56 /* ------------------------------------------------------------- */
58 static const struct capi_version driver_version
= {2, 0, 1, 1 << 4};
59 static char driver_serial
[CAPI_SERIAL_LEN
] = "0004711";
60 static char capi_manufakturer
[64] = "AVM Berlin";
62 #define NCCI2CTRL(ncci) (((ncci) >> 24) & 0x7f)
64 LIST_HEAD(capi_drivers
);
65 DEFINE_MUTEX(capi_drivers_lock
);
67 struct capi_ctr
*capi_controller
[CAPI_MAXCONTR
];
68 DEFINE_MUTEX(capi_controller_lock
);
70 struct capi20_appl
*capi_applications
[CAPI_MAXAPPL
];
72 static int ncontrollers
;
74 static BLOCKING_NOTIFIER_HEAD(ctr_notifier_list
);
76 /* -------- controller ref counting -------------------------------------- */
78 static inline struct capi_ctr
*
79 capi_ctr_get(struct capi_ctr
*ctr
)
81 if (!try_module_get(ctr
->owner
))
87 capi_ctr_put(struct capi_ctr
*ctr
)
89 module_put(ctr
->owner
);
92 /* ------------------------------------------------------------- */
94 static inline struct capi_ctr
*get_capi_ctr_by_nr(u16 contr
)
96 if (contr
< 1 || contr
- 1 >= CAPI_MAXCONTR
)
99 return capi_controller
[contr
- 1];
102 static inline struct capi20_appl
*__get_capi_appl_by_nr(u16 applid
)
104 lockdep_assert_held(&capi_controller_lock
);
106 if (applid
< 1 || applid
- 1 >= CAPI_MAXAPPL
)
109 return capi_applications
[applid
- 1];
112 static inline struct capi20_appl
*get_capi_appl_by_nr(u16 applid
)
114 if (applid
< 1 || applid
- 1 >= CAPI_MAXAPPL
)
117 return rcu_dereference(capi_applications
[applid
- 1]);
120 /* -------- util functions ------------------------------------ */
122 static inline int capi_cmd_valid(u8 cmd
)
127 case CAPI_CONNECT_ACTIVE
:
128 case CAPI_CONNECT_B3_ACTIVE
:
129 case CAPI_CONNECT_B3
:
130 case CAPI_CONNECT_B3_T90_ACTIVE
:
132 case CAPI_DISCONNECT_B3
:
133 case CAPI_DISCONNECT
:
137 case CAPI_MANUFACTURER
:
139 case CAPI_SELECT_B_PROTOCOL
:
145 static inline int capi_subcmd_valid(u8 subcmd
)
157 /* ------------------------------------------------------------ */
160 register_appl(struct capi_ctr
*ctr
, u16 applid
, capi_register_params
*rparam
)
162 ctr
= capi_ctr_get(ctr
);
165 ctr
->register_appl(ctr
, applid
, rparam
);
167 printk(KERN_WARNING
"%s: cannot get controller resources\n",
172 static void release_appl(struct capi_ctr
*ctr
, u16 applid
)
174 DBG("applid %#x", applid
);
176 ctr
->release_appl(ctr
, applid
);
180 static void notify_up(u32 contr
)
182 struct capi20_appl
*ap
;
183 struct capi_ctr
*ctr
;
186 mutex_lock(&capi_controller_lock
);
188 if (showcapimsgs
& 1)
189 printk(KERN_DEBUG
"kcapi: notify up contr %d\n", contr
);
191 ctr
= get_capi_ctr_by_nr(contr
);
193 if (ctr
->state
== CAPI_CTR_RUNNING
)
196 ctr
->state
= CAPI_CTR_RUNNING
;
198 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
199 ap
= __get_capi_appl_by_nr(applid
);
201 register_appl(ctr
, applid
, &ap
->rparam
);
204 wake_up_interruptible_all(&ctr
->state_wait_queue
);
206 printk(KERN_WARNING
"%s: invalid contr %d\n", __func__
, contr
);
209 mutex_unlock(&capi_controller_lock
);
212 static void ctr_down(struct capi_ctr
*ctr
, int new_state
)
214 struct capi20_appl
*ap
;
217 if (ctr
->state
== CAPI_CTR_DETECTED
|| ctr
->state
== CAPI_CTR_DETACHED
)
220 ctr
->state
= new_state
;
222 memset(ctr
->manu
, 0, sizeof(ctr
->manu
));
223 memset(&ctr
->version
, 0, sizeof(ctr
->version
));
224 memset(&ctr
->profile
, 0, sizeof(ctr
->profile
));
225 memset(ctr
->serial
, 0, sizeof(ctr
->serial
));
227 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
228 ap
= __get_capi_appl_by_nr(applid
);
233 wake_up_interruptible_all(&ctr
->state_wait_queue
);
236 static void notify_down(u32 contr
)
238 struct capi_ctr
*ctr
;
240 mutex_lock(&capi_controller_lock
);
242 if (showcapimsgs
& 1)
243 printk(KERN_DEBUG
"kcapi: notify down contr %d\n", contr
);
245 ctr
= get_capi_ctr_by_nr(contr
);
247 ctr_down(ctr
, CAPI_CTR_DETECTED
);
249 printk(KERN_WARNING
"%s: invalid contr %d\n", __func__
, contr
);
251 mutex_unlock(&capi_controller_lock
);
255 notify_handler(struct notifier_block
*nb
, unsigned long val
, void *v
)
270 static void do_notify_work(struct work_struct
*work
)
272 struct capictr_event
*event
=
273 container_of(work
, struct capictr_event
, work
);
275 blocking_notifier_call_chain(&ctr_notifier_list
, event
->type
,
276 (void *)(long)event
->controller
);
281 * The notifier will result in adding/deleteing of devices. Devices can
282 * only removed in user process, not in bh.
284 static int notify_push(unsigned int event_type
, u32 controller
)
286 struct capictr_event
*event
= kmalloc(sizeof(*event
), GFP_ATOMIC
);
291 INIT_WORK(&event
->work
, do_notify_work
);
292 event
->type
= event_type
;
293 event
->controller
= controller
;
295 queue_work(kcapi_wq
, &event
->work
);
299 int register_capictr_notifier(struct notifier_block
*nb
)
301 return blocking_notifier_chain_register(&ctr_notifier_list
, nb
);
303 EXPORT_SYMBOL_GPL(register_capictr_notifier
);
305 int unregister_capictr_notifier(struct notifier_block
*nb
)
307 return blocking_notifier_chain_unregister(&ctr_notifier_list
, nb
);
309 EXPORT_SYMBOL_GPL(unregister_capictr_notifier
);
311 /* -------- Receiver ------------------------------------------ */
313 static void recv_handler(struct work_struct
*work
)
316 struct capi20_appl
*ap
=
317 container_of(work
, struct capi20_appl
, recv_work
);
319 if ((!ap
) || (ap
->release_in_progress
))
322 mutex_lock(&ap
->recv_mtx
);
323 while ((skb
= skb_dequeue(&ap
->recv_queue
))) {
324 if (CAPIMSG_CMD(skb
->data
) == CAPI_DATA_B3_IND
)
329 ap
->recv_message(ap
, skb
);
331 mutex_unlock(&ap
->recv_mtx
);
335 * capi_ctr_handle_message() - handle incoming CAPI message
336 * @ctr: controller descriptor structure.
337 * @appl: application ID.
340 * Called by hardware driver to pass a CAPI message to the application.
343 void capi_ctr_handle_message(struct capi_ctr
*ctr
, u16 appl
,
346 struct capi20_appl
*ap
;
351 if (ctr
->state
!= CAPI_CTR_RUNNING
) {
352 cdb
= capi_message2str(skb
->data
);
354 printk(KERN_INFO
"kcapi: controller [%03d] not active, got: %s",
358 printk(KERN_INFO
"kcapi: controller [%03d] not active, cannot trace\n",
363 cmd
= CAPIMSG_COMMAND(skb
->data
);
364 subcmd
= CAPIMSG_SUBCOMMAND(skb
->data
);
365 if (cmd
== CAPI_DATA_B3
&& subcmd
== CAPI_IND
) {
367 if (ctr
->traceflag
> 2)
374 showctl
|= (ctr
->traceflag
& 1);
377 printk(KERN_DEBUG
"kcapi: got [%03d] id#%d %s len=%u\n",
378 ctr
->cnr
, CAPIMSG_APPID(skb
->data
),
379 capi_cmd2str(cmd
, subcmd
),
380 CAPIMSG_LEN(skb
->data
));
382 cdb
= capi_message2str(skb
->data
);
384 printk(KERN_DEBUG
"kcapi: got [%03d] %s\n",
388 printk(KERN_DEBUG
"kcapi: got [%03d] id#%d %s len=%u, cannot trace\n",
389 ctr
->cnr
, CAPIMSG_APPID(skb
->data
),
390 capi_cmd2str(cmd
, subcmd
),
391 CAPIMSG_LEN(skb
->data
));
397 ap
= get_capi_appl_by_nr(CAPIMSG_APPID(skb
->data
));
400 cdb
= capi_message2str(skb
->data
);
402 printk(KERN_ERR
"kcapi: handle_message: applid %d state released (%s)\n",
403 CAPIMSG_APPID(skb
->data
), cdb
->buf
);
406 printk(KERN_ERR
"kcapi: handle_message: applid %d state released (%s) cannot trace\n",
407 CAPIMSG_APPID(skb
->data
),
408 capi_cmd2str(cmd
, subcmd
));
411 skb_queue_tail(&ap
->recv_queue
, skb
);
412 queue_work(kcapi_wq
, &ap
->recv_work
);
421 EXPORT_SYMBOL(capi_ctr_handle_message
);
424 * capi_ctr_ready() - signal CAPI controller ready
425 * @ctr: controller descriptor structure.
427 * Called by hardware driver to signal that the controller is up and running.
430 void capi_ctr_ready(struct capi_ctr
*ctr
)
432 printk(KERN_NOTICE
"kcapi: controller [%03d] \"%s\" ready.\n",
433 ctr
->cnr
, ctr
->name
);
435 notify_push(CAPICTR_UP
, ctr
->cnr
);
438 EXPORT_SYMBOL(capi_ctr_ready
);
441 * capi_ctr_down() - signal CAPI controller not ready
442 * @ctr: controller descriptor structure.
444 * Called by hardware driver to signal that the controller is down and
445 * unavailable for use.
448 void capi_ctr_down(struct capi_ctr
*ctr
)
450 printk(KERN_NOTICE
"kcapi: controller [%03d] down.\n", ctr
->cnr
);
452 notify_push(CAPICTR_DOWN
, ctr
->cnr
);
455 EXPORT_SYMBOL(capi_ctr_down
);
458 * capi_ctr_suspend_output() - suspend controller
459 * @ctr: controller descriptor structure.
461 * Called by hardware driver to stop data flow.
463 * Note: The caller is responsible for synchronizing concurrent state changes
464 * as well as invocations of capi_ctr_handle_message.
467 void capi_ctr_suspend_output(struct capi_ctr
*ctr
)
470 printk(KERN_DEBUG
"kcapi: controller [%03d] suspend\n",
476 EXPORT_SYMBOL(capi_ctr_suspend_output
);
479 * capi_ctr_resume_output() - resume controller
480 * @ctr: controller descriptor structure.
482 * Called by hardware driver to resume data flow.
484 * Note: The caller is responsible for synchronizing concurrent state changes
485 * as well as invocations of capi_ctr_handle_message.
488 void capi_ctr_resume_output(struct capi_ctr
*ctr
)
491 printk(KERN_DEBUG
"kcapi: controller [%03d] resumed\n",
497 EXPORT_SYMBOL(capi_ctr_resume_output
);
499 /* ------------------------------------------------------------- */
502 * attach_capi_ctr() - register CAPI controller
503 * @ctr: controller descriptor structure.
505 * Called by hardware driver to register a controller with the CAPI subsystem.
506 * Return value: 0 on success, error code < 0 on error
509 int attach_capi_ctr(struct capi_ctr
*ctr
)
513 mutex_lock(&capi_controller_lock
);
515 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
516 if (!capi_controller
[i
])
519 if (i
== CAPI_MAXCONTR
) {
520 mutex_unlock(&capi_controller_lock
);
521 printk(KERN_ERR
"kcapi: out of controller slots\n");
524 capi_controller
[i
] = ctr
;
526 ctr
->nrecvctlpkt
= 0;
527 ctr
->nrecvdatapkt
= 0;
528 ctr
->nsentctlpkt
= 0;
529 ctr
->nsentdatapkt
= 0;
531 ctr
->state
= CAPI_CTR_DETECTED
;
533 ctr
->traceflag
= showcapimsgs
;
534 init_waitqueue_head(&ctr
->state_wait_queue
);
536 sprintf(ctr
->procfn
, "capi/controllers/%d", ctr
->cnr
);
537 ctr
->procent
= proc_create_single_data(ctr
->procfn
, 0, NULL
,
538 ctr
->proc_show
, ctr
);
542 mutex_unlock(&capi_controller_lock
);
544 printk(KERN_NOTICE
"kcapi: controller [%03d]: %s attached\n",
545 ctr
->cnr
, ctr
->name
);
549 EXPORT_SYMBOL(attach_capi_ctr
);
552 * detach_capi_ctr() - unregister CAPI controller
553 * @ctr: controller descriptor structure.
555 * Called by hardware driver to remove the registration of a controller
556 * with the CAPI subsystem.
557 * Return value: 0 on success, error code < 0 on error
560 int detach_capi_ctr(struct capi_ctr
*ctr
)
564 mutex_lock(&capi_controller_lock
);
566 ctr_down(ctr
, CAPI_CTR_DETACHED
);
568 if (capi_controller
[ctr
->cnr
- 1] != ctr
) {
572 capi_controller
[ctr
->cnr
- 1] = NULL
;
576 remove_proc_entry(ctr
->procfn
, NULL
);
578 printk(KERN_NOTICE
"kcapi: controller [%03d]: %s unregistered\n",
579 ctr
->cnr
, ctr
->name
);
582 mutex_unlock(&capi_controller_lock
);
587 EXPORT_SYMBOL(detach_capi_ctr
);
590 * register_capi_driver() - register CAPI driver
591 * @driver: driver descriptor structure.
593 * Called by hardware driver to register itself with the CAPI subsystem.
596 void register_capi_driver(struct capi_driver
*driver
)
598 mutex_lock(&capi_drivers_lock
);
599 list_add_tail(&driver
->list
, &capi_drivers
);
600 mutex_unlock(&capi_drivers_lock
);
603 EXPORT_SYMBOL(register_capi_driver
);
606 * unregister_capi_driver() - unregister CAPI driver
607 * @driver: driver descriptor structure.
609 * Called by hardware driver to unregister itself from the CAPI subsystem.
612 void unregister_capi_driver(struct capi_driver
*driver
)
614 mutex_lock(&capi_drivers_lock
);
615 list_del(&driver
->list
);
616 mutex_unlock(&capi_drivers_lock
);
619 EXPORT_SYMBOL(unregister_capi_driver
);
621 /* ------------------------------------------------------------- */
622 /* -------- CAPI2.0 Interface ---------------------------------- */
623 /* ------------------------------------------------------------- */
626 * capi20_isinstalled() - CAPI 2.0 operation CAPI_INSTALLED
628 * Return value: CAPI result code (CAPI_NOERROR if at least one ISDN controller
629 * is ready for use, CAPI_REGNOTINSTALLED otherwise)
632 u16
capi20_isinstalled(void)
634 u16 ret
= CAPI_REGNOTINSTALLED
;
637 mutex_lock(&capi_controller_lock
);
639 for (i
= 0; i
< CAPI_MAXCONTR
; i
++)
640 if (capi_controller
[i
] &&
641 capi_controller
[i
]->state
== CAPI_CTR_RUNNING
) {
646 mutex_unlock(&capi_controller_lock
);
651 EXPORT_SYMBOL(capi20_isinstalled
);
654 * capi20_register() - CAPI 2.0 operation CAPI_REGISTER
655 * @ap: CAPI application descriptor structure.
657 * Register an application's presence with CAPI.
658 * A unique application ID is assigned and stored in @ap->applid.
659 * After this function returns successfully, the message receive
660 * callback function @ap->recv_message() may be called at any time
661 * until capi20_release() has been called for the same @ap.
662 * Return value: CAPI result code
665 u16
capi20_register(struct capi20_appl
*ap
)
672 if (ap
->rparam
.datablklen
< 128)
673 return CAPI_LOGBLKSIZETOSMALL
;
676 ap
->nrecvdatapkt
= 0;
678 ap
->nsentdatapkt
= 0;
679 mutex_init(&ap
->recv_mtx
);
680 skb_queue_head_init(&ap
->recv_queue
);
681 INIT_WORK(&ap
->recv_work
, recv_handler
);
682 ap
->release_in_progress
= 0;
684 mutex_lock(&capi_controller_lock
);
686 for (applid
= 1; applid
<= CAPI_MAXAPPL
; applid
++) {
687 if (capi_applications
[applid
- 1] == NULL
)
690 if (applid
> CAPI_MAXAPPL
) {
691 mutex_unlock(&capi_controller_lock
);
692 return CAPI_TOOMANYAPPLS
;
696 capi_applications
[applid
- 1] = ap
;
698 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
699 if (!capi_controller
[i
] ||
700 capi_controller
[i
]->state
!= CAPI_CTR_RUNNING
)
702 register_appl(capi_controller
[i
], applid
, &ap
->rparam
);
705 mutex_unlock(&capi_controller_lock
);
707 if (showcapimsgs
& 1) {
708 printk(KERN_DEBUG
"kcapi: appl %d up\n", applid
);
714 EXPORT_SYMBOL(capi20_register
);
717 * capi20_release() - CAPI 2.0 operation CAPI_RELEASE
718 * @ap: CAPI application descriptor structure.
720 * Terminate an application's registration with CAPI.
721 * After this function returns successfully, the message receive
722 * callback function @ap->recv_message() will no longer be called.
723 * Return value: CAPI result code
726 u16
capi20_release(struct capi20_appl
*ap
)
730 DBG("applid %#x", ap
->applid
);
732 mutex_lock(&capi_controller_lock
);
734 ap
->release_in_progress
= 1;
735 capi_applications
[ap
->applid
- 1] = NULL
;
739 for (i
= 0; i
< CAPI_MAXCONTR
; i
++) {
740 if (!capi_controller
[i
] ||
741 capi_controller
[i
]->state
!= CAPI_CTR_RUNNING
)
743 release_appl(capi_controller
[i
], ap
->applid
);
746 mutex_unlock(&capi_controller_lock
);
748 flush_workqueue(kcapi_wq
);
749 skb_queue_purge(&ap
->recv_queue
);
751 if (showcapimsgs
& 1) {
752 printk(KERN_DEBUG
"kcapi: appl %d down\n", ap
->applid
);
758 EXPORT_SYMBOL(capi20_release
);
761 * capi20_put_message() - CAPI 2.0 operation CAPI_PUT_MESSAGE
762 * @ap: CAPI application descriptor structure.
763 * @skb: CAPI message.
765 * Transfer a single message to CAPI.
766 * Return value: CAPI result code
769 u16
capi20_put_message(struct capi20_appl
*ap
, struct sk_buff
*skb
)
771 struct capi_ctr
*ctr
;
775 DBG("applid %#x", ap
->applid
);
777 if (ncontrollers
== 0)
778 return CAPI_REGNOTINSTALLED
;
779 if ((ap
->applid
== 0) || ap
->release_in_progress
)
780 return CAPI_ILLAPPNR
;
782 || !capi_cmd_valid(CAPIMSG_COMMAND(skb
->data
))
783 || !capi_subcmd_valid(CAPIMSG_SUBCOMMAND(skb
->data
)))
784 return CAPI_ILLCMDORSUBCMDORMSGTOSMALL
;
787 * The controller reference is protected by the existence of the
788 * application passed to us. We assume that the caller properly
789 * synchronizes this service with capi20_release.
791 ctr
= get_capi_ctr_by_nr(CAPIMSG_CONTROLLER(skb
->data
));
792 if (!ctr
|| ctr
->state
!= CAPI_CTR_RUNNING
)
793 return CAPI_REGNOTINSTALLED
;
795 return CAPI_SENDQUEUEFULL
;
797 cmd
= CAPIMSG_COMMAND(skb
->data
);
798 subcmd
= CAPIMSG_SUBCOMMAND(skb
->data
);
800 if (cmd
== CAPI_DATA_B3
&& subcmd
== CAPI_REQ
) {
803 if (ctr
->traceflag
> 2)
811 showctl
|= (ctr
->traceflag
& 1);
814 printk(KERN_DEBUG
"kcapi: put [%03d] id#%d %s len=%u\n",
815 CAPIMSG_CONTROLLER(skb
->data
),
816 CAPIMSG_APPID(skb
->data
),
817 capi_cmd2str(cmd
, subcmd
),
818 CAPIMSG_LEN(skb
->data
));
820 _cdebbuf
*cdb
= capi_message2str(skb
->data
);
822 printk(KERN_DEBUG
"kcapi: put [%03d] %s\n",
823 CAPIMSG_CONTROLLER(skb
->data
),
827 printk(KERN_DEBUG
"kcapi: put [%03d] id#%d %s len=%u cannot trace\n",
828 CAPIMSG_CONTROLLER(skb
->data
),
829 CAPIMSG_APPID(skb
->data
),
830 capi_cmd2str(cmd
, subcmd
),
831 CAPIMSG_LEN(skb
->data
));
834 return ctr
->send_message(ctr
, skb
);
837 EXPORT_SYMBOL(capi20_put_message
);
840 * capi20_get_manufacturer() - CAPI 2.0 operation CAPI_GET_MANUFACTURER
841 * @contr: controller number.
842 * @buf: result buffer (64 bytes).
844 * Retrieve information about the manufacturer of the specified ISDN controller
845 * or (for @contr == 0) the driver itself.
846 * Return value: CAPI result code
849 u16
capi20_get_manufacturer(u32 contr
, u8
*buf
)
851 struct capi_ctr
*ctr
;
855 strlcpy(buf
, capi_manufakturer
, CAPI_MANUFACTURER_LEN
);
859 mutex_lock(&capi_controller_lock
);
861 ctr
= get_capi_ctr_by_nr(contr
);
862 if (ctr
&& ctr
->state
== CAPI_CTR_RUNNING
) {
863 strlcpy(buf
, ctr
->manu
, CAPI_MANUFACTURER_LEN
);
866 ret
= CAPI_REGNOTINSTALLED
;
868 mutex_unlock(&capi_controller_lock
);
872 EXPORT_SYMBOL(capi20_get_manufacturer
);
875 * capi20_get_version() - CAPI 2.0 operation CAPI_GET_VERSION
876 * @contr: controller number.
877 * @verp: result structure.
879 * Retrieve version information for the specified ISDN controller
880 * or (for @contr == 0) the driver itself.
881 * Return value: CAPI result code
884 u16
capi20_get_version(u32 contr
, struct capi_version
*verp
)
886 struct capi_ctr
*ctr
;
890 *verp
= driver_version
;
894 mutex_lock(&capi_controller_lock
);
896 ctr
= get_capi_ctr_by_nr(contr
);
897 if (ctr
&& ctr
->state
== CAPI_CTR_RUNNING
) {
898 memcpy(verp
, &ctr
->version
, sizeof(capi_version
));
901 ret
= CAPI_REGNOTINSTALLED
;
903 mutex_unlock(&capi_controller_lock
);
907 EXPORT_SYMBOL(capi20_get_version
);
910 * capi20_get_serial() - CAPI 2.0 operation CAPI_GET_SERIAL_NUMBER
911 * @contr: controller number.
912 * @serial: result buffer (8 bytes).
914 * Retrieve the serial number of the specified ISDN controller
915 * or (for @contr == 0) the driver itself.
916 * Return value: CAPI result code
919 u16
capi20_get_serial(u32 contr
, u8
*serial
)
921 struct capi_ctr
*ctr
;
925 strlcpy(serial
, driver_serial
, CAPI_SERIAL_LEN
);
929 mutex_lock(&capi_controller_lock
);
931 ctr
= get_capi_ctr_by_nr(contr
);
932 if (ctr
&& ctr
->state
== CAPI_CTR_RUNNING
) {
933 strlcpy(serial
, ctr
->serial
, CAPI_SERIAL_LEN
);
936 ret
= CAPI_REGNOTINSTALLED
;
938 mutex_unlock(&capi_controller_lock
);
942 EXPORT_SYMBOL(capi20_get_serial
);
945 * capi20_get_profile() - CAPI 2.0 operation CAPI_GET_PROFILE
946 * @contr: controller number.
947 * @profp: result structure.
949 * Retrieve capability information for the specified ISDN controller
950 * or (for @contr == 0) the number of installed controllers.
951 * Return value: CAPI result code
954 u16
capi20_get_profile(u32 contr
, struct capi_profile
*profp
)
956 struct capi_ctr
*ctr
;
960 profp
->ncontroller
= ncontrollers
;
964 mutex_lock(&capi_controller_lock
);
966 ctr
= get_capi_ctr_by_nr(contr
);
967 if (ctr
&& ctr
->state
== CAPI_CTR_RUNNING
) {
968 memcpy(profp
, &ctr
->profile
, sizeof(struct capi_profile
));
971 ret
= CAPI_REGNOTINSTALLED
;
973 mutex_unlock(&capi_controller_lock
);
977 EXPORT_SYMBOL(capi20_get_profile
);
979 /* Must be called with capi_controller_lock held. */
980 static int wait_on_ctr_state(struct capi_ctr
*ctr
, unsigned int state
)
985 ctr
= capi_ctr_get(ctr
);
990 prepare_to_wait(&ctr
->state_wait_queue
, &wait
,
993 if (ctr
->state
== state
)
995 if (ctr
->state
== CAPI_CTR_DETACHED
) {
999 if (signal_pending(current
)) {
1004 mutex_unlock(&capi_controller_lock
);
1006 mutex_lock(&capi_controller_lock
);
1008 finish_wait(&ctr
->state_wait_queue
, &wait
);
1016 static int old_capi_manufacturer(unsigned int cmd
, void __user
*data
)
1018 avmb1_loadandconfigdef ldef
;
1019 avmb1_extcarddef cdef
;
1020 avmb1_resetdef rdef
;
1021 capicardparams cparams
;
1022 struct capi_ctr
*ctr
;
1023 struct capi_driver
*driver
= NULL
;
1025 struct list_head
*l
;
1030 case AVMB1_ADDCARD_WITH_TYPE
:
1031 if (cmd
== AVMB1_ADDCARD
) {
1032 if ((retval
= copy_from_user(&cdef
, data
,
1033 sizeof(avmb1_carddef
))))
1035 cdef
.cardtype
= AVM_CARDTYPE_B1
;
1038 if ((retval
= copy_from_user(&cdef
, data
,
1039 sizeof(avmb1_extcarddef
))))
1042 cparams
.port
= cdef
.port
;
1043 cparams
.irq
= cdef
.irq
;
1044 cparams
.cardnr
= cdef
.cardnr
;
1046 mutex_lock(&capi_drivers_lock
);
1048 switch (cdef
.cardtype
) {
1049 case AVM_CARDTYPE_B1
:
1050 list_for_each(l
, &capi_drivers
) {
1051 driver
= list_entry(l
, struct capi_driver
, list
);
1052 if (strcmp(driver
->name
, "b1isa") == 0)
1056 case AVM_CARDTYPE_T1
:
1057 list_for_each(l
, &capi_drivers
) {
1058 driver
= list_entry(l
, struct capi_driver
, list
);
1059 if (strcmp(driver
->name
, "t1isa") == 0)
1068 printk(KERN_ERR
"kcapi: driver not loaded.\n");
1070 } else if (!driver
->add_card
) {
1071 printk(KERN_ERR
"kcapi: driver has no add card function.\n");
1074 retval
= driver
->add_card(driver
, &cparams
);
1076 mutex_unlock(&capi_drivers_lock
);
1080 case AVMB1_LOAD_AND_CONFIG
:
1082 if (cmd
== AVMB1_LOAD
) {
1083 if (copy_from_user(&ldef
, data
,
1084 sizeof(avmb1_loaddef
)))
1086 ldef
.t4config
.len
= 0;
1087 ldef
.t4config
.data
= NULL
;
1089 if (copy_from_user(&ldef
, data
,
1090 sizeof(avmb1_loadandconfigdef
)))
1094 mutex_lock(&capi_controller_lock
);
1096 ctr
= get_capi_ctr_by_nr(ldef
.contr
);
1099 goto load_unlock_out
;
1102 if (ctr
->load_firmware
== NULL
) {
1103 printk(KERN_DEBUG
"kcapi: load: no load function\n");
1105 goto load_unlock_out
;
1108 if (ldef
.t4file
.len
<= 0) {
1109 printk(KERN_DEBUG
"kcapi: load: invalid parameter: length of t4file is %d ?\n", ldef
.t4file
.len
);
1111 goto load_unlock_out
;
1113 if (ldef
.t4file
.data
== NULL
) {
1114 printk(KERN_DEBUG
"kcapi: load: invalid parameter: dataptr is 0\n");
1116 goto load_unlock_out
;
1119 ldata
.firmware
.user
= 1;
1120 ldata
.firmware
.data
= ldef
.t4file
.data
;
1121 ldata
.firmware
.len
= ldef
.t4file
.len
;
1122 ldata
.configuration
.user
= 1;
1123 ldata
.configuration
.data
= ldef
.t4config
.data
;
1124 ldata
.configuration
.len
= ldef
.t4config
.len
;
1126 if (ctr
->state
!= CAPI_CTR_DETECTED
) {
1127 printk(KERN_INFO
"kcapi: load: contr=%d not in detect state\n", ldef
.contr
);
1129 goto load_unlock_out
;
1131 ctr
->state
= CAPI_CTR_LOADING
;
1133 retval
= ctr
->load_firmware(ctr
, &ldata
);
1135 ctr
->state
= CAPI_CTR_DETECTED
;
1136 goto load_unlock_out
;
1139 retval
= wait_on_ctr_state(ctr
, CAPI_CTR_RUNNING
);
1142 mutex_unlock(&capi_controller_lock
);
1145 case AVMB1_RESETCARD
:
1146 if (copy_from_user(&rdef
, data
, sizeof(avmb1_resetdef
)))
1151 mutex_lock(&capi_controller_lock
);
1153 ctr
= get_capi_ctr_by_nr(rdef
.contr
);
1156 goto reset_unlock_out
;
1159 if (ctr
->state
== CAPI_CTR_DETECTED
)
1160 goto reset_unlock_out
;
1162 if (ctr
->reset_ctr
== NULL
) {
1163 printk(KERN_DEBUG
"kcapi: reset: no reset function\n");
1165 goto reset_unlock_out
;
1168 ctr
->reset_ctr(ctr
);
1170 retval
= wait_on_ctr_state(ctr
, CAPI_CTR_DETECTED
);
1173 mutex_unlock(&capi_controller_lock
);
1181 * capi20_manufacturer() - CAPI 2.0 operation CAPI_MANUFACTURER
1185 * Perform manufacturer specific command.
1186 * Return value: CAPI result code
1189 int capi20_manufacturer(unsigned long cmd
, void __user
*data
)
1191 struct capi_ctr
*ctr
;
1197 case AVMB1_LOAD_AND_CONFIG
:
1198 case AVMB1_RESETCARD
:
1199 case AVMB1_GET_CARDINFO
:
1200 case AVMB1_REMOVECARD
:
1201 return old_capi_manufacturer(cmd
, data
);
1203 case KCAPI_CMD_TRACE
:
1207 if (copy_from_user(&fdef
, data
, sizeof(kcapi_flagdef
)))
1210 mutex_lock(&capi_controller_lock
);
1212 ctr
= get_capi_ctr_by_nr(fdef
.contr
);
1214 ctr
->traceflag
= fdef
.flag
;
1215 printk(KERN_INFO
"kcapi: contr [%03d] set trace=%d\n",
1216 ctr
->cnr
, ctr
->traceflag
);
1221 mutex_unlock(&capi_controller_lock
);
1225 case KCAPI_CMD_ADDCARD
:
1227 struct list_head
*l
;
1228 struct capi_driver
*driver
= NULL
;
1229 capicardparams cparams
;
1232 if ((retval
= copy_from_user(&cdef
, data
, sizeof(cdef
))))
1235 cparams
.port
= cdef
.port
;
1236 cparams
.irq
= cdef
.irq
;
1237 cparams
.membase
= cdef
.membase
;
1238 cparams
.cardnr
= cdef
.cardnr
;
1239 cparams
.cardtype
= 0;
1240 cdef
.driver
[sizeof(cdef
.driver
) - 1] = 0;
1242 mutex_lock(&capi_drivers_lock
);
1244 list_for_each(l
, &capi_drivers
) {
1245 driver
= list_entry(l
, struct capi_driver
, list
);
1246 if (strcmp(driver
->name
, cdef
.driver
) == 0)
1249 if (driver
== NULL
) {
1250 printk(KERN_ERR
"kcapi: driver \"%s\" not loaded.\n",
1253 } else if (!driver
->add_card
) {
1254 printk(KERN_ERR
"kcapi: driver \"%s\" has no add card function.\n", cdef
.driver
);
1257 retval
= driver
->add_card(driver
, &cparams
);
1259 mutex_unlock(&capi_drivers_lock
);
1264 printk(KERN_ERR
"kcapi: manufacturer command %lu unknown.\n",
1272 EXPORT_SYMBOL(capi20_manufacturer
);
1274 /* ------------------------------------------------------------- */
1275 /* -------- Init & Cleanup ------------------------------------- */
1276 /* ------------------------------------------------------------- */
1279 * init / exit functions
1282 static struct notifier_block capictr_nb
= {
1283 .notifier_call
= notify_handler
,
1284 .priority
= INT_MAX
,
1287 static int __init
kcapi_init(void)
1291 kcapi_wq
= alloc_workqueue("kcapi", 0, 0);
1295 register_capictr_notifier(&capictr_nb
);
1297 err
= cdebug_init();
1299 unregister_capictr_notifier(&capictr_nb
);
1300 destroy_workqueue(kcapi_wq
);
1308 static void __exit
kcapi_exit(void)
1312 unregister_capictr_notifier(&capictr_nb
);
1314 destroy_workqueue(kcapi_wq
);
1317 module_init(kcapi_init
);
1318 module_exit(kcapi_exit
);