|
11 | 11 | #include <linux/module.h>
|
12 | 12 | #include <asm/unaligned.h>
|
13 | 13 |
|
| 14 | +#include <linux/atomic.h> |
14 | 15 | #include <linux/kernel.h>
|
15 | 16 | #include <linux/init.h>
|
16 | 17 | #include <linux/slab.h>
|
@@ -44,6 +45,7 @@ struct vhci_data {
|
44 | 45 | bool wakeup;
|
45 | 46 | __u16 msft_opcode;
|
46 | 47 | bool aosp_capable;
|
| 48 | + atomic_t initialized; |
47 | 49 | };
|
48 | 50 |
|
49 | 51 | static int vhci_open_dev(struct hci_dev *hdev)
|
@@ -75,11 +77,10 @@ static int vhci_send_frame(struct hci_dev *hdev, struct sk_buff *skb)
|
75 | 77 |
|
76 | 78 | memcpy(skb_push(skb, 1), &hci_skb_pkt_type(skb), 1);
|
77 | 79 |
|
78 |
| - mutex_lock(&data->open_mutex); |
79 | 80 | skb_queue_tail(&data->readq, skb);
|
80 |
| - mutex_unlock(&data->open_mutex); |
81 | 81 |
|
82 |
| - wake_up_interruptible(&data->read_wait); |
| 82 | + if (atomic_read(&data->initialized)) |
| 83 | + wake_up_interruptible(&data->read_wait); |
83 | 84 | return 0;
|
84 | 85 | }
|
85 | 86 |
|
@@ -464,7 +465,8 @@ static int __vhci_create_device(struct vhci_data *data, __u8 opcode)
|
464 | 465 | skb_put_u8(skb, 0xff);
|
465 | 466 | skb_put_u8(skb, opcode);
|
466 | 467 | put_unaligned_le16(hdev->id, skb_put(skb, 2));
|
467 |
| - skb_queue_tail(&data->readq, skb); |
| 468 | + skb_queue_head(&data->readq, skb); |
| 469 | + atomic_inc(&data->initialized); |
468 | 470 |
|
469 | 471 | wake_up_interruptible(&data->read_wait);
|
470 | 472 | return 0;
|
|
0 commit comments