diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/isdn/capi/capi.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/drivers/isdn/capi/capi.c b/drivers/isdn/capi/capi.c index 484745e30119..81661b8bd3a8 100644 --- a/drivers/isdn/capi/capi.c +++ b/drivers/isdn/capi/capi.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/fcntl.h> | 18 | #include <linux/fcntl.h> |
19 | #include <linux/fs.h> | 19 | #include <linux/fs.h> |
20 | #include <linux/signal.h> | 20 | #include <linux/signal.h> |
21 | #include <linux/mutex.h> | ||
21 | #include <linux/mm.h> | 22 | #include <linux/mm.h> |
22 | #include <linux/timer.h> | 23 | #include <linux/timer.h> |
23 | #include <linux/wait.h> | 24 | #include <linux/wait.h> |
@@ -146,7 +147,7 @@ struct capidev { | |||
146 | 147 | ||
147 | struct capincci *nccis; | 148 | struct capincci *nccis; |
148 | 149 | ||
149 | struct semaphore ncci_list_sem; | 150 | struct mutex ncci_list_mtx; |
150 | }; | 151 | }; |
151 | 152 | ||
152 | /* -------- global variables ---------------------------------------- */ | 153 | /* -------- global variables ---------------------------------------- */ |
@@ -394,7 +395,7 @@ static struct capidev *capidev_alloc(void) | |||
394 | if (!cdev) | 395 | if (!cdev) |
395 | return NULL; | 396 | return NULL; |
396 | 397 | ||
397 | init_MUTEX(&cdev->ncci_list_sem); | 398 | mutex_init(&cdev->ncci_list_mtx); |
398 | skb_queue_head_init(&cdev->recvqueue); | 399 | skb_queue_head_init(&cdev->recvqueue); |
399 | init_waitqueue_head(&cdev->recvwait); | 400 | init_waitqueue_head(&cdev->recvwait); |
400 | write_lock_irqsave(&capidev_list_lock, flags); | 401 | write_lock_irqsave(&capidev_list_lock, flags); |
@@ -413,9 +414,9 @@ static void capidev_free(struct capidev *cdev) | |||
413 | } | 414 | } |
414 | skb_queue_purge(&cdev->recvqueue); | 415 | skb_queue_purge(&cdev->recvqueue); |
415 | 416 | ||
416 | down(&cdev->ncci_list_sem); | 417 | mutex_lock(&cdev->ncci_list_mtx); |
417 | capincci_free(cdev, 0xffffffff); | 418 | capincci_free(cdev, 0xffffffff); |
418 | up(&cdev->ncci_list_sem); | 419 | mutex_unlock(&cdev->ncci_list_mtx); |
419 | 420 | ||
420 | write_lock_irqsave(&capidev_list_lock, flags); | 421 | write_lock_irqsave(&capidev_list_lock, flags); |
421 | list_del(&cdev->list); | 422 | list_del(&cdev->list); |
@@ -602,15 +603,15 @@ static void capi_recv_message(struct capi20_appl *ap, struct sk_buff *skb) | |||
602 | if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_CONF) { | 603 | if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_CONF) { |
603 | u16 info = CAPIMSG_U16(skb->data, 12); // Info field | 604 | u16 info = CAPIMSG_U16(skb->data, 12); // Info field |
604 | if (info == 0) { | 605 | if (info == 0) { |
605 | down(&cdev->ncci_list_sem); | 606 | mutex_lock(&cdev->ncci_list_mtx); |
606 | capincci_alloc(cdev, CAPIMSG_NCCI(skb->data)); | 607 | capincci_alloc(cdev, CAPIMSG_NCCI(skb->data)); |
607 | up(&cdev->ncci_list_sem); | 608 | mutex_unlock(&cdev->ncci_list_mtx); |
608 | } | 609 | } |
609 | } | 610 | } |
610 | if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_IND) { | 611 | if (CAPIMSG_CMD(skb->data) == CAPI_CONNECT_B3_IND) { |
611 | down(&cdev->ncci_list_sem); | 612 | mutex_lock(&cdev->ncci_list_mtx); |
612 | capincci_alloc(cdev, CAPIMSG_NCCI(skb->data)); | 613 | capincci_alloc(cdev, CAPIMSG_NCCI(skb->data)); |
613 | up(&cdev->ncci_list_sem); | 614 | mutex_unlock(&cdev->ncci_list_mtx); |
614 | } | 615 | } |
615 | spin_lock_irqsave(&workaround_lock, flags); | 616 | spin_lock_irqsave(&workaround_lock, flags); |
616 | if (CAPIMSG_COMMAND(skb->data) != CAPI_DATA_B3) { | 617 | if (CAPIMSG_COMMAND(skb->data) != CAPI_DATA_B3) { |
@@ -751,9 +752,9 @@ capi_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos | |||
751 | CAPIMSG_SETAPPID(skb->data, cdev->ap.applid); | 752 | CAPIMSG_SETAPPID(skb->data, cdev->ap.applid); |
752 | 753 | ||
753 | if (CAPIMSG_CMD(skb->data) == CAPI_DISCONNECT_B3_RESP) { | 754 | if (CAPIMSG_CMD(skb->data) == CAPI_DISCONNECT_B3_RESP) { |
754 | down(&cdev->ncci_list_sem); | 755 | mutex_lock(&cdev->ncci_list_mtx); |
755 | capincci_free(cdev, CAPIMSG_NCCI(skb->data)); | 756 | capincci_free(cdev, CAPIMSG_NCCI(skb->data)); |
756 | up(&cdev->ncci_list_sem); | 757 | mutex_unlock(&cdev->ncci_list_mtx); |
757 | } | 758 | } |
758 | 759 | ||
759 | cdev->errcode = capi20_put_message(&cdev->ap, skb); | 760 | cdev->errcode = capi20_put_message(&cdev->ap, skb); |
@@ -938,9 +939,9 @@ capi_ioctl(struct inode *inode, struct file *file, | |||
938 | if (copy_from_user(&ncci, argp, sizeof(ncci))) | 939 | if (copy_from_user(&ncci, argp, sizeof(ncci))) |
939 | return -EFAULT; | 940 | return -EFAULT; |
940 | 941 | ||
941 | down(&cdev->ncci_list_sem); | 942 | mutex_lock(&cdev->ncci_list_mtx); |
942 | if ((nccip = capincci_find(cdev, (u32) ncci)) == 0) { | 943 | if ((nccip = capincci_find(cdev, (u32) ncci)) == 0) { |
943 | up(&cdev->ncci_list_sem); | 944 | mutex_unlock(&cdev->ncci_list_mtx); |
944 | return 0; | 945 | return 0; |
945 | } | 946 | } |
946 | #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE | 947 | #ifdef CONFIG_ISDN_CAPI_MIDDLEWARE |
@@ -948,7 +949,7 @@ capi_ioctl(struct inode *inode, struct file *file, | |||
948 | count += atomic_read(&mp->ttyopencount); | 949 | count += atomic_read(&mp->ttyopencount); |
949 | } | 950 | } |
950 | #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ | 951 | #endif /* CONFIG_ISDN_CAPI_MIDDLEWARE */ |
951 | up(&cdev->ncci_list_sem); | 952 | mutex_unlock(&cdev->ncci_list_mtx); |
952 | return count; | 953 | return count; |
953 | } | 954 | } |
954 | return 0; | 955 | return 0; |
@@ -963,14 +964,14 @@ capi_ioctl(struct inode *inode, struct file *file, | |||
963 | if (copy_from_user(&ncci, argp, | 964 | if (copy_from_user(&ncci, argp, |
964 | sizeof(ncci))) | 965 | sizeof(ncci))) |
965 | return -EFAULT; | 966 | return -EFAULT; |
966 | down(&cdev->ncci_list_sem); | 967 | mutex_lock(&cdev->ncci_list_mtx); |
967 | nccip = capincci_find(cdev, (u32) ncci); | 968 | nccip = capincci_find(cdev, (u32) ncci); |
968 | if (!nccip || (mp = nccip->minorp) == 0) { | 969 | if (!nccip || (mp = nccip->minorp) == 0) { |
969 | up(&cdev->ncci_list_sem); | 970 | mutex_unlock(&cdev->ncci_list_mtx); |
970 | return -ESRCH; | 971 | return -ESRCH; |
971 | } | 972 | } |
972 | unit = mp->minor; | 973 | unit = mp->minor; |
973 | up(&cdev->ncci_list_sem); | 974 | mutex_unlock(&cdev->ncci_list_mtx); |
974 | return unit; | 975 | return unit; |
975 | } | 976 | } |
976 | return 0; | 977 | return 0; |