diff options
Diffstat (limited to 'net/bluetooth/hci_sock.c')
-rw-r--r-- | net/bluetooth/hci_sock.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c index 75302a986067..688cfebfbee0 100644 --- a/net/bluetooth/hci_sock.c +++ b/net/bluetooth/hci_sock.c | |||
@@ -414,6 +414,11 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
414 | goto done; | 414 | goto done; |
415 | } | 415 | } |
416 | 416 | ||
417 | if (!test_bit(HCI_UP, &hdev->flags)) { | ||
418 | err = -ENETDOWN; | ||
419 | goto done; | ||
420 | } | ||
421 | |||
417 | if (!(skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err))) | 422 | if (!(skb = bt_skb_send_alloc(sk, len, msg->msg_flags & MSG_DONTWAIT, &err))) |
418 | goto done; | 423 | goto done; |
419 | 424 | ||
@@ -440,10 +445,10 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
440 | 445 | ||
441 | if (test_bit(HCI_RAW, &hdev->flags) || (ogf == 0x3f)) { | 446 | if (test_bit(HCI_RAW, &hdev->flags) || (ogf == 0x3f)) { |
442 | skb_queue_tail(&hdev->raw_q, skb); | 447 | skb_queue_tail(&hdev->raw_q, skb); |
443 | hci_sched_tx(hdev); | 448 | tasklet_schedule(&hdev->tx_task); |
444 | } else { | 449 | } else { |
445 | skb_queue_tail(&hdev->cmd_q, skb); | 450 | skb_queue_tail(&hdev->cmd_q, skb); |
446 | hci_sched_cmd(hdev); | 451 | tasklet_schedule(&hdev->cmd_task); |
447 | } | 452 | } |
448 | } else { | 453 | } else { |
449 | if (!capable(CAP_NET_RAW)) { | 454 | if (!capable(CAP_NET_RAW)) { |
@@ -452,7 +457,7 @@ static int hci_sock_sendmsg(struct kiocb *iocb, struct socket *sock, | |||
452 | } | 457 | } |
453 | 458 | ||
454 | skb_queue_tail(&hdev->raw_q, skb); | 459 | skb_queue_tail(&hdev->raw_q, skb); |
455 | hci_sched_tx(hdev); | 460 | tasklet_schedule(&hdev->tx_task); |
456 | } | 461 | } |
457 | 462 | ||
458 | err = len; | 463 | err = len; |
@@ -621,7 +626,8 @@ static struct proto hci_sk_proto = { | |||
621 | .obj_size = sizeof(struct hci_pinfo) | 626 | .obj_size = sizeof(struct hci_pinfo) |
622 | }; | 627 | }; |
623 | 628 | ||
624 | static int hci_sock_create(struct net *net, struct socket *sock, int protocol) | 629 | static int hci_sock_create(struct net *net, struct socket *sock, int protocol, |
630 | int kern) | ||
625 | { | 631 | { |
626 | struct sock *sk; | 632 | struct sock *sk; |
627 | 633 | ||
@@ -687,7 +693,7 @@ static int hci_sock_dev_event(struct notifier_block *this, unsigned long event, | |||
687 | return NOTIFY_DONE; | 693 | return NOTIFY_DONE; |
688 | } | 694 | } |
689 | 695 | ||
690 | static struct net_proto_family hci_sock_family_ops = { | 696 | static const struct net_proto_family hci_sock_family_ops = { |
691 | .family = PF_BLUETOOTH, | 697 | .family = PF_BLUETOOTH, |
692 | .owner = THIS_MODULE, | 698 | .owner = THIS_MODULE, |
693 | .create = hci_sock_create, | 699 | .create = hci_sock_create, |