diff options
Diffstat (limited to 'drivers/usb/host/xhci-hcd.c')
| -rw-r--r-- | drivers/usb/host/xhci-hcd.c | 290 |
1 files changed, 199 insertions, 91 deletions
diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c index dba3e07ccd09..816c39caca1c 100644 --- a/drivers/usb/host/xhci-hcd.c +++ b/drivers/usb/host/xhci-hcd.c | |||
| @@ -103,7 +103,10 @@ int xhci_reset(struct xhci_hcd *xhci) | |||
| 103 | u32 state; | 103 | u32 state; |
| 104 | 104 | ||
| 105 | state = xhci_readl(xhci, &xhci->op_regs->status); | 105 | state = xhci_readl(xhci, &xhci->op_regs->status); |
| 106 | BUG_ON((state & STS_HALT) == 0); | 106 | if ((state & STS_HALT) == 0) { |
| 107 | xhci_warn(xhci, "Host controller not halted, aborting reset.\n"); | ||
| 108 | return 0; | ||
| 109 | } | ||
| 107 | 110 | ||
| 108 | xhci_dbg(xhci, "// Reset the HC\n"); | 111 | xhci_dbg(xhci, "// Reset the HC\n"); |
| 109 | command = xhci_readl(xhci, &xhci->op_regs->command); | 112 | command = xhci_readl(xhci, &xhci->op_regs->command); |
| @@ -226,6 +229,7 @@ int xhci_init(struct usb_hcd *hcd) | |||
| 226 | static void xhci_work(struct xhci_hcd *xhci) | 229 | static void xhci_work(struct xhci_hcd *xhci) |
| 227 | { | 230 | { |
| 228 | u32 temp; | 231 | u32 temp; |
| 232 | u64 temp_64; | ||
| 229 | 233 | ||
| 230 | /* | 234 | /* |
| 231 | * Clear the op reg interrupt status first, | 235 | * Clear the op reg interrupt status first, |
| @@ -248,9 +252,9 @@ static void xhci_work(struct xhci_hcd *xhci) | |||
| 248 | /* FIXME this should be a delayed service routine that clears the EHB */ | 252 | /* FIXME this should be a delayed service routine that clears the EHB */ |
| 249 | xhci_handle_event(xhci); | 253 | xhci_handle_event(xhci); |
| 250 | 254 | ||
| 251 | /* Clear the event handler busy flag; the event ring should be empty. */ | 255 | /* Clear the event handler busy flag (RW1C); the event ring should be empty. */ |
| 252 | temp = xhci_readl(xhci, &xhci->ir_set->erst_dequeue[0]); | 256 | temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); |
| 253 | xhci_writel(xhci, temp & ~ERST_EHB, &xhci->ir_set->erst_dequeue[0]); | 257 | xhci_write_64(xhci, temp_64 | ERST_EHB, &xhci->ir_set->erst_dequeue); |
| 254 | /* Flush posted writes -- FIXME is this necessary? */ | 258 | /* Flush posted writes -- FIXME is this necessary? */ |
| 255 | xhci_readl(xhci, &xhci->ir_set->irq_pending); | 259 | xhci_readl(xhci, &xhci->ir_set->irq_pending); |
| 256 | } | 260 | } |
| @@ -266,19 +270,34 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) | |||
| 266 | { | 270 | { |
| 267 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 271 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 268 | u32 temp, temp2; | 272 | u32 temp, temp2; |
| 273 | union xhci_trb *trb; | ||
| 269 | 274 | ||
| 270 | spin_lock(&xhci->lock); | 275 | spin_lock(&xhci->lock); |
| 276 | trb = xhci->event_ring->dequeue; | ||
| 271 | /* Check if the xHC generated the interrupt, or the irq is shared */ | 277 | /* Check if the xHC generated the interrupt, or the irq is shared */ |
| 272 | temp = xhci_readl(xhci, &xhci->op_regs->status); | 278 | temp = xhci_readl(xhci, &xhci->op_regs->status); |
| 273 | temp2 = xhci_readl(xhci, &xhci->ir_set->irq_pending); | 279 | temp2 = xhci_readl(xhci, &xhci->ir_set->irq_pending); |
| 280 | if (temp == 0xffffffff && temp2 == 0xffffffff) | ||
| 281 | goto hw_died; | ||
| 282 | |||
| 274 | if (!(temp & STS_EINT) && !ER_IRQ_PENDING(temp2)) { | 283 | if (!(temp & STS_EINT) && !ER_IRQ_PENDING(temp2)) { |
| 275 | spin_unlock(&xhci->lock); | 284 | spin_unlock(&xhci->lock); |
| 276 | return IRQ_NONE; | 285 | return IRQ_NONE; |
| 277 | } | 286 | } |
| 287 | xhci_dbg(xhci, "op reg status = %08x\n", temp); | ||
| 288 | xhci_dbg(xhci, "ir set irq_pending = %08x\n", temp2); | ||
| 289 | xhci_dbg(xhci, "Event ring dequeue ptr:\n"); | ||
| 290 | xhci_dbg(xhci, "@%llx %08x %08x %08x %08x\n", | ||
| 291 | (unsigned long long)xhci_trb_virt_to_dma(xhci->event_ring->deq_seg, trb), | ||
| 292 | lower_32_bits(trb->link.segment_ptr), | ||
| 293 | upper_32_bits(trb->link.segment_ptr), | ||
| 294 | (unsigned int) trb->link.intr_target, | ||
| 295 | (unsigned int) trb->link.control); | ||
| 278 | 296 | ||
| 279 | if (temp & STS_FATAL) { | 297 | if (temp & STS_FATAL) { |
| 280 | xhci_warn(xhci, "WARNING: Host System Error\n"); | 298 | xhci_warn(xhci, "WARNING: Host System Error\n"); |
| 281 | xhci_halt(xhci); | 299 | xhci_halt(xhci); |
| 300 | hw_died: | ||
| 282 | xhci_to_hcd(xhci)->state = HC_STATE_HALT; | 301 | xhci_to_hcd(xhci)->state = HC_STATE_HALT; |
| 283 | spin_unlock(&xhci->lock); | 302 | spin_unlock(&xhci->lock); |
| 284 | return -ESHUTDOWN; | 303 | return -ESHUTDOWN; |
| @@ -295,6 +314,7 @@ void xhci_event_ring_work(unsigned long arg) | |||
| 295 | { | 314 | { |
| 296 | unsigned long flags; | 315 | unsigned long flags; |
| 297 | int temp; | 316 | int temp; |
| 317 | u64 temp_64; | ||
| 298 | struct xhci_hcd *xhci = (struct xhci_hcd *) arg; | 318 | struct xhci_hcd *xhci = (struct xhci_hcd *) arg; |
| 299 | int i, j; | 319 | int i, j; |
| 300 | 320 | ||
| @@ -311,9 +331,9 @@ void xhci_event_ring_work(unsigned long arg) | |||
| 311 | xhci_dbg(xhci, "Event ring:\n"); | 331 | xhci_dbg(xhci, "Event ring:\n"); |
| 312 | xhci_debug_segment(xhci, xhci->event_ring->deq_seg); | 332 | xhci_debug_segment(xhci, xhci->event_ring->deq_seg); |
| 313 | xhci_dbg_ring_ptrs(xhci, xhci->event_ring); | 333 | xhci_dbg_ring_ptrs(xhci, xhci->event_ring); |
| 314 | temp = xhci_readl(xhci, &xhci->ir_set->erst_dequeue[0]); | 334 | temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); |
| 315 | temp &= ERST_PTR_MASK; | 335 | temp_64 &= ~ERST_PTR_MASK; |
| 316 | xhci_dbg(xhci, "ERST deq = 0x%x\n", temp); | 336 | xhci_dbg(xhci, "ERST deq = 64'h%0lx\n", (long unsigned int) temp_64); |
| 317 | xhci_dbg(xhci, "Command ring:\n"); | 337 | xhci_dbg(xhci, "Command ring:\n"); |
| 318 | xhci_debug_segment(xhci, xhci->cmd_ring->deq_seg); | 338 | xhci_debug_segment(xhci, xhci->cmd_ring->deq_seg); |
| 319 | xhci_dbg_ring_ptrs(xhci, xhci->cmd_ring); | 339 | xhci_dbg_ring_ptrs(xhci, xhci->cmd_ring); |
| @@ -356,6 +376,7 @@ void xhci_event_ring_work(unsigned long arg) | |||
| 356 | int xhci_run(struct usb_hcd *hcd) | 376 | int xhci_run(struct usb_hcd *hcd) |
| 357 | { | 377 | { |
| 358 | u32 temp; | 378 | u32 temp; |
| 379 | u64 temp_64; | ||
| 359 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 380 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 360 | void (*doorbell)(struct xhci_hcd *) = NULL; | 381 | void (*doorbell)(struct xhci_hcd *) = NULL; |
| 361 | 382 | ||
| @@ -382,6 +403,20 @@ int xhci_run(struct usb_hcd *hcd) | |||
| 382 | add_timer(&xhci->event_ring_timer); | 403 | add_timer(&xhci->event_ring_timer); |
| 383 | #endif | 404 | #endif |
| 384 | 405 | ||
| 406 | xhci_dbg(xhci, "Command ring memory map follows:\n"); | ||
| 407 | xhci_debug_ring(xhci, xhci->cmd_ring); | ||
| 408 | xhci_dbg_ring_ptrs(xhci, xhci->cmd_ring); | ||
| 409 | xhci_dbg_cmd_ptrs(xhci); | ||
| 410 | |||
| 411 | xhci_dbg(xhci, "ERST memory map follows:\n"); | ||
| 412 | xhci_dbg_erst(xhci, &xhci->erst); | ||
| 413 | xhci_dbg(xhci, "Event ring:\n"); | ||
| 414 | xhci_debug_ring(xhci, xhci->event_ring); | ||
| 415 | xhci_dbg_ring_ptrs(xhci, xhci->event_ring); | ||
| 416 | temp_64 = xhci_read_64(xhci, &xhci->ir_set->erst_dequeue); | ||
| 417 | temp_64 &= ~ERST_PTR_MASK; | ||
| 418 | xhci_dbg(xhci, "ERST deq = 64'h%0lx\n", (long unsigned int) temp_64); | ||
| 419 | |||
| 385 | xhci_dbg(xhci, "// Set the interrupt modulation register\n"); | 420 | xhci_dbg(xhci, "// Set the interrupt modulation register\n"); |
| 386 | temp = xhci_readl(xhci, &xhci->ir_set->irq_control); | 421 | temp = xhci_readl(xhci, &xhci->ir_set->irq_control); |
| 387 | temp &= ~ER_IRQ_INTERVAL_MASK; | 422 | temp &= ~ER_IRQ_INTERVAL_MASK; |
| @@ -406,22 +441,6 @@ int xhci_run(struct usb_hcd *hcd) | |||
| 406 | if (NUM_TEST_NOOPS > 0) | 441 | if (NUM_TEST_NOOPS > 0) |
| 407 | doorbell = xhci_setup_one_noop(xhci); | 442 | doorbell = xhci_setup_one_noop(xhci); |
| 408 | 443 | ||
| 409 | xhci_dbg(xhci, "Command ring memory map follows:\n"); | ||
| 410 | xhci_debug_ring(xhci, xhci->cmd_ring); | ||
| 411 | xhci_dbg_ring_ptrs(xhci, xhci->cmd_ring); | ||
| 412 | xhci_dbg_cmd_ptrs(xhci); | ||
| 413 | |||
| 414 | xhci_dbg(xhci, "ERST memory map follows:\n"); | ||
| 415 | xhci_dbg_erst(xhci, &xhci->erst); | ||
| 416 | xhci_dbg(xhci, "Event ring:\n"); | ||
| 417 | xhci_debug_ring(xhci, xhci->event_ring); | ||
| 418 | xhci_dbg_ring_ptrs(xhci, xhci->event_ring); | ||
| 419 | temp = xhci_readl(xhci, &xhci->ir_set->erst_dequeue[0]); | ||
| 420 | temp &= ERST_PTR_MASK; | ||
| 421 | xhci_dbg(xhci, "ERST deq = 0x%x\n", temp); | ||
| 422 | temp = xhci_readl(xhci, &xhci->ir_set->erst_dequeue[1]); | ||
| 423 | xhci_dbg(xhci, "ERST deq upper = 0x%x\n", temp); | ||
| 424 | |||
| 425 | temp = xhci_readl(xhci, &xhci->op_regs->command); | 444 | temp = xhci_readl(xhci, &xhci->op_regs->command); |
| 426 | temp |= (CMD_RUN); | 445 | temp |= (CMD_RUN); |
| 427 | xhci_dbg(xhci, "// Turn on HC, cmd = 0x%x.\n", | 446 | xhci_dbg(xhci, "// Turn on HC, cmd = 0x%x.\n", |
| @@ -601,10 +620,13 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) | |||
| 601 | goto exit; | 620 | goto exit; |
| 602 | } | 621 | } |
| 603 | if (usb_endpoint_xfer_control(&urb->ep->desc)) | 622 | if (usb_endpoint_xfer_control(&urb->ep->desc)) |
| 604 | ret = xhci_queue_ctrl_tx(xhci, mem_flags, urb, | 623 | /* We have a spinlock and interrupts disabled, so we must pass |
| 624 | * atomic context to this function, which may allocate memory. | ||
| 625 | */ | ||
| 626 | ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb, | ||
| 605 | slot_id, ep_index); | 627 | slot_id, ep_index); |
| 606 | else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) | 628 | else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) |
| 607 | ret = xhci_queue_bulk_tx(xhci, mem_flags, urb, | 629 | ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb, |
| 608 | slot_id, ep_index); | 630 | slot_id, ep_index); |
| 609 | else | 631 | else |
| 610 | ret = -EINVAL; | 632 | ret = -EINVAL; |
| @@ -661,8 +683,12 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
| 661 | goto done; | 683 | goto done; |
| 662 | 684 | ||
| 663 | xhci_dbg(xhci, "Cancel URB %p\n", urb); | 685 | xhci_dbg(xhci, "Cancel URB %p\n", urb); |
| 686 | xhci_dbg(xhci, "Event ring:\n"); | ||
| 687 | xhci_debug_ring(xhci, xhci->event_ring); | ||
| 664 | ep_index = xhci_get_endpoint_index(&urb->ep->desc); | 688 | ep_index = xhci_get_endpoint_index(&urb->ep->desc); |
| 665 | ep_ring = xhci->devs[urb->dev->slot_id]->ep_rings[ep_index]; | 689 | ep_ring = xhci->devs[urb->dev->slot_id]->ep_rings[ep_index]; |
| 690 | xhci_dbg(xhci, "Endpoint ring:\n"); | ||
| 691 | xhci_debug_ring(xhci, ep_ring); | ||
| 666 | td = (struct xhci_td *) urb->hcpriv; | 692 | td = (struct xhci_td *) urb->hcpriv; |
| 667 | 693 | ||
| 668 | ep_ring->cancels_pending++; | 694 | ep_ring->cancels_pending++; |
| @@ -696,7 +722,9 @@ int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 696 | struct usb_host_endpoint *ep) | 722 | struct usb_host_endpoint *ep) |
| 697 | { | 723 | { |
| 698 | struct xhci_hcd *xhci; | 724 | struct xhci_hcd *xhci; |
| 699 | struct xhci_device_control *in_ctx; | 725 | struct xhci_container_ctx *in_ctx, *out_ctx; |
| 726 | struct xhci_input_control_ctx *ctrl_ctx; | ||
| 727 | struct xhci_slot_ctx *slot_ctx; | ||
| 700 | unsigned int last_ctx; | 728 | unsigned int last_ctx; |
| 701 | unsigned int ep_index; | 729 | unsigned int ep_index; |
| 702 | struct xhci_ep_ctx *ep_ctx; | 730 | struct xhci_ep_ctx *ep_ctx; |
| @@ -724,31 +752,34 @@ int xhci_drop_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 724 | } | 752 | } |
| 725 | 753 | ||
| 726 | in_ctx = xhci->devs[udev->slot_id]->in_ctx; | 754 | in_ctx = xhci->devs[udev->slot_id]->in_ctx; |
| 755 | out_ctx = xhci->devs[udev->slot_id]->out_ctx; | ||
| 756 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); | ||
| 727 | ep_index = xhci_get_endpoint_index(&ep->desc); | 757 | ep_index = xhci_get_endpoint_index(&ep->desc); |
| 728 | ep_ctx = &xhci->devs[udev->slot_id]->out_ctx->ep[ep_index]; | 758 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); |
| 729 | /* If the HC already knows the endpoint is disabled, | 759 | /* If the HC already knows the endpoint is disabled, |
| 730 | * or the HCD has noted it is disabled, ignore this request | 760 | * or the HCD has noted it is disabled, ignore this request |
| 731 | */ | 761 | */ |
| 732 | if ((ep_ctx->ep_info & EP_STATE_MASK) == EP_STATE_DISABLED || | 762 | if ((ep_ctx->ep_info & EP_STATE_MASK) == EP_STATE_DISABLED || |
| 733 | in_ctx->drop_flags & xhci_get_endpoint_flag(&ep->desc)) { | 763 | ctrl_ctx->drop_flags & xhci_get_endpoint_flag(&ep->desc)) { |
| 734 | xhci_warn(xhci, "xHCI %s called with disabled ep %p\n", | 764 | xhci_warn(xhci, "xHCI %s called with disabled ep %p\n", |
| 735 | __func__, ep); | 765 | __func__, ep); |
| 736 | return 0; | 766 | return 0; |
| 737 | } | 767 | } |
| 738 | 768 | ||
| 739 | in_ctx->drop_flags |= drop_flag; | 769 | ctrl_ctx->drop_flags |= drop_flag; |
| 740 | new_drop_flags = in_ctx->drop_flags; | 770 | new_drop_flags = ctrl_ctx->drop_flags; |
| 741 | 771 | ||
| 742 | in_ctx->add_flags = ~drop_flag; | 772 | ctrl_ctx->add_flags = ~drop_flag; |
| 743 | new_add_flags = in_ctx->add_flags; | 773 | new_add_flags = ctrl_ctx->add_flags; |
| 744 | 774 | ||
| 745 | last_ctx = xhci_last_valid_endpoint(in_ctx->add_flags); | 775 | last_ctx = xhci_last_valid_endpoint(ctrl_ctx->add_flags); |
| 776 | slot_ctx = xhci_get_slot_ctx(xhci, in_ctx); | ||
| 746 | /* Update the last valid endpoint context, if we deleted the last one */ | 777 | /* Update the last valid endpoint context, if we deleted the last one */ |
| 747 | if ((in_ctx->slot.dev_info & LAST_CTX_MASK) > LAST_CTX(last_ctx)) { | 778 | if ((slot_ctx->dev_info & LAST_CTX_MASK) > LAST_CTX(last_ctx)) { |
| 748 | in_ctx->slot.dev_info &= ~LAST_CTX_MASK; | 779 | slot_ctx->dev_info &= ~LAST_CTX_MASK; |
| 749 | in_ctx->slot.dev_info |= LAST_CTX(last_ctx); | 780 | slot_ctx->dev_info |= LAST_CTX(last_ctx); |
| 750 | } | 781 | } |
| 751 | new_slot_info = in_ctx->slot.dev_info; | 782 | new_slot_info = slot_ctx->dev_info; |
| 752 | 783 | ||
| 753 | xhci_endpoint_zero(xhci, xhci->devs[udev->slot_id], ep); | 784 | xhci_endpoint_zero(xhci, xhci->devs[udev->slot_id], ep); |
| 754 | 785 | ||
| @@ -778,17 +809,22 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 778 | struct usb_host_endpoint *ep) | 809 | struct usb_host_endpoint *ep) |
| 779 | { | 810 | { |
| 780 | struct xhci_hcd *xhci; | 811 | struct xhci_hcd *xhci; |
| 781 | struct xhci_device_control *in_ctx; | 812 | struct xhci_container_ctx *in_ctx, *out_ctx; |
| 782 | unsigned int ep_index; | 813 | unsigned int ep_index; |
| 783 | struct xhci_ep_ctx *ep_ctx; | 814 | struct xhci_ep_ctx *ep_ctx; |
| 815 | struct xhci_slot_ctx *slot_ctx; | ||
| 816 | struct xhci_input_control_ctx *ctrl_ctx; | ||
| 784 | u32 added_ctxs; | 817 | u32 added_ctxs; |
| 785 | unsigned int last_ctx; | 818 | unsigned int last_ctx; |
| 786 | u32 new_add_flags, new_drop_flags, new_slot_info; | 819 | u32 new_add_flags, new_drop_flags, new_slot_info; |
| 787 | int ret = 0; | 820 | int ret = 0; |
| 788 | 821 | ||
| 789 | ret = xhci_check_args(hcd, udev, ep, 1, __func__); | 822 | ret = xhci_check_args(hcd, udev, ep, 1, __func__); |
| 790 | if (ret <= 0) | 823 | if (ret <= 0) { |
| 824 | /* So we won't queue a reset ep command for a root hub */ | ||
| 825 | ep->hcpriv = NULL; | ||
| 791 | return ret; | 826 | return ret; |
| 827 | } | ||
| 792 | xhci = hcd_to_xhci(hcd); | 828 | xhci = hcd_to_xhci(hcd); |
| 793 | 829 | ||
| 794 | added_ctxs = xhci_get_endpoint_flag(&ep->desc); | 830 | added_ctxs = xhci_get_endpoint_flag(&ep->desc); |
| @@ -810,12 +846,14 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 810 | } | 846 | } |
| 811 | 847 | ||
| 812 | in_ctx = xhci->devs[udev->slot_id]->in_ctx; | 848 | in_ctx = xhci->devs[udev->slot_id]->in_ctx; |
| 849 | out_ctx = xhci->devs[udev->slot_id]->out_ctx; | ||
| 850 | ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); | ||
| 813 | ep_index = xhci_get_endpoint_index(&ep->desc); | 851 | ep_index = xhci_get_endpoint_index(&ep->desc); |
| 814 | ep_ctx = &xhci->devs[udev->slot_id]->out_ctx->ep[ep_index]; | 852 | ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); |
| 815 | /* If the HCD has already noted the endpoint is enabled, | 853 | /* If the HCD has already noted the endpoint is enabled, |
| 816 | * ignore this request. | 854 | * ignore this request. |
| 817 | */ | 855 | */ |
| 818 | if (in_ctx->add_flags & xhci_get_endpoint_flag(&ep->desc)) { | 856 | if (ctrl_ctx->add_flags & xhci_get_endpoint_flag(&ep->desc)) { |
| 819 | xhci_warn(xhci, "xHCI %s called with enabled ep %p\n", | 857 | xhci_warn(xhci, "xHCI %s called with enabled ep %p\n", |
| 820 | __func__, ep); | 858 | __func__, ep); |
| 821 | return 0; | 859 | return 0; |
| @@ -833,8 +871,8 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 833 | return -ENOMEM; | 871 | return -ENOMEM; |
| 834 | } | 872 | } |
| 835 | 873 | ||
| 836 | in_ctx->add_flags |= added_ctxs; | 874 | ctrl_ctx->add_flags |= added_ctxs; |
| 837 | new_add_flags = in_ctx->add_flags; | 875 | new_add_flags = ctrl_ctx->add_flags; |
| 838 | 876 | ||
| 839 | /* If xhci_endpoint_disable() was called for this endpoint, but the | 877 | /* If xhci_endpoint_disable() was called for this endpoint, but the |
| 840 | * xHC hasn't been notified yet through the check_bandwidth() call, | 878 | * xHC hasn't been notified yet through the check_bandwidth() call, |
| @@ -842,14 +880,18 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 842 | * descriptors. We must drop and re-add this endpoint, so we leave the | 880 | * descriptors. We must drop and re-add this endpoint, so we leave the |
| 843 | * drop flags alone. | 881 | * drop flags alone. |
| 844 | */ | 882 | */ |
| 845 | new_drop_flags = in_ctx->drop_flags; | 883 | new_drop_flags = ctrl_ctx->drop_flags; |
| 846 | 884 | ||
| 885 | slot_ctx = xhci_get_slot_ctx(xhci, in_ctx); | ||
| 847 | /* Update the last valid endpoint context, if we just added one past */ | 886 | /* Update the last valid endpoint context, if we just added one past */ |
| 848 | if ((in_ctx->slot.dev_info & LAST_CTX_MASK) < LAST_CTX(last_ctx)) { | 887 | if ((slot_ctx->dev_info & LAST_CTX_MASK) < LAST_CTX(last_ctx)) { |
| 849 | in_ctx->slot.dev_info &= ~LAST_CTX_MASK; | 888 | slot_ctx->dev_info &= ~LAST_CTX_MASK; |
| 850 | in_ctx->slot.dev_info |= LAST_CTX(last_ctx); | 889 | slot_ctx->dev_info |= LAST_CTX(last_ctx); |
| 851 | } | 890 | } |
| 852 | new_slot_info = in_ctx->slot.dev_info; | 891 | new_slot_info = slot_ctx->dev_info; |
| 892 | |||
| 893 | /* Store the usb_device pointer for later use */ | ||
| 894 | ep->hcpriv = udev; | ||
| 853 | 895 | ||
| 854 | xhci_dbg(xhci, "add ep 0x%x, slot id %d, new drop flags = %#x, new add flags = %#x, new slot info = %#x\n", | 896 | xhci_dbg(xhci, "add ep 0x%x, slot id %d, new drop flags = %#x, new add flags = %#x, new slot info = %#x\n", |
| 855 | (unsigned int) ep->desc.bEndpointAddress, | 897 | (unsigned int) ep->desc.bEndpointAddress, |
| @@ -860,9 +902,11 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 860 | return 0; | 902 | return 0; |
| 861 | } | 903 | } |
| 862 | 904 | ||
| 863 | static void xhci_zero_in_ctx(struct xhci_virt_device *virt_dev) | 905 | static void xhci_zero_in_ctx(struct xhci_hcd *xhci, struct xhci_virt_device *virt_dev) |
| 864 | { | 906 | { |
| 907 | struct xhci_input_control_ctx *ctrl_ctx; | ||
| 865 | struct xhci_ep_ctx *ep_ctx; | 908 | struct xhci_ep_ctx *ep_ctx; |
| 909 | struct xhci_slot_ctx *slot_ctx; | ||
| 866 | int i; | 910 | int i; |
| 867 | 911 | ||
| 868 | /* When a device's add flag and drop flag are zero, any subsequent | 912 | /* When a device's add flag and drop flag are zero, any subsequent |
| @@ -870,17 +914,18 @@ static void xhci_zero_in_ctx(struct xhci_virt_device *virt_dev) | |||
| 870 | * untouched. Make sure we don't leave any old state in the input | 914 | * untouched. Make sure we don't leave any old state in the input |
| 871 | * endpoint contexts. | 915 | * endpoint contexts. |
| 872 | */ | 916 | */ |
| 873 | virt_dev->in_ctx->drop_flags = 0; | 917 | ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx); |
| 874 | virt_dev->in_ctx->add_flags = 0; | 918 | ctrl_ctx->drop_flags = 0; |
| 875 | virt_dev->in_ctx->slot.dev_info &= ~LAST_CTX_MASK; | 919 | ctrl_ctx->add_flags = 0; |
| 920 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); | ||
| 921 | slot_ctx->dev_info &= ~LAST_CTX_MASK; | ||
| 876 | /* Endpoint 0 is always valid */ | 922 | /* Endpoint 0 is always valid */ |
| 877 | virt_dev->in_ctx->slot.dev_info |= LAST_CTX(1); | 923 | slot_ctx->dev_info |= LAST_CTX(1); |
| 878 | for (i = 1; i < 31; ++i) { | 924 | for (i = 1; i < 31; ++i) { |
| 879 | ep_ctx = &virt_dev->in_ctx->ep[i]; | 925 | ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, i); |
| 880 | ep_ctx->ep_info = 0; | 926 | ep_ctx->ep_info = 0; |
| 881 | ep_ctx->ep_info2 = 0; | 927 | ep_ctx->ep_info2 = 0; |
| 882 | ep_ctx->deq[0] = 0; | 928 | ep_ctx->deq = 0; |
| 883 | ep_ctx->deq[1] = 0; | ||
| 884 | ep_ctx->tx_info = 0; | 929 | ep_ctx->tx_info = 0; |
| 885 | } | 930 | } |
| 886 | } | 931 | } |
| @@ -903,6 +948,8 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 903 | unsigned long flags; | 948 | unsigned long flags; |
| 904 | struct xhci_hcd *xhci; | 949 | struct xhci_hcd *xhci; |
| 905 | struct xhci_virt_device *virt_dev; | 950 | struct xhci_virt_device *virt_dev; |
| 951 | struct xhci_input_control_ctx *ctrl_ctx; | ||
| 952 | struct xhci_slot_ctx *slot_ctx; | ||
| 906 | 953 | ||
| 907 | ret = xhci_check_args(hcd, udev, NULL, 0, __func__); | 954 | ret = xhci_check_args(hcd, udev, NULL, 0, __func__); |
| 908 | if (ret <= 0) | 955 | if (ret <= 0) |
| @@ -918,16 +965,18 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 918 | virt_dev = xhci->devs[udev->slot_id]; | 965 | virt_dev = xhci->devs[udev->slot_id]; |
| 919 | 966 | ||
| 920 | /* See section 4.6.6 - A0 = 1; A1 = D0 = D1 = 0 */ | 967 | /* See section 4.6.6 - A0 = 1; A1 = D0 = D1 = 0 */ |
| 921 | virt_dev->in_ctx->add_flags |= SLOT_FLAG; | 968 | ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx); |
| 922 | virt_dev->in_ctx->add_flags &= ~EP0_FLAG; | 969 | ctrl_ctx->add_flags |= SLOT_FLAG; |
| 923 | virt_dev->in_ctx->drop_flags &= ~SLOT_FLAG; | 970 | ctrl_ctx->add_flags &= ~EP0_FLAG; |
| 924 | virt_dev->in_ctx->drop_flags &= ~EP0_FLAG; | 971 | ctrl_ctx->drop_flags &= ~SLOT_FLAG; |
| 972 | ctrl_ctx->drop_flags &= ~EP0_FLAG; | ||
| 925 | xhci_dbg(xhci, "New Input Control Context:\n"); | 973 | xhci_dbg(xhci, "New Input Control Context:\n"); |
| 926 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, virt_dev->in_ctx_dma, | 974 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->in_ctx); |
| 927 | LAST_CTX_TO_EP_NUM(virt_dev->in_ctx->slot.dev_info)); | 975 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, |
| 976 | LAST_CTX_TO_EP_NUM(slot_ctx->dev_info)); | ||
| 928 | 977 | ||
| 929 | spin_lock_irqsave(&xhci->lock, flags); | 978 | spin_lock_irqsave(&xhci->lock, flags); |
| 930 | ret = xhci_queue_configure_endpoint(xhci, virt_dev->in_ctx_dma, | 979 | ret = xhci_queue_configure_endpoint(xhci, virt_dev->in_ctx->dma, |
| 931 | udev->slot_id); | 980 | udev->slot_id); |
| 932 | if (ret < 0) { | 981 | if (ret < 0) { |
| 933 | spin_unlock_irqrestore(&xhci->lock, flags); | 982 | spin_unlock_irqrestore(&xhci->lock, flags); |
| @@ -982,10 +1031,10 @@ int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 982 | } | 1031 | } |
| 983 | 1032 | ||
| 984 | xhci_dbg(xhci, "Output context after successful config ep cmd:\n"); | 1033 | xhci_dbg(xhci, "Output context after successful config ep cmd:\n"); |
| 985 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, virt_dev->out_ctx_dma, | 1034 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, |
| 986 | LAST_CTX_TO_EP_NUM(virt_dev->in_ctx->slot.dev_info)); | 1035 | LAST_CTX_TO_EP_NUM(slot_ctx->dev_info)); |
| 987 | 1036 | ||
| 988 | xhci_zero_in_ctx(virt_dev); | 1037 | xhci_zero_in_ctx(xhci, virt_dev); |
| 989 | /* Free any old rings */ | 1038 | /* Free any old rings */ |
| 990 | for (i = 1; i < 31; ++i) { | 1039 | for (i = 1; i < 31; ++i) { |
| 991 | if (virt_dev->new_ep_rings[i]) { | 1040 | if (virt_dev->new_ep_rings[i]) { |
| @@ -1023,7 +1072,67 @@ void xhci_reset_bandwidth(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 1023 | virt_dev->new_ep_rings[i] = NULL; | 1072 | virt_dev->new_ep_rings[i] = NULL; |
| 1024 | } | 1073 | } |
| 1025 | } | 1074 | } |
| 1026 | xhci_zero_in_ctx(virt_dev); | 1075 | xhci_zero_in_ctx(xhci, virt_dev); |
| 1076 | } | ||
| 1077 | |||
| 1078 | /* Deal with stalled endpoints. The core should have sent the control message | ||
| 1079 | * to clear the halt condition. However, we need to make the xHCI hardware | ||
| 1080 | * reset its sequence number, since a device will expect a sequence number of | ||
| 1081 | * zero after the halt condition is cleared. | ||
| 1082 | * Context: in_interrupt | ||
| 1083 | */ | ||
| 1084 | void xhci_endpoint_reset(struct usb_hcd *hcd, | ||
| 1085 | struct usb_host_endpoint *ep) | ||
| 1086 | { | ||
| 1087 | struct xhci_hcd *xhci; | ||
| 1088 | struct usb_device *udev; | ||
| 1089 | unsigned int ep_index; | ||
| 1090 | unsigned long flags; | ||
| 1091 | int ret; | ||
| 1092 | struct xhci_dequeue_state deq_state; | ||
| 1093 | struct xhci_ring *ep_ring; | ||
| 1094 | |||
| 1095 | xhci = hcd_to_xhci(hcd); | ||
| 1096 | udev = (struct usb_device *) ep->hcpriv; | ||
| 1097 | /* Called with a root hub endpoint (or an endpoint that wasn't added | ||
| 1098 | * with xhci_add_endpoint() | ||
| 1099 | */ | ||
| 1100 | if (!ep->hcpriv) | ||
| 1101 | return; | ||
| 1102 | ep_index = xhci_get_endpoint_index(&ep->desc); | ||
| 1103 | ep_ring = xhci->devs[udev->slot_id]->ep_rings[ep_index]; | ||
| 1104 | if (!ep_ring->stopped_td) { | ||
| 1105 | xhci_dbg(xhci, "Endpoint 0x%x not halted, refusing to reset.\n", | ||
| 1106 | ep->desc.bEndpointAddress); | ||
| 1107 | return; | ||
| 1108 | } | ||
| 1109 | |||
| 1110 | xhci_dbg(xhci, "Queueing reset endpoint command\n"); | ||
| 1111 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 1112 | ret = xhci_queue_reset_ep(xhci, udev->slot_id, ep_index); | ||
| 1113 | /* | ||
| 1114 | * Can't change the ring dequeue pointer until it's transitioned to the | ||
| 1115 | * stopped state, which is only upon a successful reset endpoint | ||
| 1116 | * command. Better hope that last command worked! | ||
| 1117 | */ | ||
| 1118 | if (!ret) { | ||
| 1119 | xhci_dbg(xhci, "Cleaning up stalled endpoint ring\n"); | ||
| 1120 | /* We need to move the HW's dequeue pointer past this TD, | ||
| 1121 | * or it will attempt to resend it on the next doorbell ring. | ||
| 1122 | */ | ||
| 1123 | xhci_find_new_dequeue_state(xhci, udev->slot_id, | ||
| 1124 | ep_index, ep_ring->stopped_td, &deq_state); | ||
| 1125 | xhci_dbg(xhci, "Queueing new dequeue state\n"); | ||
| 1126 | xhci_queue_new_dequeue_state(xhci, ep_ring, | ||
| 1127 | udev->slot_id, | ||
| 1128 | ep_index, &deq_state); | ||
| 1129 | kfree(ep_ring->stopped_td); | ||
| 1130 | xhci_ring_cmd_db(xhci); | ||
| 1131 | } | ||
| 1132 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 1133 | |||
| 1134 | if (ret) | ||
| 1135 | xhci_warn(xhci, "FIXME allocate a new ring segment\n"); | ||
| 1027 | } | 1136 | } |
| 1028 | 1137 | ||
| 1029 | /* | 1138 | /* |
| @@ -1120,7 +1229,9 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 1120 | struct xhci_virt_device *virt_dev; | 1229 | struct xhci_virt_device *virt_dev; |
| 1121 | int ret = 0; | 1230 | int ret = 0; |
| 1122 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 1231 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
| 1123 | u32 temp; | 1232 | struct xhci_slot_ctx *slot_ctx; |
| 1233 | struct xhci_input_control_ctx *ctrl_ctx; | ||
| 1234 | u64 temp_64; | ||
| 1124 | 1235 | ||
| 1125 | if (!udev->slot_id) { | 1236 | if (!udev->slot_id) { |
| 1126 | xhci_dbg(xhci, "Bad Slot ID %d\n", udev->slot_id); | 1237 | xhci_dbg(xhci, "Bad Slot ID %d\n", udev->slot_id); |
| @@ -1133,10 +1244,12 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 1133 | if (!udev->config) | 1244 | if (!udev->config) |
| 1134 | xhci_setup_addressable_virt_dev(xhci, udev); | 1245 | xhci_setup_addressable_virt_dev(xhci, udev); |
| 1135 | /* Otherwise, assume the core has the device configured how it wants */ | 1246 | /* Otherwise, assume the core has the device configured how it wants */ |
| 1247 | xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); | ||
| 1248 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2); | ||
| 1136 | 1249 | ||
| 1137 | spin_lock_irqsave(&xhci->lock, flags); | 1250 | spin_lock_irqsave(&xhci->lock, flags); |
| 1138 | ret = xhci_queue_address_device(xhci, virt_dev->in_ctx_dma, | 1251 | ret = xhci_queue_address_device(xhci, virt_dev->in_ctx->dma, |
| 1139 | udev->slot_id); | 1252 | udev->slot_id); |
| 1140 | if (ret) { | 1253 | if (ret) { |
| 1141 | spin_unlock_irqrestore(&xhci->lock, flags); | 1254 | spin_unlock_irqrestore(&xhci->lock, flags); |
| 1142 | xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); | 1255 | xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); |
| @@ -1176,41 +1289,37 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
| 1176 | default: | 1289 | default: |
| 1177 | xhci_err(xhci, "ERROR: unexpected command completion " | 1290 | xhci_err(xhci, "ERROR: unexpected command completion " |
| 1178 | "code 0x%x.\n", virt_dev->cmd_status); | 1291 | "code 0x%x.\n", virt_dev->cmd_status); |
| 1292 | xhci_dbg(xhci, "Slot ID %d Output Context:\n", udev->slot_id); | ||
| 1293 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, 2); | ||
| 1179 | ret = -EINVAL; | 1294 | ret = -EINVAL; |
| 1180 | break; | 1295 | break; |
| 1181 | } | 1296 | } |
| 1182 | if (ret) { | 1297 | if (ret) { |
| 1183 | return ret; | 1298 | return ret; |
| 1184 | } | 1299 | } |
| 1185 | temp = xhci_readl(xhci, &xhci->op_regs->dcbaa_ptr[0]); | 1300 | temp_64 = xhci_read_64(xhci, &xhci->op_regs->dcbaa_ptr); |
| 1186 | xhci_dbg(xhci, "Op regs DCBAA ptr[0] = %#08x\n", temp); | 1301 | xhci_dbg(xhci, "Op regs DCBAA ptr = %#016llx\n", temp_64); |
| 1187 | temp = xhci_readl(xhci, &xhci->op_regs->dcbaa_ptr[1]); | 1302 | xhci_dbg(xhci, "Slot ID %d dcbaa entry @%p = %#016llx\n", |
| 1188 | xhci_dbg(xhci, "Op regs DCBAA ptr[1] = %#08x\n", temp); | ||
| 1189 | xhci_dbg(xhci, "Slot ID %d dcbaa entry[0] @%p = %#08x\n", | ||
| 1190 | udev->slot_id, | ||
| 1191 | &xhci->dcbaa->dev_context_ptrs[2*udev->slot_id], | ||
| 1192 | xhci->dcbaa->dev_context_ptrs[2*udev->slot_id]); | ||
| 1193 | xhci_dbg(xhci, "Slot ID %d dcbaa entry[1] @%p = %#08x\n", | ||
| 1194 | udev->slot_id, | 1303 | udev->slot_id, |
| 1195 | &xhci->dcbaa->dev_context_ptrs[2*udev->slot_id+1], | 1304 | &xhci->dcbaa->dev_context_ptrs[udev->slot_id], |
| 1196 | xhci->dcbaa->dev_context_ptrs[2*udev->slot_id+1]); | 1305 | (unsigned long long) |
| 1306 | xhci->dcbaa->dev_context_ptrs[udev->slot_id]); | ||
| 1197 | xhci_dbg(xhci, "Output Context DMA address = %#08llx\n", | 1307 | xhci_dbg(xhci, "Output Context DMA address = %#08llx\n", |
| 1198 | (unsigned long long)virt_dev->out_ctx_dma); | 1308 | (unsigned long long)virt_dev->out_ctx->dma); |
| 1199 | xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); | 1309 | xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); |
| 1200 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, virt_dev->in_ctx_dma, 2); | 1310 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, 2); |
| 1201 | xhci_dbg(xhci, "Slot ID %d Output Context:\n", udev->slot_id); | 1311 | xhci_dbg(xhci, "Slot ID %d Output Context:\n", udev->slot_id); |
| 1202 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, virt_dev->out_ctx_dma, 2); | 1312 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, 2); |
| 1203 | /* | 1313 | /* |
| 1204 | * USB core uses address 1 for the roothubs, so we add one to the | 1314 | * USB core uses address 1 for the roothubs, so we add one to the |
| 1205 | * address given back to us by the HC. | 1315 | * address given back to us by the HC. |
| 1206 | */ | 1316 | */ |
| 1207 | udev->devnum = (virt_dev->out_ctx->slot.dev_state & DEV_ADDR_MASK) + 1; | 1317 | slot_ctx = xhci_get_slot_ctx(xhci, virt_dev->out_ctx); |
| 1318 | udev->devnum = (slot_ctx->dev_state & DEV_ADDR_MASK) + 1; | ||
| 1208 | /* Zero the input context control for later use */ | 1319 | /* Zero the input context control for later use */ |
| 1209 | virt_dev->in_ctx->add_flags = 0; | 1320 | ctrl_ctx = xhci_get_input_control_ctx(xhci, virt_dev->in_ctx); |
| 1210 | virt_dev->in_ctx->drop_flags = 0; | 1321 | ctrl_ctx->add_flags = 0; |
| 1211 | /* Mirror flags in the output context for future ep enable/disable */ | 1322 | ctrl_ctx->drop_flags = 0; |
| 1212 | virt_dev->out_ctx->add_flags = SLOT_FLAG | EP0_FLAG; | ||
| 1213 | virt_dev->out_ctx->drop_flags = 0; | ||
| 1214 | 1323 | ||
| 1215 | xhci_dbg(xhci, "Device address = %d\n", udev->devnum); | 1324 | xhci_dbg(xhci, "Device address = %d\n", udev->devnum); |
| 1216 | /* XXX Meh, not sure if anyone else but choose_address uses this. */ | 1325 | /* XXX Meh, not sure if anyone else but choose_address uses this. */ |
| @@ -1252,7 +1361,6 @@ static int __init xhci_hcd_init(void) | |||
| 1252 | /* xhci_device_control has eight fields, and also | 1361 | /* xhci_device_control has eight fields, and also |
| 1253 | * embeds one xhci_slot_ctx and 31 xhci_ep_ctx | 1362 | * embeds one xhci_slot_ctx and 31 xhci_ep_ctx |
| 1254 | */ | 1363 | */ |
| 1255 | BUILD_BUG_ON(sizeof(struct xhci_device_control) != (8+8+8*31)*32/8); | ||
| 1256 | BUILD_BUG_ON(sizeof(struct xhci_stream_ctx) != 4*32/8); | 1364 | BUILD_BUG_ON(sizeof(struct xhci_stream_ctx) != 4*32/8); |
| 1257 | BUILD_BUG_ON(sizeof(union xhci_trb) != 4*32/8); | 1365 | BUILD_BUG_ON(sizeof(union xhci_trb) != 4*32/8); |
| 1258 | BUILD_BUG_ON(sizeof(struct xhci_erst_entry) != 4*32/8); | 1366 | BUILD_BUG_ON(sizeof(struct xhci_erst_entry) != 4*32/8); |
