}
 
 /*
- * Make the prev segment point to the next segment.
+ * Only for transfer and command rings where driver is the producer, not for
+ * event rings.
  *
- * Change the last TRB in the prev segment to be a Link TRB which points to the
+ * Change the last TRB in the segment to be a Link TRB which points to the
  * DMA address of the next segment.  The caller needs to set any Link TRB
  * related flags, such as End TRB, Toggle Cycle, and no snoop.
  */
-static void xhci_link_segments(struct xhci_segment *prev,
-                              struct xhci_segment *next,
-                              enum xhci_ring_type type, bool chain_links)
+static void xhci_set_link_trb(struct xhci_segment *seg, bool chain_links)
 {
+       union xhci_trb *trb;
        u32 val;
 
-       if (!prev || !next)
+       if (!seg || !seg->next)
                return;
-       prev->next = next;
-       if (type != TYPE_EVENT) {
-               prev->trbs[TRBS_PER_SEGMENT-1].link.segment_ptr =
-                       cpu_to_le64(next->dma);
 
-               /* Set the last TRB in the segment to have a TRB type ID of Link TRB */
-               val = le32_to_cpu(prev->trbs[TRBS_PER_SEGMENT-1].link.control);
-               val &= ~TRB_TYPE_BITMASK;
-               val |= TRB_TYPE(TRB_LINK);
-               if (chain_links)
-                       val |= TRB_CHAIN;
-               prev->trbs[TRBS_PER_SEGMENT-1].link.control = cpu_to_le32(val);
-       }
+       trb = &seg->trbs[TRBS_PER_SEGMENT - 1];
+
+       /* Set the last TRB in the segment to have a TRB type ID of Link TRB */
+       val = le32_to_cpu(trb->link.control);
+       val &= ~TRB_TYPE_BITMASK;
+       val |= TRB_TYPE(TRB_LINK);
+       if (chain_links)
+               val |= TRB_CHAIN;
+       trb->link.control = cpu_to_le32(val);
+       trb->link.segment_ptr = cpu_to_le64(seg->next->dma);
 }
 
 /*
        if (!src || !dst)
                return;
 
-       chain_links = xhci_link_chain_quirk(xhci, dst->type);
-
        /* If the cycle state is 0, set the cycle bit to 1 for all the TRBs */
        if (dst->cycle_state == 0) {
                xhci_for_each_ring_seg(src->first_seg, seg) {
                }
        }
 
-       xhci_link_segments(src->last_seg, dst->enq_seg->next, dst->type, chain_links);
-       xhci_link_segments(dst->enq_seg, src->first_seg, dst->type, chain_links);
+       src->last_seg->next = dst->enq_seg->next;
+       dst->enq_seg->next = src->first_seg;
+       if (dst->type != TYPE_EVENT) {
+               chain_links = xhci_link_chain_quirk(xhci, dst->type);
+               xhci_set_link_trb(dst->enq_seg, chain_links);
+               xhci_set_link_trb(src->last_seg, chain_links);
+       }
        dst->num_segs += src->num_segs;
 
        if (dst->enq_seg == dst->last_seg) {
                if (!next)
                        goto free_segments;
 
-               xhci_link_segments(prev, next, ring->type, chain_links);
+               prev->next = next;
+               if (ring->type != TYPE_EVENT)
+                       xhci_set_link_trb(prev, chain_links);
                prev = next;
                num++;
        }
-       xhci_link_segments(prev, ring->first_seg, ring->type, chain_links);
        ring->last_seg = prev;
 
+       ring->last_seg->next = ring->first_seg;
+       if (ring->type != TYPE_EVENT)
+               xhci_set_link_trb(prev, chain_links);
+
        return 0;
 
 free_segments: