--- net/bluetooth/hci_conn.c.orig 2008-02-26 17:19:55.000000000 +0100 +++ net/bluetooth/hci_conn.c 2008-02-26 17:24:22.000000000 +0100 @@ -326,6 +326,9 @@ if (type == ACL_LINK) return acl; + if (lmp_esco_capable(hdev) && lmp_esco_capable(acl)) + type = ESCO_LINK; + if (!(sco = hci_conn_hash_lookup_ba(hdev, type, dst))) { if (!(sco = hci_conn_add(hdev, type, dst))) { hci_conn_put(acl); @@ -340,7 +343,7 @@ if (acl->state == BT_CONNECTED && (sco->state == BT_OPEN || sco->state == BT_CLOSED)) { - if (lmp_esco_capable(hdev)) + if (type == ESCO_LINK) hci_setup_sync(sco, acl->handle); else hci_add_sco(sco, acl->handle); --- net/bluetooth/hci_event.c.orig 2008-02-26 17:20:11.000000000 +0100 +++ net/bluetooth/hci_event.c 2008-02-26 17:24:22.000000000 +0100 @@ -720,7 +720,7 @@ struct hci_conn *sco = conn->link; if (sco) { if (!ev->status) { - if (lmp_esco_capable(hdev)) + if (lmp_esco_capable(hdev) && lmp_esco_capable(conn)) hci_setup_sync(sco, conn->handle); else hci_add_sco(sco, conn->handle); @@ -771,7 +771,7 @@ hci_dev_unlock(hdev); - if (ev->link_type == ACL_LINK || !lmp_esco_capable(hdev)) { + if (ev->link_type == ACL_LINK || !lmp_esco_capable(hdev) || !lmp_esco_capable(conn)) { struct hci_cp_accept_conn_req cp; bacpy(&cp.bdaddr, &ev->bdaddr); --- net/bluetooth/sco.c.orig 2008-02-26 17:20:21.000000000 +0100 +++ net/bluetooth/sco.c 2008-02-26 17:24:22.000000000 +0100 @@ -182,7 +182,7 @@ struct sco_conn *conn; struct hci_conn *hcon; struct hci_dev *hdev; - int err, type; + int err; BT_DBG("%s -> %s", batostr(src), batostr(dst)); @@ -193,9 +193,8 @@ err = -ENOMEM; - type = lmp_esco_capable(hdev) ? ESCO_LINK : SCO_LINK; - - hcon = hci_connect(hdev, type, dst); + /* SCO or ESCO is decided in hci_connect */ + hcon = hci_connect(hdev, SCO_LINK, dst); if (!hcon) goto done;