Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'usb-for-v5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-next

Felipe writes:

USB: changes for v5.1 merge window

Dwc3 now works on TI's AM6xx platforms. Also on dwc3 we have a few
changes which improve request cancellation and some improvements to
how we print to the trace buffer.

Renesas_usb3 got support for r8a774c0 device.

Dwc2 got scatter-gather support.

Apart from these, the usual set of minor fixes and all sorts of small
details.

* tag 'usb-for-v5.1' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb: (40 commits)
usb: phy: twl6030-usb: fix possible use-after-free on remove
usb: misc: usbtest: add super-speed isoc support
usb: dwc3: Reset num_trbs after skipping
usb: dwc3: gadget: don't enable interrupt when disabling endpoint
fotg210-udc: pass struct device to DMA API functions
fotg210-udc: remove a bogus dma_sync_single_for_device call
usb: gadget: Change Andrzej Pietrasiewicz's e-mail address
usb: f_fs: Avoid crash due to out-of-scope stack ptr access
usb: dwc3: haps: Workaround matching VID PID
usb: gadget: f_fs: preserve wMaxPacketSize across usb_ep_autoconfig() call
usb: gadget: move non-super speed code out of usb_ep_autoconfig_ss()
usb: gadget: function: sync f_uac1 ac header baInterfaceNr
usb: dwc2: gadget: Add scatter-gather mode
usb: gadget: fix various indentation issues
usb: dwc2: Fix EP TxFIFO number setting
udc: net2280: Fix net2280_disable
USB: gadget: Improve kerneldoc for usb_ep_dequeue()
usb: dwc3: debug: purge usage of strcat
usb: dwc3: trace: pass trace buffer size to decoding functions
usb: dwc3: gadget: remove DWC3_EP_END_TRANSFER_PENDING
...

