diff options
| author | Paul Zimmerman <Paul.Zimmerman@synopsys.com> | 2011-02-12 17:06:06 -0500 |
|---|---|---|
| committer | Sarah Sharp <sarah.a.sharp@linux.intel.com> | 2011-02-20 10:01:26 -0500 |
| commit | 68e41c5d032668e2905404afbef75bc58be179d6 (patch) | |
| tree | 5fbdd52b525f59f0883d8668ee9b79b392753979 | |
| parent | 9ce4f80fb67b47b96c647ac6280a06dbd4bb50d2 (diff) | |
xhci: Avoid BUG() in interrupt context
Change the BUGs in xhci_find_new_dequeue_state() to WARN_ONs, to avoid
bringing down the box if one of them is hit
This patch should be queued for stable kernels back to 2.6.31.
Signed-off-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Cc: stable@kernel.org
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 3e8211c1ce5..2a87231d588 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -474,8 +474,11 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
| 474 | state->new_deq_seg = find_trb_seg(cur_td->start_seg, | 474 | state->new_deq_seg = find_trb_seg(cur_td->start_seg, |
| 475 | dev->eps[ep_index].stopped_trb, | 475 | dev->eps[ep_index].stopped_trb, |
| 476 | &state->new_cycle_state); | 476 | &state->new_cycle_state); |
| 477 | if (!state->new_deq_seg) | 477 | if (!state->new_deq_seg) { |
| 478 | BUG(); | 478 | WARN_ON(1); |
| 479 | return; | ||
| 480 | } | ||
| 481 | |||
| 479 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ | 482 | /* Dig out the cycle state saved by the xHC during the stop ep cmd */ |
| 480 | xhci_dbg(xhci, "Finding endpoint context\n"); | 483 | xhci_dbg(xhci, "Finding endpoint context\n"); |
| 481 | ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); | 484 | ep_ctx = xhci_get_ep_ctx(xhci, dev->out_ctx, ep_index); |
| @@ -486,8 +489,10 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
| 486 | state->new_deq_seg = find_trb_seg(state->new_deq_seg, | 489 | state->new_deq_seg = find_trb_seg(state->new_deq_seg, |
| 487 | state->new_deq_ptr, | 490 | state->new_deq_ptr, |
| 488 | &state->new_cycle_state); | 491 | &state->new_cycle_state); |
| 489 | if (!state->new_deq_seg) | 492 | if (!state->new_deq_seg) { |
| 490 | BUG(); | 493 | WARN_ON(1); |
| 494 | return; | ||
| 495 | } | ||
| 491 | 496 | ||
| 492 | trb = &state->new_deq_ptr->generic; | 497 | trb = &state->new_deq_ptr->generic; |
| 493 | if ((trb->field[3] & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK) && | 498 | if ((trb->field[3] & TRB_TYPE_BITMASK) == TRB_TYPE(TRB_LINK) && |
