Bluetooth: Add SCO fallback for eSCO connection attempts
[pandora-kernel.git] / net / bluetooth / hci_event.c
index 014fc8b..899b899 100644 (file)
@@ -484,6 +484,15 @@ static void hci_cc_read_local_features(struct hci_dev *hdev, struct sk_buff *skb
        if (hdev->features[4] & LMP_EV5)
                hdev->esco_type |= (ESCO_EV5);
 
+       if (hdev->features[5] & LMP_EDR_ESCO_2M)
+               hdev->esco_type |= (ESCO_2EV3);
+
+       if (hdev->features[5] & LMP_EDR_ESCO_3M)
+               hdev->esco_type |= (ESCO_3EV3);
+
+       if (hdev->features[5] & LMP_EDR_3S_ESCO)
+               hdev->esco_type |= (ESCO_2EV5 | ESCO_3EV5);
+
        BT_DBG("%s features 0x%.2x%.2x%.2x%.2x%.2x%.2x%.2x%.2x", hdev->name,
                                        hdev->features[0], hdev->features[1],
                                        hdev->features[2], hdev->features[3],
@@ -1639,6 +1648,13 @@ static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_bu
                conn->type = SCO_LINK;
        }
 
+       if (conn->out && ev->status == 0x1c && conn->attempt < 2) {
+               conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
+                                       (hdev->esco_type & EDR_ESCO_MASK);
+               hci_setup_sync(conn, conn->link->handle);
+               goto unlock;
+       }
+
        if (!ev->status) {
                conn->handle = __le16_to_cpu(ev->handle);
                conn->state  = BT_CONNECTED;