send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
 
-       list_del(&cmd->list);
-
        if (match->sk == NULL) {
                match->sk = cmd->sk;
                sock_hold(match->sk);
        }
-
-       mgmt_pending_free(cmd);
 }
 
 static void cmd_status_rsp(struct mgmt_pending_cmd *cmd, void *data)
 {
        u8 *status = data;
 
-       mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
-       mgmt_pending_remove(cmd);
+       mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, *status);
 }
 
 static void cmd_complete_rsp(struct mgmt_pending_cmd *cmd, void *data)
 
        if (cmd->cmd_complete) {
                cmd->cmd_complete(cmd, match->mgmt_status);
-               mgmt_pending_remove(cmd);
-
                return;
        }
 
 
 static int generic_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
 {
-       return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
+       return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status,
                                 cmd->param, cmd->param_len);
 }
 
 static int addr_cmd_complete(struct mgmt_pending_cmd *cmd, u8 status)
 {
-       return mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status,
+       return mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status,
                                 cmd->param, sizeof(struct mgmt_addr_info));
 }
 
 
        if (err) {
                u8 mgmt_err = mgmt_status(err);
-               mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
+               mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
                hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
                goto done;
        }
 
        if (err) {
                u8 mgmt_err = mgmt_status(err);
-               mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
+               mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
                goto done;
        }
 
                        new_settings(hdev, NULL);
                }
 
-               mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
-                                    &mgmt_err);
+               mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true,
+                                    cmd_status_rsp, &mgmt_err);
                return;
        }
 
                changed = hci_dev_test_and_clear_flag(hdev, HCI_SSP_ENABLED);
        }
 
-       mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);
+       mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, true, settings_rsp, &match);
 
        if (changed)
                new_settings(hdev, match.sk);
        bt_dev_dbg(hdev, "err %d", err);
 
        if (status) {
-               mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
-                                                       &status);
+               mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, cmd_status_rsp,
+                                    &status);
                return;
        }
 
-       mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);
+       mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, true, settings_rsp, &match);
 
        new_settings(hdev, match.sk);
 
        struct sock *sk = cmd->sk;
 
        if (status) {
-               mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev,
+               mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, true,
                                     cmd_status_rsp, &status);
                return;
        }
 
        bt_dev_dbg(hdev, "err %d", err);
 
-       mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
+       mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
                          mgmt_status(err), hdev->dev_class, 3);
 
        mgmt_pending_free(cmd);
        bacpy(&rp.addr.bdaddr, &conn->dst);
        rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
 
-       err = mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE,
+       err = mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_PAIR_DEVICE,
                                status, &rp, sizeof(rp));
 
        /* So we don't get further callbacks for this connection */
                hci_update_passive_scan(hdev);
        }
 
-       mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
+       mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
                          mgmt_status(status), &rp, sizeof(rp));
        mgmt_pending_remove(cmd);
 
                hci_update_passive_scan(hdev);
        }
 
-       mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
+       mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
                          mgmt_status(status), &rp, sizeof(rp));
        mgmt_pending_free(cmd);
 
            cmd != pending_find(MGMT_OP_START_SERVICE_DISCOVERY, hdev))
                return;
 
-       mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err),
+       mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err),
                          cmd->param, 1);
        mgmt_pending_remove(cmd);
 
 
        bt_dev_dbg(hdev, "err %d", err);
 
-       mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(err),
+       mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_status(err),
                          cmd->param, 1);
        mgmt_pending_remove(cmd);
 
        u8 status = mgmt_status(err);
 
        if (status) {
-               mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
+               mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true,
                                     cmd_status_rsp, &status);
                return;
        }
        else
                hci_dev_clear_flag(hdev, HCI_ADVERTISING);
 
-       mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, settings_rsp,
+       mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev, true, settings_rsp,
                             &match);
 
        new_settings(hdev, match.sk);
                 */
                hci_dev_clear_flag(hdev, HCI_BREDR_ENABLED);
 
-               mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
+               mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
        } else {
                send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev);
                new_settings(hdev, cmd->sk);
        if (err) {
                u8 mgmt_err = mgmt_status(err);
 
-               mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
+               mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode, mgmt_err);
                goto done;
        }
 
                rp.max_tx_power = HCI_TX_POWER_INVALID;
        }
 
