diff options
| -rw-r--r-- | Documentation/usb/linux-cdc-acm.inf | 4 | ||||
| -rw-r--r-- | drivers/usb/gadget/amd5536udc.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/f_serial.c | 4 | ||||
| -rw-r--r-- | drivers/usb/gadget/fsl_mxc_udc.c | 3 | ||||
| -rw-r--r-- | drivers/usb/gadget/fsl_qe_udc.c | 3 | ||||
| -rw-r--r-- | drivers/usb/gadget/fsl_udc_core.c | 75 | ||||
| -rw-r--r-- | drivers/usb/gadget/fsl_usb2_udc.h | 10 | ||||
| -rw-r--r-- | drivers/usb/gadget/m66592-udc.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/net2280.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/r8a66597-udc.c | 2 | ||||
| -rw-r--r-- | drivers/usb/gadget/s3c-hsotg.c | 4 | ||||
| -rw-r--r-- | drivers/usb/gadget/s3c-hsudc.c | 3 | ||||
| -rw-r--r-- | drivers/usb/host/ehci-sched.c | 9 | ||||
| -rw-r--r-- | drivers/usb/host/whci/qset.c | 2 | ||||
| -rw-r--r-- | drivers/usb/host/xhci.c | 5 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_core.c | 6 | ||||
| -rw-r--r-- | drivers/usb/musb/musb_gadget.c | 2 | ||||
| -rw-r--r-- | drivers/usb/renesas_usbhs/mod_gadget.c | 47 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio.c | 1 | ||||
| -rw-r--r-- | drivers/usb/serial/ftdi_sio_ids.h | 1 | ||||
| -rw-r--r-- | drivers/usb/serial/option.c | 4 | ||||
| -rw-r--r-- | drivers/usb/storage/unusual_devs.h | 7 |
22 files changed, 101 insertions, 97 deletions
diff --git a/Documentation/usb/linux-cdc-acm.inf b/Documentation/usb/linux-cdc-acm.inf index 37a02ce54841..f0ffc27d4c0a 100644 --- a/Documentation/usb/linux-cdc-acm.inf +++ b/Documentation/usb/linux-cdc-acm.inf | |||
| @@ -90,10 +90,10 @@ ServiceBinary=%12%\USBSER.sys | |||
| 90 | [SourceDisksFiles] | 90 | [SourceDisksFiles] |
| 91 | [SourceDisksNames] | 91 | [SourceDisksNames] |
| 92 | [DeviceList] | 92 | [DeviceList] |
| 93 | %DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02 | 93 | %DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02, USB\VID_1D6B&PID_0106&MI_00 |
| 94 | 94 | ||
| 95 | [DeviceList.NTamd64] | 95 | [DeviceList.NTamd64] |
| 96 | %DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02 | 96 | %DESCRIPTION%=DriverInstall, USB\VID_0525&PID_A4A7, USB\VID_1D6B&PID_0104&MI_02, USB\VID_1D6B&PID_0106&MI_00 |
| 97 | 97 | ||
| 98 | 98 | ||
| 99 | ;------------------------------------------------------------------------------ | 99 | ;------------------------------------------------------------------------------ |
diff --git a/drivers/usb/gadget/amd5536udc.c b/drivers/usb/gadget/amd5536udc.c index 4730016d7cd4..45f422ac103f 100644 --- a/drivers/usb/gadget/amd5536udc.c +++ b/drivers/usb/gadget/amd5536udc.c | |||
| @@ -1959,7 +1959,7 @@ static int amd5536_start(struct usb_gadget_driver *driver, | |||
| 1959 | u32 tmp; | 1959 | u32 tmp; |
| 1960 | 1960 | ||
| 1961 | if (!driver || !bind || !driver->setup | 1961 | if (!driver || !bind || !driver->setup |
| 1962 | || driver->speed != USB_SPEED_HIGH) | 1962 | || driver->speed < USB_SPEED_HIGH) |
| 1963 | return -EINVAL; | 1963 | return -EINVAL; |
| 1964 | if (!dev) | 1964 | if (!dev) |
| 1965 | return -ENODEV; | 1965 | return -ENODEV; |
diff --git a/drivers/usb/gadget/f_serial.c b/drivers/usb/gadget/f_serial.c index 91fdf790ed20..cf33a8d0fd5d 100644 --- a/drivers/usb/gadget/f_serial.c +++ b/drivers/usb/gadget/f_serial.c | |||
| @@ -131,8 +131,8 @@ static int gser_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
| 131 | } | 131 | } |
| 132 | if (!gser->port.in->desc || !gser->port.out->desc) { | 132 | if (!gser->port.in->desc || !gser->port.out->desc) { |
| 133 | DBG(cdev, "activate generic ttyGS%d\n", gser->port_num); | 133 | DBG(cdev, "activate generic ttyGS%d\n", gser->port_num); |
| 134 | if (!config_ep_by_speed(cdev->gadget, f, gser->port.in) || | 134 | if (config_ep_by_speed(cdev->gadget, f, gser->port.in) || |
| 135 | !config_ep_by_speed(cdev->gadget, f, gser->port.out)) { | 135 | config_ep_by_speed(cdev->gadget, f, gser->port.out)) { |
| 136 | gser->port.in->desc = NULL; | 136 | gser->port.in->desc = NULL; |
| 137 | gser->port.out->desc = NULL; | 137 | gser->port.out->desc = NULL; |
| 138 | return -EINVAL; | 138 | return -EINVAL; |
diff --git a/drivers/usb/gadget/fsl_mxc_udc.c b/drivers/usb/gadget/fsl_mxc_udc.c index 43a49ecc1f36..dcbc0a2e48dd 100644 --- a/drivers/usb/gadget/fsl_mxc_udc.c +++ b/drivers/usb/gadget/fsl_mxc_udc.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <linux/err.h> | 16 | #include <linux/err.h> |
| 17 | #include <linux/fsl_devices.h> | 17 | #include <linux/fsl_devices.h> |
| 18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
| 19 | #include <linux/io.h> | ||
| 19 | 20 | ||
| 20 | #include <mach/hardware.h> | 21 | #include <mach/hardware.h> |
| 21 | 22 | ||
| @@ -88,7 +89,6 @@ eenahb: | |||
| 88 | void fsl_udc_clk_finalize(struct platform_device *pdev) | 89 | void fsl_udc_clk_finalize(struct platform_device *pdev) |
| 89 | { | 90 | { |
| 90 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; | 91 | struct fsl_usb2_platform_data *pdata = pdev->dev.platform_data; |
| 91 | #if defined(CONFIG_SOC_IMX35) | ||
| 92 | if (cpu_is_mx35()) { | 92 | if (cpu_is_mx35()) { |
| 93 | unsigned int v; | 93 | unsigned int v; |
| 94 | 94 | ||
| @@ -101,7 +101,6 @@ void fsl_udc_clk_finalize(struct platform_device *pdev) | |||
| 101 | USBPHYCTRL_OTGBASE_OFFSET)); | 101 | USBPHYCTRL_OTGBASE_OFFSET)); |
| 102 | } | 102 | } |
| 103 | } | 103 | } |
| 104 | #endif | ||
| 105 | 104 | ||
| 106 | /* ULPI transceivers don't need usbpll */ | 105 | /* ULPI transceivers don't need usbpll */ |
| 107 | if (pdata->phy_mode == FSL_USB2_PHY_ULPI) { | 106 | if (pdata->phy_mode == FSL_USB2_PHY_ULPI) { |
diff --git a/drivers/usb/gadget/fsl_qe_udc.c b/drivers/usb/gadget/fsl_qe_udc.c index 2a03e4de11c1..e00cf92409ce 100644 --- a/drivers/usb/gadget/fsl_qe_udc.c +++ b/drivers/usb/gadget/fsl_qe_udc.c | |||
| @@ -2336,8 +2336,7 @@ static int fsl_qe_start(struct usb_gadget_driver *driver, | |||
| 2336 | if (!udc_controller) | 2336 | if (!udc_controller) |
| 2337 | return -ENODEV; | 2337 | return -ENODEV; |
| 2338 | 2338 | ||
| 2339 | if (!driver || (driver->speed != USB_SPEED_FULL | 2339 | if (!driver || driver->speed < USB_SPEED_FULL |
| 2340 | && driver->speed != USB_SPEED_HIGH) | ||
| 2341 | || !bind || !driver->disconnect || !driver->setup) | 2340 | || !bind || !driver->disconnect || !driver->setup) |
| 2342 | return -EINVAL; | 2341 | return -EINVAL; |
| 2343 | 2342 | ||
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c index b3b3d83b7c33..dd28ef3def71 100644 --- a/drivers/usb/gadget/fsl_udc_core.c +++ b/drivers/usb/gadget/fsl_udc_core.c | |||
| @@ -696,12 +696,31 @@ static void fsl_free_request(struct usb_ep *_ep, struct usb_request *_req) | |||
| 696 | kfree(req); | 696 | kfree(req); |
| 697 | } | 697 | } |
| 698 | 698 | ||
| 699 | /*-------------------------------------------------------------------------*/ | 699 | /* Actually add a dTD chain to an empty dQH and let go */ |
| 700 | static void fsl_prime_ep(struct fsl_ep *ep, struct ep_td_struct *td) | ||
| 701 | { | ||
| 702 | struct ep_queue_head *qh = get_qh_by_ep(ep); | ||
| 703 | |||
| 704 | /* Write dQH next pointer and terminate bit to 0 */ | ||
| 705 | qh->next_dtd_ptr = cpu_to_hc32(td->td_dma | ||
| 706 | & EP_QUEUE_HEAD_NEXT_POINTER_MASK); | ||
| 707 | |||
| 708 | /* Clear active and halt bit */ | ||
| 709 | qh->size_ioc_int_sts &= cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE | ||
| 710 | | EP_QUEUE_HEAD_STATUS_HALT)); | ||
| 711 | |||
| 712 | /* Ensure that updates to the QH will occur before priming. */ | ||
| 713 | wmb(); | ||
| 714 | |||
| 715 | /* Prime endpoint by writing correct bit to ENDPTPRIME */ | ||
| 716 | fsl_writel(ep_is_in(ep) ? (1 << (ep_index(ep) + 16)) | ||
| 717 | : (1 << (ep_index(ep))), &dr_regs->endpointprime); | ||
| 718 | } | ||
| 719 | |||
| 720 | /* Add dTD chain to the dQH of an EP */ | ||
| 700 | static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) | 721 | static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) |
| 701 | { | 722 | { |
| 702 | int i = ep_index(ep) * 2 + ep_is_in(ep); | ||
| 703 | u32 temp, bitmask, tmp_stat; | 723 | u32 temp, bitmask, tmp_stat; |
| 704 | struct ep_queue_head *dQH = &ep->udc->ep_qh[i]; | ||
| 705 | 724 | ||
| 706 | /* VDBG("QH addr Register 0x%8x", dr_regs->endpointlistaddr); | 725 | /* VDBG("QH addr Register 0x%8x", dr_regs->endpointlistaddr); |
| 707 | VDBG("ep_qh[%d] addr is 0x%8x", i, (u32)&(ep->udc->ep_qh[i])); */ | 726 | VDBG("ep_qh[%d] addr is 0x%8x", i, (u32)&(ep->udc->ep_qh[i])); */ |
| @@ -719,7 +738,7 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) | |||
| 719 | cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK); | 738 | cpu_to_hc32(req->head->td_dma & DTD_ADDR_MASK); |
| 720 | /* Read prime bit, if 1 goto done */ | 739 | /* Read prime bit, if 1 goto done */ |
| 721 | if (fsl_readl(&dr_regs->endpointprime) & bitmask) | 740 | if (fsl_readl(&dr_regs->endpointprime) & bitmask) |
| 722 | goto out; | 741 | return; |
| 723 | 742 | ||
| 724 | do { | 743 | do { |
| 725 | /* Set ATDTW bit in USBCMD */ | 744 | /* Set ATDTW bit in USBCMD */ |
| @@ -736,28 +755,10 @@ static void fsl_queue_td(struct fsl_ep *ep, struct fsl_req *req) | |||
| 736 | fsl_writel(temp & ~USB_CMD_ATDTW, &dr_regs->usbcmd); | 755 | fsl_writel(temp & ~USB_CMD_ATDTW, &dr_regs->usbcmd); |
| 737 | 756 | ||
| 738 | if (tmp_stat) | 757 | if (tmp_stat) |
| 739 | goto out; | 758 | return; |
| 740 | } | 759 | } |
| 741 | 760 | ||
| 742 | /* Write dQH next pointer and terminate bit to 0 */ | 761 | fsl_prime_ep(ep, req->head); |
| 743 | temp = req->head->td_dma & EP_QUEUE_HEAD_NEXT_POINTER_MASK; | ||
| 744 | dQH->next_dtd_ptr = cpu_to_hc32(temp); | ||
| 745 | |||
| 746 | /* Clear active and halt bit */ | ||
| 747 | temp = cpu_to_hc32(~(EP_QUEUE_HEAD_STATUS_ACTIVE | ||
| 748 | | EP_QUEUE_HEAD_STATUS_HALT)); | ||
| 749 | dQH->size_ioc_int_sts &= temp; | ||
| 750 | |||
| 751 | /* Ensure that updates to the QH will occur before priming. */ | ||
| 752 | wmb(); | ||
| 753 | |||
| 754 | /* Prime endpoint by writing 1 to ENDPTPRIME */ | ||
| 755 | temp = ep_is_in(ep) | ||
| 756 | ? (1 << (ep_index(ep) + 16)) | ||
| 757 | : (1 << (ep_index(ep))); | ||
| 758 | fsl_writel(temp, &dr_regs->endpointprime); | ||
| 759 | out: | ||
| 760 | return; | ||
| 761 | } | 762 | } |
| 762 | 763 | ||
| 763 | /* Fill in the dTD structure | 764 | /* Fill in the dTD structure |
| @@ -877,7 +878,7 @@ fsl_ep_queue(struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
| 877 | VDBG("%s, bad ep", __func__); | 878 | VDBG("%s, bad ep", __func__); |
| 878 | return -EINVAL; | 879 | return -EINVAL; |
| 879 | } | 880 | } |
| 880 | if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) { | 881 | if (usb_endpoint_xfer_isoc(ep->desc)) { |
| 881 | if (req->req.length > ep->ep.maxpacket) | 882 | if (req->req.length > ep->ep.maxpacket) |
| 882 | return -EMSGSIZE; | 883 | return -EMSGSIZE; |
| 883 | } | 884 | } |
| @@ -973,25 +974,20 @@ static int fsl_ep_dequeue(struct usb_ep *_ep, struct usb_request *_req) | |||
| 973 | 974 | ||
| 974 | /* The request isn't the last request in this ep queue */ | 975 | /* The request isn't the last request in this ep queue */ |
| 975 | if (req->queue.next != &ep->queue) { | 976 | if (req->queue.next != &ep->queue) { |
| 976 | struct ep_queue_head *qh; | ||
| 977 | struct fsl_req *next_req; | 977 | struct fsl_req *next_req; |
| 978 | 978 | ||
| 979 | qh = ep->qh; | ||
| 980 | next_req = list_entry(req->queue.next, struct fsl_req, | 979 | next_req = list_entry(req->queue.next, struct fsl_req, |
| 981 | queue); | 980 | queue); |
| 982 | 981 | ||
| 983 | /* Point the QH to the first TD of next request */ | 982 | /* prime with dTD of next request */ |
| 984 | fsl_writel((u32) next_req->head, &qh->curr_dtd_ptr); | 983 | fsl_prime_ep(ep, next_req->head); |
| 985 | } | 984 | } |
| 986 | 985 | /* The request hasn't been processed, patch up the TD chain */ | |
| 987 | /* The request hasn't been processed, patch up the TD chain */ | ||
| 988 | } else { | 986 | } else { |
| 989 | struct fsl_req *prev_req; | 987 | struct fsl_req *prev_req; |
| 990 | 988 | ||
| 991 | prev_req = list_entry(req->queue.prev, struct fsl_req, queue); | 989 | prev_req = list_entry(req->queue.prev, struct fsl_req, queue); |
| 992 | fsl_writel(fsl_readl(&req->tail->next_td_ptr), | 990 | prev_req->tail->next_td_ptr = req->tail->next_td_ptr; |
| 993 | &prev_req->tail->next_td_ptr); | ||
| 994 | |||
| 995 | } | 991 | } |
| 996 | 992 | ||
| 997 | done(ep, req, -ECONNRESET); | 993 | done(ep, req, -ECONNRESET); |
| @@ -1032,7 +1028,7 @@ static int fsl_ep_set_halt(struct usb_ep *_ep, int value) | |||
| 1032 | goto out; | 1028 | goto out; |
| 1033 | } | 1029 | } |
| 1034 | 1030 | ||
| 1035 | if (ep->desc->bmAttributes == USB_ENDPOINT_XFER_ISOC) { | 1031 | if (usb_endpoint_xfer_isoc(ep->desc)) { |
| 1036 | status = -EOPNOTSUPP; | 1032 | status = -EOPNOTSUPP; |
| 1037 | goto out; | 1033 | goto out; |
| 1038 | } | 1034 | } |
| @@ -1068,7 +1064,7 @@ static int fsl_ep_fifo_status(struct usb_ep *_ep) | |||
| 1068 | struct fsl_udc *udc; | 1064 | struct fsl_udc *udc; |
| 1069 | int size = 0; | 1065 | int size = 0; |
| 1070 | u32 bitmask; | 1066 | u32 bitmask; |
| 1071 | struct ep_queue_head *d_qh; | 1067 | struct ep_queue_head *qh; |
| 1072 | 1068 | ||
| 1073 | ep = container_of(_ep, struct fsl_ep, ep); | 1069 | ep = container_of(_ep, struct fsl_ep, ep); |
| 1074 | if (!_ep || (!ep->desc && ep_index(ep) != 0)) | 1070 | if (!_ep || (!ep->desc && ep_index(ep) != 0)) |
| @@ -1079,13 +1075,13 @@ static int fsl_ep_fifo_status(struct usb_ep *_ep) | |||
| 1079 | if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) | 1075 | if (!udc->driver || udc->gadget.speed == USB_SPEED_UNKNOWN) |
| 1080 | return -ESHUTDOWN; | 1076 | return -ESHUTDOWN; |
| 1081 | 1077 | ||
| 1082 | d_qh = &ep->udc->ep_qh[ep_index(ep) * 2 + ep_is_in(ep)]; | 1078 | qh = get_qh_by_ep(ep); |
| 1083 | 1079 | ||
| 1084 | bitmask = (ep_is_in(ep)) ? (1 << (ep_index(ep) + 16)) : | 1080 | bitmask = (ep_is_in(ep)) ? (1 << (ep_index(ep) + 16)) : |
| 1085 | (1 << (ep_index(ep))); | 1081 | (1 << (ep_index(ep))); |
| 1086 | 1082 | ||
| 1087 | if (fsl_readl(&dr_regs->endptstatus) & bitmask) | 1083 | if (fsl_readl(&dr_regs->endptstatus) & bitmask) |
| 1088 | size = (d_qh->size_ioc_int_sts & DTD_PACKET_SIZE) | 1084 | size = (qh->size_ioc_int_sts & DTD_PACKET_SIZE) |
| 1089 | >> DTD_LENGTH_BIT_POS; | 1085 | >> DTD_LENGTH_BIT_POS; |
| 1090 | 1086 | ||
| 1091 | pr_debug("%s %u\n", __func__, size); | 1087 | pr_debug("%s %u\n", __func__, size); |
| @@ -1938,8 +1934,7 @@ static int fsl_start(struct usb_gadget_driver *driver, | |||
| 1938 | if (!udc_controller) | 1934 | if (!udc_controller) |
| 1939 | return -ENODEV; | 1935 | return -ENODEV; |
| 1940 | 1936 | ||
| 1941 | if (!driver || (driver->speed != USB_SPEED_FULL | 1937 | if (!driver || driver->speed < USB_SPEED_FULL |
| 1942 | && driver->speed != USB_SPEED_HIGH) | ||
| 1943 | || !bind || !driver->disconnect || !driver->setup) | 1938 | || !bind || !driver->disconnect || !driver->setup) |
| 1944 | return -EINVAL; | 1939 | return -EINVAL; |
| 1945 | 1940 | ||
diff --git a/drivers/usb/gadget/fsl_usb2_udc.h b/drivers/usb/gadget/fsl_usb2_udc.h index 1d51be83fda8..f781f5dec417 100644 --- a/drivers/usb/gadget/fsl_usb2_udc.h +++ b/drivers/usb/gadget/fsl_usb2_udc.h | |||
| @@ -569,6 +569,16 @@ static void dump_msg(const char *label, const u8 * buf, unsigned int length) | |||
| 569 | * 2 + ((windex & USB_DIR_IN) ? 1 : 0)) | 569 | * 2 + ((windex & USB_DIR_IN) ? 1 : 0)) |
| 570 | #define get_pipe_by_ep(EP) (ep_index(EP) * 2 + ep_is_in(EP)) | 570 | #define get_pipe_by_ep(EP) (ep_index(EP) * 2 + ep_is_in(EP)) |
| 571 | 571 | ||
| 572 | static inline struct ep_queue_head *get_qh_by_ep(struct fsl_ep *ep) | ||
| 573 | { | ||
| 574 | /* we only have one ep0 structure but two queue heads */ | ||
| 575 | if (ep_index(ep) != 0) | ||
| 576 | return ep->qh; | ||
| 577 | else | ||
| 578 | return &ep->udc->ep_qh[(ep->udc->ep0_dir == | ||
| 579 | USB_DIR_IN) ? 1 : 0]; | ||
| 580 | } | ||
| 581 | |||
| 572 | struct platform_device; | 582 | struct platform_device; |
| 573 | #ifdef CONFIG_ARCH_MXC | 583 | #ifdef CONFIG_ARCH_MXC |
| 574 | int fsl_udc_clk_init(struct platform_device *pdev); | 584 | int fsl_udc_clk_init(struct platform_device *pdev); |
diff --git a/drivers/usb/gadget/m66592-udc.c b/drivers/usb/gadget/m66592-udc.c index 91d0af2a24a8..9aa1cbbee45b 100644 --- a/drivers/usb/gadget/m66592-udc.c +++ b/drivers/usb/gadget/m66592-udc.c | |||
| @@ -1472,7 +1472,7 @@ static int m66592_start(struct usb_gadget_driver *driver, | |||
| 1472 | int retval; | 1472 | int retval; |
| 1473 | 1473 | ||
| 1474 | if (!driver | 1474 | if (!driver |
| 1475 | || driver->speed != USB_SPEED_HIGH | 1475 | || driver->speed < USB_SPEED_HIGH |
| 1476 | || !bind | 1476 | || !bind |
| 1477 | || !driver->setup) | 1477 | || !driver->setup) |
| 1478 | return -EINVAL; | 1478 | return -EINVAL; |
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index 7f1bc9a73cda..da2b9d0be3ca 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
| @@ -1881,7 +1881,7 @@ static int net2280_start(struct usb_gadget *_gadget, | |||
| 1881 | * (dev->usb->xcvrdiag & FORCE_FULL_SPEED_MODE) | 1881 | * (dev->usb->xcvrdiag & FORCE_FULL_SPEED_MODE) |
| 1882 | * "must not be used in normal operation" | 1882 | * "must not be used in normal operation" |
| 1883 | */ | 1883 | */ |
| 1884 | if (!driver || driver->speed != USB_SPEED_HIGH | 1884 | if (!driver || driver->speed < USB_SPEED_HIGH |
| 1885 | || !driver->setup) | 1885 | || !driver->setup) |
| 1886 | return -EINVAL; | 1886 | return -EINVAL; |
| 1887 | 1887 | ||
diff --git a/drivers/usb/gadget/r8a66597-udc.c b/drivers/usb/gadget/r8a66597-udc.c index 24f84b210ce1..fc719a3f8557 100644 --- a/drivers/usb/gadget/r8a66597-udc.c +++ b/drivers/usb/gadget/r8a66597-udc.c | |||
| @@ -1746,7 +1746,7 @@ static int r8a66597_start(struct usb_gadget *gadget, | |||
| 1746 | struct r8a66597 *r8a66597 = gadget_to_r8a66597(gadget); | 1746 | struct r8a66597 *r8a66597 = gadget_to_r8a66597(gadget); |
| 1747 | 1747 | ||
| 1748 | if (!driver | 1748 | if (!driver |
| 1749 | || driver->speed != USB_SPEED_HIGH | 1749 | || driver->speed < USB_SPEED_HIGH |
| 1750 | || !driver->setup) | 1750 | || !driver->setup) |
| 1751 | return -EINVAL; | 1751 | return -EINVAL; |
| 1752 | if (!r8a66597) | 1752 | if (!r8a66597) |
diff --git a/drivers/usb/gadget/s3c-hsotg.c b/drivers/usb/gadget/s3c-hsotg.c index a552453dc946..b31448229f0b 100644 --- a/drivers/usb/gadget/s3c-hsotg.c +++ b/drivers/usb/gadget/s3c-hsotg.c | |||
| @@ -2586,10 +2586,8 @@ static int s3c_hsotg_start(struct usb_gadget_driver *driver, | |||
| 2586 | return -EINVAL; | 2586 | return -EINVAL; |
| 2587 | } | 2587 | } |
| 2588 | 2588 | ||
| 2589 | if (driver->speed != USB_SPEED_HIGH && | 2589 | if (driver->speed < USB_SPEED_FULL) |
| 2590 | driver->speed != USB_SPEED_FULL) { | ||
| 2591 | dev_err(hsotg->dev, "%s: bad speed\n", __func__); | 2590 | dev_err(hsotg->dev, "%s: bad speed\n", __func__); |
| 2592 | } | ||
| 2593 | 2591 | ||
| 2594 | if (!bind || !driver->setup) { | 2592 | if (!bind || !driver->setup) { |
| 2595 | dev_err(hsotg->dev, "%s: missing entry points\n", __func__); | 2593 | dev_err(hsotg->dev, "%s: missing entry points\n", __func__); |
diff --git a/drivers/usb/gadget/s3c-hsudc.c b/drivers/usb/gadget/s3c-hsudc.c index 8d54f893cefe..20a553b46aed 100644 --- a/drivers/usb/gadget/s3c-hsudc.c +++ b/drivers/usb/gadget/s3c-hsudc.c | |||
| @@ -1142,8 +1142,7 @@ static int s3c_hsudc_start(struct usb_gadget_driver *driver, | |||
| 1142 | int ret; | 1142 | int ret; |
| 1143 | 1143 | ||
| 1144 | if (!driver | 1144 | if (!driver |
| 1145 | || (driver->speed != USB_SPEED_FULL && | 1145 | || driver->speed < USB_SPEED_FULL |
| 1146 | driver->speed != USB_SPEED_HIGH) | ||
| 1147 | || !bind | 1146 | || !bind |
| 1148 | || !driver->unbind || !driver->disconnect || !driver->setup) | 1147 | || !driver->unbind || !driver->disconnect || !driver->setup) |
| 1149 | return -EINVAL; | 1148 | return -EINVAL; |
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c index 56a32033adb3..a60679cbbf85 100644 --- a/drivers/usb/host/ehci-sched.c +++ b/drivers/usb/host/ehci-sched.c | |||
| @@ -1475,6 +1475,7 @@ iso_stream_schedule ( | |||
| 1475 | * jump until after the queue is primed. | 1475 | * jump until after the queue is primed. |
| 1476 | */ | 1476 | */ |
| 1477 | else { | 1477 | else { |
| 1478 | int done = 0; | ||
| 1478 | start = SCHEDULE_SLOP + (now & ~0x07); | 1479 | start = SCHEDULE_SLOP + (now & ~0x07); |
| 1479 | 1480 | ||
| 1480 | /* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */ | 1481 | /* NOTE: assumes URB_ISO_ASAP, to limit complexity/bugs */ |
| @@ -1492,18 +1493,18 @@ iso_stream_schedule ( | |||
| 1492 | if (stream->highspeed) { | 1493 | if (stream->highspeed) { |
| 1493 | if (itd_slot_ok(ehci, mod, start, | 1494 | if (itd_slot_ok(ehci, mod, start, |
| 1494 | stream->usecs, period)) | 1495 | stream->usecs, period)) |
| 1495 | break; | 1496 | done = 1; |
| 1496 | } else { | 1497 | } else { |
| 1497 | if ((start % 8) >= 6) | 1498 | if ((start % 8) >= 6) |
| 1498 | continue; | 1499 | continue; |
| 1499 | if (sitd_slot_ok(ehci, mod, stream, | 1500 | if (sitd_slot_ok(ehci, mod, stream, |
| 1500 | start, sched, period)) | 1501 | start, sched, period)) |
| 1501 | break; | 1502 | done = 1; |
| 1502 | } | 1503 | } |
| 1503 | } while (start > next); | 1504 | } while (start > next && !done); |
| 1504 | 1505 | ||
| 1505 | /* no room in the schedule */ | 1506 | /* no room in the schedule */ |
| 1506 | if (start == next) { | 1507 | if (!done) { |
| 1507 | ehci_dbg(ehci, "iso resched full %p (now %d max %d)\n", | 1508 | ehci_dbg(ehci, "iso resched full %p (now %d max %d)\n", |
| 1508 | urb, now, now + mod); | 1509 | urb, now, now + mod); |
| 1509 | status = -ENOSPC; | 1510 | status = -ENOSPC; |
diff --git a/drivers/usb/host/whci/qset.c b/drivers/usb/host/whci/qset.c index d6e175428618..a403b53e86b9 100644 --- a/drivers/usb/host/whci/qset.c +++ b/drivers/usb/host/whci/qset.c | |||
| @@ -124,7 +124,7 @@ void qset_clear(struct whc *whc, struct whc_qset *qset) | |||
| 124 | { | 124 | { |
| 125 | qset->td_start = qset->td_end = qset->ntds = 0; | 125 | qset->td_start = qset->td_end = qset->ntds = 0; |
| 126 | 126 | ||
| 127 | qset->qh.link = cpu_to_le32(QH_LINK_NTDS(8) | QH_LINK_T); | 127 | qset->qh.link = cpu_to_le64(QH_LINK_NTDS(8) | QH_LINK_T); |
| 128 | qset->qh.status = qset->qh.status & QH_STATUS_SEQ_MASK; | 128 | qset->qh.status = qset->qh.status & QH_STATUS_SEQ_MASK; |
| 129 | qset->qh.err_count = 0; | 129 | qset->qh.err_count = 0; |
| 130 | qset->qh.scratch[0] = 0; | 130 | qset->qh.scratch[0] = 0; |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index aa94c0195791..a1afb7c39f7e 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
| @@ -711,7 +711,10 @@ static void xhci_clear_command_ring(struct xhci_hcd *xhci) | |||
| 711 | ring = xhci->cmd_ring; | 711 | ring = xhci->cmd_ring; |
| 712 | seg = ring->deq_seg; | 712 | seg = ring->deq_seg; |
| 713 | do { | 713 | do { |
| 714 | memset(seg->trbs, 0, SEGMENT_SIZE); | 714 | memset(seg->trbs, 0, |
| 715 | sizeof(union xhci_trb) * (TRBS_PER_SEGMENT - 1)); | ||
| 716 | seg->trbs[TRBS_PER_SEGMENT - 1].link.control &= | ||
| 717 | cpu_to_le32(~TRB_CYCLE); | ||
| 715 | seg = seg->next; | 718 | seg = seg->next; |
| 716 | } while (seg != ring->deq_seg); | 719 | } while (seg != ring->deq_seg); |
| 717 | 720 | ||
diff --git a/drivers/usb/musb/musb_core.c b/drivers/usb/musb/musb_core.c index c1fa12ec7a9a..b63ab1570103 100644 --- a/drivers/usb/musb/musb_core.c +++ b/drivers/usb/musb/musb_core.c | |||
| @@ -2301,18 +2301,12 @@ static int musb_suspend(struct device *dev) | |||
| 2301 | */ | 2301 | */ |
| 2302 | } | 2302 | } |
| 2303 | 2303 | ||
| 2304 | musb_save_context(musb); | ||
| 2305 | |||
| 2306 | spin_unlock_irqrestore(&musb->lock, flags); | 2304 | spin_unlock_irqrestore(&musb->lock, flags); |
| 2307 | return 0; | 2305 | return 0; |
| 2308 | } | 2306 | } |
| 2309 | 2307 | ||
| 2310 | static int musb_resume_noirq(struct device *dev) | 2308 | static int musb_resume_noirq(struct device *dev) |
| 2311 | { | 2309 | { |
| 2312 | struct musb *musb = dev_to_musb(dev); | ||
| 2313 | |||
| 2314 | musb_restore_context(musb); | ||
| 2315 | |||
| 2316 | /* for static cmos like DaVinci, register values were preserved | 2310 | /* for static cmos like DaVinci, register values were preserved |
| 2317 | * unless for some reason the whole soc powered down or the USB | 2311 | * unless for some reason the whole soc powered down or the USB |
| 2318 | * module got reset through the PSC (vs just being disabled). | 2312 | * module got reset through the PSC (vs just being disabled). |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index d51043acfe1a..922148ff8d29 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
| @@ -1903,7 +1903,7 @@ static int musb_gadget_start(struct usb_gadget *g, | |||
| 1903 | unsigned long flags; | 1903 | unsigned long flags; |
| 1904 | int retval = -EINVAL; | 1904 | int retval = -EINVAL; |
| 1905 | 1905 | ||
| 1906 | if (driver->speed != USB_SPEED_HIGH) | 1906 | if (driver->speed < USB_SPEED_HIGH) |
| 1907 | goto err0; | 1907 | goto err0; |
| 1908 | 1908 | ||
| 1909 | pm_runtime_get_sync(musb->controller); | 1909 | pm_runtime_get_sync(musb->controller); |
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index d9717e0bc1ff..7f4e80338570 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
| @@ -751,53 +751,32 @@ static int usbhsg_gadget_start(struct usb_gadget *gadget, | |||
| 751 | struct usb_gadget_driver *driver) | 751 | struct usb_gadget_driver *driver) |
| 752 | { | 752 | { |
| 753 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); | 753 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); |
| 754 | struct usbhs_priv *priv; | 754 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); |
| 755 | struct device *dev; | ||
| 756 | int ret; | ||
| 757 | 755 | ||
| 758 | if (!driver || | 756 | if (!driver || |
| 759 | !driver->setup || | 757 | !driver->setup || |
| 760 | driver->speed != USB_SPEED_HIGH) | 758 | driver->speed < USB_SPEED_FULL) |
| 761 | return -EINVAL; | 759 | return -EINVAL; |
| 762 | 760 | ||
| 763 | dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 764 | priv = usbhsg_gpriv_to_priv(gpriv); | ||
| 765 | |||
| 766 | /* first hook up the driver ... */ | 761 | /* first hook up the driver ... */ |
| 767 | gpriv->driver = driver; | 762 | gpriv->driver = driver; |
| 768 | gpriv->gadget.dev.driver = &driver->driver; | 763 | gpriv->gadget.dev.driver = &driver->driver; |
| 769 | 764 | ||
| 770 | ret = device_add(&gpriv->gadget.dev); | ||
| 771 | if (ret) { | ||
| 772 | dev_err(dev, "device_add error %d\n", ret); | ||
| 773 | goto add_fail; | ||
| 774 | } | ||
| 775 | |||
| 776 | return usbhsg_try_start(priv, USBHSG_STATUS_REGISTERD); | 765 | return usbhsg_try_start(priv, USBHSG_STATUS_REGISTERD); |
| 777 | |||
| 778 | add_fail: | ||
| 779 | gpriv->driver = NULL; | ||
| 780 | gpriv->gadget.dev.driver = NULL; | ||
| 781 | |||
| 782 | return ret; | ||
| 783 | } | 766 | } |
| 784 | 767 | ||
| 785 | static int usbhsg_gadget_stop(struct usb_gadget *gadget, | 768 | static int usbhsg_gadget_stop(struct usb_gadget *gadget, |
| 786 | struct usb_gadget_driver *driver) | 769 | struct usb_gadget_driver *driver) |
| 787 | { | 770 | { |
| 788 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); | 771 | struct usbhsg_gpriv *gpriv = usbhsg_gadget_to_gpriv(gadget); |
| 789 | struct usbhs_priv *priv; | 772 | struct usbhs_priv *priv = usbhsg_gpriv_to_priv(gpriv); |
| 790 | struct device *dev; | ||
| 791 | 773 | ||
| 792 | if (!driver || | 774 | if (!driver || |
| 793 | !driver->unbind) | 775 | !driver->unbind) |
| 794 | return -EINVAL; | 776 | return -EINVAL; |
| 795 | 777 | ||
| 796 | dev = usbhsg_gpriv_to_dev(gpriv); | ||
| 797 | priv = usbhsg_gpriv_to_priv(gpriv); | ||
| 798 | |||
| 799 | usbhsg_try_stop(priv, USBHSG_STATUS_REGISTERD); | 778 | usbhsg_try_stop(priv, USBHSG_STATUS_REGISTERD); |
| 800 | device_del(&gpriv->gadget.dev); | 779 | gpriv->gadget.dev.driver = NULL; |
| 801 | gpriv->driver = NULL; | 780 | gpriv->driver = NULL; |
| 802 | 781 | ||
| 803 | return 0; | 782 | return 0; |
| @@ -827,6 +806,13 @@ static int usbhsg_start(struct usbhs_priv *priv) | |||
| 827 | 806 | ||
| 828 | static int usbhsg_stop(struct usbhs_priv *priv) | 807 | static int usbhsg_stop(struct usbhs_priv *priv) |
| 829 | { | 808 | { |
| 809 | struct usbhsg_gpriv *gpriv = usbhsg_priv_to_gpriv(priv); | ||
| 810 | |||
| 811 | /* cable disconnect */ | ||
| 812 | if (gpriv->driver && | ||
| 813 | gpriv->driver->disconnect) | ||
| 814 | gpriv->driver->disconnect(&gpriv->gadget); | ||
| 815 | |||
| 830 | return usbhsg_try_stop(priv, USBHSG_STATUS_STARTED); | 816 | return usbhsg_try_stop(priv, USBHSG_STATUS_STARTED); |
| 831 | } | 817 | } |
| 832 | 818 | ||
| @@ -876,12 +862,14 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | |||
| 876 | /* | 862 | /* |
| 877 | * init gadget | 863 | * init gadget |
| 878 | */ | 864 | */ |
| 879 | device_initialize(&gpriv->gadget.dev); | ||
| 880 | dev_set_name(&gpriv->gadget.dev, "gadget"); | 865 | dev_set_name(&gpriv->gadget.dev, "gadget"); |
| 881 | gpriv->gadget.dev.parent = dev; | 866 | gpriv->gadget.dev.parent = dev; |
| 882 | gpriv->gadget.name = "renesas_usbhs_udc"; | 867 | gpriv->gadget.name = "renesas_usbhs_udc"; |
| 883 | gpriv->gadget.ops = &usbhsg_gadget_ops; | 868 | gpriv->gadget.ops = &usbhsg_gadget_ops; |
| 884 | gpriv->gadget.is_dualspeed = 1; | 869 | gpriv->gadget.is_dualspeed = 1; |
| 870 | ret = device_register(&gpriv->gadget.dev); | ||
| 871 | if (ret < 0) | ||
| 872 | goto err_add_udc; | ||
| 885 | 873 | ||
| 886 | INIT_LIST_HEAD(&gpriv->gadget.ep_list); | 874 | INIT_LIST_HEAD(&gpriv->gadget.ep_list); |
| 887 | 875 | ||
| @@ -912,12 +900,15 @@ int usbhs_mod_gadget_probe(struct usbhs_priv *priv) | |||
| 912 | 900 | ||
| 913 | ret = usb_add_gadget_udc(dev, &gpriv->gadget); | 901 | ret = usb_add_gadget_udc(dev, &gpriv->gadget); |
| 914 | if (ret) | 902 | if (ret) |
| 915 | goto err_add_udc; | 903 | goto err_register; |
| 916 | 904 | ||
| 917 | 905 | ||
| 918 | dev_info(dev, "gadget probed\n"); | 906 | dev_info(dev, "gadget probed\n"); |
| 919 | 907 | ||
| 920 | return 0; | 908 | return 0; |
| 909 | |||
| 910 | err_register: | ||
| 911 | device_unregister(&gpriv->gadget.dev); | ||
| 921 | err_add_udc: | 912 | err_add_udc: |
| 922 | kfree(gpriv->uep); | 913 | kfree(gpriv->uep); |
| 923 | 914 | ||
| @@ -933,6 +924,8 @@ void usbhs_mod_gadget_remove(struct usbhs_priv *priv) | |||
| 933 | 924 | ||
| 934 | usb_del_gadget_udc(&gpriv->gadget); | 925 | usb_del_gadget_udc(&gpriv->gadget); |
| 935 | 926 | ||
| 927 | device_unregister(&gpriv->gadget.dev); | ||
| 928 | |||
| 936 | usbhsg_controller_unregister(gpriv); | 929 | usbhsg_controller_unregister(gpriv); |
| 937 | 930 | ||
| 938 | kfree(gpriv->uep); | 931 | kfree(gpriv->uep); |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index bd4298bb6750..ff3db5d056a5 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
| @@ -736,6 +736,7 @@ static struct usb_device_id id_table_combined [] = { | |||
| 736 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, | 736 | { USB_DEVICE(TML_VID, TML_USB_SERIAL_PID) }, |
| 737 | { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) }, | 737 | { USB_DEVICE(FTDI_VID, FTDI_ELSTER_UNICOM_PID) }, |
| 738 | { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) }, | 738 | { USB_DEVICE(FTDI_VID, FTDI_PROPOX_JTAGCABLEII_PID) }, |
| 739 | { USB_DEVICE(FTDI_VID, FTDI_PROPOX_ISPCABLEIII_PID) }, | ||
| 739 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), | 740 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_PID), |
| 740 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, | 741 | .driver_info = (kernel_ulong_t)&ftdi_jtag_quirk }, |
| 741 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID), | 742 | { USB_DEVICE(OLIMEX_VID, OLIMEX_ARM_USB_OCD_H_PID), |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 571fa96b49c7..055b64ef0bba 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
| @@ -112,6 +112,7 @@ | |||
| 112 | 112 | ||
| 113 | /* Propox devices */ | 113 | /* Propox devices */ |
| 114 | #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738 | 114 | #define FTDI_PROPOX_JTAGCABLEII_PID 0xD738 |
| 115 | #define FTDI_PROPOX_ISPCABLEIII_PID 0xD739 | ||
| 115 | 116 | ||
| 116 | /* Lenz LI-USB Computer Interface. */ | 117 | /* Lenz LI-USB Computer Interface. */ |
| 117 | #define FTDI_LENZ_LIUSB_PID 0xD780 | 118 | #define FTDI_LENZ_LIUSB_PID 0xD780 |
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index d865878c9f97..e3426602dc82 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
| @@ -661,6 +661,9 @@ static const struct usb_device_id option_ids[] = { | |||
| 661 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x31) }, | 661 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x31) }, |
| 662 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x32) }, | 662 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x32) }, |
| 663 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) }, | 663 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) }, |
| 664 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x02) }, | ||
| 665 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x03) }, | ||
| 666 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x08) }, | ||
| 664 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, | 667 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, |
| 665 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, | 668 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, |
| 666 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, | 669 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V740) }, |
| @@ -747,6 +750,7 @@ static const struct usb_device_id option_ids[] = { | |||
| 747 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, | 750 | { USB_DEVICE(KYOCERA_VENDOR_ID, KYOCERA_PRODUCT_KPC680) }, |
| 748 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ | 751 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6000)}, /* ZTE AC8700 */ |
| 749 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ | 752 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x6613)}, /* Onda H600/ZTE MF330 */ |
| 753 | { USB_DEVICE(QUALCOMM_VENDOR_ID, 0x9000)}, /* SIMCom SIM5218 */ | ||
| 750 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ | 754 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6280) }, /* BP3-USB & BP3-EXT HSDPA */ |
| 751 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, | 755 | { USB_DEVICE(CMOTECH_VENDOR_ID, CMOTECH_PRODUCT_6008) }, |
| 752 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, | 756 | { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_UC864E) }, |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index 3041a974faf3..24caba79d722 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
| @@ -1854,6 +1854,13 @@ UNUSUAL_DEV( 0x1370, 0x6828, 0x0110, 0x0110, | |||
| 1854 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | 1854 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, |
| 1855 | US_FL_IGNORE_RESIDUE ), | 1855 | US_FL_IGNORE_RESIDUE ), |
| 1856 | 1856 | ||
| 1857 | /* Reported by Qinglin Ye <yestyle@gmail.com> */ | ||
| 1858 | UNUSUAL_DEV( 0x13fe, 0x3600, 0x0100, 0x0100, | ||
| 1859 | "Kingston", | ||
| 1860 | "DT 101 G2", | ||
| 1861 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
| 1862 | US_FL_BULK_IGNORE_TAG ), | ||
| 1863 | |||
| 1857 | /* Reported by Francesco Foresti <frafore@tiscali.it> */ | 1864 | /* Reported by Francesco Foresti <frafore@tiscali.it> */ |
| 1858 | UNUSUAL_DEV( 0x14cd, 0x6600, 0x0201, 0x0201, | 1865 | UNUSUAL_DEV( 0x14cd, 0x6600, 0x0201, 0x0201, |
| 1859 | "Super Top", | 1866 | "Super Top", |
