Bluetooth: add support to notify using SCO air mode
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 <sathish.narasimman@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
This commit is contained in:
parent
1e5479be46
commit
1f8330ea16
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue