__le16  period;
 } __packed;
 
+#define HCI_OP_LE_EXT_CREATE_CONN    0x2043
+struct hci_cp_le_ext_create_conn {
+       __u8      filter_policy;
+       __u8      own_addr_type;
+       __u8      peer_addr_type;
+       bdaddr_t  peer_addr;
+       __u8      phys;
+       __u8      data[0];
+} __packed;
+
+struct hci_cp_le_ext_conn_param {
+       __le16 scan_interval;
+       __le16 scan_window;
+       __le16 conn_interval_min;
+       __le16 conn_interval_max;
+       __le16 conn_latency;
+       __le16 supervision_timeout;
+       __le16 min_ce_len;
+       __le16 max_ce_len;
+} __packed;
+
 /* ---- HCI Events ---- */
 #define HCI_EV_INQUIRY_COMPLETE                0x01
 
        __u8     data[0];
 } __packed;
 
+#define HCI_EV_LE_ENHANCED_CONN_COMPLETE    0x0a
+struct hci_ev_le_enh_conn_complete {
+       __u8      status;
+       __le16    handle;
+       __u8      role;
+       __u8      bdaddr_type;
+       bdaddr_t  bdaddr;
+       bdaddr_t  local_rpa;
+       bdaddr_t  peer_rpa;
+       __le16    interval;
+       __le16    latency;
+       __le16    supervision_timeout;
+       __u8      clk_accurancy;
+} __packed;
+
 /* Internal events generated by Bluetooth stack */
 #define HCI_EV_STACK_INTERNAL  0xfd
 struct hci_ev_stack_internal {
 
 /* Use ext scanning if set ext scan param and ext scan enable is supported */
 #define use_ext_scan(dev) (((dev)->commands[37] & 0x20) && \
                           ((dev)->commands[37] & 0x40))
+/* Use ext create connection if command is supported */
+#define use_ext_conn(dev) ((dev)->commands[37] & 0x80)
 
 /* ----- HCI protocols ----- */
 #define HCI_PROTO_DEFER             0x01
 
                                       struct hci_conn *conn,
                                       bdaddr_t *direct_rpa)
 {
-       struct hci_cp_le_create_conn cp;
        struct hci_dev *hdev = conn->hdev;
        u8 own_addr_type;
 
                        return;
        }
 
-       memset(&cp, 0, sizeof(cp));
+       if (use_ext_conn(hdev)) {
+               struct hci_cp_le_ext_create_conn *cp;
+               struct hci_cp_le_ext_conn_param *p;
+               /* As of now only LE 1M is supported */
+               u8 data[sizeof(*cp) + sizeof(*p) * 1];
 
-       /* Set window to be the same value as the interval to enable
-        * continuous scanning.
-        */
-       cp.scan_interval = cpu_to_le16(hdev->le_scan_interval);
-       cp.scan_window = cp.scan_interval;
+               cp = (void *) data;
+               p = (void *) cp->data;
 
-       bacpy(&cp.peer_addr, &conn->dst);
-       cp.peer_addr_type = conn->dst_type;
-       cp.own_address_type = own_addr_type;
-       cp.conn_interval_min = cpu_to_le16(conn->le_conn_min_interval);
-       cp.conn_interval_max = cpu_to_le16(conn->le_conn_max_interval);
-       cp.conn_latency = cpu_to_le16(conn->le_conn_latency);
-       cp.supervision_timeout = cpu_to_le16(conn->le_supv_timeout);
-       cp.min_ce_len = cpu_to_le16(0x0000);
-       cp.max_ce_len = cpu_to_le16(0x0000);
-
-       hci_req_add(req, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp);
+               memset(cp, 0, sizeof(*cp));
+
+               bacpy(&cp->peer_addr, &conn->dst);
+               cp->peer_addr_type = conn->dst_type;
+               cp->own_addr_type = own_addr_type;
+               cp->phys = LE_SCAN_PHY_1M;
+
+               memset(p, 0, sizeof(*p));
+
+               /* Set window to be the same value as the interval to enable
+                * continuous scanning.
+                */
+
+               p->scan_interval = cpu_to_le16(hdev->le_scan_interval);
+               p->scan_window = p->scan_interval;
+               p->conn_interval_min = cpu_to_le16(conn->le_conn_min_interval);
+               p->conn_interval_max = cpu_to_le16(conn->le_conn_max_interval);
+               p->conn_latency = cpu_to_le16(conn->le_conn_latency);
+               p->supervision_timeout = cpu_to_le16(conn->le_supv_timeout);
+               p->min_ce_len = cpu_to_le16(0x0000);
+               p->max_ce_len = cpu_to_le16(0x0000);
+
+               hci_req_add(req, HCI_OP_LE_EXT_CREATE_CONN, sizeof(data), data);
+
+       } else {
+               struct hci_cp_le_create_conn cp;
+
+               memset(&cp, 0, sizeof(cp));
+
+               /* Set window to be the same value as the interval to enable
+                * continuous scanning.
+                */
+               cp.scan_interval = cpu_to_le16(hdev->le_scan_interval);
+               cp.scan_window = cp.scan_interval;
+
+               bacpy(&cp.peer_addr, &conn->dst);
+               cp.peer_addr_type = conn->dst_type;
+               cp.own_address_type = own_addr_type;
+               cp.conn_interval_min = cpu_to_le16(conn->le_conn_min_interval);
+               cp.conn_interval_max = cpu_to_le16(conn->le_conn_max_interval);
+               cp.conn_latency = cpu_to_le16(conn->le_conn_latency);
+               cp.supervision_timeout = cpu_to_le16(conn->le_supv_timeout);
+               cp.min_ce_len = cpu_to_le16(0x0000);
+               cp.max_ce_len = cpu_to_le16(0x0000);
+
+               hci_req_add(req, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp);
+       }
 
        conn->state = BT_CONNECT;
        clear_bit(HCI_CONN_SCANNING, &conn->flags);
 
                                                 * Report
                                                 */
 
