diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/usb/class/cdc-acm.c | 3 | ||||
| -rw-r--r-- | drivers/usb/dwc2/gadget.c | 3 | ||||
| -rw-r--r-- | drivers/usb/dwc3/core.c | 6 | ||||
| -rw-r--r-- | drivers/usb/dwc3/dwc3-omap.c | 18 | ||||
| -rw-r--r-- | drivers/usb/dwc3/gadget.c | 8 | ||||
| -rw-r--r-- | drivers/usb/gadget/function/f_mass_storage.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/function/f_uac1.c | 20 | ||||
| -rw-r--r-- | drivers/usb/gadget/function/f_uac2.c | 25 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/Kconfig | 5 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/renesas_usb3.c | 14 | ||||
| -rw-r--r-- | drivers/usb/gadget/udc/snps_udc_plat.c | 6 | ||||
| -rw-r--r-- | drivers/usb/host/pci-quirks.c | 54 | ||||
| -rw-r--r-- | drivers/usb/host/pci-quirks.h | 2 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-hub.c | 14 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-pci.c | 6 | ||||
| -rw-r--r-- | drivers/usb/host/xhci-ring.c | 11 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.c | 10 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.h | 1 | ||||
| -rw-r--r-- | drivers/usb/renesas_usbhs/common.c | 4 | ||||
| -rw-r--r-- | drivers/usb/renesas_usbhs/mod_gadget.c | 31 | ||||
| -rw-r--r-- | drivers/usb/storage/isd200.c | 5 | ||||
| -rw-r--r-- | drivers/usb/typec/ucsi/ucsi.h | 1 |
22 files changed, 187 insertions, 62 deletions
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 5357d83bbda2..5e056064259c 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
| @@ -1829,6 +1829,9 @@ static const struct usb_device_id acm_ids[] = { | |||
| 1829 | { USB_DEVICE(0x1576, 0x03b1), /* Maretron USB100 */ | 1829 | { USB_DEVICE(0x1576, 0x03b1), /* Maretron USB100 */ |
| 1830 | .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ | 1830 | .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ |
| 1831 | }, | 1831 | }, |
| 1832 | { USB_DEVICE(0xfff0, 0x0100), /* DATECS FP-2000 */ | ||
| 1833 | .driver_info = NO_UNION_NORMAL, /* reports zero length descriptor */ | ||
| 1834 | }, | ||
| 1832 | 1835 | ||
| 1833 | { USB_DEVICE(0x2912, 0x0001), /* ATOL FPrint */ | 1836 | { USB_DEVICE(0x2912, 0x0001), /* ATOL FPrint */ |
| 1834 | .driver_info = CLEAR_HALT_CONDITIONS, | 1837 | .driver_info = CLEAR_HALT_CONDITIONS, |
diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c index bc3b3fda5000..c4066cd77e47 100644 --- a/drivers/usb/dwc2/gadget.c +++ b/drivers/usb/dwc2/gadget.c | |||
| @@ -3573,6 +3573,9 @@ irq_retry: | |||
| 3573 | /* Report disconnection if it is not already done. */ | 3573 | /* Report disconnection if it is not already done. */ |
| 3574 | dwc2_hsotg_disconnect(hsotg); | 3574 | dwc2_hsotg_disconnect(hsotg); |
| 3575 | 3575 | ||
| 3576 | /* Reset device address to zero */ | ||
| 3577 | __bic32(hsotg->regs + DCFG, DCFG_DEVADDR_MASK); | ||
| 3578 | |||
| 3576 | if (usb_status & GOTGCTL_BSESVLD && connected) | 3579 | if (usb_status & GOTGCTL_BSESVLD && connected) |
| 3577 | dwc2_hsotg_core_init_disconnected(hsotg, true); | 3580 | dwc2_hsotg_core_init_disconnected(hsotg, true); |
| 3578 | } | 3581 | } |
diff --git a/drivers/usb/dwc3/core.c b/drivers/usb/dwc3/core.c index 326b302fc440..03474d3575ab 100644 --- a/drivers/usb/dwc3/core.c +++ b/drivers/usb/dwc3/core.c | |||
| @@ -766,15 +766,15 @@ static int dwc3_core_init(struct dwc3 *dwc) | |||
| 766 | dwc->maximum_speed = USB_SPEED_HIGH; | 766 | dwc->maximum_speed = USB_SPEED_HIGH; |
| 767 | } | 767 | } |
| 768 | 768 | ||
| 769 | ret = dwc3_core_soft_reset(dwc); | 769 | ret = dwc3_core_get_phy(dwc); |
| 770 | if (ret) | 770 | if (ret) |
| 771 | goto err0; | 771 | goto err0; |
| 772 | 772 | ||
| 773 | ret = dwc3_phy_setup(dwc); | 773 | ret = dwc3_core_soft_reset(dwc); |
| 774 | if (ret) | 774 | if (ret) |
| 775 | goto err0; | 775 | goto err0; |
| 776 | 776 | ||
| 777 | ret = dwc3_core_get_phy(dwc); | 777 | ret = dwc3_phy_setup(dwc); |
| 778 | if (ret) | 778 | if (ret) |
| 779 | goto err0; | 779 | goto err0; |
| 780 | 780 | ||
diff --git a/drivers/usb/dwc3/dwc3-omap.c b/drivers/usb/dwc3/dwc3-omap.c index 98926504b55b..f5aaa0cf3873 100644 --- a/drivers/usb/dwc3/dwc3-omap.c +++ b/drivers/usb/dwc3/dwc3-omap.c | |||
| @@ -512,15 +512,6 @@ static int dwc3_omap_probe(struct platform_device *pdev) | |||
| 512 | 512 | ||
| 513 | /* check the DMA Status */ | 513 | /* check the DMA Status */ |
| 514 | reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG); | 514 | reg = dwc3_omap_readl(omap->base, USBOTGSS_SYSCONFIG); |
| 515 | irq_set_status_flags(omap->irq, IRQ_NOAUTOEN); | ||
| 516 | ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, | ||
| 517 | dwc3_omap_interrupt_thread, IRQF_SHARED, | ||
| 518 | "dwc3-omap", omap); | ||
| 519 | if (ret) { | ||
| 520 | dev_err(dev, "failed to request IRQ #%d --> %d\n", | ||
| 521 | omap->irq, ret); | ||
| 522 | goto err1; | ||
| 523 | } | ||
| 524 | 515 | ||
| 525 | ret = dwc3_omap_extcon_register(omap); | 516 | ret = dwc3_omap_extcon_register(omap); |
| 526 | if (ret < 0) | 517 | if (ret < 0) |
| @@ -532,8 +523,15 @@ static int dwc3_omap_probe(struct platform_device *pdev) | |||
| 532 | goto err1; | 523 | goto err1; |
| 533 | } | 524 | } |
| 534 | 525 | ||
| 526 | ret = devm_request_threaded_irq(dev, omap->irq, dwc3_omap_interrupt, | ||
| 527 | dwc3_omap_interrupt_thread, IRQF_SHARED, | ||
| 528 | "dwc3-omap", omap); | ||
| 529 | if (ret) { | ||
| 530 | dev_err(dev, "failed to request IRQ #%d --> %d\n", | ||
| 531 | omap->irq, ret); | ||
| 532 | goto err1; | ||
| 533 | } | ||
| 535 | dwc3_omap_enable_irqs(omap); | 534 | dwc3_omap_enable_irqs(omap); |
| 536 | enable_irq(omap->irq); | ||
| 537 | return 0; | 535 | return 0; |
| 538 | 536 | ||
| 539 | err1: | 537 | err1: |
diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c index 9e41605a276b..6b299c7b7656 100644 --- a/drivers/usb/dwc3/gadget.c +++ b/drivers/usb/dwc3/gadget.c | |||
| @@ -191,14 +191,16 @@ void dwc3_gadget_giveback(struct dwc3_ep *dep, struct dwc3_request *req, | |||
| 191 | 191 | ||
| 192 | req->started = false; | 192 | req->started = false; |
| 193 | list_del(&req->list); | 193 | list_del(&req->list); |
| 194 | req->trb = NULL; | ||
| 195 | req->remaining = 0; | 194 | req->remaining = 0; |
| 196 | 195 | ||
| 197 | if (req->request.status == -EINPROGRESS) | 196 | if (req->request.status == -EINPROGRESS) |
| 198 | req->request.status = status; | 197 | req->request.status = status; |
| 199 | 198 | ||
| 200 | usb_gadget_unmap_request_by_dev(dwc->sysdev, | 199 | if (req->trb) |
| 201 | &req->request, req->direction); | 200 | usb_gadget_unmap_request_by_dev(dwc->sysdev, |
| 201 | &req->request, req->direction); | ||
| 202 | |||
| 203 | req->trb = NULL; | ||
| 202 | 204 | ||
| 203 | trace_dwc3_gadget_giveback(req); | 205 | trace_dwc3_gadget_giveback(req); |
| 204 | 206 | ||
diff --git a/drivers/usb/gadget/function/f_mass_storage.c b/drivers/usb/gadget/function/f_mass_storage.c index e80b9c123a9d..f95bddd6513f 100644 --- a/drivers/usb/gadget/function/f_mass_storage.c +++ b/drivers/usb/gadget/function/f_mass_storage.c | |||
| @@ -2490,7 +2490,7 @@ static int fsg_main_thread(void *common_) | |||
| 2490 | int i; | 2490 | int i; |
| 2491 | 2491 | ||
| 2492 | down_write(&common->filesem); | 2492 | down_write(&common->filesem); |
| 2493 | for (i = 0; i < ARRAY_SIZE(common->luns); --i) { | 2493 | for (i = 0; i < ARRAY_SIZE(common->luns); i++) { |
| 2494 | struct fsg_lun *curlun = common->luns[i]; | 2494 | struct fsg_lun *curlun = common->luns[i]; |
| 2495 | if (!curlun || !fsg_lun_is_open(curlun)) | 2495 | if (!curlun || !fsg_lun_is_open(curlun)) |
| 2496 | continue; | 2496 | continue; |
diff --git a/drivers/usb/gadget/function/f_uac1.c b/drivers/usb/gadget/function/f_uac1.c index 8656f84e17d9..29efbedc91f9 100644 --- a/drivers/usb/gadget/function/f_uac1.c +++ b/drivers/usb/gadget/function/f_uac1.c | |||
| @@ -92,9 +92,9 @@ static struct uac_input_terminal_descriptor usb_out_it_desc = { | |||
| 92 | .bDescriptorType = USB_DT_CS_INTERFACE, | 92 | .bDescriptorType = USB_DT_CS_INTERFACE, |
| 93 | .bDescriptorSubtype = UAC_INPUT_TERMINAL, | 93 | .bDescriptorSubtype = UAC_INPUT_TERMINAL, |
| 94 | .bTerminalID = USB_OUT_IT_ID, | 94 | .bTerminalID = USB_OUT_IT_ID, |
| 95 | .wTerminalType = UAC_TERMINAL_STREAMING, | 95 | .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING), |
| 96 | .bAssocTerminal = 0, | 96 | .bAssocTerminal = 0, |
| 97 | .wChannelConfig = 0x3, | 97 | .wChannelConfig = cpu_to_le16(0x3), |
| 98 | }; | 98 | }; |
| 99 | 99 | ||
| 100 | #define IO_OUT_OT_ID 2 | 100 | #define IO_OUT_OT_ID 2 |
| @@ -103,7 +103,7 @@ static struct uac1_output_terminal_descriptor io_out_ot_desc = { | |||
| 103 | .bDescriptorType = USB_DT_CS_INTERFACE, | 103 | .bDescriptorType = USB_DT_CS_INTERFACE, |
| 104 | .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, | 104 | .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, |
| 105 | .bTerminalID = IO_OUT_OT_ID, | 105 | .bTerminalID = IO_OUT_OT_ID, |
| 106 | .wTerminalType = UAC_OUTPUT_TERMINAL_SPEAKER, | 106 | .wTerminalType = cpu_to_le16(UAC_OUTPUT_TERMINAL_SPEAKER), |
| 107 | .bAssocTerminal = 0, | 107 | .bAssocTerminal = 0, |
| 108 | .bSourceID = USB_OUT_IT_ID, | 108 | .bSourceID = USB_OUT_IT_ID, |
| 109 | }; | 109 | }; |
| @@ -114,9 +114,9 @@ static struct uac_input_terminal_descriptor io_in_it_desc = { | |||
| 114 | .bDescriptorType = USB_DT_CS_INTERFACE, | 114 | .bDescriptorType = USB_DT_CS_INTERFACE, |
| 115 | .bDescriptorSubtype = UAC_INPUT_TERMINAL, | 115 | .bDescriptorSubtype = UAC_INPUT_TERMINAL, |
| 116 | .bTerminalID = IO_IN_IT_ID, | 116 | .bTerminalID = IO_IN_IT_ID, |
| 117 | .wTerminalType = UAC_INPUT_TERMINAL_MICROPHONE, | 117 | .wTerminalType = cpu_to_le16(UAC_INPUT_TERMINAL_MICROPHONE), |
| 118 | .bAssocTerminal = 0, | 118 | .bAssocTerminal = 0, |
| 119 | .wChannelConfig = 0x3, | 119 | .wChannelConfig = cpu_to_le16(0x3), |
| 120 | }; | 120 | }; |
| 121 | 121 | ||
| 122 | #define USB_IN_OT_ID 4 | 122 | #define USB_IN_OT_ID 4 |
| @@ -125,7 +125,7 @@ static struct uac1_output_terminal_descriptor usb_in_ot_desc = { | |||
| 125 | .bDescriptorType = USB_DT_CS_INTERFACE, | 125 | .bDescriptorType = USB_DT_CS_INTERFACE, |
| 126 | .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, | 126 | .bDescriptorSubtype = UAC_OUTPUT_TERMINAL, |
| 127 | .bTerminalID = USB_IN_OT_ID, | 127 | .bTerminalID = USB_IN_OT_ID, |
| 128 | .wTerminalType = UAC_TERMINAL_STREAMING, | 128 | .wTerminalType = cpu_to_le16(UAC_TERMINAL_STREAMING), |
| 129 | .bAssocTerminal = 0, | 129 | .bAssocTerminal = 0, |
| 130 | .bSourceID = IO_IN_IT_ID, | 130 | .bSourceID = IO_IN_IT_ID, |
| 131 | }; | 131 | }; |
| @@ -174,7 +174,7 @@ static struct uac1_as_header_descriptor as_out_header_desc = { | |||
| 174 | .bDescriptorSubtype = UAC_AS_GENERAL, | 174 | .bDescriptorSubtype = UAC_AS_GENERAL, |
| 175 | .bTerminalLink = USB_OUT_IT_ID, | 175 | .bTerminalLink = USB_OUT_IT_ID, |
| 176 | .bDelay = 1, | 176 | .bDelay = 1, |
| 177 | .wFormatTag = UAC_FORMAT_TYPE_I_PCM, | 177 | .wFormatTag = cpu_to_le16(UAC_FORMAT_TYPE_I_PCM), |
| 178 | }; | 178 | }; |
| 179 | 179 | ||
| 180 | static struct uac1_as_header_descriptor as_in_header_desc = { | 180 | static struct uac1_as_header_descriptor as_in_header_desc = { |
| @@ -183,7 +183,7 @@ static struct uac1_as_header_descriptor as_in_header_desc = { | |||
| 183 | .bDescriptorSubtype = UAC_AS_GENERAL, | 183 | .bDescriptorSubtype = UAC_AS_GENERAL, |
| 184 | .bTerminalLink = USB_IN_OT_ID, | 184 | .bTerminalLink = USB_IN_OT_ID, |
| 185 | .bDelay = 1, | 185 | .bDelay = 1, |
| 186 | .wFormatTag = UAC_FORMAT_TYPE_I_PCM, | 186 | .wFormatTag = cpu_to_le16(UAC_FORMAT_TYPE_I_PCM), |
| 187 | }; | 187 | }; |
| 188 | 188 | ||
| 189 | DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1); | 189 | DECLARE_UAC_FORMAT_TYPE_I_DISCRETE_DESC(1); |
| @@ -606,8 +606,8 @@ static int f_audio_bind(struct usb_configuration *c, struct usb_function *f) | |||
| 606 | if (status) | 606 | if (status) |
| 607 | goto fail; | 607 | goto fail; |
| 608 | 608 | ||
| 609 | audio->out_ep_maxpsize = as_out_ep_desc.wMaxPacketSize; | 609 | audio->out_ep_maxpsize = le16_to_cpu(as_out_ep_desc.wMaxPacketSize); |
| 610 | audio->in_ep_maxpsize = as_in_ep_desc.wMaxPacketSize; | 610 | audio->in_ep_maxpsize = le16_to_cpu(as_in_ep_desc.wMaxPacketSize); |
| 611 | audio->params.c_chmask = audio_opts->c_chmask; | 611 | audio->params.c_chmask = audio_opts->c_chmask; |
| 612 | audio->params.c_srate = audio_opts->c_srate; | 612 | audio->params.c_srate = audio_opts->c_srate; |
| 613 | audio->params.c_ssize = audio_opts->c_ssize; | 613 | audio->params.c_ssize = audio_opts->c_ssize; |
diff --git a/drivers/usb/gadget/function/f_uac2.c b/drivers/usb/gadget/function/f_uac2.c index 9082ce261e70..f05c3f3e6103 100644 --- a/drivers/usb/gadget/function/f_uac2.c +++ b/drivers/usb/gadget/function/f_uac2.c | |||
| @@ -168,7 +168,7 @@ static struct uac2_input_terminal_descriptor usb_out_it_desc = { | |||
| 168 | .bAssocTerminal = 0, | 168 | .bAssocTerminal = 0, |
| 169 | .bCSourceID = USB_OUT_CLK_ID, | 169 | .bCSourceID = USB_OUT_CLK_ID, |
| 170 | .iChannelNames = 0, | 170 | .iChannelNames = 0, |
| 171 | .bmControls = (CONTROL_RDWR << COPY_CTRL), | 171 | .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL), |
| 172 | }; | 172 | }; |
| 173 | 173 | ||
| 174 | /* Input Terminal for I/O-In */ | 174 | /* Input Terminal for I/O-In */ |
| @@ -182,7 +182,7 @@ static struct uac2_input_terminal_descriptor io_in_it_desc = { | |||
| 182 | .bAssocTerminal = 0, | 182 | .bAssocTerminal = 0, |
| 183 | .bCSourceID = USB_IN_CLK_ID, | 183 | .bCSourceID = USB_IN_CLK_ID, |
| 184 | .iChannelNames = 0, | 184 | .iChannelNames = 0, |
| 185 | .bmControls = (CONTROL_RDWR << COPY_CTRL), | 185 | .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL), |
| 186 | }; | 186 | }; |
| 187 | 187 | ||
| 188 | /* Ouput Terminal for USB_IN */ | 188 | /* Ouput Terminal for USB_IN */ |
| @@ -196,7 +196,7 @@ static struct uac2_output_terminal_descriptor usb_in_ot_desc = { | |||
| 196 | .bAssocTerminal = 0, | 196 | .bAssocTerminal = 0, |
| 197 | .bSourceID = IO_IN_IT_ID, | 197 | .bSourceID = IO_IN_IT_ID, |
| 198 | .bCSourceID = USB_IN_CLK_ID, | 198 | .bCSourceID = USB_IN_CLK_ID, |
| 199 | .bmControls = (CONTROL_RDWR << COPY_CTRL), | 199 | .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL), |
| 200 | }; | 200 | }; |
| 201 | 201 | ||
| 202 | /* Ouput Terminal for I/O-Out */ | 202 | /* Ouput Terminal for I/O-Out */ |
| @@ -210,7 +210,7 @@ static struct uac2_output_terminal_descriptor io_out_ot_desc = { | |||
| 210 | .bAssocTerminal = 0, | 210 | .bAssocTerminal = 0, |
| 211 | .bSourceID = USB_OUT_IT_ID, | 211 | .bSourceID = USB_OUT_IT_ID, |
| 212 | .bCSourceID = USB_OUT_CLK_ID, | 212 | .bCSourceID = USB_OUT_CLK_ID, |
| 213 | .bmControls = (CONTROL_RDWR << COPY_CTRL), | 213 | .bmControls = cpu_to_le16(CONTROL_RDWR << COPY_CTRL), |
| 214 | }; | 214 | }; |
| 215 | 215 | ||
| 216 | static struct uac2_ac_header_descriptor ac_hdr_desc = { | 216 | static struct uac2_ac_header_descriptor ac_hdr_desc = { |
| @@ -220,9 +220,10 @@ static struct uac2_ac_header_descriptor ac_hdr_desc = { | |||
| 220 | .bDescriptorSubtype = UAC_MS_HEADER, | 220 | .bDescriptorSubtype = UAC_MS_HEADER, |
| 221 | .bcdADC = cpu_to_le16(0x200), | 221 | .bcdADC = cpu_to_le16(0x200), |
| 222 | .bCategory = UAC2_FUNCTION_IO_BOX, | 222 | .bCategory = UAC2_FUNCTION_IO_BOX, |
| 223 | .wTotalLength = sizeof in_clk_src_desc + sizeof out_clk_src_desc | 223 | .wTotalLength = cpu_to_le16(sizeof in_clk_src_desc |
| 224 | + sizeof usb_out_it_desc + sizeof io_in_it_desc | 224 | + sizeof out_clk_src_desc + sizeof usb_out_it_desc |
| 225 | + sizeof usb_in_ot_desc + sizeof io_out_ot_desc, | 225 | + sizeof io_in_it_desc + sizeof usb_in_ot_desc |
| 226 | + sizeof io_out_ot_desc), | ||
| 226 | .bmControls = 0, | 227 | .bmControls = 0, |
| 227 | }; | 228 | }; |
| 228 | 229 | ||
| @@ -569,10 +570,12 @@ afunc_bind(struct usb_configuration *cfg, struct usb_function *fn) | |||
| 569 | return ret; | 570 | return ret; |
| 570 | } | 571 | } |
| 571 | 572 | ||
| 572 | agdev->in_ep_maxpsize = max(fs_epin_desc.wMaxPacketSize, | 573 | agdev->in_ep_maxpsize = max_t(u16, |
| 573 | hs_epin_desc.wMaxPacketSize); | 574 | le16_to_cpu(fs_epin_desc.wMaxPacketSize), |
| 574 | agdev->out_ep_maxpsize = max(fs_epout_desc.wMaxPacketSize, | 575 | le16_to_cpu(hs_epin_desc.wMaxPacketSize)); |
| 575 | hs_epout_desc.wMaxPacketSize); | 576 | agdev->out_ep_maxpsize = max_t(u16, |
| 577 | le16_to_cpu(fs_epout_desc.wMaxPacketSize), | ||
| 578 | le16_to_cpu(hs_epout_desc.wMaxPacketSize)); | ||
| 576 | 579 | ||
| 577 | hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; | 580 | hs_epout_desc.bEndpointAddress = fs_epout_desc.bEndpointAddress; |
| 578 | hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; | 581 | hs_epin_desc.bEndpointAddress = fs_epin_desc.bEndpointAddress; |
diff --git a/drivers/usb/gadget/udc/Kconfig b/drivers/usb/gadget/udc/Kconfig index 9ffb11ec9ed9..7cd5c969fcbe 100644 --- a/drivers/usb/gadget/udc/Kconfig +++ b/drivers/usb/gadget/udc/Kconfig | |||
| @@ -192,7 +192,7 @@ config USB_RENESAS_USBHS_UDC | |||
| 192 | config USB_RENESAS_USB3 | 192 | config USB_RENESAS_USB3 |
| 193 | tristate 'Renesas USB3.0 Peripheral controller' | 193 | tristate 'Renesas USB3.0 Peripheral controller' |
| 194 | depends on ARCH_RENESAS || COMPILE_TEST | 194 | depends on ARCH_RENESAS || COMPILE_TEST |
| 195 | depends on EXTCON | 195 | depends on EXTCON && HAS_DMA |
| 196 | help | 196 | help |
| 197 | Renesas USB3.0 Peripheral controller is a USB peripheral controller | 197 | Renesas USB3.0 Peripheral controller is a USB peripheral controller |
| 198 | that supports super, high, and full speed USB 3.0 data transfers. | 198 | that supports super, high, and full speed USB 3.0 data transfers. |
| @@ -257,6 +257,7 @@ config USB_MV_U3D | |||
| 257 | 257 | ||
| 258 | config USB_SNP_CORE | 258 | config USB_SNP_CORE |
| 259 | depends on (USB_AMD5536UDC || USB_SNP_UDC_PLAT) | 259 | depends on (USB_AMD5536UDC || USB_SNP_UDC_PLAT) |
| 260 | depends on HAS_DMA | ||
| 260 | tristate | 261 | tristate |
| 261 | help | 262 | help |
| 262 | This enables core driver support for Synopsys USB 2.0 Device | 263 | This enables core driver support for Synopsys USB 2.0 Device |
| @@ -271,7 +272,7 @@ config USB_SNP_CORE | |||
| 271 | 272 | ||
| 272 | config USB_SNP_UDC_PLAT | 273 | config USB_SNP_UDC_PLAT |
| 273 | tristate "Synopsys USB 2.0 Device controller" | 274 | tristate "Synopsys USB 2.0 Device controller" |
| 274 | depends on (USB_GADGET && OF) | 275 | depends on USB_GADGET && OF && HAS_DMA |
| 275 | select USB_GADGET_DUALSPEED | 276 | select USB_GADGET_DUALSPEED |
| 276 | select USB_SNP_CORE | 277 | select USB_SNP_CORE |
| 277 | default ARCH_BCM_IPROC | 278 | default ARCH_BCM_IPROC |
diff --git a/drivers/usb/gadget/udc/renesas_usb3.c b/drivers/usb/gadget/udc/renesas_usb3.c index d8278322d5ac..62dc9c7798e7 100644 --- a/drivers/usb/gadget/udc/renesas_usb3.c +++ b/drivers/usb/gadget/udc/renesas_usb3.c | |||
| @@ -89,6 +89,9 @@ | |||
| 89 | 89 | ||
| 90 | /* USB_COM_CON */ | 90 | /* USB_COM_CON */ |
| 91 | #define USB_COM_CON_CONF BIT(24) | 91 | #define USB_COM_CON_CONF BIT(24) |
| 92 | #define USB_COM_CON_PN_WDATAIF_NL BIT(23) | ||
| 93 | #define USB_COM_CON_PN_RDATAIF_NL BIT(22) | ||
| 94 | #define USB_COM_CON_PN_LSTTR_PP BIT(21) | ||
| 92 | #define USB_COM_CON_SPD_MODE BIT(17) | 95 | #define USB_COM_CON_SPD_MODE BIT(17) |
| 93 | #define USB_COM_CON_EP0_EN BIT(16) | 96 | #define USB_COM_CON_EP0_EN BIT(16) |
| 94 | #define USB_COM_CON_DEV_ADDR_SHIFT 8 | 97 | #define USB_COM_CON_DEV_ADDR_SHIFT 8 |
| @@ -686,6 +689,9 @@ static void renesas_usb3_init_controller(struct renesas_usb3 *usb3) | |||
| 686 | { | 689 | { |
| 687 | usb3_init_axi_bridge(usb3); | 690 | usb3_init_axi_bridge(usb3); |
| 688 | usb3_init_epc_registers(usb3); | 691 | usb3_init_epc_registers(usb3); |
| 692 | usb3_set_bit(usb3, USB_COM_CON_PN_WDATAIF_NL | | ||
| 693 | USB_COM_CON_PN_RDATAIF_NL | USB_COM_CON_PN_LSTTR_PP, | ||
| 694 | USB3_USB_COM_CON); | ||
| 689 | usb3_write(usb3, USB_OTG_IDMON, USB3_USB_OTG_INT_STA); | 695 | usb3_write(usb3, USB_OTG_IDMON, USB3_USB_OTG_INT_STA); |
| 690 | usb3_write(usb3, USB_OTG_IDMON, USB3_USB_OTG_INT_ENA); | 696 | usb3_write(usb3, USB_OTG_IDMON, USB3_USB_OTG_INT_ENA); |
| 691 | 697 | ||
| @@ -1369,7 +1375,7 @@ static int renesas_usb3_dma_free_prd(struct renesas_usb3 *usb3, | |||
| 1369 | 1375 | ||
| 1370 | usb3_for_each_dma(usb3, dma, i) { | 1376 | usb3_for_each_dma(usb3, dma, i) { |
| 1371 | if (dma->prd) { | 1377 | if (dma->prd) { |
| 1372 | dma_free_coherent(dev, USB3_DMA_MAX_XFER_SIZE, | 1378 | dma_free_coherent(dev, USB3_DMA_PRD_SIZE, |
| 1373 | dma->prd, dma->prd_dma); | 1379 | dma->prd, dma->prd_dma); |
| 1374 | dma->prd = NULL; | 1380 | dma->prd = NULL; |
| 1375 | } | 1381 | } |
| @@ -1409,12 +1415,12 @@ static void usb3_start_pipen(struct renesas_usb3_ep *usb3_ep, | |||
| 1409 | int ret = -EAGAIN; | 1415 | int ret = -EAGAIN; |
| 1410 | u32 enable_bits = 0; | 1416 | u32 enable_bits = 0; |
| 1411 | 1417 | ||
| 1418 | spin_lock_irqsave(&usb3->lock, flags); | ||
| 1412 | if (usb3_ep->halt || usb3_ep->started) | 1419 | if (usb3_ep->halt || usb3_ep->started) |
| 1413 | return; | 1420 | goto out; |
| 1414 | if (usb3_req != usb3_req_first) | 1421 | if (usb3_req != usb3_req_first) |
| 1415 | return; | 1422 | goto out; |
| 1416 | 1423 | ||
| 1417 | spin_lock_irqsave(&usb3->lock, flags); | ||
| 1418 | if (usb3_pn_change(usb3, usb3_ep->num) < 0) | 1424 | if (usb3_pn_change(usb3, usb3_ep->num) < 0) |
| 1419 | goto out; | 1425 | goto out; |
| 1420 | 1426 | ||
diff --git a/drivers/usb/gadget/udc/snps_udc_plat.c b/drivers/usb/gadget/udc/snps_udc_plat.c index 2e11f19e07ae..f7b4d0f159e4 100644 --- a/drivers/usb/gadget/udc/snps_udc_plat.c +++ b/drivers/usb/gadget/udc/snps_udc_plat.c | |||
| @@ -28,7 +28,7 @@ | |||
| 28 | /* description */ | 28 | /* description */ |
| 29 | #define UDC_MOD_DESCRIPTION "Synopsys UDC platform driver" | 29 | #define UDC_MOD_DESCRIPTION "Synopsys UDC platform driver" |
| 30 | 30 | ||
| 31 | void start_udc(struct udc *udc) | 31 | static void start_udc(struct udc *udc) |
| 32 | { | 32 | { |
| 33 | if (udc->driver) { | 33 | if (udc->driver) { |
| 34 | dev_info(udc->dev, "Connecting...\n"); | 34 | dev_info(udc->dev, "Connecting...\n"); |
| @@ -38,7 +38,7 @@ void start_udc(struct udc *udc) | |||
| 38 | } | 38 | } |
| 39 | } | 39 | } |
| 40 | 40 | ||
| 41 | void stop_udc(struct udc *udc) | 41 | static void stop_udc(struct udc *udc) |
| 42 | { | 42 | { |
| 43 | int tmp; | 43 | int tmp; |
| 44 | u32 reg; | 44 | u32 reg; |
| @@ -76,7 +76,7 @@ void stop_udc(struct udc *udc) | |||
| 76 | dev_info(udc->dev, "Device disconnected\n"); | 76 | dev_info(udc->dev, "Device disconnected\n"); |
| 77 | } | 77 | } |
| 78 | 78 | ||
| 79 | void udc_drd_work(struct work_struct *work) | 79 | static void udc_drd_work(struct work_struct *work) |
| 80 | { | 80 | { |
| 81 | struct udc *udc; | 81 | struct udc *udc; |
| 82 | 82 | ||
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index a9a1e4c40480..c8989c62a262 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
| @@ -77,6 +77,16 @@ | |||
| 77 | #define USB_INTEL_USB3_PSSEN 0xD8 | 77 | #define USB_INTEL_USB3_PSSEN 0xD8 |
| 78 | #define USB_INTEL_USB3PRM 0xDC | 78 | #define USB_INTEL_USB3PRM 0xDC |
| 79 | 79 | ||
| 80 | /* ASMEDIA quirk use */ | ||
| 81 | #define ASMT_DATA_WRITE0_REG 0xF8 | ||
| 82 | #define ASMT_DATA_WRITE1_REG 0xFC | ||
| 83 | #define ASMT_CONTROL_REG 0xE0 | ||
| 84 | #define ASMT_CONTROL_WRITE_BIT 0x02 | ||
| 85 | #define ASMT_WRITEREG_CMD 0x10423 | ||
| 86 | #define ASMT_FLOWCTL_ADDR 0xFA30 | ||
| 87 | #define ASMT_FLOWCTL_DATA 0xBA | ||
| 88 | #define ASMT_PSEUDO_DATA 0 | ||
| 89 | |||
| 80 | /* | 90 | /* |
| 81 | * amd_chipset_gen values represent AMD different chipset generations | 91 | * amd_chipset_gen values represent AMD different chipset generations |
| 82 | */ | 92 | */ |
| @@ -412,6 +422,50 @@ void usb_amd_quirk_pll_disable(void) | |||
| 412 | } | 422 | } |
| 413 | EXPORT_SYMBOL_GPL(usb_amd_quirk_pll_disable); | 423 | EXPORT_SYMBOL_GPL(usb_amd_quirk_pll_disable); |
| 414 | 424 | ||
| 425 | static int usb_asmedia_wait_write(struct pci_dev *pdev) | ||
| 426 | { | ||
| 427 | unsigned long retry_count; | ||
| 428 | unsigned char value; | ||
| 429 | |||
| 430 | for (retry_count = 1000; retry_count > 0; --retry_count) { | ||
| 431 | |||
| 432 | pci_read_config_byte(pdev, ASMT_CONTROL_REG, &value); | ||
| 433 | |||
| 434 | if (value == 0xff) { | ||
| 435 | dev_err(&pdev->dev, "%s: check_ready ERROR", __func__); | ||
| 436 | return -EIO; | ||
| 437 | } | ||
| 438 | |||
| 439 | if ((value & ASMT_CONTROL_WRITE_BIT) == 0) | ||
| 440 | return 0; | ||
| 441 | |||
| 442 | usleep_range(40, 60); | ||
| 443 | } | ||
| 444 | |||
| 445 | dev_warn(&pdev->dev, "%s: check_write_ready timeout", __func__); | ||
| 446 | return -ETIMEDOUT; | ||
| 447 | } | ||
| 448 | |||
| 449 | void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) | ||
| 450 | { | ||
| 451 | if (usb_asmedia_wait_write(pdev) != 0) | ||
| 452 | return; | ||
| 453 | |||
| 454 | /* send command and address to device */ | ||
| 455 | pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_WRITEREG_CMD); | ||
| 456 | pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, ASMT_FLOWCTL_ADDR); | ||
| 457 | pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT); | ||
| 458 | |||
| 459 | if (usb_asmedia_wait_write(pdev) != 0) | ||
| 460 | return; | ||
| 461 | |||
| 462 | /* send data to device */ | ||
| 463 | pci_write_config_dword(pdev, ASMT_DATA_WRITE0_REG, ASMT_FLOWCTL_DATA); | ||
| 464 | pci_write_config_dword(pdev, ASMT_DATA_WRITE1_REG, ASMT_PSEUDO_DATA); | ||
| 465 | pci_write_config_byte(pdev, ASMT_CONTROL_REG, ASMT_CONTROL_WRITE_BIT); | ||
| 466 | } | ||
| 467 | EXPORT_SYMBOL_GPL(usb_asmedia_modifyflowcontrol); | ||
| 468 | |||
| 415 | void usb_amd_quirk_pll_enable(void) | 469 | void usb_amd_quirk_pll_enable(void) |
| 416 | { | 470 | { |
| 417 | usb_amd_quirk_pll(0); | 471 | usb_amd_quirk_pll(0); |
diff --git a/drivers/usb/host/pci-quirks.h b/drivers/usb/host/pci-quirks.h index 0222195bd5b0..655994480198 100644 --- a/drivers/usb/host/pci-quirks.h +++ b/drivers/usb/host/pci-quirks.h | |||
| @@ -11,6 +11,7 @@ bool usb_amd_prefetch_quirk(void); | |||
| 11 | void usb_amd_dev_put(void); | 11 | void usb_amd_dev_put(void); |
| 12 | void usb_amd_quirk_pll_disable(void); | 12 | void usb_amd_quirk_pll_disable(void); |
| 13 | void usb_amd_quirk_pll_enable(void); | 13 | void usb_amd_quirk_pll_enable(void); |
| 14 | void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev); | ||
| 14 | void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev); | 15 | void usb_enable_intel_xhci_ports(struct pci_dev *xhci_pdev); |
| 15 | void usb_disable_xhci_ports(struct pci_dev *xhci_pdev); | 16 | void usb_disable_xhci_ports(struct pci_dev *xhci_pdev); |
| 16 | void sb800_prefetch(struct device *dev, int on); | 17 | void sb800_prefetch(struct device *dev, int on); |
| @@ -18,6 +19,7 @@ void sb800_prefetch(struct device *dev, int on); | |||
| 18 | struct pci_dev; | 19 | struct pci_dev; |
| 19 | static inline void usb_amd_quirk_pll_disable(void) {} | 20 | static inline void usb_amd_quirk_pll_disable(void) {} |
| 20 | static inline void usb_amd_quirk_pll_enable(void) {} | 21 | static inline void usb_amd_quirk_pll_enable(void) {} |
| 22 | static inline void usb_asmedia_modifyflowcontrol(struct pci_dev *pdev) {} | ||
| 21 | static inline void usb_amd_dev_put(void) {} | 23 | static inline void usb_amd_dev_put(void) {} |
| 22 | static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {} | 24 | static inline void usb_disable_xhci_ports(struct pci_dev *xhci_pdev) {} |
| 23 | static inline void sb800_prefetch(struct device *dev, int on) {} | 25 | static inline void sb800_prefetch(struct device *dev, int on) {} |
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 1adae9eab831..00721e8807ab 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
| @@ -398,14 +398,21 @@ static int xhci_stop_device(struct xhci_hcd *xhci, int slot_id, int suspend) | |||
| 398 | spin_lock_irqsave(&xhci->lock, flags); | 398 | spin_lock_irqsave(&xhci->lock, flags); |
| 399 | for (i = LAST_EP_INDEX; i > 0; i--) { | 399 | for (i = LAST_EP_INDEX; i > 0; i--) { |
| 400 | if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue) { | 400 | if (virt_dev->eps[i].ring && virt_dev->eps[i].ring->dequeue) { |
| 401 | struct xhci_ep_ctx *ep_ctx; | ||
| 401 | struct xhci_command *command; | 402 | struct xhci_command *command; |
| 403 | |||
| 404 | ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->out_ctx, i); | ||
| 405 | |||
| 406 | /* Check ep is running, required by AMD SNPS 3.1 xHC */ | ||
| 407 | if (GET_EP_CTX_STATE(ep_ctx) != EP_STATE_RUNNING) | ||
| 408 | continue; | ||
| 409 | |||
| 402 | command = xhci_alloc_command(xhci, false, false, | 410 | command = xhci_alloc_command(xhci, false, false, |
| 403 | GFP_NOWAIT); | 411 | GFP_NOWAIT); |
| 404 | if (!command) { | 412 | if (!command) { |
| 405 | spin_unlock_irqrestore(&xhci->lock, flags); | 413 | spin_unlock_irqrestore(&xhci->lock, flags); |
| 406 | xhci_free_command(xhci, cmd); | 414 | xhci_free_command(xhci, cmd); |
| 407 | return -ENOMEM; | 415 | return -ENOMEM; |
| 408 | |||
| 409 | } | 416 | } |
| 410 | xhci_queue_stop_endpoint(xhci, command, slot_id, i, | 417 | xhci_queue_stop_endpoint(xhci, command, slot_id, i, |
| 411 | suspend); | 418 | suspend); |
| @@ -603,12 +610,14 @@ static int xhci_enter_test_mode(struct xhci_hcd *xhci, | |||
| 603 | 610 | ||
| 604 | /* Disable all Device Slots */ | 611 | /* Disable all Device Slots */ |
| 605 | xhci_dbg(xhci, "Disable all slots\n"); | 612 | xhci_dbg(xhci, "Disable all slots\n"); |
| 613 | spin_unlock_irqrestore(&xhci->lock, *flags); | ||
| 606 | for (i = 1; i <= HCS_MAX_SLOTS(xhci->hcs_params1); i++) { | 614 | for (i = 1; i <= HCS_MAX_SLOTS(xhci->hcs_params1); i++) { |
| 607 | retval = xhci_disable_slot(xhci, NULL, i); | 615 | retval = xhci_disable_slot(xhci, NULL, i); |
| 608 | if (retval) | 616 | if (retval) |
| 609 | xhci_err(xhci, "Failed to disable slot %d, %d. Enter test mode anyway\n", | 617 | xhci_err(xhci, "Failed to disable slot %d, %d. Enter test mode anyway\n", |
| 610 | i, retval); | 618 | i, retval); |
| 611 | } | 619 | } |
| 620 | spin_lock_irqsave(&xhci->lock, *flags); | ||
| 612 | /* Put all ports to the Disable state by clear PP */ | 621 | /* Put all ports to the Disable state by clear PP */ |
| 613 | xhci_dbg(xhci, "Disable all port (PP = 0)\n"); | 622 | xhci_dbg(xhci, "Disable all port (PP = 0)\n"); |
| 614 | /* Power off USB3 ports*/ | 623 | /* Power off USB3 ports*/ |
| @@ -897,6 +906,9 @@ static u32 xhci_get_port_status(struct usb_hcd *hcd, | |||
| 897 | clear_bit(wIndex, &bus_state->resuming_ports); | 906 | clear_bit(wIndex, &bus_state->resuming_ports); |
| 898 | 907 | ||
| 899 | set_bit(wIndex, &bus_state->rexit_ports); | 908 | set_bit(wIndex, &bus_state->rexit_ports); |
| 909 | |||
| 910 | xhci_test_and_clear_bit(xhci, port_array, wIndex, | ||
| 911 | PORT_PLC); | ||
| 900 | xhci_set_link_state(xhci, port_array, wIndex, | 912 | xhci_set_link_state(xhci, port_array, wIndex, |
| 901 | XDEV_U0); | 913 | XDEV_U0); |
| 902 | 914 | ||
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index 53882e2babbb..5b0fa553c8bc 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
| @@ -59,6 +59,8 @@ | |||
| 59 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb | 59 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_2 0x43bb |
| 60 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc | 60 | #define PCI_DEVICE_ID_AMD_PROMONTORYA_1 0x43bc |
| 61 | 61 | ||
| 62 | #define PCI_DEVICE_ID_ASMEDIA_1042A_XHCI 0x1142 | ||
| 63 | |||
| 62 | static const char hcd_name[] = "xhci_hcd"; | 64 | static const char hcd_name[] = "xhci_hcd"; |
| 63 | 65 | ||
| 64 | static struct hc_driver __read_mostly xhci_pci_hc_driver; | 66 | static struct hc_driver __read_mostly xhci_pci_hc_driver; |
| @@ -217,6 +219,10 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
| 217 | pdev->device == 0x1142) | 219 | pdev->device == 0x1142) |
| 218 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | 220 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
| 219 | 221 | ||
| 222 | if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && | ||
| 223 | pdev->device == PCI_DEVICE_ID_ASMEDIA_1042A_XHCI) | ||
| 224 | xhci->quirks |= XHCI_ASMEDIA_MODIFY_FLOWCONTROL; | ||
| 225 | |||
| 220 | if (pdev->vendor == PCI_VENDOR_ID_TI && pdev->device == 0x8241) | 226 | if (pdev->vendor == PCI_VENDOR_ID_TI && pdev->device == 0x8241) |
| 221 | xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_7; | 227 | xhci->quirks |= XHCI_LIMIT_ENDPOINT_INTERVAL_7; |
| 222 | 228 | ||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index c50c902d009e..cc368ad2b51e 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
| @@ -864,13 +864,16 @@ static void xhci_kill_endpoint_urbs(struct xhci_hcd *xhci, | |||
| 864 | (ep->ep_state & EP_GETTING_NO_STREAMS)) { | 864 | (ep->ep_state & EP_GETTING_NO_STREAMS)) { |
| 865 | int stream_id; | 865 | int stream_id; |
| 866 | 866 | ||
| 867 | for (stream_id = 0; stream_id < ep->stream_info->num_streams; | 867 | for (stream_id = 1; stream_id < ep->stream_info->num_streams; |
| 868 | stream_id++) { | 868 | stream_id++) { |
| 869 | ring = ep->stream_info->stream_rings[stream_id]; | ||
| 870 | if (!ring) | ||
| 871 | continue; | ||
| 872 | |||
| 869 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, | 873 | xhci_dbg_trace(xhci, trace_xhci_dbg_cancel_urb, |
| 870 | "Killing URBs for slot ID %u, ep index %u, stream %u", | 874 | "Killing URBs for slot ID %u, ep index %u, stream %u", |
| 871 | slot_id, ep_index, stream_id + 1); | 875 | slot_id, ep_index, stream_id); |
| 872 | xhci_kill_ring_urbs(xhci, | 876 | xhci_kill_ring_urbs(xhci, ring); |
| 873 | ep->stream_info->stream_rings[stream_id]); | ||
| 874 | } | 877 | } |
| 875 | } else { | 878 | } else { |
| 876 | ring = ep->ring; | 879 | ring = ep->ring; |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 56f85df013db..b2ff1ff1a02f 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -198,6 +198,9 @@ int xhci_reset(struct xhci_hcd *xhci) | |||
| 198 | if (ret) | 198 | if (ret) |
| 199 | return ret; | 199 | return ret; |
| 200 | 200 | ||
| 201 | if (xhci->quirks & XHCI_ASMEDIA_MODIFY_FLOWCONTROL) | ||
| 202 | usb_asmedia_modifyflowcontrol(to_pci_dev(xhci_to_hcd(xhci)->self.controller)); | ||
| 203 | |||
| 201 | xhci_dbg_trace(xhci, trace_xhci_dbg_init, | 204 | xhci_dbg_trace(xhci, trace_xhci_dbg_init, |
| 202 | "Wait for controller to be ready for doorbell rings"); | 205 | "Wait for controller to be ready for doorbell rings"); |
| 203 | /* | 206 | /* |
| @@ -622,8 +625,10 @@ int xhci_run(struct usb_hcd *hcd) | |||
| 622 | if (!command) | 625 | if (!command) |
| 623 | return -ENOMEM; | 626 | return -ENOMEM; |
| 624 | 627 | ||
| 625 | xhci_queue_vendor_command(xhci, command, 0, 0, 0, | 628 | ret = xhci_queue_vendor_command(xhci, command, 0, 0, 0, |
| 626 | TRB_TYPE(TRB_NEC_GET_FW)); | 629 | TRB_TYPE(TRB_NEC_GET_FW)); |
| 630 | if (ret) | ||
| 631 | xhci_free_command(xhci, command); | ||
| 627 | } | 632 | } |
| 628 | xhci_dbg_trace(xhci, trace_xhci_dbg_init, | 633 | xhci_dbg_trace(xhci, trace_xhci_dbg_init, |
| 629 | "Finished xhci_run for USB2 roothub"); | 634 | "Finished xhci_run for USB2 roothub"); |
| @@ -1085,6 +1090,9 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated) | |||
| 1085 | if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running) | 1090 | if ((xhci->quirks & XHCI_COMP_MODE_QUIRK) && !comp_timer_running) |
| 1086 | compliance_mode_recovery_timer_init(xhci); | 1091 | compliance_mode_recovery_timer_init(xhci); |
| 1087 | 1092 | ||
| 1093 | if (xhci->quirks & XHCI_ASMEDIA_MODIFY_FLOWCONTROL) | ||
| 1094 | usb_asmedia_modifyflowcontrol(to_pci_dev(hcd->self.controller)); | ||
| 1095 | |||
| 1088 | /* Re-enable port polling. */ | 1096 | /* Re-enable port polling. */ |
| 1089 | xhci_dbg(xhci, "%s: starting port polling.\n", __func__); | 1097 | xhci_dbg(xhci, "%s: starting port polling.\n", __func__); |
| 1090 | set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags); | 1098 | set_bit(HCD_FLAG_POLL_RH, &xhci->shared_hcd->flags); |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 3c6da1f93c84..e3e935291ed6 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
| @@ -1820,6 +1820,7 @@ struct xhci_hcd { | |||
| 1820 | #define XHCI_BROKEN_PORT_PED (1 << 25) | 1820 | #define XHCI_BROKEN_PORT_PED (1 << 25) |
| 1821 | #define XHCI_LIMIT_ENDPOINT_INTERVAL_7 (1 << 26) | 1821 | #define XHCI_LIMIT_ENDPOINT_INTERVAL_7 (1 << 26) |
| 1822 | #define XHCI_U2_DISABLE_WAKE (1 << 27) | 1822 | #define XHCI_U2_DISABLE_WAKE (1 << 27) |
| 1823 | #define XHCI_ASMEDIA_MODIFY_FLOWCONTROL (1 << 28) | ||
| 1823 | 1824 | ||
| 1824 | unsigned int num_active_eps; | 1825 | unsigned int num_active_eps; |
| 1825 | unsigned int limit_active_eps; | 1826 | unsigned int limit_active_eps; |
diff --git a/drivers/usb/renesas_usbhs/common.c b/drivers/usb/renesas_usbhs/common.c index 623c51300393..f0ce304c5aaf 100644 --- a/drivers/usb/renesas_usbhs/common.c +++ b/drivers/usb/renesas_usbhs/common.c | |||
| @@ -752,8 +752,10 @@ static int usbhsc_resume(struct device *dev) | |||
| 752 | struct usbhs_priv *priv = dev_get_drvdata(dev); | 752 | struct usbhs_priv *priv = dev_get_drvdata(dev); |
| 753 | struct platform_device *pdev = usbhs_priv_to_pdev(priv); | 753 | struct platform_device *pdev = usbhs_priv_to_pdev(priv); |
| 754 | 754 | ||
| 755 | if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL)) | 755 | if (!usbhsc_flags_has(priv, USBHSF_RUNTIME_PWCTRL)) { |
| 756 | usbhsc_power_ctrl(priv, 1); | 756 | usbhsc_power_ctrl(priv, 1); |
| 757 | usbhs_mod_autonomy_mode(priv); | ||
| 758 | } | ||
| 757 | 759 | ||
| 758 | usbhs_platform_call(priv, phy_reset, pdev); | 760 | usbhs_platform_call(priv, phy_reset, pdev); |
| 759 | 761 | ||
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index 5bc7a6138855..93fba9033b00 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
| @@ -37,6 +37,7 @@ struct usbhsg_gpriv; | |||
| 37 | struct usbhsg_uep { | 37 | struct usbhsg_uep { |
| 38 | struct usb_ep ep; | 38 | struct usb_ep ep; |
| 39 | struct usbhs_pipe *pipe; | 39 | struct usbhs_pipe *pipe; |
| 40 | spinlock_t lock; /* protect the pipe */ | ||
| 40 | 41 | ||
| 41 | char ep_name[EP_NAME_SIZE]; | 42 | char ep_name[EP_NAME_SIZE]; |
| 42 | 43 | ||
| @@ -636,10 +637,16 @@ usbhsg_ep_enable_end: | |||
| 636 | static int usbhsg_ep_disable(struct usb_ep *ep) | 637 | static int usbhsg_ep_disable(struct usb_ep *ep) |
| 637 | { | 638 | { |
| 638 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); | 639 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); |
| 639 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | 640 | struct usbhs_pipe *pipe; |
| 641 | unsigned long flags; | ||
| 642 | int ret = 0; | ||
| 640 | 643 | ||
| 641 | if (!pipe) | 644 | spin_lock_irqsave(&uep->lock, flags); |
| 642 | return -EINVAL; | 645 | pipe = usbhsg_uep_to_pipe(uep); |
| 646 | if (!pipe) { | ||
| 647 | ret = -EINVAL; | ||
| 648 | goto out; | ||
| 649 | } | ||
| 643 | 650 | ||
| 644 | usbhsg_pipe_disable(uep); | 651 | usbhsg_pipe_disable(uep); |
| 645 | usbhs_pipe_free(pipe); | 652 | usbhs_pipe_free(pipe); |
| @@ -647,6 +654,9 @@ static int usbhsg_ep_disable(struct usb_ep *ep) | |||
| 647 | uep->pipe->mod_private = NULL; | 654 | uep->pipe->mod_private = NULL; |
| 648 | uep->pipe = NULL; | 655 | uep->pipe = NULL; |
| 649 | 656 | ||
| 657 | out: | ||
| 658 | spin_unlock_irqrestore(&uep->lock, flags); | ||
| 659 | |||
| 650 | return 0; | 660 | return 0; |
| 651 | } | 661 | } |
| 652 | 662 | ||
| @@ -696,8 +706,11 @@ static int usbhsg_ep_dequeue(struct usb_ep *ep, struct usb_request *req) | |||
| 696 | { | 706 | { |
| 697 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); | 707 | struct usbhsg_uep *uep = usbhsg_ep_to_uep(ep); |
| 698 | struct usbhsg_request *ureq = usbhsg_req_to_ureq(req); | 708 | struct usbhsg_request *ureq = usbhsg_req_to_ureq(req); |
| 699 | struct usbhs_pipe *pipe = usbhsg_uep_to_pipe(uep); | 709 | struct usbhs_pipe *pipe; |
| 710 | unsigned long flags; | ||
| 700 | 711 | ||
| 712 | spin_lock_irqsave(&uep->lock, flags); | ||
| 713 | pipe = usbhsg_uep_to_pipe(uep); | ||
| 701 | if (pipe) | 714 | if (pipe) |
| 702 | usbhs_pkt_pop(pipe, usbhsg_ureq_to_pkt(ureq)); | 715 | usbhs_pkt_pop(pipe, usbhsg_ureq_to_pkt(ureq)); |
| 703 | 716 | ||
| @@ -706,6 +719,7 @@ static int usbhsg_ep_dequeue(struct usb_ep *ep, struct usb_request *req) | |||
| 706 | * even if the pipe is NULL. | 719 | * even if the pipe is NULL. |
| 707 | */ | 720 | */ |
| 708 | usbhsg_queue_pop(uep, ureq, -ECONNRESET); | 721 | usbhsg_queue_pop(uep, ureq, -ECONNRESET); |
| 722 | spin_unlock_irqrestore(&uep->lock, flags); | ||
| 709 | 723 | ||
| 710 | return 0; | 724 | return 0; |
| 711 | } | 725 | } |
| @@ -852,10 +866,10 @@ static int usbhsg_try_stop(struct usbhs_priv *priv, u32 status) | |||
| 852 | { | 866 | { |
| 853 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | 867 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); |
| 854 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); | 868 | struct usbhs_mod *mod = usbhs_mod_get_current(priv); |
| 855 | struct usbhsg_uep *dcp = usbhsg_gpriv_to_dcp(gpriv); | 869 | struct usbhsg_uep *uep; |
| 856 | struct device *dev = usbhs_priv_to_dev(priv); | 870 | struct device *dev = usbhs_priv_to_dev(priv); |
| 857 | unsigned long flags; | 871 | unsigned long flags; |
| 858 | int ret = 0; | 872 | int ret = 0, i; |
| 859 | 873 | ||
| 860 | /******************** spin lock ********************/ | 874 | /******************** spin lock ********************/ |
| 861 | usbhs_lock(priv, flags); | 875 | usbhs_lock(priv, flags); |
| @@ -887,7 +901,9 @@ static int usbhsg_try_stop(struct usbhs_priv *priv, u32 status) | |||
| 887 | usbhs_sys_set_test_mode(priv, 0); | 901 | usbhs_sys_set_test_mode(priv, 0); |
| 888 | usbhs_sys_function_ctrl(priv, 0); | 902 | usbhs_sys_function_ctrl(priv, 0); |
| 889 | 903 | ||
| 890 | usbhsg_ep_disable(&dcp->ep); | 904 | /* disable all eps */ |
| 905 | usbhsg_for_each_uep_with_dcp(uep, gpriv, i) | ||
| 906 | usbhsg_ep_disable(&uep->ep); | ||
| 891 | 907 | ||
| 892 | dev_dbg(dev, "stop gadget\n"); | 908 | dev_dbg(dev, "stop gadget\n"); |
| 893 | 909 | ||
| @@ -1069,6 +1085,7 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | |||
| 1069 | ret = -ENOMEM; | 1085 | ret = -ENOMEM; |
| 1070 | goto usbhs_mod_gadget_probe_err_gpriv; | 1086 | goto usbhs_mod_gadget_probe_err_gpriv; |
| 1071 | } | 1087 | } |
| 1088 | spin_lock_init(&uep->lock); | ||
| 1072 | 1089 | ||
| 1073 | gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED); | 1090 | gpriv->transceiver = usb_get_phy(USB_PHY_TYPE_UNDEFINED); |
| 1074 | dev_info(dev, "%stransceiver found\n", | 1091 | dev_info(dev, "%stransceiver found\n", |
diff --git a/drivers/usb/storage/isd200.c b/drivers/usb/storage/isd200.c index fba4005dd737..6a7720e66595 100644 --- a/drivers/usb/storage/isd200.c +++ b/drivers/usb/storage/isd200.c | |||
| @@ -1529,8 +1529,11 @@ static void isd200_ata_command(struct scsi_cmnd *srb, struct us_data *us) | |||
| 1529 | 1529 | ||
| 1530 | /* Make sure driver was initialized */ | 1530 | /* Make sure driver was initialized */ |
| 1531 | 1531 | ||
| 1532 | if (us->extra == NULL) | 1532 | if (us->extra == NULL) { |
| 1533 | usb_stor_dbg(us, "ERROR Driver not initialized\n"); | 1533 | usb_stor_dbg(us, "ERROR Driver not initialized\n"); |
| 1534 | srb->result = DID_ERROR << 16; | ||
| 1535 | return; | ||
| 1536 | } | ||
| 1534 | 1537 | ||
| 1535 | scsi_set_resid(srb, 0); | 1538 | scsi_set_resid(srb, 0); |
| 1536 | /* scsi_bufflen might change in protocol translation to ata */ | 1539 | /* scsi_bufflen might change in protocol translation to ata */ |
diff --git a/drivers/usb/typec/ucsi/ucsi.h b/drivers/usb/typec/ucsi/ucsi.h index 6b0d2f0918c6..8a88f45822e3 100644 --- a/drivers/usb/typec/ucsi/ucsi.h +++ b/drivers/usb/typec/ucsi/ucsi.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | #define __DRIVER_USB_TYPEC_UCSI_H | 3 | #define __DRIVER_USB_TYPEC_UCSI_H |
| 4 | 4 | ||
| 5 | #include <linux/bitops.h> | 5 | #include <linux/bitops.h> |
| 6 | #include <linux/device.h> | ||
| 6 | #include <linux/types.h> | 7 | #include <linux/types.h> |
| 7 | 8 | ||
| 8 | /* -------------------------------------------------------------------------- */ | 9 | /* -------------------------------------------------------------------------- */ |
