diff options
Diffstat (limited to 'net/bluetooth/hci_sock.c')
-rw-r--r-- | net/bluetooth/hci_sock.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index f6afe3d76a66..6d94616af312 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -49,7 +49,7 @@ | |||
49 | #include <net/bluetooth/bluetooth.h> | 49 | #include <net/bluetooth/bluetooth.h> |
50 | #include <net/bluetooth/hci_core.h> | 50 | #include <net/bluetooth/hci_core.h> |
51 | 51 | ||
52 | static int enable_mgmt; | 52 | static bool enable_mgmt; |
53 | 53 | ||
54 | /* ----- HCI socket interface ----- */ | 54 | /* ----- HCI socket interface ----- */ |
55 | 55 | ||
@@ -188,11 +188,11 @@ static int hci_sock_blacklist_add(struct hci_dev *hdev, void __user *arg) | |||
188 | if (copy_from_user(&bdaddr, arg, sizeof(bdaddr))) | 188 | if (copy_from_user(&bdaddr, arg, sizeof(bdaddr))) |
189 | return -EFAULT; | 189 | return -EFAULT; |
190 | 190 | ||
191 | hci_dev_lock_bh(hdev); | 191 | hci_dev_lock(hdev); |
192 | 192 | ||
193 | err = hci_blacklist_add(hdev, &bdaddr); | 193 | err = hci_blacklist_add(hdev, &bdaddr); |
194 | 194 | ||
195 | hci_dev_unlock_bh(hdev); | 195 | hci_dev_unlock(hdev); |
196 | 196 | ||
197 | return err; | 197 | return err; |
198 | } | 198 | } |
@@ -205,11 +205,11 @@ static int hci_sock_blacklist_del(struct hci_dev *hdev, void __user *arg) | |||
205 | if (copy_from_user(&bdaddr, arg, sizeof(bdaddr))) | 205 | if (copy_from_user(&bdaddr, arg, sizeof(bdaddr))) |
206 | return -EFAULT; | 206 | return -EFAULT; |
207 | 207 | ||
208 | hci_dev_lock_bh(hdev); | 208 | hci_dev_lock(hdev); |
209 | 209 | ||
210 | err = hci_blacklist_del(hdev, &bdaddr); | 210 | err = hci_blacklist_del(hdev, &bdaddr); |
211 | 211 | ||
212 | hci_dev_unlock_bh(hdev); | 212 | hci_dev_unlock(hdev); |
213 | 213 | ||
214 | return err; | 214 | return err; |
215 | } | 215 | } |
@@ -343,8 +343,11 @@ static int hci_sock_bind(struct socket *sock, struct sockaddr *addr, int addr_le | |||
343 | if (haddr.hci_channel > HCI_CHANNEL_CONTROL) | 343 | if (haddr.hci_channel > HCI_CHANNEL_CONTROL) |
344 | return -EINVAL; | 344 | return -EINVAL; |
345 | 345 | ||
346 | if (haddr.hci_channel == HCI_CHANNEL_CONTROL && !enable_mgmt) | 346 | if (haddr.hci_channel == HCI_CHANNEL_CONTROL) { |
347 | return -EINVAL; | 347 | if (!enable_mgmt) |
348 | return -EINVAL; | ||
349 | set_bit(HCI_PI_MGMT_INIT, &hci_pi(sk)->flags); | ||
350 | } | ||
348 | 351 | ||
349 | lock_sock(sk); | 352 | lock_sock(sk); |
350 | 353 | ||
@@ -535,10 +538,10 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
535 | 538 | ||
536 | if (test_bit(HCI_RAW, &hdev->flags) || (ogf == 0x3f)) { | 539 | if (test_bit(HCI_RAW, &hdev->flags) || (ogf == 0x3f)) { |
537 | skb_queue_tail(&hdev->raw_q, skb); | 540 | skb_queue_tail(&hdev->raw_q, skb); |
538 | tasklet_schedule(&hdev->tx_task); | 541 | queue_work(hdev->workqueue, &hdev->tx_work); |
539 | } else { | 542 | } else { |
540 | skb_queue_tail(&hdev->cmd_q, skb); | 543 | skb_queue_tail(&hdev->cmd_q, skb); |
541 | tasklet_schedule(&hdev->cmd_task); | 544 | queue_work(hdev->workqueue, &hdev->cmd_work); |
542 | } | 545 | } |
543 | } else { | 546 | } else { |
544 | if (!capable(CAP_NET_RAW)) { | 547 | if (!capable(CAP_NET_RAW)) { |
@@ -547,7 +550,7 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
547 | } | 550 | } |
548 | 551 | ||
549 | skb_queue_tail(&hdev->raw_q, skb); | 552 | skb_queue_tail(&hdev->raw_q, skb); |
550 | tasklet_schedule(&hdev->tx_task); | 553 | queue_work(hdev->workqueue, &hdev->tx_work); |
551 | } | 554 | } |
552 | 555 | ||
553 | err = len; | 556 | err = len; |