diff options
| -rw-r--r-- | drivers/usb/host/xhci-dbg.c | 79 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-hcd.c | 201 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-mem.c | 204 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-pci.c | 7 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 34 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.h | 94 |
6 files changed, 590 insertions, 29 deletions
diff --git a/drivers/usb/host/xhci-dbg.c b/drivers/usb/host/xhci-dbg.c index 570cd4820458..16ef42a0fe85 100644 --- a/drivers/usb/host/xhci-dbg.c +++ b/drivers/usb/host/xhci-dbg.c | |||
| @@ -410,3 +410,82 @@ void xhci_dbg_cmd_ptrs(struct xhci_hcd *xhci) | |||
| 410 | val = xhci_readl(xhci, &xhci->op_regs->cmd_ring[1]); | 410 | val = xhci_readl(xhci, &xhci->op_regs->cmd_ring[1]); |
| 411 | xhci_dbg(xhci, "// xHC command ring deq ptr high bits = 0x%x\n", val); | 411 | xhci_dbg(xhci, "// xHC command ring deq ptr high bits = 0x%x\n", val); |
| 412 | } | 412 | } |
| 413 | |||
| 414 | void xhci_dbg_ctx(struct xhci_hcd *xhci, struct xhci_device_control *ctx, dma_addr_t dma, unsigned int last_ep) | ||
| 415 | { | ||
| 416 | int i, j; | ||
| 417 | int last_ep_ctx = 31; | ||
| 418 | /* Fields are 32 bits wide, DMA addresses are in bytes */ | ||
| 419 | int field_size = 32 / 8; | ||
| 420 | |||
| 421 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - drop flags\n", | ||
| 422 | (unsigned int) &ctx->drop_flags, | ||
| 423 | dma, ctx->drop_flags); | ||
| 424 | dma += field_size; | ||
| 425 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - add flags\n", | ||
| 426 | (unsigned int) &ctx->add_flags, | ||
| 427 | dma, ctx->add_flags); | ||
| 428 | dma += field_size; | ||
| 429 | for (i = 0; i > 6; ++i) { | ||
| 430 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - rsvd[%d]\n", | ||
| 431 | (unsigned int) &ctx->rsvd[i], | ||
| 432 | dma, ctx->rsvd[i], i); | ||
| 433 | dma += field_size; | ||
| 434 | } | ||
| 435 | |||
| 436 | xhci_dbg(xhci, "Slot Context:\n"); | ||
| 437 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - dev_info\n", | ||
| 438 | (unsigned int) &ctx->slot.dev_info, | ||
| 439 | dma, ctx->slot.dev_info); | ||
| 440 | dma += field_size; | ||
| 441 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - dev_info2\n", | ||
| 442 | (unsigned int) &ctx->slot.dev_info2, | ||
| 443 | dma, ctx->slot.dev_info2); | ||
| 444 | dma += field_size; | ||
| 445 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - tt_info\n", | ||
| 446 | (unsigned int) &ctx->slot.tt_info, | ||
| 447 | dma, ctx->slot.tt_info); | ||
| 448 | dma += field_size; | ||
| 449 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - dev_state\n", | ||
| 450 | (unsigned int) &ctx->slot.dev_state, | ||
| 451 | dma, ctx->slot.dev_state); | ||
| 452 | dma += field_size; | ||
| 453 | for (i = 0; i > 4; ++i) { | ||
| 454 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - rsvd[%d]\n", | ||
| 455 | (unsigned int) &ctx->slot.reserved[i], | ||
| 456 | dma, ctx->slot.reserved[i], i); | ||
| 457 | dma += field_size; | ||
| 458 | } | ||
| 459 | |||
| 460 | if (last_ep < 31) | ||
| 461 | last_ep_ctx = last_ep + 1; | ||
| 462 | for (i = 0; i < last_ep_ctx; ++i) { | ||
| 463 | xhci_dbg(xhci, "Endpoint %02d Context:\n", i); | ||
| 464 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - ep_info\n", | ||
| 465 | (unsigned int) &ctx->ep[i].ep_info, | ||
| 466 | dma, ctx->ep[i].ep_info); | ||
| 467 | dma += field_size; | ||
| 468 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - ep_info2\n", | ||
| 469 | (unsigned int) &ctx->ep[i].ep_info2, | ||
| 470 | dma, ctx->ep[i].ep_info2); | ||
| 471 | dma += field_size; | ||
| 472 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - deq[0]\n", | ||
| 473 | (unsigned int) &ctx->ep[i].deq[0], | ||
| 474 | dma, ctx->ep[i].deq[0]); | ||
| 475 | dma += field_size; | ||
| 476 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - deq[1]\n", | ||
| 477 | (unsigned int) &ctx->ep[i].deq[1], | ||
| 478 | dma, ctx->ep[i].deq[1]); | ||
| 479 | dma += field_size; | ||
| 480 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - tx_info\n", | ||
| 481 | (unsigned int) &ctx->ep[i].tx_info, | ||
| 482 | dma, ctx->ep[i].tx_info); | ||
| 483 | dma += field_size; | ||
| 484 | for (j = 0; j < 3; ++j) { | ||
| 485 | xhci_dbg(xhci, "@%08x (virt) @%08x (dma) %#08x - rsvd[%d]\n", | ||
| 486 | (unsigned int) &ctx->ep[i].reserved[j], | ||
| 487 | dma, ctx->ep[i].reserved[j], j); | ||
| 488 | dma += field_size; | ||
| 489 | } | ||
| 490 | } | ||
| 491 | } | ||
diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c index d7c2fed55978..a01d2ee7435a 100644 --- a/drivers/usb/host/xhci-hcd.c +++ b/drivers/usb/host/xhci-hcd.c | |||
| @@ -318,6 +318,16 @@ void event_ring_work(unsigned long arg) | |||
| 318 | xhci_debug_segment(xhci, xhci->cmd_ring->deq_seg); | 318 | xhci_debug_segment(xhci, xhci->cmd_ring->deq_seg); |
| 319 | xhci_dbg_ring_ptrs(xhci, xhci->cmd_ring); | 319 | xhci_dbg_ring_ptrs(xhci, xhci->cmd_ring); |
| 320 | xhci_dbg_cmd_ptrs(xhci); | 320 | xhci_dbg_cmd_ptrs(xhci); |
| 321 | for (i = 0; i < MAX_HC_SLOTS; ++i) { | ||
| 322 | if (xhci->devs[i]) { | ||
| 323 | for (j = 0; j < 31; ++j) { | ||
| 324 | if (xhci->devs[i]->ep_rings[j]) { | ||
| 325 | xhci_dbg(xhci, "Dev %d endpoint ring %d:\n", i, j); | ||
| 326 | xhci_debug_segment(xhci, xhci->devs[i]->ep_rings[j]->deq_seg); | ||
| 327 | } | ||
| 328 | } | ||
| 329 | } | ||
| 330 | } | ||
| 321 | 331 | ||
| 322 | if (xhci->noops_submitted != NUM_TEST_NOOPS) | 332 | if (xhci->noops_submitted != NUM_TEST_NOOPS) |
| 323 | if (setup_one_noop(xhci)) | 333 | if (setup_one_noop(xhci)) |
| @@ -499,6 +509,197 @@ void xhci_shutdown(struct usb_hcd *hcd) | |||
| 499 | 509 | ||
| 500 | /*-------------------------------------------------------------------------*/ | 510 | /*-------------------------------------------------------------------------*/ |
| 501 | 511 | ||
| 512 | /* | ||
| 513 | * At this point, the struct usb_device is about to go away, the device has | ||
| 514 | * disconnected, and all traffic has been stopped and the endpoints have been | ||
| 515 | * disabled. Free any HC data structures associated with that device. | ||
| 516 | */ | ||
| 517 | void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) | ||
| 518 | { | ||
| 519 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
| 520 | unsigned long flags; | ||
| 521 | |||
| 522 | if (udev->slot_id == 0) | ||
| 523 | return; | ||
| 524 | |||
| 525 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 526 | if (queue_slot_control(xhci, TRB_DISABLE_SLOT, udev->slot_id)) { | ||
| 527 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 528 | xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); | ||
| 529 | return; | ||
| 530 | } | ||
| 531 | ring_cmd_db(xhci); | ||
| 532 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 533 | /* | ||
| 534 | * Event command completion handler will free any data structures | ||
| 535 | * associated with the slot | ||
| 536 | */ | ||
| 537 | } | ||
| 538 | |||
| 539 | /* | ||
| 540 | * Returns 0 if the xHC ran out of device slots, the Enable Slot command | ||
| 541 | * timed out, or allocating memory failed. Returns 1 on success. | ||
| 542 | */ | ||
| 543 | int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev) | ||
| 544 | { | ||
| 545 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
| 546 | unsigned long flags; | ||
| 547 | int timeleft; | ||
| 548 | int ret; | ||
| 549 | |||
| 550 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 551 | ret = queue_slot_control(xhci, TRB_ENABLE_SLOT, 0); | ||
| 552 | if (ret) { | ||
| 553 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 554 | xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); | ||
| 555 | return 0; | ||
| 556 | } | ||
| 557 | ring_cmd_db(xhci); | ||
| 558 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 559 | |||
| 560 | /* XXX: how much time for xHC slot assignment? */ | ||
| 561 | timeleft = wait_for_completion_interruptible_timeout(&xhci->addr_dev, | ||
| 562 | USB_CTRL_SET_TIMEOUT); | ||
| 563 | if (timeleft <= 0) { | ||
| 564 | xhci_warn(xhci, "%s while waiting for a slot\n", | ||
| 565 | timeleft == 0 ? "Timeout" : "Signal"); | ||
| 566 | /* FIXME cancel the enable slot request */ | ||
| 567 | return 0; | ||
| 568 | } | ||
| 569 | |||
| 570 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 571 | if (!xhci->slot_id) { | ||
| 572 | xhci_err(xhci, "Error while assigning device slot ID\n"); | ||
| 573 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 574 | return 0; | ||
| 575 | } | ||
| 576 | if (!xhci_alloc_virt_device(xhci, xhci->slot_id, udev, GFP_KERNEL)) { | ||
| 577 | /* Disable slot, if we can do it without mem alloc */ | ||
| 578 | xhci_warn(xhci, "Could not allocate xHCI USB device data structures\n"); | ||
| 579 | if (!queue_slot_control(xhci, TRB_DISABLE_SLOT, udev->slot_id)) | ||
| 580 | ring_cmd_db(xhci); | ||
| 581 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 582 | return 0; | ||
| 583 | } | ||
| 584 | udev->slot_id = xhci->slot_id; | ||
| 585 | /* Is this a LS or FS device under a HS hub? */ | ||
| 586 | /* Hub or peripherial? */ | ||
| 587 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 588 | return 1; | ||
| 589 | } | ||
| 590 | |||
| 591 | /* | ||
| 592 | * Issue an Address Device command (which will issue a SetAddress request to | ||
| 593 | * the device). | ||
| 594 | * We should be protected by the usb_address0_mutex in khubd's hub_port_init, so | ||
| 595 | * we should only issue and wait on one address command at the same time. | ||
| 596 | * | ||
| 597 | * We add one to the device address issued by the hardware because the USB core | ||
| 598 | * uses address 1 for the root hubs (even though they're not really devices). | ||
| 599 | */ | ||
| 600 | int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | ||
| 601 | { | ||
| 602 | unsigned long flags; | ||
| 603 | int timeleft; | ||
| 604 | struct xhci_virt_device *virt_dev; | ||
| 605 | int ret = 0; | ||
| 606 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
| 607 | u32 temp; | ||
| 608 | |||
| 609 | if (!udev->slot_id) { | ||
| 610 | xhci_dbg(xhci, "Bad Slot ID %d\n", udev->slot_id); | ||
| 611 | return -EINVAL; | ||
| 612 | } | ||
| 613 | |||
| 614 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 615 | virt_dev = xhci->devs[udev->slot_id]; | ||
| 616 | |||
| 617 | /* If this is a Set Address to an unconfigured device, setup ep 0 */ | ||
| 618 | if (!udev->config) | ||
| 619 | xhci_setup_addressable_virt_dev(xhci, udev); | ||
| 620 | /* Otherwise, assume the core has the device configured how it wants */ | ||
| 621 | |||
| 622 | ret = queue_address_device(xhci, virt_dev->in_ctx_dma, udev->slot_id); | ||
| 623 | if (ret) { | ||
| 624 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 625 | xhci_dbg(xhci, "FIXME: allocate a command ring segment\n"); | ||
| 626 | return ret; | ||
| 627 | } | ||
| 628 | ring_cmd_db(xhci); | ||
| 629 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 630 | |||
| 631 | /* ctrl tx can take up to 5 sec; XXX: need more time for xHC? */ | ||
| 632 | timeleft = wait_for_completion_interruptible_timeout(&xhci->addr_dev, | ||
| 633 | USB_CTRL_SET_TIMEOUT); | ||
| 634 | /* FIXME: From section 4.3.4: "Software shall be responsible for timing | ||
| 635 | * the SetAddress() "recovery interval" required by USB and aborting the | ||
| 636 | * command on a timeout. | ||
| 637 | */ | ||
| 638 | if (timeleft <= 0) { | ||
| 639 | xhci_warn(xhci, "%s while waiting for a slot\n", | ||
| 640 | timeleft == 0 ? "Timeout" : "Signal"); | ||
| 641 | /* FIXME cancel the address device command */ | ||
| 642 | return -ETIME; | ||
| 643 | } | ||
| 644 | |||
| 645 | spin_lock_irqsave(&xhci->lock, flags); | ||
| 646 | switch (virt_dev->cmd_status) { | ||
| 647 | case COMP_CTX_STATE: | ||
| 648 | case COMP_EBADSLT: | ||
| 649 | xhci_err(xhci, "Setup ERROR: address device command for slot %d.\n", | ||
| 650 | udev->slot_id); | ||
| 651 | ret = -EINVAL; | ||
| 652 | break; | ||
| 653 | case COMP_TX_ERR: | ||
| 654 | dev_warn(&udev->dev, "Device not responding to set address.\n"); | ||
| 655 | ret = -EPROTO; | ||
| 656 | break; | ||
| 657 | case COMP_SUCCESS: | ||
| 658 | xhci_dbg(xhci, "Successful Address Device command\n"); | ||
| 659 | break; | ||
| 660 | default: | ||
| 661 | xhci_err(xhci, "ERROR: unexpected command completion " | ||
| 662 | "code 0x%x.\n", virt_dev->cmd_status); | ||
| 663 | ret = -EINVAL; | ||
| 664 | break; | ||
| 665 | } | ||
| 666 | if (ret) { | ||
| 667 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 668 | return ret; | ||
| 669 | } | ||
| 670 | temp = xhci_readl(xhci, &xhci->op_regs->dcbaa_ptr[0]); | ||
| 671 | xhci_dbg(xhci, "Op regs DCBAA ptr[0] = %#08x\n", temp); | ||
| 672 | temp = xhci_readl(xhci, &xhci->op_regs->dcbaa_ptr[1]); | ||
| 673 | xhci_dbg(xhci, "Op regs DCBAA ptr[1] = %#08x\n", temp); | ||
| 674 | xhci_dbg(xhci, "Slot ID %d dcbaa entry[0] @%08x = %#08x\n", | ||
| 675 | udev->slot_id, | ||
| 676 | (unsigned int) &xhci->dcbaa->dev_context_ptrs[2*udev->slot_id], | ||
| 677 | xhci->dcbaa->dev_context_ptrs[2*udev->slot_id]); | ||
| 678 | xhci_dbg(xhci, "Slot ID %d dcbaa entry[1] @%08x = %#08x\n", | ||
| 679 | udev->slot_id, | ||
| 680 | (unsigned int) &xhci->dcbaa->dev_context_ptrs[2*udev->slot_id+1], | ||
| 681 | xhci->dcbaa->dev_context_ptrs[2*udev->slot_id+1]); | ||
| 682 | xhci_dbg(xhci, "Output Context DMA address = %#08x\n", | ||
| 683 | virt_dev->out_ctx_dma); | ||
| 684 | xhci_dbg(xhci, "Slot ID %d Input Context:\n", udev->slot_id); | ||
| 685 | xhci_dbg_ctx(xhci, virt_dev->in_ctx, virt_dev->in_ctx_dma, 2); | ||
| 686 | xhci_dbg(xhci, "Slot ID %d Output Context:\n", udev->slot_id); | ||
| 687 | xhci_dbg_ctx(xhci, virt_dev->out_ctx, virt_dev->out_ctx_dma, 2); | ||
| 688 | /* | ||
| 689 | * USB core uses address 1 for the roothubs, so we add one to the | ||
| 690 | * address given back to us by the HC. | ||
| 691 | */ | ||
| 692 | udev->devnum = (virt_dev->out_ctx->slot.dev_state & DEV_ADDR_MASK) + 1; | ||
| 693 | /* FIXME: Zero the input context control for later use? */ | ||
| 694 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
| 695 | |||
| 696 | xhci_dbg(xhci, "Device address = %d\n", udev->devnum); | ||
| 697 | /* XXX Meh, not sure if anyone else but choose_address uses this. */ | ||
| 698 | set_bit(udev->devnum, udev->bus->devmap.devicemap); | ||
| 699 | |||
| 700 | return 0; | ||
| 701 | } | ||
| 702 | |||
| 502 | int xhci_get_frame(struct usb_hcd *hcd) | 703 | int xhci_get_frame(struct usb_hcd *hcd) |
| 503 | { | 704 | { |
| 504 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 705 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 005d44641d81..d34b91a135a1 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
| @@ -188,12 +188,187 @@ fail: | |||
| 188 | return 0; | 188 | return 0; |
| 189 | } | 189 | } |
| 190 | 190 | ||
| 191 | void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id) | ||
| 192 | { | ||
| 193 | struct xhci_virt_device *dev; | ||
| 194 | int i; | ||
| 195 | |||
| 196 | /* Slot ID 0 is reserved */ | ||
| 197 | if (slot_id == 0 || !xhci->devs[slot_id]) | ||
| 198 | return; | ||
| 199 | |||
| 200 | dev = xhci->devs[slot_id]; | ||
| 201 | xhci->dcbaa->dev_context_ptrs[2*slot_id] = 0; | ||
| 202 | xhci->dcbaa->dev_context_ptrs[2*slot_id + 1] = 0; | ||
| 203 | if (!dev) | ||
| 204 | return; | ||
| 205 | |||
| 206 | for (i = 0; i < 31; ++i) | ||
| 207 | if (dev->ep_rings[i]) | ||
| 208 | xhci_ring_free(xhci, dev->ep_rings[i]); | ||
| 209 | |||
| 210 | if (dev->in_ctx) | ||
| 211 | dma_pool_free(xhci->device_pool, | ||
| 212 | dev->in_ctx, dev->in_ctx_dma); | ||
| 213 | if (dev->out_ctx) | ||
| 214 | dma_pool_free(xhci->device_pool, | ||
| 215 | dev->out_ctx, dev->out_ctx_dma); | ||
| 216 | kfree(xhci->devs[slot_id]); | ||
| 217 | xhci->devs[slot_id] = 0; | ||
| 218 | } | ||
| 219 | |||
| 220 | int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, | ||
| 221 | struct usb_device *udev, gfp_t flags) | ||
| 222 | { | ||
| 223 | dma_addr_t dma; | ||
| 224 | struct xhci_virt_device *dev; | ||
| 225 | |||
| 226 | /* Slot ID 0 is reserved */ | ||
| 227 | if (slot_id == 0 || xhci->devs[slot_id]) { | ||
| 228 | xhci_warn(xhci, "Bad Slot ID %d\n", slot_id); | ||
| 229 | return 0; | ||
| 230 | } | ||
| 231 | |||
| 232 | xhci->devs[slot_id] = kzalloc(sizeof(*xhci->devs[slot_id]), flags); | ||
| 233 | if (!xhci->devs[slot_id]) | ||
| 234 | return 0; | ||
| 235 | dev = xhci->devs[slot_id]; | ||
| 236 | |||
| 237 | /* Allocate the (output) device context that will be used in the HC */ | ||
| 238 | dev->out_ctx = dma_pool_alloc(xhci->device_pool, flags, &dma); | ||
| 239 | if (!dev->out_ctx) | ||
| 240 | goto fail; | ||
| 241 | dev->out_ctx_dma = dma; | ||
| 242 | xhci_dbg(xhci, "Slot %d output ctx = 0x%x (dma)\n", slot_id, dma); | ||
| 243 | memset(dev->out_ctx, 0, sizeof(*dev->out_ctx)); | ||
| 244 | |||
| 245 | /* Allocate the (input) device context for address device command */ | ||
| 246 | dev->in_ctx = dma_pool_alloc(xhci->device_pool, flags, &dma); | ||
| 247 | if (!dev->in_ctx) | ||
| 248 | goto fail; | ||
| 249 | dev->in_ctx_dma = dma; | ||
| 250 | xhci_dbg(xhci, "Slot %d input ctx = 0x%x (dma)\n", slot_id, dma); | ||
| 251 | memset(dev->in_ctx, 0, sizeof(*dev->in_ctx)); | ||
| 252 | |||
| 253 | /* Allocate endpoint 0 ring */ | ||
| 254 | dev->ep_rings[0] = xhci_ring_alloc(xhci, 1, true, flags); | ||
| 255 | if (!dev->ep_rings[0]) | ||
| 256 | goto fail; | ||
| 257 | |||
| 258 | /* | ||
| 259 | * Point to output device context in dcbaa; skip the output control | ||
| 260 | * context, which is eight 32 bit fields (or 32 bytes long) | ||
| 261 | */ | ||
| 262 | xhci->dcbaa->dev_context_ptrs[2*slot_id] = | ||
| 263 | (u32) dev->out_ctx_dma + (32); | ||
| 264 | xhci_dbg(xhci, "Set slot id %d dcbaa entry 0x%x to 0x%x\n", | ||
| 265 | slot_id, | ||
| 266 | (unsigned int) &xhci->dcbaa->dev_context_ptrs[2*slot_id], | ||
| 267 | dev->out_ctx_dma); | ||
| 268 | xhci->dcbaa->dev_context_ptrs[2*slot_id + 1] = 0; | ||
| 269 | |||
| 270 | return 1; | ||
| 271 | fail: | ||
| 272 | xhci_free_virt_device(xhci, slot_id); | ||
| 273 | return 0; | ||
| 274 | } | ||
| 275 | |||
| 276 | /* Setup an xHCI virtual device for a Set Address command */ | ||
| 277 | int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *udev) | ||
| 278 | { | ||
| 279 | struct xhci_virt_device *dev; | ||
| 280 | struct xhci_ep_ctx *ep0_ctx; | ||
| 281 | struct usb_device *top_dev; | ||
| 282 | |||
| 283 | dev = xhci->devs[udev->slot_id]; | ||
| 284 | /* Slot ID 0 is reserved */ | ||
| 285 | if (udev->slot_id == 0 || !dev) { | ||
| 286 | xhci_warn(xhci, "Slot ID %d is not assigned to this device\n", | ||
| 287 | udev->slot_id); | ||
| 288 | return -EINVAL; | ||
| 289 | } | ||
| 290 | ep0_ctx = &dev->in_ctx->ep[0]; | ||
| 291 | |||
| 292 | /* 2) New slot context and endpoint 0 context are valid*/ | ||
| 293 | dev->in_ctx->add_flags = SLOT_FLAG | EP0_FLAG; | ||
| 294 | |||
| 295 | /* 3) Only the control endpoint is valid - one endpoint context */ | ||
| 296 | dev->in_ctx->slot.dev_info |= LAST_CTX(1); | ||
| 297 | |||
| 298 | switch (udev->speed) { | ||
| 299 | case USB_SPEED_SUPER: | ||
| 300 | dev->in_ctx->slot.dev_info |= (u32) udev->route; | ||
| 301 | dev->in_ctx->slot.dev_info |= (u32) SLOT_SPEED_SS; | ||
| 302 | break; | ||
| 303 | case USB_SPEED_HIGH: | ||
| 304 | dev->in_ctx->slot.dev_info |= (u32) SLOT_SPEED_HS; | ||
| 305 | break; | ||
| 306 | case USB_SPEED_FULL: | ||
| 307 | dev->in_ctx->slot.dev_info |= (u32) SLOT_SPEED_FS; | ||
| 308 | break; | ||
| 309 | case USB_SPEED_LOW: | ||
| 310 | dev->in_ctx->slot.dev_info |= (u32) SLOT_SPEED_LS; | ||
| 311 | break; | ||
| 312 | case USB_SPEED_VARIABLE: | ||
| 313 | xhci_dbg(xhci, "FIXME xHCI doesn't support wireless speeds\n"); | ||
| 314 | return -EINVAL; | ||
| 315 | break; | ||
| 316 | default: | ||
| 317 | /* Speed was set earlier, this shouldn't happen. */ | ||
| 318 | BUG(); | ||
| 319 | } | ||
| 320 | /* Find the root hub port this device is under */ | ||
| 321 | for (top_dev = udev; top_dev->parent && top_dev->parent->parent; | ||
| 322 | top_dev = top_dev->parent) | ||
| 323 | /* Found device below root hub */; | ||
| 324 | dev->in_ctx->slot.dev_info2 |= (u32) ROOT_HUB_PORT(top_dev->portnum); | ||
| 325 | xhci_dbg(xhci, "Set root hub portnum to %d\n", top_dev->portnum); | ||
| 326 | |||
| 327 | /* Is this a LS/FS device under a HS hub? */ | ||
| 328 | /* | ||
| 329 | * FIXME: I don't think this is right, where does the TT info for the | ||
| 330 | * roothub or parent hub come from? | ||
| 331 | */ | ||
| 332 | if ((udev->speed == USB_SPEED_LOW || udev->speed == USB_SPEED_FULL) && | ||
| 333 | udev->tt) { | ||
| 334 | dev->in_ctx->slot.tt_info = udev->tt->hub->slot_id; | ||
| 335 | dev->in_ctx->slot.tt_info |= udev->ttport << 8; | ||
| 336 | } | ||
| 337 | xhci_dbg(xhci, "udev->tt = 0x%x\n", (unsigned int) udev->tt); | ||
| 338 | xhci_dbg(xhci, "udev->ttport = 0x%x\n", udev->ttport); | ||
| 339 | |||
| 340 | /* Step 4 - ring already allocated */ | ||
| 341 | /* Step 5 */ | ||
| 342 | ep0_ctx->ep_info2 = EP_TYPE(CTRL_EP); | ||
| 343 | /* | ||
| 344 | * See section 4.3 bullet 6: | ||
| 345 | * The default Max Packet size for ep0 is "8 bytes for a USB2 | ||
| 346 | * LS/FS/HS device or 512 bytes for a USB3 SS device" | ||
| 347 | * XXX: Not sure about wireless USB devices. | ||
| 348 | */ | ||
| 349 | if (udev->speed == USB_SPEED_SUPER) | ||
| 350 | ep0_ctx->ep_info2 |= MAX_PACKET(512); | ||
| 351 | else | ||
| 352 | ep0_ctx->ep_info2 |= MAX_PACKET(8); | ||
| 353 | /* EP 0 can handle "burst" sizes of 1, so Max Burst Size field is 0 */ | ||
| 354 | ep0_ctx->ep_info2 |= MAX_BURST(0); | ||
| 355 | ep0_ctx->ep_info2 |= ERROR_COUNT(3); | ||
| 356 | |||
| 357 | ep0_ctx->deq[0] = | ||
| 358 | dev->ep_rings[0]->first_seg->dma; | ||
| 359 | ep0_ctx->deq[0] |= dev->ep_rings[0]->cycle_state; | ||
| 360 | ep0_ctx->deq[1] = 0; | ||
| 361 | |||
| 362 | /* Steps 7 and 8 were done in xhci_alloc_virt_device() */ | ||
| 363 | |||
| 364 | return 0; | ||
| 365 | } | ||
| 366 | |||
| 191 | void xhci_mem_cleanup(struct xhci_hcd *xhci) | 367 | void xhci_mem_cleanup(struct xhci_hcd *xhci) |
| 192 | { | 368 | { |
| 193 | struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); | 369 | struct pci_dev *pdev = to_pci_dev(xhci_to_hcd(xhci)->self.controller); |
| 194 | int size; | 370 | int size; |
| 195 | 371 | int i; | |
| 196 | /* XXX: Free all the segments in the various rings */ | ||
| 197 | 372 | ||
| 198 | /* Free the Event Ring Segment Table and the actual Event Ring */ | 373 | /* Free the Event Ring Segment Table and the actual Event Ring */ |
| 199 | xhci_writel(xhci, 0, &xhci->ir_set->erst_size); | 374 | xhci_writel(xhci, 0, &xhci->ir_set->erst_size); |
| @@ -218,16 +393,27 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | |||
| 218 | xhci_ring_free(xhci, xhci->cmd_ring); | 393 | xhci_ring_free(xhci, xhci->cmd_ring); |
| 219 | xhci->cmd_ring = NULL; | 394 | xhci->cmd_ring = NULL; |
| 220 | xhci_dbg(xhci, "Freed command ring\n"); | 395 | xhci_dbg(xhci, "Freed command ring\n"); |
| 396 | |||
| 397 | for (i = 1; i < MAX_HC_SLOTS; ++i) | ||
| 398 | xhci_free_virt_device(xhci, i); | ||
| 399 | |||
| 221 | if (xhci->segment_pool) | 400 | if (xhci->segment_pool) |
| 222 | dma_pool_destroy(xhci->segment_pool); | 401 | dma_pool_destroy(xhci->segment_pool); |
| 223 | xhci->segment_pool = NULL; | 402 | xhci->segment_pool = NULL; |
| 224 | xhci_dbg(xhci, "Freed segment pool\n"); | 403 | xhci_dbg(xhci, "Freed segment pool\n"); |
| 404 | |||
| 405 | if (xhci->device_pool) | ||
| 406 | dma_pool_destroy(xhci->device_pool); | ||
| 407 | xhci->device_pool = NULL; | ||
| 408 | xhci_dbg(xhci, "Freed device context pool\n"); | ||
| 409 | |||
| 225 | xhci_writel(xhci, 0, &xhci->op_regs->dcbaa_ptr[1]); | 410 | xhci_writel(xhci, 0, &xhci->op_regs->dcbaa_ptr[1]); |
| 226 | xhci_writel(xhci, 0, &xhci->op_regs->dcbaa_ptr[0]); | 411 | xhci_writel(xhci, 0, &xhci->op_regs->dcbaa_ptr[0]); |
| 227 | if (xhci->dcbaa) | 412 | if (xhci->dcbaa) |
| 228 | pci_free_consistent(pdev, sizeof(*xhci->dcbaa), | 413 | pci_free_consistent(pdev, sizeof(*xhci->dcbaa), |
| 229 | xhci->dcbaa, xhci->dcbaa->dma); | 414 | xhci->dcbaa, xhci->dcbaa->dma); |
| 230 | xhci->dcbaa = NULL; | 415 | xhci->dcbaa = NULL; |
| 416 | |||
| 231 | xhci->page_size = 0; | 417 | xhci->page_size = 0; |
| 232 | xhci->page_shift = 0; | 418 | xhci->page_shift = 0; |
| 233 | } | 419 | } |
| @@ -280,8 +466,8 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
| 280 | goto fail; | 466 | goto fail; |
| 281 | memset(xhci->dcbaa, 0, sizeof *(xhci->dcbaa)); | 467 | memset(xhci->dcbaa, 0, sizeof *(xhci->dcbaa)); |
| 282 | xhci->dcbaa->dma = dma; | 468 | xhci->dcbaa->dma = dma; |
| 283 | xhci_dbg(xhci, "// Setting device context base array address to 0x%x\n", | 469 | xhci_dbg(xhci, "// Device context base array address = 0x%x (DMA), 0x%x (virt)\n", |
| 284 | xhci->dcbaa->dma); | 470 | xhci->dcbaa->dma, (unsigned int) xhci->dcbaa); |
| 285 | xhci_writel(xhci, (u32) 0, &xhci->op_regs->dcbaa_ptr[1]); | 471 | xhci_writel(xhci, (u32) 0, &xhci->op_regs->dcbaa_ptr[1]); |
| 286 | xhci_writel(xhci, dma, &xhci->op_regs->dcbaa_ptr[0]); | 472 | xhci_writel(xhci, dma, &xhci->op_regs->dcbaa_ptr[0]); |
| 287 | 473 | ||
| @@ -293,7 +479,12 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
| 293 | */ | 479 | */ |
| 294 | xhci->segment_pool = dma_pool_create("xHCI ring segments", dev, | 480 | xhci->segment_pool = dma_pool_create("xHCI ring segments", dev, |
| 295 | SEGMENT_SIZE, 64, xhci->page_size); | 481 | SEGMENT_SIZE, 64, xhci->page_size); |
| 296 | if (!xhci->segment_pool) | 482 | /* See Table 46 and Note on Figure 55 */ |
| 483 | /* FIXME support 64-byte contexts */ | ||
| 484 | xhci->device_pool = dma_pool_create("xHCI input/output contexts", dev, | ||
| 485 | sizeof(struct xhci_device_control), | ||
| 486 | 64, xhci->page_size); | ||
| 487 | if (!xhci->segment_pool || !xhci->device_pool) | ||
| 297 | goto fail; | 488 | goto fail; |
| 298 | 489 | ||
| 299 | /* Set up the command ring to have one segments for now. */ | 490 | /* Set up the command ring to have one segments for now. */ |
| @@ -385,6 +576,9 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
| 385 | * something other than the default (~1ms minimum between interrupts). | 576 | * something other than the default (~1ms minimum between interrupts). |
| 386 | * See section 5.5.1.2. | 577 | * See section 5.5.1.2. |
| 387 | */ | 578 | */ |
| 579 | init_completion(&xhci->addr_dev); | ||
| 580 | for (i = 0; i < MAX_HC_SLOTS; ++i) | ||
| 581 | xhci->devs[i] = 0; | ||
| 388 | 582 | ||
| 389 | return 0; | 583 | return 0; |
| 390 | fail: | 584 | fail: |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 005c5b264a7c..7ac12b4ffe86 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -109,6 +109,13 @@ static const struct hc_driver xhci_pci_hc_driver = { | |||
| 109 | .shutdown = xhci_shutdown, | 109 | .shutdown = xhci_shutdown, |
| 110 | 110 | ||
| 111 | /* | 111 | /* |
| 112 | * managing i/o requests and associated device resources | ||
| 113 | */ | ||
| 114 | .alloc_dev = xhci_alloc_dev, | ||
| 115 | .free_dev = xhci_free_dev, | ||
| 116 | .address_device = xhci_address_device, | ||
| 117 | |||
| 118 | /* | ||
| 112 | * scheduling support | 119 | * scheduling support |
| 113 | */ | 120 | */ |
| 114 | .get_frame_number = xhci_get_frame, | 121 | .get_frame_number = xhci_get_frame, |
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 9d6bb3d730c4..901ce70b30b8 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -252,13 +252,10 @@ void ring_cmd_db(struct xhci_hcd *xhci) | |||
| 252 | static void handle_cmd_completion(struct xhci_hcd *xhci, | 252 | static void handle_cmd_completion(struct xhci_hcd *xhci, |
| 253 | struct xhci_event_cmd *event) | 253 | struct xhci_event_cmd *event) |
| 254 | { | 254 | { |
| 255 | int slot_id = TRB_TO_SLOT_ID(event->flags); | ||
| 255 | u64 cmd_dma; | 256 | u64 cmd_dma; |
| 256 | dma_addr_t cmd_dequeue_dma; | 257 | dma_addr_t cmd_dequeue_dma; |
| 257 | 258 | ||
| 258 | /* Check completion code */ | ||
| 259 | if (GET_COMP_CODE(event->status) != COMP_SUCCESS) | ||
| 260 | xhci_dbg(xhci, "WARN: unsuccessful no-op command\n"); | ||
| 261 | |||
| 262 | cmd_dma = (((u64) event->cmd_trb[1]) << 32) + event->cmd_trb[0]; | 259 | cmd_dma = (((u64) event->cmd_trb[1]) << 32) + event->cmd_trb[0]; |
| 263 | cmd_dequeue_dma = trb_virt_to_dma(xhci->cmd_ring->deq_seg, | 260 | cmd_dequeue_dma = trb_virt_to_dma(xhci->cmd_ring->deq_seg, |
| 264 | xhci->cmd_ring->dequeue); | 261 | xhci->cmd_ring->dequeue); |
| @@ -273,6 +270,21 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, | |||
| 273 | return; | 270 | return; |
| 274 | } | 271 | } |
| 275 | switch (xhci->cmd_ring->dequeue->generic.field[3] & TRB_TYPE_BITMASK) { | 272 | switch (xhci->cmd_ring->dequeue->generic.field[3] & TRB_TYPE_BITMASK) { |
| 273 | case TRB_TYPE(TRB_ENABLE_SLOT): | ||
| 274 | if (GET_COMP_CODE(event->status) == COMP_SUCCESS) | ||
| 275 | xhci->slot_id = slot_id; | ||
| 276 | else | ||
| 277 | xhci->slot_id = 0; | ||
| 278 | complete(&xhci->addr_dev); | ||
| 279 | break; | ||
| 280 | case TRB_TYPE(TRB_DISABLE_SLOT): | ||
| 281 | if (xhci->devs[slot_id]) | ||
| 282 | xhci_free_virt_device(xhci, slot_id); | ||
| 283 | break; | ||
| 284 | case TRB_TYPE(TRB_ADDR_DEV): | ||
| 285 | xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(event->status); | ||
| 286 | complete(&xhci->addr_dev); | ||
| 287 | break; | ||
| 276 | case TRB_TYPE(TRB_CMD_NOOP): | 288 | case TRB_TYPE(TRB_CMD_NOOP): |
| 277 | ++xhci->noops_handled; | 289 | ++xhci->noops_handled; |
| 278 | break; | 290 | break; |
| @@ -400,3 +412,17 @@ void *setup_one_noop(struct xhci_hcd *xhci) | |||
| 400 | xhci->noops_submitted++; | 412 | xhci->noops_submitted++; |
| 401 | return ring_cmd_db; | 413 | return ring_cmd_db; |
| 402 | } | 414 | } |
| 415 | |||
| 416 | /* Queue a slot enable or disable request on the command ring */ | ||
| 417 | int queue_slot_control(struct xhci_hcd *xhci, u32 trb_type, u32 slot_id) | ||
| 418 | { | ||
| 419 | return queue_command(xhci, 0, 0, 0, | ||
| 420 | TRB_TYPE(trb_type) | SLOT_ID_FOR_TRB(slot_id)); | ||
| 421 | } | ||
| 422 | |||
| 423 | /* Queue an address device command TRB */ | ||
| 424 | int queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, u32 slot_id) | ||
| 425 | { | ||
| 426 | return queue_command(xhci, in_ctx_ptr, 0, 0, | ||
| 427 | TRB_TYPE(TRB_ADDR_DEV) | SLOT_ID_FOR_TRB(slot_id)); | ||
| 428 | } | ||
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 059c659d3f39..4ef6b9e88504 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -285,12 +285,21 @@ struct xhci_op_regs { | |||
| 285 | * 4 - super speed | 285 | * 4 - super speed |
| 286 | * 5-15 reserved | 286 | * 5-15 reserved |
| 287 | */ | 287 | */ |
| 288 | #define DEV_SPEED_MASK (0xf<<10) | 288 | #define DEV_SPEED_MASK (0xf << 10) |
| 289 | #define XDEV_FS (0x1 << 10) | ||
| 290 | #define XDEV_LS (0x2 << 10) | ||
| 291 | #define XDEV_HS (0x3 << 10) | ||
| 292 | #define XDEV_SS (0x4 << 10) | ||
| 289 | #define DEV_UNDEFSPEED(p) (((p) & DEV_SPEED_MASK) == (0x0<<10)) | 293 | #define DEV_UNDEFSPEED(p) (((p) & DEV_SPEED_MASK) == (0x0<<10)) |
| 290 | #define DEV_FULLSPEED(p) (((p) & DEV_SPEED_MASK) == (0x1<<10)) | 294 | #define DEV_FULLSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_FS) |
| 291 | #define DEV_LOWSPEED(p) (((p) & DEV_SPEED_MASK) == (0x2<<10)) | 295 | #define DEV_LOWSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_LS) |
| 292 | #define DEV_HIGHSPEED(p) (((p) & DEV_SPEED_MASK) == (0x3<<10)) | 296 | #define DEV_HIGHSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_HS) |
| 293 | #define DEV_SUPERSPEED(p) (((p) & DEV_SPEED_MASK) == (0x4<<10)) | 297 | #define DEV_SUPERSPEED(p) (((p) & DEV_SPEED_MASK) == XDEV_SS) |
| 298 | /* Bits 20:23 in the Slot Context are the speed for the device */ | ||
| 299 | #define SLOT_SPEED_FS (XDEV_FS << 10) | ||
| 300 | #define SLOT_SPEED_LS (XDEV_LS << 10) | ||
| 301 | #define SLOT_SPEED_HS (XDEV_HS << 10) | ||
| 302 | #define SLOT_SPEED_SS (XDEV_SS << 10) | ||
| 294 | /* Port Indicator Control */ | 303 | /* Port Indicator Control */ |
| 295 | #define PORT_LED_OFF (0 << 14) | 304 | #define PORT_LED_OFF (0 << 14) |
| 296 | #define PORT_LED_AMBER (1 << 14) | 305 | #define PORT_LED_AMBER (1 << 14) |
| @@ -471,14 +480,19 @@ struct xhci_slot_ctx { | |||
| 471 | /* Set if the device is a hub - bit 26 */ | 480 | /* Set if the device is a hub - bit 26 */ |
| 472 | #define DEV_HUB (0x1 << 26) | 481 | #define DEV_HUB (0x1 << 26) |
| 473 | /* Index of the last valid endpoint context in this device context - 27:31 */ | 482 | /* Index of the last valid endpoint context in this device context - 27:31 */ |
| 474 | #define LAST_EP_MASK (0x1f << 27) | 483 | #define LAST_CTX_MASK (0x1f << 27) |
| 475 | #define LAST_EP(p) ((p) << 27) | 484 | #define LAST_CTX(p) ((p) << 27) |
| 485 | #define LAST_CTX_TO_EP_NUM(p) (((p) >> 27) - 1) | ||
| 486 | /* Plus one for the slot context flag */ | ||
| 487 | #define EPI_TO_FLAG(p) (1 << ((p) + 1)) | ||
| 488 | #define SLOT_FLAG (1 << 0) | ||
| 489 | #define EP0_FLAG (1 << 1) | ||
| 476 | 490 | ||
| 477 | /* dev_info2 bitmasks */ | 491 | /* dev_info2 bitmasks */ |
| 478 | /* Max Exit Latency (ms) - worst case time to wake up all links in dev path */ | 492 | /* Max Exit Latency (ms) - worst case time to wake up all links in dev path */ |
| 479 | #define MAX_EXIT (0xffff) | 493 | #define MAX_EXIT (0xffff) |
| 480 | /* Root hub port number that is needed to access the USB device */ | 494 | /* Root hub port number that is needed to access the USB device */ |
| 481 | #define ROOT_HUB_PORT (0xff << 16) | 495 | #define ROOT_HUB_PORT(p) (((p) & 0xff) << 16) |
| 482 | 496 | ||
| 483 | /* tt_info bitmasks */ | 497 | /* tt_info bitmasks */ |
| 484 | /* | 498 | /* |
| @@ -495,7 +509,7 @@ struct xhci_slot_ctx { | |||
| 495 | 509 | ||
| 496 | /* dev_state bitmasks */ | 510 | /* dev_state bitmasks */ |
| 497 | /* USB device address - assigned by the HC */ | 511 | /* USB device address - assigned by the HC */ |
| 498 | #define DEV_ADDR (0xff) | 512 | #define DEV_ADDR_MASK (0xff) |
| 499 | /* bits 8:26 reserved */ | 513 | /* bits 8:26 reserved */ |
| 500 | /* Slot state */ | 514 | /* Slot state */ |
| 501 | #define SLOT_STATE (0x1f << 27) | 515 | #define SLOT_STATE (0x1f << 27) |
| @@ -507,12 +521,13 @@ struct xhci_slot_ctx { | |||
| 507 | * @ep_info2: information on endpoint type, max packet size, max burst size, | 521 | * @ep_info2: information on endpoint type, max packet size, max burst size, |
| 508 | * error count, and whether the HC will force an event for all | 522 | * error count, and whether the HC will force an event for all |
| 509 | * transactions. | 523 | * transactions. |
| 510 | * @ep_ring: 64-bit ring address. If the endpoint only defines one flow, | 524 | * @deq: 64-bit ring dequeue pointer address. If the endpoint only |
| 511 | * this points to the endpoint transfer ring. Otherwise, it points | 525 | * defines one stream, this points to the endpoint transfer ring. |
| 512 | * to a flow context array, which has a ring pointer for each flow. | 526 | * Otherwise, it points to a stream context array, which has a |
| 513 | * @intr_target: | 527 | * ring pointer for each flow. |
| 514 | * 64-bit address of the Interrupter Target that will receive | 528 | * @tx_info: |
| 515 | * events from this endpoint. | 529 | * Average TRB lengths for the endpoint ring and |
| 530 | * max payload within an Endpoint Service Interval Time (ESIT). | ||
| 516 | * | 531 | * |
| 517 | * Endpoint Context - section 6.2.1.2. This assumes the HC uses 32-byte context | 532 | * Endpoint Context - section 6.2.1.2. This assumes the HC uses 32-byte context |
| 518 | * structures. If the HC uses 64-byte contexts, there is an additional 32 bytes | 533 | * structures. If the HC uses 64-byte contexts, there is an additional 32 bytes |
| @@ -521,12 +536,10 @@ struct xhci_slot_ctx { | |||
| 521 | struct xhci_ep_ctx { | 536 | struct xhci_ep_ctx { |
| 522 | u32 ep_info; | 537 | u32 ep_info; |
| 523 | u32 ep_info2; | 538 | u32 ep_info2; |
| 524 | /* 64-bit endpoint ring address */ | 539 | u32 deq[2]; |
| 525 | u32 ep_ring[2]; | 540 | u32 tx_info; |
| 526 | /* 64-bit address of the interrupter target */ | ||
| 527 | u32 intr_target[2]; | ||
| 528 | /* offset 0x14 - 0x1f reserved for HC internal use */ | 541 | /* offset 0x14 - 0x1f reserved for HC internal use */ |
| 529 | u32 reserved[2]; | 542 | u32 reserved[3]; |
| 530 | } __attribute__ ((packed)); | 543 | } __attribute__ ((packed)); |
| 531 | 544 | ||
| 532 | /* ep_info bitmasks */ | 545 | /* ep_info bitmasks */ |
| @@ -589,6 +602,28 @@ struct xhci_device_control { | |||
| 589 | #define ADD_EP(x) (0x1 << x) | 602 | #define ADD_EP(x) (0x1 << x) |
| 590 | 603 | ||
| 591 | 604 | ||
| 605 | struct xhci_virt_device { | ||
| 606 | /* | ||
| 607 | * Commands to the hardware are passed an "input context" that | ||
| 608 | * tells the hardware what to change in its data structures. | ||
| 609 | * The hardware will return changes in an "output context" that | ||
| 610 | * software must allocate for the hardware. We need to keep | ||
| 611 | * track of input and output contexts separately because | ||
| 612 | * these commands might fail and we don't trust the hardware. | ||
| 613 | */ | ||
| 614 | struct xhci_device_control *out_ctx; | ||
| 615 | dma_addr_t out_ctx_dma; | ||
| 616 | /* Used for addressing devices and configuration changes */ | ||
| 617 | struct xhci_device_control *in_ctx; | ||
| 618 | dma_addr_t in_ctx_dma; | ||
| 619 | /* FIXME when stream support is added */ | ||
| 620 | struct xhci_ring *ep_rings[31]; | ||
| 621 | dma_addr_t ep_dma[31]; | ||
| 622 | /* Status of the last command issued for this device */ | ||
| 623 | u32 cmd_status; | ||
| 624 | }; | ||
| 625 | |||
| 626 | |||
| 592 | /** | 627 | /** |
| 593 | * struct xhci_device_context_array | 628 | * struct xhci_device_context_array |
| 594 | * @dev_context_ptr array of 64-bit DMA addresses for device contexts | 629 | * @dev_context_ptr array of 64-bit DMA addresses for device contexts |
| @@ -711,6 +746,11 @@ struct xhci_event_cmd { | |||
| 711 | u32 flags; | 746 | u32 flags; |
| 712 | } __attribute__ ((packed)); | 747 | } __attribute__ ((packed)); |
| 713 | 748 | ||
| 749 | /* flags bitmasks */ | ||
| 750 | /* bits 16:23 are the virtual function ID */ | ||
| 751 | /* bits 24:31 are the slot ID */ | ||
| 752 | #define TRB_TO_SLOT_ID(p) (((p) & (0xff<<24)) >> 24) | ||
| 753 | #define SLOT_ID_FOR_TRB(p) (((p) & 0xff) << 24) | ||
| 714 | 754 | ||
| 715 | /* Port Status Change Event TRB fields */ | 755 | /* Port Status Change Event TRB fields */ |
| 716 | /* Port ID - bits 31:24 */ | 756 | /* Port ID - bits 31:24 */ |
| @@ -931,6 +971,11 @@ struct xhci_hcd { | |||
| 931 | struct xhci_ring *cmd_ring; | 971 | struct xhci_ring *cmd_ring; |
| 932 | struct xhci_ring *event_ring; | 972 | struct xhci_ring *event_ring; |
| 933 | struct xhci_erst erst; | 973 | struct xhci_erst erst; |
| 974 | /* slot enabling and address device helpers */ | ||
| 975 | struct completion addr_dev; | ||
| 976 | int slot_id; | ||
| 977 | /* Internal mirror of the HW's dcbaa */ | ||
| 978 | struct xhci_virt_device *devs[MAX_HC_SLOTS]; | ||
| 934 | 979 | ||
| 935 | /* DMA pools */ | 980 | /* DMA pools */ |
| 936 | struct dma_pool *device_pool; | 981 | struct dma_pool *device_pool; |
| @@ -1002,10 +1047,14 @@ void xhci_debug_ring(struct xhci_hcd *xhci, struct xhci_ring *ring); | |||
| 1002 | void xhci_dbg_erst(struct xhci_hcd *xhci, struct xhci_erst *erst); | 1047 | void xhci_dbg_erst(struct xhci_hcd *xhci, struct xhci_erst *erst); |
| 1003 | void xhci_dbg_cmd_ptrs(struct xhci_hcd *xhci); | 1048 | void xhci_dbg_cmd_ptrs(struct xhci_hcd *xhci); |
| 1004 | void xhci_dbg_ring_ptrs(struct xhci_hcd *xhci, struct xhci_ring *ring); | 1049 | void xhci_dbg_ring_ptrs(struct xhci_hcd *xhci, struct xhci_ring *ring); |
| 1050 | void xhci_dbg_ctx(struct xhci_hcd *xhci, struct xhci_device_control *ctx, dma_addr_t dma, unsigned int last_ep); | ||
| 1005 | 1051 | ||
| 1006 | /* xHCI memory managment */ | 1052 | /* xHCI memory managment */ |
| 1007 | void xhci_mem_cleanup(struct xhci_hcd *xhci); | 1053 | void xhci_mem_cleanup(struct xhci_hcd *xhci); |
| 1008 | int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags); | 1054 | int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags); |
| 1055 | void xhci_free_virt_device(struct xhci_hcd *xhci, int slot_id); | ||
| 1056 | int xhci_alloc_virt_device(struct xhci_hcd *xhci, int slot_id, struct usb_device *udev, gfp_t flags); | ||
| 1057 | int xhci_setup_addressable_virt_dev(struct xhci_hcd *xhci, struct usb_device *udev); | ||
| 1009 | 1058 | ||
| 1010 | #ifdef CONFIG_PCI | 1059 | #ifdef CONFIG_PCI |
| 1011 | /* xHCI PCI glue */ | 1060 | /* xHCI PCI glue */ |
| @@ -1022,6 +1071,9 @@ void xhci_stop(struct usb_hcd *hcd); | |||
| 1022 | void xhci_shutdown(struct usb_hcd *hcd); | 1071 | void xhci_shutdown(struct usb_hcd *hcd); |
| 1023 | int xhci_get_frame(struct usb_hcd *hcd); | 1072 | int xhci_get_frame(struct usb_hcd *hcd); |
| 1024 | irqreturn_t xhci_irq(struct usb_hcd *hcd); | 1073 | irqreturn_t xhci_irq(struct usb_hcd *hcd); |
| 1074 | int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev); | ||
| 1075 | void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev); | ||
| 1076 | int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev); | ||
| 1025 | 1077 | ||
| 1026 | /* xHCI ring, segment, TRB, and TD functions */ | 1078 | /* xHCI ring, segment, TRB, and TD functions */ |
| 1027 | dma_addr_t trb_virt_to_dma(struct xhci_segment *seg, union xhci_trb *trb); | 1079 | dma_addr_t trb_virt_to_dma(struct xhci_segment *seg, union xhci_trb *trb); |
| @@ -1029,6 +1081,8 @@ void ring_cmd_db(struct xhci_hcd *xhci); | |||
| 1029 | void *setup_one_noop(struct xhci_hcd *xhci); | 1081 | void *setup_one_noop(struct xhci_hcd *xhci); |
| 1030 | void handle_event(struct xhci_hcd *xhci); | 1082 | void handle_event(struct xhci_hcd *xhci); |
| 1031 | void set_hc_event_deq(struct xhci_hcd *xhci); | 1083 | void set_hc_event_deq(struct xhci_hcd *xhci); |
| 1084 | int queue_slot_control(struct xhci_hcd *xhci, u32 trb_type, u32 slot_id); | ||
| 1085 | int queue_address_device(struct xhci_hcd *xhci, dma_addr_t in_ctx_ptr, u32 slot_id); | ||
| 1032 | 1086 | ||
| 1033 | /* xHCI roothub code */ | 1087 | /* xHCI roothub code */ |
| 1034 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, | 1088 | int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, u16 wIndex, |
