diff options
Diffstat (limited to 'drivers/usb/host')
-rw-r--r-- | drivers/usb/host/xhci-hcd.c | 82 | ||||
-rw-r--r-- | drivers/usb/host/xhci-pci.c | 2 | ||||
-rw-r--r-- | drivers/usb/host/xhci-ring.c | 3 | ||||
-rw-r--r-- | drivers/usb/host/xhci.h | 5 |
4 files changed, 92 insertions, 0 deletions
diff --git a/drivers/usb/host/xhci-hcd.c b/drivers/usb/host/xhci-hcd.c index 2fcc360f0648..99911e727e0b 100644 --- a/drivers/usb/host/xhci-hcd.c +++ b/drivers/usb/host/xhci-hcd.c | |||
@@ -1594,6 +1594,88 @@ int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev) | |||
1594 | return 0; | 1594 | return 0; |
1595 | } | 1595 | } |
1596 | 1596 | ||
1597 | /* Once a hub descriptor is fetched for a device, we need to update the xHC's | ||
1598 | * internal data structures for the device. | ||
1599 | */ | ||
1600 | int xhci_update_hub_device(struct usb_hcd *hcd, struct usb_device *hdev, | ||
1601 | struct usb_tt *tt, gfp_t mem_flags) | ||
1602 | { | ||
1603 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | ||
1604 | struct xhci_virt_device *vdev; | ||
1605 | struct xhci_command *config_cmd; | ||
1606 | struct xhci_input_control_ctx *ctrl_ctx; | ||
1607 | struct xhci_slot_ctx *slot_ctx; | ||
1608 | unsigned long flags; | ||
1609 | unsigned think_time; | ||
1610 | int ret; | ||
1611 | |||
1612 | /* Ignore root hubs */ | ||
1613 | if (!hdev->parent) | ||
1614 | return 0; | ||
1615 | |||
1616 | vdev = xhci->devs[hdev->slot_id]; | ||
1617 | if (!vdev) { | ||
1618 | xhci_warn(xhci, "Cannot update hub desc for unknown device.\n"); | ||
1619 | return -EINVAL; | ||
1620 | } | ||
1621 | config_cmd = xhci_alloc_command(xhci, true, mem_flags); | ||
1622 | if (!config_cmd) { | ||
1623 | xhci_dbg(xhci, "Could not allocate xHCI command structure.\n"); | ||
1624 | return -ENOMEM; | ||
1625 | } | ||
1626 | |||
1627 | spin_lock_irqsave(&xhci->lock, flags); | ||
1628 | xhci_slot_copy(xhci, config_cmd->in_ctx, vdev->out_ctx); | ||
1629 | ctrl_ctx = xhci_get_input_control_ctx(xhci, config_cmd->in_ctx); | ||
1630 | ctrl_ctx->add_flags |= SLOT_FLAG; | ||
1631 | slot_ctx = xhci_get_slot_ctx(xhci, config_cmd->in_ctx); | ||
1632 | slot_ctx->dev_info |= DEV_HUB; | ||
1633 | if (tt->multi) | ||
1634 | slot_ctx->dev_info |= DEV_MTT; | ||
1635 | if (xhci->hci_version > 0x95) { | ||
1636 | xhci_dbg(xhci, "xHCI version %x needs hub " | ||
1637 | "TT think time and number of ports\n", | ||
1638 | (unsigned int) xhci->hci_version); | ||
1639 | slot_ctx->dev_info2 |= XHCI_MAX_PORTS(hdev->maxchild); | ||
1640 | /* Set TT think time - convert from ns to FS bit times. | ||
1641 | * 0 = 8 FS bit times, 1 = 16 FS bit times, | ||
1642 | * 2 = 24 FS bit times, 3 = 32 FS bit times. | ||
1643 | */ | ||
1644 | think_time = tt->think_time; | ||
1645 | if (think_time != 0) | ||
1646 | think_time = (think_time / 666) - 1; | ||
1647 | slot_ctx->tt_info |= TT_THINK_TIME(think_time); | ||
1648 | } else { | ||
1649 | xhci_dbg(xhci, "xHCI version %x doesn't need hub " | ||
1650 | "TT think time or number of ports\n", | ||
1651 | (unsigned int) xhci->hci_version); | ||
1652 | } | ||
1653 | slot_ctx->dev_state = 0; | ||
1654 | spin_unlock_irqrestore(&xhci->lock, flags); | ||
1655 | |||
1656 | xhci_dbg(xhci, "Set up %s for hub device.\n", | ||
1657 | (xhci->hci_version > 0x95) ? | ||
1658 | "configure endpoint" : "evaluate context"); | ||
1659 | xhci_dbg(xhci, "Slot %u Input Context:\n", hdev->slot_id); | ||
1660 | xhci_dbg_ctx(xhci, config_cmd->in_ctx, 0); | ||
1661 | |||
1662 | /* Issue and wait for the configure endpoint or | ||
1663 | * evaluate context command. | ||
1664 | */ | ||
1665 | if (xhci->hci_version > 0x95) | ||
1666 | ret = xhci_configure_endpoint(xhci, hdev, config_cmd, | ||
1667 | false, false); | ||
1668 | else | ||
1669 | ret = xhci_configure_endpoint(xhci, hdev, config_cmd, | ||
1670 | true, false); | ||
1671 | |||
1672 | xhci_dbg(xhci, "Slot %u Output Context:\n", hdev->slot_id); | ||
1673 | xhci_dbg_ctx(xhci, vdev->out_ctx, 0); | ||
1674 | |||
1675 | xhci_free_command(xhci, config_cmd); | ||
1676 | return ret; | ||
1677 | } | ||
1678 | |||
1597 | int xhci_get_frame(struct usb_hcd *hcd) | 1679 | int xhci_get_frame(struct usb_hcd *hcd) |
1598 | { | 1680 | { |
1599 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); | 1681 | struct xhci_hcd *xhci = hcd_to_xhci(hcd); |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 8fb308d43bc1..b7712f22a9fb 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -63,6 +63,8 @@ static int xhci_pci_setup(struct usb_hcd *hcd) | |||
63 | xhci->hcs_params1 = xhci_readl(xhci, &xhci->cap_regs->hcs_params1); | 63 | xhci->hcs_params1 = xhci_readl(xhci, &xhci->cap_regs->hcs_params1); |
64 | xhci->hcs_params2 = xhci_readl(xhci, &xhci->cap_regs->hcs_params2); | 64 | xhci->hcs_params2 = xhci_readl(xhci, &xhci->cap_regs->hcs_params2); |
65 | xhci->hcs_params3 = xhci_readl(xhci, &xhci->cap_regs->hcs_params3); | 65 | xhci->hcs_params3 = xhci_readl(xhci, &xhci->cap_regs->hcs_params3); |
66 | xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hc_capbase); | ||
67 | xhci->hci_version = HC_VERSION(xhci->hcc_params); | ||
66 | xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hcc_params); | 68 | xhci->hcc_params = xhci_readl(xhci, &xhci->cap_regs->hcc_params); |
67 | xhci_print_registers(xhci); | 69 | xhci_print_registers(xhci); |
68 | 70 | ||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 2274604e863e..173c39c76489 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -789,6 +789,9 @@ static void handle_cmd_completion(struct xhci_hcd *xhci, | |||
789 | } | 789 | } |
790 | break; | 790 | break; |
791 | case TRB_TYPE(TRB_EVAL_CONTEXT): | 791 | case TRB_TYPE(TRB_EVAL_CONTEXT): |
792 | virt_dev = xhci->devs[slot_id]; | ||
793 | if (handle_cmd_in_cmd_wait_list(xhci, virt_dev, event)) | ||
794 | break; | ||
792 | xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(event->status); | 795 | xhci->devs[slot_id]->cmd_status = GET_COMP_CODE(event->status); |
793 | complete(&xhci->devs[slot_id]->cmd_completion); | 796 | complete(&xhci->devs[slot_id]->cmd_completion); |
794 | break; | 797 | break; |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 36f7d4f91d9f..4b254b6fa245 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
@@ -509,6 +509,8 @@ struct xhci_slot_ctx { | |||
509 | #define MAX_EXIT (0xffff) | 509 | #define MAX_EXIT (0xffff) |
510 | /* Root hub port number that is needed to access the USB device */ | 510 | /* Root hub port number that is needed to access the USB device */ |
511 | #define ROOT_HUB_PORT(p) (((p) & 0xff) << 16) | 511 | #define ROOT_HUB_PORT(p) (((p) & 0xff) << 16) |
512 | /* Maximum number of ports under a hub device */ | ||
513 | #define XHCI_MAX_PORTS(p) (((p) & 0xff) << 24) | ||
512 | 514 | ||
513 | /* tt_info bitmasks */ | 515 | /* tt_info bitmasks */ |
514 | /* | 516 | /* |
@@ -522,6 +524,7 @@ struct xhci_slot_ctx { | |||
522 | * '0' if the device is not low or full speed. | 524 | * '0' if the device is not low or full speed. |
523 | */ | 525 | */ |
524 | #define TT_PORT (0xff << 8) | 526 | #define TT_PORT (0xff << 8) |
527 | #define TT_THINK_TIME(p) (((p) & 0x3) << 16) | ||
525 | 528 | ||
526 | /* dev_state bitmasks */ | 529 | /* dev_state bitmasks */ |
527 | /* USB device address - assigned by the HC */ | 530 | /* USB device address - assigned by the HC */ |
@@ -1231,6 +1234,8 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd); | |||
1231 | int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev); | 1234 | int xhci_alloc_dev(struct usb_hcd *hcd, struct usb_device *udev); |
1232 | void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev); | 1235 | void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev); |
1233 | int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev); | 1236 | int xhci_address_device(struct usb_hcd *hcd, struct usb_device *udev); |
1237 | int xhci_update_hub_device(struct usb_hcd *hcd, struct usb_device *hdev, | ||
1238 | struct usb_tt *tt, gfp_t mem_flags); | ||
1234 | int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags); | 1239 | int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags); |
1235 | int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status); | 1240 | int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status); |
1236 | int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, struct usb_host_endpoint *ep); | 1241 | int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, struct usb_host_endpoint *ep); |