#define ESCO_EV3       0x0008
 #define ESCO_EV4       0x0010
 #define ESCO_EV5       0x0020
+#define ESCO_2EV3      0x0040
+#define ESCO_3EV3      0x0080
+#define ESCO_2EV5      0x0100
+#define ESCO_3EV5      0x0200
 
 #define SCO_ESCO_MASK  (ESCO_HV1 | ESCO_HV2 | ESCO_HV3)
+#define EDR_ESCO_MASK  (ESCO_2EV3 | ESCO_3EV3 | ESCO_2EV5 | ESCO_3EV5)
 
 /* ACL flags */
 #define ACL_CONT               0x01
 #define LMP_EV5                0x02
 
 #define LMP_SNIFF_SUBR 0x02
+#define LMP_EDR_ESCO_2M        0x20
+#define LMP_EDR_ESCO_3M        0x40
+#define LMP_EDR_3S_ESCO        0x80
 
 #define LMP_SIMPLE_PAIR        0x08
 
 
        conn->state = BT_CONNECT;
        conn->out = 1;
 
+       conn->attempt++;
+
        cp.handle   = cpu_to_le16(handle);
        cp.pkt_type = cpu_to_le16(conn->pkt_type);
 
        conn->state = BT_CONNECT;
        conn->out = 1;
 
+       conn->attempt++;
+
        cp.handle   = cpu_to_le16(handle);
        cp.pkt_type = cpu_to_le16(conn->pkt_type);
 
                break;
        case SCO_LINK:
                if (lmp_esco_capable(hdev))
-                       conn->pkt_type = hdev->esco_type & SCO_ESCO_MASK;
+                       conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
+                                       (hdev->esco_type & EDR_ESCO_MASK);
                else
                        conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
                break;
        case ESCO_LINK:
-               conn->pkt_type = hdev->esco_type;
+               conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK;
                break;
        }
 
 
        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],
                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;