Bluetooth: add hci event notification
authorSeung-Woo Kim <sw0312.kim@samsung.com>
Thu, 15 May 2014 03:37:20 +0000 (12:37 +0900)
committerChanho Park <chanho61.park@samsung.com>
Tue, 18 Nov 2014 03:00:33 +0000 (12:00 +0900)
WORKAROUND: Temporary workaround for bluetooth enable.
For specific hci events, operations are needed. So this patch adds
event notification and its notifier registration.

Change-Id: I6f8fe0b3b90c12d7f4fe35823d25b9fbdcd98d06
Signed-off-by: Seung-Woo Kim <sw0312.kim@samsung.com>
include/net/bluetooth/hci.h
include/net/bluetooth/hci_core.h
net/bluetooth/hci_core.c

index 0ef0006..67c824b 100644 (file)
@@ -42,6 +42,7 @@
 #define HCI_DEV_DOWN                   4
 #define HCI_DEV_SUSPEND                        5
 #define HCI_DEV_RESUME                 6
+#define HCI_DEV_WRITE                  7
 
 /* HCI notify events */
 #define HCI_NOTIFY_CONN_ADD            1
index 7cb6d36..1c8ae61 100644 (file)
@@ -1068,6 +1068,8 @@ static inline u16 eir_append_data(u8 *eir, u16 eir_len, u8 type, u8 *data,
 
 int hci_register_cb(struct hci_cb *hcb);
 int hci_unregister_cb(struct hci_cb *hcb);
+int hci_register_notifier(struct notifier_block *nb);
+int hci_unregister_notifier(struct notifier_block *nb);
 
 struct hci_request {
        struct hci_dev          *hdev;
index fbc4a1a..d954ad9 100644 (file)
@@ -49,10 +49,25 @@ DEFINE_RWLOCK(hci_cb_list_lock);
 static DEFINE_IDA(hci_index_ida);
 
 /* ---- HCI notifications ---- */
+static ATOMIC_NOTIFIER_HEAD(hci_notifier);
+
+int hci_register_notifier(struct notifier_block *nb)
+{
+       return atomic_notifier_chain_register(&hci_notifier, nb);
+}
+
+int hci_unregister_notifier(struct notifier_block *nb)
+{
+       return atomic_notifier_chain_unregister(&hci_notifier, nb);
+}
 
 static void hci_notify(struct hci_dev *hdev, int event)
 {
        hci_sock_dev_event(hdev, event);
+
+       if (event == HCI_DEV_REG || event == HCI_DEV_UNREG
+                       || event == HCI_DEV_WRITE)
+               atomic_notifier_call_chain(&hci_notifier, event, hdev);
 }
 
 /* ---- HCI requests ---- */
@@ -2592,6 +2607,8 @@ static int hci_send_frame(struct sk_buff *skb)
        /* Get rid of skb owner, prior to sending to the driver. */
        skb_orphan(skb);
 
+       hci_notify(hdev, HCI_DEV_WRITE);
+
        return hdev->send(skb);
 }