return 0;
 }
 
-static void ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
+static int ath11k_qmi_event_server_arrive(struct ath11k_qmi *qmi)
 {
        struct ath11k_base *ab = qmi->ab;
        int ret;
        ret = ath11k_qmi_fw_ind_register_send(ab);
        if (ret < 0) {
                ath11k_warn(ab, "qmi failed to send FW indication QMI:%d\n", ret);
-               return;
+               return ret;
        }
 
        ret = ath11k_qmi_host_cap_send(ab);
        if (ret < 0) {
                ath11k_warn(ab, "qmi failed to send host cap QMI:%d\n", ret);
-               return;
+               return ret;
        }
+
+       return ret;
 }
 
-static void ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
+static int ath11k_qmi_event_mem_request(struct ath11k_qmi *qmi)
 {
        struct ath11k_base *ab = qmi->ab;
        int ret;
        ret = ath11k_qmi_respond_fw_mem_request(ab);
        if (ret < 0) {
                ath11k_warn(ab, "qmi failed to respond fw mem req:%d\n", ret);
-               return;
+               return ret;
        }
+
+       return ret;
 }
 
-static void ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
+static int ath11k_qmi_event_load_bdf(struct ath11k_qmi *qmi)
 {
        struct ath11k_base *ab = qmi->ab;
        int ret;
        ret = ath11k_qmi_request_target_cap(ab);
        if (ret < 0) {
                ath11k_warn(ab, "qmi failed to req target capabilities:%d\n", ret);
-               return;
+               return ret;
        }
 
        if (ab->bus_params.fixed_bdf_addr)
                ret = ath11k_qmi_load_bdf_qmi(ab);
        if (ret < 0) {
                ath11k_warn(ab, "qmi failed to load board data file:%d\n", ret);
-               return;
+               return ret;
        }
 
        ret = ath11k_qmi_wlanfw_m3_info_send(ab);
        if (ret < 0) {
                ath11k_warn(ab, "qmi failed to send m3 info req:%d\n", ret);
-               return;
+               return ret;
        }
+
+       return ret;
 }
 
 static void ath11k_qmi_msg_mem_request_cb(struct qmi_handle *qmi_hdl,
        ath11k_dbg(ab, ATH11K_DBG_QMI, "qmi wifi fw qmi service connected\n");
        ath11k_qmi_driver_event_post(qmi, ATH11K_QMI_EVENT_SERVER_ARRIVE, NULL);
 
-       return 0;
+       return ret;
 }
 
 static void ath11k_qmi_ops_del_server(struct qmi_handle *qmi_hdl,
                                              event_work);
        struct ath11k_qmi_driver_event *event;
        struct ath11k_base *ab = qmi->ab;
+       int ret;
 
        spin_lock(&qmi->event_lock);
        while (!list_empty(&qmi->event_list)) {
 
                switch (event->type) {
                case ATH11K_QMI_EVENT_SERVER_ARRIVE:
-                       ath11k_qmi_event_server_arrive(qmi);
+                       ret = ath11k_qmi_event_server_arrive(qmi);
+                       if (ret < 0)
+                               set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
                        break;
                case ATH11K_QMI_EVENT_SERVER_EXIT:
                        set_bit(ATH11K_FLAG_CRASH_FLUSH, &ab->dev_flags);
                        set_bit(ATH11K_FLAG_RECOVERY, &ab->dev_flags);
                        break;
                case ATH11K_QMI_EVENT_REQUEST_MEM:
-                       ath11k_qmi_event_mem_request(qmi);
+                       ret = ath11k_qmi_event_mem_request(qmi);
+                       if (ret < 0)
+                               set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
                        break;
                case ATH11K_QMI_EVENT_FW_MEM_READY:
-                       ath11k_qmi_event_load_bdf(qmi);
+                       ret = ath11k_qmi_event_load_bdf(qmi);
+                       if (ret < 0)
+                               set_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
                        break;
                case ATH11K_QMI_EVENT_FW_READY:
+                       clear_bit(ATH11K_FLAG_QMI_FAIL, &ab->dev_flags);
                        if (test_bit(ATH11K_FLAG_REGISTERED, &ab->dev_flags)) {
                                ath11k_hal_dump_srng_stats(ab);
                                queue_work(ab->workqueue, &ab->restart_work);
        ath11k_qmi_m3_free(ab);
        ath11k_qmi_free_target_mem_chunk(ab);
 }
+EXPORT_SYMBOL(ath11k_qmi_deinit_service);