+               /* If the controller supports the LE Extended Create Connection
+                * command, enable the corresponding event.
+                */
+               if (use_ext_conn(hdev))
+                       events[1] |= 0x02;      /* LE Enhanced Connection
+                                                * Complete
+                                                */
+
                hci_req_add(req, HCI_OP_LE_SET_EVENT_MASK, sizeof(events),
                            events);
 
 
        hci_dev_unlock(hdev);
 }
 
+static void hci_cs_le_ext_create_conn(struct hci_dev *hdev, u8 status)
+{
+       struct hci_cp_le_ext_create_conn *cp;
+
+       BT_DBG("%s status 0x%2.2x", hdev->name, status);
+
+       /* All connection failure handling is taken care of by the
+        * hci_le_conn_failed function which is triggered by the HCI
+        * request completion callbacks used for connecting.
+        */
+       if (status)
+               return;
+
+       cp = hci_sent_cmd_data(hdev, HCI_OP_LE_EXT_CREATE_CONN);
+       if (!cp)
+               return;
+
+       hci_dev_lock(hdev);
+
+       cs_le_create_conn(hdev, &cp->peer_addr, cp->peer_addr_type,
+                         cp->own_addr_type, cp->filter_policy);
+
+       hci_dev_unlock(hdev);
+}
+
 static void hci_cs_le_read_remote_features(struct hci_dev *hdev, u8 status)
 {
        struct hci_cp_le_read_remote_features *cp;
                hci_cs_le_start_enc(hdev, ev->status);
                break;
 
+       case HCI_OP_LE_EXT_CREATE_CONN:
+               hci_cs_le_ext_create_conn(hdev, ev->status);
+               break;
+
        default:
                BT_DBG("%s opcode 0x%4.4x", hdev->name, *opcode);
                break;
                             le16_to_cpu(ev->supervision_timeout));
 }
 
+static void hci_le_enh_conn_complete_evt(struct hci_dev *hdev,
+                                        struct sk_buff *skb)
+{
+       struct hci_ev_le_enh_conn_complete *ev = (void *) skb->data;
+
+       BT_DBG("%s status 0x%2.2x", hdev->name, ev->status);
+
+       le_conn_complete_evt(hdev, ev->status, &ev->bdaddr, ev->bdaddr_type,
+                            ev->role, le16_to_cpu(ev->handle),
+                            le16_to_cpu(ev->interval),
+                            le16_to_cpu(ev->latency),
+                            le16_to_cpu(ev->supervision_timeout));
+}
+
 static void hci_le_conn_update_complete_evt(struct hci_dev *hdev,
                                            struct sk_buff *skb)
 {
                hci_le_ext_adv_report_evt(hdev, skb);
                break;
 
+       case HCI_EV_LE_ENHANCED_CONN_COMPLETE:
+               hci_le_enh_conn_complete_evt(hdev, skb);
+               break;
+
        default:
                break;
        }