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 | { |
