diff options
-rw-r--r-- | Documentation/isdn/00-INDEX | 2 | ||||
-rw-r--r-- | Documentation/isdn/INTERFACE.CAPI | 207 | ||||
-rw-r--r-- | drivers/isdn/capi/kcapi.c | 171 |
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. |
9 | INTERFACE.fax | 9 | INTERFACE.fax |
10 | - description of the fax subinterface of isdn4linux. | 10 | - description of the fax subinterface of isdn4linux. |
11 | INTERFACE.CAPI | ||
12 | - description of kernel CAPI Link Level to Hardware Level interface. | ||
11 | README | 13 | README |
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. |
13 | README.FAQ | 15 | README.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 @@ | |||
1 | Kernel CAPI Interface to Hardware Drivers | ||
2 | ----------------------------------------- | ||
3 | |||
4 | 1. Overview | ||
5 | |||
6 | Kernel CAPI operates as a dispatching layer between CAPI applications and CAPI | ||
7 | hardware drivers. Hardware drivers register ISDN devices (controllers, in CAPI | ||
8 | lingo) with Kernel CAPI to indicate their readiness to provide their service | ||
9 | to CAPI applications. CAPI applications also register with Kernel CAPI, | ||
10 | requesting association with a CAPI device. Kernel CAPI then dispatches the | ||
11 | application registration to an available device, forwarding it to the | ||
12 | corresponding hardware driver. Kernel CAPI then forwards CAPI messages in both | ||
13 | directions between the application and the hardware driver. | ||
14 | |||
15 | |||
16 | 2. Driver and Device Registration | ||
17 | |||
18 | CAPI drivers optionally register themselves with Kernel CAPI by calling the | ||
19 | Kernel CAPI function register_capi_driver() with a pointer to a struct | ||
20 | capi_driver. This structure must be filled with the name and revision of the | ||
21 | driver, and optionally a pointer to a callback function, add_card(). The | ||
22 | registration can be revoked by calling the function unregister_capi_driver() | ||
23 | with a pointer to the same struct capi_driver. | ||
24 | |||
25 | CAPI drivers must register each of the ISDN devices they control with Kernel | ||
26 | CAPI by calling the Kernel CAPI function attach_capi_ctr() with a pointer to a | ||
27 | struct capi_ctr before they can be used. This structure must be filled with | ||
28 | the names of the driver and controller, and a number of callback function | ||
29 | pointers which are subsequently used by Kernel CAPI for communicating with the | ||
30 | driver. The registration can be revoked by calling the function | ||
31 | detach_capi_ctr() with a pointer to the same struct capi_ctr. | ||
32 | |||
33 | Before the device can be actually used, the driver must fill in the device | ||
34 | information fields 'manu', 'version', 'profile' and 'serial' in the capi_ctr | ||
35 | structure of the device, and signal its readiness by calling capi_ctr_ready(). | ||
36 | From then on, Kernel CAPI may call the registered callback functions for the | ||
37 | device. | ||
38 | |||
39 | If the device becomes unusable for any reason (shutdown, disconnect ...), the | ||
40 | driver has to call capi_ctr_reseted(). This will prevent further calls to the | ||
41 | callback functions by Kernel CAPI. | ||
42 | |||
43 | |||
44 | 3. Application Registration and Communication | ||
45 | |||
46 | Kernel CAPI forwards registration requests from applications (calls to CAPI | ||
47 | operation CAPI_REGISTER) to an appropriate hardware driver by calling its | ||
48 | register_appl() callback function. A unique Application ID (ApplID, u16) is | ||
49 | allocated by Kernel CAPI and passed to register_appl() along with the | ||
50 | parameter structure provided by the application. This is analogous to the | ||
51 | open() operation on regular files or character devices. | ||
52 | |||
53 | After a successful return from register_appl(), CAPI messages from the | ||
54 | application may be passed to the driver for the device via calls to the | ||
55 | send_message() callback function. The CAPI message to send is stored in the | ||
56 | data portion of a skb. Conversely, the driver may call Kernel CAPI's | ||
57 | capi_ctr_handle_message() function to pass a received CAPI message to Kernel | ||
58 | CAPI for forwarding to an application, specifying its ApplID. | ||
59 | |||
60 | Format and semantics of CAPI messages are specified in the CAPI 2.0 standard. | ||
61 | |||
62 | Deregistration requests (CAPI operation CAPI_RELEASE) from applications are | ||
63 | forwarded as calls to the release_appl() callback function, passing the same | ||
64 | ApplID as with register_appl(). After return from release_appl(), no CAPI | ||
65 | messages for that application may be passed to or from the device anymore. | ||
66 | |||
67 | |||
68 | 4. Data Structures | ||
69 | |||
70 | 4.1 struct capi_driver | ||
71 | |||
72 | This structure describes a Kernel CAPI driver itself. It is used in the | ||
73 | register_capi_driver() and unregister_capi_driver() functions, and contains | ||
74 | the following non-private fields, all to be set by the driver before calling | ||
75 | register_capi_driver(): | ||
76 | |||
77 | char name[32] | ||
78 | the name of the driver, as a zero terminated ASCII string | ||
79 | char revision[32] | ||
80 | the revision number of the driver, as a zero terminated ASCII string | ||
81 | int (*add_card)(struct capi_driver *driver, capicardparams *data) | ||
82 | a callback function pointer (may be NULL) | ||
83 | |||
84 | |||
85 | 4.2 struct capi_ctr | ||
86 | |||
87 | This structure describes an ISDN device (controller) handled by a Kernel CAPI | ||
88 | driver. After registration via the attach_capi_ctr() function it is passed to | ||
89 | all controller specific lower layer interface and callback functions to | ||
90 | identify the controller to operate on. | ||
91 | |||
92 | It contains the following non-private fields: | ||
93 | |||
94 | - to be set by the driver before calling attach_capi_ctr(): | ||
95 | |||
96 | struct module *owner | ||
97 | pointer to the driver module owning the device | ||
98 | |||
99 | void *driverdata | ||
100 | an opaque pointer to driver specific data, not touched by Kernel CAPI | ||
101 | |||
102 | char name[32] | ||
103 | the name of the controller, as a zero terminated ASCII string | ||
104 | |||
105 | char *driver_name | ||
106 | the name of the driver, as a zero terminated ASCII string | ||
107 | |||
108 | int (*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 | |||
112 | void (*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 | |||
116 | void (*register_appl)(struct capi_ctr *ctrlr, u16 applid, | ||
117 | capi_register_params *rparam) | ||
118 | void (*release_appl)(struct capi_ctr *ctrlr, u16 applid) | ||
119 | pointers to callback functions for registration and deregistration of | ||
120 | applications with the device | ||
121 | |||
122 | u16 (*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 | |||
126 | char *(*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 | |||
130 | read_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 | |||
137 | u8 manu[CAPI_MANUFACTURER_LEN] | ||
138 | value to return for CAPI_GET_MANUFACTURER | ||
139 | |||
140 | capi_version version | ||
141 | value to return for CAPI_GET_VERSION | ||
142 | |||
143 | capi_profile profile | ||
144 | value to return for CAPI_GET_PROFILE | ||
145 | |||
146 | u8 serial[CAPI_SERIAL_LEN] | ||
147 | value to return for CAPI_GET_SERIAL | ||
148 | |||
149 | |||
150 | 5. Lower Layer Interface Functions | ||
151 | |||
152 | (declared in <linux/isdn/capilli.h>) | ||
153 | |||
154 | void register_capi_driver(struct capi_driver *drvr) | ||
155 | void unregister_capi_driver(struct capi_driver *drvr) | ||
156 | register/unregister a driver with Kernel CAPI | ||
157 | |||
158 | int attach_capi_ctr(struct capi_ctr *ctrlr) | ||
159 | int detach_capi_ctr(struct capi_ctr *ctrlr) | ||
160 | register/unregister a device (controller) with Kernel CAPI | ||
161 | |||
162 | void capi_ctr_ready(struct capi_ctr *ctrlr) | ||
163 | void capi_ctr_reseted(struct capi_ctr *ctrlr) | ||
164 | signal controller ready/not ready | ||
165 | |||
166 | void capi_ctr_suspend_output(struct capi_ctr *ctrlr) | ||
167 | void capi_ctr_resume_output(struct capi_ctr *ctrlr) | ||
168 | signal suspend/resume | ||
169 | |||
170 | void 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 | |||
176 | 6. Helper Functions and Macros | ||
177 | |||
178 | Library functions (from <linux/isdn/capilli.h>): | ||
179 | |||
180 | void capilib_new_ncci(struct list_head *head, u16 applid, | ||
181 | u32 ncci, u32 winsize) | ||
182 | void capilib_free_ncci(struct list_head *head, u16 applid, u32 ncci) | ||
183 | void capilib_release_appl(struct list_head *head, u16 applid) | ||
184 | void capilib_release(struct list_head *head) | ||
185 | void capilib_data_b3_conf(struct list_head *head, u16 applid, | ||
186 | u32 ncci, u16 msgid) | ||
187 | u16 capilib_data_b3_req(struct list_head *head, u16 applid, | ||
188 | u32 ncci, u16 msgid) | ||
189 | |||
190 | |||
191 | Macros to extract/set element values from/in a CAPI message header | ||
192 | (from <linux/isdn/capiutil.h>): | ||
193 | |||
194 | Get Macro Set Macro Element (Type) | ||
195 | |||
196 | CAPIMSG_LEN(m) CAPIMSG_SETLEN(m, len) Total Length (u16) | ||
197 | CAPIMSG_APPID(m) CAPIMSG_SETAPPID(m, applid) ApplID (u16) | ||
198 | CAPIMSG_COMMAND(m) CAPIMSG_SETCOMMAND(m,cmd) Command (u8) | ||
199 | CAPIMSG_SUBCOMMAND(m) CAPIMSG_SETSUBCOMMAND(m, cmd) Subcommand (u8) | ||
200 | CAPIMSG_CMD(m) - Command*256 | ||
201 | + Subcommand (u16) | ||
202 | CAPIMSG_MSGID(m) CAPIMSG_SETMSGID(m, msgid) Message Number (u16) | ||
203 | |||
204 | CAPIMSG_CONTROL(m) CAPIMSG_SETCONTROL(m, contr) Controller/PLCI/NCCI | ||
205 | (u32) | ||
206 | CAPIMSG_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 | |||
273 | void capi_ctr_handle_message(struct capi_ctr * card, u16 appl, struct sk_buff *skb) | 282 | void 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 | ||
349 | EXPORT_SYMBOL(capi_ctr_handle_message); | 358 | EXPORT_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 | |||
351 | void capi_ctr_ready(struct capi_ctr * card) | 367 | void 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 | ||
361 | EXPORT_SYMBOL(capi_ctr_ready); | 377 | EXPORT_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 | |||
363 | void capi_ctr_reseted(struct capi_ctr * card) | 387 | void 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 | ||
392 | EXPORT_SYMBOL(capi_ctr_reseted); | 416 | EXPORT_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 | |||
394 | void capi_ctr_suspend_output(struct capi_ctr *card) | 425 | void 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 | ||
402 | EXPORT_SYMBOL(capi_ctr_suspend_output); | 433 | EXPORT_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 | |||
404 | void capi_ctr_resume_output(struct capi_ctr *card) | 442 | void 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 | |||
416 | int | 462 | int |
417 | attach_capi_ctr(struct capi_ctr *card) | 463 | attach_capi_ctr(struct capi_ctr *card) |
418 | { | 464 | { |
@@ -459,6 +505,15 @@ attach_capi_ctr(struct capi_ctr *card) | |||
459 | 505 | ||
460 | EXPORT_SYMBOL(attach_capi_ctr); | 506 | EXPORT_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 | |||
462 | int detach_capi_ctr(struct capi_ctr *card) | 517 | int 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 | ||
480 | EXPORT_SYMBOL(detach_capi_ctr); | 535 | EXPORT_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 | |||
482 | void register_capi_driver(struct capi_driver *driver) | 544 | void 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 | ||
491 | EXPORT_SYMBOL(register_capi_driver); | 553 | EXPORT_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 | |||
493 | void unregister_capi_driver(struct capi_driver *driver) | 562 | void 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 | |||
508 | u16 capi20_isinstalled(void) | 584 | u16 capi20_isinstalled(void) |
509 | { | 585 | { |
510 | int i; | 586 | int i; |
@@ -517,6 +593,18 @@ u16 capi20_isinstalled(void) | |||
517 | 593 | ||
518 | EXPORT_SYMBOL(capi20_isinstalled); | 594 | EXPORT_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 | |||
520 | u16 capi20_register(struct capi20_appl *ap) | 608 | u16 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 | ||
572 | EXPORT_SYMBOL(capi20_register); | 660 | EXPORT_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 | |||
574 | u16 capi20_release(struct capi20_appl *ap) | 672 | u16 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 | ||
604 | EXPORT_SYMBOL(capi20_release); | 702 | EXPORT_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 | |||
606 | u16 capi20_put_message(struct capi20_appl *ap, struct sk_buff *skb) | 713 | u16 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 | ||
669 | EXPORT_SYMBOL(capi20_put_message); | 776 | EXPORT_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 | |||
671 | u16 capi20_get_manufacturer(u32 contr, u8 *buf) | 788 | u16 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 | ||
686 | EXPORT_SYMBOL(capi20_get_manufacturer); | 803 | EXPORT_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 | |||
688 | u16 capi20_get_version(u32 contr, struct capi_version *verp) | 815 | u16 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 | ||
704 | EXPORT_SYMBOL(capi20_get_version); | 831 | EXPORT_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 | |||
706 | u16 capi20_get_serial(u32 contr, u8 *serial) | 843 | u16 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 | ||
722 | EXPORT_SYMBOL(capi20_get_serial); | 859 | EXPORT_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 | |||
724 | u16 capi20_get_profile(u32 contr, struct capi_profile *profp) | 871 | u16 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 | |||
906 | int capi20_manufacturer(unsigned int cmd, void __user *data) | 1062 | int 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) | |||
981 | EXPORT_SYMBOL(capi20_manufacturer); | 1137 | EXPORT_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 | |||
984 | void capi20_set_callback(struct capi20_appl *ap, | 1155 | void 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 | { |