diff options
-rw-r--r-- | drivers/usb/host/xhci-ring.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index b520b37c0f36..407d33fb5e84 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) |