lli_write(desc, sar, mem);
                        lli_write(desc, dar, reg);
-                       lli_write(desc, ctllo, ctllo | DWC_CTLL_SRC_WIDTH(mem_width));
                        if ((len >> mem_width) > dwc->block_size) {
                                dlen = dwc->block_size << mem_width;
-                               mem += dlen;
-                               len -= dlen;
                        } else {
                                dlen = len;
-                               len = 0;
                        }
-
                        lli_write(desc, ctlhi, dlen >> mem_width);
+                       lli_write(desc, ctllo, ctllo | DWC_CTLL_SRC_WIDTH(mem_width));
                        desc->len = dlen;
 
                        if (!first) {
                                list_add_tail(&desc->desc_node, &first->tx_list);
                        }
                        prev = desc;
+
+                       mem += dlen;
+                       len -= dlen;
                        total_len += dlen;
 
                        if (len)
                        mem = sg_dma_address(sg);
                        len = sg_dma_len(sg);
 
-                       mem_width = __ffs(data_width | mem | len);
-
 slave_sg_fromdev_fill_desc:
                        desc = dwc_desc_get(dwc);
                        if (!desc)
 
                        lli_write(desc, sar, reg);
                        lli_write(desc, dar, mem);
-                       lli_write(desc, ctllo, ctllo | DWC_CTLL_DST_WIDTH(mem_width));
                        if ((len >> reg_width) > dwc->block_size) {
                                dlen = dwc->block_size << reg_width;
-                               mem += dlen;
-                               len -= dlen;
                        } else {
                                dlen = len;
-                               len = 0;
                        }
                        lli_write(desc, ctlhi, dlen >> reg_width);
+                       mem_width = __ffs(data_width | mem | dlen);
+                       lli_write(desc, ctllo, ctllo | DWC_CTLL_DST_WIDTH(mem_width));
                        desc->len = dlen;
 
                        if (!first) {
                                list_add_tail(&desc->desc_node, &first->tx_list);
                        }
                        prev = desc;
+
+                       mem += dlen;
+                       len -= dlen;
                        total_len += dlen;
 
                        if (len)