aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/usb/host/xhci-ring.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index b520b37c0f3..407d33fb5e8 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -242,10 +242,27 @@ static int room_on_ring(struct xhci_hcd *xhci, struct xhci_ring *ring,
242 int i; 242 int i;
243 union xhci_trb *enq = ring->enqueue; 243 union xhci_trb *enq = ring->enqueue;
244 struct xhci_segment *enq_seg = ring->enq_seg; 244 struct xhci_segment *enq_seg = ring->enq_seg;
245 struct xhci_segment *cur_seg;
246 unsigned int left_on_ring;
245 247
246 /* Check if ring is empty */ 248 /* Check if ring is empty */
247 if (enq == ring->dequeue) 249 if (enq == ring->dequeue) {
250 /* Can't use link trbs */
251 left_on_ring = TRBS_PER_SEGMENT - 1;
252 for (cur_seg = enq_seg->next; cur_seg != enq_seg;
253 cur_seg = cur_seg->next)
254 left_on_ring += TRBS_PER_SEGMENT - 1;
255
256 /* Always need one TRB free in the ring. */
257 left_on_ring -= 1;
258 if (num_trbs > left_on_ring) {
259 xhci_warn(xhci, "Not enough room on ring; "
260 "need %u TRBs, %u TRBs left\n",
261 num_trbs, left_on_ring);
262 return 0;
263 }
248 return 1; 264 return 1;
265 }
249 /* Make sure there's an extra empty TRB available */ 266 /* Make sure there's an extra empty TRB available */
250 for (i = 0; i <= num_trbs; ++i) { 267 for (i = 0; i <= num_trbs; ++i) {
251 if (enq == ring->dequeue) 268 if (enq == ring->dequeue)