diff options
Diffstat (limited to 'drivers/isdn/capi')
-rw-r--r-- | drivers/isdn/capi/kcapi.c | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/drivers/isdn/capi/kcapi.c b/drivers/isdn/capi/kcapi.c index feec40cf5900..8c4fcb9027b3 100644 --- a/drivers/isdn/capi/kcapi.c +++ b/drivers/isdn/capi/kcapi.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #ifdef CONFIG_AVMB1_COMPAT | 32 | #ifdef CONFIG_AVMB1_COMPAT |
33 | #include <linux/b1lli.h> | 33 | #include <linux/b1lli.h> |
34 | #endif | 34 | #endif |
35 | #include <linux/mutex.h> | ||
35 | 36 | ||
36 | static char *revision = "$Revision: 1.1.2.8 $"; | 37 | static char *revision = "$Revision: 1.1.2.8 $"; |
37 | 38 | ||
@@ -66,7 +67,7 @@ LIST_HEAD(capi_drivers); | |||
66 | DEFINE_RWLOCK(capi_drivers_list_lock); | 67 | DEFINE_RWLOCK(capi_drivers_list_lock); |
67 | 68 | ||
68 | static DEFINE_RWLOCK(application_lock); | 69 | static DEFINE_RWLOCK(application_lock); |
69 | static DECLARE_MUTEX(controller_sem); | 70 | static DEFINE_MUTEX(controller_mutex); |
70 | 71 | ||
71 | struct capi20_appl *capi_applications[CAPI_MAXAPPL]; | 72 | struct capi20_appl *capi_applications[CAPI_MAXAPPL]; |
72 | struct capi_ctr *capi_cards[CAPI_MAXCONTR]; | 73 | struct capi_ctr *capi_cards[CAPI_MAXCONTR]; |
@@ -395,20 +396,20 @@ attach_capi_ctr(struct capi_ctr *card) | |||
395 | { | 396 | { |
396 | int i; | 397 | int i; |
397 | 398 | ||
398 | down(&controller_sem); | 399 | mutex_lock(&controller_mutex); |
399 | 400 | ||
400 | for (i = 0; i < CAPI_MAXCONTR; i++) { | 401 | for (i = 0; i < CAPI_MAXCONTR; i++) { |
401 | if (capi_cards[i] == NULL) | 402 | if (capi_cards[i] == NULL) |
402 | break; | 403 | break; |
403 | } | 404 | } |
404 | if (i == CAPI_MAXCONTR) { | 405 | if (i == CAPI_MAXCONTR) { |
405 | up(&controller_sem); | 406 | mutex_unlock(&controller_mutex); |
406 | printk(KERN_ERR "kcapi: out of controller slots\n"); | 407 | printk(KERN_ERR "kcapi: out of controller slots\n"); |
407 | return -EBUSY; | 408 | return -EBUSY; |
408 | } | 409 | } |
409 | capi_cards[i] = card; | 410 | capi_cards[i] = card; |
410 | 411 | ||
411 | up(&controller_sem); | 412 | mutex_unlock(&controller_mutex); |
412 | 413 | ||
413 | card->nrecvctlpkt = 0; | 414 | card->nrecvctlpkt = 0; |
414 | card->nrecvdatapkt = 0; | 415 | card->nrecvdatapkt = 0; |
@@ -531,13 +532,13 @@ u16 capi20_register(struct capi20_appl *ap) | |||
531 | 532 | ||
532 | write_unlock_irqrestore(&application_lock, flags); | 533 | write_unlock_irqrestore(&application_lock, flags); |
533 | 534 | ||
534 | down(&controller_sem); | 535 | mutex_lock(&controller_mutex); |
535 | for (i = 0; i < CAPI_MAXCONTR; i++) { | 536 | for (i = 0; i < CAPI_MAXCONTR; i++) { |
536 | if (!capi_cards[i] || capi_cards[i]->cardstate != CARD_RUNNING) | 537 | if (!capi_cards[i] || capi_cards[i]->cardstate != CARD_RUNNING) |
537 | continue; | 538 | continue; |
538 | register_appl(capi_cards[i], applid, &ap->rparam); | 539 | register_appl(capi_cards[i], applid, &ap->rparam); |
539 | } | 540 | } |
540 | up(&controller_sem); | 541 | mutex_unlock(&controller_mutex); |
541 | 542 | ||
542 | if (showcapimsgs & 1) { | 543 | if (showcapimsgs & 1) { |
543 | printk(KERN_DEBUG "kcapi: appl %d up\n", applid); | 544 | printk(KERN_DEBUG "kcapi: appl %d up\n", applid); |
@@ -560,13 +561,13 @@ u16 capi20_release(struct capi20_appl *ap) | |||
560 | capi_applications[ap->applid - 1] = NULL; | 561 | capi_applications[ap->applid - 1] = NULL; |
561 | write_unlock_irqrestore(&application_lock, flags); | 562 | write_unlock_irqrestore(&application_lock, flags); |
562 | 563 | ||
563 | down(&controller_sem); | 564 | mutex_lock(&controller_mutex); |
564 | for (i = 0; i < CAPI_MAXCONTR; i++) { | 565 | for (i = 0; i < CAPI_MAXCONTR; i++) { |
565 | if (!capi_cards[i] || capi_cards[i]->cardstate != CARD_RUNNING) | 566 | if (!capi_cards[i] || capi_cards[i]->cardstate != CARD_RUNNING) |
566 | continue; | 567 | continue; |
567 | release_appl(capi_cards[i], ap->applid); | 568 | release_appl(capi_cards[i], ap->applid); |
568 | } | 569 | } |
569 | up(&controller_sem); | 570 | mutex_unlock(&controller_mutex); |
570 | 571 | ||
571 | flush_scheduled_work(); | 572 | flush_scheduled_work(); |
572 | skb_queue_purge(&ap->recv_queue); | 573 | skb_queue_purge(&ap->recv_queue); |