return;
 
        if (ext_adv_capable(hdev)) {
-               struct hci_cp_le_set_ext_scan_rsp_data cp;
+               struct {
+                       struct hci_cp_le_set_ext_scan_rsp_data cp;
+                       u8 data[HCI_MAX_EXT_AD_LENGTH];
+               } pdu;
 
-               memset(&cp, 0, sizeof(cp));
+               memset(&pdu, 0, sizeof(pdu));
 
                if (instance)
                        len = create_instance_scan_rsp_data(hdev, instance,
-                                                           cp.data);
+                                                           pdu.data);
                else
-                       len = create_default_scan_rsp_data(hdev, cp.data);
+                       len = create_default_scan_rsp_data(hdev, pdu.data);
 
                if (hdev->scan_rsp_data_len == len &&
-                   !memcmp(cp.data, hdev->scan_rsp_data, len))
+                   !memcmp(pdu.data, hdev->scan_rsp_data, len))
                        return;
 
-               memcpy(hdev->scan_rsp_data, cp.data, sizeof(cp.data));
+               memcpy(hdev->scan_rsp_data, pdu.data, len);
                hdev->scan_rsp_data_len = len;
 
-               cp.handle = instance;
-               cp.length = len;
-               cp.operation = LE_SET_ADV_DATA_OP_COMPLETE;
-               cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG;
+               pdu.cp.handle = instance;
+               pdu.cp.length = len;
+               pdu.cp.operation = LE_SET_ADV_DATA_OP_COMPLETE;
+               pdu.cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG;
 
-               hci_req_add(req, HCI_OP_LE_SET_EXT_SCAN_RSP_DATA, sizeof(cp),
-                           &cp);
+               hci_req_add(req, HCI_OP_LE_SET_EXT_SCAN_RSP_DATA,
+                           sizeof(pdu.cp) + len, &pdu.cp);
        } else {
                struct hci_cp_le_set_scan_rsp_data cp;
 
                return;
 
        if (ext_adv_capable(hdev)) {
-               struct hci_cp_le_set_ext_adv_data cp;
+               struct {
+                       struct hci_cp_le_set_ext_adv_data cp;
+                       u8 data[HCI_MAX_EXT_AD_LENGTH];
+               } pdu;
 
-               memset(&cp, 0, sizeof(cp));
+               memset(&pdu, 0, sizeof(pdu));
 
-               len = create_instance_adv_data(hdev, instance, cp.data);
+               len = create_instance_adv_data(hdev, instance, pdu.data);
 
                /* There's nothing to do if the data hasn't changed */
                if (hdev->adv_data_len == len &&
-                   memcmp(cp.data, hdev->adv_data, len) == 0)
+                   memcmp(pdu.data, hdev->adv_data, len) == 0)
                        return;
 
-               memcpy(hdev->adv_data, cp.data, sizeof(cp.data));
+               memcpy(hdev->adv_data, pdu.data, len);
                hdev->adv_data_len = len;
 
-               cp.length = len;
-               cp.handle = instance;
-               cp.operation = LE_SET_ADV_DATA_OP_COMPLETE;
-               cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG;
+               pdu.cp.length = len;
+               pdu.cp.handle = instance;
+               pdu.cp.operation = LE_SET_ADV_DATA_OP_COMPLETE;
+               pdu.cp.frag_pref = LE_SET_ADV_DATA_NO_FRAG;
 
-               hci_req_add(req, HCI_OP_LE_SET_EXT_ADV_DATA, sizeof(cp), &cp);
+               hci_req_add(req, HCI_OP_LE_SET_EXT_ADV_DATA,
+                           sizeof(pdu.cp) + len, &pdu.cp);
        } else {
                struct hci_cp_le_set_adv_data cp;