xhci: Add stream id to xhci_dequeue_state structure
authorMathias Nyman <mathias.nyman@linux.intel.com>
Fri, 2 Jun 2017 13:36:23 +0000 (16:36 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 3 Jun 2017 09:02:58 +0000 (18:02 +0900)
The values for the new dequeue segment, new dequeue pointer and new cycle
state are needed for manually moving the xHC ring dequeue pointer.
These are conveniently stored in a xhci_dequeue_state structure.

stream support was added later and stream_id was carried
as a function parameter.

Move the stream_id to the xhci_dequeue_state structure instead.

Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.c
drivers/usb/host/xhci.h

index 8e73dad..59be9b5 100644 (file)
@@ -483,7 +483,7 @@ struct xhci_ring *xhci_triad_to_transfer_ring(struct xhci_hcd *xhci,
 /*
  * Move the xHC's endpoint ring dequeue pointer past cur_td.
  * Record the new state of the xHC's endpoint ring dequeue segment,
- * dequeue pointer, and new consumer cycle state in state.
+ * dequeue pointer, stream id, and new consumer cycle state in state.
  * Update our internal representation of the ring's dequeue pointer.
  *
  * We do this in three jumps:
@@ -539,6 +539,7 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,
        new_seg = ep_ring->deq_seg;
        new_deq = ep_ring->dequeue;
        state->new_cycle_state = hw_dequeue & 0x1;
+       state->stream_id = stream_id;
 
        /*
         * We want to find the pointer, segment and cycle state of the new trb
@@ -779,7 +780,7 @@ remove_finished_td:
        /* If necessary, queue a Set Transfer Ring Dequeue Pointer command */
        if (deq_state.new_deq_ptr && deq_state.new_deq_seg) {
                xhci_queue_new_dequeue_state(xhci, slot_id, ep_index,
-                               ep->stopped_td->urb->stream_id, &deq_state);
+                                            &deq_state);
                xhci_ring_cmd_db(xhci);
        } else {
                /* Otherwise ring the doorbell(s) to restart queued transfers */
@@ -3966,13 +3967,12 @@ int xhci_queue_stop_endpoint(struct xhci_hcd *xhci, struct xhci_command *cmd,
 /* Set Transfer Ring Dequeue Pointer command */
 void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci,
                unsigned int slot_id, unsigned int ep_index,
-               unsigned int stream_id,
                struct xhci_dequeue_state *deq_state)
 {
        dma_addr_t addr;
        u32 trb_slot_id = SLOT_ID_FOR_TRB(slot_id);
        u32 trb_ep_index = EP_ID_FOR_TRB(ep_index);
-       u32 trb_stream_id = STREAM_ID_FOR_TRB(stream_id);
+       u32 trb_stream_id = STREAM_ID_FOR_TRB(deq_state->stream_id);
        u32 trb_sct = 0;
        u32 type = TRB_TYPE(TRB_SET_DEQ);
        struct xhci_virt_ep *ep;
@@ -4010,7 +4010,7 @@ void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci,
 
        ep->queued_deq_seg = deq_state->new_deq_seg;
        ep->queued_deq_ptr = deq_state->new_deq_ptr;
-       if (stream_id)
+       if (deq_state->stream_id)
                trb_sct = SCT_FOR_TRB(SCT_PRI_TR);
        ret = queue_command(xhci, cmd,
                lower_32_bits(addr) | trb_sct | deq_state->new_cycle_state,
index 30f47d9..2d6a98c 100644 (file)
@@ -2849,7 +2849,7 @@ void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci,
                xhci_dbg_trace(xhci, trace_xhci_dbg_reset_ep,
                                "Queueing new dequeue state");
                xhci_queue_new_dequeue_state(xhci, udev->slot_id,
-                               ep_index, ep->stopped_stream, &deq_state);
+                               ep_index, &deq_state);
        } else {
                /* Better hope no one uses the input context between now and the
                 * reset endpoint completion!
index 12df132..886f150 100644 (file)
@@ -1526,6 +1526,7 @@ struct xhci_dequeue_state {
        struct xhci_segment *new_deq_seg;
        union xhci_trb *new_deq_ptr;
        int new_cycle_state;
+       unsigned int stream_id;
 };
 
 enum xhci_ring_type {
@@ -2052,7 +2053,6 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci,
                struct xhci_dequeue_state *state);
 void xhci_queue_new_dequeue_state(struct xhci_hcd *xhci,
                unsigned int slot_id, unsigned int ep_index,
-               unsigned int stream_id,
                struct xhci_dequeue_state *deq_state);
 void xhci_cleanup_stalled_ring(struct xhci_hcd *xhci,
                unsigned int ep_index, struct xhci_td *td);