bluetooth: Re-add HCI notifier handling
Nagarjuna Kristam [Wed, 6 Jun 2012 09:40:08 +0000 (14:40 +0530)]
Perform partial revert of 040030ef7d907107e6489b39da518bdf94136d68
(Bluetooth: Remove HCI notifier handling). HCI notifier is being used by
bluetooth power management driver(bluesleep).

Re-use atomic notifier chain to notify HCI events

bug 999221

Change-Id: Ifbd95f7e679d3cac577785cb7a9eda5736e1fa7b
Signed-off-by: Nagarjuna Kristam <nkristam@nvidia.com>
Reviewed-on: http://git-master/r/106729
Reviewed-by: Varun Wadekar <vwadekar@nvidia.com>

include/net/bluetooth/hci_core.h
net/bluetooth/hci_core.c

index 392b2ca..3c3982f 100644 (file)
@@ -949,6 +949,9 @@ 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);
+
 int hci_send_cmd(struct hci_dev *hdev, __u16 opcode, __u32 plen, void *param);
 void hci_send_acl(struct hci_chan *chan, struct sk_buff *skb, __u16 flags);
 void hci_send_sco(struct hci_conn *conn, struct sk_buff *skb);
index 70a398e..a07800f 100644 (file)
@@ -40,6 +40,7 @@
 #include <linux/skbuff.h>
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
+#include <linux/notifier.h>
 #include <linux/rfkill.h>
 #include <linux/timer.h>
 #include <linux/crypto.h>
@@ -65,10 +66,23 @@ DEFINE_RWLOCK(hci_dev_list_lock);
 LIST_HEAD(hci_cb_list);
 DEFINE_RWLOCK(hci_cb_list_lock);
 
+/* HCI notifiers list */
+static ATOMIC_NOTIFIER_HEAD(hci_notifier);
 /* ---- HCI notifications ---- */
 
+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)
 {
+       atomic_notifier_call_chain(&hci_notifier, event, hdev);
        hci_sock_dev_event(hdev, event);
 }