complete(&ar->scan.started);
                complete(&ar->scan.completed);
                complete(&ar->peer_assoc_done);
+               complete(&ar->peer_delete_done);
                complete(&ar->install_key_done);
                complete(&ar->vdev_setup_done);
                complete(&ar->vdev_delete_done);
 
        u8 lmac_id;
 
        struct completion peer_assoc_done;
+       struct completion peer_delete_done;
 
        int install_key_status;
        struct completion install_key_done;
 
 
 err_peer_del:
        if (arvif->vdev_type == WMI_VDEV_TYPE_AP) {
+               reinit_completion(&ar->peer_delete_done);
+
+               ret = ath11k_wmi_send_peer_delete_cmd(ar, vif->addr,
+                                                     arvif->vdev_id);
+               if (ret) {
+                       ath11k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
+                                   arvif->vdev_id, vif->addr);
+                       return ret;
+               }
+
+               ret = ath11k_wait_for_peer_delete_done(ar, arvif->vdev_id,
+                                                      vif->addr);
+               if (ret)
+                       return ret;
+
                ar->num_peers--;
-               ath11k_wmi_send_peer_delete_cmd(ar, vif->addr, arvif->vdev_id);
        }
 
 err_vdev_del:
                init_completion(&ar->vdev_setup_done);
                init_completion(&ar->vdev_delete_done);
                init_completion(&ar->peer_assoc_done);
+               init_completion(&ar->peer_delete_done);
                init_completion(&ar->install_key_done);
                init_completion(&ar->bss_survey_done);
                init_completion(&ar->scan.started);
 
        return ath11k_wait_for_peer_common(ar->ab, vdev_id, addr, false);
 }
 
+int ath11k_wait_for_peer_delete_done(struct ath11k *ar, u32 vdev_id,
+                                    const u8 *addr)
+{
+       int ret;
+       unsigned long time_left;
+
+       ret = ath11k_wait_for_peer_deleted(ar, vdev_id, addr);
+       if (ret) {
+               ath11k_warn(ar->ab, "failed wait for peer deleted");
+               return ret;
+       }
+
+       time_left = wait_for_completion_timeout(&ar->peer_delete_done,
+                                               3 * HZ);
+       if (time_left == 0) {
+               ath11k_warn(ar->ab, "Timeout in receiving peer delete response\n");
+               return -ETIMEDOUT;
+       }
+
+       return 0;
+}
+
 int ath11k_peer_delete(struct ath11k *ar, u32 vdev_id, u8 *addr)
 {
        int ret;
 
        lockdep_assert_held(&ar->conf_mutex);
 
+       reinit_completion(&ar->peer_delete_done);
+
        ret = ath11k_wmi_send_peer_delete_cmd(ar, addr, vdev_id);
        if (ret) {
                ath11k_warn(ar->ab,
                return ret;
        }
 
-       ret = ath11k_wait_for_peer_deleted(ar, vdev_id, addr);
+       ret = ath11k_wait_for_peer_delete_done(ar, vdev_id, addr);
        if (ret)
                return ret;
 
                spin_unlock_bh(&ar->ab->base_lock);
                ath11k_warn(ar->ab, "failed to find peer %pM on vdev %i after creation\n",
                            param->peer_addr, param->vdev_id);
-               ath11k_wmi_send_peer_delete_cmd(ar, param->peer_addr,
-                                               param->vdev_id);
+
+               reinit_completion(&ar->peer_delete_done);
+
+               ret = ath11k_wmi_send_peer_delete_cmd(ar, param->peer_addr,
+                                                     param->vdev_id);
+               if (ret) {
+                       ath11k_warn(ar->ab, "failed to delete peer vdev_id %d addr %pM\n",
+                                   param->vdev_id, param->peer_addr);
+                       return ret;
+               }
+
+               ret = ath11k_wait_for_peer_delete_done(ar, param->vdev_id,
+                                                      param->peer_addr);
+               if (ret)
+                       return ret;
+
                return -ENOENT;
        }
 
 
 int ath11k_peer_delete(struct ath11k *ar, u32 vdev_id, u8 *addr);
 int ath11k_peer_create(struct ath11k *ar, struct ath11k_vif *arvif,
                       struct ieee80211_sta *sta, struct peer_create_params *param);
+int ath11k_wait_for_peer_delete_done(struct ath11k *ar, u32 vdev_id,
+                                    const u8 *addr);
 
 #endif /* _PEER_H_ */
 
 static void ath11k_peer_delete_resp_event(struct ath11k_base *ab, struct sk_buff *skb)
 {
        struct wmi_peer_delete_resp_event peer_del_resp;
+       struct ath11k *ar;
 
        if (ath11k_pull_peer_del_resp_ev(ab, skb, &peer_del_resp) != 0) {
                ath11k_warn(ab, "failed to extract peer delete resp");
                return;
        }
 
-       /* TODO: Do we need to validate whether ath11k_peer_find() return NULL
-        *       Why this is needed when there is HTT event for peer delete
-        */
+       rcu_read_lock();
+       ar = ath11k_mac_get_ar_by_vdev_id(ab, peer_del_resp.vdev_id);
+       if (!ar) {
+               ath11k_warn(ab, "invalid vdev id in peer delete resp ev %d",
+                           peer_del_resp.vdev_id);
+               rcu_read_unlock();
+               return;
+       }
+
+       complete(&ar->peer_delete_done);
+       rcu_read_unlock();
+       ath11k_dbg(ab, ATH11K_DBG_WMI, "peer delete resp for vdev id %d addr %pM\n",
+                  peer_del_resp.vdev_id, peer_del_resp.peer_macaddr.addr);
 }
 
 static void ath11k_vdev_delete_resp_event(struct ath11k_base *ab,