u32 len;
        u64 cookie;
        int ret;
+       bool send_completion = false;
        u8 pdev_id;
 
        msg = (struct ath11k_htt_extd_stats_msg *)skb->data;
                return;
 
        spin_lock_bh(&ar->debug.htt_stats.lock);
-       if (stats_req->done) {
-               spin_unlock_bh(&ar->debug.htt_stats.lock);
-               return;
-       }
-       stats_req->done = true;
+
+       stats_req->done = FIELD_GET(HTT_T2H_EXT_STATS_INFO1_DONE, msg->info1);
+       if (stats_req->done)
+               send_completion = true;
+
        spin_unlock_bh(&ar->debug.htt_stats.lock);
 
        len = FIELD_GET(HTT_T2H_EXT_STATS_INFO1_LENGTH, msg->info1);
        if (ret)
                ath11k_warn(ab, "Failed to parse tlv %d\n", ret);
 
-       complete(&stats_req->cmpln);
+       if (send_completion)
+               complete(&stats_req->cmpln);
 }
 
 static ssize_t ath11k_read_htt_stats_type(struct file *file,
        if (type == ATH11K_DBG_HTT_EXT_STATS_RESET)
                return -EPERM;
 
+       mutex_lock(&ar->conf_mutex);
+
+       if (ar->state != ATH11K_STATE_ON) {
+               ret = -ENETDOWN;
+               goto err_unlock;
+       }
+
+       if (ar->debug.htt_stats.stats_req) {
+               ret = -EAGAIN;
+               goto err_unlock;
+       }
+
        stats_req = vzalloc(sizeof(*stats_req) + ATH11K_HTT_STATS_BUF_SIZE);
-       if (!stats_req)
-               return -ENOMEM;
+       if (!stats_req) {
+               ret = -ENOMEM;
+               goto err_unlock;
+       }
 
-       mutex_lock(&ar->conf_mutex);
        ar->debug.htt_stats.stats_req = stats_req;
        stats_req->type = type;
+
        ret = ath11k_dbg_htt_stats_req(ar);
-       mutex_unlock(&ar->conf_mutex);
        if (ret < 0)
                goto out;
 
        file->private_data = stats_req;
+
+       mutex_unlock(&ar->conf_mutex);
+
        return 0;
 out:
        vfree(stats_req);
+       ar->debug.htt_stats.stats_req = NULL;
+err_unlock:
+       mutex_unlock(&ar->conf_mutex);
+
        return ret;
 }
 
 static int ath11k_release_htt_stats(struct inode *inode, struct file *file)
 {
+       struct ath11k *ar = inode->i_private;
+
+       mutex_lock(&ar->conf_mutex);
        vfree(file->private_data);
+       ar->debug.htt_stats.stats_req = NULL;
+       mutex_unlock(&ar->conf_mutex);
+
        return 0;
 }