-       mgmt_cmd_complete(cmd->sk, cmd->index, MGMT_OP_GET_CONN_INFO, status,
+       mgmt_cmd_complete(cmd->sk, cmd->hdev->id, MGMT_OP_GET_CONN_INFO, status,
                          &rp, sizeof(rp));
 
        mgmt_pending_free(cmd);
        }
 
 complete:
-       mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode, status, &rp,
+       mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode, status, &rp,
                          sizeof(rp));
 
        mgmt_pending_free(cmd);
        rp.instance = cp->instance;
 
        if (err)
-               mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
+               mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode,
                                mgmt_status(err));
        else
-               mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
+               mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
                                  mgmt_status(err), &rp, sizeof(rp));
 
        add_adv_complete(hdev, cmd->sk, cp->instance, err);
 
                hci_remove_adv_instance(hdev, cp->instance);
 
-               mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
+               mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode,
                                mgmt_status(err));
        } else {
-               mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
+               mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
                                  mgmt_status(err), &rp, sizeof(rp));
        }
 
        rp.instance = cp->instance;
 
        if (err)
-               mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
+               mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode,
                                mgmt_status(err));
        else
-               mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
+               mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
                                  mgmt_status(err), &rp, sizeof(rp));
 
        mgmt_pending_free(cmd);
        rp.instance = cp->instance;
 
        if (err)
-               mgmt_cmd_status(cmd->sk, cmd->index, cmd->opcode,
+               mgmt_cmd_status(cmd->sk, cmd->hdev->id, cmd->opcode,
                                mgmt_status(err));
        else
-               mgmt_cmd_complete(cmd->sk, cmd->index, cmd->opcode,
+               mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
                                  MGMT_STATUS_SUCCESS, &rp, sizeof(rp));
 
        mgmt_pending_free(cmd);
        if (test_bit(HCI_QUIRK_RAW_DEVICE, &hdev->quirks))
                return;
 
-       mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match);
+       mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match);
 
        if (hci_dev_test_flag(hdev, HCI_UNCONFIGURED)) {
                mgmt_index_event(MGMT_EV_UNCONF_INDEX_REMOVED, hdev, NULL, 0,
                hci_update_passive_scan(hdev);
        }
 
-       mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
+       mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp,
+                            &match);
 
        new_settings(hdev, match.sk);
 
        struct cmd_lookup match = { NULL, hdev };
        u8 zero_cod[] = { 0, 0, 0 };
 
-       mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
+       mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, true, settings_rsp,
+                            &match);
 
        /* If the power off is because of hdev unregistration let
         * use the appropriate INVALID_INDEX status. Otherwise use
        else
                match.mgmt_status = MGMT_STATUS_NOT_POWERED;
 
-       mgmt_pending_foreach(0, hdev, cmd_complete_rsp, &match);
+       mgmt_pending_foreach(0, hdev, true, cmd_complete_rsp, &match);
 
        if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0) {
                mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
        device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);
 
        cmd->cmd_complete(cmd, 0);
-       mgmt_pending_remove(cmd);
 }
 
 bool mgmt_powering_down(struct hci_dev *hdev)
        struct mgmt_cp_disconnect *cp;
        struct mgmt_pending_cmd *cmd;
 
-       mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
-                            hdev);
+       mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, true,
+                            unpair_device_rsp, hdev);
 
        cmd = pending_find(MGMT_OP_DISCONNECT, hdev);
        if (!cmd)
 
        if (status) {
                u8 mgmt_err = mgmt_status(status);
-               mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
+               mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true,
                                     cmd_status_rsp, &mgmt_err);
                return;
        }
        else
                changed = hci_dev_test_and_clear_flag(hdev, HCI_LINK_SECURITY);
 
-       mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
-                            &match);
+       mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, true,
+                            settings_rsp, &match);
 
        if (changed)
                new_settings(hdev, match.sk);
 {
        struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
 
-       mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match);
-       mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match);
-       mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
+       mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, false, sk_lookup,
+                            &match);
+       mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, false, sk_lookup,
+                            &match);
+       mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, false, sk_lookup,
+                            &match);
 
        if (!status) {
                mgmt_limited_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,