struct snd_compr_stream *substream = prtd->cstream;
        unsigned long flags;
        uint64_t avail;
+       uint32_t bytes_written;
 
        switch (opcode) {
        case ASM_CLIENT_EVENT_CMD_RUN_DONE:
        case ASM_CLIENT_EVENT_DATA_WRITE_DONE:
                spin_lock_irqsave(&prtd->lock, flags);
 
-               prtd->copied_total += prtd->pcm_count;
+               bytes_written = token >> ASM_WRITE_TOKEN_LEN_SHIFT;
+               prtd->copied_total += bytes_written;
                snd_compr_fragment_elapsed(substream);
 
                if (prtd->state != Q6ASM_STREAM_RUNNING) {
 
                if (ac->io_mode & ASM_SYNC_IO_MODE) {
                        phys_addr_t phys;
                        unsigned long flags;
+                       int token = hdr->token & ASM_WRITE_TOKEN_MASK;
 
                        spin_lock_irqsave(&ac->lock, flags);
 
                                goto done;
                        }
 
-                       phys = port->buf[hdr->token].phys;
+                       phys = port->buf[token].phys;
 
                        if (lower_32_bits(phys) != result->opcode ||
                            upper_32_bits(phys) != result->status) {
                                dev_err(ac->dev, "Expected addr %pa\n",
-                                       &port->buf[hdr->token].phys);
+                                       &port->buf[token].phys);
                                spin_unlock_irqrestore(&ac->lock, flags);
                                ret = -EINVAL;
                                goto done;
        q6asm_add_hdr(ac, &pkt->hdr, pkt_size, false, stream_id);
 
        ab = &port->buf[port->dsp_buf];
-       pkt->hdr.token = port->dsp_buf;
+       pkt->hdr.token = port->dsp_buf | (len << ASM_WRITE_TOKEN_LEN_SHIFT);
        pkt->hdr.opcode = ASM_DATA_CMD_WRITE_V2;
        write->buf_addr_lsw = lower_32_bits(ab->phys);
        write->buf_addr_msw = upper_32_bits(ab->phys);
 
 #define ASM_CLIENT_EVENT_CMD_RUN_DONE          0x1008
 #define ASM_CLIENT_EVENT_DATA_WRITE_DONE       0x1009
 #define ASM_CLIENT_EVENT_DATA_READ_DONE                0x100a
+#define ASM_WRITE_TOKEN_MASK                   GENMASK(15, 0)
+#define ASM_WRITE_TOKEN_LEN_MASK               GENMASK(31, 16)
+#define ASM_WRITE_TOKEN_LEN_SHIFT              16
 
 enum {
        LEGACY_PCM_MODE = 0,