diff options
| author | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-10-09 03:02:35 -0400 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-10-09 03:02:35 -0400 |
| commit | 1236d6bb6e19fc72ffc6bbcdeb1bfefe450e54ee (patch) | |
| tree | 47da3feee8e263e8c9352c85cf518e624be3c211 /drivers/usb | |
| parent | 750b1a6894ecc9b178c6e3d0a1170122971b2036 (diff) | |
| parent | 8a5776a5f49812d29fe4b2d0a2d71675c3facf3f (diff) | |
Merge 4.14-rc4 into staging-next
We want the staging/iio fixes in here as well to handle merge issues.
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
30 files changed, 266 insertions, 141 deletions
diff --git a/drivers/usb/class/cdc-wdm.c b/drivers/usb/class/cdc-wdm.c index 5aacea1978a5..3e865dbf878c 100644 --- a/drivers/usb/class/cdc-wdm.c +++ b/drivers/usb/class/cdc-wdm.c | |||
| @@ -190,8 +190,10 @@ static void wdm_in_callback(struct urb *urb) | |||
| 190 | /* | 190 | /* |
| 191 | * only set a new error if there is no previous error. | 191 | * only set a new error if there is no previous error. |
| 192 | * Errors are only cleared during read/open | 192 | * Errors are only cleared during read/open |
| 193 | * Avoid propagating -EPIPE (stall) to userspace since it is | ||
| 194 | * better handled as an empty read | ||
| 193 | */ | 195 | */ |
| 194 | if (desc->rerr == 0) | 196 | if (desc->rerr == 0 && status != -EPIPE) |
| 195 | desc->rerr = status; | 197 | desc->rerr = status; |
| 196 | 198 | ||
| 197 | if (length + desc->length > desc->wMaxCommand) { | 199 | if (length + desc->length > desc->wMaxCommand) { |
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index 4be52c602e9b..68b54bd88d1e 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c | |||
| @@ -643,15 +643,23 @@ static int usb_parse_configuration(struct usb_device *dev, int cfgidx, | |||
| 643 | 643 | ||
| 644 | } else if (header->bDescriptorType == | 644 | } else if (header->bDescriptorType == |
| 645 | USB_DT_INTERFACE_ASSOCIATION) { | 645 | USB_DT_INTERFACE_ASSOCIATION) { |
| 646 | struct usb_interface_assoc_descriptor *d; | ||
| 647 | |||
| 648 | d = (struct usb_interface_assoc_descriptor *)header; | ||
| 649 | if (d->bLength < USB_DT_INTERFACE_ASSOCIATION_SIZE) { | ||
| 650 | dev_warn(ddev, | ||
| 651 | "config %d has an invalid interface association descriptor of length %d, skipping\n", | ||
| 652 | cfgno, d->bLength); | ||
| 653 | continue; | ||
| 654 | } | ||
| 655 | |||
| 646 | if (iad_num == USB_MAXIADS) { | 656 | if (iad_num == USB_MAXIADS) { |
| 647 | dev_warn(ddev, "found more Interface " | 657 | dev_warn(ddev, "found more Interface " |
| 648 | "Association Descriptors " | 658 | "Association Descriptors " |
| 649 | "than allocated for in " | 659 | "than allocated for in " |
| 650 | "configuration %d\n", cfgno); | 660 | "configuration %d\n", cfgno); |
| 651 | } else { | 661 | } else { |
| 652 | config->intf_assoc[iad_num] = | 662 | config->intf_assoc[iad_num] = d; |
| 653 | (struct usb_interface_assoc_descriptor | ||
| 654 | *)header; | ||
| 655 | iad_num++; | 663 | iad_num++; |
| 656 | } | 664 | } |
| 657 | 665 | ||
| @@ -852,7 +860,7 @@ int usb_get_configuration(struct usb_device *dev) | |||
| 852 | } | 860 | } |
| 853 | 861 | ||
| 854 | if (dev->quirks & USB_QUIRK_DELAY_INIT) | 862 | if (dev->quirks & USB_QUIRK_DELAY_INIT) |
| 855 | msleep(100); | 863 | msleep(200); |
| 856 | 864 | ||
| 857 | result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, | 865 | result = usb_get_descriptor(dev, USB_DT_CONFIG, cfgno, |
| 858 | bigbuffer, length); | 866 | bigbuffer, length); |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index 318bb3b96687..4664e543cf2f 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
| @@ -140,6 +140,9 @@ module_param(usbfs_memory_mb, uint, 0644); | |||
| 140 | MODULE_PARM_DESC(usbfs_memory_mb, | 140 | MODULE_PARM_DESC(usbfs_memory_mb, |
| 141 | "maximum MB allowed for usbfs buffers (0 = no limit)"); | 141 | "maximum MB allowed for usbfs buffers (0 = no limit)"); |
| 142 | 142 | ||
| 143 | /* Hard limit, necessary to avoid arithmetic overflow */ | ||
| 144 | #define USBFS_XFER_MAX (UINT_MAX / 2 - 1000000) | ||
| 145 | |||
| 143 | static atomic64_t usbfs_memory_usage; /* Total memory currently allocated */ | 146 | static atomic64_t usbfs_memory_usage; /* Total memory currently allocated */ |
| 144 | 147 | ||
| 145 | /* Check whether it's okay to allocate more memory for a transfer */ | 148 | /* Check whether it's okay to allocate more memory for a transfer */ |
| @@ -1460,6 +1463,8 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb | |||
| 1460 | USBDEVFS_URB_ZERO_PACKET | | 1463 | USBDEVFS_URB_ZERO_PACKET | |
| 1461 | USBDEVFS_URB_NO_INTERRUPT)) | 1464 | USBDEVFS_URB_NO_INTERRUPT)) |
| 1462 | return -EINVAL; | 1465 | return -EINVAL; |
| 1466 | if ((unsigned int)uurb->buffer_length >= USBFS_XFER_MAX) | ||
| 1467 | return -EINVAL; | ||
| 1463 | if (uurb->buffer_length > 0 && !uurb->buffer) | 1468 | if (uurb->buffer_length > 0 && !uurb->buffer) |
| 1464 | return -EINVAL; | 1469 | return -EINVAL; |
| 1465 | if (!(uurb->type == USBDEVFS_URB_TYPE_CONTROL && | 1470 | if (!(uurb->type == USBDEVFS_URB_TYPE_CONTROL && |
| @@ -1571,7 +1576,11 @@ static int proc_do_submiturb(struct usb_dev_state *ps, struct usbdevfs_urb *uurb | |||
| 1571 | totlen += isopkt[u].length; | 1576 | totlen += isopkt[u].length; |
| 1572 | } | 1577 | } |
| 1573 | u *= sizeof(struct usb_iso_packet_descriptor); | 1578 | u *= sizeof(struct usb_iso_packet_descriptor); |
| 1574 | uurb->buffer_length = totlen; | 1579 | if (totlen <= uurb->buffer_length) |
| 1580 | uurb->buffer_length = totlen; | ||
| 1581 | else | ||
| 1582 | WARN_ONCE(1, "uurb->buffer_length is too short %d vs %d", | ||
| 1583 | totlen, uurb->buffer_length); | ||
| 1575 | break; | 1584 | break; |
| 1576 | 1585 | ||
| 1577 | default: | 1586 | default: |
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 41eaf0b52518..b5c733613823 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
| @@ -4838,7 +4838,7 @@ static void hub_port_connect(struct usb_hub *hub, int port1, u16 portstatus, | |||
| 4838 | goto loop; | 4838 | goto loop; |
| 4839 | 4839 | ||
| 4840 | if (udev->quirks & USB_QUIRK_DELAY_INIT) | 4840 | if (udev->quirks & USB_QUIRK_DELAY_INIT) |
| 4841 | msleep(1000); | 4841 | msleep(2000); |
| 4842 | 4842 | ||
| 4843 | /* consecutive bus-powered hubs aren't reliable; they can | 4843 | /* consecutive bus-powered hubs aren't reliable; they can |
| 4844 | * violate the voltage drop budget. if the new child has | 4844 | * violate the voltage drop budget. if the new child has |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 4c38ea41ae96..371a07d874a3 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
| @@ -2069,6 +2069,10 @@ int cdc_parse_cdc_header(struct usb_cdc_parsed_header *hdr, | |||
| 2069 | elength = 1; | 2069 | elength = 1; |
| 2070 | goto next_desc; | 2070 | goto next_desc; |
| 2071 | } | 2071 | } |
| 2072 | if ((buflen < elength) || (elength < 3)) { | ||
| 2073 | dev_err(&intf->dev, "invalid descriptor buffer length\n"); | ||
| 2074 | break; | ||
| 2075 | } | ||
| 2072 | if (buffer[1] != USB_DT_CS_INTERFACE) { | 2076 | if (buffer[1] != USB_DT_CS_INTERFACE) { |
| 2073 | dev_err(&intf->dev, "skipping garbage\n"); | 2077 | dev_err(&intf->dev, "skipping garbage\n"); |
| 2074 | goto next_desc; | 2078 | goto next_desc; |
diff --git a/drivers/usb/dwc3/dwc3-of-simple.c b/drivers/usb/dwc3/dwc3-of-simple.c index 4cef7d4f9cd0..a26d1fde0f5e 100644 --- a/drivers/usb/dwc3/dwc3-of-simple.c +++ b/drivers/usb/dwc3/dwc3-of-simple.c | |||
| @@ -177,6 +177,7 @@ static const struct of_device_id of_dwc3_simple_match[] = { | |||
| 177 | { .compatible = "rockchip,rk3399-dwc3" }, | 177 | { .compatible = "rockchip,rk3399-dwc3" }, |
| 178 | { .compatible = "xlnx,zynqmp-dwc3" }, | 178 | { .compatible = "xlnx,zynqmp-dwc3" }, |
| 179 | { .compatible = "cavium,octeon-7130-usb-uctl" }, | 179 | { .compatible = "cavium,octeon-7130-usb-uctl" }, |
| 180 | { .compatible = "sprd,sc9860-dwc3" }, | ||
| 180 | { /* Sentinel */ } | 181 | { /* Sentinel */ } |
| 181 | }; | 182 | }; |
| 182 | MODULE_DEVICE_TABLE(of, of_dwc3_simple_match); | 183 | MODULE_DEVICE_TABLE(of, of_dwc3_simple_match); |
diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index 827e376bfa97..75e6cb044eb2 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c | |||
| @@ -990,6 +990,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
| 990 | DWC3_TRBCTL_CONTROL_DATA, | 990 | DWC3_TRBCTL_CONTROL_DATA, |
| 991 | true); | 991 | true); |
| 992 | 992 | ||
| 993 | req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1]; | ||
| 994 | |||
| 993 | /* Now prepare one extra TRB to align transfer size */ | 995 | /* Now prepare one extra TRB to align transfer size */ |
| 994 | dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, | 996 | dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, |
| 995 | maxpacket - rem, | 997 | maxpacket - rem, |
| @@ -1015,6 +1017,8 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
| 1015 | DWC3_TRBCTL_CONTROL_DATA, | 1017 | DWC3_TRBCTL_CONTROL_DATA, |
| 1016 | true); | 1018 | true); |
| 1017 | 1019 | ||
| 1020 | req->trb = &dwc->ep0_trb[dep->trb_enqueue - 1]; | ||
| 1021 | |||
| 1018 | /* Now prepare one extra TRB to align transfer size */ | 1022 | /* Now prepare one extra TRB to align transfer size */ |
| 1019 | dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, | 1023 | dwc3_ep0_prepare_one_trb(dep, dwc->bounce_addr, |
| 1020 | 0, DWC3_TRBCTL_CONTROL_DATA, | 1024 | 0, DWC3_TRBCTL_CONTROL_DATA, |
| @@ -1029,6 +1033,9 @@ static void __dwc3_ep0_do_control_data(struct dwc3 *dwc, | |||
| 1029 | dwc3_ep0_prepare_one_trb(dep, req->request.dma, | 1033 | dwc3_ep0_prepare_one_trb(dep, req->request.dma, |
| 1030 | req->request.length, DWC3_TRBCTL_CONTROL_DATA, | 1034 | req->request.length, DWC3_TRBCTL_CONTROL_DATA, |
| 1031 | false); | 1035 | false); |
| 1036 | |||
| 1037 | req->trb = &dwc->ep0_trb[dep->trb_enqueue]; | ||
| 1038 | |||
| 1032 | ret = dwc3_ep0_start_trans(dep); | 1039 | ret = dwc3_ep0_start_trans(dep); |
| 1033 | } | 1040 | } |
| 1034 | 1041 | ||
diff --git a/drivers/usb/gadget/function/f_fs.c b/drivers/usb/gadget/function/f_fs.c index 9990944a7245..8b342587f8ad 100644 --- a/drivers/usb/gadget/function/f_fs.c +++ b/drivers/usb/gadget/function/f_fs.c | |||
| @@ -46,7 +46,8 @@ | |||
| 46 | static void ffs_data_get(struct ffs_data *ffs); | 46 | static void ffs_data_get(struct ffs_data *ffs); |
| 47 | static void ffs_data_put(struct ffs_data *ffs); | 47 | static void ffs_data_put(struct ffs_data *ffs); |
| 48 | /* Creates new ffs_data object. */ | 48 | /* Creates new ffs_data object. */ |
| 49 | static struct ffs_data *__must_check ffs_data_new(void) __attribute__((malloc)); | 49 | static struct ffs_data *__must_check ffs_data_new(const char *dev_name) |
| 50 | __attribute__((malloc)); | ||
| 50 | 51 | ||
| 51 | /* Opened counter handling. */ | 52 | /* Opened counter handling. */ |
| 52 | static void ffs_data_opened(struct ffs_data *ffs); | 53 | static void ffs_data_opened(struct ffs_data *ffs); |
| @@ -780,11 +781,12 @@ static void ffs_epfile_async_io_complete(struct usb_ep *_ep, | |||
| 780 | struct usb_request *req) | 781 | struct usb_request *req) |
| 781 | { | 782 | { |
| 782 | struct ffs_io_data *io_data = req->context; | 783 | struct ffs_io_data *io_data = req->context; |
| 784 | struct ffs_data *ffs = io_data->ffs; | ||
| 783 | 785 | ||
| 784 | ENTER(); | 786 | ENTER(); |
| 785 | 787 | ||
| 786 | INIT_WORK(&io_data->work, ffs_user_copy_worker); | 788 | INIT_WORK(&io_data->work, ffs_user_copy_worker); |
| 787 | schedule_work(&io_data->work); | 789 | queue_work(ffs->io_completion_wq, &io_data->work); |
| 788 | } | 790 | } |
| 789 | 791 | ||
| 790 | static void __ffs_epfile_read_buffer_free(struct ffs_epfile *epfile) | 792 | static void __ffs_epfile_read_buffer_free(struct ffs_epfile *epfile) |
| @@ -1500,7 +1502,7 @@ ffs_fs_mount(struct file_system_type *t, int flags, | |||
| 1500 | if (unlikely(ret < 0)) | 1502 | if (unlikely(ret < 0)) |
| 1501 | return ERR_PTR(ret); | 1503 | return ERR_PTR(ret); |
| 1502 | 1504 | ||
| 1503 | ffs = ffs_data_new(); | 1505 | ffs = ffs_data_new(dev_name); |
| 1504 | if (unlikely(!ffs)) | 1506 | if (unlikely(!ffs)) |
| 1505 | return ERR_PTR(-ENOMEM); | 1507 | return ERR_PTR(-ENOMEM); |
| 1506 | ffs->file_perms = data.perms; | 1508 | ffs->file_perms = data.perms; |
| @@ -1610,6 +1612,7 @@ static void ffs_data_put(struct ffs_data *ffs) | |||
| 1610 | BUG_ON(waitqueue_active(&ffs->ev.waitq) || | 1612 | BUG_ON(waitqueue_active(&ffs->ev.waitq) || |
| 1611 | waitqueue_active(&ffs->ep0req_completion.wait) || | 1613 | waitqueue_active(&ffs->ep0req_completion.wait) || |
| 1612 | waitqueue_active(&ffs->wait)); | 1614 | waitqueue_active(&ffs->wait)); |
| 1615 | destroy_workqueue(ffs->io_completion_wq); | ||
| 1613 | kfree(ffs->dev_name); | 1616 | kfree(ffs->dev_name); |
| 1614 | kfree(ffs); | 1617 | kfree(ffs); |
| 1615 | } | 1618 | } |
| @@ -1642,7 +1645,7 @@ static void ffs_data_closed(struct ffs_data *ffs) | |||
| 1642 | ffs_data_put(ffs); | 1645 | ffs_data_put(ffs); |
| 1643 | } | 1646 | } |
| 1644 | 1647 | ||
| 1645 | static struct ffs_data *ffs_data_new(void) | 1648 | static struct ffs_data *ffs_data_new(const char *dev_name) |
| 1646 | { | 1649 | { |
| 1647 | struct ffs_data *ffs = kzalloc(sizeof *ffs, GFP_KERNEL); | 1650 | struct ffs_data *ffs = kzalloc(sizeof *ffs, GFP_KERNEL); |
| 1648 | if (unlikely(!ffs)) | 1651 | if (unlikely(!ffs)) |
| @@ -1650,6 +1653,12 @@ static struct ffs_data *ffs_data_new(void) | |||
| 1650 | 1653 | ||
| 1651 | ENTER(); | 1654 | ENTER(); |
| 1652 | 1655 | ||
| 1656 | ffs->io_completion_wq = alloc_ordered_workqueue("%s", 0, dev_name); | ||
| 1657 | if (!ffs->io_completion_wq) { | ||
| 1658 | kfree(ffs); | ||
| 1659 | return NULL; | ||
| 1660 | } | ||
| 1661 | |||
| 1653 | refcount_set(&ffs->ref, 1); | 1662 | refcount_set(&ffs->ref, 1); |
| 1654 | atomic_set(&ffs->opened, 0); | 1663 | atomic_set(&ffs->opened, 0); |
| 1655 | ffs->state = FFS_READ_DESCRIPTORS; | 1664 | ffs->state = FFS_READ_DESCRIPTORS; |
diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c index d6bd0244b008..5153e29870c3 100644 --- a/drivers/usb/gadget/function/f_mass_storage.c +++ b/drivers/usb/gadget/function/f_mass_storage.c | |||
| @@ -307,8 +307,6 @@ struct fsg_common { | |||
| 307 | struct completion thread_notifier; | 307 | struct completion thread_notifier; |
| 308 | struct task_struct *thread_task; | 308 | struct task_struct *thread_task; |
| 309 | 309 | ||
| 310 | /* Callback functions. */ | ||
| 311 | const struct fsg_operations *ops; | ||
| 312 | /* Gadget's private data. */ | 310 | /* Gadget's private data. */ |
| 313 | void *private_data; | 311 | void *private_data; |
| 314 | 312 | ||
| @@ -2438,6 +2436,7 @@ static void handle_exception(struct fsg_common *common) | |||
| 2438 | static int fsg_main_thread(void *common_) | 2436 | static int fsg_main_thread(void *common_) |
| 2439 | { | 2437 | { |
| 2440 | struct fsg_common *common = common_; | 2438 | struct fsg_common *common = common_; |
| 2439 | int i; | ||
| 2441 | 2440 | ||
| 2442 | /* | 2441 | /* |
| 2443 | * Allow the thread to be killed by a signal, but set the signal mask | 2442 | * Allow the thread to be killed by a signal, but set the signal mask |
| @@ -2476,21 +2475,16 @@ static int fsg_main_thread(void *common_) | |||
| 2476 | common->thread_task = NULL; | 2475 | common->thread_task = NULL; |
| 2477 | spin_unlock_irq(&common->lock); | 2476 | spin_unlock_irq(&common->lock); |
| 2478 | 2477 | ||
| 2479 | if (!common->ops || !common->ops->thread_exits | 2478 | /* Eject media from all LUNs */ |
| 2480 | || common->ops->thread_exits(common) < 0) { | ||
| 2481 | int i; | ||
| 2482 | 2479 | ||
| 2483 | down_write(&common->filesem); | 2480 | down_write(&common->filesem); |
| 2484 | for (i = 0; i < ARRAY_SIZE(common->luns); i++) { | 2481 | for (i = 0; i < ARRAY_SIZE(common->luns); i++) { |
| 2485 | struct fsg_lun *curlun = common->luns[i]; | 2482 | struct fsg_lun *curlun = common->luns[i]; |
| 2486 | if (!curlun || !fsg_lun_is_open(curlun)) | ||
| 2487 | continue; | ||
| 2488 | 2483 | ||
| 2484 | if (curlun && fsg_lun_is_open(curlun)) | ||
| 2489 | fsg_lun_close(curlun); | 2485 | fsg_lun_close(curlun); |
| 2490 | curlun->unit_attention_data = SS_MEDIUM_NOT_PRESENT; | ||
| 2491 | } | ||
| 2492 | up_write(&common->filesem); | ||
| 2493 | } | 2486 | } |
| 2487 | up_write(&common->filesem); | ||
| 2494 | 2488 | ||
| 2495 | /* Let fsg_unbind() know the thread has exited */ | 2489 | /* Let fsg_unbind() know the thread has exited */ |
| 2496 | complete_and_exit(&common->thread_notifier, 0); | 2490 | complete_and_exit(&common->thread_notifier, 0); |
| @@ -2681,13 +2675,6 @@ void fsg_common_remove_luns(struct fsg_common *common) | |||
| 2681 | } | 2675 | } |
| 2682 | EXPORT_SYMBOL_GPL(fsg_common_remove_luns); | 2676 | EXPORT_SYMBOL_GPL(fsg_common_remove_luns); |
| 2683 | 2677 | ||
| 2684 | void fsg_common_set_ops(struct fsg_common *common, | ||
| 2685 | const struct fsg_operations *ops) | ||
| 2686 | { | ||
| 2687 | common->ops = ops; | ||
| 2688 | } | ||
| 2689 | EXPORT_SYMBOL_GPL(fsg_common_set_ops); | ||
| 2690 | |||
| 2691 | void fsg_common_free_buffers(struct fsg_common *common) | 2678 | void fsg_common_free_buffers(struct fsg_common *common) |
| 2692 | { | 2679 | { |
| 2693 | _fsg_common_free_buffers(common->buffhds, common->fsg_num_buffers); | 2680 | _fsg_common_free_buffers(common->buffhds, common->fsg_num_buffers); |
diff --git a/drivers/usb/gadget/function/f_mass_storage.h b/drivers/usb/gadget/function/f_mass_storage.h index d3902313b8ac..dc05ca0c4359 100644 --- a/drivers/usb/gadget/function/f_mass_storage.h +++ b/drivers/usb/gadget/function/f_mass_storage.h | |||
| @@ -60,17 +60,6 @@ struct fsg_module_parameters { | |||
| 60 | struct fsg_common; | 60 | struct fsg_common; |
| 61 | 61 | ||
| 62 | /* FSF callback functions */ | 62 | /* FSF callback functions */ |
| 63 | struct fsg_operations { | ||
| 64 | /* | ||
| 65 | * Callback function to call when thread exits. If no | ||
| 66 | * callback is set or it returns value lower then zero MSF | ||
| 67 | * will force eject all LUNs it operates on (including those | ||
| 68 | * marked as non-removable or with prevent_medium_removal flag | ||
| 69 | * set). | ||
| 70 | */ | ||
| 71 | int (*thread_exits)(struct fsg_common *common); | ||
| 72 | }; | ||
| 73 | |||
| 74 | struct fsg_lun_opts { | 63 | struct fsg_lun_opts { |
| 75 | struct config_group group; | 64 | struct config_group group; |
| 76 | struct fsg_lun *lun; | 65 | struct fsg_lun *lun; |
| @@ -142,9 +131,6 @@ void fsg_common_remove_lun(struct fsg_lun *lun); | |||
| 142 | 131 | ||
| 143 | void fsg_common_remove_luns(struct fsg_common *common); | 132 | void fsg_common_remove_luns(struct fsg_common *common); |
| 144 | 133 | ||
| 145 | void fsg_common_set_ops(struct fsg_common *common, | ||
| 146 | const struct fsg_operations *ops); | ||
| 147 | |||
| 148 | int fsg_common_create_lun(struct fsg_common *common, struct fsg_lun_config *cfg, | 134 | int fsg_common_create_lun(struct fsg_common *common, struct fsg_lun_config *cfg, |
| 149 | unsigned int id, const char *name, | 135 | unsigned int id, const char *name, |
| 150 | const char **name_pfx); | 136 | const char **name_pfx); |
diff --git a/drivers/usb/gadget/function/f_printer.c b/drivers/usb/gadget/function/f_printer.c index 8df244fc9d80..ea0da35a44e2 100644 --- a/drivers/usb/gadget/function/f_printer.c +++ b/drivers/usb/gadget/function/f_printer.c | |||
| @@ -555,6 +555,7 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 555 | size_t size; /* Amount of data in a TX request. */ | 555 | size_t size; /* Amount of data in a TX request. */ |
| 556 | size_t bytes_copied = 0; | 556 | size_t bytes_copied = 0; |
| 557 | struct usb_request *req; | 557 | struct usb_request *req; |
| 558 | int value; | ||
| 558 | 559 | ||
| 559 | DBG(dev, "printer_write trying to send %d bytes\n", (int)len); | 560 | DBG(dev, "printer_write trying to send %d bytes\n", (int)len); |
| 560 | 561 | ||
| @@ -634,7 +635,11 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 634 | return -EAGAIN; | 635 | return -EAGAIN; |
| 635 | } | 636 | } |
| 636 | 637 | ||
| 637 | if (usb_ep_queue(dev->in_ep, req, GFP_ATOMIC)) { | 638 | /* here, we unlock, and only unlock, to avoid deadlock. */ |
| 639 | spin_unlock(&dev->lock); | ||
| 640 | value = usb_ep_queue(dev->in_ep, req, GFP_ATOMIC); | ||
| 641 | spin_lock(&dev->lock); | ||
| 642 | if (value) { | ||
| 638 | list_add(&req->list, &dev->tx_reqs); | 643 | list_add(&req->list, &dev->tx_reqs); |
| 639 | spin_unlock_irqrestore(&dev->lock, flags); | 644 | spin_unlock_irqrestore(&dev->lock, flags); |
| 640 | mutex_unlock(&dev->lock_printer_io); | 645 | mutex_unlock(&dev->lock_printer_io); |
diff --git a/drivers/usb/gadget/function/u_fs.h b/drivers/usb/gadget/function/u_fs.h index 540f1c48c1a8..79f70ebf85dc 100644 --- a/drivers/usb/gadget/function/u_fs.h +++ b/drivers/usb/gadget/function/u_fs.h | |||
| @@ -279,6 +279,7 @@ struct ffs_data { | |||
| 279 | } file_perms; | 279 | } file_perms; |
| 280 | 280 | ||
| 281 | struct eventfd_ctx *ffs_eventfd; | 281 | struct eventfd_ctx *ffs_eventfd; |
| 282 | struct workqueue_struct *io_completion_wq; | ||
| 282 | bool no_disconnect; | 283 | bool no_disconnect; |
| 283 | struct work_struct reset_work; | 284 | struct work_struct reset_work; |
| 284 | 285 | ||
diff --git a/drivers/usb/gadget/legacy/inode.c b/drivers/usb/gadget/legacy/inode.c index 684900fcfe24..5c28bee327e1 100644 --- a/drivers/usb/gadget/legacy/inode.c +++ b/drivers/usb/gadget/legacy/inode.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | #include <linux/aio.h> | 28 | #include <linux/aio.h> |
| 29 | #include <linux/uio.h> | 29 | #include <linux/uio.h> |
| 30 | #include <linux/refcount.h> | 30 | #include <linux/refcount.h> |
| 31 | 31 | #include <linux/delay.h> | |
| 32 | #include <linux/device.h> | 32 | #include <linux/device.h> |
| 33 | #include <linux/moduleparam.h> | 33 | #include <linux/moduleparam.h> |
| 34 | 34 | ||
| @@ -116,6 +116,7 @@ enum ep0_state { | |||
| 116 | struct dev_data { | 116 | struct dev_data { |
| 117 | spinlock_t lock; | 117 | spinlock_t lock; |
| 118 | refcount_t count; | 118 | refcount_t count; |
| 119 | int udc_usage; | ||
| 119 | enum ep0_state state; /* P: lock */ | 120 | enum ep0_state state; /* P: lock */ |
| 120 | struct usb_gadgetfs_event event [N_EVENT]; | 121 | struct usb_gadgetfs_event event [N_EVENT]; |
| 121 | unsigned ev_next; | 122 | unsigned ev_next; |
| @@ -513,9 +514,9 @@ static void ep_aio_complete(struct usb_ep *ep, struct usb_request *req) | |||
| 513 | INIT_WORK(&priv->work, ep_user_copy_worker); | 514 | INIT_WORK(&priv->work, ep_user_copy_worker); |
| 514 | schedule_work(&priv->work); | 515 | schedule_work(&priv->work); |
| 515 | } | 516 | } |
| 516 | spin_unlock(&epdata->dev->lock); | ||
| 517 | 517 | ||
| 518 | usb_ep_free_request(ep, req); | 518 | usb_ep_free_request(ep, req); |
| 519 | spin_unlock(&epdata->dev->lock); | ||
| 519 | put_ep(epdata); | 520 | put_ep(epdata); |
| 520 | } | 521 | } |
| 521 | 522 | ||
| @@ -939,9 +940,11 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr) | |||
| 939 | struct usb_request *req = dev->req; | 940 | struct usb_request *req = dev->req; |
| 940 | 941 | ||
| 941 | if ((retval = setup_req (ep, req, 0)) == 0) { | 942 | if ((retval = setup_req (ep, req, 0)) == 0) { |
| 943 | ++dev->udc_usage; | ||
| 942 | spin_unlock_irq (&dev->lock); | 944 | spin_unlock_irq (&dev->lock); |
| 943 | retval = usb_ep_queue (ep, req, GFP_KERNEL); | 945 | retval = usb_ep_queue (ep, req, GFP_KERNEL); |
| 944 | spin_lock_irq (&dev->lock); | 946 | spin_lock_irq (&dev->lock); |
| 947 | --dev->udc_usage; | ||
| 945 | } | 948 | } |
| 946 | dev->state = STATE_DEV_CONNECTED; | 949 | dev->state = STATE_DEV_CONNECTED; |
| 947 | 950 | ||
| @@ -983,11 +986,14 @@ ep0_read (struct file *fd, char __user *buf, size_t len, loff_t *ptr) | |||
| 983 | retval = -EIO; | 986 | retval = -EIO; |
| 984 | else { | 987 | else { |
| 985 | len = min (len, (size_t)dev->req->actual); | 988 | len = min (len, (size_t)dev->req->actual); |
| 986 | // FIXME don't call this with the spinlock held ... | 989 | ++dev->udc_usage; |
| 990 | spin_unlock_irq(&dev->lock); | ||
| 987 | if (copy_to_user (buf, dev->req->buf, len)) | 991 | if (copy_to_user (buf, dev->req->buf, len)) |
| 988 | retval = -EFAULT; | 992 | retval = -EFAULT; |
| 989 | else | 993 | else |
| 990 | retval = len; | 994 | retval = len; |
| 995 | spin_lock_irq(&dev->lock); | ||
| 996 | --dev->udc_usage; | ||
| 991 | clean_req (dev->gadget->ep0, dev->req); | 997 | clean_req (dev->gadget->ep0, dev->req); |
| 992 | /* NOTE userspace can't yet choose to stall */ | 998 | /* NOTE userspace can't yet choose to stall */ |
| 993 | } | 999 | } |
| @@ -1131,6 +1137,7 @@ ep0_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 1131 | retval = setup_req (dev->gadget->ep0, dev->req, len); | 1137 | retval = setup_req (dev->gadget->ep0, dev->req, len); |
| 1132 | if (retval == 0) { | 1138 | if (retval == 0) { |
| 1133 | dev->state = STATE_DEV_CONNECTED; | 1139 | dev->state = STATE_DEV_CONNECTED; |
| 1140 | ++dev->udc_usage; | ||
| 1134 | spin_unlock_irq (&dev->lock); | 1141 | spin_unlock_irq (&dev->lock); |
| 1135 | if (copy_from_user (dev->req->buf, buf, len)) | 1142 | if (copy_from_user (dev->req->buf, buf, len)) |
| 1136 | retval = -EFAULT; | 1143 | retval = -EFAULT; |
| @@ -1142,6 +1149,7 @@ ep0_write (struct file *fd, const char __user *buf, size_t len, loff_t *ptr) | |||
| 1142 | GFP_KERNEL); | 1149 | GFP_KERNEL); |
| 1143 | } | 1150 | } |
| 1144 | spin_lock_irq(&dev->lock); | 1151 | spin_lock_irq(&dev->lock); |
| 1152 | --dev->udc_usage; | ||
| 1145 | if (retval < 0) { | 1153 | if (retval < 0) { |
| 1146 | clean_req (dev->gadget->ep0, dev->req); | 1154 | clean_req (dev->gadget->ep0, dev->req); |
| 1147 | } else | 1155 | } else |
| @@ -1243,9 +1251,21 @@ static long dev_ioctl (struct file *fd, unsigned code, unsigned long value) | |||
| 1243 | struct usb_gadget *gadget = dev->gadget; | 1251 | struct usb_gadget *gadget = dev->gadget; |
| 1244 | long ret = -ENOTTY; | 1252 | long ret = -ENOTTY; |
| 1245 | 1253 | ||
| 1246 | if (gadget->ops->ioctl) | 1254 | spin_lock_irq(&dev->lock); |
| 1255 | if (dev->state == STATE_DEV_OPENED || | ||
| 1256 | dev->state == STATE_DEV_UNBOUND) { | ||
| 1257 | /* Not bound to a UDC */ | ||
| 1258 | } else if (gadget->ops->ioctl) { | ||
| 1259 | ++dev->udc_usage; | ||
| 1260 | spin_unlock_irq(&dev->lock); | ||
| 1261 | |||
| 1247 | ret = gadget->ops->ioctl (gadget, code, value); | 1262 | ret = gadget->ops->ioctl (gadget, code, value); |
| 1248 | 1263 | ||
| 1264 | spin_lock_irq(&dev->lock); | ||
| 1265 | --dev->udc_usage; | ||
| 1266 | } | ||
| 1267 | spin_unlock_irq(&dev->lock); | ||
| 1268 | |||
| 1249 | return ret; | 1269 | return ret; |
| 1250 | } | 1270 | } |
| 1251 | 1271 | ||
| @@ -1463,10 +1483,12 @@ delegate: | |||
| 1463 | if (value < 0) | 1483 | if (value < 0) |
| 1464 | break; | 1484 | break; |
| 1465 | 1485 | ||
| 1486 | ++dev->udc_usage; | ||
| 1466 | spin_unlock (&dev->lock); | 1487 | spin_unlock (&dev->lock); |
| 1467 | value = usb_ep_queue (gadget->ep0, dev->req, | 1488 | value = usb_ep_queue (gadget->ep0, dev->req, |
| 1468 | GFP_KERNEL); | 1489 | GFP_KERNEL); |
| 1469 | spin_lock (&dev->lock); | 1490 | spin_lock (&dev->lock); |
| 1491 | --dev->udc_usage; | ||
| 1470 | if (value < 0) { | 1492 | if (value < 0) { |
| 1471 | clean_req (gadget->ep0, dev->req); | 1493 | clean_req (gadget->ep0, dev->req); |
| 1472 | break; | 1494 | break; |
| @@ -1490,8 +1512,12 @@ delegate: | |||
| 1490 | req->length = value; | 1512 | req->length = value; |
| 1491 | req->zero = value < w_length; | 1513 | req->zero = value < w_length; |
| 1492 | 1514 | ||
| 1515 | ++dev->udc_usage; | ||
| 1493 | spin_unlock (&dev->lock); | 1516 | spin_unlock (&dev->lock); |
| 1494 | value = usb_ep_queue (gadget->ep0, req, GFP_KERNEL); | 1517 | value = usb_ep_queue (gadget->ep0, req, GFP_KERNEL); |
| 1518 | spin_lock(&dev->lock); | ||
| 1519 | --dev->udc_usage; | ||
| 1520 | spin_unlock(&dev->lock); | ||
| 1495 | if (value < 0) { | 1521 | if (value < 0) { |
| 1496 | DBG (dev, "ep_queue --> %d\n", value); | 1522 | DBG (dev, "ep_queue --> %d\n", value); |
| 1497 | req->status = 0; | 1523 | req->status = 0; |
| @@ -1518,21 +1544,24 @@ static void destroy_ep_files (struct dev_data *dev) | |||
| 1518 | /* break link to FS */ | 1544 | /* break link to FS */ |
| 1519 | ep = list_first_entry (&dev->epfiles, struct ep_data, epfiles); | 1545 | ep = list_first_entry (&dev->epfiles, struct ep_data, epfiles); |
| 1520 | list_del_init (&ep->epfiles); | 1546 | list_del_init (&ep->epfiles); |
| 1547 | spin_unlock_irq (&dev->lock); | ||
| 1548 | |||
| 1521 | dentry = ep->dentry; | 1549 | dentry = ep->dentry; |
| 1522 | ep->dentry = NULL; | 1550 | ep->dentry = NULL; |
| 1523 | parent = d_inode(dentry->d_parent); | 1551 | parent = d_inode(dentry->d_parent); |
| 1524 | 1552 | ||
| 1525 | /* break link to controller */ | 1553 | /* break link to controller */ |
| 1554 | mutex_lock(&ep->lock); | ||
| 1526 | if (ep->state == STATE_EP_ENABLED) | 1555 | if (ep->state == STATE_EP_ENABLED) |
| 1527 | (void) usb_ep_disable (ep->ep); | 1556 | (void) usb_ep_disable (ep->ep); |
| 1528 | ep->state = STATE_EP_UNBOUND; | 1557 | ep->state = STATE_EP_UNBOUND; |
| 1529 | usb_ep_free_request (ep->ep, ep->req); | 1558 | usb_ep_free_request (ep->ep, ep->req); |
| 1530 | ep->ep = NULL; | 1559 | ep->ep = NULL; |
| 1560 | mutex_unlock(&ep->lock); | ||
| 1561 | |||
| 1531 | wake_up (&ep->wait); | 1562 | wake_up (&ep->wait); |
| 1532 | put_ep (ep); | 1563 | put_ep (ep); |
| 1533 | 1564 | ||
| 1534 | spin_unlock_irq (&dev->lock); | ||
| 1535 | |||
| 1536 | /* break link to dcache */ | 1565 | /* break link to dcache */ |
| 1537 | inode_lock(parent); | 1566 | inode_lock(parent); |
| 1538 | d_delete (dentry); | 1567 | d_delete (dentry); |
| @@ -1603,6 +1632,11 @@ gadgetfs_unbind (struct usb_gadget *gadget) | |||
| 1603 | 1632 | ||
| 1604 | spin_lock_irq (&dev->lock); | 1633 | spin_lock_irq (&dev->lock); |
| 1605 | dev->state = STATE_DEV_UNBOUND; | 1634 | dev->state = STATE_DEV_UNBOUND; |
| 1635 | while (dev->udc_usage > 0) { | ||
| 1636 | spin_unlock_irq(&dev->lock); | ||
| 1637 | usleep_range(1000, 2000); | ||
| 1638 | spin_lock_irq(&dev->lock); | ||
| 1639 | } | ||
| 1606 | spin_unlock_irq (&dev->lock); | 1640 | spin_unlock_irq (&dev->lock); |
| 1607 | 1641 | ||
| 1608 | destroy_ep_files (dev); | 1642 | destroy_ep_files (dev); |
diff --git a/drivers/usb/gadget/legacy/mass_storage.c b/drivers/usb/gadget/legacy/mass_storage.c index e99ab57ee3e5..fcba59782f26 100644 --- a/drivers/usb/gadget/legacy/mass_storage.c +++ b/drivers/usb/gadget/legacy/mass_storage.c | |||
| @@ -107,15 +107,6 @@ static unsigned int fsg_num_buffers = CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS; | |||
| 107 | 107 | ||
| 108 | FSG_MODULE_PARAMETERS(/* no prefix */, mod_data); | 108 | FSG_MODULE_PARAMETERS(/* no prefix */, mod_data); |
| 109 | 109 | ||
| 110 | static unsigned long msg_registered; | ||
| 111 | static void msg_cleanup(void); | ||
| 112 | |||
| 113 | static int msg_thread_exits(struct fsg_common *common) | ||
| 114 | { | ||
| 115 | msg_cleanup(); | ||
| 116 | return 0; | ||
| 117 | } | ||
| 118 | |||
| 119 | static int msg_do_config(struct usb_configuration *c) | 110 | static int msg_do_config(struct usb_configuration *c) |
| 120 | { | 111 | { |
| 121 | struct fsg_opts *opts; | 112 | struct fsg_opts *opts; |
| @@ -154,9 +145,6 @@ static struct usb_configuration msg_config_driver = { | |||
| 154 | 145 | ||
| 155 | static int msg_bind(struct usb_composite_dev *cdev) | 146 | static int msg_bind(struct usb_composite_dev *cdev) |
| 156 | { | 147 | { |
| 157 | static const struct fsg_operations ops = { | ||
| 158 | .thread_exits = msg_thread_exits, | ||
| 159 | }; | ||
| 160 | struct fsg_opts *opts; | 148 | struct fsg_opts *opts; |
| 161 | struct fsg_config config; | 149 | struct fsg_config config; |
| 162 | int status; | 150 | int status; |
| @@ -173,8 +161,6 @@ static int msg_bind(struct usb_composite_dev *cdev) | |||
| 173 | if (status) | 161 | if (status) |
| 174 | goto fail; | 162 | goto fail; |
| 175 | 163 | ||
| 176 | fsg_common_set_ops(opts->common, &ops); | ||
| 177 | |||
| 178 | status = fsg_common_set_cdev(opts->common, cdev, config.can_stall); | 164 | status = fsg_common_set_cdev(opts->common, cdev, config.can_stall); |
| 179 | if (status) | 165 | if (status) |
| 180 | goto fail_set_cdev; | 166 | goto fail_set_cdev; |
| @@ -256,18 +242,12 @@ MODULE_LICENSE("GPL"); | |||
| 256 | 242 | ||
| 257 | static int __init msg_init(void) | 243 | static int __init msg_init(void) |
| 258 | { | 244 | { |
| 259 | int ret; | 245 | return usb_composite_probe(&msg_driver); |
| 260 | |||
| 261 | ret = usb_composite_probe(&msg_driver); | ||
| 262 | set_bit(0, &msg_registered); | ||
| 263 | |||
| 264 | return ret; | ||
| 265 | } | 246 | } |
| 266 | module_init(msg_init); | 247 | module_init(msg_init); |
| 267 | 248 | ||
| 268 | static void msg_cleanup(void) | 249 | static void __exit msg_cleanup(void) |
| 269 | { | 250 | { |
| 270 | if (test_and_clear_bit(0, &msg_registered)) | 251 | usb_composite_unregister(&msg_driver); |
| 271 | usb_composite_unregister(&msg_driver); | ||
| 272 | } | 252 | } |
| 273 | module_exit(msg_cleanup); | 253 | module_exit(msg_cleanup); |
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig index 7cd5c969fcbe..1e9567091d86 100644 --- a/drivers/usb/gadget/udc/Kconfig +++ b/drivers/usb/gadget/udc/Kconfig | |||
| @@ -273,6 +273,7 @@ config USB_SNP_CORE | |||
| 273 | config USB_SNP_UDC_PLAT | 273 | config USB_SNP_UDC_PLAT |
| 274 | tristate "Synopsys USB 2.0 Device controller" | 274 | tristate "Synopsys USB 2.0 Device controller" |
| 275 | depends on USB_GADGET && OF && HAS_DMA | 275 | depends on USB_GADGET && OF && HAS_DMA |
| 276 | depends on EXTCON || EXTCON=n | ||
| 276 | select USB_GADGET_DUALSPEED | 277 | select USB_GADGET_DUALSPEED |
| 277 | select USB_SNP_CORE | 278 | select USB_SNP_CORE |
| 278 | default ARCH_BCM_IPROC | 279 | default ARCH_BCM_IPROC |
diff --git a/drivers/usb/gadget/udc/atmel_usba_udc.c b/drivers/usb/gadget/udc/atmel_usba_udc.c index 98d71400f8a1..a884c022df7a 100644 --- a/drivers/usb/gadget/udc/atmel_usba_udc.c +++ b/drivers/usb/gadget/udc/atmel_usba_udc.c | |||
| @@ -29,6 +29,8 @@ | |||
| 29 | #include <linux/of_gpio.h> | 29 | #include <linux/of_gpio.h> |
| 30 | 30 | ||
| 31 | #include "atmel_usba_udc.h" | 31 | #include "atmel_usba_udc.h" |
| 32 | #define USBA_VBUS_IRQFLAGS (IRQF_ONESHOT \ | ||
| 33 | | IRQF_TRIGGER_FALLING | IRQF_TRIGGER_RISING) | ||
| 32 | 34 | ||
| 33 | #ifdef CONFIG_USB_GADGET_DEBUG_FS | 35 | #ifdef CONFIG_USB_GADGET_DEBUG_FS |
| 34 | #include <linux/debugfs.h> | 36 | #include <linux/debugfs.h> |
| @@ -2361,7 +2363,7 @@ static int usba_udc_probe(struct platform_device *pdev) | |||
| 2361 | IRQ_NOAUTOEN); | 2363 | IRQ_NOAUTOEN); |
| 2362 | ret = devm_request_threaded_irq(&pdev->dev, | 2364 | ret = devm_request_threaded_irq(&pdev->dev, |
| 2363 | gpio_to_irq(udc->vbus_pin), NULL, | 2365 | gpio_to_irq(udc->vbus_pin), NULL, |
| 2364 | usba_vbus_irq_thread, IRQF_ONESHOT, | 2366 | usba_vbus_irq_thread, USBA_VBUS_IRQFLAGS, |
| 2365 | "atmel_usba_udc", udc); | 2367 | "atmel_usba_udc", udc); |
| 2366 | if (ret) { | 2368 | if (ret) { |
| 2367 | udc->vbus_pin = -ENODEV; | 2369 | udc->vbus_pin = -ENODEV; |
diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c index 75c51ca4ee0f..d41d07aae0ce 100644 --- a/drivers/usb/gadget/udc/core.c +++ b/drivers/usb/gadget/udc/core.c | |||
| @@ -1320,8 +1320,7 @@ static int udc_bind_to_driver(struct usb_udc *udc, struct usb_gadget_driver *dri | |||
| 1320 | udc->dev.driver = &driver->driver; | 1320 | udc->dev.driver = &driver->driver; |
| 1321 | udc->gadget->dev.driver = &driver->driver; | 1321 | udc->gadget->dev.driver = &driver->driver; |
| 1322 | 1322 | ||
| 1323 | if (driver->max_speed < udc->gadget->max_speed) | 1323 | usb_gadget_udc_set_speed(udc, driver->max_speed); |
| 1324 | usb_gadget_udc_set_speed(udc, driver->max_speed); | ||
| 1325 | 1324 | ||
| 1326 | ret = driver->bind(udc->gadget, driver); | 1325 | ret = driver->bind(udc->gadget, driver); |
| 1327 | if (ret) | 1326 | if (ret) |
diff --git a/drivers/usb/gadget/udc/dummy_hcd.c b/drivers/usb/gadget/udc/dummy_hcd.c index a030d7923d7d..b17618a55f1b 100644 --- a/drivers/usb/gadget/udc/dummy_hcd.c +++ b/drivers/usb/gadget/udc/dummy_hcd.c | |||
| @@ -237,6 +237,8 @@ struct dummy_hcd { | |||
| 237 | 237 | ||
| 238 | struct usb_device *udev; | 238 | struct usb_device *udev; |
| 239 | struct list_head urbp_list; | 239 | struct list_head urbp_list; |
| 240 | struct urbp *next_frame_urbp; | ||
| 241 | |||
| 240 | u32 stream_en_ep; | 242 | u32 stream_en_ep; |
| 241 | u8 num_stream[30 / 2]; | 243 | u8 num_stream[30 / 2]; |
| 242 | 244 | ||
| @@ -253,11 +255,13 @@ struct dummy { | |||
| 253 | */ | 255 | */ |
| 254 | struct dummy_ep ep[DUMMY_ENDPOINTS]; | 256 | struct dummy_ep ep[DUMMY_ENDPOINTS]; |
| 255 | int address; | 257 | int address; |
| 258 | int callback_usage; | ||
| 256 | struct usb_gadget gadget; | 259 | struct usb_gadget gadget; |
| 257 | struct usb_gadget_driver *driver; | 260 | struct usb_gadget_driver *driver; |
| 258 | struct dummy_request fifo_req; | 261 | struct dummy_request fifo_req; |
| 259 | u8 fifo_buf[FIFO_SIZE]; | 262 | u8 fifo_buf[FIFO_SIZE]; |
| 260 | u16 devstatus; | 263 | u16 devstatus; |
| 264 | unsigned ints_enabled:1; | ||
| 261 | unsigned udc_suspended:1; | 265 | unsigned udc_suspended:1; |
| 262 | unsigned pullup:1; | 266 | unsigned pullup:1; |
| 263 | 267 | ||
| @@ -375,11 +379,10 @@ static void set_link_state_by_speed(struct dummy_hcd *dum_hcd) | |||
| 375 | USB_PORT_STAT_CONNECTION) == 0) | 379 | USB_PORT_STAT_CONNECTION) == 0) |
| 376 | dum_hcd->port_status |= | 380 | dum_hcd->port_status |= |
| 377 | (USB_PORT_STAT_C_CONNECTION << 16); | 381 | (USB_PORT_STAT_C_CONNECTION << 16); |
| 378 | if ((dum_hcd->port_status & | 382 | if ((dum_hcd->port_status & USB_PORT_STAT_ENABLE) && |
| 379 | USB_PORT_STAT_ENABLE) == 1 && | 383 | (dum_hcd->port_status & |
| 380 | (dum_hcd->port_status & | 384 | USB_PORT_STAT_LINK_STATE) == USB_SS_PORT_LS_U0 && |
| 381 | USB_SS_PORT_LS_U0) == 1 && | 385 | dum_hcd->rh_state != DUMMY_RH_SUSPENDED) |
| 382 | dum_hcd->rh_state != DUMMY_RH_SUSPENDED) | ||
| 383 | dum_hcd->active = 1; | 386 | dum_hcd->active = 1; |
| 384 | } | 387 | } |
| 385 | } else { | 388 | } else { |
| @@ -440,18 +443,27 @@ static void set_link_state(struct dummy_hcd *dum_hcd) | |||
| 440 | (~dum_hcd->old_status) & dum_hcd->port_status; | 443 | (~dum_hcd->old_status) & dum_hcd->port_status; |
| 441 | 444 | ||
| 442 | /* Report reset and disconnect events to the driver */ | 445 | /* Report reset and disconnect events to the driver */ |
| 443 | if (dum->driver && (disconnect || reset)) { | 446 | if (dum->ints_enabled && (disconnect || reset)) { |
| 444 | stop_activity(dum); | 447 | stop_activity(dum); |
| 448 | ++dum->callback_usage; | ||
| 449 | spin_unlock(&dum->lock); | ||
| 445 | if (reset) | 450 | if (reset) |
| 446 | usb_gadget_udc_reset(&dum->gadget, dum->driver); | 451 | usb_gadget_udc_reset(&dum->gadget, dum->driver); |
| 447 | else | 452 | else |
| 448 | dum->driver->disconnect(&dum->gadget); | 453 | dum->driver->disconnect(&dum->gadget); |
| 454 | spin_lock(&dum->lock); | ||
| 455 | --dum->callback_usage; | ||
| 449 | } | 456 | } |
| 450 | } else if (dum_hcd->active != dum_hcd->old_active) { | 457 | } else if (dum_hcd->active != dum_hcd->old_active && |
| 458 | dum->ints_enabled) { | ||
| 459 | ++dum->callback_usage; | ||
| 460 | spin_unlock(&dum->lock); | ||
| 451 | if (dum_hcd->old_active && dum->driver->suspend) | 461 | if (dum_hcd->old_active && dum->driver->suspend) |
| 452 | dum->driver->suspend(&dum->gadget); | 462 | dum->driver->suspend(&dum->gadget); |
| 453 | else if (!dum_hcd->old_active && dum->driver->resume) | 463 | else if (!dum_hcd->old_active && dum->driver->resume) |
| 454 | dum->driver->resume(&dum->gadget); | 464 | dum->driver->resume(&dum->gadget); |
| 465 | spin_lock(&dum->lock); | ||
| 466 | --dum->callback_usage; | ||
| 455 | } | 467 | } |
| 456 | 468 | ||
| 457 | dum_hcd->old_status = dum_hcd->port_status; | 469 | dum_hcd->old_status = dum_hcd->port_status; |
| @@ -972,8 +984,11 @@ static int dummy_udc_start(struct usb_gadget *g, | |||
| 972 | * can't enumerate without help from the driver we're binding. | 984 | * can't enumerate without help from the driver we're binding. |
| 973 | */ | 985 | */ |
| 974 | 986 | ||
| 987 | spin_lock_irq(&dum->lock); | ||
| 975 | dum->devstatus = 0; | 988 | dum->devstatus = 0; |
| 976 | dum->driver = driver; | 989 | dum->driver = driver; |
| 990 | dum->ints_enabled = 1; | ||
| 991 | spin_unlock_irq(&dum->lock); | ||
| 977 | 992 | ||
| 978 | return 0; | 993 | return 0; |
| 979 | } | 994 | } |
| @@ -984,6 +999,16 @@ static int dummy_udc_stop(struct usb_gadget *g) | |||
| 984 | struct dummy *dum = dum_hcd->dum; | 999 | struct dummy *dum = dum_hcd->dum; |
| 985 | 1000 | ||
| 986 | spin_lock_irq(&dum->lock); | 1001 | spin_lock_irq(&dum->lock); |
| 1002 | dum->ints_enabled = 0; | ||
| 1003 | stop_activity(dum); | ||
| 1004 | |||
| 1005 | /* emulate synchronize_irq(): wait for callbacks to finish */ | ||
| 1006 | while (dum->callback_usage > 0) { | ||
| 1007 | spin_unlock_irq(&dum->lock); | ||
| 1008 | usleep_range(1000, 2000); | ||
| 1009 | spin_lock_irq(&dum->lock); | ||
| 1010 | } | ||
| 1011 | |||
| 987 | dum->driver = NULL; | 1012 | dum->driver = NULL; |
| 988 | spin_unlock_irq(&dum->lock); | 1013 | spin_unlock_irq(&dum->lock); |
| 989 | 1014 | ||
| @@ -1037,7 +1062,12 @@ static int dummy_udc_probe(struct platform_device *pdev) | |||
| 1037 | memzero_explicit(&dum->gadget, sizeof(struct usb_gadget)); | 1062 | memzero_explicit(&dum->gadget, sizeof(struct usb_gadget)); |
| 1038 | dum->gadget.name = gadget_name; | 1063 | dum->gadget.name = gadget_name; |
| 1039 | dum->gadget.ops = &dummy_ops; | 1064 | dum->gadget.ops = &dummy_ops; |
| 1040 | dum->gadget.max_speed = USB_SPEED_SUPER; | 1065 | if (mod_data.is_super_speed) |
| 1066 | dum->gadget.max_speed = USB_SPEED_SUPER; | ||
| 1067 | else if (mod_data.is_high_speed) | ||
| 1068 | dum->gadget.max_speed = USB_SPEED_HIGH; | ||
| 1069 | else | ||
| 1070 | dum->gadget.max_speed = USB_SPEED_FULL; | ||
| 1041 | 1071 | ||
| 1042 | dum->gadget.dev.parent = &pdev->dev; | 1072 | dum->gadget.dev.parent = &pdev->dev; |
| 1043 | init_dummy_udc_hw(dum); | 1073 | init_dummy_udc_hw(dum); |
| @@ -1246,6 +1276,8 @@ static int dummy_urb_enqueue( | |||
| 1246 | 1276 | ||
| 1247 | list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list); | 1277 | list_add_tail(&urbp->urbp_list, &dum_hcd->urbp_list); |
| 1248 | urb->hcpriv = urbp; | 1278 | urb->hcpriv = urbp; |
| 1279 | if (!dum_hcd->next_frame_urbp) | ||
| 1280 | dum_hcd->next_frame_urbp = urbp; | ||
| 1249 | if (usb_pipetype(urb->pipe) == PIPE_CONTROL) | 1281 | if (usb_pipetype(urb->pipe) == PIPE_CONTROL) |
| 1250 | urb->error_count = 1; /* mark as a new urb */ | 1282 | urb->error_count = 1; /* mark as a new urb */ |
| 1251 | 1283 | ||
| @@ -1521,6 +1553,8 @@ static struct dummy_ep *find_endpoint(struct dummy *dum, u8 address) | |||
| 1521 | if (!is_active((dum->gadget.speed == USB_SPEED_SUPER ? | 1553 | if (!is_active((dum->gadget.speed == USB_SPEED_SUPER ? |
| 1522 | dum->ss_hcd : dum->hs_hcd))) | 1554 | dum->ss_hcd : dum->hs_hcd))) |
| 1523 | return NULL; | 1555 | return NULL; |
| 1556 | if (!dum->ints_enabled) | ||
| 1557 | return NULL; | ||
| 1524 | if ((address & ~USB_DIR_IN) == 0) | 1558 | if ((address & ~USB_DIR_IN) == 0) |
| 1525 | return &dum->ep[0]; | 1559 | return &dum->ep[0]; |
| 1526 | for (i = 1; i < DUMMY_ENDPOINTS; i++) { | 1560 | for (i = 1; i < DUMMY_ENDPOINTS; i++) { |
| @@ -1762,6 +1796,7 @@ static void dummy_timer(unsigned long _dum_hcd) | |||
| 1762 | spin_unlock_irqrestore(&dum->lock, flags); | 1796 | spin_unlock_irqrestore(&dum->lock, flags); |
| 1763 | return; | 1797 | return; |
| 1764 | } | 1798 | } |
| 1799 | dum_hcd->next_frame_urbp = NULL; | ||
| 1765 | 1800 | ||
| 1766 | for (i = 0; i < DUMMY_ENDPOINTS; i++) { | 1801 | for (i = 0; i < DUMMY_ENDPOINTS; i++) { |
| 1767 | if (!ep_info[i].name) | 1802 | if (!ep_info[i].name) |
| @@ -1778,6 +1813,10 @@ restart: | |||
| 1778 | int type; | 1813 | int type; |
| 1779 | int status = -EINPROGRESS; | 1814 | int status = -EINPROGRESS; |
| 1780 | 1815 | ||
| 1816 | /* stop when we reach URBs queued after the timer interrupt */ | ||
| 1817 | if (urbp == dum_hcd->next_frame_urbp) | ||
| 1818 | break; | ||
| 1819 | |||
| 1781 | urb = urbp->urb; | 1820 | urb = urbp->urb; |
| 1782 | if (urb->unlinked) | 1821 | if (urb->unlinked) |
| 1783 | goto return_urb; | 1822 | goto return_urb; |
| @@ -1857,10 +1896,12 @@ restart: | |||
| 1857 | * until setup() returns; no reentrancy issues etc. | 1896 | * until setup() returns; no reentrancy issues etc. |
| 1858 | */ | 1897 | */ |
| 1859 | if (value > 0) { | 1898 | if (value > 0) { |
| 1899 | ++dum->callback_usage; | ||
| 1860 | spin_unlock(&dum->lock); | 1900 | spin_unlock(&dum->lock); |
| 1861 | value = dum->driver->setup(&dum->gadget, | 1901 | value = dum->driver->setup(&dum->gadget, |
| 1862 | &setup); | 1902 | &setup); |
| 1863 | spin_lock(&dum->lock); | 1903 | spin_lock(&dum->lock); |
| 1904 | --dum->callback_usage; | ||
| 1864 | 1905 | ||
| 1865 | if (value >= 0) { | 1906 | if (value >= 0) { |
| 1866 | /* no delays (max 64KB data stage) */ | 1907 | /* no delays (max 64KB data stage) */ |
| @@ -2561,8 +2602,6 @@ static struct hc_driver dummy_hcd = { | |||
| 2561 | .product_desc = "Dummy host controller", | 2602 | .product_desc = "Dummy host controller", |
| 2562 | .hcd_priv_size = sizeof(struct dummy_hcd), | 2603 | .hcd_priv_size = sizeof(struct dummy_hcd), |
| 2563 | 2604 | ||
| 2564 | .flags = HCD_USB3 | HCD_SHARED, | ||
| 2565 | |||
| 2566 | .reset = dummy_setup, | 2605 | .reset = dummy_setup, |
| 2567 | .start = dummy_start, | 2606 | .start = dummy_start, |
| 2568 | .stop = dummy_stop, | 2607 | .stop = dummy_stop, |
| @@ -2591,8 +2630,12 @@ static int dummy_hcd_probe(struct platform_device *pdev) | |||
| 2591 | dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc); | 2630 | dev_info(&pdev->dev, "%s, driver " DRIVER_VERSION "\n", driver_desc); |
| 2592 | dum = *((void **)dev_get_platdata(&pdev->dev)); | 2631 | dum = *((void **)dev_get_platdata(&pdev->dev)); |
| 2593 | 2632 | ||
| 2594 | if (!mod_data.is_super_speed) | 2633 | if (mod_data.is_super_speed) |
| 2634 | dummy_hcd.flags = HCD_USB3 | HCD_SHARED; | ||
| 2635 | else if (mod_data.is_high_speed) | ||
| 2595 | dummy_hcd.flags = HCD_USB2; | 2636 | dummy_hcd.flags = HCD_USB2; |
| 2637 | else | ||
| 2638 | dummy_hcd.flags = HCD_USB11; | ||
| 2596 | hs_hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev)); | 2639 | hs_hcd = usb_create_hcd(&dummy_hcd, &pdev->dev, dev_name(&pdev->dev)); |
| 2597 | if (!hs_hcd) | 2640 | if (!hs_hcd) |
| 2598 | return -ENOMEM; | 2641 | return -ENOMEM; |
diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index df37c1e6e9d5..63a206122058 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c | |||
| @@ -1038,7 +1038,7 @@ static int usb3_write_pipe(struct renesas_usb3_ep *usb3_ep, | |||
| 1038 | usb3_ep->ep.maxpacket); | 1038 | usb3_ep->ep.maxpacket); |
| 1039 | u8 *buf = usb3_req->req.buf + usb3_req->req.actual; | 1039 | u8 *buf = usb3_req->req.buf + usb3_req->req.actual; |
| 1040 | u32 tmp = 0; | 1040 | u32 tmp = 0; |
| 1041 | bool is_last; | 1041 | bool is_last = !len ? true : false; |
| 1042 | 1042 | ||
| 1043 | if (usb3_wait_pipe_status(usb3_ep, PX_STA_BUFSTS) < 0) | 1043 | if (usb3_wait_pipe_status(usb3_ep, PX_STA_BUFSTS) < 0) |
| 1044 | return -EBUSY; | 1044 | return -EBUSY; |
| @@ -1059,7 +1059,8 @@ static int usb3_write_pipe(struct renesas_usb3_ep *usb3_ep, | |||
| 1059 | usb3_write(usb3, tmp, fifo_reg); | 1059 | usb3_write(usb3, tmp, fifo_reg); |
| 1060 | } | 1060 | } |
| 1061 | 1061 | ||
| 1062 | is_last = usb3_is_transfer_complete(usb3_ep, usb3_req); | 1062 | if (!is_last) |
| 1063 | is_last = usb3_is_transfer_complete(usb3_ep, usb3_req); | ||
| 1063 | /* Send the data */ | 1064 | /* Send the data */ |
| 1064 | usb3_set_px_con_send(usb3_ep, len, is_last); | 1065 | usb3_set_px_con_send(usb3_ep, len, is_last); |
| 1065 | 1066 | ||
| @@ -1150,7 +1151,8 @@ static void usb3_start_pipe0(struct renesas_usb3_ep *usb3_ep, | |||
| 1150 | usb3_set_p0_con_for_ctrl_read_data(usb3); | 1151 | usb3_set_p0_con_for_ctrl_read_data(usb3); |
| 1151 | } else { | 1152 | } else { |
| 1152 | usb3_clear_bit(usb3, P0_MOD_DIR, USB3_P0_MOD); | 1153 | usb3_clear_bit(usb3, P0_MOD_DIR, USB3_P0_MOD); |
| 1153 | usb3_set_p0_con_for_ctrl_write_data(usb3); | 1154 | if (usb3_req->req.length) |
| 1155 | usb3_set_p0_con_for_ctrl_write_data(usb3); | ||
| 1154 | } | 1156 | } |
| 1155 | 1157 | ||
| 1156 | usb3_p0_xfer(usb3_ep, usb3_req); | 1158 | usb3_p0_xfer(usb3_ep, usb3_req); |
| @@ -2053,7 +2055,16 @@ static u32 usb3_calc_ramarea(int ram_size) | |||
| 2053 | static u32 usb3_calc_rammap_val(struct renesas_usb3_ep *usb3_ep, | 2055 | static u32 usb3_calc_rammap_val(struct renesas_usb3_ep *usb3_ep, |
| 2054 | const struct usb_endpoint_descriptor *desc) | 2056 | const struct usb_endpoint_descriptor *desc) |
| 2055 | { | 2057 | { |
| 2056 | return usb3_ep->rammap_val | PN_RAMMAP_MPKT(usb_endpoint_maxp(desc)); | 2058 | int i; |
| 2059 | const u32 max_packet_array[] = {8, 16, 32, 64, 512}; | ||
| 2060 | u32 mpkt = PN_RAMMAP_MPKT(1024); | ||
| 2061 | |||
| 2062 | for (i = 0; i < ARRAY_SIZE(max_packet_array); i++) { | ||
| 2063 | if (usb_endpoint_maxp(desc) <= max_packet_array[i]) | ||
| 2064 | mpkt = PN_RAMMAP_MPKT(max_packet_array[i]); | ||
| 2065 | } | ||
| 2066 | |||
| 2067 | return usb3_ep->rammap_val | mpkt; | ||
| 2057 | } | 2068 | } |
| 2058 | 2069 | ||
| 2059 | static int usb3_enable_pipe_n(struct renesas_usb3_ep *usb3_ep, | 2070 | static int usb3_enable_pipe_n(struct renesas_usb3_ep *usb3_ep, |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index 658d9d1f9ea3..6dda3623a276 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
| @@ -447,7 +447,7 @@ static int usb_asmedia_wait_write(struct pci_dev *pdev) | |||
| 447 | if ((value & ASMT_CONTROL_WRITE_BIT) == 0) | 447 | if ((value & ASMT_CONTROL_WRITE_BIT) == 0) |
| 448 | return 0; | 448 | return 0; |
| 449 | 449 | ||
| 450 | usleep_range(40, 60); | 450 | udelay(50); |
| 451 | } | 451 | } |
| 452 | 452 | ||
| 453 | dev_warn(&pdev->dev, "%s: check_write_ready timeout", __func__); | 453 | dev_warn(&pdev->dev, "%s: check_write_ready timeout", __func__); |
| @@ -1022,7 +1022,7 @@ EXPORT_SYMBOL_GPL(usb_disable_xhci_ports); | |||
| 1022 | * | 1022 | * |
| 1023 | * Takes care of the handoff between the Pre-OS (i.e. BIOS) and the OS. | 1023 | * Takes care of the handoff between the Pre-OS (i.e. BIOS) and the OS. |
| 1024 | * It signals to the BIOS that the OS wants control of the host controller, | 1024 | * It signals to the BIOS that the OS wants control of the host controller, |
| 1025 | * and then waits 5 seconds for the BIOS to hand over control. | 1025 | * and then waits 1 second for the BIOS to hand over control. |
| 1026 | * If we timeout, assume the BIOS is broken and take control anyway. | 1026 | * If we timeout, assume the BIOS is broken and take control anyway. |
| 1027 | */ | 1027 | */ |
| 1028 | static void quirk_usb_handoff_xhci(struct pci_dev *pdev) | 1028 | static void quirk_usb_handoff_xhci(struct pci_dev *pdev) |
| @@ -1069,9 +1069,9 @@ static void quirk_usb_handoff_xhci(struct pci_dev *pdev) | |||
| 1069 | if (val & XHCI_HC_BIOS_OWNED) { | 1069 | if (val & XHCI_HC_BIOS_OWNED) { |
| 1070 | writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset); | 1070 | writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset); |
| 1071 | 1071 | ||
| 1072 | /* Wait for 5 seconds with 10 microsecond polling interval */ | 1072 | /* Wait for 1 second with 10 microsecond polling interval */ |
| 1073 | timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED, | 1073 | timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED, |
| 1074 | 0, 5000, 10); | 1074 | 0, 1000000, 10); |
| 1075 | 1075 | ||
| 1076 | /* Assume a buggy BIOS and take HC ownership anyway */ | 1076 | /* Assume a buggy BIOS and take HC ownership anyway */ |
| 1077 | if (timeout) { | 1077 | if (timeout) { |
| @@ -1100,7 +1100,7 @@ hc_init: | |||
| 1100 | * operational or runtime registers. Wait 5 seconds and no more. | 1100 | * operational or runtime registers. Wait 5 seconds and no more. |
| 1101 | */ | 1101 | */ |
| 1102 | timeout = handshake(op_reg_base + XHCI_STS_OFFSET, XHCI_STS_CNR, 0, | 1102 | timeout = handshake(op_reg_base + XHCI_STS_OFFSET, XHCI_STS_CNR, 0, |
| 1103 | 5000, 10); | 1103 | 5000000, 10); |
| 1104 | /* Assume a buggy HC and start HC initialization anyway */ | 1104 | /* Assume a buggy HC and start HC initialization anyway */ |
| 1105 | if (timeout) { | 1105 | if (timeout) { |
| 1106 | val = readl(op_reg_base + XHCI_STS_OFFSET); | 1106 | val = readl(op_reg_base + XHCI_STS_OFFSET); |
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index ad89a6d4111b..da9158f171cb 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
| @@ -112,7 +112,7 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, | |||
| 112 | 112 | ||
| 113 | /* If PSI table exists, add the custom speed attributes from it */ | 113 | /* If PSI table exists, add the custom speed attributes from it */ |
| 114 | if (usb3_1 && xhci->usb3_rhub.psi_count) { | 114 | if (usb3_1 && xhci->usb3_rhub.psi_count) { |
| 115 | u32 ssp_cap_base, bm_attrib, psi; | 115 | u32 ssp_cap_base, bm_attrib, psi, psi_mant, psi_exp; |
| 116 | int offset; | 116 | int offset; |
| 117 | 117 | ||
| 118 | ssp_cap_base = USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE; | 118 | ssp_cap_base = USB_DT_BOS_SIZE + USB_DT_USB_SS_CAP_SIZE; |
| @@ -139,6 +139,15 @@ static int xhci_create_usb3_bos_desc(struct xhci_hcd *xhci, char *buf, | |||
| 139 | for (i = 0; i < xhci->usb3_rhub.psi_count; i++) { | 139 | for (i = 0; i < xhci->usb3_rhub.psi_count; i++) { |
| 140 | psi = xhci->usb3_rhub.psi[i]; | 140 | psi = xhci->usb3_rhub.psi[i]; |
| 141 | psi &= ~USB_SSP_SUBLINK_SPEED_RSVD; | 141 | psi &= ~USB_SSP_SUBLINK_SPEED_RSVD; |
| 142 | psi_exp = XHCI_EXT_PORT_PSIE(psi); | ||
| 143 | psi_mant = XHCI_EXT_PORT_PSIM(psi); | ||
| 144 | |||
| 145 | /* Shift to Gbps and set SSP Link BIT(14) if 10Gpbs */ | ||
| 146 | for (; psi_exp < 3; psi_exp++) | ||
| 147 | psi_mant /= 1000; | ||
| 148 | if (psi_mant >= 10) | ||
| 149 | psi |= BIT(14); | ||
| 150 | |||
| 142 | if ((psi & PLT_MASK) == PLT_SYM) { | 151 | if ((psi & PLT_MASK) == PLT_SYM) { |
| 143 | /* Symmetric, create SSA RX and TX from one PSI entry */ | 152 | /* Symmetric, create SSA RX and TX from one PSI entry */ |
| 144 | put_unaligned_le32(psi, &buf[offset]); | 153 | put_unaligned_le32(psi, &buf[offset]); |
| @@ -1506,9 +1515,6 @@ int xhci_bus_suspend(struct usb_hcd *hcd) | |||
| 1506 | t2 |= PORT_WKOC_E | PORT_WKCONN_E; | 1515 | t2 |= PORT_WKOC_E | PORT_WKCONN_E; |
| 1507 | t2 &= ~PORT_WKDISC_E; | 1516 | t2 &= ~PORT_WKDISC_E; |
| 1508 | } | 1517 | } |
| 1509 | if ((xhci->quirks & XHCI_U2_DISABLE_WAKE) && | ||
| 1510 | (hcd->speed < HCD_USB3)) | ||
| 1511 | t2 &= ~PORT_WAKE_BITS; | ||
| 1512 | } else | 1518 | } else |
| 1513 | t2 &= ~PORT_WAKE_BITS; | 1519 | t2 &= ~PORT_WAKE_BITS; |
| 1514 | 1520 | ||
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 8071c8fdd15e..76f392954733 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -54,11 +54,6 @@ | |||
| 54 | #define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8 | 54 | #define PCI_DEVICE_ID_INTEL_APL_XHCI 0x5aa8 |
| 55 | #define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0 | 55 | #define PCI_DEVICE_ID_INTEL_DNV_XHCI 0x19d0 |
| 56 | 56 | ||
| 57 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_4 0x43b9 | ||
| 58 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_3 0x43ba | ||
| 59 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb | ||
| 60 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc | ||
| 61 | |||
| 62 | #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 | 57 | #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 |
| 63 | 58 | ||
| 64 | static const char hcd_name[] = "xhci_hcd"; | 59 | static const char hcd_name[] = "xhci_hcd"; |
| @@ -142,13 +137,6 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
| 142 | if (pdev->vendor == PCI_VENDOR_ID_AMD) | 137 | if (pdev->vendor == PCI_VENDOR_ID_AMD) |
| 143 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | 138 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
| 144 | 139 | ||
| 145 | if ((pdev->vendor == PCI_VENDOR_ID_AMD) && | ||
| 146 | ((pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_4) || | ||
| 147 | (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_3) || | ||
| 148 | (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_2) || | ||
| 149 | (pdev->device == PCI_DEVICE_ID_AMD_PROMONTORYA_1))) | ||
| 150 | xhci->quirks |= XHCI_U2_DISABLE_WAKE; | ||
| 151 | |||
| 152 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) { | 140 | if (pdev->vendor == PCI_VENDOR_ID_INTEL) { |
| 153 | xhci->quirks |= XHCI_LPM_SUPPORT; | 141 | xhci->quirks |= XHCI_LPM_SUPPORT; |
| 154 | xhci->quirks |= XHCI_INTEL_HOST; | 142 | xhci->quirks |= XHCI_INTEL_HOST; |
diff --git a/drivers/usb/host/xhci-plat.c b/drivers/usb/host/xhci-plat.c index 163bafde709f..1cb6eaef4ae1 100644 --- a/drivers/usb/host/xhci-plat.c +++ b/drivers/usb/host/xhci-plat.c | |||
| @@ -178,14 +178,18 @@ static int xhci_plat_probe(struct platform_device *pdev) | |||
| 178 | * 2. xhci_plat is child of a device from firmware (dwc3-plat) | 178 | * 2. xhci_plat is child of a device from firmware (dwc3-plat) |
| 179 | * 3. xhci_plat is grandchild of a pci device (dwc3-pci) | 179 | * 3. xhci_plat is grandchild of a pci device (dwc3-pci) |
| 180 | */ | 180 | */ |
| 181 | sysdev = &pdev->dev; | 181 | for (sysdev = &pdev->dev; sysdev; sysdev = sysdev->parent) { |
| 182 | if (sysdev->parent && !sysdev->of_node && sysdev->parent->of_node) | 182 | if (is_of_node(sysdev->fwnode) || |
| 183 | sysdev = sysdev->parent; | 183 | is_acpi_device_node(sysdev->fwnode)) |
| 184 | break; | ||
| 184 | #ifdef CONFIG_PCI | 185 | #ifdef CONFIG_PCI |
| 185 | else if (sysdev->parent && sysdev->parent->parent && | 186 | else if (sysdev->bus == &pci_bus_type) |
| 186 | sysdev->parent->parent->bus == &pci_bus_type) | 187 | break; |
| 187 | sysdev = sysdev->parent->parent; | ||
| 188 | #endif | 188 | #endif |
| 189 | } | ||
| 190 | |||
| 191 | if (!sysdev) | ||
| 192 | sysdev = &pdev->dev; | ||
| 189 | 193 | ||
| 190 | /* Try to set 64-bit DMA first */ | 194 | /* Try to set 64-bit DMA first */ |
| 191 | if (WARN_ON(!sysdev->dma_mask)) | 195 | if (WARN_ON(!sysdev->dma_mask)) |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index b2ff1ff1a02f..ee198ea47f49 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -1703,7 +1703,8 @@ static int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, | |||
| 1703 | if (xhci->quirks & XHCI_MTK_HOST) { | 1703 | if (xhci->quirks & XHCI_MTK_HOST) { |
| 1704 | ret = xhci_mtk_add_ep_quirk(hcd, udev, ep); | 1704 | ret = xhci_mtk_add_ep_quirk(hcd, udev, ep); |
| 1705 | if (ret < 0) { | 1705 | if (ret < 0) { |
| 1706 | xhci_free_endpoint_ring(xhci, virt_dev, ep_index); | 1706 | xhci_ring_free(xhci, virt_dev->eps[ep_index].new_ring); |
| 1707 | virt_dev->eps[ep_index].new_ring = NULL; | ||
| 1707 | return ret; | 1708 | return ret; |
| 1708 | } | 1709 | } |
| 1709 | } | 1710 | } |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 2abaa4d6d39d..2b48aa4f6b76 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -735,6 +735,8 @@ struct xhci_ep_ctx { | |||
| 735 | #define EP_MAXPSTREAMS(p) (((p) << 10) & EP_MAXPSTREAMS_MASK) | 735 | #define EP_MAXPSTREAMS(p) (((p) << 10) & EP_MAXPSTREAMS_MASK) |
| 736 | /* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */ | 736 | /* Endpoint is set up with a Linear Stream Array (vs. Secondary Stream Array) */ |
| 737 | #define EP_HAS_LSA (1 << 15) | 737 | #define EP_HAS_LSA (1 << 15) |
| 738 | /* hosts with LEC=1 use bits 31:24 as ESIT high bits. */ | ||
| 739 | #define CTX_TO_MAX_ESIT_PAYLOAD_HI(p) (((p) >> 24) & 0xff) | ||
| 738 | 740 | ||
| 739 | /* ep_info2 bitmasks */ | 741 | /* ep_info2 bitmasks */ |
| 740 | /* | 742 | /* |
| @@ -1681,7 +1683,7 @@ struct xhci_bus_state { | |||
| 1681 | 1683 | ||
| 1682 | static inline unsigned int hcd_index(struct usb_hcd *hcd) | 1684 | static inline unsigned int hcd_index(struct usb_hcd *hcd) |
| 1683 | { | 1685 | { |
| 1684 | if (hcd->speed == HCD_USB3) | 1686 | if (hcd->speed >= HCD_USB3) |
| 1685 | return 0; | 1687 | return 0; |
| 1686 | else | 1688 | else |
| 1687 | return 1; | 1689 | return 1; |
| @@ -1826,7 +1828,7 @@ struct xhci_hcd { | |||
| 1826 | /* For controller with a broken Port Disable implementation */ | 1828 | /* For controller with a broken Port Disable implementation */ |
| 1827 | #define XHCI_BROKEN_PORT_PED (1 << 25) | 1829 | #define XHCI_BROKEN_PORT_PED (1 << 25) |
| 1828 | #define XHCI_LIMIT_ENDPOINT_INTERVAL_7 (1 << 26) | 1830 | #define XHCI_LIMIT_ENDPOINT_INTERVAL_7 (1 << 26) |
| 1829 | #define XHCI_U2_DISABLE_WAKE (1 << 27) | 1831 | /* Reserved. It was XHCI_U2_DISABLE_WAKE */ |
| 1830 | #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28) | 1832 | #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28) |
| 1831 | 1833 | ||
| 1832 | unsigned int num_active_eps; | 1834 | unsigned int num_active_eps; |
| @@ -2540,8 +2542,8 @@ static inline const char *xhci_decode_ep_context(u32 info, u32 info2, u64 deq, | |||
| 2540 | u8 lsa; | 2542 | u8 lsa; |
| 2541 | u8 hid; | 2543 | u8 hid; |
| 2542 | 2544 | ||
| 2543 | esit = EP_MAX_ESIT_PAYLOAD_HI(info) << 16 | | 2545 | esit = CTX_TO_MAX_ESIT_PAYLOAD_HI(info) << 16 | |
| 2544 | EP_MAX_ESIT_PAYLOAD_LO(tx_info); | 2546 | CTX_TO_MAX_ESIT_PAYLOAD(tx_info); |
| 2545 | 2547 | ||
| 2546 | ep_state = info & EP_STATE_MASK; | 2548 | ep_state = info & EP_STATE_MASK; |
| 2547 | max_pstr = info & EP_MAXPSTREAMS_MASK; | 2549 | max_pstr = info & EP_MAXPSTREAMS_MASK; |
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c index d1af831f43eb..68f26904c316 100644 --- a/drivers/usb/renesas_usbhs/fifo.c +++ b/drivers/usb/renesas_usbhs/fifo.c | |||
| @@ -282,11 +282,26 @@ static void usbhsf_fifo_clear(struct usbhs_pipe *pipe, | |||
| 282 | struct usbhs_fifo *fifo) | 282 | struct usbhs_fifo *fifo) |
| 283 | { | 283 | { |
| 284 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); | 284 | struct usbhs_priv *priv = usbhs_pipe_to_priv(pipe); |
| 285 | int ret = 0; | ||
| 285 | 286 | ||
| 286 | if (!usbhs_pipe_is_dcp(pipe)) | 287 | if (!usbhs_pipe_is_dcp(pipe)) { |
| 287 | usbhsf_fifo_barrier(priv, fifo); | 288 | /* |
| 289 | * This driver checks the pipe condition first to avoid -EBUSY | ||
| 290 | * from usbhsf_fifo_barrier() with about 10 msec delay in | ||
| 291 | * the interrupt handler if the pipe is RX direction and empty. | ||
| 292 | */ | ||
| 293 | if (usbhs_pipe_is_dir_in(pipe)) | ||
| 294 | ret = usbhs_pipe_is_accessible(pipe); | ||
| 295 | if (!ret) | ||
| 296 | ret = usbhsf_fifo_barrier(priv, fifo); | ||
| 297 | } | ||
| 288 | 298 | ||
| 289 | usbhs_write(priv, fifo->ctr, BCLR); | 299 | /* |
| 300 | * if non-DCP pipe, this driver should set BCLR when | ||
| 301 | * usbhsf_fifo_barrier() returns 0. | ||
| 302 | */ | ||
| 303 | if (!ret) | ||
| 304 | usbhs_write(priv, fifo->ctr, BCLR); | ||
| 290 | } | 305 | } |
| 291 | 306 | ||
| 292 | static int usbhsf_fifo_rcv_len(struct usbhs_priv *priv, | 307 | static int usbhsf_fifo_rcv_len(struct usbhs_priv *priv, |
diff --git a/drivers/usb/storage/transport.c b/drivers/usb/storage/transport.c index 1a59f335b063..a3ccb899df60 100644 --- a/drivers/usb/storage/transport.c +++ b/drivers/usb/storage/transport.c | |||
| @@ -834,13 +834,25 @@ Retry_Sense: | |||
| 834 | if (result == USB_STOR_TRANSPORT_GOOD) { | 834 | if (result == USB_STOR_TRANSPORT_GOOD) { |
| 835 | srb->result = SAM_STAT_GOOD; | 835 | srb->result = SAM_STAT_GOOD; |
| 836 | srb->sense_buffer[0] = 0x0; | 836 | srb->sense_buffer[0] = 0x0; |
| 837 | } | ||
| 838 | |||
| 839 | /* | ||
| 840 | * ATA-passthru commands use sense data to report | ||
| 841 | * the command completion status, and often devices | ||
| 842 | * return Check Condition status when nothing is | ||
| 843 | * wrong. | ||
| 844 | */ | ||
| 845 | else if (srb->cmnd[0] == ATA_16 || | ||
| 846 | srb->cmnd[0] == ATA_12) { | ||
| 847 | /* leave the data alone */ | ||
| 848 | } | ||
| 837 | 849 | ||
| 838 | /* | 850 | /* |
| 839 | * If there was a problem, report an unspecified | 851 | * If there was a problem, report an unspecified |
| 840 | * hardware error to prevent the higher layers from | 852 | * hardware error to prevent the higher layers from |
| 841 | * entering an infinite retry loop. | 853 | * entering an infinite retry loop. |
| 842 | */ | 854 | */ |
| 843 | } else { | 855 | else { |
| 844 | srb->result = DID_ERROR << 16; | 856 | srb->result = DID_ERROR << 16; |
| 845 | if ((sshdr.response_code & 0x72) == 0x72) | 857 | if ((sshdr.response_code & 0x72) == 0x72) |
| 846 | srb->sense_buffer[1] = HARDWARE_ERROR; | 858 | srb->sense_buffer[1] = HARDWARE_ERROR; |
diff --git a/drivers/usb/storage/uas-detect.h b/drivers/usb/storage/uas-detect.h index f58caa9e6a27..a155cd02bce2 100644 --- a/drivers/usb/storage/uas-detect.h +++ b/drivers/usb/storage/uas-detect.h | |||
| @@ -9,7 +9,8 @@ static int uas_is_interface(struct usb_host_interface *intf) | |||
| 9 | intf->desc.bInterfaceProtocol == USB_PR_UAS); | 9 | intf->desc.bInterfaceProtocol == USB_PR_UAS); |
| 10 | } | 10 | } |
| 11 | 11 | ||
| 12 | static int uas_find_uas_alt_setting(struct usb_interface *intf) | 12 | static struct usb_host_interface *uas_find_uas_alt_setting( |
| 13 | struct usb_interface *intf) | ||
| 13 | { | 14 | { |
| 14 | int i; | 15 | int i; |
| 15 | 16 | ||
| @@ -17,10 +18,10 @@ static int uas_find_uas_alt_setting(struct usb_interface *intf) | |||
| 17 | struct usb_host_interface *alt = &intf->altsetting[i]; | 18 | struct usb_host_interface *alt = &intf->altsetting[i]; |
| 18 | 19 | ||
| 19 | if (uas_is_interface(alt)) | 20 | if (uas_is_interface(alt)) |
| 20 | return alt->desc.bAlternateSetting; | 21 | return alt; |
| 21 | } | 22 | } |
| 22 | 23 | ||
| 23 | return -ENODEV; | 24 | return NULL; |
| 24 | } | 25 | } |
| 25 | 26 | ||
| 26 | static int uas_find_endpoints(struct usb_host_interface *alt, | 27 | static int uas_find_endpoints(struct usb_host_interface *alt, |
| @@ -58,14 +59,14 @@ static int uas_use_uas_driver(struct usb_interface *intf, | |||
| 58 | struct usb_device *udev = interface_to_usbdev(intf); | 59 | struct usb_device *udev = interface_to_usbdev(intf); |
| 59 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); | 60 | struct usb_hcd *hcd = bus_to_hcd(udev->bus); |
| 60 | unsigned long flags = id->driver_info; | 61 | unsigned long flags = id->driver_info; |
| 61 | int r, alt; | 62 | struct usb_host_interface *alt; |
| 62 | 63 | int r; | |
| 63 | 64 | ||
| 64 | alt = uas_find_uas_alt_setting(intf); | 65 | alt = uas_find_uas_alt_setting(intf); |
| 65 | if (alt < 0) | 66 | if (!alt) |
| 66 | return 0; | 67 | return 0; |
| 67 | 68 | ||
| 68 | r = uas_find_endpoints(&intf->altsetting[alt], eps); | 69 | r = uas_find_endpoints(alt, eps); |
| 69 | if (r < 0) | 70 | if (r < 0) |
| 70 | return 0; | 71 | return 0; |
| 71 | 72 | ||
diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c index cfb1e3bbd434..63cf981ed81c 100644 --- a/drivers/usb/storage/uas.c +++ b/drivers/usb/storage/uas.c | |||
| @@ -873,14 +873,14 @@ MODULE_DEVICE_TABLE(usb, uas_usb_ids); | |||
| 873 | static int uas_switch_interface(struct usb_device *udev, | 873 | static int uas_switch_interface(struct usb_device *udev, |
| 874 | struct usb_interface *intf) | 874 | struct usb_interface *intf) |
| 875 | { | 875 | { |
| 876 | int alt; | 876 | struct usb_host_interface *alt; |
| 877 | 877 | ||
| 878 | alt = uas_find_uas_alt_setting(intf); | 878 | alt = uas_find_uas_alt_setting(intf); |
| 879 | if (alt < 0) | 879 | if (!alt) |
| 880 | return alt; | 880 | return -ENODEV; |
| 881 | 881 | ||
| 882 | return usb_set_interface(udev, | 882 | return usb_set_interface(udev, alt->desc.bInterfaceNumber, |
| 883 | intf->altsetting[0].desc.bInterfaceNumber, alt); | 883 | alt->desc.bAlternateSetting); |
| 884 | } | 884 | } |
| 885 | 885 | ||
| 886 | static int uas_configure_endpoints(struct uas_dev_info *devinfo) | 886 | static int uas_configure_endpoints(struct uas_dev_info *devinfo) |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 5a70c33ef0e0..eb06d88b41d6 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -1459,6 +1459,13 @@ UNUSUAL_DEV( 0x0bc2, 0x3010, 0x0000, 0x0000, | |||
| 1459 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 1459 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 1460 | US_FL_SANE_SENSE ), | 1460 | US_FL_SANE_SENSE ), |
| 1461 | 1461 | ||
| 1462 | /* Reported by Kris Lindgren <kris.lindgren@gmail.com> */ | ||
| 1463 | UNUSUAL_DEV( 0x0bc2, 0x3332, 0x0000, 0x9999, | ||
| 1464 | "Seagate", | ||
| 1465 | "External", | ||
| 1466 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 1467 | US_FL_NO_WP_DETECT ), | ||
| 1468 | |||
| 1462 | UNUSUAL_DEV( 0x0d49, 0x7310, 0x0000, 0x9999, | 1469 | UNUSUAL_DEV( 0x0d49, 0x7310, 0x0000, 0x9999, |
| 1463 | "Maxtor", | 1470 | "Maxtor", |
| 1464 | "USB to SATA", | 1471 | "USB to SATA", |