+381 -263
+4 -2
Documentation/devicetree/bindings/usb/keystone-usb.txt
··· 3 3 DWC3 GLUE 4 4 5 5 Required properties: 6 - - compatible: should be "ti,keystone-dwc3". 6 + - compatible: should be 7 + "ti,keystone-dwc3" for Keystone 2 SoCs 8 + "ti,am654-dwc3" for AM654 SoC 7 9 - #address-cells, #size-cells : should be '1' if the device has sub-nodes 8 10 with 'reg' property. 9 11 - reg : Address and length of the register set for the USB subsystem on ··· 23 21 - clock-names: Must be "usb". 24 22 25 23 26 - The following are mandatory properties for Keystone 2 66AK2G SoCs only: 24 + The following are mandatory properties for 66AK2G and AM654: 27 25 28 26 - power-domains: Should contain a phandle to a PM domain provider node 29 27 and an args specifier containing the USB device id
+1
Documentation/devicetree/bindings/usb/qcom,dwc3.txt
··· 4 4 - compatible: Compatible list, contains 5 5 "qcom,dwc3" 6 6 "qcom,msm8996-dwc3" for msm8996 SOC. 7 + "qcom,msm8998-dwc3" for msm8998 SOC. 7 8 "qcom,sdm845-dwc3" for sdm845 SOC. 8 9 - reg: Offset and length of register set for QSCRATCH wrapper 9 10 - power-domains: specifies a phandle to PM domain provider node
+1
Documentation/devicetree/bindings/usb/renesas_usb3.txt
··· 3 3 Required properties: 4 4 - compatible: Must contain one of the following: 5 5 - "renesas,r8a774a1-usb3-peri" 6 + - "renesas,r8a774c0-usb3-peri" 6 7 - "renesas,r8a7795-usb3-peri" 7 8 - "renesas,r8a7796-usb3-peri" 8 9 - "renesas,r8a77965-usb3-peri"
+1
Documentation/devicetree/bindings/usb/renesas_usbhs.txt
··· 7 7 - "renesas,usbhs-r8a7744" for r8a7744 (RZ/G1N) compatible device 8 8 - "renesas,usbhs-r8a7745" for r8a7745 (RZ/G1E) compatible device 9 9 - "renesas,usbhs-r8a774a1" for r8a774a1 (RZ/G2M) compatible device 10 + - "renesas,usbhs-r8a774c0" for r8a774c0 (RZ/G2E) compatible device 10 11 - "renesas,usbhs-r8a7790" for r8a7790 (R-Car H2) compatible device 11 12 - "renesas,usbhs-r8a7791" for r8a7791 (R-Car M2-W) compatible device 12 13 - "renesas,usbhs-r8a7792" for r8a7792 (R-Car V2H) compatible device
+78 -36
drivers/usb/dwc2/gadget.c
··· 768 768 return desc_size; 769 769 } 770 770 771 - /* 772 - * dwc2_gadget_config_nonisoc_xfer_ddma - prepare non ISOC DMA desc chain. 773 - * @hs_ep: The endpoint 774 - * @dma_buff: DMA address to use 775 - * @len: Length of the transfer 776 - * 777 - * This function will iterate over descriptor chain and fill its entries 778 - * with corresponding information based on transfer data. 779 - */ 780 - static void dwc2_gadget_config_nonisoc_xfer_ddma(struct dwc2_hsotg_ep *hs_ep, 771 + static void dwc2_gadget_fill_nonisoc_xfer_ddma_one(struct dwc2_hsotg_ep *hs_ep, 772 + struct dwc2_dma_desc **desc, 781 773 dma_addr_t dma_buff, 782 - unsigned int len) 774 + unsigned int len, 775 + bool true_last) 783 776 { 784 - struct dwc2_hsotg *hsotg = hs_ep->parent; 785 777 int dir_in = hs_ep->dir_in; 786 - struct dwc2_dma_desc *desc = hs_ep->desc_list; 787 778 u32 mps = hs_ep->ep.maxpacket; 788 779 u32 maxsize = 0; 789 780 u32 offset = 0; ··· 789 798 hs_ep->desc_count = 1; 790 799 791 800 for (i = 0; i < hs_ep->desc_count; ++i) { 792 - desc->status = 0; 793 - desc->status |= (DEV_DMA_BUFF_STS_HBUSY 801 + (*desc)->status = 0; 802 + (*desc)->status |= (DEV_DMA_BUFF_STS_HBUSY 794 803 << DEV_DMA_BUFF_STS_SHIFT); 795 804 796 805 if (len > maxsize) { 797 806 if (!hs_ep->index && !dir_in) 798 - desc->status |= (DEV_DMA_L | DEV_DMA_IOC); 807 + (*desc)->status |= (DEV_DMA_L | DEV_DMA_IOC); 799 808 800 - desc->status |= (maxsize << 801 - DEV_DMA_NBYTES_SHIFT & mask); 802 - desc->buf = dma_buff + offset; 809 + (*desc)->status |= 810 + maxsize << DEV_DMA_NBYTES_SHIFT & mask; 811 + (*desc)->buf = dma_buff + offset; 803 812 804 813 len -= maxsize; 805 814 offset += maxsize; 806 815 } else { 807 - desc->status |= (DEV_DMA_L | DEV_DMA_IOC); 816 + if (true_last) 817 + (*desc)->status |= (DEV_DMA_L | DEV_DMA_IOC); 808 818 809 819 if (dir_in) 810 - desc->status |= (len % mps) ? DEV_DMA_SHORT : 811 - ((hs_ep->send_zlp) ? DEV_DMA_SHORT : 0); 812 - if (len > maxsize) 813 - dev_err(hsotg->dev, "wrong len %d\n", len); 820 + (*desc)->status |= (len % mps) ? DEV_DMA_SHORT : 821 + ((hs_ep->send_zlp && true_last) ? 822 + DEV_DMA_SHORT : 0); 814 823 815 - desc->status |= 824 + (*desc)->status |= 816 825 len << DEV_DMA_NBYTES_SHIFT & mask; 817 - desc->buf = dma_buff + offset; 826 + (*desc)->buf = dma_buff + offset; 818 827 } 819 828 820 - desc->status &= ~DEV_DMA_BUFF_STS_MASK; 821 - desc->status |= (DEV_DMA_BUFF_STS_HREADY 829 + (*desc)->status &= ~DEV_DMA_BUFF_STS_MASK; 830 + (*desc)->status |= (DEV_DMA_BUFF_STS_HREADY 822 831 << DEV_DMA_BUFF_STS_SHIFT); 823 - desc++; 832 + (*desc)++; 824 833 } 834 + } 835 + 836 + /* 837 + * dwc2_gadget_config_nonisoc_xfer_ddma - prepare non ISOC DMA desc chain. 838 + * @hs_ep: The endpoint 839 + * @ureq: Request to transfer 840 + * @offset: offset in bytes 841 + * @len: Length of the transfer 842 + * 843 + * This function will iterate over descriptor chain and fill its entries 844 + * with corresponding information based on transfer data. 845 + */ 846 + static void dwc2_gadget_config_nonisoc_xfer_ddma(struct dwc2_hsotg_ep *hs_ep, 847 + struct usb_request *ureq, 848 + unsigned int offset, 849 + unsigned int len) 850 + { 851 + struct dwc2_dma_desc *desc = hs_ep->desc_list; 852 + struct scatterlist *sg; 853 + int i; 854 + u8 desc_count = 0; 855 + 856 + /* non-DMA sg buffer */ 857 + if (!ureq->num_sgs) { 858 + dwc2_gadget_fill_nonisoc_xfer_ddma_one(hs_ep, &desc, 859 + ureq->dma + offset, len, true); 860 + return; 861 + } 862 + 863 + /* DMA sg buffer */ 864 + for_each_sg(ureq->sg, sg, ureq->num_sgs, i) { 865 + dwc2_gadget_fill_nonisoc_xfer_ddma_one(hs_ep, &desc, 866 + sg_dma_address(sg) + sg->offset, sg_dma_len(sg), 867 + sg_is_last(sg)); 868 + desc_count += hs_ep->desc_count; 869 + } 870 + 871 + hs_ep->desc_count = desc_count; 825 872 } 826 873 827 874 /* ··· 973 944 974 945 hs_ep->next_desc = 0; 975 946 list_for_each_entry_safe(hs_req, treq, &hs_ep->queue, queue) { 976 - ret = dwc2_gadget_fill_isoc_desc(hs_ep, hs_req->req.dma, 947 + dma_addr_t dma_addr = hs_req->req.dma; 948 + 949 + if (hs_req->req.num_sgs) { 950 + WARN_ON(hs_req->req.num_sgs > 1); 951 + dma_addr = sg_dma_address(hs_req->req.sg); 952 + } 953 + ret = dwc2_gadget_fill_isoc_desc(hs_ep, dma_addr, 977 954 hs_req->req.length); 978 955 if (ret) 979 956 break; ··· 1135 1100 offset = ureq->actual; 1136 1101 1137 1102 /* Fill DDMA chain entries */ 1138 - dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, ureq->dma + offset, 1103 + dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, ureq, offset, 1139 1104 length); 1140 1105 1141 1106 /* write descriptor chain address to control register */ ··· 1434 1399 */ 1435 1400 if (using_desc_dma(hs) && hs_ep->isochronous) { 1436 1401 if (hs_ep->target_frame != TARGET_FRAME_INITIAL) { 1437 - dwc2_gadget_fill_isoc_desc(hs_ep, hs_req->req.dma, 1402 + dma_addr_t dma_addr = hs_req->req.dma; 1403 + 1404 + if (hs_req->req.num_sgs) { 1405 + WARN_ON(hs_req->req.num_sgs > 1); 1406 + dma_addr = sg_dma_address(hs_req->req.sg); 1407 + } 1408 + dwc2_gadget_fill_isoc_desc(hs_ep, dma_addr, 1438 1409 hs_req->req.length); 1439 1410 } 1440 1411 return 0; ··· 2028 1987 dev_dbg(hsotg->dev, "Receiving zero-length packet on ep%d\n", 2029 1988 index); 2030 1989 if (using_desc_dma(hsotg)) { 2031 - /* Not specific buffer needed for ep0 ZLP */ 2032 - dma_addr_t dma = hs_ep->desc_list_dma; 2033 - 2034 1990 if (!index) 2035 1991 dwc2_gadget_set_ep0_desc_chain(hsotg, hs_ep); 2036 1992 2037 - dwc2_gadget_config_nonisoc_xfer_ddma(hs_ep, dma, 0); 1993 + /* Not specific buffer needed for ep0 ZLP */ 1994 + dwc2_gadget_fill_nonisoc_xfer_ddma_one(hs_ep, &hs_ep->desc_list, 1995 + hs_ep->desc_list_dma, 0, true); 2038 1996 } else { 2039 1997 dwc2_writel(hsotg, DXEPTSIZ_MC(1) | DXEPTSIZ_PKTCNT(1) | 2040 1998 DXEPTSIZ_XFERSIZE(0), ··· 4045 4005 ret = -ENOMEM; 4046 4006 goto error1; 4047 4007 } 4008 + epctrl &= ~(DXEPCTL_TXFNUM_LIMIT << DXEPCTL_TXFNUM_SHIFT); 4048 4009 hsotg->fifo_map |= 1 << fifo_index; 4049 4010 epctrl |= DXEPCTL_TXFNUM(fifo_index); 4050 4011 hs_ep->fifo_index = fifo_index; ··· 4426 4385 hsotg->enabled = 0; 4427 4386 spin_unlock_irqrestore(&hsotg->lock, flags); 4428 4387 4388 + gadget->sg_supported = using_desc_dma(hsotg); 4429 4389 dev_info(hsotg->dev, "bound driver %s\n", driver->driver.name); 4430 4390 4431 4391 return 0;
+3 -3
drivers/usb/dwc3/Kconfig
··· 88 88 platform, please say 'Y' or 'M' here. 89 89 90 90 config USB_DWC3_KEYSTONE 91 - tristate "Texas Instruments Keystone2 Platforms" 92 - depends on ARCH_KEYSTONE || COMPILE_TEST 91 + tristate "Texas Instruments Keystone2/AM654 Platforms" 92 + depends on ARCH_KEYSTONE || ARCH_K3 || COMPILE_TEST 93 93 default USB_DWC3 94 94 help 95 - Support of USB2/3 functionality in TI Keystone2 platforms. 95 + Support of USB2/3 functionality in TI Keystone2 and AM654 platforms. 96 96 Say 'Y' or 'M' here if you have one such device 97 97 98 98 config USB_DWC3_OF_SIMPLE
+9 -3
drivers/usb/dwc3/core.h
··· 692 692 #define DWC3_EP_WEDGE BIT(2) 693 693 #define DWC3_EP_TRANSFER_STARTED BIT(3) 694 694 #define DWC3_EP_PENDING_REQUEST BIT(5) 695 - #define DWC3_EP_END_TRANSFER_PENDING BIT(7) 696 695 697 696 /* This last one is specific to EP0 */ 698 697 #define DWC3_EP0_DIR_IN BIT(31) ··· 862 863 * @num_pending_sgs: counter to pending sgs 863 864 * @num_queued_sgs: counter to the number of sgs which already got queued 864 865 * @remaining: amount of data remaining 866 + * @status: internal dwc3 request status tracking 865 867 * @epnum: endpoint number to which this request refers 866 868 * @trb: pointer to struct dwc3_trb 867 869 * @trb_dma: DMA address of @trb ··· 871 871 * or unaligned OUT) 872 872 * @direction: IN or OUT direction flag 873 873 * @mapped: true when request has been dma-mapped 874 - * @started: request is started 875 874 */ 876 875 struct dwc3_request { 877 876 struct usb_request request; ··· 882 883 unsigned num_pending_sgs; 883 884 unsigned int num_queued_sgs; 884 885 unsigned remaining; 886 + 887 + unsigned int status; 888 + #define DWC3_REQUEST_STATUS_QUEUED 0 889 + #define DWC3_REQUEST_STATUS_STARTED 1 890 + #define DWC3_REQUEST_STATUS_CANCELLED 2 891 + #define DWC3_REQUEST_STATUS_COMPLETED 3 892 + #define DWC3_REQUEST_STATUS_UNKNOWN -1 893 + 885 894 u8 epnum; 886 895 struct dwc3_trb *trb; 887 896 dma_addr_t trb_dma; ··· 899 892 unsigned needs_extra_trb:1; 900 893 unsigned direction:1; 901 894 unsigned mapped:1; 902 - unsigned started:1; 903 895 }; 904 896 905 897 /*
+85 -71
drivers/usb/dwc3/debug.h
··· 193 193 * dwc3_gadget_event_string - returns event name 194 194 * @event: the event code 195 195 */ 196 - static inline const char * 197 - dwc3_gadget_event_string(char *str, const struct dwc3_event_devt *event) 196 + static inline const char *dwc3_gadget_event_string(char *str, size_t size, 197 + const struct dwc3_event_devt *event) 198 198 { 199 199 enum dwc3_link_state state = event->event_info & DWC3_LINK_STATE_MASK; 200 200 201 201 switch (event->type) { 202 202 case DWC3_DEVICE_EVENT_DISCONNECT: 203 - sprintf(str, "Disconnect: [%s]", 203 + snprintf(str, size, "Disconnect: [%s]", 204 204 dwc3_gadget_link_string(state)); 205 205 break; 206 206 case DWC3_DEVICE_EVENT_RESET: 207 - sprintf(str, "Reset [%s]", dwc3_gadget_link_string(state)); 207 + snprintf(str, size, "Reset [%s]", 208 + dwc3_gadget_link_string(state)); 208 209 break; 209 210 case DWC3_DEVICE_EVENT_CONNECT_DONE: 210 - sprintf(str, "Connection Done [%s]", 211 + snprintf(str, size, "Connection Done [%s]", 211 212 dwc3_gadget_link_string(state)); 212 213 break; 213 214 case DWC3_DEVICE_EVENT_LINK_STATUS_CHANGE: 214 - sprintf(str, "Link Change [%s]", 215 + snprintf(str, size, "Link Change [%s]", 215 216 dwc3_gadget_link_string(state)); 216 217 break; 217 218 case DWC3_DEVICE_EVENT_WAKEUP: 218 - sprintf(str, "WakeUp [%s]", dwc3_gadget_link_string(state)); 219 + snprintf(str, size, "WakeUp [%s]", 220 + dwc3_gadget_link_string(state)); 219 221 break; 220 222 case DWC3_DEVICE_EVENT_EOPF: 221 - sprintf(str, "End-Of-Frame [%s]", 223 + snprintf(str, size, "End-Of-Frame [%s]", 222 224 dwc3_gadget_link_string(state)); 223 225 break; 224 226 case DWC3_DEVICE_EVENT_SOF: 225 - sprintf(str, "Start-Of-Frame [%s]", 227 + snprintf(str, size, "Start-Of-Frame [%s]", 226 228 dwc3_gadget_link_string(state)); 227 229 break; 228 230 case DWC3_DEVICE_EVENT_ERRATIC_ERROR: 229 - sprintf(str, "Erratic Error [%s]", 231 + snprintf(str, size, "Erratic Error [%s]", 230 232 dwc3_gadget_link_string(state)); 231 233 break; 232 234 case DWC3_DEVICE_EVENT_CMD_CMPL: 233 - sprintf(str, "Command Complete [%s]", 235 + snprintf(str, size, "Command Complete [%s]", 234 236 dwc3_gadget_link_string(state)); 235 237 break; 236 238 case DWC3_DEVICE_EVENT_OVERFLOW: 237 - sprintf(str, "Overflow [%s]", dwc3_gadget_link_string(state)); 239 + snprintf(str, size, "Overflow [%s]", 240 + dwc3_gadget_link_string(state)); 238 241 break; 239 242 default: 240 - sprintf(str, "UNKNOWN"); 243 + snprintf(str, size, "UNKNOWN"); 241 244 } 242 245 243 246 return str; 244 247 } 245 248 246 - static inline void dwc3_decode_get_status(__u8 t, __u16 i, __u16 l, char *str) 249 + static inline void dwc3_decode_get_status(__u8 t, __u16 i, __u16 l, char *str, 250 + size_t size) 247 251 { 248 252 switch (t & USB_RECIP_MASK) { 249 253 case USB_RECIP_INTERFACE: 250 - sprintf(str, "Get Interface Status(Intf = %d, Length = %d)", 251 - i, l); 254 + snprintf(str, size, "Get Interface Status(Intf = %d, Length = %d)", 255 + i, l); 252 256 break; 253 257 case USB_RECIP_ENDPOINT: 254 - sprintf(str, "Get Endpoint Status(ep%d%s)", 258 + snprintf(str, size, "Get Endpoint Status(ep%d%s)", 255 259 i & ~USB_DIR_IN, 256 260 i & USB_DIR_IN ? "in" : "out"); 257 261 break; ··· 263 259 } 264 260 265 261 static inline void dwc3_decode_set_clear_feature(__u8 t, __u8 b, __u16 v, 266 - __u16 i, char *str) 262 + __u16 i, char *str, size_t size) 267 263 { 268 264 switch (t & USB_RECIP_MASK) { 269 265 case USB_RECIP_DEVICE: 270 - sprintf(str, "%s Device Feature(%s%s)", 266 + snprintf(str, size, "%s Device Feature(%s%s)", 271 267 b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", 272 268 ({char *s; 273 269 switch (v) { ··· 315 311 } s; }) : ""); 316 312 break; 317 313 case USB_RECIP_INTERFACE: 318 - sprintf(str, "%s Interface Feature(%s)", 314 + snprintf(str, size, "%s Interface Feature(%s)", 319 315 b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", 320 316 v == USB_INTRF_FUNC_SUSPEND ? 321 317 "Function Suspend" : "UNKNOWN"); 322 318 break; 323 319 case USB_RECIP_ENDPOINT: 324 - sprintf(str, "%s Endpoint Feature(%s ep%d%s)", 320 + snprintf(str, size, "%s Endpoint Feature(%s ep%d%s)", 325 321 b == USB_REQ_CLEAR_FEATURE ? "Clear" : "Set", 326 322 v == USB_ENDPOINT_HALT ? "Halt" : "UNKNOWN", 327 323 i & ~USB_DIR_IN, ··· 330 326 } 331 327 } 332 328 333 - static inline void dwc3_decode_set_address(__u16 v, char *str) 329 + static inline void dwc3_decode_set_address(__u16 v, char *str, size_t size) 334 330 { 335 - sprintf(str, "Set Address(Addr = %02x)", v); 331 + snprintf(str, size, "Set Address(Addr = %02x)", v); 336 332 } 337 333 338 334 static inline void dwc3_decode_get_set_descriptor(__u8 t, __u8 b, __u16 v, 339 - __u16 i, __u16 l, char *str) 335 + __u16 i, __u16 l, char *str, size_t size) 340 336 { 341 - sprintf(str, "%s %s Descriptor(Index = %d, Length = %d)", 337 + snprintf(str, size, "%s %s Descriptor(Index = %d, Length = %d)", 342 338 b == USB_REQ_GET_DESCRIPTOR ? "Get" : "Set", 343 339 ({ char *s; 344 340 switch (v >> 8) { ··· 397 393 } 398 394 399 395 400 - static inline void dwc3_decode_get_configuration(__u16 l, char *str) 396 + static inline void dwc3_decode_get_configuration(__u16 l, char *str, 397 + size_t size) 401 398 { 402 - sprintf(str, "Get Configuration(Length = %d)", l); 399 + snprintf(str, size, "Get Configuration(Length = %d)", l); 403 400 } 404 401 405 - static inline void dwc3_decode_set_configuration(__u8 v, char *str) 402 + static inline void dwc3_decode_set_configuration(__u8 v, char *str, size_t size) 406 403 { 407 - sprintf(str, "Set Configuration(Config = %d)", v); 404 + snprintf(str, size, "Set Configuration(Config = %d)", v); 408 405 } 409 406 410 - static inline void dwc3_decode_get_intf(__u16 i, __u16 l, char *str) 407 + static inline void dwc3_decode_get_intf(__u16 i, __u16 l, char *str, 408 + size_t size) 411 409 { 412 - sprintf(str, "Get Interface(Intf = %d, Length = %d)", i, l); 410 + snprintf(str, size, "Get Interface(Intf = %d, Length = %d)", i, l); 413 411 } 414 412 415 - static inline void dwc3_decode_set_intf(__u8 v, __u16 i, char *str) 413 + static inline void dwc3_decode_set_intf(__u8 v, __u16 i, char *str, size_t size) 416 414 { 417 - sprintf(str, "Set Interface(Intf = %d, Alt.Setting = %d)", i, v); 415 + snprintf(str, size, "Set Interface(Intf = %d, Alt.Setting = %d)", i, v); 418 416 } 419 417 420 - static inline void dwc3_decode_synch_frame(__u16 i, __u16 l, char *str) 418 + static inline void dwc3_decode_synch_frame(__u16 i, __u16 l, char *str, 419 + size_t size) 421 420 { 422 - sprintf(str, "Synch Frame(Endpoint = %d, Length = %d)", i, l); 421 + snprintf(str, size, "Synch Frame(Endpoint = %d, Length = %d)", i, l); 423 422 } 424 423 425 - static inline void dwc3_decode_set_sel(__u16 l, char *str) 424 + static inline void dwc3_decode_set_sel(__u16 l, char *str, size_t size) 426 425 { 427 - sprintf(str, "Set SEL(Length = %d)", l); 426 + snprintf(str, size, "Set SEL(Length = %d)", l); 428 427 } 429 428 430 - static inline void dwc3_decode_set_isoch_delay(__u8 v, char *str) 429 + static inline void dwc3_decode_set_isoch_delay(__u8 v, char *str, size_t size) 431 430 { 432 - sprintf(str, "Set Isochronous Delay(Delay = %d ns)", v); 431 + snprintf(str, size, "Set Isochronous Delay(Delay = %d ns)", v); 433 432 } 434 433 435 434 /** 436 435 * dwc3_decode_ctrl - returns a string represetion of ctrl request 437 436 */ 438 - static inline const char *dwc3_decode_ctrl(char *str, __u8 bRequestType, 439 - __u8 bRequest, __u16 wValue, __u16 wIndex, __u16 wLength) 437 + static inline const char *dwc3_decode_ctrl(char *str, size_t size, 438 + __u8 bRequestType, __u8 bRequest, __u16 wValue, __u16 wIndex, 439 + __u16 wLength) 440 440 { 441 441 switch (bRequest) { 442 442 case USB_REQ_GET_STATUS: 443 - dwc3_decode_get_status(bRequestType, wIndex, wLength, str); 443 + dwc3_decode_get_status(bRequestType, wIndex, wLength, str, 444 + size); 444 445 break; 445 446 case USB_REQ_CLEAR_FEATURE: 446 447 case USB_REQ_SET_FEATURE: 447 448 dwc3_decode_set_clear_feature(bRequestType, bRequest, wValue, 448 - wIndex, str); 449 + wIndex, str, size); 449 450 break; 450 451 case USB_REQ_SET_ADDRESS: 451 - dwc3_decode_set_address(wValue, str); 452 + dwc3_decode_set_address(wValue, str, size); 452 453 break; 453 454 case USB_REQ_GET_DESCRIPTOR: 454 455 case USB_REQ_SET_DESCRIPTOR: 455 456 dwc3_decode_get_set_descriptor(bRequestType, bRequest, wValue, 456 - wIndex, wLength, str); 457 + wIndex, wLength, str, size); 457 458 break; 458 459 case USB_REQ_GET_CONFIGURATION: 459 - dwc3_decode_get_configuration(wLength, str); 460 + dwc3_decode_get_configuration(wLength, str, size); 460 461 break; 461 462 case USB_REQ_SET_CONFIGURATION: 462 - dwc3_decode_set_configuration(wValue, str); 463 + dwc3_decode_set_configuration(wValue, str, size); 463 464 break; 464 465 case USB_REQ_GET_INTERFACE: 465 - dwc3_decode_get_intf(wIndex, wLength, str); 466 + dwc3_decode_get_intf(wIndex, wLength, str, size); 466 467 break; 467 468 case USB_REQ_SET_INTERFACE: 468 - dwc3_decode_set_intf(wValue, wIndex, str); 469 + dwc3_decode_set_intf(wValue, wIndex, str, size); 469 470 break; 470 471 case USB_REQ_SYNCH_FRAME: 471 - dwc3_decode_synch_frame(wIndex, wLength, str); 472 + dwc3_decode_synch_frame(wIndex, wLength, str, size); 472 473 break; 473 474 case USB_REQ_SET_SEL: 474 - dwc3_decode_set_sel(wLength, str); 475 + dwc3_decode_set_sel(wLength, str, size); 475 476 break; 476 477 case USB_REQ_SET_ISOCH_DELAY: 477 - dwc3_decode_set_isoch_delay(wValue, str); 478 + dwc3_decode_set_isoch_delay(wValue, str, size); 478 479 break; 479 480 default: 480 - sprintf(str, "%02x %02x %02x %02x %02x %02x %02x %02x", 481 + snprintf(str, size, "%02x %02x %02x %02x %02x %02x %02x %02x", 481 482 bRequestType, bRequest, 482 483 cpu_to_le16(wValue) & 0xff, 483 484 cpu_to_le16(wValue) >> 8, ··· 499 490 * dwc3_ep_event_string - returns event name 500 491 * @event: then event code 501 492 */ 502 - static inline const char * 503 - dwc3_ep_event_string(char *str, const struct dwc3_event_depevt *event, 504 - u32 ep0state) 493 + static inline const char *dwc3_ep_event_string(char *str, size_t size, 494 + const struct dwc3_event_depevt *event, u32 ep0state) 505 495 { 506 496 u8 epnum = event->endpoint_number; 507 497 size_t len; 508 498 int status; 509 499 int ret; 510 500 511 - ret = sprintf(str, "ep%d%s: ", epnum >> 1, 501 + ret = snprintf(str, size, "ep%d%s: ", epnum >> 1, 512 502 (epnum & 1) ? "in" : "out"); 513 503 if (ret < 0) 514 504 return "UNKNOWN"; ··· 517 509 switch (event->endpoint_event) { 518 510 case DWC3_DEPEVT_XFERCOMPLETE: 519 511 len = strlen(str); 520 - sprintf(str + len, "Transfer Complete (%c%c%c)", 512 + snprintf(str + len, size - len, "Transfer Complete (%c%c%c)", 521 513 status & DEPEVT_STATUS_SHORT ? 'S' : 's', 522 514 status & DEPEVT_STATUS_IOC ? 'I' : 'i', 523 515 status & DEPEVT_STATUS_LST ? 'L' : 'l'); ··· 525 517 len = strlen(str); 526 518 527 519 if (epnum <= 1) 528 - sprintf(str + len, " [%s]", dwc3_ep0_state_string(ep0state)); 520 + snprintf(str + len, size - len, " [%s]", 521 + dwc3_ep0_state_string(ep0state)); 529 522 break; 530 523 case DWC3_DEPEVT_XFERINPROGRESS: 531 524 len = strlen(str); 532 525 533 - sprintf(str + len, "Transfer In Progress [%d] (%c%c%c)", 526 + snprintf(str + len, size - len, "Transfer In Progress [%d] (%c%c%c)", 534 527 event->parameters, 535 528 status & DEPEVT_STATUS_SHORT ? 'S' : 's', 536 529 status & DEPEVT_STATUS_IOC ? 'I' : 'i', ··· 540 531 case DWC3_DEPEVT_XFERNOTREADY: 541 532 len = strlen(str); 542 533 543 - sprintf(str + len, "Transfer Not Ready [%d]%s", 534 + snprintf(str + len, size - len, "Transfer Not Ready [%d]%s", 544 535 event->parameters, 545 536 status & DEPEVT_STATUS_TRANSFER_ACTIVE ? 546 537 " (Active)" : " (Not Active)"); 538 + 539 + len = strlen(str); 547 540 548 541 /* Control Endpoints */ 549 542 if (epnum <= 1) { ··· 553 542 554 543 switch (phase) { 555 544 case DEPEVT_STATUS_CONTROL_DATA: 556 - strcat(str, " [Data Phase]"); 545 + snprintf(str + ret, size - ret, 546 + " [Data Phase]"); 557 547 break; 558 548 case DEPEVT_STATUS_CONTROL_STATUS: 559 - strcat(str, " [Status Phase]"); 549 + snprintf(str + ret, size - ret, 550 + " [Status Phase]"); 560 551 } 561 552 } 562 553 break; 563 554 case DWC3_DEPEVT_RXTXFIFOEVT: 564 - strcat(str, "FIFO"); 555 + snprintf(str + ret, size - ret, "FIFO"); 565 556 break; 566 557 case DWC3_DEPEVT_STREAMEVT: 567 558 status = event->status; 568 559 569 560 switch (status) { 570 561 case DEPEVT_STREAMEVT_FOUND: 571 - sprintf(str + ret, " Stream %d Found", 562 + snprintf(str + ret, size - ret, " Stream %d Found", 572 563 event->parameters); 573 564 break; 574 565 case DEPEVT_STREAMEVT_NOTFOUND: 575 566 default: 576 - strcat(str, " Stream Not Found"); 567 + snprintf(str + ret, size - ret, " Stream Not Found"); 577 568 break; 578 569 } 579 570 580 571 break; 581 572 case DWC3_DEPEVT_EPCMDCMPLT: 582 - strcat(str, "Endpoint Command Complete"); 573 + snprintf(str + ret, size - ret, "Endpoint Command Complete"); 583 574 break; 584 575 default: 585 - sprintf(str, "UNKNOWN"); 576 + snprintf(str, size, "UNKNOWN"); 586 577 } 587 578 588 579 return str; ··· 624 611 } 625 612 } 626 613 627 - static inline const char *dwc3_decode_event(char *str, u32 event, u32 ep0state) 614 + static inline const char *dwc3_decode_event(char *str, size_t size, u32 event, 615 + u32 ep0state) 628 616 { 629 617 const union dwc3_event evt = (union dwc3_event) event; 630 618 631 619 if (evt.type.is_devspec) 632 - return dwc3_gadget_event_string(str, &evt.devt); 620 + return dwc3_gadget_event_string(str, size, &evt.devt); 633 621 else 634 - return dwc3_ep_event_string(str, &evt.depevt, ep0state); 622 + return dwc3_ep_event_string(str, size, &evt.depevt, ep0state); 635 623 } 636 624 637 625 static inline const char *dwc3_ep_cmd_status_string(int status)
+9
drivers/usb/dwc3/dwc3-haps.c
··· 106 106 { 107 107 PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS, 108 108 PCI_DEVICE_ID_SYNOPSYS_HAPSUSB3), 109 + /* 110 + * i.MX6QP and i.MX7D platform use a PCIe controller with the 111 + * same VID and PID as this USB controller. The system may 112 + * incorrectly match this driver to that PCIe controller. To 113 + * workaround this, specifically use class type USB to prevent 114 + * incorrect driver matching. 115 + */ 116 + .class = (PCI_CLASS_SERIAL_USB << 8), 117 + .class_mask = 0xffff00, 109 118 }, 110 119 { 111 120 PCI_DEVICE(PCI_VENDOR_ID_SYNOPSYS,
+10 -1
drivers/usb/dwc3/dwc3-keystone.c
··· 106 106 goto err_irq; 107 107 } 108 108 109 + /* IRQ processing not required currently for AM65 */ 110 + if (of_device_is_compatible(node, "ti,am654-dwc3")) 111 + goto skip_irq; 112 + 109 113 irq = platform_get_irq(pdev, 0); 110 114 if (irq < 0) { 111 115 dev_err(&pdev->dev, "missing irq\n"); ··· 127 123 128 124 kdwc3_enable_irqs(kdwc); 129 125 126 + skip_irq: 130 127 error = of_platform_populate(node, NULL, NULL, dev); 131 128 if (error) { 132 129 dev_err(&pdev->dev, "failed to create dwc3 core\n"); ··· 157 152 static int kdwc3_remove(struct platform_device *pdev) 158 153 { 159 154 struct dwc3_keystone *kdwc = platform_get_drvdata(pdev); 155 + struct device_node *node = pdev->dev.of_node; 160 156 161 - kdwc3_disable_irqs(kdwc); 157 + if (!of_device_is_compatible(node, "ti,am654-dwc3")) 158 + kdwc3_disable_irqs(kdwc); 159 + 162 160 device_for_each_child(&pdev->dev, NULL, kdwc3_remove_core); 163 161 pm_runtime_put_sync(kdwc->dev); 164 162 pm_runtime_disable(kdwc->dev); ··· 173 165 174 166 static const struct of_device_id kdwc3_of_match[] = { 175 167 { .compatible = "ti,keystone-dwc3", }, 168 + { .compatible = "ti,am654-dwc3" }, 176 169 {}, 177 170 }; 178 171 MODULE_DEVICE_TABLE(of, kdwc3_of_match);
+1
drivers/usb/dwc3/dwc3-qcom.c
··· 595 595 static const struct of_device_id dwc3_qcom_of_match[] = { 596 596 { .compatible = "qcom,dwc3" }, 597 597 { .compatible = "qcom,msm8996-dwc3" }, 598 + { .compatible = "qcom,msm8998-dwc3" }, 598 599 { .compatible = "qcom,sdm845-dwc3" }, 599 600 { } 600 601 };
+34 -31
drivers/usb/dwc3/gadget.c
··· 174 174 { 175 175 struct dwc3 *dwc = dep->dwc; 176 176 177 - req->started = false; 178 177 list_del(&req->list); 179 178 req->remaining = 0; 180 179 req->needs_extra_trb = false; ··· 208 209 struct dwc3 *dwc = dep->dwc; 209 210 210 211 dwc3_gadget_del_and_unmap_request(dep, req, status); 212 + req->status = DWC3_REQUEST_STATUS_COMPLETED; 211 213 212 214 spin_unlock(&dwc->lock); 213 215 usb_gadget_giveback_request(&dep->endpoint, &req->request); ··· 384 384 385 385 trace_dwc3_gadget_ep_cmd(dep, cmd, params, cmd_status); 386 386 387 - if (ret == 0) { 388 - switch (DWC3_DEPCMD_CMD(cmd)) { 389 - case DWC3_DEPCMD_STARTTRANSFER: 390 - dep->flags |= DWC3_EP_TRANSFER_STARTED; 391 - dwc3_gadget_ep_get_transfer_index(dep); 392 - break; 393 - case DWC3_DEPCMD_ENDTRANSFER: 394 - dep->flags &= ~DWC3_EP_TRANSFER_STARTED; 395 - break; 396 - default: 397 - /* nothing */ 398 - break; 399 - } 387 + if (ret == 0 && DWC3_DEPCMD_CMD(cmd) == DWC3_DEPCMD_STARTTRANSFER) { 388 + dep->flags |= DWC3_EP_TRANSFER_STARTED; 389 + dwc3_gadget_ep_get_transfer_index(dep); 400 390 } 401 391 402 392 if (saved_config) { ··· 632 642 633 643 dep->type = usb_endpoint_type(desc); 634 644 dep->flags |= DWC3_EP_ENABLED; 635 - dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING; 636 645 637 646 reg = dwc3_readl(dwc->regs, DWC3_DALEPENA); 638 647 reg |= DWC3_DALEPENA_EP(dep->number); ··· 687 698 return 0; 688 699 } 689 700 690 - static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force); 701 + static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, 702 + bool interrupt); 691 703 static void dwc3_remove_requests(struct dwc3 *dwc, struct dwc3_ep *dep) 692 704 { 693 705 struct dwc3_request *req; 694 706 695 - dwc3_stop_active_transfer(dep, true); 707 + dwc3_stop_active_transfer(dep, true, false); 696 708 697 709 /* - giveback all requests to gadget driver */ 698 710 while (!list_empty(&dep->started_list)) { ··· 738 748 739 749 dep->stream_capable = false; 740 750 dep->type = 0; 741 - dep->flags &= DWC3_EP_END_TRANSFER_PENDING; 751 + dep->flags = 0; 742 752 743 753 /* Clear out the ep descriptors for non-ep0 */ 744 754 if (dep->number > 1) { ··· 837 847 req->direction = dep->direction; 838 848 req->epnum = dep->number; 839 849 req->dep = dep; 850 + req->status = DWC3_REQUEST_STATUS_UNKNOWN; 840 851 841 852 trace_dwc3_alloc_request(req); 842 853 ··· 1351 1360 * to wait for the next XferNotReady to test the command again 1352 1361 */ 1353 1362 if (cmd_status == 0) { 1354 - dwc3_stop_active_transfer(dep, true); 1363 + dwc3_stop_active_transfer(dep, true, true); 1355 1364 return 0; 1356 1365 } 1357 1366 } ··· 1426 1435 &req->request, req->dep->name)) 1427 1436 return -EINVAL; 1428 1437 1438 + if (WARN(req->status < DWC3_REQUEST_STATUS_COMPLETED, 1439 + "%s: request %pK already in flight\n", 1440 + dep->name, &req->request)) 1441 + return -EINVAL; 1442 + 1429 1443 pm_runtime_get(dwc->dev); 1430 1444 1431 1445 req->request.actual = 0; ··· 1439 1443 trace_dwc3_ep_queue(req); 1440 1444 1441 1445 list_add_tail(&req->list, &dep->pending_list); 1446 + req->status = DWC3_REQUEST_STATUS_QUEUED; 1442 1447 1443 1448 /* 1444 1449 * NOTICE: Isochronous endpoints should NEVER be prestarted. We must ··· 1503 1506 trb->ctrl &= ~DWC3_TRB_CTRL_HWO; 1504 1507 dwc3_ep_inc_deq(dep); 1505 1508 } 1509 + 1510 + req->num_trbs = 0; 1506 1511 } 1507 1512 1508 1513 static void dwc3_gadget_ep_cleanup_cancelled_requests(struct dwc3_ep *dep) ··· 1546 1547 } 1547 1548 if (r == req) { 1548 1549 /* wait until it is processed */ 1549 - dwc3_stop_active_transfer(dep, true); 1550 + dwc3_stop_active_transfer(dep, true, true); 1550 1551 1551 1552 if (!r->trb) 1552 1553 goto out0; 1553 1554 1554 1555 dwc3_gadget_move_cancelled_request(req); 1555 - goto out0; 1556 + if (dep->flags & DWC3_EP_TRANSFER_STARTED) 1557 + goto out0; 1558 + else 1559 + goto out1; 1556 1560 } 1557 1561 dev_err(dwc->dev, "request %pK was not queued to %s\n", 1558 1562 request, ep->name); ··· 1563 1561 goto out0; 1564 1562 } 1565 1563 1564 + out1: 1566 1565 dwc3_gadget_giveback(dep, req, -ECONNRESET); 1567 1566 1568 1567 out0: ··· 2503 2500 dwc3_gadget_ep_cleanup_completed_requests(dep, event, status); 2504 2501 2505 2502 if (stop) { 2506 - dwc3_stop_active_transfer(dep, true); 2503 + dwc3_stop_active_transfer(dep, true, true); 2507 2504 dep->flags = DWC3_EP_ENABLED; 2508 2505 } 2509 2506 ··· 2550 2547 dep = dwc->eps[epnum]; 2551 2548 2552 2549 if (!(dep->flags & DWC3_EP_ENABLED)) { 2553 - if (!(dep->flags & DWC3_EP_END_TRANSFER_PENDING)) 2550 + if (!(dep->flags & DWC3_EP_TRANSFER_STARTED)) 2554 2551 return; 2555 2552 2556 2553 /* Handle only EPCMDCMPLT when EP disabled */ ··· 2574 2571 cmd = DEPEVT_PARAMETER_CMD(event->parameters); 2575 2572 2576 2573 if (cmd == DWC3_DEPCMD_ENDTRANSFER) { 2577 - dep->flags &= ~DWC3_EP_END_TRANSFER_PENDING; 2574 + dep->flags &= ~DWC3_EP_TRANSFER_STARTED; 2578 2575 dwc3_gadget_ep_cleanup_cancelled_requests(dep); 2579 2576 } 2580 2577 break; ··· 2624 2621 } 2625 2622 } 2626 2623 2627 - static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force) 2624 + static void dwc3_stop_active_transfer(struct dwc3_ep *dep, bool force, 2625 + bool interrupt) 2628 2626 { 2629 2627 struct dwc3 *dwc = dep->dwc; 2630 2628 struct dwc3_gadget_ep_cmd_params params; 2631 2629 u32 cmd; 2632 2630 int ret; 2633 2631 2634 - if ((dep->flags & DWC3_EP_END_TRANSFER_PENDING) || 2635 - !dep->resource_index) 2632 + if (!(dep->flags & DWC3_EP_TRANSFER_STARTED)) 2636 2633 return; 2637 2634 2638 2635 /* ··· 2668 2665 2669 2666 cmd = DWC3_DEPCMD_ENDTRANSFER; 2670 2667 cmd |= force ? DWC3_DEPCMD_HIPRI_FORCERM : 0; 2671 - cmd |= DWC3_DEPCMD_CMDIOC; 2668 + cmd |= interrupt ? DWC3_DEPCMD_CMDIOC : 0; 2672 2669 cmd |= DWC3_DEPCMD_PARAM(dep->resource_index); 2673 2670 memset(&params, 0, sizeof(params)); 2674 2671 ret = dwc3_send_gadget_ep_cmd(dep, cmd, &params); 2675 2672 WARN_ON_ONCE(ret); 2676 2673 dep->resource_index = 0; 2677 2674 2678 - if (dwc3_is_usb31(dwc) || dwc->revision < DWC3_REVISION_310A) { 2679 - dep->flags |= DWC3_EP_END_TRANSFER_PENDING; 2675 + if (dwc3_is_usb31(dwc) || dwc->revision < DWC3_REVISION_310A) 2680 2676 udelay(100); 2681 - } 2682 2677 } 2683 2678 2684 2679 static void dwc3_clear_stall_all_ep(struct dwc3 *dwc) ··· 3339 3338 dev_err(dwc->dev, "failed to register udc\n"); 3340 3339 goto err4; 3341 3340 } 3341 + 3342 + dwc3_gadget_set_speed(&dwc->gadget, dwc->maximum_speed); 3342 3343 3343 3344 return 0; 3344 3345
+2 -2
drivers/usb/dwc3/gadget.h
··· 75 75 { 76 76 struct dwc3_ep *dep = req->dep; 77 77 78 - req->started = true; 78 + req->status = DWC3_REQUEST_STATUS_STARTED; 79 79 list_move_tail(&req->list, &dep->started_list); 80 80 } 81 81 ··· 90 90 { 91 91 struct dwc3_ep *dep = req->dep; 92 92 93 - req->started = false; 93 + req->status = DWC3_REQUEST_STATUS_CANCELLED; 94 94 list_move_tail(&req->list, &dep->cancelled_list); 95 95 } 96 96
+5 -5
drivers/usb/dwc3/trace.h
··· 59 59 __entry->ep0state = dwc->ep0state; 60 60 ), 61 61 TP_printk("event (%08x): %s", __entry->event, 62 - dwc3_decode_event(__get_str(str), __entry->event, 63 - __entry->ep0state)) 62 + dwc3_decode_event(__get_str(str), DWC3_MSG_MAX, 63 + __entry->event, __entry->ep0state)) 64 64 ); 65 65 66 66 DEFINE_EVENT(dwc3_log_event, dwc3_event, ··· 86 86 __entry->wIndex = le16_to_cpu(ctrl->wIndex); 87 87 __entry->wLength = le16_to_cpu(ctrl->wLength); 88 88 ), 89 - TP_printk("%s", dwc3_decode_ctrl(__get_str(str), __entry->bRequestType, 89 + TP_printk("%s", dwc3_decode_ctrl(__get_str(str), DWC3_MSG_MAX, 90 + __entry->bRequestType, 90 91 __entry->bRequest, __entry->wValue, 91 92 __entry->wIndex, __entry->wLength) 92 93 ) ··· 306 305 __entry->trb_enqueue = dep->trb_enqueue; 307 306 __entry->trb_dequeue = dep->trb_dequeue; 308 307 ), 309 - TP_printk("%s: mps %d/%d streams %d burst %d ring %d/%d flags %c:%c%c%c%c:%c:%c", 308 + TP_printk("%s: mps %d/%d streams %d burst %d ring %d/%d flags %c:%c%c%c%c:%c", 310 309 __get_str(name), __entry->maxpacket, 311 310 __entry->maxpacket_limit, __entry->max_streams, 312 311 __entry->maxburst, __entry->trb_enqueue, ··· 316 315 __entry->flags & DWC3_EP_WEDGE ? 'W' : 'w', 317 316 __entry->flags & DWC3_EP_TRANSFER_STARTED ? 'B' : 'b', 318 317 __entry->flags & DWC3_EP_PENDING_REQUEST ? 'P' : 'p', 319 - __entry->flags & DWC3_EP_END_TRANSFER_PENDING ? 'E' : 'e', 320 318 __entry->direction ? '<' : '>' 321 319 ) 322 320 );
+24 -17
drivers/usb/gadget/epautoconf.c
··· 67 67 ) 68 68 { 69 69 struct usb_ep *ep; 70 - u8 type; 71 - 72 - type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; 73 70 74 71 if (gadget->ops->match_ep) { 75 72 ep = gadget->ops->match_ep(gadget, desc, ep_comp); ··· 106 109 desc->bEndpointAddress |= gadget->out_epnum; 107 110 } 108 111 109 - /* report (variable) full speed bulk maxpacket */ 110 - if ((type == USB_ENDPOINT_XFER_BULK) && !ep_comp) { 111 - int size = ep->maxpacket_limit; 112 - 113 - /* min() doesn't work on bitfields with gcc-3.5 */ 114 - if (size > 64) 115 - size = 64; 116 - desc->wMaxPacketSize = cpu_to_le16(size); 117 - } 118 - 119 112 ep->address = desc->bEndpointAddress; 120 113 ep->desc = NULL; 121 114 ep->comp_desc = NULL; ··· 139 152 * 140 153 * On success, this returns an claimed usb_ep, and modifies the endpoint 141 154 * descriptor bEndpointAddress. For bulk endpoints, the wMaxPacket value 142 - * is initialized as if the endpoint were used at full speed. To prevent 143 - * the endpoint from being returned by a later autoconfig call, claims it 144 - * by assigning ep->claimed to true. 155 + * is initialized as if the endpoint were used at full speed. Because of 156 + * that the users must consider adjusting the autoconfigured descriptor. 157 + * To prevent the endpoint from being returned by a later autoconfig call, 158 + * claims it by assigning ep->claimed to true. 145 159 * 146 160 * On failure, this returns a null endpoint descriptor. 147 161 */ ··· 151 163 struct usb_endpoint_descriptor *desc 152 164 ) 153 165 { 154 - return usb_ep_autoconfig_ss(gadget, desc, NULL); 166 + struct usb_ep *ep; 167 + u8 type; 168 + 169 + ep = usb_ep_autoconfig_ss(gadget, desc, NULL); 170 + if (!ep) 171 + return NULL; 172 + 173 + type = desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK; 174 + 175 + /* report (variable) full speed bulk maxpacket */ 176 + if (type == USB_ENDPOINT_XFER_BULK) { 177 + int size = ep->maxpacket_limit; 178 + 179 + /* min() doesn't work on bitfields with gcc-3.5 */ 180 + if (size > 64) 181 + size = 64; 182 + desc->wMaxPacketSize = cpu_to_le16(size); 183 + } 184 + 185 + return ep; 155 186 } 156 187 EXPORT_SYMBOL_GPL(usb_ep_autoconfig); 157 188
+12
drivers/usb/gadget/function/f_fs.c
··· 1082 1082 * condition with req->complete callback. 1083 1083 */ 1084 1084 usb_ep_dequeue(ep->ep, req); 1085 + wait_for_completion(&done); 1085 1086 interrupted = ep->status < 0; 1086 1087 } 1087 1088 ··· 2844 2843 struct usb_request *req; 2845 2844 struct usb_ep *ep; 2846 2845 u8 bEndpointAddress; 2846 + u16 wMaxPacketSize; 2847 2847 2848 2848 /* 2849 2849 * We back up bEndpointAddress because autoconfig overwrites 2850 2850 * it with physical endpoint address. 2851 2851 */ 2852 2852 bEndpointAddress = ds->bEndpointAddress; 2853 + /* 2854 + * We back up wMaxPacketSize because autoconfig treats 2855 + * endpoint descriptors as if they were full speed. 2856 + */ 2857 + wMaxPacketSize = ds->wMaxPacketSize; 2853 2858 pr_vdebug("autoconfig\n"); 2854 2859 ep = usb_ep_autoconfig(func->gadget, ds); 2855 2860 if (unlikely(!ep)) ··· 2876 2869 */ 2877 2870 if (func->ffs->user_flags & FUNCTIONFS_VIRTUAL_ADDR) 2878 2871 ds->bEndpointAddress = bEndpointAddress; 2872 + /* 2873 + * Restore wMaxPacketSize which was potentially 2874 + * overwritten by autoconfig. 2875 + */ 2876 + ds->wMaxPacketSize = wMaxPacketSize; 2879 2877 } 2880 2878 ffs_dump_mem(": Rewritten ep desc", ds, ds->bLength); 2881 2879
+6 -4
drivers/usb/gadget/function/f_uac1.c
··· 459 459 } else if (intf == uac1->as_in_intf) { 460 460 uac1->as_in_alt = alt; 461 461 462 - if (alt) 463 - ret = u_audio_start_playback(&uac1->g_audio); 464 - else 465 - u_audio_stop_playback(&uac1->g_audio); 462 + if (alt) 463 + ret = u_audio_start_playback(&uac1->g_audio); 464 + else 465 + u_audio_stop_playback(&uac1->g_audio); 466 466 } else { 467 467 dev_err(dev, "%s:%d Error!\n", __func__, __LINE__); 468 468 return -EINVAL; ··· 568 568 goto fail; 569 569 as_out_interface_alt_0_desc.bInterfaceNumber = status; 570 570 as_out_interface_alt_1_desc.bInterfaceNumber = status; 571 + ac_header_desc.baInterfaceNr[0] = status; 571 572 uac1->as_out_intf = status; 572 573 uac1->as_out_alt = 0; 573 574 ··· 577 576 goto fail; 578 577 as_in_interface_alt_0_desc.bInterfaceNumber = status; 579 578 as_in_interface_alt_1_desc.bInterfaceNumber = status; 579 + ac_header_desc.baInterfaceNr[1] = status; 580 580 uac1->as_in_intf = status; 581 581 uac1->as_in_alt = 0; 582 582
+1 -1
drivers/usb/gadget/function/u_ecm.h
··· 7 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_ECM_H
+1 -1
drivers/usb/gadget/function/u_eem.h
··· 7 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_EEM_H
+1 -1
drivers/usb/gadget/function/u_ether_configfs.h
··· 7 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef __U_ETHER_CONFIGFS_H
+1 -1
drivers/usb/gadget/function/u_fs.h
··· 7 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_FFS_H
+1 -1
drivers/usb/gadget/function/u_gether.h
··· 7 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_GETHER_H
+1 -1
drivers/usb/gadget/function/u_hid.h
··· 7 7 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_HID_H
+1 -1
drivers/usb/gadget/function/u_midi.h
··· 7 7 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_MIDI_H
+1 -1
drivers/usb/gadget/function/u_ncm.h
··· 7 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_NCM_H
+1 -1
drivers/usb/gadget/function/u_printer.h
··· 7 7 * Copyright (c) 2015 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_PRINTER_H
+1 -1
drivers/usb/gadget/function/u_rndis.h
··· 7 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_RNDIS_H
+14 -21
drivers/usb/gadget/function/u_serial.c
··· 16 16 17 17 #include <linux/kernel.h> 18 18 #include <linux/sched.h> 19 - #include <linux/interrupt.h> 20 19 #include <linux/device.h> 21 20 #include <linux/delay.h> 22 21 #include <linux/tty.h> ··· 25 26 #include <linux/module.h> 26 27 #include <linux/console.h> 27 28 #include <linux/kthread.h> 29 + #include <linux/workqueue.h> 28 30 #include <linux/kfifo.h> 29 31 30 32 #include "u_serial.h" ··· 110 110 int read_allocated; 111 111 struct list_head read_queue; 112 112 unsigned n_read; 113 - struct tasklet_struct push; 113 + struct delayed_work push; 114 114 115 115 struct list_head write_pool; 116 116 int write_started; ··· 352 352 * So QUEUE_SIZE packets plus however many the FIFO holds (usually two) 353 353 * can be buffered before the TTY layer's buffers (currently 64 KB). 354 354 */ 355 - static void gs_rx_push(unsigned long _port) 355 + static void gs_rx_push(struct work_struct *work) 356 356 { 357 - struct gs_port *port = (void *)_port; 357 + struct delayed_work *w = to_delayed_work(work); 358 + struct gs_port *port = container_of(w, struct gs_port, push); 358 359 struct tty_struct *tty; 359 360 struct list_head *queue = &port->read_queue; 360 361 bool disconnect = false; ··· 430 429 431 430 /* We want our data queue to become empty ASAP, keeping data 432 431 * in the tty and ldisc (not here). If we couldn't push any 433 - * this time around, there may be trouble unless there's an 434 - * implicit tty_unthrottle() call on its way... 432 + * this time around, RX may be starved, so wait until next jiffy. 435 433 * 436 - * REVISIT we should probably add a timer to keep the tasklet 437 - * from starving ... but it's not clear that case ever happens. 434 + * We may leave non-empty queue only when there is a tty, and 435 + * either it is throttled or there is no more room in flip buffer. 438 436 */ 439 - if (!list_empty(queue) && tty) { 440 - if (!tty_throttled(tty)) { 441 - if (do_push) 442 - tasklet_schedule(&port->push); 443 - else 444 - pr_warn("ttyGS%d: RX not scheduled?\n", 445 - port->port_num); 446 - } 447 - } 437 + if (!list_empty(queue) && !tty_throttled(tty)) 438 + schedule_delayed_work(&port->push, 1); 448 439 449 440 /* If we're still connected, refill the USB RX queue. */ 450 441 if (!disconnect && port->port_usb) ··· 452 459 /* Queue all received data until the tty layer is ready for it. */ 453 460 spin_lock(&port->port_lock); 454 461 list_add_tail(&req->list, &port->read_queue); 455 - tasklet_schedule(&port->push); 462 + schedule_delayed_work(&port->push, 0); 456 463 spin_unlock(&port->port_lock); 457 464 } 458 465 ··· 847 854 * rts/cts, or other handshaking with the host, but if the 848 855 * read queue backs up enough we'll be NAKing OUT packets. 849 856 */ 850 - tasklet_schedule(&port->push); 851 857 pr_vdebug("ttyGS%d: unthrottle\n", port->port_num); 858 + schedule_delayed_work(&port->push, 0); 852 859 } 853 860 spin_unlock_irqrestore(&port->port_lock, flags); 854 861 } ··· 1152 1159 init_waitqueue_head(&port->drain_wait); 1153 1160 init_waitqueue_head(&port->close_wait); 1154 1161 1155 - tasklet_init(&port->push, gs_rx_push, (unsigned long) port); 1162 + INIT_DELAYED_WORK(&port->push, gs_rx_push); 1156 1163 1157 1164 INIT_LIST_HEAD(&port->read_pool); 1158 1165 INIT_LIST_HEAD(&port->read_queue); ··· 1179 1186 1180 1187 static void gserial_free_port(struct gs_port *port) 1181 1188 { 1182 - tasklet_kill(&port->push); 1189 + cancel_delayed_work_sync(&port->push); 1183 1190 /* wait for old opens to finish */ 1184 1191 wait_event(port->close_wait, gs_closed(port)); 1185 1192 WARN_ON(port->port_usb != NULL);
+1 -1
drivers/usb/gadget/function/u_uac2.h
··· 7 7 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_UAC2_H
+1 -1
drivers/usb/gadget/function/u_uvc.h
··· 7 7 * Copyright (c) 2013-2014 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef U_UVC_H
+2
drivers/usb/gadget/function/uvc.h
··· 56 56 dev_dbg(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args) 57 57 #define uvcg_info(f, fmt, args...) \ 58 58 dev_info(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args) 59 + #define uvcg_warn(f, fmt, args...) \ 60 + dev_warn(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args) 59 61 #define uvcg_err(f, fmt, args...) \ 60 62 dev_err(&(f)->config->cdev->gadget->dev, "%s: " fmt, (f)->name, ##args) 61 63
+1 -9
drivers/usb/gadget/function/uvc_configfs.c
··· 7 7 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #include <linux/sort.h> ··· 1570 1570 if (ret) \ 1571 1571 goto end; \ 1572 1572 \ 1573 - if (num > 255) { \ 1574 - ret = -EINVAL; \ 1575 - goto end; \ 1576 - } \ 1577 1573 u->desc.aname = num; \ 1578 1574 ret = len; \ 1579 1575 end: \ ··· 1763 1767 if (ret) \ 1764 1768 goto end; \ 1765 1769 \ 1766 - if (num > 255) { \ 1767 - ret = -EINVAL; \ 1768 - goto end; \ 1769 - } \ 1770 1770 u->desc.aname = num; \ 1771 1771 ret = len; \ 1772 1772 end: \
+1 -1
drivers/usb/gadget/function/uvc_configfs.h
··· 7 7 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 #ifndef UVC_CONFIGFS_H 13 13 #define UVC_CONFIGFS_H
+1 -1
drivers/usb/gadget/function/uvc_v4l2.h
··· 7 7 * 8 8 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 9 9 * http://www.samsung.com 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef __UVC_V4L2_H__
+1 -1
drivers/usb/gadget/function/uvc_video.h
··· 7 7 * 8 8 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 9 9 * http://www.samsung.com 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 #ifndef __UVC_VIDEO_H__ 13 13 #define __UVC_VIDEO_H__
+17 -17
drivers/usb/gadget/legacy/inode.c
··· 1218 1218 if (dev->state <= STATE_DEV_OPENED) 1219 1219 return DEFAULT_POLLMASK; 1220 1220 1221 - poll_wait(fd, &dev->wait, wait); 1221 + poll_wait(fd, &dev->wait, wait); 1222 1222 1223 - spin_lock_irq (&dev->lock); 1223 + spin_lock_irq(&dev->lock); 1224 1224 1225 - /* report fd mode change before acting on it */ 1226 - if (dev->setup_abort) { 1227 - dev->setup_abort = 0; 1228 - mask = EPOLLHUP; 1229 - goto out; 1230 - } 1225 + /* report fd mode change before acting on it */ 1226 + if (dev->setup_abort) { 1227 + dev->setup_abort = 0; 1228 + mask = EPOLLHUP; 1229 + goto out; 1230 + } 1231 1231 1232 - if (dev->state == STATE_DEV_SETUP) { 1233 - if (dev->setup_in || dev->setup_can_stall) 1234 - mask = EPOLLOUT; 1235 - } else { 1236 - if (dev->ev_next != 0) 1237 - mask = EPOLLIN; 1238 - } 1232 + if (dev->state == STATE_DEV_SETUP) { 1233 + if (dev->setup_in || dev->setup_can_stall) 1234 + mask = EPOLLOUT; 1235 + } else { 1236 + if (dev->ev_next != 0) 1237 + mask = EPOLLIN; 1238 + } 1239 1239 out: 1240 - spin_unlock_irq(&dev->lock); 1241 - return mask; 1240 + spin_unlock_irq(&dev->lock); 1241 + return mask; 1242 1242 } 1243 1243 1244 1244 static long dev_ioctl (struct file *fd, unsigned code, unsigned long value)
+1 -1
drivers/usb/gadget/u_f.c
··· 5 5 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 6 6 * http://www.samsung.com 7 7 * 8 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 8 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 9 9 */ 10 10 11 11 #include "u_f.h"
+1 -1
drivers/usb/gadget/u_f.h
··· 7 7 * Copyright (c) 2013 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef __U_F_H__
+1 -1
drivers/usb/gadget/u_os_desc.h
··· 7 7 * Copyright (c) 2014 Samsung Electronics Co., Ltd. 8 8 * http://www.samsung.com 9 9 * 10 - * Author: Andrzej Pietrasiewicz <andrzej.p@samsung.com> 10 + * Author: Andrzej Pietrasiewicz <andrzejtp2010@gmail.com> 11 11 */ 12 12 13 13 #ifndef __U_OS_DESC_H__
+1 -1
drivers/usb/gadget/udc/aspeed-vhub/epn.c
··· 120 120 /* No current DMA ongoing */ 121 121 req->active = false; 122 122 123 - /* Grab lenght out of HW */ 123 + /* Grab length out of HW */ 124 124 len = VHUB_EP_DMA_TX_SIZE(stat); 125 125 126 126 /* If not using DMA, copy data out if needed */
+1 -1
drivers/usb/gadget/udc/aspeed-vhub/hub.c
··· 295 295 dsize = AST_VHUB_HUB_DESC_SIZE; 296 296 memcpy(ep->buf, &ast_vhub_hub_desc, dsize); 297 297 BUILD_BUG_ON(dsize > sizeof(ast_vhub_hub_desc)); 298 - BUILD_BUG_ON(AST_VHUB_HUB_DESC_SIZE >= AST_VHUB_EP0_MAX_PACKET); 298 + BUILD_BUG_ON(AST_VHUB_HUB_DESC_SIZE >= AST_VHUB_EP0_MAX_PACKET); 299 299 break; 300 300 default: 301 301 return std_req_stall;
+2 -2
drivers/usb/gadget/udc/bdc/bdc_cmd.c
··· 311 311 /* if the endpoint it not stallled */ 312 312 if (!(ep->flags & BDC_EP_STALL)) { 313 313 ret = bdc_ep_set_stall(bdc, epnum); 314 - if (ret) 315 - return ret; 314 + if (ret) 315 + return ret; 316 316 } 317 317 } 318 318 /* Preserve the seq number for ep0 only */
+4 -4
drivers/usb/gadget/udc/core.c
··· 281 281 * @ep:the endpoint associated with the request 282 282 * @req:the request being canceled 283 283 * 284 - * If the request is still active on the endpoint, it is dequeued and its 285 - * completion routine is called (with status -ECONNRESET); else a negative 286 - * error code is returned. This is guaranteed to happen before the call to 287 - * usb_ep_dequeue() returns. 284 + * If the request is still active on the endpoint, it is dequeued and 285 + * eventually its completion routine is called (with status -ECONNRESET); 286 + * else a negative error code is returned. This routine is asynchronous, 287 + * that is, it may return before the completion routine runs. 288 288 * 289 289 * Note that some hardware can't clear out write fifos (to unlink the request 290 290 * at the head of the queue) except as part of disconnecting from usb. Such
+4 -7
drivers/usb/gadget/udc/fotg210-udc.c
··· 326 326 static void fotg210_start_dma(struct fotg210_ep *ep, 327 327 struct fotg210_request *req) 328 328 { 329 + struct device *dev = &ep->fotg210->gadget.dev; 329 330 dma_addr_t d; 330 331 u8 *buffer; 331 332 u32 length; ··· 349 348 length = req->req.length; 350 349 } 351 350 352 - d = dma_map_single(NULL, buffer, length, 351 + d = dma_map_single(dev, buffer, length, 353 352 ep->dir_in ? DMA_TO_DEVICE : DMA_FROM_DEVICE); 354 353 355 - if (dma_mapping_error(NULL, d)) { 354 + if (dma_mapping_error(dev, d)) { 356 355 pr_err("dma_mapping_error\n"); 357 356 return; 358 357 } 359 - 360 - dma_sync_single_for_device(NULL, d, length, 361 - ep->dir_in ? DMA_TO_DEVICE : 362 - DMA_FROM_DEVICE); 363 358 364 359 fotg210_enable_dma(ep, d, length); 365 360 ··· 367 370 /* update actual transfer length */ 368 371 req->req.actual += length; 369 372 370 - dma_unmap_single(NULL, d, length, DMA_TO_DEVICE); 373 + dma_unmap_single(dev, d, length, DMA_TO_DEVICE); 371 374 } 372 375 373 376 static void fotg210_ep0_queue(struct fotg210_ep *ep,
+3 -3
drivers/usb/gadget/udc/net2280.c
··· 516 516 unsigned long flags; 517 517 518 518 ep = container_of(_ep, struct net2280_ep, ep); 519 - if (!_ep || !ep->desc || _ep->name == ep0name) { 520 - pr_err("%s: Invalid ep=%p or ep->desc\n", __func__, _ep); 519 + if (!_ep || _ep->name == ep0name) { 520 + pr_err("%s: Invalid ep=%p\n", __func__, _ep); 521 521 return -EINVAL; 522 522 } 523 523 spin_lock_irqsave(&ep->dev->lock, flags); ··· 2279 2279 * - It is safe to set for all connection speeds; all chip revisions. 2280 2280 * - R-M-W to leave other bits undisturbed. 2281 2281 * - Reference PLX TT-7372 2282 - */ 2282 + */ 2283 2283 val = readl(&dev->ll_chicken_reg->ll_tsn_chicken_bit); 2284 2284 val |= BIT(RECOVERY_IDLE_TO_RECOVER_FMW); 2285 2285 writel(val, &dev->ll_chicken_reg->ll_tsn_chicken_bit);
+4
drivers/usb/gadget/udc/renesas_usb3.c
··· 2630 2630 2631 2631 static const struct soc_device_attribute renesas_usb3_quirks_match[] = { 2632 2632 { 2633 + .soc_id = "r8a774c0", 2634 + .data = &renesas_usb3_priv_r8a77990, 2635 + }, 2636 + { 2633 2637 .soc_id = "r8a7795", .revision = "ES1.*", 2634 2638 .data = &renesas_usb3_priv_r8a7795_es1, 2635 2639 },
+24 -4
drivers/usb/misc/usbtest.c
··· 347 347 return le16_to_cpup(&ep->desc.wMaxPacketSize); 348 348 } 349 349 350 + static int ss_isoc_get_packet_num(struct usb_device *udev, int pipe) 351 + { 352 + struct usb_host_endpoint *ep = usb_pipe_endpoint(udev, pipe); 353 + 354 + return USB_SS_MULT(ep->ss_ep_comp.bmAttributes) 355 + * (1 + ep->ss_ep_comp.bMaxBurst); 356 + } 357 + 350 358 static void simple_fill_buf(struct urb *urb) 351 359 { 352 360 unsigned i; ··· 1984 1976 1985 1977 if (bytes < 0 || !desc) 1986 1978 return NULL; 1979 + 1987 1980 maxp = usb_endpoint_maxp(desc); 1988 - maxp *= usb_endpoint_maxp_mult(desc); 1981 + if (udev->speed >= USB_SPEED_SUPER) 1982 + maxp *= ss_isoc_get_packet_num(udev, pipe); 1983 + else 1984 + maxp *= usb_endpoint_maxp_mult(desc); 1985 + 1989 1986 packets = DIV_ROUND_UP(bytes, maxp); 1990 1987 1991 1988 urb = usb_alloc_urb(packets, GFP_KERNEL); ··· 2078 2065 packets *= param->iterations; 2079 2066 2080 2067 if (context.is_iso) { 2068 + int transaction_num; 2069 + 2070 + if (udev->speed >= USB_SPEED_SUPER) 2071 + transaction_num = ss_isoc_get_packet_num(udev, pipe); 2072 + else 2073 + transaction_num = usb_endpoint_maxp_mult(desc); 2074 + 2081 2075 dev_info(&dev->intf->dev, 2082 2076 "iso period %d %sframes, wMaxPacket %d, transactions: %d\n", 2083 2077 1 << (desc->bInterval - 1), 2084 - (udev->speed == USB_SPEED_HIGH) ? "micro" : "", 2078 + (udev->speed >= USB_SPEED_HIGH) ? "micro" : "", 2085 2079 usb_endpoint_maxp(desc), 2086 - usb_endpoint_maxp_mult(desc)); 2080 + transaction_num); 2087 2081 2088 2082 dev_info(&dev->intf->dev, 2089 2083 "total %lu msec (%lu packets)\n", 2090 2084 (packets * (1 << (desc->bInterval - 1))) 2091 - / ((udev->speed == USB_SPEED_HIGH) ? 8 : 1), 2085 + / ((udev->speed >= USB_SPEED_HIGH) ? 8 : 1), 2092 2086 packets); 2093 2087 } 2094 2088
+1 -1
drivers/usb/phy/phy-twl6030-usb.c
··· 400 400 { 401 401 struct twl6030_usb *twl = platform_get_drvdata(pdev); 402 402 403 - cancel_delayed_work(&twl->get_status_work); 403 + cancel_delayed_work_sync(&twl->get_status_work); 404 404 twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK, 405 405 REG_INT_MSK_LINE_C); 406 406 twl6030_interrupt_mask(TWL6030_USBOTG_INT_MASK,