diff options
Diffstat (limited to 'drivers/usb')
44 files changed, 407 insertions, 228 deletions
diff --git a/drivers/usb/class/usbtmc.c b/drivers/usb/class/usbtmc.c index 385acb895ab3..3f94ac34dce3 100644 --- a/drivers/usb/class/usbtmc.c +++ b/drivers/usb/class/usbtmc.c | |||
@@ -268,7 +268,7 @@ usbtmc_abort_bulk_in_status: | |||
268 | dev_err(dev, "usb_bulk_msg returned %d\n", rv); | 268 | dev_err(dev, "usb_bulk_msg returned %d\n", rv); |
269 | goto exit; | 269 | goto exit; |
270 | } | 270 | } |
271 | } while ((actual = max_size) && | 271 | } while ((actual == max_size) && |
272 | (n < USBTMC_MAX_READS_TO_CLEAR_BULK_IN)); | 272 | (n < USBTMC_MAX_READS_TO_CLEAR_BULK_IN)); |
273 | 273 | ||
274 | if (actual == max_size) { | 274 | if (actual == max_size) { |
diff --git a/drivers/usb/core/config.c b/drivers/usb/core/config.c index c962608b4b9a..26678cadfb21 100644 --- a/drivers/usb/core/config.c +++ b/drivers/usb/core/config.c | |||
@@ -123,10 +123,11 @@ static void usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, | |||
123 | } | 123 | } |
124 | 124 | ||
125 | if (usb_endpoint_xfer_isoc(&ep->desc)) | 125 | if (usb_endpoint_xfer_isoc(&ep->desc)) |
126 | max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1) * | 126 | max_tx = (desc->bMaxBurst + 1) * (desc->bmAttributes + 1) * |
127 | (desc->bmAttributes + 1); | 127 | le16_to_cpu(ep->desc.wMaxPacketSize); |
128 | else if (usb_endpoint_xfer_int(&ep->desc)) | 128 | else if (usb_endpoint_xfer_int(&ep->desc)) |
129 | max_tx = ep->desc.wMaxPacketSize * (desc->bMaxBurst + 1); | 129 | max_tx = le16_to_cpu(ep->desc.wMaxPacketSize) * |
130 | (desc->bMaxBurst + 1); | ||
130 | else | 131 | else |
131 | max_tx = 999999; | 132 | max_tx = 999999; |
132 | if (le16_to_cpu(desc->wBytesPerInterval) > max_tx) { | 133 | if (le16_to_cpu(desc->wBytesPerInterval) > max_tx) { |
@@ -134,10 +135,10 @@ static void usb_parse_ss_endpoint_companion(struct device *ddev, int cfgno, | |||
134 | "config %d interface %d altsetting %d ep %d: " | 135 | "config %d interface %d altsetting %d ep %d: " |
135 | "setting to %d\n", | 136 | "setting to %d\n", |
136 | usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int", | 137 | usb_endpoint_xfer_isoc(&ep->desc) ? "Isoc" : "Int", |
137 | desc->wBytesPerInterval, | 138 | le16_to_cpu(desc->wBytesPerInterval), |
138 | cfgno, inum, asnum, ep->desc.bEndpointAddress, | 139 | cfgno, inum, asnum, ep->desc.bEndpointAddress, |
139 | max_tx); | 140 | max_tx); |
140 | ep->ss_ep_comp.wBytesPerInterval = max_tx; | 141 | ep->ss_ep_comp.wBytesPerInterval = cpu_to_le16(max_tx); |
141 | } | 142 | } |
142 | } | 143 | } |
143 | 144 | ||
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index 8669ba3fe794..73cbbd85219f 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -1775,6 +1775,8 @@ int usb_hcd_alloc_bandwidth(struct usb_device *udev, | |||
1775 | struct usb_interface *iface = usb_ifnum_to_if(udev, | 1775 | struct usb_interface *iface = usb_ifnum_to_if(udev, |
1776 | cur_alt->desc.bInterfaceNumber); | 1776 | cur_alt->desc.bInterfaceNumber); |
1777 | 1777 | ||
1778 | if (!iface) | ||
1779 | return -EINVAL; | ||
1778 | if (iface->resetting_device) { | 1780 | if (iface->resetting_device) { |
1779 | /* | 1781 | /* |
1780 | * The USB core just reset the device, so the xHCI host | 1782 | * The USB core just reset the device, so the xHCI host |
diff --git a/drivers/usb/gadget/Kconfig b/drivers/usb/gadget/Kconfig index 44b6b40aafb4..5a084b9cfa3c 100644 --- a/drivers/usb/gadget/Kconfig +++ b/drivers/usb/gadget/Kconfig | |||
@@ -310,7 +310,7 @@ config USB_PXA_U2O | |||
310 | # musb builds in ../musb along with host support | 310 | # musb builds in ../musb along with host support |
311 | config USB_GADGET_MUSB_HDRC | 311 | config USB_GADGET_MUSB_HDRC |
312 | tristate "Inventra HDRC USB Peripheral (TI, ADI, ...)" | 312 | tristate "Inventra HDRC USB Peripheral (TI, ADI, ...)" |
313 | depends on USB_MUSB_HDRC && (USB_MUSB_PERIPHERAL || USB_MUSB_OTG) | 313 | depends on USB_MUSB_HDRC |
314 | select USB_GADGET_DUALSPEED | 314 | select USB_GADGET_DUALSPEED |
315 | help | 315 | help |
316 | This OTG-capable silicon IP is used in dual designs including | 316 | This OTG-capable silicon IP is used in dual designs including |
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c index 98cbc06c30fd..ddb118a76807 100644 --- a/drivers/usb/gadget/at91_udc.c +++ b/drivers/usb/gadget/at91_udc.c | |||
@@ -35,6 +35,7 @@ | |||
35 | #include <linux/list.h> | 35 | #include <linux/list.h> |
36 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
37 | #include <linux/proc_fs.h> | 37 | #include <linux/proc_fs.h> |
38 | #include <linux/prefetch.h> | ||
38 | #include <linux/clk.h> | 39 | #include <linux/clk.h> |
39 | #include <linux/usb/ch9.h> | 40 | #include <linux/usb/ch9.h> |
40 | #include <linux/usb/gadget.h> | 41 | #include <linux/usb/gadget.h> |
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c index 5ef87794fd32..aef47414f5d5 100644 --- a/drivers/usb/gadget/composite.c +++ b/drivers/usb/gadget/composite.c | |||
@@ -1079,10 +1079,12 @@ composite_setup(struct usb_gadget *gadget, const struct usb_ctrlrequest *ctrl) | |||
1079 | cdev->desc.bMaxPacketSize0 = | 1079 | cdev->desc.bMaxPacketSize0 = |
1080 | cdev->gadget->ep0->maxpacket; | 1080 | cdev->gadget->ep0->maxpacket; |
1081 | if (gadget_is_superspeed(gadget)) { | 1081 | if (gadget_is_superspeed(gadget)) { |
1082 | if (gadget->speed >= USB_SPEED_SUPER) | 1082 | if (gadget->speed >= USB_SPEED_SUPER) { |
1083 | cdev->desc.bcdUSB = cpu_to_le16(0x0300); | 1083 | cdev->desc.bcdUSB = cpu_to_le16(0x0300); |
1084 | else | 1084 | cdev->desc.bMaxPacketSize0 = 9; |
1085 | } else { | ||
1085 | cdev->desc.bcdUSB = cpu_to_le16(0x0210); | 1086 | cdev->desc.bcdUSB = cpu_to_le16(0x0210); |
1087 | } | ||
1086 | } | 1088 | } |
1087 | 1089 | ||
1088 | value = min(w_length, (u16) sizeof cdev->desc); | 1090 | value = min(w_length, (u16) sizeof cdev->desc); |
diff --git a/drivers/usb/gadget/f_audio.c b/drivers/usb/gadget/f_audio.c index 02a02700b51d..a9a4eade7e80 100644 --- a/drivers/usb/gadget/f_audio.c +++ b/drivers/usb/gadget/f_audio.c | |||
@@ -12,7 +12,7 @@ | |||
12 | #include <linux/slab.h> | 12 | #include <linux/slab.h> |
13 | #include <linux/kernel.h> | 13 | #include <linux/kernel.h> |
14 | #include <linux/device.h> | 14 | #include <linux/device.h> |
15 | #include <asm/atomic.h> | 15 | #include <linux/atomic.h> |
16 | 16 | ||
17 | #include "u_audio.h" | 17 | #include "u_audio.h" |
18 | 18 | ||
diff --git a/drivers/usb/gadget/f_hid.c b/drivers/usb/gadget/f_hid.c index 403a48bcf560..83a266bdb40e 100644 --- a/drivers/usb/gadget/f_hid.c +++ b/drivers/usb/gadget/f_hid.c | |||
@@ -367,6 +367,13 @@ static int hidg_setup(struct usb_function *f, | |||
367 | case ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8 | 367 | case ((USB_DIR_IN | USB_TYPE_STANDARD | USB_RECIP_INTERFACE) << 8 |
368 | | USB_REQ_GET_DESCRIPTOR): | 368 | | USB_REQ_GET_DESCRIPTOR): |
369 | switch (value >> 8) { | 369 | switch (value >> 8) { |
370 | case HID_DT_HID: | ||
371 | VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: HID\n"); | ||
372 | length = min_t(unsigned short, length, | ||
373 | hidg_desc.bLength); | ||
374 | memcpy(req->buf, &hidg_desc, length); | ||
375 | goto respond; | ||
376 | break; | ||
370 | case HID_DT_REPORT: | 377 | case HID_DT_REPORT: |
371 | VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: REPORT\n"); | 378 | VDBG(cdev, "USB_REQ_GET_DESCRIPTOR: REPORT\n"); |
372 | length = min_t(unsigned short, length, | 379 | length = min_t(unsigned short, length, |
diff --git a/drivers/usb/gadget/f_phonet.c b/drivers/usb/gadget/f_phonet.c index 8f8d3f6cd89e..8f3eab1af885 100644 --- a/drivers/usb/gadget/f_phonet.c +++ b/drivers/usb/gadget/f_phonet.c | |||
@@ -434,6 +434,7 @@ static int pn_set_alt(struct usb_function *f, unsigned intf, unsigned alt) | |||
434 | config_ep_by_speed(gadget, f, fp->out_ep)) { | 434 | config_ep_by_speed(gadget, f, fp->out_ep)) { |
435 | fp->in_ep->desc = NULL; | 435 | fp->in_ep->desc = NULL; |
436 | fp->out_ep->desc = NULL; | 436 | fp->out_ep->desc = NULL; |
437 | spin_unlock(&port->lock); | ||
437 | return -EINVAL; | 438 | return -EINVAL; |
438 | } | 439 | } |
439 | usb_ep_enable(fp->out_ep); | 440 | usb_ep_enable(fp->out_ep); |
diff --git a/drivers/usb/gadget/f_rndis.c b/drivers/usb/gadget/f_rndis.c index 8f3eae90919f..3ea4666be3d0 100644 --- a/drivers/usb/gadget/f_rndis.c +++ b/drivers/usb/gadget/f_rndis.c | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <linux/device.h> | 29 | #include <linux/device.h> |
30 | #include <linux/etherdevice.h> | 30 | #include <linux/etherdevice.h> |
31 | 31 | ||
32 | #include <asm/atomic.h> | 32 | #include <linux/atomic.h> |
33 | 33 | ||
34 | #include "u_ether.h" | 34 | #include "u_ether.h" |
35 | #include "rndis.h" | 35 | #include "rndis.h" |
diff --git a/drivers/usb/gadget/fusb300_udc.c b/drivers/usb/gadget/fusb300_udc.c index 24a924330c81..4ec888f90002 100644 --- a/drivers/usb/gadget/fusb300_udc.c +++ b/drivers/usb/gadget/fusb300_udc.c | |||
@@ -609,107 +609,6 @@ void fusb300_rdcxf(struct fusb300 *fusb300, | |||
609 | } | 609 | } |
610 | } | 610 | } |
611 | 611 | ||
612 | #if 0 | ||
613 | static void fusb300_dbg_fifo(struct fusb300_ep *ep, | ||
614 | u8 entry, u16 length) | ||
615 | { | ||
616 | u32 reg; | ||
617 | u32 i = 0; | ||
618 | u32 j = 0; | ||
619 | |||
620 | reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_GTM); | ||
621 | reg &= ~(FUSB300_GTM_TST_EP_ENTRY(0xF) | | ||
622 | FUSB300_GTM_TST_EP_NUM(0xF) | FUSB300_GTM_TST_FIFO_DEG); | ||
623 | reg |= (FUSB300_GTM_TST_EP_ENTRY(entry) | | ||
624 | FUSB300_GTM_TST_EP_NUM(ep->epnum) | FUSB300_GTM_TST_FIFO_DEG); | ||
625 | iowrite32(reg, ep->fusb300->reg + FUSB300_OFFSET_GTM); | ||
626 | |||
627 | for (i = 0; i < (length >> 2); i++) { | ||
628 | if (i * 4 == 1024) | ||
629 | break; | ||
630 | reg = ioread32(ep->fusb300->reg + | ||
631 | FUSB300_OFFSET_BUFDBG_START + i * 4); | ||
632 | printk(KERN_DEBUG" 0x%-8x", reg); | ||
633 | j++; | ||
634 | if ((j % 4) == 0) | ||
635 | printk(KERN_DEBUG "\n"); | ||
636 | } | ||
637 | |||
638 | if (length % 4) { | ||
639 | reg = ioread32(ep->fusb300->reg + | ||
640 | FUSB300_OFFSET_BUFDBG_START + i * 4); | ||
641 | printk(KERN_DEBUG " 0x%x\n", reg); | ||
642 | } | ||
643 | |||
644 | if ((j % 4) != 0) | ||
645 | printk(KERN_DEBUG "\n"); | ||
646 | |||
647 | fusb300_disable_bit(ep->fusb300, FUSB300_OFFSET_GTM, | ||
648 | FUSB300_GTM_TST_FIFO_DEG); | ||
649 | } | ||
650 | |||
651 | static void fusb300_cmp_dbg_fifo(struct fusb300_ep *ep, | ||
652 | u8 entry, u16 length, u8 *golden) | ||
653 | { | ||
654 | u32 reg; | ||
655 | u32 i = 0; | ||
656 | u32 golden_value; | ||
657 | u8 *tmp; | ||
658 | |||
659 | tmp = golden; | ||
660 | |||
661 | printk(KERN_DEBUG "fusb300_cmp_dbg_fifo (entry %d) : start\n", entry); | ||
662 | |||
663 | reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_GTM); | ||
664 | reg &= ~(FUSB300_GTM_TST_EP_ENTRY(0xF) | | ||
665 | FUSB300_GTM_TST_EP_NUM(0xF) | FUSB300_GTM_TST_FIFO_DEG); | ||
666 | reg |= (FUSB300_GTM_TST_EP_ENTRY(entry) | | ||
667 | FUSB300_GTM_TST_EP_NUM(ep->epnum) | FUSB300_GTM_TST_FIFO_DEG); | ||
668 | iowrite32(reg, ep->fusb300->reg + FUSB300_OFFSET_GTM); | ||
669 | |||
670 | for (i = 0; i < (length >> 2); i++) { | ||
671 | if (i * 4 == 1024) | ||
672 | break; | ||
673 | golden_value = *tmp | *(tmp + 1) << 8 | | ||
674 | *(tmp + 2) << 16 | *(tmp + 3) << 24; | ||
675 | |||
676 | reg = ioread32(ep->fusb300->reg + | ||
677 | FUSB300_OFFSET_BUFDBG_START + i*4); | ||
678 | |||
679 | if (reg != golden_value) { | ||
680 | printk(KERN_DEBUG "0x%x : ", (u32)(ep->fusb300->reg + | ||
681 | FUSB300_OFFSET_BUFDBG_START + i*4)); | ||
682 | printk(KERN_DEBUG " golden = 0x%x, reg = 0x%x\n", | ||
683 | golden_value, reg); | ||
684 | } | ||
685 | tmp += 4; | ||
686 | } | ||
687 | |||
688 | switch (length % 4) { | ||
689 | case 1: | ||
690 | golden_value = *tmp; | ||
691 | case 2: | ||
692 | golden_value = *tmp | *(tmp + 1) << 8; | ||
693 | case 3: | ||
694 | golden_value = *tmp | *(tmp + 1) << 8 | *(tmp + 2) << 16; | ||
695 | default: | ||
696 | break; | ||
697 | |||
698 | reg = ioread32(ep->fusb300->reg + FUSB300_OFFSET_BUFDBG_START + i*4); | ||
699 | if (reg != golden_value) { | ||
700 | printk(KERN_DEBUG "0x%x:", (u32)(ep->fusb300->reg + | ||
701 | FUSB300_OFFSET_BUFDBG_START + i*4)); | ||
702 | printk(KERN_DEBUG " golden = 0x%x, reg = 0x%x\n", | ||
703 | golden_value, reg); | ||
704 | } | ||
705 | } | ||
706 | |||
707 | printk(KERN_DEBUG "fusb300_cmp_dbg_fifo : end\n"); | ||
708 | fusb300_disable_bit(ep->fusb300, FUSB300_OFFSET_GTM, | ||
709 | FUSB300_GTM_TST_FIFO_DEG); | ||
710 | } | ||
711 | #endif | ||
712 | |||
713 | static void fusb300_rdfifo(struct fusb300_ep *ep, | 612 | static void fusb300_rdfifo(struct fusb300_ep *ep, |
714 | struct fusb300_request *req, | 613 | struct fusb300_request *req, |
715 | u32 length) | 614 | u32 length) |
diff --git a/drivers/usb/gadget/net2272.c b/drivers/usb/gadget/net2272.c index 7c7b0e120d88..ab98ea926a11 100644 --- a/drivers/usb/gadget/net2272.c +++ b/drivers/usb/gadget/net2272.c | |||
@@ -27,13 +27,13 @@ | |||
27 | #include <linux/interrupt.h> | 27 | #include <linux/interrupt.h> |
28 | #include <linux/io.h> | 28 | #include <linux/io.h> |
29 | #include <linux/ioport.h> | 29 | #include <linux/ioport.h> |
30 | #include <linux/irq.h> | ||
31 | #include <linux/kernel.h> | 30 | #include <linux/kernel.h> |
32 | #include <linux/list.h> | 31 | #include <linux/list.h> |
33 | #include <linux/module.h> | 32 | #include <linux/module.h> |
34 | #include <linux/moduleparam.h> | 33 | #include <linux/moduleparam.h> |
35 | #include <linux/pci.h> | 34 | #include <linux/pci.h> |
36 | #include <linux/platform_device.h> | 35 | #include <linux/platform_device.h> |
36 | #include <linux/prefetch.h> | ||
37 | #include <linux/sched.h> | 37 | #include <linux/sched.h> |
38 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
39 | #include <linux/timer.h> | 39 | #include <linux/timer.h> |
diff --git a/drivers/usb/gadget/s3c2410_udc.c b/drivers/usb/gadget/s3c2410_udc.c index 85c1b0d66293..8d31848aab09 100644 --- a/drivers/usb/gadget/s3c2410_udc.c +++ b/drivers/usb/gadget/s3c2410_udc.c | |||
@@ -2060,6 +2060,7 @@ static int s3c2410_udc_resume(struct platform_device *pdev) | |||
2060 | static const struct platform_device_id s3c_udc_ids[] = { | 2060 | static const struct platform_device_id s3c_udc_ids[] = { |
2061 | { "s3c2410-usbgadget", }, | 2061 | { "s3c2410-usbgadget", }, |
2062 | { "s3c2440-usbgadget", }, | 2062 | { "s3c2440-usbgadget", }, |
2063 | { } | ||
2063 | }; | 2064 | }; |
2064 | MODULE_DEVICE_TABLE(platform, s3c_udc_ids); | 2065 | MODULE_DEVICE_TABLE(platform, s3c_udc_ids); |
2065 | 2066 | ||
diff --git a/drivers/usb/gadget/uvc_queue.c b/drivers/usb/gadget/uvc_queue.c index f7395ac5dc17..aa0ad34e0f1f 100644 --- a/drivers/usb/gadget/uvc_queue.c +++ b/drivers/usb/gadget/uvc_queue.c | |||
@@ -19,7 +19,7 @@ | |||
19 | #include <linux/videodev2.h> | 19 | #include <linux/videodev2.h> |
20 | #include <linux/vmalloc.h> | 20 | #include <linux/vmalloc.h> |
21 | #include <linux/wait.h> | 21 | #include <linux/wait.h> |
22 | #include <asm/atomic.h> | 22 | #include <linux/atomic.h> |
23 | 23 | ||
24 | #include "uvc.h" | 24 | #include "uvc.h" |
25 | 25 | ||
diff --git a/drivers/usb/gadget/uvc_v4l2.c b/drivers/usb/gadget/uvc_v4l2.c index a7158053276a..cfb58384394d 100644 --- a/drivers/usb/gadget/uvc_v4l2.c +++ b/drivers/usb/gadget/uvc_v4l2.c | |||
@@ -123,24 +123,12 @@ uvc_v4l2_open(struct file *file) | |||
123 | struct video_device *vdev = video_devdata(file); | 123 | struct video_device *vdev = video_devdata(file); |
124 | struct uvc_device *uvc = video_get_drvdata(vdev); | 124 | struct uvc_device *uvc = video_get_drvdata(vdev); |
125 | struct uvc_file_handle *handle; | 125 | struct uvc_file_handle *handle; |
126 | int ret; | ||
127 | 126 | ||
128 | handle = kzalloc(sizeof(*handle), GFP_KERNEL); | 127 | handle = kzalloc(sizeof(*handle), GFP_KERNEL); |
129 | if (handle == NULL) | 128 | if (handle == NULL) |
130 | return -ENOMEM; | 129 | return -ENOMEM; |
131 | 130 | ||
132 | ret = v4l2_fh_init(&handle->vfh, vdev); | 131 | v4l2_fh_init(&handle->vfh, vdev); |
133 | if (ret < 0) | ||
134 | goto error; | ||
135 | |||
136 | ret = v4l2_event_init(&handle->vfh); | ||
137 | if (ret < 0) | ||
138 | goto error; | ||
139 | |||
140 | ret = v4l2_event_alloc(&handle->vfh, 8); | ||
141 | if (ret < 0) | ||
142 | goto error; | ||
143 | |||
144 | v4l2_fh_add(&handle->vfh); | 132 | v4l2_fh_add(&handle->vfh); |
145 | 133 | ||
146 | handle->device = &uvc->video; | 134 | handle->device = &uvc->video; |
@@ -148,10 +136,6 @@ uvc_v4l2_open(struct file *file) | |||
148 | 136 | ||
149 | uvc_function_connect(uvc); | 137 | uvc_function_connect(uvc); |
150 | return 0; | 138 | return 0; |
151 | |||
152 | error: | ||
153 | v4l2_fh_exit(&handle->vfh); | ||
154 | return ret; | ||
155 | } | 139 | } |
156 | 140 | ||
157 | static int | 141 | static int |
@@ -313,7 +297,7 @@ uvc_v4l2_do_ioctl(struct file *file, unsigned int cmd, void *arg) | |||
313 | if (sub->type < UVC_EVENT_FIRST || sub->type > UVC_EVENT_LAST) | 297 | if (sub->type < UVC_EVENT_FIRST || sub->type > UVC_EVENT_LAST) |
314 | return -EINVAL; | 298 | return -EINVAL; |
315 | 299 | ||
316 | return v4l2_event_subscribe(&handle->vfh, arg); | 300 | return v4l2_event_subscribe(&handle->vfh, arg, 2); |
317 | } | 301 | } |
318 | 302 | ||
319 | case VIDIOC_UNSUBSCRIBE_EVENT: | 303 | case VIDIOC_UNSUBSCRIBE_EVENT: |
@@ -353,7 +337,7 @@ uvc_v4l2_poll(struct file *file, poll_table *wait) | |||
353 | struct uvc_file_handle *handle = to_uvc_file_handle(file->private_data); | 337 | struct uvc_file_handle *handle = to_uvc_file_handle(file->private_data); |
354 | unsigned int mask = 0; | 338 | unsigned int mask = 0; |
355 | 339 | ||
356 | poll_wait(file, &handle->vfh.events->wait, wait); | 340 | poll_wait(file, &handle->vfh.wait, wait); |
357 | if (v4l2_event_pending(&handle->vfh)) | 341 | if (v4l2_event_pending(&handle->vfh)) |
358 | mask |= POLLPRI; | 342 | mask |= POLLPRI; |
359 | 343 | ||
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index bf2c8f65e1ae..4c32cb19b405 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -343,7 +343,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
343 | u32 temp; | 343 | u32 temp; |
344 | u32 power_okay; | 344 | u32 power_okay; |
345 | int i; | 345 | int i; |
346 | u8 resume_needed = 0; | 346 | unsigned long resume_needed = 0; |
347 | 347 | ||
348 | if (time_before (jiffies, ehci->next_statechange)) | 348 | if (time_before (jiffies, ehci->next_statechange)) |
349 | msleep(5); | 349 | msleep(5); |
@@ -416,7 +416,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
416 | if (test_bit(i, &ehci->bus_suspended) && | 416 | if (test_bit(i, &ehci->bus_suspended) && |
417 | (temp & PORT_SUSPEND)) { | 417 | (temp & PORT_SUSPEND)) { |
418 | temp |= PORT_RESUME; | 418 | temp |= PORT_RESUME; |
419 | resume_needed = 1; | 419 | set_bit(i, &resume_needed); |
420 | } | 420 | } |
421 | ehci_writel(ehci, temp, &ehci->regs->port_status [i]); | 421 | ehci_writel(ehci, temp, &ehci->regs->port_status [i]); |
422 | } | 422 | } |
@@ -431,8 +431,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
431 | i = HCS_N_PORTS (ehci->hcs_params); | 431 | i = HCS_N_PORTS (ehci->hcs_params); |
432 | while (i--) { | 432 | while (i--) { |
433 | temp = ehci_readl(ehci, &ehci->regs->port_status [i]); | 433 | temp = ehci_readl(ehci, &ehci->regs->port_status [i]); |
434 | if (test_bit(i, &ehci->bus_suspended) && | 434 | if (test_bit(i, &resume_needed)) { |
435 | (temp & PORT_SUSPEND)) { | ||
436 | temp &= ~(PORT_RWC_BITS | PORT_RESUME); | 435 | temp &= ~(PORT_RWC_BITS | PORT_RESUME); |
437 | ehci_writel(ehci, temp, &ehci->regs->port_status [i]); | 436 | ehci_writel(ehci, temp, &ehci->regs->port_status [i]); |
438 | ehci_vdbg (ehci, "resumed port %d\n", i + 1); | 437 | ehci_vdbg (ehci, "resumed port %d\n", i + 1); |
@@ -1046,7 +1045,19 @@ static int ehci_hub_control ( | |||
1046 | if (!selector || selector > 5) | 1045 | if (!selector || selector > 5) |
1047 | goto error; | 1046 | goto error; |
1048 | ehci_quiesce(ehci); | 1047 | ehci_quiesce(ehci); |
1048 | |||
1049 | /* Put all enabled ports into suspend */ | ||
1050 | while (ports--) { | ||
1051 | u32 __iomem *sreg = | ||
1052 | &ehci->regs->port_status[ports]; | ||
1053 | |||
1054 | temp = ehci_readl(ehci, sreg) & ~PORT_RWC_BITS; | ||
1055 | if (temp & PORT_PE) | ||
1056 | ehci_writel(ehci, temp | PORT_SUSPEND, | ||
1057 | sreg); | ||
1058 | } | ||
1049 | ehci_halt(ehci); | 1059 | ehci_halt(ehci); |
1060 | temp = ehci_readl(ehci, status_reg); | ||
1050 | temp |= selector << 16; | 1061 | temp |= selector << 16; |
1051 | ehci_writel(ehci, temp, status_reg); | 1062 | ehci_writel(ehci, temp, status_reg); |
1052 | break; | 1063 | break; |
diff --git a/drivers/usb/host/ehci-mxc.c b/drivers/usb/host/ehci-mxc.c index 0c058be35a38..555a73c864b5 100644 --- a/drivers/usb/host/ehci-mxc.c +++ b/drivers/usb/host/ehci-mxc.c | |||
@@ -24,6 +24,7 @@ | |||
24 | #include <linux/usb/ulpi.h> | 24 | #include <linux/usb/ulpi.h> |
25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
26 | 26 | ||
27 | #include <mach/hardware.h> | ||
27 | #include <mach/mxc_ehci.h> | 28 | #include <mach/mxc_ehci.h> |
28 | 29 | ||
29 | #include <asm/mach-types.h> | 30 | #include <asm/mach-types.h> |
diff --git a/drivers/usb/host/ehci-omap.c b/drivers/usb/host/ehci-omap.c index 55a57c23dd0f..45240321ca09 100644 --- a/drivers/usb/host/ehci-omap.c +++ b/drivers/usb/host/ehci-omap.c | |||
@@ -98,6 +98,18 @@ static void omap_ehci_soft_phy_reset(struct platform_device *pdev, u8 port) | |||
98 | } | 98 | } |
99 | } | 99 | } |
100 | 100 | ||
101 | static void disable_put_regulator( | ||
102 | struct ehci_hcd_omap_platform_data *pdata) | ||
103 | { | ||
104 | int i; | ||
105 | |||
106 | for (i = 0 ; i < OMAP3_HS_USB_PORTS ; i++) { | ||
107 | if (pdata->regulator[i]) { | ||
108 | regulator_disable(pdata->regulator[i]); | ||
109 | regulator_put(pdata->regulator[i]); | ||
110 | } | ||
111 | } | ||
112 | } | ||
101 | 113 | ||
102 | /* configure so an HC device and id are always provided */ | 114 | /* configure so an HC device and id are always provided */ |
103 | /* always called with process context; sleeping is OK */ | 115 | /* always called with process context; sleeping is OK */ |
@@ -231,9 +243,11 @@ err_add_hcd: | |||
231 | omap_usbhs_disable(dev); | 243 | omap_usbhs_disable(dev); |
232 | 244 | ||
233 | err_enable: | 245 | err_enable: |
246 | disable_put_regulator(pdata); | ||
234 | usb_put_hcd(hcd); | 247 | usb_put_hcd(hcd); |
235 | 248 | ||
236 | err_io: | 249 | err_io: |
250 | iounmap(regs); | ||
237 | return ret; | 251 | return ret; |
238 | } | 252 | } |
239 | 253 | ||
@@ -253,6 +267,8 @@ static int ehci_hcd_omap_remove(struct platform_device *pdev) | |||
253 | 267 | ||
254 | usb_remove_hcd(hcd); | 268 | usb_remove_hcd(hcd); |
255 | omap_usbhs_disable(dev); | 269 | omap_usbhs_disable(dev); |
270 | disable_put_regulator(dev->platform_data); | ||
271 | iounmap(hcd->regs); | ||
256 | usb_put_hcd(hcd); | 272 | usb_put_hcd(hcd); |
257 | return 0; | 273 | return 0; |
258 | } | 274 | } |
diff --git a/drivers/usb/host/ehci-s5p.c b/drivers/usb/host/ehci-s5p.c index b3958b3d3163..9e77f1c8bdbd 100644 --- a/drivers/usb/host/ehci-s5p.c +++ b/drivers/usb/host/ehci-s5p.c | |||
@@ -86,6 +86,7 @@ static int __devinit s5p_ehci_probe(struct platform_device *pdev) | |||
86 | goto fail_hcd; | 86 | goto fail_hcd; |
87 | } | 87 | } |
88 | 88 | ||
89 | s5p_ehci->hcd = hcd; | ||
89 | s5p_ehci->clk = clk_get(&pdev->dev, "usbhost"); | 90 | s5p_ehci->clk = clk_get(&pdev->dev, "usbhost"); |
90 | 91 | ||
91 | if (IS_ERR(s5p_ehci->clk)) { | 92 | if (IS_ERR(s5p_ehci->clk)) { |
diff --git a/drivers/usb/host/isp1760-hcd.c b/drivers/usb/host/isp1760-hcd.c index 55d3d5859ac5..840beda66dd9 100644 --- a/drivers/usb/host/isp1760-hcd.c +++ b/drivers/usb/host/isp1760-hcd.c | |||
@@ -1583,6 +1583,9 @@ static int isp1760_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, | |||
1583 | int retval = 0; | 1583 | int retval = 0; |
1584 | 1584 | ||
1585 | spin_lock_irqsave(&priv->lock, spinflags); | 1585 | spin_lock_irqsave(&priv->lock, spinflags); |
1586 | retval = usb_hcd_check_unlink_urb(hcd, urb, status); | ||
1587 | if (retval) | ||
1588 | goto out; | ||
1586 | 1589 | ||
1587 | qh = urb->ep->hcpriv; | 1590 | qh = urb->ep->hcpriv; |
1588 | if (!qh) { | 1591 | if (!qh) { |
diff --git a/drivers/usb/host/pci-quirks.c b/drivers/usb/host/pci-quirks.c index a9d315906e3d..629a96813fd6 100644 --- a/drivers/usb/host/pci-quirks.c +++ b/drivers/usb/host/pci-quirks.c | |||
@@ -535,7 +535,7 @@ static void __devinit quirk_usb_handoff_ohci(struct pci_dev *pdev) | |||
535 | iounmap(base); | 535 | iounmap(base); |
536 | } | 536 | } |
537 | 537 | ||
538 | static const struct dmi_system_id __initconst ehci_dmi_nohandoff_table[] = { | 538 | static const struct dmi_system_id __devinitconst ehci_dmi_nohandoff_table[] = { |
539 | { | 539 | { |
540 | /* Pegatron Lucid (ExoPC) */ | 540 | /* Pegatron Lucid (ExoPC) */ |
541 | .matches = { | 541 | .matches = { |
@@ -817,7 +817,7 @@ static void __devinit quirk_usb_handoff_xhci(struct pci_dev *pdev) | |||
817 | 817 | ||
818 | /* If the BIOS owns the HC, signal that the OS wants it, and wait */ | 818 | /* If the BIOS owns the HC, signal that the OS wants it, and wait */ |
819 | if (val & XHCI_HC_BIOS_OWNED) { | 819 | if (val & XHCI_HC_BIOS_OWNED) { |
820 | writel(val & XHCI_HC_OS_OWNED, base + ext_cap_offset); | 820 | writel(val | XHCI_HC_OS_OWNED, base + ext_cap_offset); |
821 | 821 | ||
822 | /* Wait for 5 seconds with 10 microsecond polling interval */ | 822 | /* Wait for 5 seconds with 10 microsecond polling interval */ |
823 | timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED, | 823 | timeout = handshake(base + ext_cap_offset, XHCI_HC_BIOS_OWNED, |
diff --git a/drivers/usb/host/xhci-hub.c b/drivers/usb/host/xhci-hub.c index 0be788cc2fdb..1e96d1f1fe6b 100644 --- a/drivers/usb/host/xhci-hub.c +++ b/drivers/usb/host/xhci-hub.c | |||
@@ -463,11 +463,12 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
463 | && (temp & PORT_POWER)) | 463 | && (temp & PORT_POWER)) |
464 | status |= USB_PORT_STAT_SUSPEND; | 464 | status |= USB_PORT_STAT_SUSPEND; |
465 | } | 465 | } |
466 | if ((temp & PORT_PLS_MASK) == XDEV_RESUME) { | 466 | if ((temp & PORT_PLS_MASK) == XDEV_RESUME && |
467 | !DEV_SUPERSPEED(temp)) { | ||
467 | if ((temp & PORT_RESET) || !(temp & PORT_PE)) | 468 | if ((temp & PORT_RESET) || !(temp & PORT_PE)) |
468 | goto error; | 469 | goto error; |
469 | if (!DEV_SUPERSPEED(temp) && time_after_eq(jiffies, | 470 | if (time_after_eq(jiffies, |
470 | bus_state->resume_done[wIndex])) { | 471 | bus_state->resume_done[wIndex])) { |
471 | xhci_dbg(xhci, "Resume USB2 port %d\n", | 472 | xhci_dbg(xhci, "Resume USB2 port %d\n", |
472 | wIndex + 1); | 473 | wIndex + 1); |
473 | bus_state->resume_done[wIndex] = 0; | 474 | bus_state->resume_done[wIndex] = 0; |
@@ -487,6 +488,14 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
487 | xhci_ring_device(xhci, slot_id); | 488 | xhci_ring_device(xhci, slot_id); |
488 | bus_state->port_c_suspend |= 1 << wIndex; | 489 | bus_state->port_c_suspend |= 1 << wIndex; |
489 | bus_state->suspended_ports &= ~(1 << wIndex); | 490 | bus_state->suspended_ports &= ~(1 << wIndex); |
491 | } else { | ||
492 | /* | ||
493 | * The resume has been signaling for less than | ||
494 | * 20ms. Report the port status as SUSPEND, | ||
495 | * let the usbcore check port status again | ||
496 | * and clear resume signaling later. | ||
497 | */ | ||
498 | status |= USB_PORT_STAT_SUSPEND; | ||
490 | } | 499 | } |
491 | } | 500 | } |
492 | if ((temp & PORT_PLS_MASK) == XDEV_U0 | 501 | if ((temp & PORT_PLS_MASK) == XDEV_U0 |
@@ -664,7 +673,7 @@ int xhci_hub_control(struct usb_hcd *hcd, u16 typeReq, u16 wValue, | |||
664 | xhci_dbg(xhci, "PORTSC %04x\n", temp); | 673 | xhci_dbg(xhci, "PORTSC %04x\n", temp); |
665 | if (temp & PORT_RESET) | 674 | if (temp & PORT_RESET) |
666 | goto error; | 675 | goto error; |
667 | if (temp & XDEV_U3) { | 676 | if ((temp & PORT_PLS_MASK) == XDEV_U3) { |
668 | if ((temp & PORT_PE) == 0) | 677 | if ((temp & PORT_PE) == 0) |
669 | goto error; | 678 | goto error; |
670 | 679 | ||
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c index 7113d16e2d3a..54139a2f06ce 100644 --- a/drivers/usb/host/xhci-ring.c +++ b/drivers/usb/host/xhci-ring.c | |||
@@ -514,8 +514,12 @@ void xhci_find_new_dequeue_state(struct xhci_hcd *xhci, | |||
514 | (unsigned long long) addr); | 514 | (unsigned long long) addr); |
515 | } | 515 | } |
516 | 516 | ||
517 | /* flip_cycle means flip the cycle bit of all but the first and last TRB. | ||
518 | * (The last TRB actually points to the ring enqueue pointer, which is not part | ||
519 | * of this TD.) This is used to remove partially enqueued isoc TDs from a ring. | ||
520 | */ | ||
517 | static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | 521 | static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, |
518 | struct xhci_td *cur_td) | 522 | struct xhci_td *cur_td, bool flip_cycle) |
519 | { | 523 | { |
520 | struct xhci_segment *cur_seg; | 524 | struct xhci_segment *cur_seg; |
521 | union xhci_trb *cur_trb; | 525 | union xhci_trb *cur_trb; |
@@ -528,6 +532,12 @@ static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | |||
528 | * leave the pointers intact. | 532 | * leave the pointers intact. |
529 | */ | 533 | */ |
530 | cur_trb->generic.field[3] &= cpu_to_le32(~TRB_CHAIN); | 534 | cur_trb->generic.field[3] &= cpu_to_le32(~TRB_CHAIN); |
535 | /* Flip the cycle bit (link TRBs can't be the first | ||
536 | * or last TRB). | ||
537 | */ | ||
538 | if (flip_cycle) | ||
539 | cur_trb->generic.field[3] ^= | ||
540 | cpu_to_le32(TRB_CYCLE); | ||
531 | xhci_dbg(xhci, "Cancel (unchain) link TRB\n"); | 541 | xhci_dbg(xhci, "Cancel (unchain) link TRB\n"); |
532 | xhci_dbg(xhci, "Address = %p (0x%llx dma); " | 542 | xhci_dbg(xhci, "Address = %p (0x%llx dma); " |
533 | "in seg %p (0x%llx dma)\n", | 543 | "in seg %p (0x%llx dma)\n", |
@@ -541,6 +551,11 @@ static void td_to_noop(struct xhci_hcd *xhci, struct xhci_ring *ep_ring, | |||
541 | cur_trb->generic.field[2] = 0; | 551 | cur_trb->generic.field[2] = 0; |
542 | /* Preserve only the cycle bit of this TRB */ | 552 | /* Preserve only the cycle bit of this TRB */ |
543 | cur_trb->generic.field[3] &= cpu_to_le32(TRB_CYCLE); | 553 | cur_trb->generic.field[3] &= cpu_to_le32(TRB_CYCLE); |
554 | /* Flip the cycle bit except on the first or last TRB */ | ||
555 | if (flip_cycle && cur_trb != cur_td->first_trb && | ||
556 | cur_trb != cur_td->last_trb) | ||
557 | cur_trb->generic.field[3] ^= | ||
558 | cpu_to_le32(TRB_CYCLE); | ||
544 | cur_trb->generic.field[3] |= cpu_to_le32( | 559 | cur_trb->generic.field[3] |= cpu_to_le32( |
545 | TRB_TYPE(TRB_TR_NOOP)); | 560 | TRB_TYPE(TRB_TR_NOOP)); |
546 | xhci_dbg(xhci, "Cancel TRB %p (0x%llx dma) " | 561 | xhci_dbg(xhci, "Cancel TRB %p (0x%llx dma) " |
@@ -719,14 +734,14 @@ static void handle_stopped_endpoint(struct xhci_hcd *xhci, | |||
719 | cur_td->urb->stream_id, | 734 | cur_td->urb->stream_id, |
720 | cur_td, &deq_state); | 735 | cur_td, &deq_state); |
721 | else | 736 | else |
722 | td_to_noop(xhci, ep_ring, cur_td); | 737 | td_to_noop(xhci, ep_ring, cur_td, false); |
723 | remove_finished_td: | 738 | remove_finished_td: |
724 | /* | 739 | /* |
725 | * The event handler won't see a completion for this TD anymore, | 740 | * The event handler won't see a completion for this TD anymore, |
726 | * so remove it from the endpoint ring's TD list. Keep it in | 741 | * so remove it from the endpoint ring's TD list. Keep it in |
727 | * the cancelled TD list for URB completion later. | 742 | * the cancelled TD list for URB completion later. |
728 | */ | 743 | */ |
729 | list_del(&cur_td->td_list); | 744 | list_del_init(&cur_td->td_list); |
730 | } | 745 | } |
731 | last_unlinked_td = cur_td; | 746 | last_unlinked_td = cur_td; |
732 | xhci_stop_watchdog_timer_in_irq(xhci, ep); | 747 | xhci_stop_watchdog_timer_in_irq(xhci, ep); |
@@ -754,7 +769,7 @@ remove_finished_td: | |||
754 | do { | 769 | do { |
755 | cur_td = list_entry(ep->cancelled_td_list.next, | 770 | cur_td = list_entry(ep->cancelled_td_list.next, |
756 | struct xhci_td, cancelled_td_list); | 771 | struct xhci_td, cancelled_td_list); |
757 | list_del(&cur_td->cancelled_td_list); | 772 | list_del_init(&cur_td->cancelled_td_list); |
758 | 773 | ||
759 | /* Clean up the cancelled URB */ | 774 | /* Clean up the cancelled URB */ |
760 | /* Doesn't matter what we pass for status, since the core will | 775 | /* Doesn't matter what we pass for status, since the core will |
@@ -862,9 +877,9 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg) | |||
862 | cur_td = list_first_entry(&ring->td_list, | 877 | cur_td = list_first_entry(&ring->td_list, |
863 | struct xhci_td, | 878 | struct xhci_td, |
864 | td_list); | 879 | td_list); |
865 | list_del(&cur_td->td_list); | 880 | list_del_init(&cur_td->td_list); |
866 | if (!list_empty(&cur_td->cancelled_td_list)) | 881 | if (!list_empty(&cur_td->cancelled_td_list)) |
867 | list_del(&cur_td->cancelled_td_list); | 882 | list_del_init(&cur_td->cancelled_td_list); |
868 | xhci_giveback_urb_in_irq(xhci, cur_td, | 883 | xhci_giveback_urb_in_irq(xhci, cur_td, |
869 | -ESHUTDOWN, "killed"); | 884 | -ESHUTDOWN, "killed"); |
870 | } | 885 | } |
@@ -873,7 +888,7 @@ void xhci_stop_endpoint_command_watchdog(unsigned long arg) | |||
873 | &temp_ep->cancelled_td_list, | 888 | &temp_ep->cancelled_td_list, |
874 | struct xhci_td, | 889 | struct xhci_td, |
875 | cancelled_td_list); | 890 | cancelled_td_list); |
876 | list_del(&cur_td->cancelled_td_list); | 891 | list_del_init(&cur_td->cancelled_td_list); |
877 | xhci_giveback_urb_in_irq(xhci, cur_td, | 892 | xhci_giveback_urb_in_irq(xhci, cur_td, |
878 | -ESHUTDOWN, "killed"); | 893 | -ESHUTDOWN, "killed"); |
879 | } | 894 | } |
@@ -1565,10 +1580,10 @@ td_cleanup: | |||
1565 | else | 1580 | else |
1566 | *status = 0; | 1581 | *status = 0; |
1567 | } | 1582 | } |
1568 | list_del(&td->td_list); | 1583 | list_del_init(&td->td_list); |
1569 | /* Was this TD slated to be cancelled but completed anyway? */ | 1584 | /* Was this TD slated to be cancelled but completed anyway? */ |
1570 | if (!list_empty(&td->cancelled_td_list)) | 1585 | if (!list_empty(&td->cancelled_td_list)) |
1571 | list_del(&td->cancelled_td_list); | 1586 | list_del_init(&td->cancelled_td_list); |
1572 | 1587 | ||
1573 | urb_priv->td_cnt++; | 1588 | urb_priv->td_cnt++; |
1574 | /* Giveback the urb when all the tds are completed */ | 1589 | /* Giveback the urb when all the tds are completed */ |
@@ -2500,11 +2515,8 @@ static int prepare_transfer(struct xhci_hcd *xhci, | |||
2500 | 2515 | ||
2501 | if (td_index == 0) { | 2516 | if (td_index == 0) { |
2502 | ret = usb_hcd_link_urb_to_ep(bus_to_hcd(urb->dev->bus), urb); | 2517 | ret = usb_hcd_link_urb_to_ep(bus_to_hcd(urb->dev->bus), urb); |
2503 | if (unlikely(ret)) { | 2518 | if (unlikely(ret)) |
2504 | xhci_urb_free_priv(xhci, urb_priv); | ||
2505 | urb->hcpriv = NULL; | ||
2506 | return ret; | 2519 | return ret; |
2507 | } | ||
2508 | } | 2520 | } |
2509 | 2521 | ||
2510 | td->urb = urb; | 2522 | td->urb = urb; |
@@ -2672,6 +2684,10 @@ static u32 xhci_v1_0_td_remainder(int running_total, int trb_buff_len, | |||
2672 | { | 2684 | { |
2673 | int packets_transferred; | 2685 | int packets_transferred; |
2674 | 2686 | ||
2687 | /* One TRB with a zero-length data packet. */ | ||
2688 | if (running_total == 0 && trb_buff_len == 0) | ||
2689 | return 0; | ||
2690 | |||
2675 | /* All the TRB queueing functions don't count the current TRB in | 2691 | /* All the TRB queueing functions don't count the current TRB in |
2676 | * running_total. | 2692 | * running_total. |
2677 | */ | 2693 | */ |
@@ -3113,20 +3129,15 @@ static int count_isoc_trbs_needed(struct xhci_hcd *xhci, | |||
3113 | struct urb *urb, int i) | 3129 | struct urb *urb, int i) |
3114 | { | 3130 | { |
3115 | int num_trbs = 0; | 3131 | int num_trbs = 0; |
3116 | u64 addr, td_len, running_total; | 3132 | u64 addr, td_len; |
3117 | 3133 | ||
3118 | addr = (u64) (urb->transfer_dma + urb->iso_frame_desc[i].offset); | 3134 | addr = (u64) (urb->transfer_dma + urb->iso_frame_desc[i].offset); |
3119 | td_len = urb->iso_frame_desc[i].length; | 3135 | td_len = urb->iso_frame_desc[i].length; |
3120 | 3136 | ||
3121 | running_total = TRB_MAX_BUFF_SIZE - (addr & (TRB_MAX_BUFF_SIZE - 1)); | 3137 | num_trbs = DIV_ROUND_UP(td_len + (addr & (TRB_MAX_BUFF_SIZE - 1)), |
3122 | running_total &= TRB_MAX_BUFF_SIZE - 1; | 3138 | TRB_MAX_BUFF_SIZE); |
3123 | if (running_total != 0) | 3139 | if (num_trbs == 0) |
3124 | num_trbs++; | ||
3125 | |||
3126 | while (running_total < td_len) { | ||
3127 | num_trbs++; | 3140 | num_trbs++; |
3128 | running_total += TRB_MAX_BUFF_SIZE; | ||
3129 | } | ||
3130 | 3141 | ||
3131 | return num_trbs; | 3142 | return num_trbs; |
3132 | } | 3143 | } |
@@ -3226,6 +3237,7 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3226 | start_trb = &ep_ring->enqueue->generic; | 3237 | start_trb = &ep_ring->enqueue->generic; |
3227 | start_cycle = ep_ring->cycle_state; | 3238 | start_cycle = ep_ring->cycle_state; |
3228 | 3239 | ||
3240 | urb_priv = urb->hcpriv; | ||
3229 | /* Queue the first TRB, even if it's zero-length */ | 3241 | /* Queue the first TRB, even if it's zero-length */ |
3230 | for (i = 0; i < num_tds; i++) { | 3242 | for (i = 0; i < num_tds; i++) { |
3231 | unsigned int total_packet_count; | 3243 | unsigned int total_packet_count; |
@@ -3237,9 +3249,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3237 | addr = start_addr + urb->iso_frame_desc[i].offset; | 3249 | addr = start_addr + urb->iso_frame_desc[i].offset; |
3238 | td_len = urb->iso_frame_desc[i].length; | 3250 | td_len = urb->iso_frame_desc[i].length; |
3239 | td_remain_len = td_len; | 3251 | td_remain_len = td_len; |
3240 | /* FIXME: Ignoring zero-length packets, can those happen? */ | ||
3241 | total_packet_count = roundup(td_len, | 3252 | total_packet_count = roundup(td_len, |
3242 | le16_to_cpu(urb->ep->desc.wMaxPacketSize)); | 3253 | le16_to_cpu(urb->ep->desc.wMaxPacketSize)); |
3254 | /* A zero-length transfer still involves at least one packet. */ | ||
3255 | if (total_packet_count == 0) | ||
3256 | total_packet_count++; | ||
3243 | burst_count = xhci_get_burst_count(xhci, urb->dev, urb, | 3257 | burst_count = xhci_get_burst_count(xhci, urb->dev, urb, |
3244 | total_packet_count); | 3258 | total_packet_count); |
3245 | residue = xhci_get_last_burst_packet_count(xhci, | 3259 | residue = xhci_get_last_burst_packet_count(xhci, |
@@ -3249,12 +3263,13 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3249 | 3263 | ||
3250 | ret = prepare_transfer(xhci, xhci->devs[slot_id], ep_index, | 3264 | ret = prepare_transfer(xhci, xhci->devs[slot_id], ep_index, |
3251 | urb->stream_id, trbs_per_td, urb, i, mem_flags); | 3265 | urb->stream_id, trbs_per_td, urb, i, mem_flags); |
3252 | if (ret < 0) | 3266 | if (ret < 0) { |
3253 | return ret; | 3267 | if (i == 0) |
3268 | return ret; | ||
3269 | goto cleanup; | ||
3270 | } | ||
3254 | 3271 | ||
3255 | urb_priv = urb->hcpriv; | ||
3256 | td = urb_priv->td[i]; | 3272 | td = urb_priv->td[i]; |
3257 | |||
3258 | for (j = 0; j < trbs_per_td; j++) { | 3273 | for (j = 0; j < trbs_per_td; j++) { |
3259 | u32 remainder = 0; | 3274 | u32 remainder = 0; |
3260 | field = TRB_TBC(burst_count) | TRB_TLBPC(residue); | 3275 | field = TRB_TBC(burst_count) | TRB_TLBPC(residue); |
@@ -3344,6 +3359,27 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags, | |||
3344 | giveback_first_trb(xhci, slot_id, ep_index, urb->stream_id, | 3359 | giveback_first_trb(xhci, slot_id, ep_index, urb->stream_id, |
3345 | start_cycle, start_trb); | 3360 | start_cycle, start_trb); |
3346 | return 0; | 3361 | return 0; |
3362 | cleanup: | ||
3363 | /* Clean up a partially enqueued isoc transfer. */ | ||
3364 | |||
3365 | for (i--; i >= 0; i--) | ||
3366 | list_del_init(&urb_priv->td[i]->td_list); | ||
3367 | |||
3368 | /* Use the first TD as a temporary variable to turn the TDs we've queued | ||
3369 | * into No-ops with a software-owned cycle bit. That way the hardware | ||
3370 | * won't accidentally start executing bogus TDs when we partially | ||
3371 | * overwrite them. td->first_trb and td->start_seg are already set. | ||
3372 | */ | ||
3373 | urb_priv->td[0]->last_trb = ep_ring->enqueue; | ||
3374 | /* Every TRB except the first & last will have its cycle bit flipped. */ | ||
3375 | td_to_noop(xhci, ep_ring, urb_priv->td[0], true); | ||
3376 | |||
3377 | /* Reset the ring enqueue back to the first TRB and its cycle bit. */ | ||
3378 | ep_ring->enqueue = urb_priv->td[0]->first_trb; | ||
3379 | ep_ring->enq_seg = urb_priv->td[0]->start_seg; | ||
3380 | ep_ring->cycle_state = start_cycle; | ||
3381 | usb_hcd_unlink_urb_from_ep(bus_to_hcd(urb->dev->bus), urb); | ||
3382 | return ret; | ||
3347 | } | 3383 | } |
3348 | 3384 | ||
3349 | /* | 3385 | /* |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 763f484bc092..3a0f695138f4 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -345,7 +345,8 @@ static void xhci_event_ring_work(unsigned long arg) | |||
345 | spin_lock_irqsave(&xhci->lock, flags); | 345 | spin_lock_irqsave(&xhci->lock, flags); |
346 | temp = xhci_readl(xhci, &xhci->op_regs->status); | 346 | temp = xhci_readl(xhci, &xhci->op_regs->status); |
347 | xhci_dbg(xhci, "op reg status = 0x%x\n", temp); | 347 | xhci_dbg(xhci, "op reg status = 0x%x\n", temp); |
348 | if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING)) { | 348 | if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING) || |
349 | (xhci->xhc_state & XHCI_STATE_HALTED)) { | ||
349 | xhci_dbg(xhci, "HW died, polling stopped.\n"); | 350 | xhci_dbg(xhci, "HW died, polling stopped.\n"); |
350 | spin_unlock_irqrestore(&xhci->lock, flags); | 351 | spin_unlock_irqrestore(&xhci->lock, flags); |
351 | return; | 352 | return; |
@@ -939,8 +940,11 @@ static int xhci_check_args(struct usb_hcd *hcd, struct usb_device *udev, | |||
939 | return 0; | 940 | return 0; |
940 | } | 941 | } |
941 | 942 | ||
943 | xhci = hcd_to_xhci(hcd); | ||
944 | if (xhci->xhc_state & XHCI_STATE_HALTED) | ||
945 | return -ENODEV; | ||
946 | |||
942 | if (check_virt_dev) { | 947 | if (check_virt_dev) { |
943 | xhci = hcd_to_xhci(hcd); | ||
944 | if (!udev->slot_id || !xhci->devs | 948 | if (!udev->slot_id || !xhci->devs |
945 | || !xhci->devs[udev->slot_id]) { | 949 | || !xhci->devs[udev->slot_id]) { |
946 | printk(KERN_DEBUG "xHCI %s called with unaddressed " | 950 | printk(KERN_DEBUG "xHCI %s called with unaddressed " |
@@ -1081,8 +1085,11 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) | |||
1081 | if (urb->dev->speed == USB_SPEED_FULL) { | 1085 | if (urb->dev->speed == USB_SPEED_FULL) { |
1082 | ret = xhci_check_maxpacket(xhci, slot_id, | 1086 | ret = xhci_check_maxpacket(xhci, slot_id, |
1083 | ep_index, urb); | 1087 | ep_index, urb); |
1084 | if (ret < 0) | 1088 | if (ret < 0) { |
1089 | xhci_urb_free_priv(xhci, urb_priv); | ||
1090 | urb->hcpriv = NULL; | ||
1085 | return ret; | 1091 | return ret; |
1092 | } | ||
1086 | } | 1093 | } |
1087 | 1094 | ||
1088 | /* We have a spinlock and interrupts disabled, so we must pass | 1095 | /* We have a spinlock and interrupts disabled, so we must pass |
@@ -1093,6 +1100,8 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) | |||
1093 | goto dying; | 1100 | goto dying; |
1094 | ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb, | 1101 | ret = xhci_queue_ctrl_tx(xhci, GFP_ATOMIC, urb, |
1095 | slot_id, ep_index); | 1102 | slot_id, ep_index); |
1103 | if (ret) | ||
1104 | goto free_priv; | ||
1096 | spin_unlock_irqrestore(&xhci->lock, flags); | 1105 | spin_unlock_irqrestore(&xhci->lock, flags); |
1097 | } else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) { | 1106 | } else if (usb_endpoint_xfer_bulk(&urb->ep->desc)) { |
1098 | spin_lock_irqsave(&xhci->lock, flags); | 1107 | spin_lock_irqsave(&xhci->lock, flags); |
@@ -1113,6 +1122,8 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) | |||
1113 | ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb, | 1122 | ret = xhci_queue_bulk_tx(xhci, GFP_ATOMIC, urb, |
1114 | slot_id, ep_index); | 1123 | slot_id, ep_index); |
1115 | } | 1124 | } |
1125 | if (ret) | ||
1126 | goto free_priv; | ||
1116 | spin_unlock_irqrestore(&xhci->lock, flags); | 1127 | spin_unlock_irqrestore(&xhci->lock, flags); |
1117 | } else if (usb_endpoint_xfer_int(&urb->ep->desc)) { | 1128 | } else if (usb_endpoint_xfer_int(&urb->ep->desc)) { |
1118 | spin_lock_irqsave(&xhci->lock, flags); | 1129 | spin_lock_irqsave(&xhci->lock, flags); |
@@ -1120,6 +1131,8 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) | |||
1120 | goto dying; | 1131 | goto dying; |
1121 | ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb, | 1132 | ret = xhci_queue_intr_tx(xhci, GFP_ATOMIC, urb, |
1122 | slot_id, ep_index); | 1133 | slot_id, ep_index); |
1134 | if (ret) | ||
1135 | goto free_priv; | ||
1123 | spin_unlock_irqrestore(&xhci->lock, flags); | 1136 | spin_unlock_irqrestore(&xhci->lock, flags); |
1124 | } else { | 1137 | } else { |
1125 | spin_lock_irqsave(&xhci->lock, flags); | 1138 | spin_lock_irqsave(&xhci->lock, flags); |
@@ -1127,18 +1140,22 @@ int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flags) | |||
1127 | goto dying; | 1140 | goto dying; |
1128 | ret = xhci_queue_isoc_tx_prepare(xhci, GFP_ATOMIC, urb, | 1141 | ret = xhci_queue_isoc_tx_prepare(xhci, GFP_ATOMIC, urb, |
1129 | slot_id, ep_index); | 1142 | slot_id, ep_index); |
1143 | if (ret) | ||
1144 | goto free_priv; | ||
1130 | spin_unlock_irqrestore(&xhci->lock, flags); | 1145 | spin_unlock_irqrestore(&xhci->lock, flags); |
1131 | } | 1146 | } |
1132 | exit: | 1147 | exit: |
1133 | return ret; | 1148 | return ret; |
1134 | dying: | 1149 | dying: |
1135 | xhci_urb_free_priv(xhci, urb_priv); | ||
1136 | urb->hcpriv = NULL; | ||
1137 | xhci_dbg(xhci, "Ep 0x%x: URB %p submitted for " | 1150 | xhci_dbg(xhci, "Ep 0x%x: URB %p submitted for " |
1138 | "non-responsive xHCI host.\n", | 1151 | "non-responsive xHCI host.\n", |
1139 | urb->ep->desc.bEndpointAddress, urb); | 1152 | urb->ep->desc.bEndpointAddress, urb); |
1153 | ret = -ESHUTDOWN; | ||
1154 | free_priv: | ||
1155 | xhci_urb_free_priv(xhci, urb_priv); | ||
1156 | urb->hcpriv = NULL; | ||
1140 | spin_unlock_irqrestore(&xhci->lock, flags); | 1157 | spin_unlock_irqrestore(&xhci->lock, flags); |
1141 | return -ESHUTDOWN; | 1158 | return ret; |
1142 | } | 1159 | } |
1143 | 1160 | ||
1144 | /* Get the right ring for the given URB. | 1161 | /* Get the right ring for the given URB. |
@@ -1235,6 +1252,13 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1235 | if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_HALTED)) { | 1252 | if (temp == 0xffffffff || (xhci->xhc_state & XHCI_STATE_HALTED)) { |
1236 | xhci_dbg(xhci, "HW died, freeing TD.\n"); | 1253 | xhci_dbg(xhci, "HW died, freeing TD.\n"); |
1237 | urb_priv = urb->hcpriv; | 1254 | urb_priv = urb->hcpriv; |
1255 | for (i = urb_priv->td_cnt; i < urb_priv->length; i++) { | ||
1256 | td = urb_priv->td[i]; | ||
1257 | if (!list_empty(&td->td_list)) | ||
1258 | list_del_init(&td->td_list); | ||
1259 | if (!list_empty(&td->cancelled_td_list)) | ||
1260 | list_del_init(&td->cancelled_td_list); | ||
1261 | } | ||
1238 | 1262 | ||
1239 | usb_hcd_unlink_urb_from_ep(hcd, urb); | 1263 | usb_hcd_unlink_urb_from_ep(hcd, urb); |
1240 | spin_unlock_irqrestore(&xhci->lock, flags); | 1264 | spin_unlock_irqrestore(&xhci->lock, flags); |
@@ -1242,7 +1266,8 @@ int xhci_urb_dequeue(struct usb_hcd *hcd, struct urb *urb, int status) | |||
1242 | xhci_urb_free_priv(xhci, urb_priv); | 1266 | xhci_urb_free_priv(xhci, urb_priv); |
1243 | return ret; | 1267 | return ret; |
1244 | } | 1268 | } |
1245 | if (xhci->xhc_state & XHCI_STATE_DYING) { | 1269 | if ((xhci->xhc_state & XHCI_STATE_DYING) || |
1270 | (xhci->xhc_state & XHCI_STATE_HALTED)) { | ||
1246 | xhci_dbg(xhci, "Ep 0x%x: URB %p to be canceled on " | 1271 | xhci_dbg(xhci, "Ep 0x%x: URB %p to be canceled on " |
1247 | "non-responsive xHCI host.\n", | 1272 | "non-responsive xHCI host.\n", |
1248 | urb->ep->desc.bEndpointAddress, urb); | 1273 | urb->ep->desc.bEndpointAddress, urb); |
@@ -2665,7 +2690,10 @@ void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) | |||
2665 | int i, ret; | 2690 | int i, ret; |
2666 | 2691 | ||
2667 | ret = xhci_check_args(hcd, udev, NULL, 0, true, __func__); | 2692 | ret = xhci_check_args(hcd, udev, NULL, 0, true, __func__); |
2668 | if (ret <= 0) | 2693 | /* If the host is halted due to driver unload, we still need to free the |
2694 | * device. | ||
2695 | */ | ||
2696 | if (ret <= 0 && ret != -ENODEV) | ||
2669 | return; | 2697 | return; |
2670 | 2698 | ||
2671 | virt_dev = xhci->devs[udev->slot_id]; | 2699 | virt_dev = xhci->devs[udev->slot_id]; |
@@ -2679,7 +2707,8 @@ void xhci_free_dev(struct usb_hcd *hcd, struct usb_device *udev) | |||
2679 | spin_lock_irqsave(&xhci->lock, flags); | 2707 | spin_lock_irqsave(&xhci->lock, flags); |
2680 | /* Don't disable the slot if the host controller is dead. */ | 2708 | /* Don't disable the slot if the host controller is dead. */ |
2681 | state = xhci_readl(xhci, &xhci->op_regs->status); | 2709 | state = xhci_readl(xhci, &xhci->op_regs->status); |
2682 | if (state == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING)) { | 2710 | if (state == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING) || |
2711 | (xhci->xhc_state & XHCI_STATE_HALTED)) { | ||
2683 | xhci_free_virt_device(xhci, udev->slot_id); | 2712 | xhci_free_virt_device(xhci, udev->slot_id); |
2684 | spin_unlock_irqrestore(&xhci->lock, flags); | 2713 | spin_unlock_irqrestore(&xhci->lock, flags); |
2685 | return; | 2714 | return; |
diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index a0037961e5bd..27e209a7222f 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c | |||
@@ -131,7 +131,7 @@ | |||
131 | #include <linux/usb.h> | 131 | #include <linux/usb.h> |
132 | #include <linux/proc_fs.h> | 132 | #include <linux/proc_fs.h> |
133 | 133 | ||
134 | #include <asm/atomic.h> | 134 | #include <linux/atomic.h> |
135 | #include <linux/blkdev.h> | 135 | #include <linux/blkdev.h> |
136 | #include "../../scsi/scsi.h" | 136 | #include "../../scsi/scsi.h" |
137 | #include <scsi/scsi_host.h> | 137 | #include <scsi/scsi_host.h> |
diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c index 68ab460a735c..ac0d75a9005a 100644 --- a/drivers/usb/misc/appledisplay.c +++ b/drivers/usb/misc/appledisplay.c | |||
@@ -29,7 +29,7 @@ | |||
29 | #include <linux/backlight.h> | 29 | #include <linux/backlight.h> |
30 | #include <linux/timer.h> | 30 | #include <linux/timer.h> |
31 | #include <linux/workqueue.h> | 31 | #include <linux/workqueue.h> |
32 | #include <asm/atomic.h> | 32 | #include <linux/atomic.h> |
33 | 33 | ||
34 | #define APPLE_VENDOR_ID 0x05AC | 34 | #define APPLE_VENDOR_ID 0x05AC |
35 | 35 | ||
diff --git a/drivers/usb/musb/Kconfig b/drivers/usb/musb/Kconfig index 6192b45959f4..fc34b8b11910 100644 --- a/drivers/usb/musb/Kconfig +++ b/drivers/usb/musb/Kconfig | |||
@@ -3,9 +3,6 @@ | |||
3 | # for silicon based on Mentor Graphics INVENTRA designs | 3 | # for silicon based on Mentor Graphics INVENTRA designs |
4 | # | 4 | # |
5 | 5 | ||
6 | comment "Enable Host or Gadget support to see Inventra options" | ||
7 | depends on !USB && USB_GADGET=n | ||
8 | |||
9 | # (M)HDRC = (Multipoint) Highspeed Dual-Role Controller | 6 | # (M)HDRC = (Multipoint) Highspeed Dual-Role Controller |
10 | config USB_MUSB_HDRC | 7 | config USB_MUSB_HDRC |
11 | depends on USB && USB_GADGET | 8 | depends on USB && USB_GADGET |
diff --git a/drivers/usb/musb/blackfin.c b/drivers/usb/musb/blackfin.c index ae8c39617743..5e7cfba5b079 100644 --- a/drivers/usb/musb/blackfin.c +++ b/drivers/usb/musb/blackfin.c | |||
@@ -17,6 +17,7 @@ | |||
17 | #include <linux/io.h> | 17 | #include <linux/io.h> |
18 | #include <linux/platform_device.h> | 18 | #include <linux/platform_device.h> |
19 | #include <linux/dma-mapping.h> | 19 | #include <linux/dma-mapping.h> |
20 | #include <linux/prefetch.h> | ||
20 | 21 | ||
21 | #include <asm/cacheflush.h> | 22 | #include <asm/cacheflush.h> |
22 | 23 | ||
diff --git a/drivers/usb/musb/cppi_dma.c b/drivers/usb/musb/cppi_dma.c index 149f3f310a0a..318fb4e8a885 100644 --- a/drivers/usb/musb/cppi_dma.c +++ b/drivers/usb/musb/cppi_dma.c | |||
@@ -226,8 +226,10 @@ static int cppi_controller_stop(struct dma_controller *c) | |||
226 | struct cppi *controller; | 226 | struct cppi *controller; |
227 | void __iomem *tibase; | 227 | void __iomem *tibase; |
228 | int i; | 228 | int i; |
229 | struct musb *musb; | ||
229 | 230 | ||
230 | controller = container_of(c, struct cppi, controller); | 231 | controller = container_of(c, struct cppi, controller); |
232 | musb = controller->musb; | ||
231 | 233 | ||
232 | tibase = controller->tibase; | 234 | tibase = controller->tibase; |
233 | /* DISABLE INDIVIDUAL CHANNEL Interrupts */ | 235 | /* DISABLE INDIVIDUAL CHANNEL Interrupts */ |
@@ -289,9 +291,11 @@ cppi_channel_allocate(struct dma_controller *c, | |||
289 | u8 index; | 291 | u8 index; |
290 | struct cppi_channel *cppi_ch; | 292 | struct cppi_channel *cppi_ch; |
291 | void __iomem *tibase; | 293 | void __iomem *tibase; |
294 | struct musb *musb; | ||
292 | 295 | ||
293 | controller = container_of(c, struct cppi, controller); | 296 | controller = container_of(c, struct cppi, controller); |
294 | tibase = controller->tibase; | 297 | tibase = controller->tibase; |
298 | musb = controller->musb; | ||
295 | 299 | ||
296 | /* ep0 doesn't use DMA; remember cppi indices are 0..N-1 */ | 300 | /* ep0 doesn't use DMA; remember cppi indices are 0..N-1 */ |
297 | index = ep->epnum - 1; | 301 | index = ep->epnum - 1; |
@@ -339,7 +343,8 @@ static void cppi_channel_release(struct dma_channel *channel) | |||
339 | c = container_of(channel, struct cppi_channel, channel); | 343 | c = container_of(channel, struct cppi_channel, channel); |
340 | tibase = c->controller->tibase; | 344 | tibase = c->controller->tibase; |
341 | if (!c->hw_ep) | 345 | if (!c->hw_ep) |
342 | dev_dbg(musb->controller, "releasing idle DMA channel %p\n", c); | 346 | dev_dbg(c->controller->musb->controller, |
347 | "releasing idle DMA channel %p\n", c); | ||
343 | else if (!c->transmit) | 348 | else if (!c->transmit) |
344 | core_rxirq_enable(tibase, c->index + 1); | 349 | core_rxirq_enable(tibase, c->index + 1); |
345 | 350 | ||
@@ -357,10 +362,11 @@ cppi_dump_rx(int level, struct cppi_channel *c, const char *tag) | |||
357 | 362 | ||
358 | musb_ep_select(base, c->index + 1); | 363 | musb_ep_select(base, c->index + 1); |
359 | 364 | ||
360 | DBG(level, "RX DMA%d%s: %d left, csr %04x, " | 365 | dev_dbg(c->controller->musb->controller, |
361 | "%08x H%08x S%08x C%08x, " | 366 | "RX DMA%d%s: %d left, csr %04x, " |
362 | "B%08x L%08x %08x .. %08x" | 367 | "%08x H%08x S%08x C%08x, " |
363 | "\n", | 368 | "B%08x L%08x %08x .. %08x" |
369 | "\n", | ||
364 | c->index, tag, | 370 | c->index, tag, |
365 | musb_readl(c->controller->tibase, | 371 | musb_readl(c->controller->tibase, |
366 | DAVINCI_RXCPPI_BUFCNT0_REG + 4 * c->index), | 372 | DAVINCI_RXCPPI_BUFCNT0_REG + 4 * c->index), |
@@ -387,10 +393,11 @@ cppi_dump_tx(int level, struct cppi_channel *c, const char *tag) | |||
387 | 393 | ||
388 | musb_ep_select(base, c->index + 1); | 394 | musb_ep_select(base, c->index + 1); |
389 | 395 | ||
390 | DBG(level, "TX DMA%d%s: csr %04x, " | 396 | dev_dbg(c->controller->musb->controller, |
391 | "H%08x S%08x C%08x %08x, " | 397 | "TX DMA%d%s: csr %04x, " |
392 | "F%08x L%08x .. %08x" | 398 | "H%08x S%08x C%08x %08x, " |
393 | "\n", | 399 | "F%08x L%08x .. %08x" |
400 | "\n", | ||
394 | c->index, tag, | 401 | c->index, tag, |
395 | musb_readw(c->hw_ep->regs, MUSB_TXCSR), | 402 | musb_readw(c->hw_ep->regs, MUSB_TXCSR), |
396 | 403 | ||
@@ -1022,6 +1029,7 @@ static bool cppi_rx_scan(struct cppi *cppi, unsigned ch) | |||
1022 | int i; | 1029 | int i; |
1023 | dma_addr_t safe2ack; | 1030 | dma_addr_t safe2ack; |
1024 | void __iomem *regs = rx->hw_ep->regs; | 1031 | void __iomem *regs = rx->hw_ep->regs; |
1032 | struct musb *musb = cppi->musb; | ||
1025 | 1033 | ||
1026 | cppi_dump_rx(6, rx, "/K"); | 1034 | cppi_dump_rx(6, rx, "/K"); |
1027 | 1035 | ||
diff --git a/drivers/usb/musb/musb_core.h b/drivers/usb/musb/musb_core.h index 668eeef601ae..b3c065ab9dbc 100644 --- a/drivers/usb/musb/musb_core.h +++ b/drivers/usb/musb/musb_core.h | |||
@@ -172,7 +172,8 @@ enum musb_g_ep0_state { | |||
172 | #endif | 172 | #endif |
173 | 173 | ||
174 | /* TUSB mapping: "flat" plus ep0 special cases */ | 174 | /* TUSB mapping: "flat" plus ep0 special cases */ |
175 | #if defined(CONFIG_USB_MUSB_TUSB6010) | 175 | #if defined(CONFIG_USB_MUSB_TUSB6010) || \ |
176 | defined(CONFIG_USB_MUSB_TUSB6010_MODULE) | ||
176 | #define musb_ep_select(_mbase, _epnum) \ | 177 | #define musb_ep_select(_mbase, _epnum) \ |
177 | musb_writeb((_mbase), MUSB_INDEX, (_epnum)) | 178 | musb_writeb((_mbase), MUSB_INDEX, (_epnum)) |
178 | #define MUSB_EP_OFFSET MUSB_TUSB_OFFSET | 179 | #define MUSB_EP_OFFSET MUSB_TUSB_OFFSET |
@@ -241,7 +242,8 @@ struct musb_hw_ep { | |||
241 | void __iomem *fifo; | 242 | void __iomem *fifo; |
242 | void __iomem *regs; | 243 | void __iomem *regs; |
243 | 244 | ||
244 | #ifdef CONFIG_USB_MUSB_TUSB6010 | 245 | #if defined(CONFIG_USB_MUSB_TUSB6010) || \ |
246 | defined(CONFIG_USB_MUSB_TUSB6010_MODULE) | ||
245 | void __iomem *conf; | 247 | void __iomem *conf; |
246 | #endif | 248 | #endif |
247 | 249 | ||
@@ -258,7 +260,8 @@ struct musb_hw_ep { | |||
258 | struct dma_channel *tx_channel; | 260 | struct dma_channel *tx_channel; |
259 | struct dma_channel *rx_channel; | 261 | struct dma_channel *rx_channel; |
260 | 262 | ||
261 | #ifdef CONFIG_USB_MUSB_TUSB6010 | 263 | #if defined(CONFIG_USB_MUSB_TUSB6010) || \ |
264 | defined(CONFIG_USB_MUSB_TUSB6010_MODULE) | ||
262 | /* TUSB has "asynchronous" and "synchronous" dma modes */ | 265 | /* TUSB has "asynchronous" and "synchronous" dma modes */ |
263 | dma_addr_t fifo_async; | 266 | dma_addr_t fifo_async; |
264 | dma_addr_t fifo_sync; | 267 | dma_addr_t fifo_sync; |
@@ -356,7 +359,8 @@ struct musb { | |||
356 | void __iomem *ctrl_base; | 359 | void __iomem *ctrl_base; |
357 | void __iomem *mregs; | 360 | void __iomem *mregs; |
358 | 361 | ||
359 | #ifdef CONFIG_USB_MUSB_TUSB6010 | 362 | #if defined(CONFIG_USB_MUSB_TUSB6010) || \ |
363 | defined(CONFIG_USB_MUSB_TUSB6010_MODULE) | ||
360 | dma_addr_t async; | 364 | dma_addr_t async; |
361 | dma_addr_t sync; | 365 | dma_addr_t sync; |
362 | void __iomem *sync_va; | 366 | void __iomem *sync_va; |
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c index 95a67fea393b..fe8d14cac436 100644 --- a/drivers/usb/musb/musb_gadget.c +++ b/drivers/usb/musb/musb_gadget.c | |||
@@ -1698,6 +1698,8 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on) | |||
1698 | 1698 | ||
1699 | is_on = !!is_on; | 1699 | is_on = !!is_on; |
1700 | 1700 | ||
1701 | pm_runtime_get_sync(musb->controller); | ||
1702 | |||
1701 | /* NOTE: this assumes we are sensing vbus; we'd rather | 1703 | /* NOTE: this assumes we are sensing vbus; we'd rather |
1702 | * not pullup unless the B-session is active. | 1704 | * not pullup unless the B-session is active. |
1703 | */ | 1705 | */ |
@@ -1707,6 +1709,9 @@ static int musb_gadget_pullup(struct usb_gadget *gadget, int is_on) | |||
1707 | musb_pullup(musb, is_on); | 1709 | musb_pullup(musb, is_on); |
1708 | } | 1710 | } |
1709 | spin_unlock_irqrestore(&musb->lock, flags); | 1711 | spin_unlock_irqrestore(&musb->lock, flags); |
1712 | |||
1713 | pm_runtime_put(musb->controller); | ||
1714 | |||
1710 | return 0; | 1715 | return 0; |
1711 | } | 1716 | } |
1712 | 1717 | ||
@@ -1851,6 +1856,7 @@ int __init musb_gadget_setup(struct musb *musb) | |||
1851 | 1856 | ||
1852 | return 0; | 1857 | return 0; |
1853 | err: | 1858 | err: |
1859 | musb->g.dev.parent = NULL; | ||
1854 | device_unregister(&musb->g.dev); | 1860 | device_unregister(&musb->g.dev); |
1855 | return status; | 1861 | return status; |
1856 | } | 1862 | } |
@@ -1858,7 +1864,8 @@ err: | |||
1858 | void musb_gadget_cleanup(struct musb *musb) | 1864 | void musb_gadget_cleanup(struct musb *musb) |
1859 | { | 1865 | { |
1860 | usb_del_gadget_udc(&musb->g); | 1866 | usb_del_gadget_udc(&musb->g); |
1861 | device_unregister(&musb->g.dev); | 1867 | if (musb->g.dev.parent) |
1868 | device_unregister(&musb->g.dev); | ||
1862 | } | 1869 | } |
1863 | 1870 | ||
1864 | /* | 1871 | /* |
diff --git a/drivers/usb/musb/musb_regs.h b/drivers/usb/musb/musb_regs.h index 82410703dcd3..03f2655af290 100644 --- a/drivers/usb/musb/musb_regs.h +++ b/drivers/usb/musb/musb_regs.h | |||
@@ -234,7 +234,8 @@ | |||
234 | #define MUSB_TESTMODE 0x0F /* 8 bit */ | 234 | #define MUSB_TESTMODE 0x0F /* 8 bit */ |
235 | 235 | ||
236 | /* Get offset for a given FIFO from musb->mregs */ | 236 | /* Get offset for a given FIFO from musb->mregs */ |
237 | #ifdef CONFIG_USB_MUSB_TUSB6010 | 237 | #if defined(CONFIG_USB_MUSB_TUSB6010) || \ |
238 | defined(CONFIG_USB_MUSB_TUSB6010_MODULE) | ||
238 | #define MUSB_FIFO_OFFSET(epnum) (0x200 + ((epnum) * 0x20)) | 239 | #define MUSB_FIFO_OFFSET(epnum) (0x200 + ((epnum) * 0x20)) |
239 | #else | 240 | #else |
240 | #define MUSB_FIFO_OFFSET(epnum) (0x20 + ((epnum) * 4)) | 241 | #define MUSB_FIFO_OFFSET(epnum) (0x20 + ((epnum) * 4)) |
@@ -295,7 +296,8 @@ | |||
295 | #define MUSB_FLAT_OFFSET(_epnum, _offset) \ | 296 | #define MUSB_FLAT_OFFSET(_epnum, _offset) \ |
296 | (0x100 + (0x10*(_epnum)) + (_offset)) | 297 | (0x100 + (0x10*(_epnum)) + (_offset)) |
297 | 298 | ||
298 | #ifdef CONFIG_USB_MUSB_TUSB6010 | 299 | #if defined(CONFIG_USB_MUSB_TUSB6010) || \ |
300 | defined(CONFIG_USB_MUSB_TUSB6010_MODULE) | ||
299 | /* TUSB6010 EP0 configuration register is special */ | 301 | /* TUSB6010 EP0 configuration register is special */ |
300 | #define MUSB_TUSB_OFFSET(_epnum, _offset) \ | 302 | #define MUSB_TUSB_OFFSET(_epnum, _offset) \ |
301 | (0x10 + _offset) | 303 | (0x10 + _offset) |
diff --git a/drivers/usb/musb/tusb6010.c b/drivers/usb/musb/tusb6010.c index 9eec41fbf3a4..ec1480191f78 100644 --- a/drivers/usb/musb/tusb6010.c +++ b/drivers/usb/musb/tusb6010.c | |||
@@ -18,6 +18,7 @@ | |||
18 | #include <linux/kernel.h> | 18 | #include <linux/kernel.h> |
19 | #include <linux/errno.h> | 19 | #include <linux/errno.h> |
20 | #include <linux/init.h> | 20 | #include <linux/init.h> |
21 | #include <linux/prefetch.h> | ||
21 | #include <linux/usb.h> | 22 | #include <linux/usb.h> |
22 | #include <linux/irq.h> | 23 | #include <linux/irq.h> |
23 | #include <linux/platform_device.h> | 24 | #include <linux/platform_device.h> |
diff --git a/drivers/usb/musb/tusb6010_omap.c b/drivers/usb/musb/tusb6010_omap.c index c784e6c03aac..b67b4bc596c1 100644 --- a/drivers/usb/musb/tusb6010_omap.c +++ b/drivers/usb/musb/tusb6010_omap.c | |||
@@ -20,6 +20,7 @@ | |||
20 | #include <plat/mux.h> | 20 | #include <plat/mux.h> |
21 | 21 | ||
22 | #include "musb_core.h" | 22 | #include "musb_core.h" |
23 | #include "tusb6010.h" | ||
23 | 24 | ||
24 | #define to_chdat(c) ((struct tusb_omap_dma_ch *)(c)->private_data) | 25 | #define to_chdat(c) ((struct tusb_omap_dma_ch *)(c)->private_data) |
25 | 26 | ||
@@ -89,7 +90,7 @@ static inline int tusb_omap_use_shared_dmareq(struct tusb_omap_dma_ch *chdat) | |||
89 | u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP); | 90 | u32 reg = musb_readl(chdat->tbase, TUSB_DMA_EP_MAP); |
90 | 91 | ||
91 | if (reg != 0) { | 92 | if (reg != 0) { |
92 | dev_dbg(musb->controller, "ep%i dmareq0 is busy for ep%i\n", | 93 | dev_dbg(chdat->musb->controller, "ep%i dmareq0 is busy for ep%i\n", |
93 | chdat->epnum, reg & 0xf); | 94 | chdat->epnum, reg & 0xf); |
94 | return -EAGAIN; | 95 | return -EAGAIN; |
95 | } | 96 | } |
diff --git a/drivers/usb/musb/ux500_dma.c b/drivers/usb/musb/ux500_dma.c index cecace411832..ef4333f4bbe0 100644 --- a/drivers/usb/musb/ux500_dma.c +++ b/drivers/usb/musb/ux500_dma.c | |||
@@ -65,7 +65,8 @@ static void ux500_tx_work(struct work_struct *data) | |||
65 | struct musb *musb = hw_ep->musb; | 65 | struct musb *musb = hw_ep->musb; |
66 | unsigned long flags; | 66 | unsigned long flags; |
67 | 67 | ||
68 | DBG(4, "DMA tx transfer done on hw_ep=%d\n", hw_ep->epnum); | 68 | dev_dbg(musb->controller, "DMA tx transfer done on hw_ep=%d\n", |
69 | hw_ep->epnum); | ||
69 | 70 | ||
70 | spin_lock_irqsave(&musb->lock, flags); | 71 | spin_lock_irqsave(&musb->lock, flags); |
71 | ux500_channel->channel.actual_len = ux500_channel->cur_len; | 72 | ux500_channel->channel.actual_len = ux500_channel->cur_len; |
@@ -84,7 +85,8 @@ static void ux500_rx_work(struct work_struct *data) | |||
84 | struct musb *musb = hw_ep->musb; | 85 | struct musb *musb = hw_ep->musb; |
85 | unsigned long flags; | 86 | unsigned long flags; |
86 | 87 | ||
87 | DBG(4, "DMA rx transfer done on hw_ep=%d\n", hw_ep->epnum); | 88 | dev_dbg(musb->controller, "DMA rx transfer done on hw_ep=%d\n", |
89 | hw_ep->epnum); | ||
88 | 90 | ||
89 | spin_lock_irqsave(&musb->lock, flags); | 91 | spin_lock_irqsave(&musb->lock, flags); |
90 | ux500_channel->channel.actual_len = ux500_channel->cur_len; | 92 | ux500_channel->channel.actual_len = ux500_channel->cur_len; |
@@ -116,9 +118,11 @@ static bool ux500_configure_channel(struct dma_channel *channel, | |||
116 | enum dma_slave_buswidth addr_width; | 118 | enum dma_slave_buswidth addr_width; |
117 | dma_addr_t usb_fifo_addr = (MUSB_FIFO_OFFSET(hw_ep->epnum) + | 119 | dma_addr_t usb_fifo_addr = (MUSB_FIFO_OFFSET(hw_ep->epnum) + |
118 | ux500_channel->controller->phy_base); | 120 | ux500_channel->controller->phy_base); |
121 | struct musb *musb = ux500_channel->controller->private_data; | ||
119 | 122 | ||
120 | DBG(4, "packet_sz=%d, mode=%d, dma_addr=0x%x, len=%d is_tx=%d\n", | 123 | dev_dbg(musb->controller, |
121 | packet_sz, mode, dma_addr, len, ux500_channel->is_tx); | 124 | "packet_sz=%d, mode=%d, dma_addr=0x%x, len=%d is_tx=%d\n", |
125 | packet_sz, mode, dma_addr, len, ux500_channel->is_tx); | ||
122 | 126 | ||
123 | ux500_channel->cur_len = len; | 127 | ux500_channel->cur_len = len; |
124 | 128 | ||
@@ -133,15 +137,13 @@ static bool ux500_configure_channel(struct dma_channel *channel, | |||
133 | DMA_SLAVE_BUSWIDTH_4_BYTES; | 137 | DMA_SLAVE_BUSWIDTH_4_BYTES; |
134 | 138 | ||
135 | slave_conf.direction = direction; | 139 | slave_conf.direction = direction; |
136 | if (direction == DMA_FROM_DEVICE) { | 140 | slave_conf.src_addr = usb_fifo_addr; |
137 | slave_conf.src_addr = usb_fifo_addr; | 141 | slave_conf.src_addr_width = addr_width; |
138 | slave_conf.src_addr_width = addr_width; | 142 | slave_conf.src_maxburst = 16; |
139 | slave_conf.src_maxburst = 16; | 143 | slave_conf.dst_addr = usb_fifo_addr; |
140 | } else { | 144 | slave_conf.dst_addr_width = addr_width; |
141 | slave_conf.dst_addr = usb_fifo_addr; | 145 | slave_conf.dst_maxburst = 16; |
142 | slave_conf.dst_addr_width = addr_width; | 146 | |
143 | slave_conf.dst_maxburst = 16; | ||
144 | } | ||
145 | dma_chan->device->device_control(dma_chan, DMA_SLAVE_CONFIG, | 147 | dma_chan->device->device_control(dma_chan, DMA_SLAVE_CONFIG, |
146 | (unsigned long) &slave_conf); | 148 | (unsigned long) &slave_conf); |
147 | 149 | ||
@@ -166,6 +168,7 @@ static struct dma_channel *ux500_dma_channel_allocate(struct dma_controller *c, | |||
166 | struct ux500_dma_controller *controller = container_of(c, | 168 | struct ux500_dma_controller *controller = container_of(c, |
167 | struct ux500_dma_controller, controller); | 169 | struct ux500_dma_controller, controller); |
168 | struct ux500_dma_channel *ux500_channel = NULL; | 170 | struct ux500_dma_channel *ux500_channel = NULL; |
171 | struct musb *musb = controller->private_data; | ||
169 | u8 ch_num = hw_ep->epnum - 1; | 172 | u8 ch_num = hw_ep->epnum - 1; |
170 | u32 max_ch; | 173 | u32 max_ch; |
171 | 174 | ||
@@ -192,7 +195,7 @@ static struct dma_channel *ux500_dma_channel_allocate(struct dma_controller *c, | |||
192 | ux500_channel->hw_ep = hw_ep; | 195 | ux500_channel->hw_ep = hw_ep; |
193 | ux500_channel->is_allocated = 1; | 196 | ux500_channel->is_allocated = 1; |
194 | 197 | ||
195 | DBG(7, "hw_ep=%d, is_tx=0x%x, channel=%d\n", | 198 | dev_dbg(musb->controller, "hw_ep=%d, is_tx=0x%x, channel=%d\n", |
196 | hw_ep->epnum, is_tx, ch_num); | 199 | hw_ep->epnum, is_tx, ch_num); |
197 | 200 | ||
198 | return &(ux500_channel->channel); | 201 | return &(ux500_channel->channel); |
@@ -201,8 +204,9 @@ static struct dma_channel *ux500_dma_channel_allocate(struct dma_controller *c, | |||
201 | static void ux500_dma_channel_release(struct dma_channel *channel) | 204 | static void ux500_dma_channel_release(struct dma_channel *channel) |
202 | { | 205 | { |
203 | struct ux500_dma_channel *ux500_channel = channel->private_data; | 206 | struct ux500_dma_channel *ux500_channel = channel->private_data; |
207 | struct musb *musb = ux500_channel->controller->private_data; | ||
204 | 208 | ||
205 | DBG(7, "channel=%d\n", ux500_channel->ch_num); | 209 | dev_dbg(musb->controller, "channel=%d\n", ux500_channel->ch_num); |
206 | 210 | ||
207 | if (ux500_channel->is_allocated) { | 211 | if (ux500_channel->is_allocated) { |
208 | ux500_channel->is_allocated = 0; | 212 | ux500_channel->is_allocated = 0; |
@@ -252,8 +256,8 @@ static int ux500_dma_channel_abort(struct dma_channel *channel) | |||
252 | void __iomem *epio = musb->endpoints[ux500_channel->hw_ep->epnum].regs; | 256 | void __iomem *epio = musb->endpoints[ux500_channel->hw_ep->epnum].regs; |
253 | u16 csr; | 257 | u16 csr; |
254 | 258 | ||
255 | DBG(4, "channel=%d, is_tx=%d\n", ux500_channel->ch_num, | 259 | dev_dbg(musb->controller, "channel=%d, is_tx=%d\n", |
256 | ux500_channel->is_tx); | 260 | ux500_channel->ch_num, ux500_channel->is_tx); |
257 | 261 | ||
258 | if (channel->status == MUSB_DMA_STATUS_BUSY) { | 262 | if (channel->status == MUSB_DMA_STATUS_BUSY) { |
259 | if (ux500_channel->is_tx) { | 263 | if (ux500_channel->is_tx) { |
diff --git a/drivers/usb/renesas_usbhs/fifo.c b/drivers/usb/renesas_usbhs/fifo.c index 406893e4422b..a34430f55fb7 100644 --- a/drivers/usb/renesas_usbhs/fifo.c +++ b/drivers/usb/renesas_usbhs/fifo.c | |||
@@ -16,6 +16,7 @@ | |||
16 | */ | 16 | */ |
17 | #include <linux/delay.h> | 17 | #include <linux/delay.h> |
18 | #include <linux/io.h> | 18 | #include <linux/io.h> |
19 | #include <linux/scatterlist.h> | ||
19 | #include "./common.h" | 20 | #include "./common.h" |
20 | #include "./pipe.h" | 21 | #include "./pipe.h" |
21 | 22 | ||
diff --git a/drivers/usb/renesas_usbhs/mod_gadget.c b/drivers/usb/renesas_usbhs/mod_gadget.c index ba79dbf5adbc..cb2d451d511e 100644 --- a/drivers/usb/renesas_usbhs/mod_gadget.c +++ b/drivers/usb/renesas_usbhs/mod_gadget.c | |||
@@ -14,6 +14,7 @@ | |||
14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 14 | * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
15 | * | 15 | * |
16 | */ | 16 | */ |
17 | #include <linux/dma-mapping.h> | ||
17 | #include <linux/io.h> | 18 | #include <linux/io.h> |
18 | #include <linux/module.h> | 19 | #include <linux/module.h> |
19 | #include <linux/platform_device.h> | 20 | #include <linux/platform_device.h> |
@@ -76,7 +77,7 @@ struct usbhsg_recip_handle { | |||
76 | struct usbhsg_gpriv, mod) | 77 | struct usbhsg_gpriv, mod) |
77 | 78 | ||
78 | #define __usbhsg_for_each_uep(start, pos, g, i) \ | 79 | #define __usbhsg_for_each_uep(start, pos, g, i) \ |
79 | for (i = start, pos = (g)->uep; \ | 80 | for (i = start, pos = (g)->uep + i; \ |
80 | i < (g)->uep_size; \ | 81 | i < (g)->uep_size; \ |
81 | i++, pos = (g)->uep + i) | 82 | i++, pos = (g)->uep + i) |
82 | 83 | ||
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 2e06b90aa1f8..5fc13e717911 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -101,6 +101,7 @@ static int ftdi_jtag_probe(struct usb_serial *serial); | |||
101 | static int ftdi_mtxorb_hack_setup(struct usb_serial *serial); | 101 | static int ftdi_mtxorb_hack_setup(struct usb_serial *serial); |
102 | static int ftdi_NDI_device_setup(struct usb_serial *serial); | 102 | static int ftdi_NDI_device_setup(struct usb_serial *serial); |
103 | static int ftdi_stmclite_probe(struct usb_serial *serial); | 103 | static int ftdi_stmclite_probe(struct usb_serial *serial); |
104 | static int ftdi_8u2232c_probe(struct usb_serial *serial); | ||
104 | static void ftdi_USB_UIRT_setup(struct ftdi_private *priv); | 105 | static void ftdi_USB_UIRT_setup(struct ftdi_private *priv); |
105 | static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv); | 106 | static void ftdi_HE_TIRA1_setup(struct ftdi_private *priv); |
106 | 107 | ||
@@ -128,6 +129,10 @@ static struct ftdi_sio_quirk ftdi_stmclite_quirk = { | |||
128 | .probe = ftdi_stmclite_probe, | 129 | .probe = ftdi_stmclite_probe, |
129 | }; | 130 | }; |
130 | 131 | ||
132 | static struct ftdi_sio_quirk ftdi_8u2232c_quirk = { | ||
133 | .probe = ftdi_8u2232c_probe, | ||
134 | }; | ||
135 | |||
131 | /* | 136 | /* |
132 | * The 8U232AM has the same API as the sio except for: | 137 | * The 8U232AM has the same API as the sio except for: |
133 | * - it can support MUCH higher baudrates; up to: | 138 | * - it can support MUCH higher baudrates; up to: |
@@ -151,6 +156,7 @@ static struct ftdi_sio_quirk ftdi_stmclite_quirk = { | |||
151 | * /sys/bus/usb/ftdi_sio/new_id, then send patch/report! | 156 | * /sys/bus/usb/ftdi_sio/new_id, then send patch/report! |
152 | */ | 157 | */ |
153 | static struct usb_device_id id_table_combined [] = { | 158 | static struct usb_device_id id_table_combined [] = { |
159 | { USB_DEVICE(FTDI_VID, FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID) }, | ||
154 | { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, | 160 | { USB_DEVICE(FTDI_VID, FTDI_CTI_MINI_PID) }, |
155 | { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, | 161 | { USB_DEVICE(FTDI_VID, FTDI_CTI_NANO_PID) }, |
156 | { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, | 162 | { USB_DEVICE(FTDI_VID, FTDI_AMC232_PID) }, |
@@ -177,7 +183,8 @@ static struct usb_device_id id_table_combined [] = { | |||
177 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, | 183 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_PID) }, |
178 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, | 184 | { USB_DEVICE(FTDI_VID, FTDI_8U232AM_ALT_PID) }, |
179 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, | 185 | { USB_DEVICE(FTDI_VID, FTDI_232RL_PID) }, |
180 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) }, | 186 | { USB_DEVICE(FTDI_VID, FTDI_8U2232C_PID) , |
187 | .driver_info = (kernel_ulong_t)&ftdi_8u2232c_quirk }, | ||
181 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, | 188 | { USB_DEVICE(FTDI_VID, FTDI_4232H_PID) }, |
182 | { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, | 189 | { USB_DEVICE(FTDI_VID, FTDI_232H_PID) }, |
183 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, | 190 | { USB_DEVICE(FTDI_VID, FTDI_MICRO_CHAMELEON_PID) }, |
@@ -1171,7 +1178,7 @@ static __u32 get_ftdi_divisor(struct tty_struct *tty, | |||
1171 | case FT2232H: /* FT2232H chip */ | 1178 | case FT2232H: /* FT2232H chip */ |
1172 | case FT4232H: /* FT4232H chip */ | 1179 | case FT4232H: /* FT4232H chip */ |
1173 | case FT232H: /* FT232H chip */ | 1180 | case FT232H: /* FT232H chip */ |
1174 | if ((baud <= 12000000) & (baud >= 1200)) { | 1181 | if ((baud <= 12000000) && (baud >= 1200)) { |
1175 | div_value = ftdi_2232h_baud_to_divisor(baud); | 1182 | div_value = ftdi_2232h_baud_to_divisor(baud); |
1176 | } else if (baud < 1200) { | 1183 | } else if (baud < 1200) { |
1177 | div_value = ftdi_232bm_baud_to_divisor(baud); | 1184 | div_value = ftdi_232bm_baud_to_divisor(baud); |
@@ -1205,7 +1212,10 @@ static int change_speed(struct tty_struct *tty, struct usb_serial_port *port) | |||
1205 | urb_index_value = get_ftdi_divisor(tty, port); | 1212 | urb_index_value = get_ftdi_divisor(tty, port); |
1206 | urb_value = (__u16)urb_index_value; | 1213 | urb_value = (__u16)urb_index_value; |
1207 | urb_index = (__u16)(urb_index_value >> 16); | 1214 | urb_index = (__u16)(urb_index_value >> 16); |
1208 | if (priv->interface) { /* FT2232C */ | 1215 | if ((priv->chip_type == FT2232C) || (priv->chip_type == FT2232H) || |
1216 | (priv->chip_type == FT4232H) || (priv->chip_type == FT232H)) { | ||
1217 | /* Probably the BM type needs the MSB of the encoded fractional | ||
1218 | * divider also moved like for the chips above. Any infos? */ | ||
1209 | urb_index = (__u16)((urb_index << 8) | priv->interface); | 1219 | urb_index = (__u16)((urb_index << 8) | priv->interface); |
1210 | } | 1220 | } |
1211 | 1221 | ||
@@ -1733,6 +1743,18 @@ static int ftdi_jtag_probe(struct usb_serial *serial) | |||
1733 | return 0; | 1743 | return 0; |
1734 | } | 1744 | } |
1735 | 1745 | ||
1746 | static int ftdi_8u2232c_probe(struct usb_serial *serial) | ||
1747 | { | ||
1748 | struct usb_device *udev = serial->dev; | ||
1749 | |||
1750 | dbg("%s", __func__); | ||
1751 | |||
1752 | if (strcmp(udev->manufacturer, "CALAO Systems") == 0) | ||
1753 | return ftdi_jtag_probe(serial); | ||
1754 | |||
1755 | return 0; | ||
1756 | } | ||
1757 | |||
1736 | /* | 1758 | /* |
1737 | * First and second port on STMCLiteadaptors is reserved for JTAG interface | 1759 | * First and second port on STMCLiteadaptors is reserved for JTAG interface |
1738 | * and the forth port for pio | 1760 | * and the forth port for pio |
diff --git a/drivers/usb/serial/ftdi_sio_ids.h b/drivers/usb/serial/ftdi_sio_ids.h index 19156d1049fe..bf5227ad3ef7 100644 --- a/drivers/usb/serial/ftdi_sio_ids.h +++ b/drivers/usb/serial/ftdi_sio_ids.h | |||
@@ -1159,4 +1159,8 @@ | |||
1159 | /* USB-Nano-485*/ | 1159 | /* USB-Nano-485*/ |
1160 | #define FTDI_CTI_NANO_PID 0xF60B | 1160 | #define FTDI_CTI_NANO_PID 0xF60B |
1161 | 1161 | ||
1162 | 1162 | /* | |
1163 | * ZeitControl cardsystems GmbH rfid-readers http://zeitconrol.de | ||
1164 | */ | ||
1165 | /* TagTracer MIFARE*/ | ||
1166 | #define FTDI_ZEITCONTROL_TAGTRACE_MIFARE_PID 0xF7C0 | ||
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index b0a7a9e909a4..1a49ca9c8ea5 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -34,7 +34,7 @@ | |||
34 | #include <linux/module.h> | 34 | #include <linux/module.h> |
35 | #include <linux/spinlock.h> | 35 | #include <linux/spinlock.h> |
36 | #include <linux/uaccess.h> | 36 | #include <linux/uaccess.h> |
37 | #include <asm/atomic.h> | 37 | #include <linux/atomic.h> |
38 | #include <linux/usb.h> | 38 | #include <linux/usb.h> |
39 | #include <linux/usb/serial.h> | 39 | #include <linux/usb/serial.h> |
40 | 40 | ||
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 60b25d8ea0e2..fe22e90bc879 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c | |||
@@ -148,6 +148,12 @@ static void option_instat_callback(struct urb *urb); | |||
148 | #define HUAWEI_PRODUCT_K4505 0x1464 | 148 | #define HUAWEI_PRODUCT_K4505 0x1464 |
149 | #define HUAWEI_PRODUCT_K3765 0x1465 | 149 | #define HUAWEI_PRODUCT_K3765 0x1465 |
150 | #define HUAWEI_PRODUCT_E14AC 0x14AC | 150 | #define HUAWEI_PRODUCT_E14AC 0x14AC |
151 | #define HUAWEI_PRODUCT_K3806 0x14AE | ||
152 | #define HUAWEI_PRODUCT_K4605 0x14C6 | ||
153 | #define HUAWEI_PRODUCT_K3770 0x14C9 | ||
154 | #define HUAWEI_PRODUCT_K3771 0x14CA | ||
155 | #define HUAWEI_PRODUCT_K4510 0x14CB | ||
156 | #define HUAWEI_PRODUCT_K4511 0x14CC | ||
151 | #define HUAWEI_PRODUCT_ETS1220 0x1803 | 157 | #define HUAWEI_PRODUCT_ETS1220 0x1803 |
152 | #define HUAWEI_PRODUCT_E353 0x1506 | 158 | #define HUAWEI_PRODUCT_E353 0x1506 |
153 | 159 | ||
@@ -412,6 +418,56 @@ static void option_instat_callback(struct urb *urb); | |||
412 | #define SAMSUNG_VENDOR_ID 0x04e8 | 418 | #define SAMSUNG_VENDOR_ID 0x04e8 |
413 | #define SAMSUNG_PRODUCT_GT_B3730 0x6889 | 419 | #define SAMSUNG_PRODUCT_GT_B3730 0x6889 |
414 | 420 | ||
421 | /* YUGA products www.yuga-info.com*/ | ||
422 | #define YUGA_VENDOR_ID 0x257A | ||
423 | #define YUGA_PRODUCT_CEM600 0x1601 | ||
424 | #define YUGA_PRODUCT_CEM610 0x1602 | ||
425 | #define YUGA_PRODUCT_CEM500 0x1603 | ||
426 | #define YUGA_PRODUCT_CEM510 0x1604 | ||
427 | #define YUGA_PRODUCT_CEM800 0x1605 | ||
428 | #define YUGA_PRODUCT_CEM900 0x1606 | ||
429 | |||
430 | #define YUGA_PRODUCT_CEU818 0x1607 | ||
431 | #define YUGA_PRODUCT_CEU816 0x1608 | ||
432 | #define YUGA_PRODUCT_CEU828 0x1609 | ||
433 | #define YUGA_PRODUCT_CEU826 0x160A | ||
434 | #define YUGA_PRODUCT_CEU518 0x160B | ||
435 | #define YUGA_PRODUCT_CEU516 0x160C | ||
436 | #define YUGA_PRODUCT_CEU528 0x160D | ||
437 | #define YUGA_PRODUCT_CEU526 0x160F | ||
438 | |||
439 | #define YUGA_PRODUCT_CWM600 0x2601 | ||
440 | #define YUGA_PRODUCT_CWM610 0x2602 | ||
441 | #define YUGA_PRODUCT_CWM500 0x2603 | ||
442 | #define YUGA_PRODUCT_CWM510 0x2604 | ||
443 | #define YUGA_PRODUCT_CWM800 0x2605 | ||
444 | #define YUGA_PRODUCT_CWM900 0x2606 | ||
445 | |||
446 | #define YUGA_PRODUCT_CWU718 0x2607 | ||
447 | #define YUGA_PRODUCT_CWU716 0x2608 | ||
448 | #define YUGA_PRODUCT_CWU728 0x2609 | ||
449 | #define YUGA_PRODUCT_CWU726 0x260A | ||
450 | #define YUGA_PRODUCT_CWU518 0x260B | ||
451 | #define YUGA_PRODUCT_CWU516 0x260C | ||
452 | #define YUGA_PRODUCT_CWU528 0x260D | ||
453 | #define YUGA_PRODUCT_CWU526 0x260F | ||
454 | |||
455 | #define YUGA_PRODUCT_CLM600 0x2601 | ||
456 | #define YUGA_PRODUCT_CLM610 0x2602 | ||
457 | #define YUGA_PRODUCT_CLM500 0x2603 | ||
458 | #define YUGA_PRODUCT_CLM510 0x2604 | ||
459 | #define YUGA_PRODUCT_CLM800 0x2605 | ||
460 | #define YUGA_PRODUCT_CLM900 0x2606 | ||
461 | |||
462 | #define YUGA_PRODUCT_CLU718 0x2607 | ||
463 | #define YUGA_PRODUCT_CLU716 0x2608 | ||
464 | #define YUGA_PRODUCT_CLU728 0x2609 | ||
465 | #define YUGA_PRODUCT_CLU726 0x260A | ||
466 | #define YUGA_PRODUCT_CLU518 0x260B | ||
467 | #define YUGA_PRODUCT_CLU516 0x260C | ||
468 | #define YUGA_PRODUCT_CLU528 0x260D | ||
469 | #define YUGA_PRODUCT_CLU526 0x260F | ||
470 | |||
415 | /* some devices interfaces need special handling due to a number of reasons */ | 471 | /* some devices interfaces need special handling due to a number of reasons */ |
416 | enum option_blacklist_reason { | 472 | enum option_blacklist_reason { |
417 | OPTION_BLACKLIST_NONE = 0, | 473 | OPTION_BLACKLIST_NONE = 0, |
@@ -547,6 +603,16 @@ static const struct usb_device_id option_ids[] = { | |||
547 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff) }, | 603 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3765, 0xff, 0xff, 0xff) }, |
548 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ETS1220, 0xff, 0xff, 0xff) }, | 604 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_ETS1220, 0xff, 0xff, 0xff) }, |
549 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC, 0xff, 0xff, 0xff) }, | 605 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E14AC, 0xff, 0xff, 0xff) }, |
606 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3806, 0xff, 0xff, 0xff) }, | ||
607 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff) }, | ||
608 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x31) }, | ||
609 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x32) }, | ||
610 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x31) }, | ||
611 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x32) }, | ||
612 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4510, 0xff, 0x01, 0x31) }, | ||
613 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4510, 0xff, 0x01, 0x32) }, | ||
614 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x31) }, | ||
615 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4511, 0xff, 0x01, 0x32) }, | ||
550 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) }, | 616 | { USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E353, 0xff, 0x01, 0x01) }, |
551 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, | 617 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V640) }, |
552 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, | 618 | { USB_DEVICE(NOVATELWIRELESS_VENDOR_ID, NOVATELWIRELESS_PRODUCT_V620) }, |
@@ -993,6 +1059,48 @@ static const struct usb_device_id option_ids[] = { | |||
993 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ | 1059 | { USB_DEVICE(CELOT_VENDOR_ID, CELOT_PRODUCT_CT680M) }, /* CT-650 CDMA 450 1xEVDO modem */ |
994 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ | 1060 | { USB_DEVICE(ONDA_VENDOR_ID, ONDA_MT825UP) }, /* ONDA MT825UP modem */ |
995 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ | 1061 | { USB_DEVICE_AND_INTERFACE_INFO(SAMSUNG_VENDOR_ID, SAMSUNG_PRODUCT_GT_B3730, USB_CLASS_CDC_DATA, 0x00, 0x00) }, /* Samsung GT-B3730 LTE USB modem.*/ |
1062 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM600) }, | ||
1063 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM610) }, | ||
1064 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM500) }, | ||
1065 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM510) }, | ||
1066 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM800) }, | ||
1067 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEM900) }, | ||
1068 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU818) }, | ||
1069 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU816) }, | ||
1070 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU828) }, | ||
1071 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU826) }, | ||
1072 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU518) }, | ||
1073 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU516) }, | ||
1074 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU528) }, | ||
1075 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU526) }, | ||
1076 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWM600) }, | ||
1077 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWM610) }, | ||
1078 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWM500) }, | ||
1079 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWM510) }, | ||
1080 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWM800) }, | ||
1081 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWM900) }, | ||
1082 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU718) }, | ||
1083 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU716) }, | ||
1084 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU728) }, | ||
1085 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU726) }, | ||
1086 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU518) }, | ||
1087 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU516) }, | ||
1088 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU528) }, | ||
1089 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU526) }, | ||
1090 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLM600) }, | ||
1091 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLM610) }, | ||
1092 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLM500) }, | ||
1093 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLM510) }, | ||
1094 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLM800) }, | ||
1095 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLM900) }, | ||
1096 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU718) }, | ||
1097 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU716) }, | ||
1098 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU728) }, | ||
1099 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU726) }, | ||
1100 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU518) }, | ||
1101 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU516) }, | ||
1102 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU528) }, | ||
1103 | { USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) }, | ||
996 | { } /* Terminating entry */ | 1104 | { } /* Terminating entry */ |
997 | }; | 1105 | }; |
998 | MODULE_DEVICE_TABLE(usb, option_ids); | 1106 | MODULE_DEVICE_TABLE(usb, option_ids); |
@@ -1122,11 +1230,13 @@ static int option_probe(struct usb_serial *serial, | |||
1122 | serial->interface->cur_altsetting->desc.bInterfaceClass != 0xff) | 1230 | serial->interface->cur_altsetting->desc.bInterfaceClass != 0xff) |
1123 | return -ENODEV; | 1231 | return -ENODEV; |
1124 | 1232 | ||
1125 | /* Don't bind network interfaces on Huawei K3765 & K4505 */ | 1233 | /* Don't bind network interfaces on Huawei K3765, K4505 & K4605 */ |
1126 | if (serial->dev->descriptor.idVendor == HUAWEI_VENDOR_ID && | 1234 | if (serial->dev->descriptor.idVendor == HUAWEI_VENDOR_ID && |
1127 | (serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K3765 || | 1235 | (serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K3765 || |
1128 | serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K4505) && | 1236 | serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K4505 || |
1129 | serial->interface->cur_altsetting->desc.bInterfaceNumber == 1) | 1237 | serial->dev->descriptor.idProduct == HUAWEI_PRODUCT_K4605) && |
1238 | (serial->interface->cur_altsetting->desc.bInterfaceNumber == 1 || | ||
1239 | serial->interface->cur_altsetting->desc.bInterfaceNumber == 2)) | ||
1130 | return -ENODEV; | 1240 | return -ENODEV; |
1131 | 1241 | ||
1132 | /* Don't bind network interface on Samsung GT-B3730, it is handled by a separate module */ | 1242 | /* Don't bind network interface on Samsung GT-B3730, it is handled by a separate module */ |
diff --git a/drivers/usb/serial/qcserial.c b/drivers/usb/serial/qcserial.c index 54a9dab1f33b..aeccc7f0a93c 100644 --- a/drivers/usb/serial/qcserial.c +++ b/drivers/usb/serial/qcserial.c | |||
@@ -45,6 +45,7 @@ static const struct usb_device_id id_table[] = { | |||
45 | {USB_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ | 45 | {USB_DEVICE(0x05c6, 0x9203)}, /* Generic Gobi Modem device */ |
46 | {USB_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ | 46 | {USB_DEVICE(0x05c6, 0x9222)}, /* Generic Gobi Modem device */ |
47 | {USB_DEVICE(0x05c6, 0x9008)}, /* Generic Gobi QDL device */ | 47 | {USB_DEVICE(0x05c6, 0x9008)}, /* Generic Gobi QDL device */ |
48 | {USB_DEVICE(0x05c6, 0x9009)}, /* Generic Gobi Modem device */ | ||
48 | {USB_DEVICE(0x05c6, 0x9201)}, /* Generic Gobi QDL device */ | 49 | {USB_DEVICE(0x05c6, 0x9201)}, /* Generic Gobi QDL device */ |
49 | {USB_DEVICE(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ | 50 | {USB_DEVICE(0x05c6, 0x9221)}, /* Generic Gobi QDL device */ |
50 | {USB_DEVICE(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ | 51 | {USB_DEVICE(0x05c6, 0x9231)}, /* Generic Gobi QDL device */ |
@@ -78,6 +79,7 @@ static const struct usb_device_id id_table[] = { | |||
78 | {USB_DEVICE(0x1199, 0x9008)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | 79 | {USB_DEVICE(0x1199, 0x9008)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
79 | {USB_DEVICE(0x1199, 0x9009)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | 80 | {USB_DEVICE(0x1199, 0x9009)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
80 | {USB_DEVICE(0x1199, 0x900a)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ | 81 | {USB_DEVICE(0x1199, 0x900a)}, /* Sierra Wireless Gobi 2000 Modem device (VT773) */ |
82 | {USB_DEVICE(0x1199, 0x9011)}, /* Sierra Wireless Gobi 2000 Modem device (MC8305) */ | ||
81 | {USB_DEVICE(0x16d8, 0x8001)}, /* CMDTech Gobi 2000 QDL device (VU922) */ | 83 | {USB_DEVICE(0x16d8, 0x8001)}, /* CMDTech Gobi 2000 QDL device (VU922) */ |
82 | {USB_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ | 84 | {USB_DEVICE(0x16d8, 0x8002)}, /* CMDTech Gobi 2000 Modem device (VU922) */ |
83 | {USB_DEVICE(0x05c6, 0x9204)}, /* Gobi 2000 QDL device */ | 85 | {USB_DEVICE(0x05c6, 0x9204)}, /* Gobi 2000 QDL device */ |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index ccff3483eebc..3041a974faf3 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -1988,6 +1988,16 @@ UNUSUAL_DEV( 0x4146, 0xba01, 0x0100, 0x0100, | |||
1988 | "Micro Mini 1GB", | 1988 | "Micro Mini 1GB", |
1989 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ), | 1989 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, US_FL_NOT_LOCKABLE ), |
1990 | 1990 | ||
1991 | /* | ||
1992 | * Nick Bowler <nbowler@elliptictech.com> | ||
1993 | * SCSI stack spams (otherwise harmless) error messages. | ||
1994 | */ | ||
1995 | UNUSUAL_DEV( 0xc251, 0x4003, 0x0100, 0x0100, | ||
1996 | "Keil Software, Inc.", | ||
1997 | "V2M MotherBoard", | ||
1998 | USB_SC_DEVICE, USB_PR_DEVICE, NULL, | ||
1999 | US_FL_NOT_LOCKABLE), | ||
2000 | |||
1991 | /* Reported by Andrew Simmons <andrew.simmons@gmail.com> */ | 2001 | /* Reported by Andrew Simmons <andrew.simmons@gmail.com> */ |
1992 | UNUSUAL_DEV( 0xed06, 0x4500, 0x0001, 0x0001, | 2002 | UNUSUAL_DEV( 0xed06, 0x4500, 0x0001, 0x0001, |
1993 | "DataStor", | 2003 | "DataStor", |
diff --git a/drivers/usb/wusbcore/wa-rpipe.c b/drivers/usb/wusbcore/wa-rpipe.c index ca80171f42c6..2acc7f504c51 100644 --- a/drivers/usb/wusbcore/wa-rpipe.c +++ b/drivers/usb/wusbcore/wa-rpipe.c | |||
@@ -58,7 +58,7 @@ | |||
58 | * destination address. | 58 | * destination address. |
59 | */ | 59 | */ |
60 | #include <linux/init.h> | 60 | #include <linux/init.h> |
61 | #include <asm/atomic.h> | 61 | #include <linux/atomic.h> |
62 | #include <linux/bitmap.h> | 62 | #include <linux/bitmap.h> |
63 | #include <linux/slab.h> | 63 | #include <linux/slab.h> |
64 | 64 | ||