}
 
        /* Non DWORD-aligned buffer case handling */
-       if (chan->align_buf && xfer_length && chan->ep_is_in) {
+       if (chan->align_buf && xfer_length) {
                dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__);
-               memcpy(urb->buf + urb->actual_length, chan->qh->dw_align_buf,
-                      xfer_length);
+               dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
+                               chan->qh->dw_align_buf_size,
+                               chan->ep_is_in ?
+                               DMA_FROM_DEVICE : DMA_TO_DEVICE);
+               if (chan->ep_is_in)
+                       memcpy(urb->buf + urb->actual_length,
+                                       chan->qh->dw_align_buf, xfer_length);
        }
 
        dev_vdbg(hsotg->dev, "urb->actual_length=%d xfer_length=%d\n",
                                        chan, chnum, qtd, halt_status, NULL);
 
                /* Non DWORD-aligned buffer case handling */
-               if (chan->align_buf && frame_desc->actual_length &&
-                   chan->ep_is_in) {
+               if (chan->align_buf && frame_desc->actual_length) {
                        dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n",
                                 __func__);
-                       memcpy(urb->buf + frame_desc->offset +
-                              qtd->isoc_split_offset, chan->qh->dw_align_buf,
-                              frame_desc->actual_length);
+                       dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
+                                       chan->qh->dw_align_buf_size,
+                                       chan->ep_is_in ?
+                                       DMA_FROM_DEVICE : DMA_TO_DEVICE);
+                       if (chan->ep_is_in)
+                               memcpy(urb->buf + frame_desc->offset +
+                                       qtd->isoc_split_offset,
+                                       chan->qh->dw_align_buf,
+                                       frame_desc->actual_length);
                }
                break;
        case DWC2_HC_XFER_FRAME_OVERRUN:
                                        chan, chnum, qtd, halt_status, NULL);
 
                /* Non DWORD-aligned buffer case handling */
-               if (chan->align_buf && frame_desc->actual_length &&
-                   chan->ep_is_in) {
+               if (chan->align_buf && frame_desc->actual_length) {
                        dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n",
                                 __func__);
-                       memcpy(urb->buf + frame_desc->offset +
-                              qtd->isoc_split_offset, chan->qh->dw_align_buf,
-                              frame_desc->actual_length);
+                       dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
+                                       chan->qh->dw_align_buf_size,
+                                       chan->ep_is_in ?
+                                       DMA_FROM_DEVICE : DMA_TO_DEVICE);
+                       if (chan->ep_is_in)
+                               memcpy(urb->buf + frame_desc->offset +
+                                       qtd->isoc_split_offset,
+                                       chan->qh->dw_align_buf,
+                                       frame_desc->actual_length);
                }
 
                /* Skip whole frame */
 
        if (chan->align_buf) {
                dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__);
+               dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
+                               chan->qh->dw_align_buf_size, DMA_FROM_DEVICE);
                memcpy(qtd->urb->buf + frame_desc->offset +
                       qtd->isoc_split_offset, chan->qh->dw_align_buf, len);
        }
        /* Non DWORD-aligned buffer case handling */
        if (chan->align_buf && xfer_length && chan->ep_is_in) {
                dev_vdbg(hsotg->dev, "%s(): non-aligned buffer\n", __func__);
-               memcpy(urb->buf + urb->actual_length, chan->qh->dw_align_buf,
-                      xfer_length);
+               dma_unmap_single(hsotg->dev, chan->qh->dw_align_buf_dma,
+                               chan->qh->dw_align_buf_size,
+                               chan->ep_is_in ?
+                               DMA_FROM_DEVICE : DMA_TO_DEVICE);
+               if (chan->ep_is_in)
+                       memcpy(urb->buf + urb->actual_length,
+                                       chan->qh->dw_align_buf,
+                                       xfer_length);
        }
 
        urb->actual_length += xfer_length;