* We need to map sg if the transfer_buffer is
         * NULL.
         */
-       if (!urb->transfer_buffer)
-               qh->use_sg = true;
-
-       if (qh->use_sg) {
+       if (!urb->transfer_buffer) {
                /* sg_miter_start is already done in musb_ep_program */
                if (!sg_miter_next(&qh->sg_miter)) {
                        dev_err(musb->controller, "error: sg list empty\n");
                        status = -EINVAL;
                        goto done;
                }
-               urb->transfer_buffer = qh->sg_miter.addr;
                length = min_t(u32, length, qh->sg_miter.length);
-               musb_write_fifo(hw_ep, length, urb->transfer_buffer);
+               musb_write_fifo(hw_ep, length, qh->sg_miter.addr);
                qh->sg_miter.consumed = length;
                sg_miter_stop(&qh->sg_miter);
        } else {
 
        qh->segsize = length;
 
-       if (qh->use_sg) {
-               if (offset + length >= urb->transfer_buffer_length)
-                       qh->use_sg = false;
-       }
-
        musb_ep_select(mbase, epnum);
        musb_writew(epio, MUSB_TXCSR,
                        MUSB_TXCSR_H_WZC_BITS | MUSB_TXCSR_TXPKTRDY);
        urb->actual_length += xfer_len;
        qh->offset += xfer_len;
        if (done) {
-               if (qh->use_sg)
+               if (qh->use_sg) {
                        qh->use_sg = false;
+                       urb->transfer_buffer = NULL;
+               }
 
                if (urb->status == -EINPROGRESS)
                        urb->status = status;