diff options
Diffstat (limited to 'drivers/usb/host/xhci-mem.c')
-rw-r--r-- | drivers/usb/host/xhci-mem.c | 27 |
1 files changed, 16 insertions, 11 deletions
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c index 965b539bc474..fbf75e57628b 100644 --- a/drivers/usb/host/xhci-mem.c +++ b/drivers/usb/host/xhci-mem.c | |||
@@ -1423,15 +1423,17 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
1423 | ep_ctx->ep_info2 |= cpu_to_le32(xhci_get_endpoint_type(udev, ep)); | 1423 | ep_ctx->ep_info2 |= cpu_to_le32(xhci_get_endpoint_type(udev, ep)); |
1424 | 1424 | ||
1425 | /* Set the max packet size and max burst */ | 1425 | /* Set the max packet size and max burst */ |
1426 | max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc)); | ||
1427 | max_burst = 0; | ||
1426 | switch (udev->speed) { | 1428 | switch (udev->speed) { |
1427 | case USB_SPEED_SUPER: | 1429 | case USB_SPEED_SUPER: |
1428 | max_packet = usb_endpoint_maxp(&ep->desc); | ||
1429 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet)); | ||
1430 | /* dig out max burst from ep companion desc */ | 1430 | /* dig out max burst from ep companion desc */ |
1431 | max_packet = ep->ss_ep_comp.bMaxBurst; | 1431 | max_burst = ep->ss_ep_comp.bMaxBurst; |
1432 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_packet)); | ||
1433 | break; | 1432 | break; |
1434 | case USB_SPEED_HIGH: | 1433 | case USB_SPEED_HIGH: |
1434 | /* Some devices get this wrong */ | ||
1435 | if (usb_endpoint_xfer_bulk(&ep->desc)) | ||
1436 | max_packet = 512; | ||
1435 | /* bits 11:12 specify the number of additional transaction | 1437 | /* bits 11:12 specify the number of additional transaction |
1436 | * opportunities per microframe (USB 2.0, section 9.6.6) | 1438 | * opportunities per microframe (USB 2.0, section 9.6.6) |
1437 | */ | 1439 | */ |
@@ -1439,17 +1441,16 @@ int xhci_endpoint_init(struct xhci_hcd *xhci, | |||
1439 | usb_endpoint_xfer_int(&ep->desc)) { | 1441 | usb_endpoint_xfer_int(&ep->desc)) { |
1440 | max_burst = (usb_endpoint_maxp(&ep->desc) | 1442 | max_burst = (usb_endpoint_maxp(&ep->desc) |
1441 | & 0x1800) >> 11; | 1443 | & 0x1800) >> 11; |
1442 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_BURST(max_burst)); | ||
1443 | } | 1444 | } |
1444 | /* Fall through */ | 1445 | break; |
1445 | case USB_SPEED_FULL: | 1446 | case USB_SPEED_FULL: |
1446 | case USB_SPEED_LOW: | 1447 | case USB_SPEED_LOW: |
1447 | max_packet = GET_MAX_PACKET(usb_endpoint_maxp(&ep->desc)); | ||
1448 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet)); | ||
1449 | break; | 1448 | break; |
1450 | default: | 1449 | default: |
1451 | BUG(); | 1450 | BUG(); |
1452 | } | 1451 | } |
1452 | ep_ctx->ep_info2 |= cpu_to_le32(MAX_PACKET(max_packet) | | ||
1453 | MAX_BURST(max_burst)); | ||
1453 | max_esit_payload = xhci_get_max_esit_payload(xhci, udev, ep); | 1454 | max_esit_payload = xhci_get_max_esit_payload(xhci, udev, ep); |
1454 | ep_ctx->tx_info = cpu_to_le32(MAX_ESIT_PAYLOAD_FOR_EP(max_esit_payload)); | 1455 | ep_ctx->tx_info = cpu_to_le32(MAX_ESIT_PAYLOAD_FOR_EP(max_esit_payload)); |
1455 | 1456 | ||
@@ -1826,6 +1827,9 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | |||
1826 | } | 1827 | } |
1827 | spin_unlock_irqrestore(&xhci->lock, flags); | 1828 | spin_unlock_irqrestore(&xhci->lock, flags); |
1828 | 1829 | ||
1830 | if (!xhci->rh_bw) | ||
1831 | goto no_bw; | ||
1832 | |||
1829 | num_ports = HCS_MAX_PORTS(xhci->hcs_params1); | 1833 | num_ports = HCS_MAX_PORTS(xhci->hcs_params1); |
1830 | for (i = 0; i < num_ports; i++) { | 1834 | for (i = 0; i < num_ports; i++) { |
1831 | struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; | 1835 | struct xhci_interval_bw_table *bwt = &xhci->rh_bw[i].bw_table; |
@@ -1844,6 +1848,7 @@ void xhci_mem_cleanup(struct xhci_hcd *xhci) | |||
1844 | } | 1848 | } |
1845 | } | 1849 | } |
1846 | 1850 | ||
1851 | no_bw: | ||
1847 | xhci->num_usb2_ports = 0; | 1852 | xhci->num_usb2_ports = 0; |
1848 | xhci->num_usb3_ports = 0; | 1853 | xhci->num_usb3_ports = 0; |
1849 | xhci->num_active_eps = 0; | 1854 | xhci->num_active_eps = 0; |
@@ -2255,6 +2260,9 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
2255 | u32 page_size, temp; | 2260 | u32 page_size, temp; |
2256 | int i; | 2261 | int i; |
2257 | 2262 | ||
2263 | INIT_LIST_HEAD(&xhci->lpm_failed_devs); | ||
2264 | INIT_LIST_HEAD(&xhci->cancel_cmd_list); | ||
2265 | |||
2258 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); | 2266 | page_size = xhci_readl(xhci, &xhci->op_regs->page_size); |
2259 | xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size); | 2267 | xhci_dbg(xhci, "Supported page size register = 0x%x\n", page_size); |
2260 | for (i = 0; i < 16; i++) { | 2268 | for (i = 0; i < 16; i++) { |
@@ -2333,7 +2341,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
2333 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags); | 2341 | xhci->cmd_ring = xhci_ring_alloc(xhci, 1, 1, TYPE_COMMAND, flags); |
2334 | if (!xhci->cmd_ring) | 2342 | if (!xhci->cmd_ring) |
2335 | goto fail; | 2343 | goto fail; |
2336 | INIT_LIST_HEAD(&xhci->cancel_cmd_list); | ||
2337 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); | 2344 | xhci_dbg(xhci, "Allocated command ring at %p\n", xhci->cmd_ring); |
2338 | xhci_dbg(xhci, "First segment DMA is 0x%llx\n", | 2345 | xhci_dbg(xhci, "First segment DMA is 0x%llx\n", |
2339 | (unsigned long long)xhci->cmd_ring->first_seg->dma); | 2346 | (unsigned long long)xhci->cmd_ring->first_seg->dma); |
@@ -2444,8 +2451,6 @@ int xhci_mem_init(struct xhci_hcd *xhci, gfp_t flags) | |||
2444 | if (xhci_setup_port_arrays(xhci, flags)) | 2451 | if (xhci_setup_port_arrays(xhci, flags)) |
2445 | goto fail; | 2452 | goto fail; |
2446 | 2453 | ||
2447 | INIT_LIST_HEAD(&xhci->lpm_failed_devs); | ||
2448 | |||
2449 | /* Enable USB 3.0 device notifications for function remote wake, which | 2454 | /* Enable USB 3.0 device notifications for function remote wake, which |
2450 | * is necessary for allowing USB 3.0 devices to do remote wakeup from | 2455 | * is necessary for allowing USB 3.0 devices to do remote wakeup from |
2451 | * U3 (device suspend). | 2456 | * U3 (device suspend). |