aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Documentation/isdn/00-INDEX2
-rw-r--r--Documentation/isdn/INTERFACE.CAPI207
-rw-r--r--drivers/isdn/capi/kcapi.c171
3 files changed, 380 insertions, 0 deletions
diff --git a/Documentation/isdn/00-INDEX b/Documentation/isdn/00-INDEX
index d9660ee5ab27..5a2d69989a8c 100644
--- a/Documentation/isdn/00-INDEX
+++ b/Documentation/isdn/00-INDEX
@@ -8,6 +8,8 @@ INTERFACE
8 - description of isdn4linux Link Level and Hardware Level interfaces. 8 - description of isdn4linux Link Level and Hardware Level interfaces.
9INTERFACE.fax 9INTERFACE.fax
10 - description of the fax subinterface of isdn4linux. 10 - description of the fax subinterface of isdn4linux.
11INTERFACE.CAPI
12 - description of kernel CAPI Link Level to Hardware Level interface.
11README 13README
12 - general info on what you need and what to do for Linux ISDN. 14 - general info on what you need and what to do for Linux ISDN.
13README.FAQ 15README.FAQ
diff --git a/Documentation/isdn/INTERFACE.CAPI b/Documentation/isdn/INTERFACE.CAPI
new file mode 100644
index 000000000000..8947ffcda16e
--- /dev/null
+++ b/Documentation/isdn/INTERFACE.CAPI
@@ -0,0 +1,207 @@
1Kernel CAPI Interface to Hardware Drivers
2-----------------------------------------
3
41. Overview
5
6Kernel CAPI operates as a dispatching layer between CAPI applications and CAPI
7hardware drivers. Hardware drivers register ISDN devices (controllers, in CAPI
8lingo) with Kernel CAPI to indicate their readiness to provide their service
9to CAPI applications. CAPI applications also register with Kernel CAPI,
10requesting association with a CAPI device. Kernel CAPI then dispatches the
11application registration to an available device, forwarding it to the
12corresponding hardware driver. Kernel CAPI then forwards CAPI messages in both
13directions between the application and the hardware driver.
14
15
162. Driver and Device Registration
17
18CAPI drivers optionally register themselves with Kernel CAPI by calling the
19Kernel CAPI function register_capi_driver() with a pointer to a struct
20capi_driver. This structure must be filled with the name and revision of the
21driver, and optionally a pointer to a callback function, add_card(). The
22registration can be revoked by calling the function unregister_capi_driver()
23with a pointer to the same struct capi_driver.
24
25CAPI drivers must register each of the ISDN devices they control with Kernel
26CAPI by calling the Kernel CAPI function attach_capi_ctr() with a pointer to a
27struct capi_ctr before they can be used. This structure must be filled with
28the names of the driver and controller, and a number of callback function
29pointers which are subsequently used by Kernel CAPI for communicating with the
30driver. The registration can be revoked by calling the function
31detach_capi_ctr() with a pointer to the same struct capi_ctr.
32
33Before the device can be actually used, the driver must fill in the device
34information fields 'manu', 'version', 'profile' and 'serial' in the capi_ctr
35structure of the device, and signal its readiness by calling capi_ctr_ready().
36From then on, Kernel CAPI may call the registered callback functions for the
37device.
38
39If the device becomes unusable for any reason (shutdown, disconnect ...), the
40driver has to call capi_ctr_reseted(). This will prevent further calls to the
41callback functions by Kernel CAPI.
42
43
443. Application Registration and Communication
45
46Kernel CAPI forwards registration requests from applications (calls to CAPI
47operation CAPI_REGISTER) to an appropriate hardware driver by calling its
48register_appl() callback function. A unique Application ID (ApplID, u16) is
49allocated by Kernel CAPI and passed to register_appl() along with the
50parameter structure provided by the application. This is analogous to the
51open() operation on regular files or character devices.
52
53After a successful return from register_appl(), CAPI messages from the
54application may be passed to the driver for the device via calls to the
55send_message() callback function. The CAPI message to send is stored in the
56data portion of a skb. Conversely, the driver may call Kernel CAPI's
57capi_ctr_handle_message() function to pass a received CAPI message to Kernel
58CAPI for forwarding to an application, specifying its ApplID.
59
60Format and semantics of CAPI messages are specified in the CAPI 2.0 standard.
61
62Deregistration requests (CAPI operation CAPI_RELEASE) from applications are
63forwarded as calls to the release_appl() callback function, passing the same
64ApplID as with register_appl(). After return from release_appl(), no CAPI
65messages for that application may be passed to or from the device anymore.
66
67
684. Data Structures
69
704.1 struct capi_driver
71
72This structure describes a Kernel CAPI driver itself. It is used in the
73register_capi_driver() and unregister_capi_driver() functions, and contains
74the following non-private fields, all to be set by the driver before calling
75register_capi_driver():
76
77char name[32]
78 the name of the driver, as a zero terminated ASCII string
79char revision[32]
80 the revision number of the driver, as a zero terminated ASCII string
81int (*add_card)(struct capi_driver *driver, capicardparams *data)
82 a callback function pointer (may be NULL)
83
84
854.2 struct capi_ctr
86
87This structure describes an ISDN device (controller) handled by a Kernel CAPI
88driver. After registration via the attach_capi_ctr() function it is passed to
89all controller specific lower layer interface and callback functions to
90identify the controller to operate on.
91
92It contains the following non-private fields:
93
94- to be set by the driver before calling attach_capi_ctr():
95
96struct module *owner
97 pointer to the driver module owning the device
98
99void *driverdata
100 an opaque pointer to driver specific data, not touched by Kernel CAPI
101
102char name[32]
103 the name of the controller, as a zero terminated ASCII string
104
105char *driver_name
106 the name of the driver, as a zero terminated ASCII string
107
108int (*load_firmware)(struct capi_ctr *ctrlr, capiloaddata *ldata)
109 (optional) pointer to a callback function for sending firmware and
110 configuration data to the device
111
112void (*reset_ctr)(struct capi_ctr *ctrlr)
113 pointer to a callback function for performing a reset on the device,
114 releasing all registered applications
115
116void (*register_appl)(struct capi_ctr *ctrlr, u16 applid,
117 capi_register_params *rparam)
118void (*release_appl)(struct capi_ctr *ctrlr, u16 applid)
119 pointers to callback functions for registration and deregistration of
120 applications with the device
121
122u16 (*send_message)(struct capi_ctr *ctrlr, struct sk_buff *skb)
123 pointer to a callback function for sending a CAPI message to the
124 device
125
126char *(*procinfo)(struct capi_ctr *ctrlr)
127 pointer to a callback function returning the entry for the device in
128 the CAPI controller info table, /proc/capi/controller
129
130read_proc_t *ctr_read_proc
131 pointer to the read_proc callback function for the device's proc file
132 system entry, /proc/capi/controllers/<n>; will be called with a
133 pointer to the device's capi_ctr structure as the last (data) argument
134
135- to be filled in before calling capi_ctr_ready():
136
137u8 manu[CAPI_MANUFACTURER_LEN]
138 value to return for CAPI_GET_MANUFACTURER
139
140capi_version version
141 value to return for CAPI_GET_VERSION
142
143capi_profile profile
144 value to return for CAPI_GET_PROFILE
145
146u8 serial[CAPI_SERIAL_LEN]
147 value to return for CAPI_GET_SERIAL
148
149
1505. Lower Layer Interface Functions
151
152(declared in <linux/isdn/capilli.h>)
153
154void register_capi_driver(struct capi_driver *drvr)
155void unregister_capi_driver(struct capi_driver *drvr)
156 register/unregister a driver with Kernel CAPI
157
158int attach_capi_ctr(struct capi_ctr *ctrlr)
159int detach_capi_ctr(struct capi_ctr *ctrlr)
160 register/unregister a device (controller) with Kernel CAPI
161
162void capi_ctr_ready(struct capi_ctr *ctrlr)
163void capi_ctr_reseted(struct capi_ctr *ctrlr)
164 signal controller ready/not ready
165
166void capi_ctr_suspend_output(struct capi_ctr *ctrlr)
167void capi_ctr_resume_output(struct capi_ctr *ctrlr)
168 signal suspend/resume
169
170void capi_ctr_handle_message(struct capi_ctr * ctrlr, u16 applid,
171 struct sk_buff *skb)
172 pass a received CAPI message to Kernel CAPI
173 for forwarding to the specified application
174
175
1766. Helper Functions and Macros
177
178Library functions (from <linux/isdn/capilli.h>):
179
180void capilib_new_ncci(struct list_head *head, u16 applid,
181 u32 ncci, u32 winsize)
182void capilib_free_ncci(struct list_head *head, u16 applid, u32 ncci)
183void capilib_release_appl(struct list_head *head, u16 applid)
184void capilib_release(struct list_head *head)
185void capilib_data_b3_conf(struct list_head *head, u16 applid,
186 u32 ncci, u16 msgid)
187u16 capilib_data_b3_req(struct list_head *head, u16 applid,
188 u32 ncci, u16 msgid)
189
190
191Macros to extract/set element values from/in a CAPI message header
192(from <linux/isdn/capiutil.h>):
193
194Get Macro Set Macro Element (Type)
195
196CAPIMSG_LEN(m) CAPIMSG_SETLEN(m, len) Total Length (u16)
197CAPIMSG_APPID(m) CAPIMSG_SETAPPID(m, applid) ApplID (u16)
198CAPIMSG_COMMAND(m) CAPIMSG_SETCOMMAND(m,cmd) Command (u8)
199CAPIMSG_SUBCOMMAND(m) CAPIMSG_SETSUBCOMMAND(m, cmd) Subcommand (u8)
200CAPIMSG_CMD(m) - Command*256
201 + Subcommand (u16)
202CAPIMSG_MSGID(m) CAPIMSG_SETMSGID(m, msgid) Message Number (u16)
203
204CAPIMSG_CONTROL(m) CAPIMSG_SETCONTROL(m, contr) Controller/PLCI/NCCI
205 (u32)
206CAPIMSG_DATALEN(m) CAPIMSG_SETDATALEN(m, len) Data Length (u16)
207
diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c
index 5360c4fd4739..f33170368cd1 100644
--- a/drivers/isdn/capi/kcapi.c
+++ b/drivers/isdn/capi/kcapi.c
@@ -270,6 +270,15 @@ static void recv_handler(struct work_struct *work)
270 mutex_unlock(&ap->recv_mtx); 270 mutex_unlock(&ap->recv_mtx);
271} 271}
272 272
273/**
274 * capi_ctr_handle_message() - handle incoming CAPI message
275 * @card: controller descriptor structure.
276 * @appl: application ID.
277 * @skb: message.
278 *
279 * Called by hardware driver to pass a CAPI message to the application.
280 */
281
273void capi_ctr_handle_message(struct capi_ctr * card, u16 appl, struct sk_buff *skb) 282void capi_ctr_handle_message(struct capi_ctr * card, u16 appl, struct sk_buff *skb)
274{ 283{
275 struct capi20_appl *ap; 284 struct capi20_appl *ap;
@@ -348,6 +357,13 @@ error:
348 357
349EXPORT_SYMBOL(capi_ctr_handle_message); 358EXPORT_SYMBOL(capi_ctr_handle_message);
350 359
360/**
361 * capi_ctr_ready() - signal CAPI controller ready
362 * @card: controller descriptor structure.
363 *
364 * Called by hardware driver to signal that the controller is up and running.
365 */
366
351void capi_ctr_ready(struct capi_ctr * card) 367void capi_ctr_ready(struct capi_ctr * card)
352{ 368{
353 card->cardstate = CARD_RUNNING; 369 card->cardstate = CARD_RUNNING;
@@ -360,6 +376,14 @@ void capi_ctr_ready(struct capi_ctr * card)
360 376
361EXPORT_SYMBOL(capi_ctr_ready); 377EXPORT_SYMBOL(capi_ctr_ready);
362 378
379/**
380 * capi_ctr_reseted() - signal CAPI controller reset
381 * @card: controller descriptor structure.
382 *
383 * Called by hardware driver to signal that the controller is down and
384 * unavailable for use.
385 */
386
363void capi_ctr_reseted(struct capi_ctr * card) 387void capi_ctr_reseted(struct capi_ctr * card)
364{ 388{
365 u16 appl; 389 u16 appl;
@@ -391,6 +415,13 @@ void capi_ctr_reseted(struct capi_ctr * card)
391 415
392EXPORT_SYMBOL(capi_ctr_reseted); 416EXPORT_SYMBOL(capi_ctr_reseted);
393 417
418/**
419 * capi_ctr_suspend_output() - suspend controller
420 * @card: controller descriptor structure.
421 *
422 * Called by hardware driver to stop data flow.
423 */
424
394void capi_ctr_suspend_output(struct capi_ctr *card) 425void capi_ctr_suspend_output(struct capi_ctr *card)
395{ 426{
396 if (!card->blocked) { 427 if (!card->blocked) {
@@ -401,6 +432,13 @@ void capi_ctr_suspend_output(struct capi_ctr *card)
401 432
402EXPORT_SYMBOL(capi_ctr_suspend_output); 433EXPORT_SYMBOL(capi_ctr_suspend_output);
403 434
435/**
436 * capi_ctr_resume_output() - resume controller
437 * @card: controller descriptor structure.
438 *
439 * Called by hardware driver to resume data flow.
440 */
441
404void capi_ctr_resume_output(struct capi_ctr *card) 442void capi_ctr_resume_output(struct capi_ctr *card)
405{ 443{
406 if (card->blocked) { 444 if (card->blocked) {
@@ -413,6 +451,14 @@ EXPORT_SYMBOL(capi_ctr_resume_output);
413 451
414/* ------------------------------------------------------------- */ 452/* ------------------------------------------------------------- */
415 453
454/**
455 * attach_capi_ctr() - register CAPI controller
456 * @card: controller descriptor structure.
457 *
458 * Called by hardware driver to register a controller with the CAPI subsystem.
459 * Return value: 0 on success, error code < 0 on error
460 */
461
416int 462int
417attach_capi_ctr(struct capi_ctr *card) 463attach_capi_ctr(struct capi_ctr *card)
418{ 464{
@@ -459,6 +505,15 @@ attach_capi_ctr(struct capi_ctr *card)
459 505
460EXPORT_SYMBOL(attach_capi_ctr); 506EXPORT_SYMBOL(attach_capi_ctr);
461 507
508/**
509 * detach_capi_ctr() - unregister CAPI controller
510 * @card: controller descriptor structure.
511 *
512 * Called by hardware driver to remove the registration of a controller
513 * with the CAPI subsystem.
514 * Return value: 0 on success, error code < 0 on error
515 */
516
462int detach_capi_ctr(struct capi_ctr *card) 517int detach_capi_ctr(struct capi_ctr *card)
463{ 518{
464 if (card->cardstate != CARD_DETECTED) 519 if (card->cardstate != CARD_DETECTED)
@@ -479,6 +534,13 @@ int detach_capi_ctr(struct capi_ctr *card)
479 534
480EXPORT_SYMBOL(detach_capi_ctr); 535EXPORT_SYMBOL(detach_capi_ctr);
481 536
537/**
538 * register_capi_driver() - register CAPI driver
539 * @driver: driver descriptor structure.
540 *
541 * Called by hardware driver to register itself with the CAPI subsystem.
542 */
543
482void register_capi_driver(struct capi_driver *driver) 544void register_capi_driver(struct capi_driver *driver)
483{ 545{
484 unsigned long flags; 546 unsigned long flags;
@@ -490,6 +552,13 @@ void register_capi_driver(struct capi_driver *driver)
490 552
491EXPORT_SYMBOL(register_capi_driver); 553EXPORT_SYMBOL(register_capi_driver);
492 554
555/**
556 * unregister_capi_driver() - unregister CAPI driver
557 * @driver: driver descriptor structure.
558 *
559 * Called by hardware driver to unregister itself from the CAPI subsystem.
560 */
561
493void unregister_capi_driver(struct capi_driver *driver) 562void unregister_capi_driver(struct capi_driver *driver)
494{ 563{
495 unsigned long flags; 564 unsigned long flags;
@@ -505,6 +574,13 @@ EXPORT_SYMBOL(unregister_capi_driver);
505/* -------- CAPI2.0 Interface ---------------------------------- */ 574/* -------- CAPI2.0 Interface ---------------------------------- */
506/* ------------------------------------------------------------- */ 575/* ------------------------------------------------------------- */
507 576
577/**
578 * capi20_isinstalled() - CAPI 2.0 operation CAPI_INSTALLED
579 *
580 * Return value: CAPI result code (CAPI_NOERROR if at least one ISDN controller
581 * is ready for use, CAPI_REGNOTINSTALLED otherwise)
582 */
583
508u16 capi20_isinstalled(void) 584u16 capi20_isinstalled(void)
509{ 585{
510 int i; 586 int i;
@@ -517,6 +593,18 @@ u16 capi20_isinstalled(void)
517 593
518EXPORT_SYMBOL(capi20_isinstalled); 594EXPORT_SYMBOL(capi20_isinstalled);
519 595
596/**
597 * capi20_register() - CAPI 2.0 operation CAPI_REGISTER
598 * @ap: CAPI application descriptor structure.
599 *
600 * Register an application's presence with CAPI.
601 * A unique application ID is assigned and stored in @ap->applid.
602 * After this function returns successfully, the message receive
603 * callback function @ap->recv_message() may be called at any time
604 * until capi20_release() has been called for the same @ap.
605 * Return value: CAPI result code
606 */
607
520u16 capi20_register(struct capi20_appl *ap) 608u16 capi20_register(struct capi20_appl *ap)
521{ 609{
522 int i; 610 int i;
@@ -571,6 +659,16 @@ u16 capi20_register(struct capi20_appl *ap)
571 659
572EXPORT_SYMBOL(capi20_register); 660EXPORT_SYMBOL(capi20_register);
573 661
662/**
663 * capi20_release() - CAPI 2.0 operation CAPI_RELEASE
664 * @ap: CAPI application descriptor structure.
665 *
666 * Terminate an application's registration with CAPI.
667 * After this function returns successfully, the message receive
668 * callback function @ap->recv_message() will no longer be called.
669 * Return value: CAPI result code
670 */
671
574u16 capi20_release(struct capi20_appl *ap) 672u16 capi20_release(struct capi20_appl *ap)
575{ 673{
576 int i; 674 int i;
@@ -603,6 +701,15 @@ u16 capi20_release(struct capi20_appl *ap)
603 701
604EXPORT_SYMBOL(capi20_release); 702EXPORT_SYMBOL(capi20_release);
605 703
704/**
705 * capi20_put_message() - CAPI 2.0 operation CAPI_PUT_MESSAGE
706 * @ap: CAPI application descriptor structure.
707 * @skb: CAPI message.
708 *
709 * Transfer a single message to CAPI.
710 * Return value: CAPI result code
711 */
712
606u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb) 713u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb)
607{ 714{
608 struct capi_ctr *card; 715 struct capi_ctr *card;
@@ -668,6 +775,16 @@ u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb)
668 775
669EXPORT_SYMBOL(capi20_put_message); 776EXPORT_SYMBOL(capi20_put_message);
670 777
778/**
779 * capi20_get_manufacturer() - CAPI 2.0 operation CAPI_GET_MANUFACTURER
780 * @contr: controller number.
781 * @buf: result buffer (64 bytes).
782 *
783 * Retrieve information about the manufacturer of the specified ISDN controller
784 * or (for @contr == 0) the driver itself.
785 * Return value: CAPI result code
786 */
787
671u16 capi20_get_manufacturer(u32 contr, u8 *buf) 788u16 capi20_get_manufacturer(u32 contr, u8 *buf)
672{ 789{
673 struct capi_ctr *card; 790 struct capi_ctr *card;
@@ -685,6 +802,16 @@ u16 capi20_get_manufacturer(u32 contr, u8 *buf)
685 802
686EXPORT_SYMBOL(capi20_get_manufacturer); 803EXPORT_SYMBOL(capi20_get_manufacturer);
687 804
805/**
806 * capi20_get_version() - CAPI 2.0 operation CAPI_GET_VERSION
807 * @contr: controller number.
808 * @verp: result structure.
809 *
810 * Retrieve version information for the specified ISDN controller
811 * or (for @contr == 0) the driver itself.
812 * Return value: CAPI result code
813 */
814
688u16 capi20_get_version(u32 contr, struct capi_version *verp) 815u16 capi20_get_version(u32 contr, struct capi_version *verp)
689{ 816{
690 struct capi_ctr *card; 817 struct capi_ctr *card;
@@ -703,6 +830,16 @@ u16 capi20_get_version(u32 contr, struct capi_version *verp)
703 830
704EXPORT_SYMBOL(capi20_get_version); 831EXPORT_SYMBOL(capi20_get_version);
705 832
833/**
834 * capi20_get_serial() - CAPI 2.0 operation CAPI_GET_SERIAL_NUMBER
835 * @contr: controller number.
836 * @serial: result buffer (8 bytes).
837 *
838 * Retrieve the serial number of the specified ISDN controller
839 * or (for @contr == 0) the driver itself.
840 * Return value: CAPI result code
841 */
842
706u16 capi20_get_serial(u32 contr, u8 *serial) 843u16 capi20_get_serial(u32 contr, u8 *serial)
707{ 844{
708 struct capi_ctr *card; 845 struct capi_ctr *card;
@@ -721,6 +858,16 @@ u16 capi20_get_serial(u32 contr, u8 *serial)
721 858
722EXPORT_SYMBOL(capi20_get_serial); 859EXPORT_SYMBOL(capi20_get_serial);
723 860
861/**
862 * capi20_get_profile() - CAPI 2.0 operation CAPI_GET_PROFILE
863 * @contr: controller number.
864 * @profp: result structure.
865 *
866 * Retrieve capability information for the specified ISDN controller
867 * or (for @contr == 0) the number of installed controllers.
868 * Return value: CAPI result code
869 */
870
724u16 capi20_get_profile(u32 contr, struct capi_profile *profp) 871u16 capi20_get_profile(u32 contr, struct capi_profile *profp)
725{ 872{
726 struct capi_ctr *card; 873 struct capi_ctr *card;
@@ -903,6 +1050,15 @@ static int old_capi_manufacturer(unsigned int cmd, void __user *data)
903} 1050}
904#endif 1051#endif
905 1052
1053/**
1054 * capi20_manufacturer() - CAPI 2.0 operation CAPI_MANUFACTURER
1055 * @cmd: command.
1056 * @data: parameter.
1057 *
1058 * Perform manufacturer specific command.
1059 * Return value: CAPI result code
1060 */
1061
906int capi20_manufacturer(unsigned int cmd, void __user *data) 1062int capi20_manufacturer(unsigned int cmd, void __user *data)
907{ 1063{
908 struct capi_ctr *card; 1064 struct capi_ctr *card;
@@ -981,6 +1137,21 @@ int capi20_manufacturer(unsigned int cmd, void __user *data)
981EXPORT_SYMBOL(capi20_manufacturer); 1137EXPORT_SYMBOL(capi20_manufacturer);
982 1138
983/* temporary hack */ 1139/* temporary hack */
1140
1141/**
1142 * capi20_set_callback() - set CAPI application notification callback function
1143 * @ap: CAPI application descriptor structure.
1144 * @callback: callback function (NULL to remove).
1145 *
1146 * If not NULL, the callback function will be called to notify the
1147 * application of the addition or removal of a controller.
1148 * The first argument (cmd) will tell whether the controller was added
1149 * (KCI_CONTRUP) or removed (KCI_CONTRDOWN).
1150 * The second argument (contr) will be the controller number.
1151 * For cmd==KCI_CONTRUP the third argument (data) will be a pointer to the
1152 * new controller's capability profile structure.
1153 */
1154
984void capi20_set_callback(struct capi20_appl *ap, 1155void capi20_set_callback(struct capi20_appl *ap,
985 void (*callback) (unsigned int cmd, __u32 contr, void *data)) 1156 void (*callback) (unsigned int cmd, __u32 contr, void *data))
986{ 1157{