#define ESCO_EV4       0x0010
 #define ESCO_EV5       0x0020
 
+#define SCO_ESCO_MASK  (ESCO_HV1 | ESCO_HV2 | ESCO_HV3)
+
 /* ACL flags */
 #define ACL_CONT               0x01
 #define ACL_START              0x02
        __le16   clock_offset;
 } __attribute__ ((packed));
 
+#define HCI_EV_PKT_TYPE_CHANGE         0x1d
+struct hci_ev_pkt_type_change {
+       __u8     status;
+       __le16   handle;
+       __le16   pkt_type;
+} __attribute__ ((packed));
+
 #define HCI_EV_PSCAN_REP_MODE          0x20
 struct hci_ev_pscan_rep_mode {
        bdaddr_t bdaddr;
 
        BT_DBG("%p", conn);
 
        conn->state = BT_CONNECT;
-       conn->out   = 1;
+       conn->out = 1;
+
        conn->link_mode = HCI_LM_MASTER;
 
        conn->attempt++;
                memcpy(conn->dev_class, ie->data.dev_class, 3);
        }
 
-       cp.pkt_type = cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK);
+       cp.pkt_type = cpu_to_le16(conn->pkt_type);
        if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
                cp.role_switch = 0x01;
        else
        conn->out = 1;
 
        cp.handle   = cpu_to_le16(handle);
-       cp.pkt_type = cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK);
+       cp.pkt_type = cpu_to_le16(conn->pkt_type);
 
        hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp);
 }
        conn->out = 1;
 
        cp.handle   = cpu_to_le16(handle);
-       cp.pkt_type = cpu_to_le16(hdev->esco_type);
+       cp.pkt_type = cpu_to_le16(conn->pkt_type);
 
        cp.tx_bandwidth   = cpu_to_le32(0x00001f40);
        cp.rx_bandwidth   = cpu_to_le32(0x00001f40);
                return NULL;
 
        bacpy(&conn->dst, dst);
-       conn->hdev   = hdev;
-       conn->type   = type;
-       conn->mode   = HCI_CM_ACTIVE;
-       conn->state  = BT_OPEN;
+       conn->hdev  = hdev;
+       conn->type  = type;
+       conn->mode  = HCI_CM_ACTIVE;
+       conn->state = BT_OPEN;
 
        conn->power_save = 1;
 
+       switch (type) {
+       case ACL_LINK:
+               conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK;
+               break;
+       case SCO_LINK:
+               if (lmp_esco_capable(hdev))
+                       conn->pkt_type = hdev->esco_type & SCO_ESCO_MASK;
+               else
+                       conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
+               break;
+       case ESCO_LINK:
+               conn->pkt_type = hdev->esco_type;
+               break;
+       }
+
        skb_queue_head_init(&conn->data_q);
 
        setup_timer(&conn->disc_timer, hci_conn_timeout, (unsigned long)conn);
 
                }
 
                /* Set packet type for incoming connection */
-               if (!conn->out) {
+               if (!conn->out && hdev->hci_ver < 3) {
                        struct hci_cp_change_conn_ptype cp;
                        cp.handle = ev->handle;
-                       cp.pkt_type = (conn->type == ACL_LINK) ?
-                               cpu_to_le16(hdev->pkt_type & ACL_PTYPE_MASK):
-                               cpu_to_le16(hdev->pkt_type & SCO_PTYPE_MASK);
-
-                       hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE, sizeof(cp), &cp);
+                       cp.pkt_type = cpu_to_le16(conn->pkt_type);
+                       hci_send_cmd(hdev, HCI_OP_CHANGE_CONN_PTYPE,
+                                                       sizeof(cp), &cp);
                } else {
                        /* Update disconnect timer */
                        hci_conn_hold(conn);
                        struct hci_cp_accept_sync_conn_req cp;
 
                        bacpy(&cp.bdaddr, &ev->bdaddr);
-                       cp.pkt_type = cpu_to_le16(hdev->esco_type);
+                       cp.pkt_type = cpu_to_le16(conn->pkt_type);
 
                        cp.tx_bandwidth   = cpu_to_le32(0x00001f40);
                        cp.rx_bandwidth   = cpu_to_le32(0x00001f40);
        hci_dev_unlock(hdev);
 }
 
+static inline void hci_pkt_type_change_evt(struct hci_dev *hdev, struct sk_buff *skb)
+{
+       struct hci_ev_pkt_type_change *ev = (void *) skb->data;
+       struct hci_conn *conn;
+
+       BT_DBG("%s status %d", hdev->name, ev->status);
+
+       hci_dev_lock(hdev);
+
+       conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle));
+       if (conn && !ev->status)
+               conn->pkt_type = __le16_to_cpu(ev->pkt_type);
+
+       hci_dev_unlock(hdev);
+}
+
 static inline void hci_pscan_rep_mode_evt(struct hci_dev *hdev, struct sk_buff *skb)
 {
        struct hci_ev_pscan_rep_mode *ev = (void *) skb->data;
                hci_clock_offset_evt(hdev, skb);
                break;
 
+       case HCI_EV_PKT_TYPE_CHANGE:
+               hci_pkt_type_change_evt(hdev, skb);
+               break;
+
        case HCI_EV_PSCAN_REP_MODE:
                hci_pscan_rep_mode_evt(hdev, skb);
                break;