enum sof_dtrace_state {
        SOF_DTRACE_DISABLED,
        SOF_DTRACE_STOPPED,
+       SOF_DTRACE_INITIALIZING,
        SOF_DTRACE_ENABLED,
 };
 
        enum sof_dtrace_state dtrace_state;
 };
 
+static bool trace_pos_update_expected(struct sof_dtrace_priv *priv)
+{
+       if (priv->dtrace_state == SOF_DTRACE_ENABLED ||
+           priv->dtrace_state == SOF_DTRACE_INITIALIZING)
+               return true;
+
+       return false;
+}
+
 static int trace_filter_append_elem(struct snd_sof_dev *sdev, u32 key, u32 value,
                                    struct sof_ipc_trace_filter_elem *elem_list,
                                    int capacity, int *counter)
        if (ret)
                return ret;
 
-       if (priv->dtrace_state != SOF_DTRACE_ENABLED && priv->dtrace_draining) {
+       if (priv->dtrace_draining && !trace_pos_update_expected(priv)) {
                /*
                 * tracing has ended and all traces have been
                 * read by client, return EOF
        dev_dbg(sdev->dev, "%s: stream_tag: %d\n", __func__, params.stream_tag);
 
        /* send IPC to the DSP */
+       priv->dtrace_state = SOF_DTRACE_INITIALIZING;
        ret = sof_ipc_tx_message(sdev->ipc, ¶ms, sizeof(params), &ipc_reply, sizeof(ipc_reply));
        if (ret < 0) {
                dev_err(sdev->dev, "can't set params for DMA for trace %d\n", ret);
        }
 
 start:
+       priv->dtrace_state = SOF_DTRACE_ENABLED;
+
        ret = sof_dtrace_host_trigger(sdev, SNDRV_PCM_TRIGGER_START);
        if (ret < 0) {
                dev_err(sdev->dev, "Host dtrace trigger start failed: %d\n", ret);
                goto trace_release;
        }
 
-       priv->dtrace_state = SOF_DTRACE_ENABLED;
-
        return 0;
 
 trace_release:
+       priv->dtrace_state = SOF_DTRACE_DISABLED;
        sof_dtrace_host_release(sdev);
        return ret;
 }
        if (!sdev->fw_trace_is_supported)
                return 0;
 
-       if (priv->dtrace_state == SOF_DTRACE_ENABLED &&
+       if (trace_pos_update_expected(priv) &&
            priv->host_offset != posn->host_offset) {
                priv->host_offset = posn->host_offset;
                wake_up(&priv->trace_sleep);