Commit d1c5ea97 authored by Marcel Holtmann's avatar Marcel Holtmann

[Bluetooth] Add notify callback for host drivers

This patch adds a notification callback to the hci_dev structure which
is used by the HCI core to tell the driver about connection creation
and clearing. It also notifies about changed voice setting.
parent 430e67b3
...@@ -35,19 +35,24 @@ ...@@ -35,19 +35,24 @@
#define HCI_MAX_FRAME_SIZE (HCI_MAX_ACL_SIZE + 4) #define HCI_MAX_FRAME_SIZE (HCI_MAX_ACL_SIZE + 4)
/* HCI dev events */ /* HCI dev events */
#define HCI_DEV_REG 1 #define HCI_DEV_REG 1
#define HCI_DEV_UNREG 2 #define HCI_DEV_UNREG 2
#define HCI_DEV_UP 3 #define HCI_DEV_UP 3
#define HCI_DEV_DOWN 4 #define HCI_DEV_DOWN 4
#define HCI_DEV_SUSPEND 5 #define HCI_DEV_SUSPEND 5
#define HCI_DEV_RESUME 6 #define HCI_DEV_RESUME 6
/* HCI notify events */
#define HCI_NOTIFY_CONN_ADD 1
#define HCI_NOTIFY_CONN_DEL 2
#define HCI_NOTIFY_VOICE_SETTING 3
/* HCI device types */ /* HCI device types */
#define HCI_VHCI 0 #define HCI_VHCI 0
#define HCI_USB 1 #define HCI_USB 1
#define HCI_PCCARD 2 #define HCI_PCCARD 2
#define HCI_UART 3 #define HCI_UART 3
#define HCI_RS232 4 #define HCI_RS232 4
#define HCI_PCI 5 #define HCI_PCI 5
/* HCI device quirks */ /* HCI device quirks */
...@@ -95,24 +100,24 @@ enum { ...@@ -95,24 +100,24 @@ enum {
#define HCIINQUIRY _IOR('H', 240, int) #define HCIINQUIRY _IOR('H', 240, int)
/* HCI timeouts */ /* HCI timeouts */
#define HCI_CONN_TIMEOUT (HZ * 40) #define HCI_CONN_TIMEOUT (HZ * 40)
#define HCI_DISCONN_TIMEOUT (HZ * 2) #define HCI_DISCONN_TIMEOUT (HZ * 2)
#define HCI_CONN_IDLE_TIMEOUT (HZ * 60) #define HCI_CONN_IDLE_TIMEOUT (HZ * 60)
/* HCI Packet types */ /* HCI Packet types */
#define HCI_COMMAND_PKT 0x01 #define HCI_COMMAND_PKT 0x01
#define HCI_ACLDATA_PKT 0x02 #define HCI_ACLDATA_PKT 0x02
#define HCI_SCODATA_PKT 0x03 #define HCI_SCODATA_PKT 0x03
#define HCI_EVENT_PKT 0x04 #define HCI_EVENT_PKT 0x04
#define HCI_UNKNOWN_PKT 0xff #define HCI_UNKNOWN_PKT 0xff
/* HCI Packet types */ /* HCI Packet types */
#define HCI_DM1 0x0008 #define HCI_DM1 0x0008
#define HCI_DM3 0x0400 #define HCI_DM3 0x0400
#define HCI_DM5 0x4000 #define HCI_DM5 0x4000
#define HCI_DH1 0x0010 #define HCI_DH1 0x0010
#define HCI_DH3 0x0800 #define HCI_DH3 0x0800
#define HCI_DH5 0x8000 #define HCI_DH5 0x8000
#define HCI_HV1 0x0020 #define HCI_HV1 0x0020
#define HCI_HV2 0x0040 #define HCI_HV2 0x0040
......
...@@ -130,6 +130,7 @@ struct hci_dev { ...@@ -130,6 +130,7 @@ struct hci_dev {
int (*flush)(struct hci_dev *hdev); int (*flush)(struct hci_dev *hdev);
int (*send)(struct sk_buff *skb); int (*send)(struct sk_buff *skb);
void (*destruct)(struct hci_dev *hdev); void (*destruct)(struct hci_dev *hdev);
void (*notify)(struct hci_dev *hdev, unsigned int evt);
int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg); int (*ioctl)(struct hci_dev *hdev, unsigned int cmd, unsigned long arg);
}; };
......
...@@ -170,6 +170,9 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst) ...@@ -170,6 +170,9 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
hci_conn_hash_add(hdev, conn); hci_conn_hash_add(hdev, conn);
tasklet_enable(&hdev->tx_task); tasklet_enable(&hdev->tx_task);
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
return conn; return conn;
} }
...@@ -196,6 +199,9 @@ int hci_conn_del(struct hci_conn *conn) ...@@ -196,6 +199,9 @@ int hci_conn_del(struct hci_conn *conn)
hdev->acl_cnt += conn->sent; hdev->acl_cnt += conn->sent;
} }
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
tasklet_disable(&hdev->tx_task); tasklet_disable(&hdev->tx_task);
hci_conn_hash_del(hdev, conn); hci_conn_hash_del(hdev, conn);
tasklet_enable(&hdev->tx_task); tasklet_enable(&hdev->tx_task);
......
...@@ -232,6 +232,9 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb ...@@ -232,6 +232,9 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb
hdev->voice_setting = setting; hdev->voice_setting = setting;
BT_DBG("%s: voice setting 0x%04x", hdev->name, setting); BT_DBG("%s: voice setting 0x%04x", hdev->name, setting);
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
} }
break; break;
...@@ -247,6 +250,9 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb ...@@ -247,6 +250,9 @@ static void hci_cc_host_ctl(struct hci_dev *hdev, __u16 ocf, struct sk_buff *skb
hdev->voice_setting = setting; hdev->voice_setting = setting;
BT_DBG("%s: voice setting 0x%04x", hdev->name, setting); BT_DBG("%s: voice setting 0x%04x", hdev->name, setting);
if (hdev->notify)
hdev->notify(hdev, HCI_NOTIFY_VOICE_SETTING);
} }
hci_req_complete(hdev, status); hci_req_complete(hdev, status);
break; break;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment