Bluetooth: add support to notify using SCO air mode
Subsystems (2)
Marcel Holtmann
maintainerPATCH 1/10 Bluetooth: add support to notify using SCO air mode
From: Sathish Narsimman <[email protected]>
notifying using HCI_NOTIFY_CONN_ADD for SCO connection is generic in case of mSBC audio. To differntiate SCO air mode introducing HCI_NOTIFY_ENABLE_SCO_CVSD and HCI_NOTIFY_ENABLE_SCO_TRANSP.
Signed-off-by Sathish Narsimman <[email protected]>
Signed-off-by Marcel Holtmann <[email protected]>
--- include/net/bluetooth/hci.h | 3 +++ net/bluetooth/hci_conn.c | 25 +++++++++++++++++++++---- net/bluetooth/hci_event.c | 23 ++++++++++++++++++++++- 3 files changed, 46 insertions(+), 5 deletions(-)
include/net/bluetooth/hci.h +3 -0
@@ -53,6 +53,9 @@#define HCI_NOTIFY_CONN_ADD 1#define HCI_NOTIFY_CONN_DEL 2#define HCI_NOTIFY_VOICE_SETTING 3 +#define HCI_NOTIFY_ENABLE_SCO_CVSD 4 +#define HCI_NOTIFY_ENABLE_SCO_TRANSP 5 +#define HCI_NOTIFY_DISABLE_SCO 6/* HCI bus types */ #define HCI_VIRTUAL 0
net/bluetooth/hci_conn.c +21 -4
@@ -122,8 +122,18 @@ static void hci_conn_cleanup(struct hci_conn *conn)hci_conn_hash_del (hdev, conn); -if (hdev->notify) - hdev->notify (hdev,HCI_NOTIFY_CONN_DEL ); +if (conn->type ==SCO_LINK || conn->type ==ESCO_LINK ) { +switch (conn->setting &SCO_AIRMODE_MASK ) { +case SCO_AIRMODE_CVSD : +case SCO_AIRMODE_TRANSP : +if (hdev->notify) + hdev->notify (hdev,HCI_NOTIFY_DISABLE_SCO ); +break ; + } + }else { +if (hdev->notify) + hdev->notify (hdev,HCI_NOTIFY_CONN_DEL ); + }hci_conn_del_sysfs (conn);
@@ -577,8 +587,15 @@ struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst,hci_dev_hold (hdev);hci_conn_hash_add (hdev, conn); -if (hdev->notify) - hdev->notify (hdev,HCI_NOTIFY_CONN_ADD ); + +/* The SCO and eSCO connections will only be notified when their +* setup has been completed. This is different to ACL links which +* can be notified right away. +*/ +if (conn->type !=SCO_LINK && conn->type !=ESCO_LINK ) { +if (hdev->notify) + hdev->notify (hdev,HCI_NOTIFY_CONN_ADD ); + }hci_conn_init_sysfs (conn);
net/bluetooth/hci_event.c +22 -1
@@ -2607,8 +2607,16 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *skb)if (ev->status) {hci_connect_cfm (conn, ev->status);hci_conn_del (conn); - }else if (ev->link_type !=ACL_LINK ) + }else if (ev->link_type ==SCO_LINK ) { +switch (conn->setting &SCO_AIRMODE_MASK ) { +case SCO_AIRMODE_CVSD : +if (hdev->notify) + hdev->notify (hdev,HCI_NOTIFY_ENABLE_SCO_CVSD ); +break ; + } +hci_connect_cfm (conn, ev->status); + } unlock:hci_dev_unlock (hdev);
@@ -4307,6 +4315,19 @@ static void hci_sync_conn_complete_evt(struct hci_dev *hdev,break ; } +bt_dev_dbg (hdev,"SCO connected with air mode: %02x" , ev->air_mode); + +switch (conn->setting &SCO_AIRMODE_MASK ) { +case SCO_AIRMODE_CVSD : +if (hdev->notify) + hdev->notify (hdev,HCI_NOTIFY_ENABLE_SCO_CVSD ); +break ; +case SCO_AIRMODE_TRANSP : +if (hdev->notify) + hdev->notify (hdev,HCI_NOTIFY_ENABLE_SCO_TRANSP ); +break ; + } +hci_connect_cfm (conn, ev->status);if (ev->status)hci_conn_del (conn);
Signature · 1 line
2.25.1