diff options
author | David Howells <dhowells@redhat.com> | 2006-12-05 09:37:56 -0500 |
---|---|---|
committer | David Howells <dhowells@warthog.cambridge.redhat.com> | 2006-12-05 09:37:56 -0500 |
commit | 4c1ac1b49122b805adfa4efc620592f68dccf5db (patch) | |
tree | 87557f4bc2fd4fe65b7570489c2f610c45c0adcd /drivers/usb | |
parent | c4028958b6ecad064b1a6303a6a5906d4fe48d73 (diff) | |
parent | d916faace3efc0bf19fe9a615a1ab8fa1a24cd93 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6
Conflicts:
drivers/infiniband/core/iwcm.c
drivers/net/chelsio/cxgb2.c
drivers/net/wireless/bcm43xx/bcm43xx_main.c
drivers/net/wireless/prism54/islpci_eth.c
drivers/usb/core/hub.h
drivers/usb/input/hid-core.c
net/core/netpoll.c
Fix up merge failures with Linus's head and fix new compilation failures.
Signed-Off-By: David Howells <dhowells@redhat.com>
Diffstat (limited to 'drivers/usb')
83 files changed, 1078 insertions, 794 deletions
diff --git a/drivers/usb/atm/speedtch.c b/drivers/usb/atm/speedtch.c index 7ed34bb1c50f..8ed6c75adf0f 100644 --- a/drivers/usb/atm/speedtch.c +++ b/drivers/usb/atm/speedtch.c | |||
@@ -837,8 +837,8 @@ static int speedtch_bind(struct usbatm_data *usbatm, | |||
837 | const struct usb_endpoint_descriptor *endpoint_desc = &desc->endpoint[i].desc; | 837 | const struct usb_endpoint_descriptor *endpoint_desc = &desc->endpoint[i].desc; |
838 | 838 | ||
839 | if ((endpoint_desc->bEndpointAddress == target_address)) { | 839 | if ((endpoint_desc->bEndpointAddress == target_address)) { |
840 | use_isoc = (endpoint_desc->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | 840 | use_isoc = |
841 | USB_ENDPOINT_XFER_ISOC; | 841 | usb_endpoint_xfer_isoc(endpoint_desc); |
842 | break; | 842 | break; |
843 | } | 843 | } |
844 | } | 844 | } |
diff --git a/drivers/usb/atm/ueagle-atm.c b/drivers/usb/atm/ueagle-atm.c index e39bb09f5af9..f2d196fa1e8b 100644 --- a/drivers/usb/atm/ueagle-atm.c +++ b/drivers/usb/atm/ueagle-atm.c | |||
@@ -401,9 +401,8 @@ static int uea_send_modem_cmd(struct usb_device *usb, | |||
401 | int ret = -ENOMEM; | 401 | int ret = -ENOMEM; |
402 | u8 *xfer_buff; | 402 | u8 *xfer_buff; |
403 | 403 | ||
404 | xfer_buff = kmalloc(size, GFP_KERNEL); | 404 | xfer_buff = kmemdup(buff, size, GFP_KERNEL); |
405 | if (xfer_buff) { | 405 | if (xfer_buff) { |
406 | memcpy(xfer_buff, buff, size); | ||
407 | ret = usb_control_msg(usb, | 406 | ret = usb_control_msg(usb, |
408 | usb_sndctrlpipe(usb, 0), | 407 | usb_sndctrlpipe(usb, 0), |
409 | LOAD_INTERNAL, | 408 | LOAD_INTERNAL, |
@@ -595,14 +594,12 @@ static int uea_idma_write(struct uea_softc *sc, void *data, u32 size) | |||
595 | u8 *xfer_buff; | 594 | u8 *xfer_buff; |
596 | int bytes_read; | 595 | int bytes_read; |
597 | 596 | ||
598 | xfer_buff = kmalloc(size, GFP_KERNEL); | 597 | xfer_buff = kmemdup(data, size, GFP_KERNEL); |
599 | if (!xfer_buff) { | 598 | if (!xfer_buff) { |
600 | uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n"); | 599 | uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n"); |
601 | return ret; | 600 | return ret; |
602 | } | 601 | } |
603 | 602 | ||
604 | memcpy(xfer_buff, data, size); | ||
605 | |||
606 | ret = usb_bulk_msg(sc->usb_dev, | 603 | ret = usb_bulk_msg(sc->usb_dev, |
607 | usb_sndbulkpipe(sc->usb_dev, UEA_IDMA_PIPE), | 604 | usb_sndbulkpipe(sc->usb_dev, UEA_IDMA_PIPE), |
608 | xfer_buff, size, &bytes_read, BULK_TIMEOUT); | 605 | xfer_buff, size, &bytes_read, BULK_TIMEOUT); |
@@ -765,12 +762,11 @@ static int uea_request(struct uea_softc *sc, | |||
765 | u8 *xfer_buff; | 762 | u8 *xfer_buff; |
766 | int ret = -ENOMEM; | 763 | int ret = -ENOMEM; |
767 | 764 | ||
768 | xfer_buff = kmalloc(size, GFP_KERNEL); | 765 | xfer_buff = kmemdup(data, size, GFP_KERNEL); |
769 | if (!xfer_buff) { | 766 | if (!xfer_buff) { |
770 | uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n"); | 767 | uea_err(INS_TO_USBDEV(sc), "can't allocate xfer_buff\n"); |
771 | return ret; | 768 | return ret; |
772 | } | 769 | } |
773 | memcpy(xfer_buff, data, size); | ||
774 | 770 | ||
775 | ret = usb_control_msg(sc->usb_dev, usb_sndctrlpipe(sc->usb_dev, 0), | 771 | ret = usb_control_msg(sc->usb_dev, usb_sndctrlpipe(sc->usb_dev, 0), |
776 | UCDC_SEND_ENCAPSULATED_COMMAND, | 772 | UCDC_SEND_ENCAPSULATED_COMMAND, |
diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c index 6408e10fdbf8..7f1fa956dcdb 100644 --- a/drivers/usb/class/cdc-acm.c +++ b/drivers/usb/class/cdc-acm.c | |||
@@ -892,7 +892,7 @@ skip_normal_probe: | |||
892 | 892 | ||
893 | 893 | ||
894 | /* workaround for switched endpoints */ | 894 | /* workaround for switched endpoints */ |
895 | if ((epread->bEndpointAddress & USB_DIR_IN) != USB_DIR_IN) { | 895 | if (!usb_endpoint_dir_in(epread)) { |
896 | /* descriptors are swapped */ | 896 | /* descriptors are swapped */ |
897 | struct usb_endpoint_descriptor *t; | 897 | struct usb_endpoint_descriptor *t; |
898 | dev_dbg(&intf->dev,"The data interface has switched endpoints"); | 898 | dev_dbg(&intf->dev,"The data interface has switched endpoints"); |
diff --git a/drivers/usb/core/Kconfig b/drivers/usb/core/Kconfig index 6e3b5358a760..f8324d8d06ac 100644 --- a/drivers/usb/core/Kconfig +++ b/drivers/usb/core/Kconfig | |||
@@ -72,6 +72,21 @@ config USB_SUSPEND | |||
72 | 72 | ||
73 | If you are unsure about this, say N here. | 73 | If you are unsure about this, say N here. |
74 | 74 | ||
75 | config USB_MULTITHREAD_PROBE | ||
76 | bool "USB Multi-threaded probe (EXPERIMENTAL)" | ||
77 | depends on USB && EXPERIMENTAL | ||
78 | default n | ||
79 | help | ||
80 | Say Y here if you want the USB core to spawn a new thread for | ||
81 | every USB device that is probed. This can cause a small speedup | ||
82 | in boot times on systems with a lot of different USB devices. | ||
83 | |||
84 | This option should be safe to enable, but if any odd probing | ||
85 | problems are found, please disable it, or dynamically turn it | ||
86 | off in the /sys/module/usbcore/parameters/multithread_probe | ||
87 | file | ||
88 | |||
89 | When in doubt, say N. | ||
75 | 90 | ||
76 | config USB_OTG | 91 | config USB_OTG |
77 | bool | 92 | bool |
diff --git a/drivers/usb/core/devices.c b/drivers/usb/core/devices.c index 3538c2fdadfe..ea398e5d50af 100644 --- a/drivers/usb/core/devices.c +++ b/drivers/usb/core/devices.c | |||
@@ -175,12 +175,13 @@ static char *usb_dump_endpoint_descriptor ( | |||
175 | ) | 175 | ) |
176 | { | 176 | { |
177 | char dir, unit, *type; | 177 | char dir, unit, *type; |
178 | unsigned interval, in, bandwidth = 1; | 178 | unsigned interval, bandwidth = 1; |
179 | 179 | ||
180 | if (start > end) | 180 | if (start > end) |
181 | return start; | 181 | return start; |
182 | in = (desc->bEndpointAddress & USB_DIR_IN); | 182 | |
183 | dir = in ? 'I' : 'O'; | 183 | dir = usb_endpoint_dir_in(desc) ? 'I' : 'O'; |
184 | |||
184 | if (speed == USB_SPEED_HIGH) { | 185 | if (speed == USB_SPEED_HIGH) { |
185 | switch (le16_to_cpu(desc->wMaxPacketSize) & (0x03 << 11)) { | 186 | switch (le16_to_cpu(desc->wMaxPacketSize) & (0x03 << 11)) { |
186 | case 1 << 11: bandwidth = 2; break; | 187 | case 1 << 11: bandwidth = 2; break; |
@@ -204,7 +205,7 @@ static char *usb_dump_endpoint_descriptor ( | |||
204 | break; | 205 | break; |
205 | case USB_ENDPOINT_XFER_BULK: | 206 | case USB_ENDPOINT_XFER_BULK: |
206 | type = "Bulk"; | 207 | type = "Bulk"; |
207 | if (speed == USB_SPEED_HIGH && !in) /* uframes per NAK */ | 208 | if (speed == USB_SPEED_HIGH && dir == 'O') /* uframes per NAK */ |
208 | interval = desc->bInterval; | 209 | interval = desc->bInterval; |
209 | else | 210 | else |
210 | interval = 0; | 211 | interval = 0; |
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c index fed92be63b5e..3ed4cb2d56d9 100644 --- a/drivers/usb/core/devio.c +++ b/drivers/usb/core/devio.c | |||
@@ -561,7 +561,7 @@ static int usbdev_open(struct inode *inode, struct file *file) | |||
561 | dev = inode->i_private; | 561 | dev = inode->i_private; |
562 | if (!dev) | 562 | if (!dev) |
563 | goto out; | 563 | goto out; |
564 | ret = usb_autoresume_device(dev, 1); | 564 | ret = usb_autoresume_device(dev); |
565 | if (ret) | 565 | if (ret) |
566 | goto out; | 566 | goto out; |
567 | 567 | ||
@@ -609,7 +609,7 @@ static int usbdev_release(struct inode *inode, struct file *file) | |||
609 | releaseintf(ps, ifnum); | 609 | releaseintf(ps, ifnum); |
610 | } | 610 | } |
611 | destroy_all_async(ps); | 611 | destroy_all_async(ps); |
612 | usb_autosuspend_device(dev, 1); | 612 | usb_autosuspend_device(dev); |
613 | usb_unlock_device(dev); | 613 | usb_unlock_device(dev); |
614 | usb_put_dev(dev); | 614 | usb_put_dev(dev); |
615 | put_pid(ps->disc_pid); | 615 | put_pid(ps->disc_pid); |
diff --git a/drivers/usb/core/driver.c b/drivers/usb/core/driver.c index 113e484c763e..d6eb5ce1dd1d 100644 --- a/drivers/usb/core/driver.c +++ b/drivers/usb/core/driver.c | |||
@@ -205,7 +205,7 @@ static int usb_probe_interface(struct device *dev) | |||
205 | if (id) { | 205 | if (id) { |
206 | dev_dbg(dev, "%s - got id\n", __FUNCTION__); | 206 | dev_dbg(dev, "%s - got id\n", __FUNCTION__); |
207 | 207 | ||
208 | error = usb_autoresume_device(udev, 1); | 208 | error = usb_autoresume_device(udev); |
209 | if (error) | 209 | if (error) |
210 | return error; | 210 | return error; |
211 | 211 | ||
@@ -229,7 +229,7 @@ static int usb_probe_interface(struct device *dev) | |||
229 | } else | 229 | } else |
230 | intf->condition = USB_INTERFACE_BOUND; | 230 | intf->condition = USB_INTERFACE_BOUND; |
231 | 231 | ||
232 | usb_autosuspend_device(udev, 1); | 232 | usb_autosuspend_device(udev); |
233 | } | 233 | } |
234 | 234 | ||
235 | return error; | 235 | return error; |
@@ -247,7 +247,7 @@ static int usb_unbind_interface(struct device *dev) | |||
247 | 247 | ||
248 | /* Autoresume for set_interface call below */ | 248 | /* Autoresume for set_interface call below */ |
249 | udev = interface_to_usbdev(intf); | 249 | udev = interface_to_usbdev(intf); |
250 | error = usb_autoresume_device(udev, 1); | 250 | error = usb_autoresume_device(udev); |
251 | 251 | ||
252 | /* release all urbs for this interface */ | 252 | /* release all urbs for this interface */ |
253 | usb_disable_interface(interface_to_usbdev(intf), intf); | 253 | usb_disable_interface(interface_to_usbdev(intf), intf); |
@@ -265,7 +265,7 @@ static int usb_unbind_interface(struct device *dev) | |||
265 | intf->needs_remote_wakeup = 0; | 265 | intf->needs_remote_wakeup = 0; |
266 | 266 | ||
267 | if (!error) | 267 | if (!error) |
268 | usb_autosuspend_device(udev, 1); | 268 | usb_autosuspend_device(udev); |
269 | 269 | ||
270 | return 0; | 270 | return 0; |
271 | } | 271 | } |
@@ -408,6 +408,16 @@ static int usb_match_one_id(struct usb_interface *interface, | |||
408 | (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) | 408 | (id->bDeviceProtocol != dev->descriptor.bDeviceProtocol)) |
409 | return 0; | 409 | return 0; |
410 | 410 | ||
411 | /* The interface class, subclass, and protocol should never be | ||
412 | * checked for a match if the device class is Vendor Specific, | ||
413 | * unless the match record specifies the Vendor ID. */ | ||
414 | if (dev->descriptor.bDeviceClass == USB_CLASS_VENDOR_SPEC && | ||
415 | !(id->match_flags & USB_DEVICE_ID_MATCH_VENDOR) && | ||
416 | (id->match_flags & (USB_DEVICE_ID_MATCH_INT_CLASS | | ||
417 | USB_DEVICE_ID_MATCH_INT_SUBCLASS | | ||
418 | USB_DEVICE_ID_MATCH_INT_PROTOCOL))) | ||
419 | return 0; | ||
420 | |||
411 | if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && | 421 | if ((id->match_flags & USB_DEVICE_ID_MATCH_INT_CLASS) && |
412 | (id->bInterfaceClass != intf->desc.bInterfaceClass)) | 422 | (id->bInterfaceClass != intf->desc.bInterfaceClass)) |
413 | return 0; | 423 | return 0; |
@@ -476,7 +486,17 @@ static int usb_match_one_id(struct usb_interface *interface, | |||
476 | * most general; they let drivers bind to any interface on a | 486 | * most general; they let drivers bind to any interface on a |
477 | * multiple-function device. Use the USB_INTERFACE_INFO | 487 | * multiple-function device. Use the USB_INTERFACE_INFO |
478 | * macro, or its siblings, to match class-per-interface style | 488 | * macro, or its siblings, to match class-per-interface style |
479 | * devices (as recorded in bDeviceClass). | 489 | * devices (as recorded in bInterfaceClass). |
490 | * | ||
491 | * Note that an entry created by USB_INTERFACE_INFO won't match | ||
492 | * any interface if the device class is set to Vendor-Specific. | ||
493 | * This is deliberate; according to the USB spec the meanings of | ||
494 | * the interface class/subclass/protocol for these devices are also | ||
495 | * vendor-specific, and hence matching against a standard product | ||
496 | * class wouldn't work anyway. If you really want to use an | ||
497 | * interface-based match for such a device, create a match record | ||
498 | * that also specifies the vendor ID. (Unforunately there isn't a | ||
499 | * standard macro for creating records like this.) | ||
480 | * | 500 | * |
481 | * Within those groups, remember that not all combinations are | 501 | * Within those groups, remember that not all combinations are |
482 | * meaningful. For example, don't give a product version range | 502 | * meaningful. For example, don't give a product version range |
@@ -505,7 +525,7 @@ const struct usb_device_id *usb_match_id(struct usb_interface *interface, | |||
505 | } | 525 | } |
506 | EXPORT_SYMBOL_GPL_FUTURE(usb_match_id); | 526 | EXPORT_SYMBOL_GPL_FUTURE(usb_match_id); |
507 | 527 | ||
508 | int usb_device_match(struct device *dev, struct device_driver *drv) | 528 | static int usb_device_match(struct device *dev, struct device_driver *drv) |
509 | { | 529 | { |
510 | /* devices and interfaces are handled separately */ | 530 | /* devices and interfaces are handled separately */ |
511 | if (is_usb_device(dev)) { | 531 | if (is_usb_device(dev)) { |
@@ -790,7 +810,7 @@ EXPORT_SYMBOL_GPL_FUTURE(usb_deregister); | |||
790 | #ifdef CONFIG_PM | 810 | #ifdef CONFIG_PM |
791 | 811 | ||
792 | /* Caller has locked udev's pm_mutex */ | 812 | /* Caller has locked udev's pm_mutex */ |
793 | static int suspend_device(struct usb_device *udev, pm_message_t msg) | 813 | static int usb_suspend_device(struct usb_device *udev, pm_message_t msg) |
794 | { | 814 | { |
795 | struct usb_device_driver *udriver; | 815 | struct usb_device_driver *udriver; |
796 | int status = 0; | 816 | int status = 0; |
@@ -817,7 +837,7 @@ done: | |||
817 | } | 837 | } |
818 | 838 | ||
819 | /* Caller has locked udev's pm_mutex */ | 839 | /* Caller has locked udev's pm_mutex */ |
820 | static int resume_device(struct usb_device *udev) | 840 | static int usb_resume_device(struct usb_device *udev) |
821 | { | 841 | { |
822 | struct usb_device_driver *udriver; | 842 | struct usb_device_driver *udriver; |
823 | int status = 0; | 843 | int status = 0; |
@@ -843,7 +863,7 @@ done: | |||
843 | } | 863 | } |
844 | 864 | ||
845 | /* Caller has locked intf's usb_device's pm mutex */ | 865 | /* Caller has locked intf's usb_device's pm mutex */ |
846 | static int suspend_interface(struct usb_interface *intf, pm_message_t msg) | 866 | static int usb_suspend_interface(struct usb_interface *intf, pm_message_t msg) |
847 | { | 867 | { |
848 | struct usb_driver *driver; | 868 | struct usb_driver *driver; |
849 | int status = 0; | 869 | int status = 0; |
@@ -880,7 +900,7 @@ done: | |||
880 | } | 900 | } |
881 | 901 | ||
882 | /* Caller has locked intf's usb_device's pm_mutex */ | 902 | /* Caller has locked intf's usb_device's pm_mutex */ |
883 | static int resume_interface(struct usb_interface *intf) | 903 | static int usb_resume_interface(struct usb_interface *intf) |
884 | { | 904 | { |
885 | struct usb_driver *driver; | 905 | struct usb_driver *driver; |
886 | int status = 0; | 906 | int status = 0; |
@@ -920,6 +940,44 @@ done: | |||
920 | return status; | 940 | return status; |
921 | } | 941 | } |
922 | 942 | ||
943 | #ifdef CONFIG_USB_SUSPEND | ||
944 | |||
945 | /* Internal routine to check whether we may autosuspend a device. */ | ||
946 | static int autosuspend_check(struct usb_device *udev) | ||
947 | { | ||
948 | int i; | ||
949 | struct usb_interface *intf; | ||
950 | |||
951 | /* For autosuspend, fail fast if anything is in use. | ||
952 | * Also fail if any interfaces require remote wakeup but it | ||
953 | * isn't available. */ | ||
954 | udev->do_remote_wakeup = device_may_wakeup(&udev->dev); | ||
955 | if (udev->pm_usage_cnt > 0) | ||
956 | return -EBUSY; | ||
957 | if (udev->actconfig) { | ||
958 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
959 | intf = udev->actconfig->interface[i]; | ||
960 | if (!is_active(intf)) | ||
961 | continue; | ||
962 | if (intf->pm_usage_cnt > 0) | ||
963 | return -EBUSY; | ||
964 | if (intf->needs_remote_wakeup && | ||
965 | !udev->do_remote_wakeup) { | ||
966 | dev_dbg(&udev->dev, "remote wakeup needed " | ||
967 | "for autosuspend\n"); | ||
968 | return -EOPNOTSUPP; | ||
969 | } | ||
970 | } | ||
971 | } | ||
972 | return 0; | ||
973 | } | ||
974 | |||
975 | #else | ||
976 | |||
977 | #define autosuspend_check(udev) 0 | ||
978 | |||
979 | #endif | ||
980 | |||
923 | /** | 981 | /** |
924 | * usb_suspend_both - suspend a USB device and its interfaces | 982 | * usb_suspend_both - suspend a USB device and its interfaces |
925 | * @udev: the usb_device to suspend | 983 | * @udev: the usb_device to suspend |
@@ -971,52 +1029,34 @@ int usb_suspend_both(struct usb_device *udev, pm_message_t msg) | |||
971 | 1029 | ||
972 | udev->do_remote_wakeup = device_may_wakeup(&udev->dev); | 1030 | udev->do_remote_wakeup = device_may_wakeup(&udev->dev); |
973 | 1031 | ||
974 | /* For autosuspend, fail fast if anything is in use. | ||
975 | * Also fail if any interfaces require remote wakeup but it | ||
976 | * isn't available. */ | ||
977 | if (udev->auto_pm) { | 1032 | if (udev->auto_pm) { |
978 | if (udev->pm_usage_cnt > 0) | 1033 | status = autosuspend_check(udev); |
979 | return -EBUSY; | 1034 | if (status < 0) |
980 | if (udev->actconfig) { | 1035 | return status; |
981 | for (; i < udev->actconfig->desc.bNumInterfaces; i++) { | ||
982 | intf = udev->actconfig->interface[i]; | ||
983 | if (!is_active(intf)) | ||
984 | continue; | ||
985 | if (intf->pm_usage_cnt > 0) | ||
986 | return -EBUSY; | ||
987 | if (intf->needs_remote_wakeup && | ||
988 | !udev->do_remote_wakeup) { | ||
989 | dev_dbg(&udev->dev, | ||
990 | "remote wakeup needed for autosuspend\n"); | ||
991 | return -EOPNOTSUPP; | ||
992 | } | ||
993 | } | ||
994 | i = 0; | ||
995 | } | ||
996 | } | 1036 | } |
997 | 1037 | ||
998 | /* Suspend all the interfaces and then udev itself */ | 1038 | /* Suspend all the interfaces and then udev itself */ |
999 | if (udev->actconfig) { | 1039 | if (udev->actconfig) { |
1000 | for (; i < udev->actconfig->desc.bNumInterfaces; i++) { | 1040 | for (; i < udev->actconfig->desc.bNumInterfaces; i++) { |
1001 | intf = udev->actconfig->interface[i]; | 1041 | intf = udev->actconfig->interface[i]; |
1002 | status = suspend_interface(intf, msg); | 1042 | status = usb_suspend_interface(intf, msg); |
1003 | if (status != 0) | 1043 | if (status != 0) |
1004 | break; | 1044 | break; |
1005 | } | 1045 | } |
1006 | } | 1046 | } |
1007 | if (status == 0) | 1047 | if (status == 0) |
1008 | status = suspend_device(udev, msg); | 1048 | status = usb_suspend_device(udev, msg); |
1009 | 1049 | ||
1010 | /* If the suspend failed, resume interfaces that did get suspended */ | 1050 | /* If the suspend failed, resume interfaces that did get suspended */ |
1011 | if (status != 0) { | 1051 | if (status != 0) { |
1012 | while (--i >= 0) { | 1052 | while (--i >= 0) { |
1013 | intf = udev->actconfig->interface[i]; | 1053 | intf = udev->actconfig->interface[i]; |
1014 | resume_interface(intf); | 1054 | usb_resume_interface(intf); |
1015 | } | 1055 | } |
1016 | 1056 | ||
1017 | /* If the suspend succeeded, propagate it up the tree */ | 1057 | /* If the suspend succeeded, propagate it up the tree */ |
1018 | } else if (parent) | 1058 | } else if (parent) |
1019 | usb_autosuspend_device(parent, 0); | 1059 | usb_autosuspend_device(parent); |
1020 | 1060 | ||
1021 | // dev_dbg(&udev->dev, "%s: status %d\n", __FUNCTION__, status); | 1061 | // dev_dbg(&udev->dev, "%s: status %d\n", __FUNCTION__, status); |
1022 | return status; | 1062 | return status; |
@@ -1064,9 +1104,25 @@ int usb_resume_both(struct usb_device *udev) | |||
1064 | /* Propagate the resume up the tree, if necessary */ | 1104 | /* Propagate the resume up the tree, if necessary */ |
1065 | if (udev->state == USB_STATE_SUSPENDED) { | 1105 | if (udev->state == USB_STATE_SUSPENDED) { |
1066 | if (parent) { | 1106 | if (parent) { |
1067 | usb_pm_lock(parent); | 1107 | status = usb_autoresume_device(parent); |
1068 | parent->auto_pm = 1; | 1108 | if (status == 0) { |
1069 | status = usb_resume_both(parent); | 1109 | status = usb_resume_device(udev); |
1110 | if (status) { | ||
1111 | usb_autosuspend_device(parent); | ||
1112 | |||
1113 | /* It's possible usb_resume_device() | ||
1114 | * failed after the port was | ||
1115 | * unsuspended, causing udev to be | ||
1116 | * logically disconnected. We don't | ||
1117 | * want usb_disconnect() to autosuspend | ||
1118 | * the parent again, so tell it that | ||
1119 | * udev disconnected while still | ||
1120 | * suspended. */ | ||
1121 | if (udev->state == | ||
1122 | USB_STATE_NOTATTACHED) | ||
1123 | udev->discon_suspended = 1; | ||
1124 | } | ||
1125 | } | ||
1070 | } else { | 1126 | } else { |
1071 | 1127 | ||
1072 | /* We can't progagate beyond the USB subsystem, | 1128 | /* We can't progagate beyond the USB subsystem, |
@@ -1075,24 +1131,20 @@ int usb_resume_both(struct usb_device *udev) | |||
1075 | if (udev->dev.parent->power.power_state.event != | 1131 | if (udev->dev.parent->power.power_state.event != |
1076 | PM_EVENT_ON) | 1132 | PM_EVENT_ON) |
1077 | status = -EHOSTUNREACH; | 1133 | status = -EHOSTUNREACH; |
1078 | } | 1134 | else |
1079 | if (status == 0) | 1135 | status = usb_resume_device(udev); |
1080 | status = resume_device(udev); | 1136 | } |
1081 | if (parent) | ||
1082 | usb_pm_unlock(parent); | ||
1083 | } else { | 1137 | } else { |
1084 | 1138 | ||
1085 | /* Needed only for setting udev->dev.power.power_state.event | 1139 | /* Needed only for setting udev->dev.power.power_state.event |
1086 | * and for possible debugging message. */ | 1140 | * and for possible debugging message. */ |
1087 | status = resume_device(udev); | 1141 | status = usb_resume_device(udev); |
1088 | } | 1142 | } |
1089 | 1143 | ||
1090 | /* Now the parent won't suspend until we are finished */ | ||
1091 | |||
1092 | if (status == 0 && udev->actconfig) { | 1144 | if (status == 0 && udev->actconfig) { |
1093 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { | 1145 | for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) { |
1094 | intf = udev->actconfig->interface[i]; | 1146 | intf = udev->actconfig->interface[i]; |
1095 | resume_interface(intf); | 1147 | usb_resume_interface(intf); |
1096 | } | 1148 | } |
1097 | } | 1149 | } |
1098 | 1150 | ||
@@ -1102,39 +1154,53 @@ int usb_resume_both(struct usb_device *udev) | |||
1102 | 1154 | ||
1103 | #ifdef CONFIG_USB_SUSPEND | 1155 | #ifdef CONFIG_USB_SUSPEND |
1104 | 1156 | ||
1157 | /* Internal routine to adjust a device's usage counter and change | ||
1158 | * its autosuspend state. | ||
1159 | */ | ||
1160 | static int usb_autopm_do_device(struct usb_device *udev, int inc_usage_cnt) | ||
1161 | { | ||
1162 | int status = 0; | ||
1163 | |||
1164 | usb_pm_lock(udev); | ||
1165 | udev->pm_usage_cnt += inc_usage_cnt; | ||
1166 | WARN_ON(udev->pm_usage_cnt < 0); | ||
1167 | if (inc_usage_cnt >= 0 && udev->pm_usage_cnt > 0) { | ||
1168 | udev->auto_pm = 1; | ||
1169 | status = usb_resume_both(udev); | ||
1170 | if (status != 0) | ||
1171 | udev->pm_usage_cnt -= inc_usage_cnt; | ||
1172 | } else if (inc_usage_cnt <= 0 && autosuspend_check(udev) == 0) | ||
1173 | queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, | ||
1174 | USB_AUTOSUSPEND_DELAY); | ||
1175 | usb_pm_unlock(udev); | ||
1176 | return status; | ||
1177 | } | ||
1178 | |||
1105 | /** | 1179 | /** |
1106 | * usb_autosuspend_device - delayed autosuspend of a USB device and its interfaces | 1180 | * usb_autosuspend_device - delayed autosuspend of a USB device and its interfaces |
1107 | * @udev: the usb_device to autosuspend | 1181 | * @udev: the usb_device to autosuspend |
1108 | * @dec_usage_cnt: flag to decrement @udev's PM-usage counter | ||
1109 | * | 1182 | * |
1110 | * This routine should be called when a core subsystem is finished using | 1183 | * This routine should be called when a core subsystem is finished using |
1111 | * @udev and wants to allow it to autosuspend. Examples would be when | 1184 | * @udev and wants to allow it to autosuspend. Examples would be when |
1112 | * @udev's device file in usbfs is closed or after a configuration change. | 1185 | * @udev's device file in usbfs is closed or after a configuration change. |
1113 | * | 1186 | * |
1114 | * @dec_usage_cnt should be 1 if the subsystem previously incremented | 1187 | * @udev's usage counter is decremented. If it or any of the usage counters |
1115 | * @udev's usage counter (such as by passing 1 to usb_autoresume_device); | 1188 | * for an active interface is greater than 0, no autosuspend request will be |
1116 | * otherwise it should be 0. | 1189 | * queued. (If an interface driver does not support autosuspend then its |
1117 | * | 1190 | * usage counter is permanently positive.) Furthermore, if an interface |
1118 | * If the usage counter for @udev or any of its active interfaces is greater | 1191 | * driver requires remote-wakeup capability during autosuspend but remote |
1119 | * than 0, the autosuspend request will not be queued. (If an interface | 1192 | * wakeup is disabled, the autosuspend will fail. |
1120 | * driver does not support autosuspend then its usage counter is permanently | ||
1121 | * positive.) Likewise, if an interface driver requires remote-wakeup | ||
1122 | * capability during autosuspend but remote wakeup is disabled, the | ||
1123 | * autosuspend will fail. | ||
1124 | * | 1193 | * |
1125 | * Often the caller will hold @udev's device lock, but this is not | 1194 | * Often the caller will hold @udev's device lock, but this is not |
1126 | * necessary. | 1195 | * necessary. |
1127 | * | 1196 | * |
1128 | * This routine can run only in process context. | 1197 | * This routine can run only in process context. |
1129 | */ | 1198 | */ |
1130 | void usb_autosuspend_device(struct usb_device *udev, int dec_usage_cnt) | 1199 | void usb_autosuspend_device(struct usb_device *udev) |
1131 | { | 1200 | { |
1132 | usb_pm_lock(udev); | 1201 | int status; |
1133 | udev->pm_usage_cnt -= dec_usage_cnt; | 1202 | |
1134 | if (udev->pm_usage_cnt <= 0) | 1203 | status = usb_autopm_do_device(udev, -1); |
1135 | queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, | ||
1136 | USB_AUTOSUSPEND_DELAY); | ||
1137 | usb_pm_unlock(udev); | ||
1138 | // dev_dbg(&udev->dev, "%s: cnt %d\n", | 1204 | // dev_dbg(&udev->dev, "%s: cnt %d\n", |
1139 | // __FUNCTION__, udev->pm_usage_cnt); | 1205 | // __FUNCTION__, udev->pm_usage_cnt); |
1140 | } | 1206 | } |
@@ -1142,44 +1208,59 @@ void usb_autosuspend_device(struct usb_device *udev, int dec_usage_cnt) | |||
1142 | /** | 1208 | /** |
1143 | * usb_autoresume_device - immediately autoresume a USB device and its interfaces | 1209 | * usb_autoresume_device - immediately autoresume a USB device and its interfaces |
1144 | * @udev: the usb_device to autoresume | 1210 | * @udev: the usb_device to autoresume |
1145 | * @inc_usage_cnt: flag to increment @udev's PM-usage counter | ||
1146 | * | 1211 | * |
1147 | * This routine should be called when a core subsystem wants to use @udev | 1212 | * This routine should be called when a core subsystem wants to use @udev |
1148 | * and needs to guarantee that it is not suspended. In addition, the | 1213 | * and needs to guarantee that it is not suspended. No autosuspend will |
1149 | * caller can prevent @udev from being autosuspended subsequently. (Note | 1214 | * occur until usb_autosuspend_device is called. (Note that this will not |
1150 | * that this will not prevent suspend events originating in the PM core.) | 1215 | * prevent suspend events originating in the PM core.) Examples would be |
1151 | * Examples would be when @udev's device file in usbfs is opened (autosuspend | 1216 | * when @udev's device file in usbfs is opened or when a remote-wakeup |
1152 | * should be prevented until the file is closed) or when a remote-wakeup | 1217 | * request is received. |
1153 | * request is received (later autosuspends should not be prevented). | ||
1154 | * | 1218 | * |
1155 | * @inc_usage_cnt should be 1 to increment @udev's usage counter and prevent | 1219 | * @udev's usage counter is incremented to prevent subsequent autosuspends. |
1156 | * autosuspends. This prevention will persist until the usage counter is | 1220 | * However if the autoresume fails then the usage counter is re-decremented. |
1157 | * decremented again (such as by passing 1 to usb_autosuspend_device). | ||
1158 | * Otherwise @inc_usage_cnt should be 0 to leave the usage counter unchanged. | ||
1159 | * Regardless, if the autoresume fails then the usage counter is not | ||
1160 | * incremented. | ||
1161 | * | 1221 | * |
1162 | * Often the caller will hold @udev's device lock, but this is not | 1222 | * Often the caller will hold @udev's device lock, but this is not |
1163 | * necessary (and attempting it might cause deadlock). | 1223 | * necessary (and attempting it might cause deadlock). |
1164 | * | 1224 | * |
1165 | * This routine can run only in process context. | 1225 | * This routine can run only in process context. |
1166 | */ | 1226 | */ |
1167 | int usb_autoresume_device(struct usb_device *udev, int inc_usage_cnt) | 1227 | int usb_autoresume_device(struct usb_device *udev) |
1168 | { | 1228 | { |
1169 | int status; | 1229 | int status; |
1170 | 1230 | ||
1171 | usb_pm_lock(udev); | 1231 | status = usb_autopm_do_device(udev, 1); |
1172 | udev->pm_usage_cnt += inc_usage_cnt; | ||
1173 | udev->auto_pm = 1; | ||
1174 | status = usb_resume_both(udev); | ||
1175 | if (status != 0) | ||
1176 | udev->pm_usage_cnt -= inc_usage_cnt; | ||
1177 | usb_pm_unlock(udev); | ||
1178 | // dev_dbg(&udev->dev, "%s: status %d cnt %d\n", | 1232 | // dev_dbg(&udev->dev, "%s: status %d cnt %d\n", |
1179 | // __FUNCTION__, status, udev->pm_usage_cnt); | 1233 | // __FUNCTION__, status, udev->pm_usage_cnt); |
1180 | return status; | 1234 | return status; |
1181 | } | 1235 | } |
1182 | 1236 | ||
1237 | /* Internal routine to adjust an interface's usage counter and change | ||
1238 | * its device's autosuspend state. | ||
1239 | */ | ||
1240 | static int usb_autopm_do_interface(struct usb_interface *intf, | ||
1241 | int inc_usage_cnt) | ||
1242 | { | ||
1243 | struct usb_device *udev = interface_to_usbdev(intf); | ||
1244 | int status = 0; | ||
1245 | |||
1246 | usb_pm_lock(udev); | ||
1247 | if (intf->condition == USB_INTERFACE_UNBOUND) | ||
1248 | status = -ENODEV; | ||
1249 | else { | ||
1250 | intf->pm_usage_cnt += inc_usage_cnt; | ||
1251 | if (inc_usage_cnt >= 0 && intf->pm_usage_cnt > 0) { | ||
1252 | udev->auto_pm = 1; | ||
1253 | status = usb_resume_both(udev); | ||
1254 | if (status != 0) | ||
1255 | intf->pm_usage_cnt -= inc_usage_cnt; | ||
1256 | } else if (inc_usage_cnt <= 0 && autosuspend_check(udev) == 0) | ||
1257 | queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, | ||
1258 | USB_AUTOSUSPEND_DELAY); | ||
1259 | } | ||
1260 | usb_pm_unlock(udev); | ||
1261 | return status; | ||
1262 | } | ||
1263 | |||
1183 | /** | 1264 | /** |
1184 | * usb_autopm_put_interface - decrement a USB interface's PM-usage counter | 1265 | * usb_autopm_put_interface - decrement a USB interface's PM-usage counter |
1185 | * @intf: the usb_interface whose counter should be decremented | 1266 | * @intf: the usb_interface whose counter should be decremented |
@@ -1213,17 +1294,11 @@ int usb_autoresume_device(struct usb_device *udev, int inc_usage_cnt) | |||
1213 | */ | 1294 | */ |
1214 | void usb_autopm_put_interface(struct usb_interface *intf) | 1295 | void usb_autopm_put_interface(struct usb_interface *intf) |
1215 | { | 1296 | { |
1216 | struct usb_device *udev = interface_to_usbdev(intf); | 1297 | int status; |
1217 | 1298 | ||
1218 | usb_pm_lock(udev); | 1299 | status = usb_autopm_do_interface(intf, -1); |
1219 | if (intf->condition != USB_INTERFACE_UNBOUND && | 1300 | // dev_dbg(&intf->dev, "%s: status %d cnt %d\n", |
1220 | --intf->pm_usage_cnt <= 0) { | 1301 | // __FUNCTION__, status, intf->pm_usage_cnt); |
1221 | queue_delayed_work(ksuspend_usb_wq, &udev->autosuspend, | ||
1222 | USB_AUTOSUSPEND_DELAY); | ||
1223 | } | ||
1224 | usb_pm_unlock(udev); | ||
1225 | // dev_dbg(&intf->dev, "%s: cnt %d\n", | ||
1226 | // __FUNCTION__, intf->pm_usage_cnt); | ||
1227 | } | 1302 | } |
1228 | EXPORT_SYMBOL_GPL(usb_autopm_put_interface); | 1303 | EXPORT_SYMBOL_GPL(usb_autopm_put_interface); |
1229 | 1304 | ||
@@ -1260,26 +1335,37 @@ EXPORT_SYMBOL_GPL(usb_autopm_put_interface); | |||
1260 | */ | 1335 | */ |
1261 | int usb_autopm_get_interface(struct usb_interface *intf) | 1336 | int usb_autopm_get_interface(struct usb_interface *intf) |
1262 | { | 1337 | { |
1263 | struct usb_device *udev = interface_to_usbdev(intf); | 1338 | int status; |
1264 | int status; | ||
1265 | 1339 | ||
1266 | usb_pm_lock(udev); | 1340 | status = usb_autopm_do_interface(intf, 1); |
1267 | if (intf->condition == USB_INTERFACE_UNBOUND) | ||
1268 | status = -ENODEV; | ||
1269 | else { | ||
1270 | ++intf->pm_usage_cnt; | ||
1271 | udev->auto_pm = 1; | ||
1272 | status = usb_resume_both(udev); | ||
1273 | if (status != 0) | ||
1274 | --intf->pm_usage_cnt; | ||
1275 | } | ||
1276 | usb_pm_unlock(udev); | ||
1277 | // dev_dbg(&intf->dev, "%s: status %d cnt %d\n", | 1341 | // dev_dbg(&intf->dev, "%s: status %d cnt %d\n", |
1278 | // __FUNCTION__, status, intf->pm_usage_cnt); | 1342 | // __FUNCTION__, status, intf->pm_usage_cnt); |
1279 | return status; | 1343 | return status; |
1280 | } | 1344 | } |
1281 | EXPORT_SYMBOL_GPL(usb_autopm_get_interface); | 1345 | EXPORT_SYMBOL_GPL(usb_autopm_get_interface); |
1282 | 1346 | ||
1347 | /** | ||
1348 | * usb_autopm_set_interface - set a USB interface's autosuspend state | ||
1349 | * @intf: the usb_interface whose state should be set | ||
1350 | * | ||
1351 | * This routine sets the autosuspend state of @intf's device according | ||
1352 | * to @intf's usage counter, which the caller must have set previously. | ||
1353 | * If the counter is <= 0, the device is autosuspended (if it isn't | ||
1354 | * already suspended and if nothing else prevents the autosuspend). If | ||
1355 | * the counter is > 0, the device is autoresumed (if it isn't already | ||
1356 | * awake). | ||
1357 | */ | ||
1358 | int usb_autopm_set_interface(struct usb_interface *intf) | ||
1359 | { | ||
1360 | int status; | ||
1361 | |||
1362 | status = usb_autopm_do_interface(intf, 0); | ||
1363 | // dev_dbg(&intf->dev, "%s: status %d cnt %d\n", | ||
1364 | // __FUNCTION__, status, intf->pm_usage_cnt); | ||
1365 | return status; | ||
1366 | } | ||
1367 | EXPORT_SYMBOL_GPL(usb_autopm_set_interface); | ||
1368 | |||
1283 | #endif /* CONFIG_USB_SUSPEND */ | 1369 | #endif /* CONFIG_USB_SUSPEND */ |
1284 | 1370 | ||
1285 | static int usb_suspend(struct device *dev, pm_message_t message) | 1371 | static int usb_suspend(struct device *dev, pm_message_t message) |
diff --git a/drivers/usb/core/endpoint.c b/drivers/usb/core/endpoint.c index 3b2d137912be..c505b767cee1 100644 --- a/drivers/usb/core/endpoint.c +++ b/drivers/usb/core/endpoint.c | |||
@@ -10,15 +10,20 @@ | |||
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/kernel.h> | 12 | #include <linux/kernel.h> |
13 | #include <linux/spinlock.h> | ||
14 | #include <linux/idr.h> | ||
13 | #include <linux/usb.h> | 15 | #include <linux/usb.h> |
14 | #include "usb.h" | 16 | #include "usb.h" |
15 | 17 | ||
16 | /* endpoint stuff */ | 18 | #define MAX_ENDPOINT_MINORS (64*128*32) |
19 | static int usb_endpoint_major; | ||
20 | static DEFINE_IDR(endpoint_idr); | ||
17 | 21 | ||
18 | struct ep_device { | 22 | struct ep_device { |
19 | struct usb_endpoint_descriptor *desc; | 23 | struct usb_endpoint_descriptor *desc; |
20 | struct usb_device *udev; | 24 | struct usb_device *udev; |
21 | struct device dev; | 25 | struct device dev; |
26 | int minor; | ||
22 | }; | 27 | }; |
23 | #define to_ep_device(_dev) \ | 28 | #define to_ep_device(_dev) \ |
24 | container_of(_dev, struct ep_device, dev) | 29 | container_of(_dev, struct ep_device, dev) |
@@ -152,6 +157,55 @@ static struct attribute_group ep_dev_attr_grp = { | |||
152 | .attrs = ep_dev_attrs, | 157 | .attrs = ep_dev_attrs, |
153 | }; | 158 | }; |
154 | 159 | ||
160 | static int usb_endpoint_major_init(void) | ||
161 | { | ||
162 | dev_t dev; | ||
163 | int error; | ||
164 | |||
165 | error = alloc_chrdev_region(&dev, 0, MAX_ENDPOINT_MINORS, | ||
166 | "usb_endpoint"); | ||
167 | if (error) { | ||
168 | err("unable to get a dynamic major for usb endpoints"); | ||
169 | return error; | ||
170 | } | ||
171 | usb_endpoint_major = MAJOR(dev); | ||
172 | |||
173 | return error; | ||
174 | } | ||
175 | |||
176 | static void usb_endpoint_major_cleanup(void) | ||
177 | { | ||
178 | unregister_chrdev_region(MKDEV(usb_endpoint_major, 0), | ||
179 | MAX_ENDPOINT_MINORS); | ||
180 | } | ||
181 | |||
182 | static int endpoint_get_minor(struct ep_device *ep_dev) | ||
183 | { | ||
184 | static DEFINE_MUTEX(minor_lock); | ||
185 | int retval = -ENOMEM; | ||
186 | int id; | ||
187 | |||
188 | mutex_lock(&minor_lock); | ||
189 | if (idr_pre_get(&endpoint_idr, GFP_KERNEL) == 0) | ||
190 | goto exit; | ||
191 | |||
192 | retval = idr_get_new(&endpoint_idr, ep_dev, &id); | ||
193 | if (retval < 0) { | ||
194 | if (retval == -EAGAIN) | ||
195 | retval = -ENOMEM; | ||
196 | goto exit; | ||
197 | } | ||
198 | ep_dev->minor = id & MAX_ID_MASK; | ||
199 | exit: | ||
200 | mutex_unlock(&minor_lock); | ||
201 | return retval; | ||
202 | } | ||
203 | |||
204 | static void endpoint_free_minor(struct ep_device *ep_dev) | ||
205 | { | ||
206 | idr_remove(&endpoint_idr, ep_dev->minor); | ||
207 | } | ||
208 | |||
155 | static struct endpoint_class { | 209 | static struct endpoint_class { |
156 | struct kref kref; | 210 | struct kref kref; |
157 | struct class *class; | 211 | struct class *class; |
@@ -176,11 +230,20 @@ static int init_endpoint_class(void) | |||
176 | ep_class->class = class_create(THIS_MODULE, "usb_endpoint"); | 230 | ep_class->class = class_create(THIS_MODULE, "usb_endpoint"); |
177 | if (IS_ERR(ep_class->class)) { | 231 | if (IS_ERR(ep_class->class)) { |
178 | result = IS_ERR(ep_class->class); | 232 | result = IS_ERR(ep_class->class); |
179 | kfree(ep_class); | 233 | goto class_create_error; |
180 | ep_class = NULL; | ||
181 | goto exit; | ||
182 | } | 234 | } |
183 | 235 | ||
236 | result = usb_endpoint_major_init(); | ||
237 | if (result) | ||
238 | goto endpoint_major_error; | ||
239 | |||
240 | goto exit; | ||
241 | |||
242 | endpoint_major_error: | ||
243 | class_destroy(ep_class->class); | ||
244 | class_create_error: | ||
245 | kfree(ep_class); | ||
246 | ep_class = NULL; | ||
184 | exit: | 247 | exit: |
185 | return result; | 248 | return result; |
186 | } | 249 | } |
@@ -191,6 +254,7 @@ static void release_endpoint_class(struct kref *kref) | |||
191 | class_destroy(ep_class->class); | 254 | class_destroy(ep_class->class); |
192 | kfree(ep_class); | 255 | kfree(ep_class); |
193 | ep_class = NULL; | 256 | ep_class = NULL; |
257 | usb_endpoint_major_cleanup(); | ||
194 | } | 258 | } |
195 | 259 | ||
196 | static void destroy_endpoint_class(void) | 260 | static void destroy_endpoint_class(void) |
@@ -213,7 +277,6 @@ int usb_create_ep_files(struct device *parent, | |||
213 | { | 277 | { |
214 | char name[8]; | 278 | char name[8]; |
215 | struct ep_device *ep_dev; | 279 | struct ep_device *ep_dev; |
216 | int minor; | ||
217 | int retval; | 280 | int retval; |
218 | 281 | ||
219 | retval = init_endpoint_class(); | 282 | retval = init_endpoint_class(); |
@@ -226,12 +289,16 @@ int usb_create_ep_files(struct device *parent, | |||
226 | goto error_alloc; | 289 | goto error_alloc; |
227 | } | 290 | } |
228 | 291 | ||
229 | /* fun calculation to determine the minor of this endpoint */ | 292 | retval = endpoint_get_minor(ep_dev); |
230 | minor = (((udev->bus->busnum - 1) * 128) * 16) + (udev->devnum - 1); | 293 | if (retval) { |
294 | dev_err(parent, "can not allocate minor number for %s", | ||
295 | ep_dev->dev.bus_id); | ||
296 | goto error_register; | ||
297 | } | ||
231 | 298 | ||
232 | ep_dev->desc = &endpoint->desc; | 299 | ep_dev->desc = &endpoint->desc; |
233 | ep_dev->udev = udev; | 300 | ep_dev->udev = udev; |
234 | ep_dev->dev.devt = MKDEV(442, minor); // FIXME fake number... | 301 | ep_dev->dev.devt = MKDEV(usb_endpoint_major, ep_dev->minor); |
235 | ep_dev->dev.class = ep_class->class; | 302 | ep_dev->dev.class = ep_class->class; |
236 | ep_dev->dev.parent = parent; | 303 | ep_dev->dev.parent = parent; |
237 | ep_dev->dev.release = ep_device_release; | 304 | ep_dev->dev.release = ep_device_release; |
@@ -241,7 +308,7 @@ int usb_create_ep_files(struct device *parent, | |||
241 | 308 | ||
242 | retval = device_register(&ep_dev->dev); | 309 | retval = device_register(&ep_dev->dev); |
243 | if (retval) | 310 | if (retval) |
244 | goto error_register; | 311 | goto error_chrdev; |
245 | retval = sysfs_create_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); | 312 | retval = sysfs_create_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); |
246 | if (retval) | 313 | if (retval) |
247 | goto error_group; | 314 | goto error_group; |
@@ -261,6 +328,9 @@ error_group: | |||
261 | destroy_endpoint_class(); | 328 | destroy_endpoint_class(); |
262 | return retval; | 329 | return retval; |
263 | 330 | ||
331 | error_chrdev: | ||
332 | endpoint_free_minor(ep_dev); | ||
333 | |||
264 | error_register: | 334 | error_register: |
265 | kfree(ep_dev); | 335 | kfree(ep_dev); |
266 | error_alloc: | 336 | error_alloc: |
@@ -271,14 +341,16 @@ exit: | |||
271 | 341 | ||
272 | void usb_remove_ep_files(struct usb_host_endpoint *endpoint) | 342 | void usb_remove_ep_files(struct usb_host_endpoint *endpoint) |
273 | { | 343 | { |
344 | struct ep_device *ep_dev = endpoint->ep_dev; | ||
274 | 345 | ||
275 | if (endpoint->ep_dev) { | 346 | if (ep_dev) { |
276 | char name[8]; | 347 | char name[8]; |
277 | 348 | ||
278 | sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress); | 349 | sprintf(name, "ep_%02x", endpoint->desc.bEndpointAddress); |
279 | sysfs_remove_link(&endpoint->ep_dev->dev.parent->kobj, name); | 350 | sysfs_remove_link(&ep_dev->dev.parent->kobj, name); |
280 | sysfs_remove_group(&endpoint->ep_dev->dev.kobj, &ep_dev_attr_grp); | 351 | sysfs_remove_group(&ep_dev->dev.kobj, &ep_dev_attr_grp); |
281 | device_unregister(&endpoint->ep_dev->dev); | 352 | endpoint_free_minor(ep_dev); |
353 | device_unregister(&ep_dev->dev); | ||
282 | endpoint->ep_dev = NULL; | 354 | endpoint->ep_dev = NULL; |
283 | destroy_endpoint_class(); | 355 | destroy_endpoint_class(); |
284 | } | 356 | } |
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index afa2dd203329..10064af65d17 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c | |||
@@ -256,7 +256,9 @@ static const u8 hs_rh_config_descriptor [] = { | |||
256 | 0x05, /* __u8 ep_bDescriptorType; Endpoint */ | 256 | 0x05, /* __u8 ep_bDescriptorType; Endpoint */ |
257 | 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */ | 257 | 0x81, /* __u8 ep_bEndpointAddress; IN Endpoint 1 */ |
258 | 0x03, /* __u8 ep_bmAttributes; Interrupt */ | 258 | 0x03, /* __u8 ep_bmAttributes; Interrupt */ |
259 | 0x02, 0x00, /* __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) */ | 259 | /* __le16 ep_wMaxPacketSize; 1 + (MAX_ROOT_PORTS / 8) |
260 | * see hub.c:hub_configure() for details. */ | ||
261 | (USB_MAXCHILDREN + 1 + 7) / 8, 0x00, | ||
260 | 0x0c /* __u8 ep_bInterval; (256ms -- usb 2.0 spec) */ | 262 | 0x0c /* __u8 ep_bInterval; (256ms -- usb 2.0 spec) */ |
261 | }; | 263 | }; |
262 | 264 | ||
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index ad0ffbe8f7d7..39186db1015f 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -31,6 +31,47 @@ | |||
31 | #include "hcd.h" | 31 | #include "hcd.h" |
32 | #include "hub.h" | 32 | #include "hub.h" |
33 | 33 | ||
34 | struct usb_hub { | ||
35 | struct device *intfdev; /* the "interface" device */ | ||
36 | struct usb_device *hdev; | ||
37 | struct urb *urb; /* for interrupt polling pipe */ | ||
38 | |||
39 | /* buffer for urb ... with extra space in case of babble */ | ||
40 | char (*buffer)[8]; | ||
41 | dma_addr_t buffer_dma; /* DMA address for buffer */ | ||
42 | union { | ||
43 | struct usb_hub_status hub; | ||
44 | struct usb_port_status port; | ||
45 | } *status; /* buffer for status reports */ | ||
46 | |||
47 | int error; /* last reported error */ | ||
48 | int nerrors; /* track consecutive errors */ | ||
49 | |||
50 | struct list_head event_list; /* hubs w/data or errs ready */ | ||
51 | unsigned long event_bits[1]; /* status change bitmask */ | ||
52 | unsigned long change_bits[1]; /* ports with logical connect | ||
53 | status change */ | ||
54 | unsigned long busy_bits[1]; /* ports being reset or | ||
55 | resumed */ | ||
56 | #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ | ||
57 | #error event_bits[] is too short! | ||
58 | #endif | ||
59 | |||
60 | struct usb_hub_descriptor *descriptor; /* class descriptor */ | ||
61 | struct usb_tt tt; /* Transaction Translator */ | ||
62 | |||
63 | unsigned mA_per_port; /* current for each child */ | ||
64 | |||
65 | unsigned limited_power:1; | ||
66 | unsigned quiescing:1; | ||
67 | unsigned activating:1; | ||
68 | |||
69 | unsigned has_indicators:1; | ||
70 | u8 indicator[USB_MAXCHILDREN]; | ||
71 | struct work_struct leds; | ||
72 | }; | ||
73 | |||
74 | |||
34 | /* Protect struct usb_device->state and ->children members | 75 | /* Protect struct usb_device->state and ->children members |
35 | * Note: Both are also protected by ->dev.sem, except that ->state can | 76 | * Note: Both are also protected by ->dev.sem, except that ->state can |
36 | * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ | 77 | * change to USB_STATE_NOTATTACHED even when the semaphore isn't held. */ |
@@ -45,6 +86,16 @@ static DECLARE_WAIT_QUEUE_HEAD(khubd_wait); | |||
45 | 86 | ||
46 | static struct task_struct *khubd_task; | 87 | static struct task_struct *khubd_task; |
47 | 88 | ||
89 | /* multithreaded probe logic */ | ||
90 | static int multithread_probe = | ||
91 | #ifdef CONFIG_USB_MULTITHREAD_PROBE | ||
92 | 1; | ||
93 | #else | ||
94 | 0; | ||
95 | #endif | ||
96 | module_param(multithread_probe, bool, S_IRUGO); | ||
97 | MODULE_PARM_DESC(multithread_probe, "Run each USB device probe in a new thread"); | ||
98 | |||
48 | /* cycle leds on hubs that aren't blinking for attention */ | 99 | /* cycle leds on hubs that aren't blinking for attention */ |
49 | static int blinkenlights = 0; | 100 | static int blinkenlights = 0; |
50 | module_param (blinkenlights, bool, S_IRUGO); | 101 | module_param (blinkenlights, bool, S_IRUGO); |
@@ -277,6 +328,9 @@ static void kick_khubd(struct usb_hub *hub) | |||
277 | { | 328 | { |
278 | unsigned long flags; | 329 | unsigned long flags; |
279 | 330 | ||
331 | /* Suppress autosuspend until khubd runs */ | ||
332 | to_usb_interface(hub->intfdev)->pm_usage_cnt = 1; | ||
333 | |||
280 | spin_lock_irqsave(&hub_event_lock, flags); | 334 | spin_lock_irqsave(&hub_event_lock, flags); |
281 | if (list_empty(&hub->event_list)) { | 335 | if (list_empty(&hub->event_list)) { |
282 | list_add_tail(&hub->event_list, &hub_event_list); | 336 | list_add_tail(&hub->event_list, &hub_event_list); |
@@ -459,7 +513,6 @@ static void hub_quiesce(struct usb_hub *hub) | |||
459 | /* (nonblocking) khubd and related activity won't re-trigger */ | 513 | /* (nonblocking) khubd and related activity won't re-trigger */ |
460 | hub->quiescing = 1; | 514 | hub->quiescing = 1; |
461 | hub->activating = 0; | 515 | hub->activating = 0; |
462 | hub->resume_root_hub = 0; | ||
463 | 516 | ||
464 | /* (blocking) stop khubd and related activity */ | 517 | /* (blocking) stop khubd and related activity */ |
465 | usb_kill_urb(hub->urb); | 518 | usb_kill_urb(hub->urb); |
@@ -475,7 +528,7 @@ static void hub_activate(struct usb_hub *hub) | |||
475 | 528 | ||
476 | hub->quiescing = 0; | 529 | hub->quiescing = 0; |
477 | hub->activating = 1; | 530 | hub->activating = 1; |
478 | hub->resume_root_hub = 0; | 531 | |
479 | status = usb_submit_urb(hub->urb, GFP_NOIO); | 532 | status = usb_submit_urb(hub->urb, GFP_NOIO); |
480 | if (status < 0) | 533 | if (status < 0) |
481 | dev_err(hub->intfdev, "activate --> %d\n", status); | 534 | dev_err(hub->intfdev, "activate --> %d\n", status); |
@@ -761,7 +814,12 @@ static int hub_configure(struct usb_hub *hub, | |||
761 | dev_dbg(hub_dev, "%sover-current condition exists\n", | 814 | dev_dbg(hub_dev, "%sover-current condition exists\n", |
762 | (hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no "); | 815 | (hubstatus & HUB_STATUS_OVERCURRENT) ? "" : "no "); |
763 | 816 | ||
764 | /* set up the interrupt endpoint */ | 817 | /* set up the interrupt endpoint |
818 | * We use the EP's maxpacket size instead of (PORTS+1+7)/8 | ||
819 | * bytes as USB2.0[11.12.3] says because some hubs are known | ||
820 | * to send more data (and thus cause overflow). For root hubs, | ||
821 | * maxpktsize is defined in hcd.c's fake endpoint descriptors | ||
822 | * to be big enough for at least USB_MAXCHILDREN ports. */ | ||
765 | pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress); | 823 | pipe = usb_rcvintpipe(hdev, endpoint->bEndpointAddress); |
766 | maxp = usb_maxpacket(hdev, pipe, usb_pipeout(pipe)); | 824 | maxp = usb_maxpacket(hdev, pipe, usb_pipeout(pipe)); |
767 | 825 | ||
@@ -885,6 +943,7 @@ descriptor_error: | |||
885 | INIT_DELAYED_WORK(&hub->leds, led_work); | 943 | INIT_DELAYED_WORK(&hub->leds, led_work); |
886 | 944 | ||
887 | usb_set_intfdata (intf, hub); | 945 | usb_set_intfdata (intf, hub); |
946 | intf->needs_remote_wakeup = 1; | ||
888 | 947 | ||
889 | if (hdev->speed == USB_SPEED_HIGH) | 948 | if (hdev->speed == USB_SPEED_HIGH) |
890 | highspeed_hubs++; | 949 | highspeed_hubs++; |
@@ -982,6 +1041,8 @@ static void recursively_mark_NOTATTACHED(struct usb_device *udev) | |||
982 | if (udev->children[i]) | 1041 | if (udev->children[i]) |
983 | recursively_mark_NOTATTACHED(udev->children[i]); | 1042 | recursively_mark_NOTATTACHED(udev->children[i]); |
984 | } | 1043 | } |
1044 | if (udev->state == USB_STATE_SUSPENDED) | ||
1045 | udev->discon_suspended = 1; | ||
985 | udev->state = USB_STATE_NOTATTACHED; | 1046 | udev->state = USB_STATE_NOTATTACHED; |
986 | } | 1047 | } |
987 | 1048 | ||
@@ -1171,6 +1232,14 @@ void usb_disconnect(struct usb_device **pdev) | |||
1171 | *pdev = NULL; | 1232 | *pdev = NULL; |
1172 | spin_unlock_irq(&device_state_lock); | 1233 | spin_unlock_irq(&device_state_lock); |
1173 | 1234 | ||
1235 | /* Decrement the parent's count of unsuspended children */ | ||
1236 | if (udev->parent) { | ||
1237 | usb_pm_lock(udev); | ||
1238 | if (!udev->discon_suspended) | ||
1239 | usb_autosuspend_device(udev->parent); | ||
1240 | usb_pm_unlock(udev); | ||
1241 | } | ||
1242 | |||
1174 | put_device(&udev->dev); | 1243 | put_device(&udev->dev); |
1175 | } | 1244 | } |
1176 | 1245 | ||
@@ -1193,29 +1262,17 @@ static inline void show_string(struct usb_device *udev, char *id, char *string) | |||
1193 | static int __usb_port_suspend(struct usb_device *, int port1); | 1262 | static int __usb_port_suspend(struct usb_device *, int port1); |
1194 | #endif | 1263 | #endif |
1195 | 1264 | ||
1196 | /** | 1265 | static int __usb_new_device(void *void_data) |
1197 | * usb_new_device - perform initial device setup (usbcore-internal) | ||
1198 | * @udev: newly addressed device (in ADDRESS state) | ||
1199 | * | ||
1200 | * This is called with devices which have been enumerated, but not yet | ||
1201 | * configured. The device descriptor is available, but not descriptors | ||
1202 | * for any device configuration. The caller must have locked either | ||
1203 | * the parent hub (if udev is a normal device) or else the | ||
1204 | * usb_bus_list_lock (if udev is a root hub). The parent's pointer to | ||
1205 | * udev has already been installed, but udev is not yet visible through | ||
1206 | * sysfs or other filesystem code. | ||
1207 | * | ||
1208 | * Returns 0 for success (device is configured and listed, with its | ||
1209 | * interfaces, in sysfs); else a negative errno value. | ||
1210 | * | ||
1211 | * This call is synchronous, and may not be used in an interrupt context. | ||
1212 | * | ||
1213 | * Only the hub driver or root-hub registrar should ever call this. | ||
1214 | */ | ||
1215 | int usb_new_device(struct usb_device *udev) | ||
1216 | { | 1266 | { |
1267 | struct usb_device *udev = void_data; | ||
1217 | int err; | 1268 | int err; |
1218 | 1269 | ||
1270 | /* Lock ourself into memory in order to keep a probe sequence | ||
1271 | * sleeping in a new thread from allowing us to be unloaded. | ||
1272 | */ | ||
1273 | if (!try_module_get(THIS_MODULE)) | ||
1274 | return -EINVAL; | ||
1275 | |||
1219 | err = usb_get_configuration(udev); | 1276 | err = usb_get_configuration(udev); |
1220 | if (err < 0) { | 1277 | if (err < 0) { |
1221 | dev_err(&udev->dev, "can't read configurations, error %d\n", | 1278 | dev_err(&udev->dev, "can't read configurations, error %d\n", |
@@ -1311,13 +1368,56 @@ int usb_new_device(struct usb_device *udev) | |||
1311 | goto fail; | 1368 | goto fail; |
1312 | } | 1369 | } |
1313 | 1370 | ||
1314 | return 0; | 1371 | /* Increment the parent's count of unsuspended children */ |
1372 | if (udev->parent) | ||
1373 | usb_autoresume_device(udev->parent); | ||
1374 | |||
1375 | exit: | ||
1376 | module_put(THIS_MODULE); | ||
1377 | return err; | ||
1315 | 1378 | ||
1316 | fail: | 1379 | fail: |
1317 | usb_set_device_state(udev, USB_STATE_NOTATTACHED); | 1380 | usb_set_device_state(udev, USB_STATE_NOTATTACHED); |
1318 | return err; | 1381 | goto exit; |
1319 | } | 1382 | } |
1320 | 1383 | ||
1384 | /** | ||
1385 | * usb_new_device - perform initial device setup (usbcore-internal) | ||
1386 | * @udev: newly addressed device (in ADDRESS state) | ||
1387 | * | ||
1388 | * This is called with devices which have been enumerated, but not yet | ||
1389 | * configured. The device descriptor is available, but not descriptors | ||
1390 | * for any device configuration. The caller must have locked either | ||
1391 | * the parent hub (if udev is a normal device) or else the | ||
1392 | * usb_bus_list_lock (if udev is a root hub). The parent's pointer to | ||
1393 | * udev has already been installed, but udev is not yet visible through | ||
1394 | * sysfs or other filesystem code. | ||
1395 | * | ||
1396 | * The return value for this function depends on if the | ||
1397 | * multithread_probe variable is set or not. If it's set, it will | ||
1398 | * return a if the probe thread was successfully created or not. If the | ||
1399 | * variable is not set, it will return if the device is configured | ||
1400 | * properly or not. interfaces, in sysfs); else a negative errno value. | ||
1401 | * | ||
1402 | * This call is synchronous, and may not be used in an interrupt context. | ||
1403 | * | ||
1404 | * Only the hub driver or root-hub registrar should ever call this. | ||
1405 | */ | ||
1406 | int usb_new_device(struct usb_device *udev) | ||
1407 | { | ||
1408 | struct task_struct *probe_task; | ||
1409 | int ret = 0; | ||
1410 | |||
1411 | if (multithread_probe) { | ||
1412 | probe_task = kthread_run(__usb_new_device, udev, | ||
1413 | "usb-probe-%s", udev->devnum); | ||
1414 | if (IS_ERR(probe_task)) | ||
1415 | ret = PTR_ERR(probe_task); | ||
1416 | } else | ||
1417 | ret = __usb_new_device(udev); | ||
1418 | |||
1419 | return ret; | ||
1420 | } | ||
1321 | 1421 | ||
1322 | static int hub_port_status(struct usb_hub *hub, int port1, | 1422 | static int hub_port_status(struct usb_hub *hub, int port1, |
1323 | u16 *status, u16 *change) | 1423 | u16 *status, u16 *change) |
@@ -1325,10 +1425,12 @@ static int hub_port_status(struct usb_hub *hub, int port1, | |||
1325 | int ret; | 1425 | int ret; |
1326 | 1426 | ||
1327 | ret = get_port_status(hub->hdev, port1, &hub->status->port); | 1427 | ret = get_port_status(hub->hdev, port1, &hub->status->port); |
1328 | if (ret < 0) | 1428 | if (ret < 4) { |
1329 | dev_err (hub->intfdev, | 1429 | dev_err (hub->intfdev, |
1330 | "%s failed (err = %d)\n", __FUNCTION__, ret); | 1430 | "%s failed (err = %d)\n", __FUNCTION__, ret); |
1331 | else { | 1431 | if (ret >= 0) |
1432 | ret = -EIO; | ||
1433 | } else { | ||
1332 | *status = le16_to_cpu(hub->status->port.wPortStatus); | 1434 | *status = le16_to_cpu(hub->status->port.wPortStatus); |
1333 | *change = le16_to_cpu(hub->status->port.wPortChange); | 1435 | *change = le16_to_cpu(hub->status->port.wPortChange); |
1334 | ret = 0; | 1436 | ret = 0; |
@@ -1676,6 +1778,12 @@ static int | |||
1676 | hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | 1778 | hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) |
1677 | { | 1779 | { |
1678 | int status; | 1780 | int status; |
1781 | u16 portchange, portstatus; | ||
1782 | |||
1783 | /* Skip the initial Clear-Suspend step for a remote wakeup */ | ||
1784 | status = hub_port_status(hub, port1, &portstatus, &portchange); | ||
1785 | if (status == 0 && !(portstatus & USB_PORT_STAT_SUSPEND)) | ||
1786 | goto SuspendCleared; | ||
1679 | 1787 | ||
1680 | // dev_dbg(hub->intfdev, "resume port %d\n", port1); | 1788 | // dev_dbg(hub->intfdev, "resume port %d\n", port1); |
1681 | 1789 | ||
@@ -1689,9 +1797,6 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | |||
1689 | "can't resume port %d, status %d\n", | 1797 | "can't resume port %d, status %d\n", |
1690 | port1, status); | 1798 | port1, status); |
1691 | } else { | 1799 | } else { |
1692 | u16 devstatus; | ||
1693 | u16 portchange; | ||
1694 | |||
1695 | /* drive resume for at least 20 msec */ | 1800 | /* drive resume for at least 20 msec */ |
1696 | if (udev) | 1801 | if (udev) |
1697 | dev_dbg(&udev->dev, "usb %sresume\n", | 1802 | dev_dbg(&udev->dev, "usb %sresume\n", |
@@ -1706,16 +1811,15 @@ hub_port_resume(struct usb_hub *hub, int port1, struct usb_device *udev) | |||
1706 | * stop resume signaling. Then finish the resume | 1811 | * stop resume signaling. Then finish the resume |
1707 | * sequence. | 1812 | * sequence. |
1708 | */ | 1813 | */ |
1709 | devstatus = portchange = 0; | 1814 | status = hub_port_status(hub, port1, &portstatus, &portchange); |
1710 | status = hub_port_status(hub, port1, | 1815 | SuspendCleared: |
1711 | &devstatus, &portchange); | ||
1712 | if (status < 0 | 1816 | if (status < 0 |
1713 | || (devstatus & LIVE_FLAGS) != LIVE_FLAGS | 1817 | || (portstatus & LIVE_FLAGS) != LIVE_FLAGS |
1714 | || (devstatus & USB_PORT_STAT_SUSPEND) != 0 | 1818 | || (portstatus & USB_PORT_STAT_SUSPEND) != 0 |
1715 | ) { | 1819 | ) { |
1716 | dev_dbg(hub->intfdev, | 1820 | dev_dbg(hub->intfdev, |
1717 | "port %d status %04x.%04x after resume, %d\n", | 1821 | "port %d status %04x.%04x after resume, %d\n", |
1718 | port1, portchange, devstatus, status); | 1822 | port1, portchange, portstatus, status); |
1719 | if (status >= 0) | 1823 | if (status >= 0) |
1720 | status = -ENODEV; | 1824 | status = -ENODEV; |
1721 | } else { | 1825 | } else { |
@@ -1776,23 +1880,16 @@ static int remote_wakeup(struct usb_device *udev) | |||
1776 | { | 1880 | { |
1777 | int status = 0; | 1881 | int status = 0; |
1778 | 1882 | ||
1779 | /* All this just to avoid sending a port-resume message | ||
1780 | * to the parent hub! */ | ||
1781 | |||
1782 | usb_lock_device(udev); | 1883 | usb_lock_device(udev); |
1783 | usb_pm_lock(udev); | ||
1784 | if (udev->state == USB_STATE_SUSPENDED) { | 1884 | if (udev->state == USB_STATE_SUSPENDED) { |
1785 | dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); | 1885 | dev_dbg(&udev->dev, "usb %sresume\n", "wakeup-"); |
1786 | /* TRSMRCY = 10 msec */ | 1886 | status = usb_autoresume_device(udev); |
1787 | msleep(10); | 1887 | |
1788 | status = finish_port_resume(udev); | 1888 | /* Give the interface drivers a chance to do something, |
1889 | * then autosuspend the device again. */ | ||
1789 | if (status == 0) | 1890 | if (status == 0) |
1790 | udev->dev.power.power_state.event = PM_EVENT_ON; | 1891 | usb_autosuspend_device(udev); |
1791 | } | 1892 | } |
1792 | usb_pm_unlock(udev); | ||
1793 | |||
1794 | if (status == 0) | ||
1795 | usb_autoresume_device(udev, 0); | ||
1796 | usb_unlock_device(udev); | 1893 | usb_unlock_device(udev); |
1797 | return status; | 1894 | return status; |
1798 | } | 1895 | } |
@@ -1856,6 +1953,8 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
1856 | } | 1953 | } |
1857 | } | 1954 | } |
1858 | 1955 | ||
1956 | dev_dbg(&intf->dev, "%s\n", __FUNCTION__); | ||
1957 | |||
1859 | /* "global suspend" of the downstream HC-to-USB interface */ | 1958 | /* "global suspend" of the downstream HC-to-USB interface */ |
1860 | if (!hdev->parent) { | 1959 | if (!hdev->parent) { |
1861 | struct usb_bus *bus = hdev->bus; | 1960 | struct usb_bus *bus = hdev->bus; |
@@ -1878,10 +1977,12 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) | |||
1878 | 1977 | ||
1879 | static int hub_resume(struct usb_interface *intf) | 1978 | static int hub_resume(struct usb_interface *intf) |
1880 | { | 1979 | { |
1881 | struct usb_device *hdev = interface_to_usbdev(intf); | ||
1882 | struct usb_hub *hub = usb_get_intfdata (intf); | 1980 | struct usb_hub *hub = usb_get_intfdata (intf); |
1981 | struct usb_device *hdev = hub->hdev; | ||
1883 | int status; | 1982 | int status; |
1884 | 1983 | ||
1984 | dev_dbg(&intf->dev, "%s\n", __FUNCTION__); | ||
1985 | |||
1885 | /* "global resume" of the downstream HC-to-USB interface */ | 1986 | /* "global resume" of the downstream HC-to-USB interface */ |
1886 | if (!hdev->parent) { | 1987 | if (!hdev->parent) { |
1887 | struct usb_bus *bus = hdev->bus; | 1988 | struct usb_bus *bus = hdev->bus; |
@@ -1920,7 +2021,6 @@ void usb_resume_root_hub(struct usb_device *hdev) | |||
1920 | { | 2021 | { |
1921 | struct usb_hub *hub = hdev_to_hub(hdev); | 2022 | struct usb_hub *hub = hdev_to_hub(hdev); |
1922 | 2023 | ||
1923 | hub->resume_root_hub = 1; | ||
1924 | kick_khubd(hub); | 2024 | kick_khubd(hub); |
1925 | } | 2025 | } |
1926 | 2026 | ||
@@ -2557,16 +2657,13 @@ static void hub_events(void) | |||
2557 | intf = to_usb_interface(hub->intfdev); | 2657 | intf = to_usb_interface(hub->intfdev); |
2558 | hub_dev = &intf->dev; | 2658 | hub_dev = &intf->dev; |
2559 | 2659 | ||
2560 | i = hub->resume_root_hub; | 2660 | dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x\n", |
2561 | |||
2562 | dev_dbg(hub_dev, "state %d ports %d chg %04x evt %04x%s\n", | ||
2563 | hdev->state, hub->descriptor | 2661 | hdev->state, hub->descriptor |
2564 | ? hub->descriptor->bNbrPorts | 2662 | ? hub->descriptor->bNbrPorts |
2565 | : 0, | 2663 | : 0, |
2566 | /* NOTE: expects max 15 ports... */ | 2664 | /* NOTE: expects max 15 ports... */ |
2567 | (u16) hub->change_bits[0], | 2665 | (u16) hub->change_bits[0], |
2568 | (u16) hub->event_bits[0], | 2666 | (u16) hub->event_bits[0]); |
2569 | i ? ", resume root" : ""); | ||
2570 | 2667 | ||
2571 | usb_get_intf(intf); | 2668 | usb_get_intf(intf); |
2572 | spin_unlock_irq(&hub_event_lock); | 2669 | spin_unlock_irq(&hub_event_lock); |
@@ -2587,16 +2684,16 @@ static void hub_events(void) | |||
2587 | goto loop; | 2684 | goto loop; |
2588 | } | 2685 | } |
2589 | 2686 | ||
2590 | /* Is this is a root hub wanting to reactivate the downstream | 2687 | /* Autoresume */ |
2591 | * ports? If so, be sure the interface resumes even if its | 2688 | ret = usb_autopm_get_interface(intf); |
2592 | * stub "device" node was never suspended. | 2689 | if (ret) { |
2593 | */ | 2690 | dev_dbg(hub_dev, "Can't autoresume: %d\n", ret); |
2594 | if (i) | 2691 | goto loop; |
2595 | usb_autoresume_device(hdev, 0); | 2692 | } |
2596 | 2693 | ||
2597 | /* If this is an inactive or suspended hub, do nothing */ | 2694 | /* If this is an inactive hub, do nothing */ |
2598 | if (hub->quiescing) | 2695 | if (hub->quiescing) |
2599 | goto loop; | 2696 | goto loop_autopm; |
2600 | 2697 | ||
2601 | if (hub->error) { | 2698 | if (hub->error) { |
2602 | dev_dbg (hub_dev, "resetting for error %d\n", | 2699 | dev_dbg (hub_dev, "resetting for error %d\n", |
@@ -2606,7 +2703,7 @@ static void hub_events(void) | |||
2606 | if (ret) { | 2703 | if (ret) { |
2607 | dev_dbg (hub_dev, | 2704 | dev_dbg (hub_dev, |
2608 | "error resetting hub: %d\n", ret); | 2705 | "error resetting hub: %d\n", ret); |
2609 | goto loop; | 2706 | goto loop_autopm; |
2610 | } | 2707 | } |
2611 | 2708 | ||
2612 | hub->nerrors = 0; | 2709 | hub->nerrors = 0; |
@@ -2734,6 +2831,10 @@ static void hub_events(void) | |||
2734 | if (!hdev->parent && !hub->busy_bits[0]) | 2831 | if (!hdev->parent && !hub->busy_bits[0]) |
2735 | usb_enable_root_hub_irq(hdev->bus); | 2832 | usb_enable_root_hub_irq(hdev->bus); |
2736 | 2833 | ||
2834 | loop_autopm: | ||
2835 | /* Allow autosuspend if we're not going to run again */ | ||
2836 | if (list_empty(&hub->event_list)) | ||
2837 | usb_autopm_enable(intf); | ||
2737 | loop: | 2838 | loop: |
2738 | usb_unlock_device(hdev); | 2839 | usb_unlock_device(hdev); |
2739 | usb_put_intf(intf); | 2840 | usb_put_intf(intf); |
@@ -2775,6 +2876,7 @@ static struct usb_driver hub_driver = { | |||
2775 | .post_reset = hub_post_reset, | 2876 | .post_reset = hub_post_reset, |
2776 | .ioctl = hub_ioctl, | 2877 | .ioctl = hub_ioctl, |
2777 | .id_table = hub_id_table, | 2878 | .id_table = hub_id_table, |
2879 | .supports_autosuspend = 1, | ||
2778 | }; | 2880 | }; |
2779 | 2881 | ||
2780 | int usb_hub_init(void) | 2882 | int usb_hub_init(void) |
@@ -2999,7 +3101,7 @@ int usb_reset_composite_device(struct usb_device *udev, | |||
2999 | } | 3101 | } |
3000 | 3102 | ||
3001 | /* Prevent autosuspend during the reset */ | 3103 | /* Prevent autosuspend during the reset */ |
3002 | usb_autoresume_device(udev, 1); | 3104 | usb_autoresume_device(udev); |
3003 | 3105 | ||
3004 | if (iface && iface->condition != USB_INTERFACE_BINDING) | 3106 | if (iface && iface->condition != USB_INTERFACE_BINDING) |
3005 | iface = NULL; | 3107 | iface = NULL; |
@@ -3042,7 +3144,7 @@ int usb_reset_composite_device(struct usb_device *udev, | |||
3042 | } | 3144 | } |
3043 | } | 3145 | } |
3044 | 3146 | ||
3045 | usb_autosuspend_device(udev, 1); | 3147 | usb_autosuspend_device(udev); |
3046 | return ret; | 3148 | return ret; |
3047 | } | 3149 | } |
3048 | EXPORT_SYMBOL(usb_reset_composite_device); | 3150 | EXPORT_SYMBOL(usb_reset_composite_device); |
diff --git a/drivers/usb/core/hub.h b/drivers/usb/core/hub.h index 035d3ef35888..cf9559c6c9b6 100644 --- a/drivers/usb/core/hub.h +++ b/drivers/usb/core/hub.h | |||
@@ -192,45 +192,4 @@ struct usb_tt_clear { | |||
192 | 192 | ||
193 | extern void usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe); | 193 | extern void usb_hub_tt_clear_buffer (struct usb_device *dev, int pipe); |
194 | 194 | ||
195 | struct usb_hub { | ||
196 | struct device *intfdev; /* the "interface" device */ | ||
197 | struct usb_device *hdev; | ||
198 | struct urb *urb; /* for interrupt polling pipe */ | ||
199 | |||
200 | /* buffer for urb ... with extra space in case of babble */ | ||
201 | char (*buffer)[8]; | ||
202 | dma_addr_t buffer_dma; /* DMA address for buffer */ | ||
203 | union { | ||
204 | struct usb_hub_status hub; | ||
205 | struct usb_port_status port; | ||
206 | } *status; /* buffer for status reports */ | ||
207 | |||
208 | int error; /* last reported error */ | ||
209 | int nerrors; /* track consecutive errors */ | ||
210 | |||
211 | struct list_head event_list; /* hubs w/data or errs ready */ | ||
212 | unsigned long event_bits[1]; /* status change bitmask */ | ||
213 | unsigned long change_bits[1]; /* ports with logical connect | ||
214 | status change */ | ||
215 | unsigned long busy_bits[1]; /* ports being reset or | ||
216 | resumed */ | ||
217 | #if USB_MAXCHILDREN > 31 /* 8*sizeof(unsigned long) - 1 */ | ||
218 | #error event_bits[] is too short! | ||
219 | #endif | ||
220 | |||
221 | struct usb_hub_descriptor *descriptor; /* class descriptor */ | ||
222 | struct usb_tt tt; /* Transaction Translator */ | ||
223 | |||
224 | unsigned mA_per_port; /* current for each child */ | ||
225 | |||
226 | unsigned limited_power:1; | ||
227 | unsigned quiescing:1; | ||
228 | unsigned activating:1; | ||
229 | unsigned resume_root_hub:1; | ||
230 | |||
231 | unsigned has_indicators:1; | ||
232 | enum hub_led_mode indicator[USB_MAXCHILDREN]; | ||
233 | struct delayed_work leds; | ||
234 | }; | ||
235 | |||
236 | #endif /* __LINUX_HUB_H */ | 195 | #endif /* __LINUX_HUB_H */ |
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c index 89572bc021b1..7390b67c609d 100644 --- a/drivers/usb/core/message.c +++ b/drivers/usb/core/message.c | |||
@@ -764,7 +764,7 @@ int usb_string(struct usb_device *dev, int index, char *buf, size_t size) | |||
764 | err = -EINVAL; | 764 | err = -EINVAL; |
765 | goto errout; | 765 | goto errout; |
766 | } else { | 766 | } else { |
767 | dev->have_langid = -1; | 767 | dev->have_langid = 1; |
768 | dev->string_langid = tbuf[2] | (tbuf[3]<< 8); | 768 | dev->string_langid = tbuf[2] | (tbuf[3]<< 8); |
769 | /* always use the first langid listed */ | 769 | /* always use the first langid listed */ |
770 | dev_dbg (&dev->dev, "default language 0x%04x\n", | 770 | dev_dbg (&dev->dev, "default language 0x%04x\n", |
@@ -1398,7 +1398,7 @@ free_interfaces: | |||
1398 | } | 1398 | } |
1399 | 1399 | ||
1400 | /* Wake up the device so we can send it the Set-Config request */ | 1400 | /* Wake up the device so we can send it the Set-Config request */ |
1401 | ret = usb_autoresume_device(dev, 1); | 1401 | ret = usb_autoresume_device(dev); |
1402 | if (ret) | 1402 | if (ret) |
1403 | goto free_interfaces; | 1403 | goto free_interfaces; |
1404 | 1404 | ||
@@ -1421,7 +1421,7 @@ free_interfaces: | |||
1421 | dev->actconfig = cp; | 1421 | dev->actconfig = cp; |
1422 | if (!cp) { | 1422 | if (!cp) { |
1423 | usb_set_device_state(dev, USB_STATE_ADDRESS); | 1423 | usb_set_device_state(dev, USB_STATE_ADDRESS); |
1424 | usb_autosuspend_device(dev, 1); | 1424 | usb_autosuspend_device(dev); |
1425 | goto free_interfaces; | 1425 | goto free_interfaces; |
1426 | } | 1426 | } |
1427 | usb_set_device_state(dev, USB_STATE_CONFIGURED); | 1427 | usb_set_device_state(dev, USB_STATE_CONFIGURED); |
@@ -1490,7 +1490,7 @@ free_interfaces: | |||
1490 | usb_create_sysfs_intf_files (intf); | 1490 | usb_create_sysfs_intf_files (intf); |
1491 | } | 1491 | } |
1492 | 1492 | ||
1493 | usb_autosuspend_device(dev, 1); | 1493 | usb_autosuspend_device(dev); |
1494 | return 0; | 1494 | return 0; |
1495 | } | 1495 | } |
1496 | 1496 | ||
diff --git a/drivers/usb/core/usb.c b/drivers/usb/core/usb.c index ab2f68fc7d2d..02426d0b9a34 100644 --- a/drivers/usb/core/usb.c +++ b/drivers/usb/core/usb.c | |||
@@ -200,13 +200,6 @@ static void ksuspend_usb_cleanup(void) | |||
200 | destroy_workqueue(ksuspend_usb_wq); | 200 | destroy_workqueue(ksuspend_usb_wq); |
201 | } | 201 | } |
202 | 202 | ||
203 | #else | ||
204 | |||
205 | #define ksuspend_usb_init() 0 | ||
206 | #define ksuspend_usb_cleanup() do {} while (0) | ||
207 | |||
208 | #endif | ||
209 | |||
210 | #ifdef CONFIG_USB_SUSPEND | 203 | #ifdef CONFIG_USB_SUSPEND |
211 | 204 | ||
212 | /* usb_autosuspend_work - callback routine to autosuspend a USB device */ | 205 | /* usb_autosuspend_work - callback routine to autosuspend a USB device */ |
@@ -226,7 +219,14 @@ static void usb_autosuspend_work(struct work_struct *work) | |||
226 | static void usb_autosuspend_work(struct work_struct *work) | 219 | static void usb_autosuspend_work(struct work_struct *work) |
227 | {} | 220 | {} |
228 | 221 | ||
229 | #endif | 222 | #endif /* CONFIG_USB_SUSPEND */ |
223 | |||
224 | #else | ||
225 | |||
226 | #define ksuspend_usb_init() 0 | ||
227 | #define ksuspend_usb_cleanup() do {} while (0) | ||
228 | |||
229 | #endif /* CONFIG_PM */ | ||
230 | 230 | ||
231 | /** | 231 | /** |
232 | * usb_alloc_dev - usb device constructor (usbcore-internal) | 232 | * usb_alloc_dev - usb device constructor (usbcore-internal) |
@@ -538,138 +538,6 @@ int usb_get_current_frame_number(struct usb_device *dev) | |||
538 | return usb_hcd_get_frame_number (dev); | 538 | return usb_hcd_get_frame_number (dev); |
539 | } | 539 | } |
540 | 540 | ||
541 | /** | ||
542 | * usb_endpoint_dir_in - check if the endpoint has IN direction | ||
543 | * @epd: endpoint to be checked | ||
544 | * | ||
545 | * Returns true if the endpoint is of type IN, otherwise it returns false. | ||
546 | */ | ||
547 | int usb_endpoint_dir_in(const struct usb_endpoint_descriptor *epd) | ||
548 | { | ||
549 | return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN); | ||
550 | } | ||
551 | |||
552 | /** | ||
553 | * usb_endpoint_dir_out - check if the endpoint has OUT direction | ||
554 | * @epd: endpoint to be checked | ||
555 | * | ||
556 | * Returns true if the endpoint is of type OUT, otherwise it returns false. | ||
557 | */ | ||
558 | int usb_endpoint_dir_out(const struct usb_endpoint_descriptor *epd) | ||
559 | { | ||
560 | return ((epd->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT); | ||
561 | } | ||
562 | |||
563 | /** | ||
564 | * usb_endpoint_xfer_bulk - check if the endpoint has bulk transfer type | ||
565 | * @epd: endpoint to be checked | ||
566 | * | ||
567 | * Returns true if the endpoint is of type bulk, otherwise it returns false. | ||
568 | */ | ||
569 | int usb_endpoint_xfer_bulk(const struct usb_endpoint_descriptor *epd) | ||
570 | { | ||
571 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
572 | USB_ENDPOINT_XFER_BULK); | ||
573 | } | ||
574 | |||
575 | /** | ||
576 | * usb_endpoint_xfer_int - check if the endpoint has interrupt transfer type | ||
577 | * @epd: endpoint to be checked | ||
578 | * | ||
579 | * Returns true if the endpoint is of type interrupt, otherwise it returns | ||
580 | * false. | ||
581 | */ | ||
582 | int usb_endpoint_xfer_int(const struct usb_endpoint_descriptor *epd) | ||
583 | { | ||
584 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
585 | USB_ENDPOINT_XFER_INT); | ||
586 | } | ||
587 | |||
588 | /** | ||
589 | * usb_endpoint_xfer_isoc - check if the endpoint has isochronous transfer type | ||
590 | * @epd: endpoint to be checked | ||
591 | * | ||
592 | * Returns true if the endpoint is of type isochronous, otherwise it returns | ||
593 | * false. | ||
594 | */ | ||
595 | int usb_endpoint_xfer_isoc(const struct usb_endpoint_descriptor *epd) | ||
596 | { | ||
597 | return ((epd->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
598 | USB_ENDPOINT_XFER_ISOC); | ||
599 | } | ||
600 | |||
601 | /** | ||
602 | * usb_endpoint_is_bulk_in - check if the endpoint is bulk IN | ||
603 | * @epd: endpoint to be checked | ||
604 | * | ||
605 | * Returns true if the endpoint has bulk transfer type and IN direction, | ||
606 | * otherwise it returns false. | ||
607 | */ | ||
608 | int usb_endpoint_is_bulk_in(const struct usb_endpoint_descriptor *epd) | ||
609 | { | ||
610 | return (usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_in(epd)); | ||
611 | } | ||
612 | |||
613 | /** | ||
614 | * usb_endpoint_is_bulk_out - check if the endpoint is bulk OUT | ||
615 | * @epd: endpoint to be checked | ||
616 | * | ||
617 | * Returns true if the endpoint has bulk transfer type and OUT direction, | ||
618 | * otherwise it returns false. | ||
619 | */ | ||
620 | int usb_endpoint_is_bulk_out(const struct usb_endpoint_descriptor *epd) | ||
621 | { | ||
622 | return (usb_endpoint_xfer_bulk(epd) && usb_endpoint_dir_out(epd)); | ||
623 | } | ||
624 | |||
625 | /** | ||
626 | * usb_endpoint_is_int_in - check if the endpoint is interrupt IN | ||
627 | * @epd: endpoint to be checked | ||
628 | * | ||
629 | * Returns true if the endpoint has interrupt transfer type and IN direction, | ||
630 | * otherwise it returns false. | ||
631 | */ | ||
632 | int usb_endpoint_is_int_in(const struct usb_endpoint_descriptor *epd) | ||
633 | { | ||
634 | return (usb_endpoint_xfer_int(epd) && usb_endpoint_dir_in(epd)); | ||
635 | } | ||
636 | |||
637 | /** | ||
638 | * usb_endpoint_is_int_out - check if the endpoint is interrupt OUT | ||
639 | * @epd: endpoint to be checked | ||
640 | * | ||
641 | * Returns true if the endpoint has interrupt transfer type and OUT direction, | ||
642 | * otherwise it returns false. | ||
643 | */ | ||
644 | int usb_endpoint_is_int_out(const struct usb_endpoint_descriptor *epd) | ||
645 | { | ||
646 | return (usb_endpoint_xfer_int(epd) && usb_endpoint_dir_out(epd)); | ||
647 | } | ||
648 | |||
649 | /** | ||
650 | * usb_endpoint_is_isoc_in - check if the endpoint is isochronous IN | ||
651 | * @epd: endpoint to be checked | ||
652 | * | ||
653 | * Returns true if the endpoint has isochronous transfer type and IN direction, | ||
654 | * otherwise it returns false. | ||
655 | */ | ||
656 | int usb_endpoint_is_isoc_in(const struct usb_endpoint_descriptor *epd) | ||
657 | { | ||
658 | return (usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_in(epd)); | ||
659 | } | ||
660 | |||
661 | /** | ||
662 | * usb_endpoint_is_isoc_out - check if the endpoint is isochronous OUT | ||
663 | * @epd: endpoint to be checked | ||
664 | * | ||
665 | * Returns true if the endpoint has isochronous transfer type and OUT direction, | ||
666 | * otherwise it returns false. | ||
667 | */ | ||
668 | int usb_endpoint_is_isoc_out(const struct usb_endpoint_descriptor *epd) | ||
669 | { | ||
670 | return (usb_endpoint_xfer_isoc(epd) && usb_endpoint_dir_out(epd)); | ||
671 | } | ||
672 | |||
673 | /*-------------------------------------------------------------------*/ | 541 | /*-------------------------------------------------------------------*/ |
674 | /* | 542 | /* |
675 | * __usb_get_extra_descriptor() finds a descriptor of specific type in the | 543 | * __usb_get_extra_descriptor() finds a descriptor of specific type in the |
@@ -1103,18 +971,6 @@ EXPORT_SYMBOL(__usb_get_extra_descriptor); | |||
1103 | EXPORT_SYMBOL(usb_find_device); | 971 | EXPORT_SYMBOL(usb_find_device); |
1104 | EXPORT_SYMBOL(usb_get_current_frame_number); | 972 | EXPORT_SYMBOL(usb_get_current_frame_number); |
1105 | 973 | ||
1106 | EXPORT_SYMBOL_GPL(usb_endpoint_dir_in); | ||
1107 | EXPORT_SYMBOL_GPL(usb_endpoint_dir_out); | ||
1108 | EXPORT_SYMBOL_GPL(usb_endpoint_xfer_bulk); | ||
1109 | EXPORT_SYMBOL_GPL(usb_endpoint_xfer_int); | ||
1110 | EXPORT_SYMBOL_GPL(usb_endpoint_xfer_isoc); | ||
1111 | EXPORT_SYMBOL_GPL(usb_endpoint_is_bulk_in); | ||
1112 | EXPORT_SYMBOL_GPL(usb_endpoint_is_bulk_out); | ||
1113 | EXPORT_SYMBOL_GPL(usb_endpoint_is_int_in); | ||
1114 | EXPORT_SYMBOL_GPL(usb_endpoint_is_int_out); | ||
1115 | EXPORT_SYMBOL_GPL(usb_endpoint_is_isoc_in); | ||
1116 | EXPORT_SYMBOL_GPL(usb_endpoint_is_isoc_out); | ||
1117 | |||
1118 | EXPORT_SYMBOL (usb_buffer_alloc); | 974 | EXPORT_SYMBOL (usb_buffer_alloc); |
1119 | EXPORT_SYMBOL (usb_buffer_free); | 975 | EXPORT_SYMBOL (usb_buffer_free); |
1120 | 976 | ||
diff --git a/drivers/usb/core/usb.h b/drivers/usb/core/usb.h index 13322e33f912..17830a81be14 100644 --- a/drivers/usb/core/usb.h +++ b/drivers/usb/core/usb.h | |||
@@ -64,14 +64,13 @@ static inline void usb_pm_unlock(struct usb_device *udev) {} | |||
64 | 64 | ||
65 | #define USB_AUTOSUSPEND_DELAY (HZ*2) | 65 | #define USB_AUTOSUSPEND_DELAY (HZ*2) |
66 | 66 | ||
67 | extern void usb_autosuspend_device(struct usb_device *udev, int dec_busy_cnt); | 67 | extern void usb_autosuspend_device(struct usb_device *udev); |
68 | extern int usb_autoresume_device(struct usb_device *udev, int inc_busy_cnt); | 68 | extern int usb_autoresume_device(struct usb_device *udev); |
69 | 69 | ||
70 | #else | 70 | #else |
71 | 71 | ||
72 | #define usb_autosuspend_device(udev, dec_busy_cnt) do {} while (0) | 72 | #define usb_autosuspend_device(udev) do {} while (0) |
73 | static inline int usb_autoresume_device(struct usb_device *udev, | 73 | static inline int usb_autoresume_device(struct usb_device *udev) |
74 | int inc_busy_cnt) | ||
75 | { | 74 | { |
76 | return 0; | 75 | return 0; |
77 | } | 76 | } |
diff --git a/drivers/usb/gadget/ether.c b/drivers/usb/gadget/ether.c index 107119c54301..d15bf22b9a03 100644 --- a/drivers/usb/gadget/ether.c +++ b/drivers/usb/gadget/ether.c | |||
@@ -1894,13 +1894,13 @@ static int eth_start_xmit (struct sk_buff *skb, struct net_device *net) | |||
1894 | if (!eth_is_promisc (dev)) { | 1894 | if (!eth_is_promisc (dev)) { |
1895 | u8 *dest = skb->data; | 1895 | u8 *dest = skb->data; |
1896 | 1896 | ||
1897 | if (dest [0] & 0x01) { | 1897 | if (is_multicast_ether_addr(dest)) { |
1898 | u16 type; | 1898 | u16 type; |
1899 | 1899 | ||
1900 | /* ignores USB_CDC_PACKET_TYPE_MULTICAST and host | 1900 | /* ignores USB_CDC_PACKET_TYPE_MULTICAST and host |
1901 | * SET_ETHERNET_MULTICAST_FILTERS requests | 1901 | * SET_ETHERNET_MULTICAST_FILTERS requests |
1902 | */ | 1902 | */ |
1903 | if (memcmp (dest, net->broadcast, ETH_ALEN) == 0) | 1903 | if (is_broadcast_ether_addr(dest)) |
1904 | type = USB_CDC_PACKET_TYPE_BROADCAST; | 1904 | type = USB_CDC_PACKET_TYPE_BROADCAST; |
1905 | else | 1905 | else |
1906 | type = USB_CDC_PACKET_TYPE_ALL_MULTICAST; | 1906 | type = USB_CDC_PACKET_TYPE_ALL_MULTICAST; |
diff --git a/drivers/usb/gadget/lh7a40x_udc.c b/drivers/usb/gadget/lh7a40x_udc.c index 179259664c18..4a991564a03e 100644 --- a/drivers/usb/gadget/lh7a40x_udc.c +++ b/drivers/usb/gadget/lh7a40x_udc.c | |||
@@ -83,7 +83,6 @@ static int lh7a40x_queue(struct usb_ep *ep, struct usb_request *, gfp_t); | |||
83 | static int lh7a40x_dequeue(struct usb_ep *ep, struct usb_request *); | 83 | static int lh7a40x_dequeue(struct usb_ep *ep, struct usb_request *); |
84 | static int lh7a40x_set_halt(struct usb_ep *ep, int); | 84 | static int lh7a40x_set_halt(struct usb_ep *ep, int); |
85 | static int lh7a40x_fifo_status(struct usb_ep *ep); | 85 | static int lh7a40x_fifo_status(struct usb_ep *ep); |
86 | static int lh7a40x_fifo_status(struct usb_ep *ep); | ||
87 | static void lh7a40x_fifo_flush(struct usb_ep *ep); | 86 | static void lh7a40x_fifo_flush(struct usb_ep *ep); |
88 | static void lh7a40x_ep0_kick(struct lh7a40x_udc *dev, struct lh7a40x_ep *ep); | 87 | static void lh7a40x_ep0_kick(struct lh7a40x_udc *dev, struct lh7a40x_ep *ep); |
89 | static void lh7a40x_handle_ep0(struct lh7a40x_udc *dev, u32 intr); | 88 | static void lh7a40x_handle_ep0(struct lh7a40x_udc *dev, u32 intr); |
diff --git a/drivers/usb/gadget/net2280.c b/drivers/usb/gadget/net2280.c index 3acc896a5d4c..0b590831582c 100644 --- a/drivers/usb/gadget/net2280.c +++ b/drivers/usb/gadget/net2280.c | |||
@@ -1040,6 +1040,7 @@ net2280_queue (struct usb_ep *_ep, struct usb_request *_req, gfp_t gfp_flags) | |||
1040 | 1040 | ||
1041 | } /* else the irq handler advances the queue. */ | 1041 | } /* else the irq handler advances the queue. */ |
1042 | 1042 | ||
1043 | ep->responded = 1; | ||
1043 | if (req) | 1044 | if (req) |
1044 | list_add_tail (&req->queue, &ep->queue); | 1045 | list_add_tail (&req->queue, &ep->queue); |
1045 | done: | 1046 | done: |
@@ -2188,7 +2189,8 @@ static void handle_ep_small (struct net2280_ep *ep) | |||
2188 | ep->stopped = 1; | 2189 | ep->stopped = 1; |
2189 | set_halt (ep); | 2190 | set_halt (ep); |
2190 | mode = 2; | 2191 | mode = 2; |
2191 | } else if (!req && !ep->stopped) | 2192 | } else if (ep->responded && |
2193 | !req && !ep->stopped) | ||
2192 | write_fifo (ep, NULL); | 2194 | write_fifo (ep, NULL); |
2193 | } | 2195 | } |
2194 | } else { | 2196 | } else { |
@@ -2203,7 +2205,7 @@ static void handle_ep_small (struct net2280_ep *ep) | |||
2203 | } else if (((t & (1 << DATA_OUT_PING_TOKEN_INTERRUPT)) | 2205 | } else if (((t & (1 << DATA_OUT_PING_TOKEN_INTERRUPT)) |
2204 | && req | 2206 | && req |
2205 | && req->req.actual == req->req.length) | 2207 | && req->req.actual == req->req.length) |
2206 | || !req) { | 2208 | || (ep->responded && !req)) { |
2207 | ep->dev->protocol_stall = 1; | 2209 | ep->dev->protocol_stall = 1; |
2208 | set_halt (ep); | 2210 | set_halt (ep); |
2209 | ep->stopped = 1; | 2211 | ep->stopped = 1; |
@@ -2469,6 +2471,7 @@ static void handle_stat0_irqs (struct net2280 *dev, u32 stat) | |||
2469 | /* we made the hardware handle most lowlevel requests; | 2471 | /* we made the hardware handle most lowlevel requests; |
2470 | * everything else goes uplevel to the gadget code. | 2472 | * everything else goes uplevel to the gadget code. |
2471 | */ | 2473 | */ |
2474 | ep->responded = 1; | ||
2472 | switch (u.r.bRequest) { | 2475 | switch (u.r.bRequest) { |
2473 | case USB_REQ_GET_STATUS: { | 2476 | case USB_REQ_GET_STATUS: { |
2474 | struct net2280_ep *e; | 2477 | struct net2280_ep *e; |
@@ -2537,6 +2540,7 @@ delegate: | |||
2537 | u.r.bRequestType, u.r.bRequest, | 2540 | u.r.bRequestType, u.r.bRequest, |
2538 | w_value, w_index, w_length, | 2541 | w_value, w_index, w_length, |
2539 | readl (&ep->regs->ep_cfg)); | 2542 | readl (&ep->regs->ep_cfg)); |
2543 | ep->responded = 0; | ||
2540 | spin_unlock (&dev->lock); | 2544 | spin_unlock (&dev->lock); |
2541 | tmp = dev->driver->setup (&dev->gadget, &u.r); | 2545 | tmp = dev->driver->setup (&dev->gadget, &u.r); |
2542 | spin_lock (&dev->lock); | 2546 | spin_lock (&dev->lock); |
diff --git a/drivers/usb/gadget/net2280.h b/drivers/usb/gadget/net2280.h index 957d6df34015..44ca139983d8 100644 --- a/drivers/usb/gadget/net2280.h +++ b/drivers/usb/gadget/net2280.h | |||
@@ -110,7 +110,8 @@ struct net2280_ep { | |||
110 | out_overflow : 1, | 110 | out_overflow : 1, |
111 | stopped : 1, | 111 | stopped : 1, |
112 | is_in : 1, | 112 | is_in : 1, |
113 | is_iso : 1; | 113 | is_iso : 1, |
114 | responded : 1; | ||
114 | }; | 115 | }; |
115 | 116 | ||
116 | static inline void allow_status (struct net2280_ep *ep) | 117 | static inline void allow_status (struct net2280_ep *ep) |
diff --git a/drivers/usb/gadget/pxa2xx_udc.c b/drivers/usb/gadget/pxa2xx_udc.c index 671c24bc6d75..1ed506e95985 100644 --- a/drivers/usb/gadget/pxa2xx_udc.c +++ b/drivers/usb/gadget/pxa2xx_udc.c | |||
@@ -2472,6 +2472,7 @@ static struct pxa2xx_udc memory = { | |||
2472 | #define PXA210_B1 0x00000123 | 2472 | #define PXA210_B1 0x00000123 |
2473 | #define PXA210_B0 0x00000122 | 2473 | #define PXA210_B0 0x00000122 |
2474 | #define IXP425_A0 0x000001c1 | 2474 | #define IXP425_A0 0x000001c1 |
2475 | #define IXP425_B0 0x000001f1 | ||
2475 | #define IXP465_AD 0x00000200 | 2476 | #define IXP465_AD 0x00000200 |
2476 | 2477 | ||
2477 | /* | 2478 | /* |
@@ -2509,6 +2510,7 @@ static int __init pxa2xx_udc_probe(struct platform_device *pdev) | |||
2509 | break; | 2510 | break; |
2510 | #elif defined(CONFIG_ARCH_IXP4XX) | 2511 | #elif defined(CONFIG_ARCH_IXP4XX) |
2511 | case IXP425_A0: | 2512 | case IXP425_A0: |
2513 | case IXP425_B0: | ||
2512 | case IXP465_AD: | 2514 | case IXP465_AD: |
2513 | dev->has_cfr = 1; | 2515 | dev->has_cfr = 1; |
2514 | out_dma = 0; | 2516 | out_dma = 0; |
diff --git a/drivers/usb/host/Kconfig b/drivers/usb/host/Kconfig index cf10cbc98f80..cc60759083bf 100644 --- a/drivers/usb/host/Kconfig +++ b/drivers/usb/host/Kconfig | |||
@@ -153,7 +153,7 @@ config USB_U132_HCD | |||
153 | adapter will *NOT* work with PC cards that do not contain an OHCI | 153 | adapter will *NOT* work with PC cards that do not contain an OHCI |
154 | controller. | 154 | controller. |
155 | 155 | ||
156 | For those PC cards that contain multiple OHCI controllers only ther | 156 | For those PC cards that contain multiple OHCI controllers only the |
157 | first one is used. | 157 | first one is used. |
158 | 158 | ||
159 | The driver consists of two modules, the "ftdi-elan" module is a | 159 | The driver consists of two modules, the "ftdi-elan" module is a |
diff --git a/drivers/usb/host/ehci-hcd.c b/drivers/usb/host/ehci-hcd.c index 9030994aba98..025d33313681 100644 --- a/drivers/usb/host/ehci-hcd.c +++ b/drivers/usb/host/ehci-hcd.c | |||
@@ -126,6 +126,11 @@ static unsigned park = 0; | |||
126 | module_param (park, uint, S_IRUGO); | 126 | module_param (park, uint, S_IRUGO); |
127 | MODULE_PARM_DESC (park, "park setting; 1-3 back-to-back async packets"); | 127 | MODULE_PARM_DESC (park, "park setting; 1-3 back-to-back async packets"); |
128 | 128 | ||
129 | /* for flakey hardware, ignore overcurrent indicators */ | ||
130 | static int ignore_oc = 0; | ||
131 | module_param (ignore_oc, bool, S_IRUGO); | ||
132 | MODULE_PARM_DESC (ignore_oc, "ignore bogus hardware overcurrent indications"); | ||
133 | |||
129 | #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) | 134 | #define INTR_MASK (STS_IAA | STS_FATAL | STS_PCD | STS_ERR | STS_INT) |
130 | 135 | ||
131 | /*-------------------------------------------------------------------------*/ | 136 | /*-------------------------------------------------------------------------*/ |
@@ -541,9 +546,10 @@ static int ehci_run (struct usb_hcd *hcd) | |||
541 | 546 | ||
542 | temp = HC_VERSION(readl (&ehci->caps->hc_capbase)); | 547 | temp = HC_VERSION(readl (&ehci->caps->hc_capbase)); |
543 | ehci_info (ehci, | 548 | ehci_info (ehci, |
544 | "USB %x.%x started, EHCI %x.%02x, driver %s\n", | 549 | "USB %x.%x started, EHCI %x.%02x, driver %s%s\n", |
545 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), | 550 | ((ehci->sbrn & 0xf0)>>4), (ehci->sbrn & 0x0f), |
546 | temp >> 8, temp & 0xff, DRIVER_VERSION); | 551 | temp >> 8, temp & 0xff, DRIVER_VERSION, |
552 | ignore_oc ? ", overcurrent ignored" : ""); | ||
547 | 553 | ||
548 | writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */ | 554 | writel (INTR_MASK, &ehci->regs->intr_enable); /* Turn On Interrupts */ |
549 | 555 | ||
@@ -613,9 +619,8 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
613 | unsigned i = HCS_N_PORTS (ehci->hcs_params); | 619 | unsigned i = HCS_N_PORTS (ehci->hcs_params); |
614 | 620 | ||
615 | /* resume root hub? */ | 621 | /* resume root hub? */ |
616 | status = readl (&ehci->regs->command); | 622 | if (!(readl(&ehci->regs->command) & CMD_RUN)) |
617 | if (!(status & CMD_RUN)) | 623 | usb_hcd_resume_root_hub(hcd); |
618 | writel (status | CMD_RUN, &ehci->regs->command); | ||
619 | 624 | ||
620 | while (i--) { | 625 | while (i--) { |
621 | int pstatus = readl (&ehci->regs->port_status [i]); | 626 | int pstatus = readl (&ehci->regs->port_status [i]); |
@@ -632,7 +637,6 @@ static irqreturn_t ehci_irq (struct usb_hcd *hcd) | |||
632 | */ | 637 | */ |
633 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); | 638 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); |
634 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); | 639 | ehci_dbg (ehci, "port %d remote wakeup\n", i + 1); |
635 | usb_hcd_resume_root_hub(hcd); | ||
636 | } | 640 | } |
637 | } | 641 | } |
638 | 642 | ||
diff --git a/drivers/usb/host/ehci-hub.c b/drivers/usb/host/ehci-hub.c index 1b20722c102b..bfe5f307cba6 100644 --- a/drivers/usb/host/ehci-hub.c +++ b/drivers/usb/host/ehci-hub.c | |||
@@ -34,6 +34,7 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
34 | { | 34 | { |
35 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 35 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
36 | int port; | 36 | int port; |
37 | int mask; | ||
37 | 38 | ||
38 | if (time_before (jiffies, ehci->next_statechange)) | 39 | if (time_before (jiffies, ehci->next_statechange)) |
39 | msleep(5); | 40 | msleep(5); |
@@ -51,14 +52,25 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
51 | ehci->reclaim_ready = 1; | 52 | ehci->reclaim_ready = 1; |
52 | ehci_work(ehci); | 53 | ehci_work(ehci); |
53 | 54 | ||
54 | /* suspend any active/unsuspended ports, maybe allow wakeup */ | 55 | /* Unlike other USB host controller types, EHCI doesn't have |
56 | * any notion of "global" or bus-wide suspend. The driver has | ||
57 | * to manually suspend all the active unsuspended ports, and | ||
58 | * then manually resume them in the bus_resume() routine. | ||
59 | */ | ||
60 | ehci->bus_suspended = 0; | ||
55 | while (port--) { | 61 | while (port--) { |
56 | u32 __iomem *reg = &ehci->regs->port_status [port]; | 62 | u32 __iomem *reg = &ehci->regs->port_status [port]; |
57 | u32 t1 = readl (reg) & ~PORT_RWC_BITS; | 63 | u32 t1 = readl (reg) & ~PORT_RWC_BITS; |
58 | u32 t2 = t1; | 64 | u32 t2 = t1; |
59 | 65 | ||
60 | if ((t1 & PORT_PE) && !(t1 & PORT_OWNER)) | 66 | /* keep track of which ports we suspend */ |
67 | if ((t1 & PORT_PE) && !(t1 & PORT_OWNER) && | ||
68 | !(t1 & PORT_SUSPEND)) { | ||
61 | t2 |= PORT_SUSPEND; | 69 | t2 |= PORT_SUSPEND; |
70 | set_bit(port, &ehci->bus_suspended); | ||
71 | } | ||
72 | |||
73 | /* enable remote wakeup on all ports */ | ||
62 | if (device_may_wakeup(&hcd->self.root_hub->dev)) | 74 | if (device_may_wakeup(&hcd->self.root_hub->dev)) |
63 | t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E; | 75 | t2 |= PORT_WKOC_E|PORT_WKDISC_E|PORT_WKCONN_E; |
64 | else | 76 | else |
@@ -76,6 +88,13 @@ static int ehci_bus_suspend (struct usb_hcd *hcd) | |||
76 | ehci_halt (ehci); | 88 | ehci_halt (ehci); |
77 | hcd->state = HC_STATE_SUSPENDED; | 89 | hcd->state = HC_STATE_SUSPENDED; |
78 | 90 | ||
91 | /* allow remote wakeup */ | ||
92 | mask = INTR_MASK; | ||
93 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) | ||
94 | mask &= ~STS_PCD; | ||
95 | writel(mask, &ehci->regs->intr_enable); | ||
96 | readl(&ehci->regs->intr_enable); | ||
97 | |||
79 | ehci->next_statechange = jiffies + msecs_to_jiffies(10); | 98 | ehci->next_statechange = jiffies + msecs_to_jiffies(10); |
80 | spin_unlock_irq (&ehci->lock); | 99 | spin_unlock_irq (&ehci->lock); |
81 | return 0; | 100 | return 0; |
@@ -88,7 +107,6 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
88 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 107 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
89 | u32 temp; | 108 | u32 temp; |
90 | int i; | 109 | int i; |
91 | int intr_enable; | ||
92 | 110 | ||
93 | if (time_before (jiffies, ehci->next_statechange)) | 111 | if (time_before (jiffies, ehci->next_statechange)) |
94 | msleep(5); | 112 | msleep(5); |
@@ -100,31 +118,30 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
100 | * the last user of the controller, not reset/pm hardware keeping | 118 | * the last user of the controller, not reset/pm hardware keeping |
101 | * state we gave to it. | 119 | * state we gave to it. |
102 | */ | 120 | */ |
121 | temp = readl(&ehci->regs->intr_enable); | ||
122 | ehci_dbg(ehci, "resume root hub%s\n", temp ? "" : " after power loss"); | ||
103 | 123 | ||
104 | /* re-init operational registers in case we lost power */ | 124 | /* at least some APM implementations will try to deliver |
105 | if (readl (&ehci->regs->intr_enable) == 0) { | 125 | * IRQs right away, so delay them until we're ready. |
106 | /* at least some APM implementations will try to deliver | 126 | */ |
107 | * IRQs right away, so delay them until we're ready. | 127 | writel(0, &ehci->regs->intr_enable); |
108 | */ | 128 | |
109 | intr_enable = 1; | 129 | /* re-init operational registers */ |
110 | writel (0, &ehci->regs->segment); | 130 | writel(0, &ehci->regs->segment); |
111 | writel (ehci->periodic_dma, &ehci->regs->frame_list); | 131 | writel(ehci->periodic_dma, &ehci->regs->frame_list); |
112 | writel ((u32)ehci->async->qh_dma, &ehci->regs->async_next); | 132 | writel((u32) ehci->async->qh_dma, &ehci->regs->async_next); |
113 | } else | ||
114 | intr_enable = 0; | ||
115 | ehci_dbg(ehci, "resume root hub%s\n", | ||
116 | intr_enable ? " after power loss" : ""); | ||
117 | 133 | ||
118 | /* restore CMD_RUN, framelist size, and irq threshold */ | 134 | /* restore CMD_RUN, framelist size, and irq threshold */ |
119 | writel (ehci->command, &ehci->regs->command); | 135 | writel (ehci->command, &ehci->regs->command); |
120 | 136 | ||
121 | /* take ports out of suspend */ | 137 | /* manually resume the ports we suspended during bus_suspend() */ |
122 | i = HCS_N_PORTS (ehci->hcs_params); | 138 | i = HCS_N_PORTS (ehci->hcs_params); |
123 | while (i--) { | 139 | while (i--) { |
124 | temp = readl (&ehci->regs->port_status [i]); | 140 | temp = readl (&ehci->regs->port_status [i]); |
125 | temp &= ~(PORT_RWC_BITS | 141 | temp &= ~(PORT_RWC_BITS |
126 | | PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E); | 142 | | PORT_WKOC_E | PORT_WKDISC_E | PORT_WKCONN_E); |
127 | if (temp & PORT_SUSPEND) { | 143 | if (test_bit(i, &ehci->bus_suspended) && |
144 | (temp & PORT_SUSPEND)) { | ||
128 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); | 145 | ehci->reset_done [i] = jiffies + msecs_to_jiffies (20); |
129 | temp |= PORT_RESUME; | 146 | temp |= PORT_RESUME; |
130 | } | 147 | } |
@@ -134,11 +151,12 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
134 | mdelay (20); | 151 | mdelay (20); |
135 | while (i--) { | 152 | while (i--) { |
136 | temp = readl (&ehci->regs->port_status [i]); | 153 | temp = readl (&ehci->regs->port_status [i]); |
137 | if ((temp & PORT_SUSPEND) == 0) | 154 | if (test_bit(i, &ehci->bus_suspended) && |
138 | continue; | 155 | (temp & PORT_SUSPEND)) { |
139 | temp &= ~(PORT_RWC_BITS | PORT_RESUME); | 156 | temp &= ~(PORT_RWC_BITS | PORT_RESUME); |
140 | writel (temp, &ehci->regs->port_status [i]); | 157 | writel (temp, &ehci->regs->port_status [i]); |
141 | ehci_vdbg (ehci, "resumed port %d\n", i + 1); | 158 | ehci_vdbg (ehci, "resumed port %d\n", i + 1); |
159 | } | ||
142 | } | 160 | } |
143 | (void) readl (&ehci->regs->command); | 161 | (void) readl (&ehci->regs->command); |
144 | 162 | ||
@@ -157,8 +175,7 @@ static int ehci_bus_resume (struct usb_hcd *hcd) | |||
157 | hcd->state = HC_STATE_RUNNING; | 175 | hcd->state = HC_STATE_RUNNING; |
158 | 176 | ||
159 | /* Now we can safely re-enable irqs */ | 177 | /* Now we can safely re-enable irqs */ |
160 | if (intr_enable) | 178 | writel(INTR_MASK, &ehci->regs->intr_enable); |
161 | writel (INTR_MASK, &ehci->regs->intr_enable); | ||
162 | 179 | ||
163 | spin_unlock_irq (&ehci->lock); | 180 | spin_unlock_irq (&ehci->lock); |
164 | return 0; | 181 | return 0; |
@@ -218,6 +235,7 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
218 | { | 235 | { |
219 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); | 236 | struct ehci_hcd *ehci = hcd_to_ehci (hcd); |
220 | u32 temp, status = 0; | 237 | u32 temp, status = 0; |
238 | u32 mask; | ||
221 | int ports, i, retval = 1; | 239 | int ports, i, retval = 1; |
222 | unsigned long flags; | 240 | unsigned long flags; |
223 | 241 | ||
@@ -233,6 +251,18 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
233 | retval++; | 251 | retval++; |
234 | } | 252 | } |
235 | 253 | ||
254 | /* Some boards (mostly VIA?) report bogus overcurrent indications, | ||
255 | * causing massive log spam unless we completely ignore them. It | ||
256 | * may be relevant that VIA VT8235 controlers, where PORT_POWER is | ||
257 | * always set, seem to clear PORT_OCC and PORT_CSC when writing to | ||
258 | * PORT_POWER; that's surprising, but maybe within-spec. | ||
259 | */ | ||
260 | if (!ignore_oc) | ||
261 | mask = PORT_CSC | PORT_PEC | PORT_OCC; | ||
262 | else | ||
263 | mask = PORT_CSC | PORT_PEC; | ||
264 | // PORT_RESUME from hardware ~= PORT_STAT_C_SUSPEND | ||
265 | |||
236 | /* no hub change reports (bit 0) for now (power, ...) */ | 266 | /* no hub change reports (bit 0) for now (power, ...) */ |
237 | 267 | ||
238 | /* port N changes (bit N)? */ | 268 | /* port N changes (bit N)? */ |
@@ -250,8 +280,7 @@ ehci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
250 | } | 280 | } |
251 | if (!(temp & PORT_CONNECT)) | 281 | if (!(temp & PORT_CONNECT)) |
252 | ehci->reset_done [i] = 0; | 282 | ehci->reset_done [i] = 0; |
253 | if ((temp & (PORT_CSC | PORT_PEC | PORT_OCC)) != 0 | 283 | if ((temp & mask) != 0 |
254 | // PORT_STAT_C_SUSPEND? | ||
255 | || ((temp & PORT_RESUME) != 0 | 284 | || ((temp & PORT_RESUME) != 0 |
256 | && time_after (jiffies, | 285 | && time_after (jiffies, |
257 | ehci->reset_done [i]))) { | 286 | ehci->reset_done [i]))) { |
@@ -319,6 +348,7 @@ static int ehci_hub_control ( | |||
319 | u32 temp, status; | 348 | u32 temp, status; |
320 | unsigned long flags; | 349 | unsigned long flags; |
321 | int retval = 0; | 350 | int retval = 0; |
351 | unsigned selector; | ||
322 | 352 | ||
323 | /* | 353 | /* |
324 | * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR. | 354 | * FIXME: support SetPortFeatures USB_PORT_FEAT_INDICATOR. |
@@ -417,7 +447,7 @@ static int ehci_hub_control ( | |||
417 | status |= 1 << USB_PORT_FEAT_C_CONNECTION; | 447 | status |= 1 << USB_PORT_FEAT_C_CONNECTION; |
418 | if (temp & PORT_PEC) | 448 | if (temp & PORT_PEC) |
419 | status |= 1 << USB_PORT_FEAT_C_ENABLE; | 449 | status |= 1 << USB_PORT_FEAT_C_ENABLE; |
420 | if (temp & PORT_OCC) | 450 | if ((temp & PORT_OCC) && !ignore_oc) |
421 | status |= 1 << USB_PORT_FEAT_C_OVER_CURRENT; | 451 | status |= 1 << USB_PORT_FEAT_C_OVER_CURRENT; |
422 | 452 | ||
423 | /* whoever resumes must GetPortStatus to complete it!! */ | 453 | /* whoever resumes must GetPortStatus to complete it!! */ |
@@ -506,6 +536,8 @@ static int ehci_hub_control ( | |||
506 | } | 536 | } |
507 | break; | 537 | break; |
508 | case SetPortFeature: | 538 | case SetPortFeature: |
539 | selector = wIndex >> 8; | ||
540 | wIndex &= 0xff; | ||
509 | if (!wIndex || wIndex > ports) | 541 | if (!wIndex || wIndex > ports) |
510 | goto error; | 542 | goto error; |
511 | wIndex--; | 543 | wIndex--; |
@@ -559,6 +591,22 @@ static int ehci_hub_control ( | |||
559 | } | 591 | } |
560 | writel (temp, &ehci->regs->port_status [wIndex]); | 592 | writel (temp, &ehci->regs->port_status [wIndex]); |
561 | break; | 593 | break; |
594 | |||
595 | /* For downstream facing ports (these): one hub port is put | ||
596 | * into test mode according to USB2 11.24.2.13, then the hub | ||
597 | * must be reset (which for root hub now means rmmod+modprobe, | ||
598 | * or else system reboot). See EHCI 2.3.9 and 4.14 for info | ||
599 | * about the EHCI-specific stuff. | ||
600 | */ | ||
601 | case USB_PORT_FEAT_TEST: | ||
602 | if (!selector || selector > 5) | ||
603 | goto error; | ||
604 | ehci_quiesce(ehci); | ||
605 | ehci_halt(ehci); | ||
606 | temp |= selector << 16; | ||
607 | writel (temp, &ehci->regs->port_status [wIndex]); | ||
608 | break; | ||
609 | |||
562 | default: | 610 | default: |
563 | goto error; | 611 | goto error; |
564 | } | 612 | } |
diff --git a/drivers/usb/host/ehci-pci.c b/drivers/usb/host/ehci-pci.c index e51c1ed81ac4..4bc7970ba3ef 100644 --- a/drivers/usb/host/ehci-pci.c +++ b/drivers/usb/host/ehci-pci.c | |||
@@ -257,9 +257,7 @@ static int ehci_pci_suspend(struct usb_hcd *hcd, pm_message_t message) | |||
257 | static int ehci_pci_resume(struct usb_hcd *hcd) | 257 | static int ehci_pci_resume(struct usb_hcd *hcd) |
258 | { | 258 | { |
259 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); | 259 | struct ehci_hcd *ehci = hcd_to_ehci(hcd); |
260 | unsigned port; | ||
261 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); | 260 | struct pci_dev *pdev = to_pci_dev(hcd->self.controller); |
262 | int retval = -EINVAL; | ||
263 | 261 | ||
264 | // maybe restore FLADJ | 262 | // maybe restore FLADJ |
265 | 263 | ||
@@ -269,27 +267,19 @@ static int ehci_pci_resume(struct usb_hcd *hcd) | |||
269 | /* Mark hardware accessible again as we are out of D3 state by now */ | 267 | /* Mark hardware accessible again as we are out of D3 state by now */ |
270 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); | 268 | set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags); |
271 | 269 | ||
272 | /* If CF is clear, we lost PCI Vaux power and need to restart. */ | 270 | /* If CF is still set, we maintained PCI Vaux power. |
273 | if (readl(&ehci->regs->configured_flag) != FLAG_CF) | 271 | * Just undo the effect of ehci_pci_suspend(). |
274 | goto restart; | ||
275 | |||
276 | /* If any port is suspended (or owned by the companion), | ||
277 | * we know we can/must resume the HC (and mustn't reset it). | ||
278 | * We just defer that to the root hub code. | ||
279 | */ | 272 | */ |
280 | for (port = HCS_N_PORTS(ehci->hcs_params); port > 0; ) { | 273 | if (readl(&ehci->regs->configured_flag) == FLAG_CF) { |
281 | u32 status; | 274 | int mask = INTR_MASK; |
282 | port--; | 275 | |
283 | status = readl(&ehci->regs->port_status [port]); | 276 | if (!device_may_wakeup(&hcd->self.root_hub->dev)) |
284 | if (!(status & PORT_POWER)) | 277 | mask &= ~STS_PCD; |
285 | continue; | 278 | writel(mask, &ehci->regs->intr_enable); |
286 | if (status & (PORT_SUSPEND | PORT_RESUME | PORT_OWNER)) { | 279 | readl(&ehci->regs->intr_enable); |
287 | usb_hcd_resume_root_hub(hcd); | 280 | return 0; |
288 | return 0; | ||
289 | } | ||
290 | } | 281 | } |
291 | 282 | ||
292 | restart: | ||
293 | ehci_dbg(ehci, "lost power, restarting\n"); | 283 | ehci_dbg(ehci, "lost power, restarting\n"); |
294 | usb_root_hub_lost_power(hcd->self.root_hub); | 284 | usb_root_hub_lost_power(hcd->self.root_hub); |
295 | 285 | ||
@@ -307,13 +297,15 @@ restart: | |||
307 | ehci_work(ehci); | 297 | ehci_work(ehci); |
308 | spin_unlock_irq(&ehci->lock); | 298 | spin_unlock_irq(&ehci->lock); |
309 | 299 | ||
310 | /* restart; khubd will disconnect devices */ | ||
311 | retval = ehci_run(hcd); | ||
312 | |||
313 | /* here we "know" root ports should always stay powered */ | 300 | /* here we "know" root ports should always stay powered */ |
314 | ehci_port_power(ehci, 1); | 301 | ehci_port_power(ehci, 1); |
315 | 302 | ||
316 | return retval; | 303 | writel(ehci->command, &ehci->regs->command); |
304 | writel(FLAG_CF, &ehci->regs->configured_flag); | ||
305 | readl(&ehci->regs->command); /* unblock posted writes */ | ||
306 | |||
307 | hcd->state = HC_STATE_SUSPENDED; | ||
308 | return 0; | ||
317 | } | 309 | } |
318 | #endif | 310 | #endif |
319 | 311 | ||
diff --git a/drivers/usb/host/ehci.h b/drivers/usb/host/ehci.h index bbc3082a73d7..74dbc6c8228f 100644 --- a/drivers/usb/host/ehci.h +++ b/drivers/usb/host/ehci.h | |||
@@ -74,6 +74,7 @@ struct ehci_hcd { /* one per controller */ | |||
74 | 74 | ||
75 | /* per root hub port */ | 75 | /* per root hub port */ |
76 | unsigned long reset_done [EHCI_MAX_ROOT_PORTS]; | 76 | unsigned long reset_done [EHCI_MAX_ROOT_PORTS]; |
77 | unsigned long bus_suspended; | ||
77 | 78 | ||
78 | /* per-HC memory pools (could be per-bus, but ...) */ | 79 | /* per-HC memory pools (could be per-bus, but ...) */ |
79 | struct dma_pool *qh_pool; /* qh per active urb */ | 80 | struct dma_pool *qh_pool; /* qh per active urb */ |
diff --git a/drivers/usb/host/ohci-hcd.c b/drivers/usb/host/ohci-hcd.c index ea4714e557e4..a95275a401b1 100644 --- a/drivers/usb/host/ohci-hcd.c +++ b/drivers/usb/host/ohci-hcd.c | |||
@@ -729,6 +729,16 @@ static irqreturn_t ohci_irq (struct usb_hcd *hcd) | |||
729 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; | 729 | ohci->next_statechange = jiffies + STATECHANGE_DELAY; |
730 | ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, | 730 | ohci_writel(ohci, OHCI_INTR_RD | OHCI_INTR_RHSC, |
731 | ®s->intrstatus); | 731 | ®s->intrstatus); |
732 | |||
733 | /* NOTE: Vendors didn't always make the same implementation | ||
734 | * choices for RHSC. Many followed the spec; RHSC triggers | ||
735 | * on an edge, like setting and maybe clearing a port status | ||
736 | * change bit. With others it's level-triggered, active | ||
737 | * until khubd clears all the port status change bits. We'll | ||
738 | * always disable it here and rely on polling until khubd | ||
739 | * re-enables it. | ||
740 | */ | ||
741 | ohci_writel(ohci, OHCI_INTR_RHSC, ®s->intrdisable); | ||
732 | usb_hcd_poll_rh_status(hcd); | 742 | usb_hcd_poll_rh_status(hcd); |
733 | } | 743 | } |
734 | 744 | ||
diff --git a/drivers/usb/host/ohci-hub.c b/drivers/usb/host/ohci-hub.c index 6995ea36f2e8..2441642cb7b4 100644 --- a/drivers/usb/host/ohci-hub.c +++ b/drivers/usb/host/ohci-hub.c | |||
@@ -41,7 +41,11 @@ static void ohci_rhsc_enable (struct usb_hcd *hcd) | |||
41 | { | 41 | { |
42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 42 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
43 | 43 | ||
44 | ohci_writel (ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | 44 | spin_lock_irq(&ohci->lock); |
45 | if (!ohci->autostop) | ||
46 | del_timer(&hcd->rh_timer); /* Prevent next poll */ | ||
47 | ohci_writel(ohci, OHCI_INTR_RHSC, &ohci->regs->intrenable); | ||
48 | spin_unlock_irq(&ohci->lock); | ||
45 | } | 49 | } |
46 | 50 | ||
47 | #define OHCI_SCHED_ENABLES \ | 51 | #define OHCI_SCHED_ENABLES \ |
@@ -50,6 +54,9 @@ static void ohci_rhsc_enable (struct usb_hcd *hcd) | |||
50 | static void dl_done_list (struct ohci_hcd *); | 54 | static void dl_done_list (struct ohci_hcd *); |
51 | static void finish_unlinks (struct ohci_hcd *, u16); | 55 | static void finish_unlinks (struct ohci_hcd *, u16); |
52 | 56 | ||
57 | #ifdef CONFIG_PM | ||
58 | static int ohci_restart(struct ohci_hcd *ohci); | ||
59 | |||
53 | static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) | 60 | static int ohci_rh_suspend (struct ohci_hcd *ohci, int autostop) |
54 | __releases(ohci->lock) | 61 | __releases(ohci->lock) |
55 | __acquires(ohci->lock) | 62 | __acquires(ohci->lock) |
@@ -132,8 +139,6 @@ static inline struct ed *find_head (struct ed *ed) | |||
132 | return ed; | 139 | return ed; |
133 | } | 140 | } |
134 | 141 | ||
135 | static int ohci_restart (struct ohci_hcd *ohci); | ||
136 | |||
137 | /* caller has locked the root hub */ | 142 | /* caller has locked the root hub */ |
138 | static int ohci_rh_resume (struct ohci_hcd *ohci) | 143 | static int ohci_rh_resume (struct ohci_hcd *ohci) |
139 | __releases(ohci->lock) | 144 | __releases(ohci->lock) |
@@ -169,7 +174,7 @@ __acquires(ohci->lock) | |||
169 | break; | 174 | break; |
170 | case OHCI_USB_RESUME: | 175 | case OHCI_USB_RESUME: |
171 | /* HCFS changes sometime after INTR_RD */ | 176 | /* HCFS changes sometime after INTR_RD */ |
172 | ohci_info(ohci, "%swakeup\n", | 177 | ohci_dbg(ohci, "%swakeup root hub\n", |
173 | autostopped ? "auto-" : ""); | 178 | autostopped ? "auto-" : ""); |
174 | break; | 179 | break; |
175 | case OHCI_USB_OPER: | 180 | case OHCI_USB_OPER: |
@@ -181,7 +186,6 @@ __acquires(ohci->lock) | |||
181 | ohci_dbg (ohci, "lost power\n"); | 186 | ohci_dbg (ohci, "lost power\n"); |
182 | status = -EBUSY; | 187 | status = -EBUSY; |
183 | } | 188 | } |
184 | #ifdef CONFIG_PM | ||
185 | if (status == -EBUSY) { | 189 | if (status == -EBUSY) { |
186 | if (!autostopped) { | 190 | if (!autostopped) { |
187 | spin_unlock_irq (&ohci->lock); | 191 | spin_unlock_irq (&ohci->lock); |
@@ -191,25 +195,12 @@ __acquires(ohci->lock) | |||
191 | } | 195 | } |
192 | return status; | 196 | return status; |
193 | } | 197 | } |
194 | #endif | ||
195 | if (status != -EINPROGRESS) | 198 | if (status != -EINPROGRESS) |
196 | return status; | 199 | return status; |
197 | if (autostopped) | 200 | if (autostopped) |
198 | goto skip_resume; | 201 | goto skip_resume; |
199 | spin_unlock_irq (&ohci->lock); | 202 | spin_unlock_irq (&ohci->lock); |
200 | 203 | ||
201 | temp = ohci->num_ports; | ||
202 | while (temp--) { | ||
203 | u32 stat = ohci_readl (ohci, | ||
204 | &ohci->regs->roothub.portstatus [temp]); | ||
205 | |||
206 | /* force global, not selective, resume */ | ||
207 | if (!(stat & RH_PS_PSS)) | ||
208 | continue; | ||
209 | ohci_writel (ohci, RH_PS_POCI, | ||
210 | &ohci->regs->roothub.portstatus [temp]); | ||
211 | } | ||
212 | |||
213 | /* Some controllers (lucent erratum) need extra-long delays */ | 204 | /* Some controllers (lucent erratum) need extra-long delays */ |
214 | msleep (20 /* usb 11.5.1.10 */ + 12 /* 32 msec counter */ + 1); | 205 | msleep (20 /* usb 11.5.1.10 */ + 12 /* 32 msec counter */ + 1); |
215 | 206 | ||
@@ -217,6 +208,7 @@ __acquires(ohci->lock) | |||
217 | temp &= OHCI_CTRL_HCFS; | 208 | temp &= OHCI_CTRL_HCFS; |
218 | if (temp != OHCI_USB_RESUME) { | 209 | if (temp != OHCI_USB_RESUME) { |
219 | ohci_err (ohci, "controller won't resume\n"); | 210 | ohci_err (ohci, "controller won't resume\n"); |
211 | spin_lock_irq(&ohci->lock); | ||
220 | return -EBUSY; | 212 | return -EBUSY; |
221 | } | 213 | } |
222 | 214 | ||
@@ -296,8 +288,6 @@ skip_resume: | |||
296 | return 0; | 288 | return 0; |
297 | } | 289 | } |
298 | 290 | ||
299 | #ifdef CONFIG_PM | ||
300 | |||
301 | static int ohci_bus_suspend (struct usb_hcd *hcd) | 291 | static int ohci_bus_suspend (struct usb_hcd *hcd) |
302 | { | 292 | { |
303 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 293 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
@@ -335,6 +325,83 @@ static int ohci_bus_resume (struct usb_hcd *hcd) | |||
335 | return rc; | 325 | return rc; |
336 | } | 326 | } |
337 | 327 | ||
328 | /* Carry out polling-, autostop-, and autoresume-related state changes */ | ||
329 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | ||
330 | int any_connected) | ||
331 | { | ||
332 | int poll_rh = 1; | ||
333 | |||
334 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | ||
335 | |||
336 | case OHCI_USB_OPER: | ||
337 | /* keep on polling until we know a device is connected | ||
338 | * and RHSC is enabled */ | ||
339 | if (!ohci->autostop) { | ||
340 | if (any_connected || | ||
341 | !device_may_wakeup(&ohci_to_hcd(ohci) | ||
342 | ->self.root_hub->dev)) { | ||
343 | if (ohci_readl(ohci, &ohci->regs->intrenable) & | ||
344 | OHCI_INTR_RHSC) | ||
345 | poll_rh = 0; | ||
346 | } else { | ||
347 | ohci->autostop = 1; | ||
348 | ohci->next_statechange = jiffies + HZ; | ||
349 | } | ||
350 | |||
351 | /* if no devices have been attached for one second, autostop */ | ||
352 | } else { | ||
353 | if (changed || any_connected) { | ||
354 | ohci->autostop = 0; | ||
355 | ohci->next_statechange = jiffies + | ||
356 | STATECHANGE_DELAY; | ||
357 | } else if (time_after_eq(jiffies, | ||
358 | ohci->next_statechange) | ||
359 | && !ohci->ed_rm_list | ||
360 | && !(ohci->hc_control & | ||
361 | OHCI_SCHED_ENABLES)) { | ||
362 | ohci_rh_suspend(ohci, 1); | ||
363 | } | ||
364 | } | ||
365 | break; | ||
366 | |||
367 | /* if there is a port change, autostart or ask to be resumed */ | ||
368 | case OHCI_USB_SUSPEND: | ||
369 | case OHCI_USB_RESUME: | ||
370 | if (changed) { | ||
371 | if (ohci->autostop) | ||
372 | ohci_rh_resume(ohci); | ||
373 | else | ||
374 | usb_hcd_resume_root_hub(ohci_to_hcd(ohci)); | ||
375 | } else { | ||
376 | /* everything is idle, no need for polling */ | ||
377 | poll_rh = 0; | ||
378 | } | ||
379 | break; | ||
380 | } | ||
381 | return poll_rh; | ||
382 | } | ||
383 | |||
384 | #else /* CONFIG_PM */ | ||
385 | |||
386 | static inline int ohci_rh_resume(struct ohci_hcd *ohci) | ||
387 | { | ||
388 | return 0; | ||
389 | } | ||
390 | |||
391 | /* Carry out polling-related state changes. | ||
392 | * autostop isn't used when CONFIG_PM is turned off. | ||
393 | */ | ||
394 | static int ohci_root_hub_state_changes(struct ohci_hcd *ohci, int changed, | ||
395 | int any_connected) | ||
396 | { | ||
397 | int poll_rh = 1; | ||
398 | |||
399 | /* keep on polling until RHSC is enabled */ | ||
400 | if (ohci_readl(ohci, &ohci->regs->intrenable) & OHCI_INTR_RHSC) | ||
401 | poll_rh = 0; | ||
402 | return poll_rh; | ||
403 | } | ||
404 | |||
338 | #endif /* CONFIG_PM */ | 405 | #endif /* CONFIG_PM */ |
339 | 406 | ||
340 | /*-------------------------------------------------------------------------*/ | 407 | /*-------------------------------------------------------------------------*/ |
@@ -346,7 +413,7 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
346 | { | 413 | { |
347 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); | 414 | struct ohci_hcd *ohci = hcd_to_ohci (hcd); |
348 | int i, changed = 0, length = 1; | 415 | int i, changed = 0, length = 1; |
349 | int any_connected = 0, rhsc_enabled = 1; | 416 | int any_connected = 0; |
350 | unsigned long flags; | 417 | unsigned long flags; |
351 | 418 | ||
352 | spin_lock_irqsave (&ohci->lock, flags); | 419 | spin_lock_irqsave (&ohci->lock, flags); |
@@ -387,67 +454,8 @@ ohci_hub_status_data (struct usb_hcd *hcd, char *buf) | |||
387 | } | 454 | } |
388 | } | 455 | } |
389 | 456 | ||
390 | /* NOTE: vendors didn't always make the same implementation | 457 | hcd->poll_rh = ohci_root_hub_state_changes(ohci, changed, |
391 | * choices for RHSC. Sometimes it triggers on an edge (like | 458 | any_connected); |
392 | * setting and maybe clearing a port status change bit); and | ||
393 | * it's level-triggered on other silicon, active until khubd | ||
394 | * clears all active port status change bits. If it's still | ||
395 | * set (level-triggered) we must disable it and rely on | ||
396 | * polling until khubd re-enables it. | ||
397 | */ | ||
398 | if (ohci_readl (ohci, &ohci->regs->intrstatus) & OHCI_INTR_RHSC) { | ||
399 | ohci_writel (ohci, OHCI_INTR_RHSC, &ohci->regs->intrdisable); | ||
400 | (void) ohci_readl (ohci, &ohci->regs->intrdisable); | ||
401 | rhsc_enabled = 0; | ||
402 | } | ||
403 | hcd->poll_rh = 1; | ||
404 | |||
405 | /* carry out appropriate state changes */ | ||
406 | switch (ohci->hc_control & OHCI_CTRL_HCFS) { | ||
407 | |||
408 | case OHCI_USB_OPER: | ||
409 | /* keep on polling until we know a device is connected | ||
410 | * and RHSC is enabled */ | ||
411 | if (!ohci->autostop) { | ||
412 | if (any_connected) { | ||
413 | if (rhsc_enabled) | ||
414 | hcd->poll_rh = 0; | ||
415 | } else { | ||
416 | ohci->autostop = 1; | ||
417 | ohci->next_statechange = jiffies + HZ; | ||
418 | } | ||
419 | |||
420 | /* if no devices have been attached for one second, autostop */ | ||
421 | } else { | ||
422 | if (changed || any_connected) { | ||
423 | ohci->autostop = 0; | ||
424 | ohci->next_statechange = jiffies + | ||
425 | STATECHANGE_DELAY; | ||
426 | } else if (device_may_wakeup(&hcd->self.root_hub->dev) | ||
427 | && time_after_eq(jiffies, | ||
428 | ohci->next_statechange) | ||
429 | && !ohci->ed_rm_list | ||
430 | && !(ohci->hc_control & | ||
431 | OHCI_SCHED_ENABLES)) { | ||
432 | ohci_rh_suspend (ohci, 1); | ||
433 | } | ||
434 | } | ||
435 | break; | ||
436 | |||
437 | /* if there is a port change, autostart or ask to be resumed */ | ||
438 | case OHCI_USB_SUSPEND: | ||
439 | case OHCI_USB_RESUME: | ||
440 | if (changed) { | ||
441 | if (ohci->autostop) | ||
442 | ohci_rh_resume (ohci); | ||
443 | else | ||
444 | usb_hcd_resume_root_hub (hcd); | ||
445 | } else { | ||
446 | /* everything is idle, no need for polling */ | ||
447 | hcd->poll_rh = 0; | ||
448 | } | ||
449 | break; | ||
450 | } | ||
451 | 459 | ||
452 | done: | 460 | done: |
453 | spin_unlock_irqrestore (&ohci->lock, flags); | 461 | spin_unlock_irqrestore (&ohci->lock, flags); |
diff --git a/drivers/usb/host/u132-hcd.c b/drivers/usb/host/u132-hcd.c index 4f95a249c913..a9d7119e3176 100644 --- a/drivers/usb/host/u132-hcd.c +++ b/drivers/usb/host/u132-hcd.c | |||
@@ -71,7 +71,7 @@ static int distrust_firmware = 1; | |||
71 | module_param(distrust_firmware, bool, 0); | 71 | module_param(distrust_firmware, bool, 0); |
72 | MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren" | 72 | MODULE_PARM_DESC(distrust_firmware, "true to distrust firmware power/overcurren" |
73 | "t setup"); | 73 | "t setup"); |
74 | DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait); | 74 | static DECLARE_WAIT_QUEUE_HEAD(u132_hcd_wait); |
75 | /* | 75 | /* |
76 | * u132_module_lock exists to protect access to global variables | 76 | * u132_module_lock exists to protect access to global variables |
77 | * | 77 | * |
@@ -205,13 +205,9 @@ struct u132 { | |||
205 | struct u132_port port[MAX_U132_PORTS]; | 205 | struct u132_port port[MAX_U132_PORTS]; |
206 | struct u132_endp *endp[MAX_U132_ENDPS]; | 206 | struct u132_endp *endp[MAX_U132_ENDPS]; |
207 | }; | 207 | }; |
208 | int usb_ftdi_elan_read_reg(struct platform_device *pdev, u32 *data); | 208 | |
209 | int usb_ftdi_elan_read_pcimem(struct platform_device *pdev, u8 addressofs, | ||
210 | u8 width, u32 *data); | ||
211 | int usb_ftdi_elan_write_pcimem(struct platform_device *pdev, u8 addressofs, | ||
212 | u8 width, u32 data); | ||
213 | /* | 209 | /* |
214 | * these can not be inlines because we need the structure offset!! | 210 | * these cannot be inlines because we need the structure offset!! |
215 | * Does anyone have a better way????? | 211 | * Does anyone have a better way????? |
216 | */ | 212 | */ |
217 | #define u132_read_pcimem(u132, member, data) \ | 213 | #define u132_read_pcimem(u132, member, data) \ |
@@ -3031,7 +3027,7 @@ static struct hc_driver u132_hc_driver = { | |||
3031 | * This function may be called by the USB core whilst the "usb_all_devices_rwsem" | 3027 | * This function may be called by the USB core whilst the "usb_all_devices_rwsem" |
3032 | * is held for writing, thus this module must not call usb_remove_hcd() | 3028 | * is held for writing, thus this module must not call usb_remove_hcd() |
3033 | * synchronously - but instead should immediately stop activity to the | 3029 | * synchronously - but instead should immediately stop activity to the |
3034 | * device and ansynchronously call usb_remove_hcd() | 3030 | * device and asynchronously call usb_remove_hcd() |
3035 | */ | 3031 | */ |
3036 | static int __devexit u132_remove(struct platform_device *pdev) | 3032 | static int __devexit u132_remove(struct platform_device *pdev) |
3037 | { | 3033 | { |
@@ -3227,7 +3223,7 @@ static int u132_resume(struct platform_device *pdev) | |||
3227 | #define u132_resume NULL | 3223 | #define u132_resume NULL |
3228 | #endif | 3224 | #endif |
3229 | /* | 3225 | /* |
3230 | * this driver is loaded explicitely by ftdi_u132 | 3226 | * this driver is loaded explicitly by ftdi_u132 |
3231 | * | 3227 | * |
3232 | * the platform_driver struct is static because it is per type of module | 3228 | * the platform_driver struct is static because it is per type of module |
3233 | */ | 3229 | */ |
diff --git a/drivers/usb/image/microtek.c b/drivers/usb/image/microtek.c index 3038ed0700d3..8ccddf74534a 100644 --- a/drivers/usb/image/microtek.c +++ b/drivers/usb/image/microtek.c | |||
@@ -796,7 +796,7 @@ static int mts_usb_probe(struct usb_interface *intf, | |||
796 | 796 | ||
797 | new_desc->context.scsi_status = kmalloc(1, GFP_KERNEL); | 797 | new_desc->context.scsi_status = kmalloc(1, GFP_KERNEL); |
798 | if (!new_desc->context.scsi_status) | 798 | if (!new_desc->context.scsi_status) |
799 | goto out_kfree2; | 799 | goto out_free_urb; |
800 | 800 | ||
801 | new_desc->usb_dev = dev; | 801 | new_desc->usb_dev = dev; |
802 | new_desc->usb_intf = intf; | 802 | new_desc->usb_intf = intf; |
@@ -822,18 +822,20 @@ static int mts_usb_probe(struct usb_interface *intf, | |||
822 | new_desc->host = scsi_host_alloc(&mts_scsi_host_template, | 822 | new_desc->host = scsi_host_alloc(&mts_scsi_host_template, |
823 | sizeof(new_desc)); | 823 | sizeof(new_desc)); |
824 | if (!new_desc->host) | 824 | if (!new_desc->host) |
825 | goto out_free_urb; | 825 | goto out_kfree2; |
826 | 826 | ||
827 | new_desc->host->hostdata[0] = (unsigned long)new_desc; | 827 | new_desc->host->hostdata[0] = (unsigned long)new_desc; |
828 | if (scsi_add_host(new_desc->host, NULL)) { | 828 | if (scsi_add_host(new_desc->host, NULL)) { |
829 | err_retval = -EIO; | 829 | err_retval = -EIO; |
830 | goto out_free_urb; | 830 | goto out_host_put; |
831 | } | 831 | } |
832 | scsi_scan_host(new_desc->host); | 832 | scsi_scan_host(new_desc->host); |
833 | 833 | ||
834 | usb_set_intfdata(intf, new_desc); | 834 | usb_set_intfdata(intf, new_desc); |
835 | return 0; | 835 | return 0; |
836 | 836 | ||
837 | out_host_put: | ||
838 | scsi_host_put(new_desc->host); | ||
837 | out_kfree2: | 839 | out_kfree2: |
838 | kfree(new_desc->context.scsi_status); | 840 | kfree(new_desc->context.scsi_status); |
839 | out_free_urb: | 841 | out_free_urb: |
diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig index 20db36448ab3..661af7aa6236 100644 --- a/drivers/usb/input/Kconfig +++ b/drivers/usb/input/Kconfig | |||
@@ -221,6 +221,7 @@ config USB_TOUCHSCREEN | |||
221 | - ITM | 221 | - ITM |
222 | - some other eTurboTouch | 222 | - some other eTurboTouch |
223 | - Gunze AHL61 | 223 | - Gunze AHL61 |
224 | - DMC TSC-10/25 | ||
224 | 225 | ||
225 | Have a look at <http://linux.chapter7.ch/touchkit/> for | 226 | Have a look at <http://linux.chapter7.ch/touchkit/> for |
226 | a usage description and the required user-space stuff. | 227 | a usage description and the required user-space stuff. |
@@ -258,6 +259,11 @@ config USB_TOUCHSCREEN_GUNZE | |||
258 | bool "Gunze AHL61 device support" if EMBEDDED | 259 | bool "Gunze AHL61 device support" if EMBEDDED |
259 | depends on USB_TOUCHSCREEN | 260 | depends on USB_TOUCHSCREEN |
260 | 261 | ||
262 | config USB_TOUCHSCREEN_DMC_TSC10 | ||
263 | default y | ||
264 | bool "DMC TSC-10/25 device support" if EMBEDDED | ||
265 | depends on USB_TOUCHSCREEN | ||
266 | |||
261 | config USB_YEALINK | 267 | config USB_YEALINK |
262 | tristate "Yealink usb-p1k voip phone" | 268 | tristate "Yealink usb-p1k voip phone" |
263 | depends on USB && INPUT && EXPERIMENTAL | 269 | depends on USB && INPUT && EXPERIMENTAL |
diff --git a/drivers/usb/input/ati_remote.c b/drivers/usb/input/ati_remote.c index f659f3028ad2..ff23318dc301 100644 --- a/drivers/usb/input/ati_remote.c +++ b/drivers/usb/input/ati_remote.c | |||
@@ -630,19 +630,14 @@ static int ati_remote_alloc_buffers(struct usb_device *udev, | |||
630 | */ | 630 | */ |
631 | static void ati_remote_free_buffers(struct ati_remote *ati_remote) | 631 | static void ati_remote_free_buffers(struct ati_remote *ati_remote) |
632 | { | 632 | { |
633 | if (ati_remote->irq_urb) | 633 | usb_free_urb(ati_remote->irq_urb); |
634 | usb_free_urb(ati_remote->irq_urb); | 634 | usb_free_urb(ati_remote->out_urb); |
635 | 635 | ||
636 | if (ati_remote->out_urb) | 636 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, |
637 | usb_free_urb(ati_remote->out_urb); | 637 | ati_remote->inbuf, ati_remote->inbuf_dma); |
638 | 638 | ||
639 | if (ati_remote->inbuf) | 639 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, |
640 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | 640 | ati_remote->outbuf, ati_remote->outbuf_dma); |
641 | ati_remote->inbuf, ati_remote->inbuf_dma); | ||
642 | |||
643 | if (ati_remote->outbuf) | ||
644 | usb_buffer_free(ati_remote->udev, DATA_BUFSIZE, | ||
645 | ati_remote->inbuf, ati_remote->outbuf_dma); | ||
646 | } | 641 | } |
647 | 642 | ||
648 | static void ati_remote_input_init(struct ati_remote *ati_remote) | 643 | static void ati_remote_input_init(struct ati_remote *ati_remote) |
diff --git a/drivers/usb/input/ati_remote2.c b/drivers/usb/input/ati_remote2.c index f982a2b4a7f9..83f1f79db7c7 100644 --- a/drivers/usb/input/ati_remote2.c +++ b/drivers/usb/input/ati_remote2.c | |||
@@ -372,8 +372,7 @@ static void ati_remote2_urb_cleanup(struct ati_remote2 *ar2) | |||
372 | int i; | 372 | int i; |
373 | 373 | ||
374 | for (i = 0; i < 2; i++) { | 374 | for (i = 0; i < 2; i++) { |
375 | if (ar2->urb[i]) | 375 | usb_free_urb(ar2->urb[i]); |
376 | usb_free_urb(ar2->urb[i]); | ||
377 | 376 | ||
378 | if (ar2->buf[i]) | 377 | if (ar2->buf[i]) |
379 | usb_buffer_free(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]); | 378 | usb_buffer_free(ar2->udev, 4, ar2->buf[i], ar2->buf_dma[i]); |
diff --git a/drivers/usb/input/hid-core.c b/drivers/usb/input/hid-core.c index ebc9e823a46e..4295bab4f1e2 100644 --- a/drivers/usb/input/hid-core.c +++ b/drivers/usb/input/hid-core.c | |||
@@ -968,21 +968,30 @@ static void hid_retry_timeout(unsigned long _hid) | |||
968 | hid_io_error(hid); | 968 | hid_io_error(hid); |
969 | } | 969 | } |
970 | 970 | ||
971 | /* Workqueue routine to reset the device */ | 971 | /* Workqueue routine to reset the device or clear a halt */ |
972 | static void hid_reset(struct work_struct *work) | 972 | static void hid_reset(struct work_struct *work) |
973 | { | 973 | { |
974 | struct hid_device *hid = | 974 | struct hid_device *hid = |
975 | container_of(work, struct hid_device, reset_work); | 975 | container_of(work, struct hid_device, reset_work); |
976 | int rc_lock, rc; | 976 | int rc_lock, rc = 0; |
977 | 977 | ||
978 | dev_dbg(&hid->intf->dev, "resetting device\n"); | 978 | if (test_bit(HID_CLEAR_HALT, &hid->iofl)) { |
979 | rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf); | 979 | dev_dbg(&hid->intf->dev, "clear halt\n"); |
980 | if (rc_lock >= 0) { | 980 | rc = usb_clear_halt(hid->dev, hid->urbin->pipe); |
981 | rc = usb_reset_composite_device(hid->dev, hid->intf); | 981 | clear_bit(HID_CLEAR_HALT, &hid->iofl); |
982 | if (rc_lock) | 982 | hid_start_in(hid); |
983 | usb_unlock_device(hid->dev); | 983 | } |
984 | |||
985 | else if (test_bit(HID_RESET_PENDING, &hid->iofl)) { | ||
986 | dev_dbg(&hid->intf->dev, "resetting device\n"); | ||
987 | rc = rc_lock = usb_lock_device_for_reset(hid->dev, hid->intf); | ||
988 | if (rc_lock >= 0) { | ||
989 | rc = usb_reset_composite_device(hid->dev, hid->intf); | ||
990 | if (rc_lock) | ||
991 | usb_unlock_device(hid->dev); | ||
992 | } | ||
993 | clear_bit(HID_RESET_PENDING, &hid->iofl); | ||
984 | } | 994 | } |
985 | clear_bit(HID_RESET_PENDING, &hid->iofl); | ||
986 | 995 | ||
987 | switch (rc) { | 996 | switch (rc) { |
988 | case 0: | 997 | case 0: |
@@ -1024,9 +1033,8 @@ static void hid_io_error(struct hid_device *hid) | |||
1024 | 1033 | ||
1025 | /* Retries failed, so do a port reset */ | 1034 | /* Retries failed, so do a port reset */ |
1026 | if (!test_and_set_bit(HID_RESET_PENDING, &hid->iofl)) { | 1035 | if (!test_and_set_bit(HID_RESET_PENDING, &hid->iofl)) { |
1027 | if (schedule_work(&hid->reset_work)) | 1036 | schedule_work(&hid->reset_work); |
1028 | goto done; | 1037 | goto done; |
1029 | clear_bit(HID_RESET_PENDING, &hid->iofl); | ||
1030 | } | 1038 | } |
1031 | } | 1039 | } |
1032 | 1040 | ||
@@ -1050,6 +1058,11 @@ static void hid_irq_in(struct urb *urb) | |||
1050 | hid->retry_delay = 0; | 1058 | hid->retry_delay = 0; |
1051 | hid_input_report(HID_INPUT_REPORT, urb, 1); | 1059 | hid_input_report(HID_INPUT_REPORT, urb, 1); |
1052 | break; | 1060 | break; |
1061 | case -EPIPE: /* stall */ | ||
1062 | clear_bit(HID_IN_RUNNING, &hid->iofl); | ||
1063 | set_bit(HID_CLEAR_HALT, &hid->iofl); | ||
1064 | schedule_work(&hid->reset_work); | ||
1065 | return; | ||
1053 | case -ECONNRESET: /* unlink */ | 1066 | case -ECONNRESET: /* unlink */ |
1054 | case -ENOENT: | 1067 | case -ENOENT: |
1055 | case -ESHUTDOWN: /* unplug */ | 1068 | case -ESHUTDOWN: /* unplug */ |
@@ -1628,6 +1641,19 @@ void hid_init_reports(struct hid_device *hid) | |||
1628 | 1641 | ||
1629 | #define USB_VENDOR_ID_APPLE 0x05ac | 1642 | #define USB_VENDOR_ID_APPLE 0x05ac |
1630 | #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 | 1643 | #define USB_DEVICE_ID_APPLE_MIGHTYMOUSE 0x0304 |
1644 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI 0x020e | ||
1645 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_ISO 0x020f | ||
1646 | #define USB_DEVICE_ID_APPLE_GEYSER_ANSI 0x0214 | ||
1647 | #define USB_DEVICE_ID_APPLE_GEYSER_ISO 0x0215 | ||
1648 | #define USB_DEVICE_ID_APPLE_GEYSER_JIS 0x0216 | ||
1649 | #define USB_DEVICE_ID_APPLE_GEYSER3_ANSI 0x0217 | ||
1650 | #define USB_DEVICE_ID_APPLE_GEYSER3_ISO 0x0218 | ||
1651 | #define USB_DEVICE_ID_APPLE_GEYSER3_JIS 0x0219 | ||
1652 | #define USB_DEVICE_ID_APPLE_GEYSER4_ANSI 0x021a | ||
1653 | #define USB_DEVICE_ID_APPLE_GEYSER4_ISO 0x021b | ||
1654 | #define USB_DEVICE_ID_APPLE_GEYSER4_JIS 0x021c | ||
1655 | #define USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY 0x030a | ||
1656 | #define USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY 0x030b | ||
1631 | 1657 | ||
1632 | #define USB_VENDOR_ID_CHERRY 0x046a | 1658 | #define USB_VENDOR_ID_CHERRY 0x046a |
1633 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 | 1659 | #define USB_DEVICE_ID_CHERRY_CYMOTION 0x0023 |
@@ -1795,17 +1821,19 @@ static const struct hid_blacklist { | |||
1795 | 1821 | ||
1796 | { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_CYMOTION }, | 1822 | { USB_VENDOR_ID_CHERRY, USB_DEVICE_ID_CHERRY_CYMOTION, HID_QUIRK_CYMOTION }, |
1797 | 1823 | ||
1798 | { USB_VENDOR_ID_APPLE, 0x020E, HID_QUIRK_POWERBOOK_HAS_FN }, | 1824 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
1799 | { USB_VENDOR_ID_APPLE, 0x020F, HID_QUIRK_POWERBOOK_HAS_FN }, | 1825 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_ISO, HID_QUIRK_POWERBOOK_HAS_FN }, |
1800 | { USB_VENDOR_ID_APPLE, 0x0214, HID_QUIRK_POWERBOOK_HAS_FN }, | 1826 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
1801 | { USB_VENDOR_ID_APPLE, 0x0215, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, | 1827 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
1802 | { USB_VENDOR_ID_APPLE, 0x0216, HID_QUIRK_POWERBOOK_HAS_FN }, | 1828 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, |
1803 | { USB_VENDOR_ID_APPLE, 0x0217, HID_QUIRK_POWERBOOK_HAS_FN }, | 1829 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
1804 | { USB_VENDOR_ID_APPLE, 0x0218, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, | 1830 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, |
1805 | { USB_VENDOR_ID_APPLE, 0x0219, HID_QUIRK_POWERBOOK_HAS_FN }, | 1831 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER3_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, |
1806 | { USB_VENDOR_ID_APPLE, 0x021B, HID_QUIRK_POWERBOOK_HAS_FN }, | 1832 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN }, |
1807 | { USB_VENDOR_ID_APPLE, 0x030A, HID_QUIRK_POWERBOOK_HAS_FN }, | 1833 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN }, |
1808 | { USB_VENDOR_ID_APPLE, 0x030B, HID_QUIRK_POWERBOOK_HAS_FN }, | 1834 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN }, |
1835 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_FOUNTAIN_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN }, | ||
1836 | { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER1_TP_ONLY, HID_QUIRK_POWERBOOK_HAS_FN }, | ||
1809 | 1837 | ||
1810 | { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE }, | 1838 | { USB_VENDOR_ID_PANJIT, 0x0001, HID_QUIRK_IGNORE }, |
1811 | { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE }, | 1839 | { USB_VENDOR_ID_PANJIT, 0x0002, HID_QUIRK_IGNORE }, |
@@ -1986,7 +2014,7 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
1986 | if (hid->collection->usage == HID_GD_MOUSE && hid_mousepoll_interval > 0) | 2014 | if (hid->collection->usage == HID_GD_MOUSE && hid_mousepoll_interval > 0) |
1987 | interval = hid_mousepoll_interval; | 2015 | interval = hid_mousepoll_interval; |
1988 | 2016 | ||
1989 | if (endpoint->bEndpointAddress & USB_DIR_IN) { | 2017 | if (usb_endpoint_dir_in(endpoint)) { |
1990 | if (hid->urbin) | 2018 | if (hid->urbin) |
1991 | continue; | 2019 | continue; |
1992 | if (!(hid->urbin = usb_alloc_urb(0, GFP_KERNEL))) | 2020 | if (!(hid->urbin = usb_alloc_urb(0, GFP_KERNEL))) |
@@ -2068,13 +2096,9 @@ static struct hid_device *usb_hid_configure(struct usb_interface *intf) | |||
2068 | return hid; | 2096 | return hid; |
2069 | 2097 | ||
2070 | fail: | 2098 | fail: |
2071 | 2099 | usb_free_urb(hid->urbin); | |
2072 | if (hid->urbin) | 2100 | usb_free_urb(hid->urbout); |
2073 | usb_free_urb(hid->urbin); | 2101 | usb_free_urb(hid->urbctrl); |
2074 | if (hid->urbout) | ||
2075 | usb_free_urb(hid->urbout); | ||
2076 | if (hid->urbctrl) | ||
2077 | usb_free_urb(hid->urbctrl); | ||
2078 | hid_free_buffers(dev, hid); | 2102 | hid_free_buffers(dev, hid); |
2079 | hid_free_device(hid); | 2103 | hid_free_device(hid); |
2080 | 2104 | ||
@@ -2105,8 +2129,7 @@ static void hid_disconnect(struct usb_interface *intf) | |||
2105 | 2129 | ||
2106 | usb_free_urb(hid->urbin); | 2130 | usb_free_urb(hid->urbin); |
2107 | usb_free_urb(hid->urbctrl); | 2131 | usb_free_urb(hid->urbctrl); |
2108 | if (hid->urbout) | 2132 | usb_free_urb(hid->urbout); |
2109 | usb_free_urb(hid->urbout); | ||
2110 | 2133 | ||
2111 | hid_free_buffers(hid->dev, hid); | 2134 | hid_free_buffers(hid->dev, hid); |
2112 | hid_free_device(hid); | 2135 | hid_free_device(hid); |
diff --git a/drivers/usb/input/hid.h b/drivers/usb/input/hid.h index 0e76e6dcac37..2a9bf07944c0 100644 --- a/drivers/usb/input/hid.h +++ b/drivers/usb/input/hid.h | |||
@@ -385,6 +385,7 @@ struct hid_control_fifo { | |||
385 | #define HID_IN_RUNNING 3 | 385 | #define HID_IN_RUNNING 3 |
386 | #define HID_RESET_PENDING 4 | 386 | #define HID_RESET_PENDING 4 |
387 | #define HID_SUSPENDED 5 | 387 | #define HID_SUSPENDED 5 |
388 | #define HID_CLEAR_HALT 6 | ||
388 | 389 | ||
389 | struct hid_input { | 390 | struct hid_input { |
390 | struct list_head list; | 391 | struct list_head list; |
diff --git a/drivers/usb/input/usbkbd.c b/drivers/usb/input/usbkbd.c index c73285cf8558..dac88640eab6 100644 --- a/drivers/usb/input/usbkbd.c +++ b/drivers/usb/input/usbkbd.c | |||
@@ -208,10 +208,8 @@ static int usb_kbd_alloc_mem(struct usb_device *dev, struct usb_kbd *kbd) | |||
208 | 208 | ||
209 | static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd) | 209 | static void usb_kbd_free_mem(struct usb_device *dev, struct usb_kbd *kbd) |
210 | { | 210 | { |
211 | if (kbd->irq) | 211 | usb_free_urb(kbd->irq); |
212 | usb_free_urb(kbd->irq); | 212 | usb_free_urb(kbd->led); |
213 | if (kbd->led) | ||
214 | usb_free_urb(kbd->led); | ||
215 | if (kbd->new) | 213 | if (kbd->new) |
216 | usb_buffer_free(dev, 8, kbd->new, kbd->new_dma); | 214 | usb_buffer_free(dev, 8, kbd->new, kbd->new_dma); |
217 | if (kbd->cr) | 215 | if (kbd->cr) |
@@ -236,9 +234,7 @@ static int usb_kbd_probe(struct usb_interface *iface, | |||
236 | return -ENODEV; | 234 | return -ENODEV; |
237 | 235 | ||
238 | endpoint = &interface->endpoint[0].desc; | 236 | endpoint = &interface->endpoint[0].desc; |
239 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | 237 | if (!usb_endpoint_is_int_in(endpoint)) |
240 | return -ENODEV; | ||
241 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) | ||
242 | return -ENODEV; | 238 | return -ENODEV; |
243 | 239 | ||
244 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); | 240 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); |
diff --git a/drivers/usb/input/usbmouse.c b/drivers/usb/input/usbmouse.c index cbbbea332ed7..68a55642c082 100644 --- a/drivers/usb/input/usbmouse.c +++ b/drivers/usb/input/usbmouse.c | |||
@@ -126,9 +126,7 @@ static int usb_mouse_probe(struct usb_interface *intf, const struct usb_device_i | |||
126 | return -ENODEV; | 126 | return -ENODEV; |
127 | 127 | ||
128 | endpoint = &interface->endpoint[0].desc; | 128 | endpoint = &interface->endpoint[0].desc; |
129 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | 129 | if (!usb_endpoint_is_int_in(endpoint)) |
130 | return -ENODEV; | ||
131 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) | ||
132 | return -ENODEV; | 130 | return -ENODEV; |
133 | 131 | ||
134 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); | 132 | pipe = usb_rcvintpipe(dev, endpoint->bEndpointAddress); |
diff --git a/drivers/usb/input/usbtouchscreen.c b/drivers/usb/input/usbtouchscreen.c index 933ceddf3dee..49704d4ed0e2 100644 --- a/drivers/usb/input/usbtouchscreen.c +++ b/drivers/usb/input/usbtouchscreen.c | |||
@@ -8,6 +8,7 @@ | |||
8 | * - PanJit TouchSet | 8 | * - PanJit TouchSet |
9 | * - eTurboTouch | 9 | * - eTurboTouch |
10 | * - Gunze AHL61 | 10 | * - Gunze AHL61 |
11 | * - DMC TSC-10/25 | ||
11 | * | 12 | * |
12 | * Copyright (C) 2004-2006 by Daniel Ritz <daniel.ritz@gmx.ch> | 13 | * Copyright (C) 2004-2006 by Daniel Ritz <daniel.ritz@gmx.ch> |
13 | * Copyright (C) by Todd E. Johnson (mtouchusb.c) | 14 | * Copyright (C) by Todd E. Johnson (mtouchusb.c) |
@@ -30,6 +31,8 @@ | |||
30 | * - ITM parts are from itmtouch.c | 31 | * - ITM parts are from itmtouch.c |
31 | * - 3M parts are from mtouchusb.c | 32 | * - 3M parts are from mtouchusb.c |
32 | * - PanJit parts are from an unmerged driver by Lanslott Gish | 33 | * - PanJit parts are from an unmerged driver by Lanslott Gish |
34 | * - DMC TSC 10/25 are from Holger Schurig, with ideas from an unmerged | ||
35 | * driver from Marius Vollmer | ||
33 | * | 36 | * |
34 | *****************************************************************************/ | 37 | *****************************************************************************/ |
35 | 38 | ||
@@ -44,7 +47,7 @@ | |||
44 | #include <linux/usb/input.h> | 47 | #include <linux/usb/input.h> |
45 | 48 | ||
46 | 49 | ||
47 | #define DRIVER_VERSION "v0.4" | 50 | #define DRIVER_VERSION "v0.5" |
48 | #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" | 51 | #define DRIVER_AUTHOR "Daniel Ritz <daniel.ritz@gmx.ch>" |
49 | #define DRIVER_DESC "USB Touchscreen Driver" | 52 | #define DRIVER_DESC "USB Touchscreen Driver" |
50 | 53 | ||
@@ -103,6 +106,7 @@ enum { | |||
103 | DEVTYPE_ITM, | 106 | DEVTYPE_ITM, |
104 | DEVTYPE_ETURBO, | 107 | DEVTYPE_ETURBO, |
105 | DEVTYPE_GUNZE, | 108 | DEVTYPE_GUNZE, |
109 | DEVTYPE_DMC_TSC10, | ||
106 | }; | 110 | }; |
107 | 111 | ||
108 | static struct usb_device_id usbtouch_devices[] = { | 112 | static struct usb_device_id usbtouch_devices[] = { |
@@ -139,6 +143,10 @@ static struct usb_device_id usbtouch_devices[] = { | |||
139 | {USB_DEVICE(0x0637, 0x0001), .driver_info = DEVTYPE_GUNZE}, | 143 | {USB_DEVICE(0x0637, 0x0001), .driver_info = DEVTYPE_GUNZE}, |
140 | #endif | 144 | #endif |
141 | 145 | ||
146 | #ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10 | ||
147 | {USB_DEVICE(0x0afa, 0x03e8), .driver_info = DEVTYPE_DMC_TSC10}, | ||
148 | #endif | ||
149 | |||
142 | {} | 150 | {} |
143 | }; | 151 | }; |
144 | 152 | ||
@@ -313,6 +321,80 @@ static int gunze_read_data(unsigned char *pkt, int *x, int *y, int *touch, int * | |||
313 | #endif | 321 | #endif |
314 | 322 | ||
315 | /***************************************************************************** | 323 | /***************************************************************************** |
324 | * DMC TSC-10/25 Part | ||
325 | * | ||
326 | * Documentation about the controller and it's protocol can be found at | ||
327 | * http://www.dmccoltd.com/files/controler/tsc10usb_pi_e.pdf | ||
328 | * http://www.dmccoltd.com/files/controler/tsc25_usb_e.pdf | ||
329 | */ | ||
330 | #ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10 | ||
331 | |||
332 | /* supported data rates. currently using 130 */ | ||
333 | #define TSC10_RATE_POINT 0x50 | ||
334 | #define TSC10_RATE_30 0x40 | ||
335 | #define TSC10_RATE_50 0x41 | ||
336 | #define TSC10_RATE_80 0x42 | ||
337 | #define TSC10_RATE_100 0x43 | ||
338 | #define TSC10_RATE_130 0x44 | ||
339 | #define TSC10_RATE_150 0x45 | ||
340 | |||
341 | /* commands */ | ||
342 | #define TSC10_CMD_RESET 0x55 | ||
343 | #define TSC10_CMD_RATE 0x05 | ||
344 | #define TSC10_CMD_DATA1 0x01 | ||
345 | |||
346 | static int dmc_tsc10_init(struct usbtouch_usb *usbtouch) | ||
347 | { | ||
348 | struct usb_device *dev = usbtouch->udev; | ||
349 | int ret; | ||
350 | unsigned char buf[2]; | ||
351 | |||
352 | /* reset */ | ||
353 | buf[0] = buf[1] = 0xFF; | ||
354 | ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), | ||
355 | TSC10_CMD_RESET, | ||
356 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
357 | 0, 0, buf, 2, USB_CTRL_SET_TIMEOUT); | ||
358 | if (ret < 0) | ||
359 | return ret; | ||
360 | if (buf[0] != 0x06 || buf[1] != 0x00) | ||
361 | return -ENODEV; | ||
362 | |||
363 | /* set coordinate output rate */ | ||
364 | buf[0] = buf[1] = 0xFF; | ||
365 | ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), | ||
366 | TSC10_CMD_RATE, | ||
367 | USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
368 | TSC10_RATE_150, 0, buf, 2, USB_CTRL_SET_TIMEOUT); | ||
369 | if (ret < 0) | ||
370 | return ret; | ||
371 | if (buf[0] != 0x06 || buf[1] != 0x00) | ||
372 | return -ENODEV; | ||
373 | |||
374 | /* start sending data */ | ||
375 | ret = usb_control_msg(dev, usb_rcvctrlpipe (dev, 0), | ||
376 | TSC10_CMD_DATA1, | ||
377 | USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE, | ||
378 | 0, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); | ||
379 | if (ret < 0) | ||
380 | return ret; | ||
381 | |||
382 | return 0; | ||
383 | } | ||
384 | |||
385 | |||
386 | static int dmc_tsc10_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press) | ||
387 | { | ||
388 | *x = ((pkt[2] & 0x03) << 8) | pkt[1]; | ||
389 | *y = ((pkt[4] & 0x03) << 8) | pkt[3]; | ||
390 | *touch = pkt[0] & 0x01; | ||
391 | |||
392 | return 1; | ||
393 | } | ||
394 | #endif | ||
395 | |||
396 | |||
397 | /***************************************************************************** | ||
316 | * the different device descriptors | 398 | * the different device descriptors |
317 | */ | 399 | */ |
318 | static struct usbtouch_device_info usbtouch_dev_info[] = { | 400 | static struct usbtouch_device_info usbtouch_dev_info[] = { |
@@ -389,6 +471,18 @@ static struct usbtouch_device_info usbtouch_dev_info[] = { | |||
389 | .read_data = gunze_read_data, | 471 | .read_data = gunze_read_data, |
390 | }, | 472 | }, |
391 | #endif | 473 | #endif |
474 | |||
475 | #ifdef CONFIG_USB_TOUCHSCREEN_DMC_TSC10 | ||
476 | [DEVTYPE_DMC_TSC10] = { | ||
477 | .min_xc = 0x0, | ||
478 | .max_xc = 0x03ff, | ||
479 | .min_yc = 0x0, | ||
480 | .max_yc = 0x03ff, | ||
481 | .rept_size = 5, | ||
482 | .init = dmc_tsc10_init, | ||
483 | .read_data = dmc_tsc10_read_data, | ||
484 | }, | ||
485 | #endif | ||
392 | }; | 486 | }; |
393 | 487 | ||
394 | 488 | ||
diff --git a/drivers/usb/input/wacom.h b/drivers/usb/input/wacom.h index 1cf08f02c50e..d85abfc5ab58 100644 --- a/drivers/usb/input/wacom.h +++ b/drivers/usb/input/wacom.h | |||
@@ -110,7 +110,6 @@ struct wacom_combo { | |||
110 | }; | 110 | }; |
111 | 111 | ||
112 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); | 112 | extern int wacom_wac_irq(struct wacom_wac * wacom_wac, void * wcombo); |
113 | extern void wacom_sys_irq(struct urb *urb); | ||
114 | extern void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data); | 113 | extern void wacom_report_abs(void *wcombo, unsigned int abs_type, int abs_data); |
115 | extern void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data); | 114 | extern void wacom_report_rel(void *wcombo, unsigned int rel_type, int rel_data); |
116 | extern void wacom_report_key(void *wcombo, unsigned int key_type, int key_data); | 115 | extern void wacom_report_key(void *wcombo, unsigned int key_type, int key_data); |
diff --git a/drivers/usb/input/wacom_sys.c b/drivers/usb/input/wacom_sys.c index 3498b893b53b..e7cc20ab8155 100644 --- a/drivers/usb/input/wacom_sys.c +++ b/drivers/usb/input/wacom_sys.c | |||
@@ -42,7 +42,7 @@ static struct input_dev * get_input_dev(struct wacom_combo *wcombo) | |||
42 | return wcombo->wacom->dev; | 42 | return wcombo->wacom->dev; |
43 | } | 43 | } |
44 | 44 | ||
45 | void wacom_sys_irq(struct urb *urb) | 45 | static void wacom_sys_irq(struct urb *urb) |
46 | { | 46 | { |
47 | struct wacom *wacom = urb->context; | 47 | struct wacom *wacom = urb->context; |
48 | struct wacom_combo wcombo; | 48 | struct wacom_combo wcombo; |
diff --git a/drivers/usb/input/yealink.c b/drivers/usb/input/yealink.c index 905bf6398257..2268ca311ade 100644 --- a/drivers/usb/input/yealink.c +++ b/drivers/usb/input/yealink.c | |||
@@ -859,10 +859,8 @@ static int usb_probe(struct usb_interface *intf, const struct usb_device_id *id) | |||
859 | 859 | ||
860 | interface = intf->cur_altsetting; | 860 | interface = intf->cur_altsetting; |
861 | endpoint = &interface->endpoint[0].desc; | 861 | endpoint = &interface->endpoint[0].desc; |
862 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | 862 | if (!usb_endpoint_is_int_in(endpoint)) |
863 | return -EIO; | 863 | return -ENODEV; |
864 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) != USB_ENDPOINT_XFER_INT) | ||
865 | return -EIO; | ||
866 | 864 | ||
867 | yld = kzalloc(sizeof(struct yealink_dev), GFP_KERNEL); | 865 | yld = kzalloc(sizeof(struct yealink_dev), GFP_KERNEL); |
868 | if (!yld) | 866 | if (!yld) |
diff --git a/drivers/usb/misc/Makefile b/drivers/usb/misc/Makefile index 11dc59540cda..2cba07d31971 100644 --- a/drivers/usb/misc/Makefile +++ b/drivers/usb/misc/Makefile | |||
@@ -4,6 +4,7 @@ | |||
4 | # | 4 | # |
5 | 5 | ||
6 | obj-$(CONFIG_USB_ADUTUX) += adutux.o | 6 | obj-$(CONFIG_USB_ADUTUX) += adutux.o |
7 | obj-$(CONFIG_USB_APPLEDISPLAY) += appledisplay.o | ||
7 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o | 8 | obj-$(CONFIG_USB_AUERSWALD) += auerswald.o |
8 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o | 9 | obj-$(CONFIG_USB_CYPRESS_CY7C63)+= cypress_cy7c63.o |
9 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o | 10 | obj-$(CONFIG_USB_CYTHERM) += cytherm.o |
diff --git a/drivers/usb/misc/appledisplay.c b/drivers/usb/misc/appledisplay.c index 6b23a1def9fe..ba30ca6a14aa 100644 --- a/drivers/usb/misc/appledisplay.c +++ b/drivers/usb/misc/appledisplay.c | |||
@@ -216,10 +216,7 @@ static int appledisplay_probe(struct usb_interface *iface, | |||
216 | iface_desc = iface->cur_altsetting; | 216 | iface_desc = iface->cur_altsetting; |
217 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { | 217 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { |
218 | endpoint = &iface_desc->endpoint[i].desc; | 218 | endpoint = &iface_desc->endpoint[i].desc; |
219 | if (!int_in_endpointAddr && | 219 | if (!int_in_endpointAddr && usb_endpoint_is_int_in(endpoint)) { |
220 | (endpoint->bEndpointAddress & USB_DIR_IN) && | ||
221 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
222 | USB_ENDPOINT_XFER_INT)) { | ||
223 | /* we found an interrupt in endpoint */ | 220 | /* we found an interrupt in endpoint */ |
224 | int_in_endpointAddr = endpoint->bEndpointAddress; | 221 | int_in_endpointAddr = endpoint->bEndpointAddress; |
225 | break; | 222 | break; |
diff --git a/drivers/usb/misc/auerswald.c b/drivers/usb/misc/auerswald.c index e4971d6aaafb..c703f73e1655 100644 --- a/drivers/usb/misc/auerswald.c +++ b/drivers/usb/misc/auerswald.c | |||
@@ -704,9 +704,7 @@ static void auerbuf_free (pauerbuf_t bp) | |||
704 | { | 704 | { |
705 | kfree(bp->bufp); | 705 | kfree(bp->bufp); |
706 | kfree(bp->dr); | 706 | kfree(bp->dr); |
707 | if (bp->urbp) { | 707 | usb_free_urb(bp->urbp); |
708 | usb_free_urb(bp->urbp); | ||
709 | } | ||
710 | kfree(bp); | 708 | kfree(bp); |
711 | } | 709 | } |
712 | 710 | ||
@@ -1155,8 +1153,7 @@ static void auerswald_int_release (pauerswald_t cp) | |||
1155 | dbg ("auerswald_int_release"); | 1153 | dbg ("auerswald_int_release"); |
1156 | 1154 | ||
1157 | /* stop the int endpoint */ | 1155 | /* stop the int endpoint */ |
1158 | if (cp->inturbp) | 1156 | usb_kill_urb (cp->inturbp); |
1159 | usb_kill_urb (cp->inturbp); | ||
1160 | 1157 | ||
1161 | /* deallocate memory */ | 1158 | /* deallocate memory */ |
1162 | auerswald_int_free (cp); | 1159 | auerswald_int_free (cp); |
diff --git a/drivers/usb/misc/emi26.c b/drivers/usb/misc/emi26.c index 1fd9cb85f4ca..5c0a26cbd128 100644 --- a/drivers/usb/misc/emi26.c +++ b/drivers/usb/misc/emi26.c | |||
@@ -53,13 +53,12 @@ static void __exit emi26_exit (void); | |||
53 | static int emi26_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) | 53 | static int emi26_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) |
54 | { | 54 | { |
55 | int result; | 55 | int result; |
56 | unsigned char *buffer = kmalloc (length, GFP_KERNEL); | 56 | unsigned char *buffer = kmemdup(data, length, GFP_KERNEL); |
57 | 57 | ||
58 | if (!buffer) { | 58 | if (!buffer) { |
59 | err("emi26: kmalloc(%d) failed.", length); | 59 | err("emi26: kmalloc(%d) failed.", length); |
60 | return -ENOMEM; | 60 | return -ENOMEM; |
61 | } | 61 | } |
62 | memcpy (buffer, data, length); | ||
63 | /* Note: usb_control_msg returns negative value on error or length of the | 62 | /* Note: usb_control_msg returns negative value on error or length of the |
64 | * data that was written! */ | 63 | * data that was written! */ |
65 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); | 64 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); |
diff --git a/drivers/usb/misc/emi62.c b/drivers/usb/misc/emi62.c index fe351371f274..23153eac0dfa 100644 --- a/drivers/usb/misc/emi62.c +++ b/drivers/usb/misc/emi62.c | |||
@@ -61,13 +61,12 @@ static void __exit emi62_exit (void); | |||
61 | static int emi62_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) | 61 | static int emi62_writememory (struct usb_device *dev, int address, unsigned char *data, int length, __u8 request) |
62 | { | 62 | { |
63 | int result; | 63 | int result; |
64 | unsigned char *buffer = kmalloc (length, GFP_KERNEL); | 64 | unsigned char *buffer = kmemdup(data, length, GFP_KERNEL); |
65 | 65 | ||
66 | if (!buffer) { | 66 | if (!buffer) { |
67 | err("emi62: kmalloc(%d) failed.", length); | 67 | err("emi62: kmalloc(%d) failed.", length); |
68 | return -ENOMEM; | 68 | return -ENOMEM; |
69 | } | 69 | } |
70 | memcpy (buffer, data, length); | ||
71 | /* Note: usb_control_msg returns negative value on error or length of the | 70 | /* Note: usb_control_msg returns negative value on error or length of the |
72 | * data that was written! */ | 71 | * data that was written! */ |
73 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); | 72 | result = usb_control_msg (dev, usb_sndctrlpipe(dev, 0), request, 0x40, address, 0, buffer, length, 300); |
diff --git a/drivers/usb/misc/ftdi-elan.c b/drivers/usb/misc/ftdi-elan.c index e4e2cf2ba915..18b1925032a8 100644 --- a/drivers/usb/misc/ftdi-elan.c +++ b/drivers/usb/misc/ftdi-elan.c | |||
@@ -272,7 +272,7 @@ void ftdi_elan_gone_away(struct platform_device *pdev) | |||
272 | 272 | ||
273 | 273 | ||
274 | EXPORT_SYMBOL_GPL(ftdi_elan_gone_away); | 274 | EXPORT_SYMBOL_GPL(ftdi_elan_gone_away); |
275 | void ftdi_release_platform_dev(struct device *dev) | 275 | static void ftdi_release_platform_dev(struct device *dev) |
276 | { | 276 | { |
277 | dev->parent = NULL; | 277 | dev->parent = NULL; |
278 | } | 278 | } |
@@ -1399,14 +1399,6 @@ static int ftdi_elan_read_reg(struct usb_ftdi *ftdi, u32 *data) | |||
1399 | } | 1399 | } |
1400 | } | 1400 | } |
1401 | 1401 | ||
1402 | int usb_ftdi_elan_read_reg(struct platform_device *pdev, u32 *data) | ||
1403 | { | ||
1404 | struct usb_ftdi *ftdi = platform_device_to_usb_ftdi(pdev); | ||
1405 | return ftdi_elan_read_reg(ftdi, data); | ||
1406 | } | ||
1407 | |||
1408 | |||
1409 | EXPORT_SYMBOL_GPL(usb_ftdi_elan_read_reg); | ||
1410 | static int ftdi_elan_read_config(struct usb_ftdi *ftdi, int config_offset, | 1402 | static int ftdi_elan_read_config(struct usb_ftdi *ftdi, int config_offset, |
1411 | u8 width, u32 *data) | 1403 | u8 width, u32 *data) |
1412 | { | 1404 | { |
@@ -2606,10 +2598,7 @@ static int ftdi_elan_probe(struct usb_interface *interface, | |||
2606 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 2598 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
2607 | endpoint = &iface_desc->endpoint[i].desc; | 2599 | endpoint = &iface_desc->endpoint[i].desc; |
2608 | if (!ftdi->bulk_in_endpointAddr && | 2600 | if (!ftdi->bulk_in_endpointAddr && |
2609 | ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) | 2601 | usb_endpoint_is_bulk_in(endpoint)) { |
2610 | == USB_DIR_IN) && ((endpoint->bmAttributes & | ||
2611 | USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)) | ||
2612 | { | ||
2613 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); | 2602 | buffer_size = le16_to_cpu(endpoint->wMaxPacketSize); |
2614 | ftdi->bulk_in_size = buffer_size; | 2603 | ftdi->bulk_in_size = buffer_size; |
2615 | ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress; | 2604 | ftdi->bulk_in_endpointAddr = endpoint->bEndpointAddress; |
@@ -2622,10 +2611,7 @@ static int ftdi_elan_probe(struct usb_interface *interface, | |||
2622 | } | 2611 | } |
2623 | } | 2612 | } |
2624 | if (!ftdi->bulk_out_endpointAddr && | 2613 | if (!ftdi->bulk_out_endpointAddr && |
2625 | ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) | 2614 | usb_endpoint_is_bulk_out(endpoint)) { |
2626 | == USB_DIR_OUT) && ((endpoint->bmAttributes & | ||
2627 | USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)) | ||
2628 | { | ||
2629 | ftdi->bulk_out_endpointAddr = | 2615 | ftdi->bulk_out_endpointAddr = |
2630 | endpoint->bEndpointAddress; | 2616 | endpoint->bEndpointAddress; |
2631 | } | 2617 | } |
diff --git a/drivers/usb/misc/idmouse.c b/drivers/usb/misc/idmouse.c index 8e6e195a22ba..c9418535bef8 100644 --- a/drivers/usb/misc/idmouse.c +++ b/drivers/usb/misc/idmouse.c | |||
@@ -125,12 +125,12 @@ static DEFINE_MUTEX(disconnect_mutex); | |||
125 | 125 | ||
126 | static int idmouse_create_image(struct usb_idmouse *dev) | 126 | static int idmouse_create_image(struct usb_idmouse *dev) |
127 | { | 127 | { |
128 | int bytes_read = 0; | 128 | int bytes_read; |
129 | int bulk_read = 0; | 129 | int bulk_read; |
130 | int result = 0; | 130 | int result; |
131 | 131 | ||
132 | memcpy(dev->bulk_in_buffer, HEADER, sizeof(HEADER)-1); | 132 | memcpy(dev->bulk_in_buffer, HEADER, sizeof(HEADER)-1); |
133 | bytes_read += sizeof(HEADER)-1; | 133 | bytes_read = sizeof(HEADER)-1; |
134 | 134 | ||
135 | /* reset the device and set a fast blink rate */ | 135 | /* reset the device and set a fast blink rate */ |
136 | result = ftip_command(dev, FTIP_RELEASE, 0, 0); | 136 | result = ftip_command(dev, FTIP_RELEASE, 0, 0); |
@@ -208,9 +208,9 @@ static inline void idmouse_delete(struct usb_idmouse *dev) | |||
208 | 208 | ||
209 | static int idmouse_open(struct inode *inode, struct file *file) | 209 | static int idmouse_open(struct inode *inode, struct file *file) |
210 | { | 210 | { |
211 | struct usb_idmouse *dev = NULL; | 211 | struct usb_idmouse *dev; |
212 | struct usb_interface *interface; | 212 | struct usb_interface *interface; |
213 | int result = 0; | 213 | int result; |
214 | 214 | ||
215 | /* prevent disconnects */ | 215 | /* prevent disconnects */ |
216 | mutex_lock(&disconnect_mutex); | 216 | mutex_lock(&disconnect_mutex); |
@@ -305,7 +305,7 @@ static ssize_t idmouse_read(struct file *file, char __user *buffer, size_t count | |||
305 | loff_t * ppos) | 305 | loff_t * ppos) |
306 | { | 306 | { |
307 | struct usb_idmouse *dev; | 307 | struct usb_idmouse *dev; |
308 | int result = 0; | 308 | int result; |
309 | 309 | ||
310 | dev = (struct usb_idmouse *) file->private_data; | 310 | dev = (struct usb_idmouse *) file->private_data; |
311 | 311 | ||
@@ -329,7 +329,7 @@ static int idmouse_probe(struct usb_interface *interface, | |||
329 | const struct usb_device_id *id) | 329 | const struct usb_device_id *id) |
330 | { | 330 | { |
331 | struct usb_device *udev = interface_to_usbdev(interface); | 331 | struct usb_device *udev = interface_to_usbdev(interface); |
332 | struct usb_idmouse *dev = NULL; | 332 | struct usb_idmouse *dev; |
333 | struct usb_host_interface *iface_desc; | 333 | struct usb_host_interface *iface_desc; |
334 | struct usb_endpoint_descriptor *endpoint; | 334 | struct usb_endpoint_descriptor *endpoint; |
335 | int result; | 335 | int result; |
@@ -350,11 +350,7 @@ static int idmouse_probe(struct usb_interface *interface, | |||
350 | 350 | ||
351 | /* set up the endpoint information - use only the first bulk-in endpoint */ | 351 | /* set up the endpoint information - use only the first bulk-in endpoint */ |
352 | endpoint = &iface_desc->endpoint[0].desc; | 352 | endpoint = &iface_desc->endpoint[0].desc; |
353 | if (!dev->bulk_in_endpointAddr | 353 | if (!dev->bulk_in_endpointAddr && usb_endpoint_is_bulk_in(endpoint)) { |
354 | && (endpoint->bEndpointAddress & USB_DIR_IN) | ||
355 | && ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == | ||
356 | USB_ENDPOINT_XFER_BULK)) { | ||
357 | |||
358 | /* we found a bulk in endpoint */ | 354 | /* we found a bulk in endpoint */ |
359 | dev->orig_bi_size = le16_to_cpu(endpoint->wMaxPacketSize); | 355 | dev->orig_bi_size = le16_to_cpu(endpoint->wMaxPacketSize); |
360 | dev->bulk_in_size = 0x200; /* works _much_ faster */ | 356 | dev->bulk_in_size = 0x200; /* works _much_ faster */ |
diff --git a/drivers/usb/misc/legousbtower.c b/drivers/usb/misc/legousbtower.c index 27089497e717..5dce797bddb7 100644 --- a/drivers/usb/misc/legousbtower.c +++ b/drivers/usb/misc/legousbtower.c | |||
@@ -317,12 +317,8 @@ static inline void tower_delete (struct lego_usb_tower *dev) | |||
317 | tower_abort_transfers (dev); | 317 | tower_abort_transfers (dev); |
318 | 318 | ||
319 | /* free data structures */ | 319 | /* free data structures */ |
320 | if (dev->interrupt_in_urb != NULL) { | 320 | usb_free_urb(dev->interrupt_in_urb); |
321 | usb_free_urb (dev->interrupt_in_urb); | 321 | usb_free_urb(dev->interrupt_out_urb); |
322 | } | ||
323 | if (dev->interrupt_out_urb != NULL) { | ||
324 | usb_free_urb (dev->interrupt_out_urb); | ||
325 | } | ||
326 | kfree (dev->read_buffer); | 322 | kfree (dev->read_buffer); |
327 | kfree (dev->interrupt_in_buffer); | 323 | kfree (dev->interrupt_in_buffer); |
328 | kfree (dev->interrupt_out_buffer); | 324 | kfree (dev->interrupt_out_buffer); |
@@ -502,15 +498,11 @@ static void tower_abort_transfers (struct lego_usb_tower *dev) | |||
502 | if (dev->interrupt_in_running) { | 498 | if (dev->interrupt_in_running) { |
503 | dev->interrupt_in_running = 0; | 499 | dev->interrupt_in_running = 0; |
504 | mb(); | 500 | mb(); |
505 | if (dev->interrupt_in_urb != NULL && dev->udev) { | 501 | if (dev->udev) |
506 | usb_kill_urb (dev->interrupt_in_urb); | 502 | usb_kill_urb (dev->interrupt_in_urb); |
507 | } | ||
508 | } | ||
509 | if (dev->interrupt_out_busy) { | ||
510 | if (dev->interrupt_out_urb != NULL && dev->udev) { | ||
511 | usb_kill_urb (dev->interrupt_out_urb); | ||
512 | } | ||
513 | } | 503 | } |
504 | if (dev->interrupt_out_busy && dev->udev) | ||
505 | usb_kill_urb(dev->interrupt_out_urb); | ||
514 | 506 | ||
515 | exit: | 507 | exit: |
516 | dbg(2, "%s: leave", __FUNCTION__); | 508 | dbg(2, "%s: leave", __FUNCTION__); |
@@ -898,14 +890,11 @@ static int tower_probe (struct usb_interface *interface, const struct usb_device | |||
898 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { | 890 | for (i = 0; i < iface_desc->desc.bNumEndpoints; ++i) { |
899 | endpoint = &iface_desc->endpoint[i].desc; | 891 | endpoint = &iface_desc->endpoint[i].desc; |
900 | 892 | ||
901 | if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) && | 893 | if (usb_endpoint_xfer_int(endpoint)) { |
902 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | 894 | if (usb_endpoint_dir_in(endpoint)) |
903 | dev->interrupt_in_endpoint = endpoint; | 895 | dev->interrupt_in_endpoint = endpoint; |
904 | } | 896 | else |
905 | 897 | dev->interrupt_out_endpoint = endpoint; | |
906 | if (((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) && | ||
907 | ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
908 | dev->interrupt_out_endpoint = endpoint; | ||
909 | } | 898 | } |
910 | } | 899 | } |
911 | if(dev->interrupt_in_endpoint == NULL) { | 900 | if(dev->interrupt_in_endpoint == NULL) { |
diff --git a/drivers/usb/misc/phidgetkit.c b/drivers/usb/misc/phidgetkit.c index 33e716c6a79b..9659c79e187e 100644 --- a/drivers/usb/misc/phidgetkit.c +++ b/drivers/usb/misc/phidgetkit.c | |||
@@ -554,7 +554,7 @@ static int interfacekit_probe(struct usb_interface *intf, const struct usb_devic | |||
554 | return -ENODEV; | 554 | return -ENODEV; |
555 | 555 | ||
556 | endpoint = &interface->endpoint[0].desc; | 556 | endpoint = &interface->endpoint[0].desc; |
557 | if (!(endpoint->bEndpointAddress & 0x80)) | 557 | if (!usb_endpoint_dir_in(endpoint)) |
558 | return -ENODEV; | 558 | return -ENODEV; |
559 | /* | 559 | /* |
560 | * bmAttributes | 560 | * bmAttributes |
@@ -653,8 +653,7 @@ out2: | |||
653 | device_remove_file(kit->dev, &dev_output_attrs[i]); | 653 | device_remove_file(kit->dev, &dev_output_attrs[i]); |
654 | out: | 654 | out: |
655 | if (kit) { | 655 | if (kit) { |
656 | if (kit->irq) | 656 | usb_free_urb(kit->irq); |
657 | usb_free_urb(kit->irq); | ||
658 | if (kit->data) | 657 | if (kit->data) |
659 | usb_buffer_free(dev, URB_INT_SIZE, kit->data, kit->data_dma); | 658 | usb_buffer_free(dev, URB_INT_SIZE, kit->data, kit->data_dma); |
660 | if (kit->dev) | 659 | if (kit->dev) |
diff --git a/drivers/usb/misc/phidgetmotorcontrol.c b/drivers/usb/misc/phidgetmotorcontrol.c index 0385ffcc7419..2bb4fa572bb7 100644 --- a/drivers/usb/misc/phidgetmotorcontrol.c +++ b/drivers/usb/misc/phidgetmotorcontrol.c | |||
@@ -324,7 +324,7 @@ static int motorcontrol_probe(struct usb_interface *intf, const struct usb_devic | |||
324 | return -ENODEV; | 324 | return -ENODEV; |
325 | 325 | ||
326 | endpoint = &interface->endpoint[0].desc; | 326 | endpoint = &interface->endpoint[0].desc; |
327 | if (!(endpoint->bEndpointAddress & 0x80)) | 327 | if (!usb_endpoint_dir_in(endpoint)) |
328 | return -ENODEV; | 328 | return -ENODEV; |
329 | 329 | ||
330 | /* | 330 | /* |
@@ -393,8 +393,7 @@ out2: | |||
393 | device_remove_file(mc->dev, &dev_attrs[i]); | 393 | device_remove_file(mc->dev, &dev_attrs[i]); |
394 | out: | 394 | out: |
395 | if (mc) { | 395 | if (mc) { |
396 | if (mc->irq) | 396 | usb_free_urb(mc->irq); |
397 | usb_free_urb(mc->irq); | ||
398 | if (mc->data) | 397 | if (mc->data) |
399 | usb_buffer_free(dev, URB_INT_SIZE, mc->data, mc->data_dma); | 398 | usb_buffer_free(dev, URB_INT_SIZE, mc->data, mc->data_dma); |
400 | if (mc->dev) | 399 | if (mc->dev) |
diff --git a/drivers/usb/misc/usb_u132.h b/drivers/usb/misc/usb_u132.h index 551ba8906d62..dc2e5a31caec 100644 --- a/drivers/usb/misc/usb_u132.h +++ b/drivers/usb/misc/usb_u132.h | |||
@@ -52,7 +52,7 @@ | |||
52 | * the kernel to load the "u132-hcd" module. | 52 | * the kernel to load the "u132-hcd" module. |
53 | * | 53 | * |
54 | * The "ftdi-u132" module provides the interface to the inserted | 54 | * The "ftdi-u132" module provides the interface to the inserted |
55 | * PC card and the "u132-hcd" module uses the API to send and recieve | 55 | * PC card and the "u132-hcd" module uses the API to send and receive |
56 | * data. The API features call-backs, so that part of the "u132-hcd" | 56 | * data. The API features call-backs, so that part of the "u132-hcd" |
57 | * module code will run in the context of one of the kernel threads | 57 | * module code will run in the context of one of the kernel threads |
58 | * of the "ftdi-u132" module. | 58 | * of the "ftdi-u132" module. |
@@ -95,3 +95,7 @@ int usb_ftdi_elan_edset_setup(struct platform_device *pdev, u8 ed_number, | |||
95 | int halted, int skipped, int actual, int non_null)); | 95 | int halted, int skipped, int actual, int non_null)); |
96 | int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number, | 96 | int usb_ftdi_elan_edset_flush(struct platform_device *pdev, u8 ed_number, |
97 | void *endp); | 97 | void *endp); |
98 | int usb_ftdi_elan_read_pcimem(struct platform_device *pdev, int mem_offset, | ||
99 | u8 width, u32 *data); | ||
100 | int usb_ftdi_elan_write_pcimem(struct platform_device *pdev, int mem_offset, | ||
101 | u8 width, u32 data); | ||
diff --git a/drivers/usb/misc/usbtest.c b/drivers/usb/misc/usbtest.c index 7c2cbdf81d20..194065dbb51f 100644 --- a/drivers/usb/misc/usbtest.c +++ b/drivers/usb/misc/usbtest.c | |||
@@ -138,7 +138,7 @@ get_endpoints (struct usbtest_dev *dev, struct usb_interface *intf) | |||
138 | default: | 138 | default: |
139 | continue; | 139 | continue; |
140 | } | 140 | } |
141 | if (e->desc.bEndpointAddress & USB_DIR_IN) { | 141 | if (usb_endpoint_dir_in(&e->desc)) { |
142 | if (!in) | 142 | if (!in) |
143 | in = e; | 143 | in = e; |
144 | } else { | 144 | } else { |
@@ -147,7 +147,7 @@ get_endpoints (struct usbtest_dev *dev, struct usb_interface *intf) | |||
147 | } | 147 | } |
148 | continue; | 148 | continue; |
149 | try_iso: | 149 | try_iso: |
150 | if (e->desc.bEndpointAddress & USB_DIR_IN) { | 150 | if (usb_endpoint_dir_in(&e->desc)) { |
151 | if (!iso_in) | 151 | if (!iso_in) |
152 | iso_in = e; | 152 | iso_in = e; |
153 | } else { | 153 | } else { |
diff --git a/drivers/usb/net/asix.c b/drivers/usb/net/asix.c index 881841e600de..95e682e2c9d6 100644 --- a/drivers/usb/net/asix.c +++ b/drivers/usb/net/asix.c | |||
@@ -249,9 +249,9 @@ asix_write_cmd_async(struct usbnet *dev, u8 cmd, u16 value, u16 index, | |||
249 | 249 | ||
250 | req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; | 250 | req->bRequestType = USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_DEVICE; |
251 | req->bRequest = cmd; | 251 | req->bRequest = cmd; |
252 | req->wValue = value; | 252 | req->wValue = cpu_to_le16(value); |
253 | req->wIndex = index; | 253 | req->wIndex = cpu_to_le16(index); |
254 | req->wLength = size; | 254 | req->wLength = cpu_to_le16(size); |
255 | 255 | ||
256 | usb_fill_control_urb(urb, dev->udev, | 256 | usb_fill_control_urb(urb, dev->udev, |
257 | usb_sndctrlpipe(dev->udev, 0), | 257 | usb_sndctrlpipe(dev->udev, 0), |
diff --git a/drivers/usb/net/catc.c b/drivers/usb/net/catc.c index f740325abac4..907b820a5faf 100644 --- a/drivers/usb/net/catc.c +++ b/drivers/usb/net/catc.c | |||
@@ -786,14 +786,10 @@ static int catc_probe(struct usb_interface *intf, const struct usb_device_id *id | |||
786 | if ((!catc->ctrl_urb) || (!catc->tx_urb) || | 786 | if ((!catc->ctrl_urb) || (!catc->tx_urb) || |
787 | (!catc->rx_urb) || (!catc->irq_urb)) { | 787 | (!catc->rx_urb) || (!catc->irq_urb)) { |
788 | err("No free urbs available."); | 788 | err("No free urbs available."); |
789 | if (catc->ctrl_urb) | 789 | usb_free_urb(catc->ctrl_urb); |
790 | usb_free_urb(catc->ctrl_urb); | 790 | usb_free_urb(catc->tx_urb); |
791 | if (catc->tx_urb) | 791 | usb_free_urb(catc->rx_urb); |
792 | usb_free_urb(catc->tx_urb); | 792 | usb_free_urb(catc->irq_urb); |
793 | if (catc->rx_urb) | ||
794 | usb_free_urb(catc->rx_urb); | ||
795 | if (catc->irq_urb) | ||
796 | usb_free_urb(catc->irq_urb); | ||
797 | free_netdev(netdev); | 793 | free_netdev(netdev); |
798 | return -ENOMEM; | 794 | return -ENOMEM; |
799 | } | 795 | } |
diff --git a/drivers/usb/net/cdc_ether.c b/drivers/usb/net/cdc_ether.c index f6971b88349d..44a91547146e 100644 --- a/drivers/usb/net/cdc_ether.c +++ b/drivers/usb/net/cdc_ether.c | |||
@@ -200,8 +200,7 @@ next_desc: | |||
200 | 200 | ||
201 | dev->status = &info->control->cur_altsetting->endpoint [0]; | 201 | dev->status = &info->control->cur_altsetting->endpoint [0]; |
202 | desc = &dev->status->desc; | 202 | desc = &dev->status->desc; |
203 | if (desc->bmAttributes != USB_ENDPOINT_XFER_INT | 203 | if (!usb_endpoint_is_int_in(desc) |
204 | || !(desc->bEndpointAddress & USB_DIR_IN) | ||
205 | || (le16_to_cpu(desc->wMaxPacketSize) | 204 | || (le16_to_cpu(desc->wMaxPacketSize) |
206 | < sizeof(struct usb_cdc_notification)) | 205 | < sizeof(struct usb_cdc_notification)) |
207 | || !desc->bInterval) { | 206 | || !desc->bInterval) { |
diff --git a/drivers/usb/net/net1080.c b/drivers/usb/net/net1080.c index ce00de8f13a1..a77410562e12 100644 --- a/drivers/usb/net/net1080.c +++ b/drivers/usb/net/net1080.c | |||
@@ -237,12 +237,12 @@ static inline void nc_dump_usbctl(struct usbnet *dev, u16 usbctl) | |||
237 | #define STATUS_CONN_OTHER (1 << 14) | 237 | #define STATUS_CONN_OTHER (1 << 14) |
238 | #define STATUS_SUSPEND_OTHER (1 << 13) | 238 | #define STATUS_SUSPEND_OTHER (1 << 13) |
239 | #define STATUS_MAILBOX_OTHER (1 << 12) | 239 | #define STATUS_MAILBOX_OTHER (1 << 12) |
240 | #define STATUS_PACKETS_OTHER(n) (((n) >> 8) && 0x03) | 240 | #define STATUS_PACKETS_OTHER(n) (((n) >> 8) & 0x03) |
241 | 241 | ||
242 | #define STATUS_CONN_THIS (1 << 6) | 242 | #define STATUS_CONN_THIS (1 << 6) |
243 | #define STATUS_SUSPEND_THIS (1 << 5) | 243 | #define STATUS_SUSPEND_THIS (1 << 5) |
244 | #define STATUS_MAILBOX_THIS (1 << 4) | 244 | #define STATUS_MAILBOX_THIS (1 << 4) |
245 | #define STATUS_PACKETS_THIS(n) (((n) >> 0) && 0x03) | 245 | #define STATUS_PACKETS_THIS(n) (((n) >> 0) & 0x03) |
246 | 246 | ||
247 | #define STATUS_UNSPEC_MASK 0x0c8c | 247 | #define STATUS_UNSPEC_MASK 0x0c8c |
248 | #define STATUS_NOISE_MASK ((u16)~(0x0303|STATUS_UNSPEC_MASK)) | 248 | #define STATUS_NOISE_MASK ((u16)~(0x0303|STATUS_UNSPEC_MASK)) |
diff --git a/drivers/usb/net/pegasus.c b/drivers/usb/net/pegasus.c index 78cf6f091285..b5690b3834e3 100644 --- a/drivers/usb/net/pegasus.c +++ b/drivers/usb/net/pegasus.c | |||
@@ -163,6 +163,7 @@ static int get_registers(pegasus_t * pegasus, __u16 indx, __u16 size, | |||
163 | 163 | ||
164 | /* using ATOMIC, we'd never wake up if we slept */ | 164 | /* using ATOMIC, we'd never wake up if we slept */ |
165 | if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { | 165 | if ((ret = usb_submit_urb(pegasus->ctrl_urb, GFP_ATOMIC))) { |
166 | set_current_state(TASK_RUNNING); | ||
166 | if (ret == -ENODEV) | 167 | if (ret == -ENODEV) |
167 | netif_device_detach(pegasus->net); | 168 | netif_device_detach(pegasus->net); |
168 | if (netif_msg_drv(pegasus)) | 169 | if (netif_msg_drv(pegasus)) |
diff --git a/drivers/usb/net/usbnet.c b/drivers/usb/net/usbnet.c index 79b5474fe234..327f97555679 100644 --- a/drivers/usb/net/usbnet.c +++ b/drivers/usb/net/usbnet.c | |||
@@ -116,7 +116,7 @@ int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf) | |||
116 | e = alt->endpoint + ep; | 116 | e = alt->endpoint + ep; |
117 | switch (e->desc.bmAttributes) { | 117 | switch (e->desc.bmAttributes) { |
118 | case USB_ENDPOINT_XFER_INT: | 118 | case USB_ENDPOINT_XFER_INT: |
119 | if (!(e->desc.bEndpointAddress & USB_DIR_IN)) | 119 | if (!usb_endpoint_dir_in(&e->desc)) |
120 | continue; | 120 | continue; |
121 | intr = 1; | 121 | intr = 1; |
122 | /* FALLTHROUGH */ | 122 | /* FALLTHROUGH */ |
@@ -125,7 +125,7 @@ int usbnet_get_endpoints(struct usbnet *dev, struct usb_interface *intf) | |||
125 | default: | 125 | default: |
126 | continue; | 126 | continue; |
127 | } | 127 | } |
128 | if (e->desc.bEndpointAddress & USB_DIR_IN) { | 128 | if (usb_endpoint_dir_in(&e->desc)) { |
129 | if (!intr && !in) | 129 | if (!intr && !in) |
130 | in = e; | 130 | in = e; |
131 | else if (intr && !status) | 131 | else if (intr && !status) |
diff --git a/drivers/usb/serial/Kconfig b/drivers/usb/serial/Kconfig index 2a8dd4cc943d..2f4d303ee36f 100644 --- a/drivers/usb/serial/Kconfig +++ b/drivers/usb/serial/Kconfig | |||
@@ -554,6 +554,17 @@ config USB_SERIAL_OMNINET | |||
554 | To compile this driver as a module, choose M here: the | 554 | To compile this driver as a module, choose M here: the |
555 | module will be called omninet. | 555 | module will be called omninet. |
556 | 556 | ||
557 | config USB_SERIAL_DEBUG | ||
558 | tristate "USB Debugging Device" | ||
559 | depends on USB_SERIAL | ||
560 | help | ||
561 | Say Y here if you have a USB debugging device used to recieve | ||
562 | debugging data from another machine. The most common of these | ||
563 | devices is the NetChip TurboCONNECT device. | ||
564 | |||
565 | To compile this driver as a module, choose M here: the | ||
566 | module will be called usb-debug. | ||
567 | |||
557 | config USB_EZUSB | 568 | config USB_EZUSB |
558 | bool | 569 | bool |
559 | depends on USB_SERIAL_KEYSPAN_PDA || USB_SERIAL_XIRCOM || USB_SERIAL_KEYSPAN || USB_SERIAL_WHITEHEAT | 570 | depends on USB_SERIAL_KEYSPAN_PDA || USB_SERIAL_XIRCOM || USB_SERIAL_KEYSPAN || USB_SERIAL_WHITEHEAT |
diff --git a/drivers/usb/serial/Makefile b/drivers/usb/serial/Makefile index a5047dc599bb..61166ad450e6 100644 --- a/drivers/usb/serial/Makefile +++ b/drivers/usb/serial/Makefile | |||
@@ -18,6 +18,7 @@ obj-$(CONFIG_USB_SERIAL_BELKIN) += belkin_sa.o | |||
18 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o | 18 | obj-$(CONFIG_USB_SERIAL_CP2101) += cp2101.o |
19 | obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o | 19 | obj-$(CONFIG_USB_SERIAL_CYBERJACK) += cyberjack.o |
20 | obj-$(CONFIG_USB_SERIAL_CYPRESS_M8) += cypress_m8.o | 20 | obj-$(CONFIG_USB_SERIAL_CYPRESS_M8) += cypress_m8.o |
21 | obj-$(CONFIG_USB_SERIAL_DEBUG) += usb_debug.o | ||
21 | obj-$(CONFIG_USB_SERIAL_DIGI_ACCELEPORT) += digi_acceleport.o | 22 | obj-$(CONFIG_USB_SERIAL_DIGI_ACCELEPORT) += digi_acceleport.o |
22 | obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o | 23 | obj-$(CONFIG_USB_SERIAL_EDGEPORT) += io_edgeport.o |
23 | obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o | 24 | obj-$(CONFIG_USB_SERIAL_EDGEPORT_TI) += io_ti.o |
diff --git a/drivers/usb/serial/aircable.c b/drivers/usb/serial/aircable.c index 2a4ac9bd6a3a..86bcf63b6ba5 100644 --- a/drivers/usb/serial/aircable.c +++ b/drivers/usb/serial/aircable.c | |||
@@ -272,8 +272,11 @@ static void aircable_read(struct work_struct *work) | |||
272 | */ | 272 | */ |
273 | tty = port->tty; | 273 | tty = port->tty; |
274 | 274 | ||
275 | if (!tty) | 275 | if (!tty) { |
276 | schedule_work(&priv->rx_work); | 276 | schedule_work(&priv->rx_work); |
277 | err("%s - No tty available", __FUNCTION__); | ||
278 | return ; | ||
279 | } | ||
277 | 280 | ||
278 | count = min(64, serial_buf_data_avail(priv->rx_buf)); | 281 | count = min(64, serial_buf_data_avail(priv->rx_buf)); |
279 | 282 | ||
@@ -307,9 +310,7 @@ static int aircable_probe(struct usb_serial *serial, | |||
307 | 310 | ||
308 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { | 311 | for (i = 0; i < iface_desc->desc.bNumEndpoints; i++) { |
309 | endpoint = &iface_desc->endpoint[i].desc; | 312 | endpoint = &iface_desc->endpoint[i].desc; |
310 | if (((endpoint->bEndpointAddress & 0x80) == 0x00) && | 313 | if (usb_endpoint_is_bulk_out(endpoint)) { |
311 | ((endpoint->bmAttributes & 3) == 0x02)) { | ||
312 | /* we found our bulk out endpoint */ | ||
313 | dbg("found bulk out on endpoint %d", i); | 314 | dbg("found bulk out on endpoint %d", i); |
314 | ++num_bulk_out; | 315 | ++num_bulk_out; |
315 | } | 316 | } |
diff --git a/drivers/usb/serial/airprime.c b/drivers/usb/serial/airprime.c index 7f5d546da39a..96c73726d74a 100644 --- a/drivers/usb/serial/airprime.c +++ b/drivers/usb/serial/airprime.c | |||
@@ -19,6 +19,7 @@ | |||
19 | static struct usb_device_id id_table [] = { | 19 | static struct usb_device_id id_table [] = { |
20 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ | 20 | { USB_DEVICE(0x0c88, 0x17da) }, /* Kyocera Wireless KPC650/Passport */ |
21 | { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */ | 21 | { USB_DEVICE(0x1410, 0x1110) }, /* Novatel Wireless Merlin CDMA */ |
22 | { USB_DEVICE(0x1410, 0x1430) }, /* Novatel Merlin XU870 HSDPA/3G */ | ||
22 | { USB_DEVICE(0x1410, 0x1100) }, /* ExpressCard34 Qualcomm 3G CDMA */ | 23 | { USB_DEVICE(0x1410, 0x1100) }, /* ExpressCard34 Qualcomm 3G CDMA */ |
23 | { }, | 24 | { }, |
24 | }; | 25 | }; |
diff --git a/drivers/usb/serial/ark3116.c b/drivers/usb/serial/ark3116.c index ca52f12f0e24..863966c1c5ac 100644 --- a/drivers/usb/serial/ark3116.c +++ b/drivers/usb/serial/ark3116.c | |||
@@ -85,10 +85,9 @@ static int ark3116_attach(struct usb_serial *serial) | |||
85 | int i; | 85 | int i; |
86 | 86 | ||
87 | for (i = 0; i < serial->num_ports; ++i) { | 87 | for (i = 0; i < serial->num_ports; ++i) { |
88 | priv = kmalloc(sizeof (struct ark3116_private), GFP_KERNEL); | 88 | priv = kzalloc(sizeof(struct ark3116_private), GFP_KERNEL); |
89 | if (!priv) | 89 | if (!priv) |
90 | goto cleanup; | 90 | goto cleanup; |
91 | memset(priv, 0x00, sizeof (struct ark3116_private)); | ||
92 | spin_lock_init(&priv->lock); | 91 | spin_lock_init(&priv->lock); |
93 | 92 | ||
94 | usb_set_serial_port_data(serial->port[i], priv); | 93 | usb_set_serial_port_data(serial->port[i], priv); |
diff --git a/drivers/usb/serial/console.c b/drivers/usb/serial/console.c index 3a9073dbfe6a..7167728d764c 100644 --- a/drivers/usb/serial/console.c +++ b/drivers/usb/serial/console.c | |||
@@ -166,19 +166,17 @@ static int usb_console_setup(struct console *co, char *options) | |||
166 | if (serial->type->set_termios) { | 166 | if (serial->type->set_termios) { |
167 | /* build up a fake tty structure so that the open call has something | 167 | /* build up a fake tty structure so that the open call has something |
168 | * to look at to get the cflag value */ | 168 | * to look at to get the cflag value */ |
169 | tty = kmalloc (sizeof (*tty), GFP_KERNEL); | 169 | tty = kzalloc(sizeof(*tty), GFP_KERNEL); |
170 | if (!tty) { | 170 | if (!tty) { |
171 | err ("no more memory"); | 171 | err ("no more memory"); |
172 | return -ENOMEM; | 172 | return -ENOMEM; |
173 | } | 173 | } |
174 | termios = kmalloc (sizeof (*termios), GFP_KERNEL); | 174 | termios = kzalloc(sizeof(*termios), GFP_KERNEL); |
175 | if (!termios) { | 175 | if (!termios) { |
176 | err ("no more memory"); | 176 | err ("no more memory"); |
177 | kfree (tty); | 177 | kfree (tty); |
178 | return -ENOMEM; | 178 | return -ENOMEM; |
179 | } | 179 | } |
180 | memset (tty, 0x00, sizeof(*tty)); | ||
181 | memset (termios, 0x00, sizeof(*termios)); | ||
182 | termios->c_cflag = cflag; | 180 | termios->c_cflag = cflag; |
183 | tty->termios = termios; | 181 | tty->termios = termios; |
184 | port->tty = tty; | 182 | port->tty = tty; |
diff --git a/drivers/usb/serial/cypress_m8.c b/drivers/usb/serial/cypress_m8.c index f2e89a083659..093f303b3189 100644 --- a/drivers/usb/serial/cypress_m8.c +++ b/drivers/usb/serial/cypress_m8.c | |||
@@ -1684,15 +1684,14 @@ static int __init cypress_init(void) | |||
1684 | 1684 | ||
1685 | info(DRIVER_DESC " " DRIVER_VERSION); | 1685 | info(DRIVER_DESC " " DRIVER_VERSION); |
1686 | return 0; | 1686 | return 0; |
1687 | |||
1687 | failed_usb_register: | 1688 | failed_usb_register: |
1688 | usb_deregister(&cypress_driver); | ||
1689 | failed_ca42v2_register: | ||
1690 | usb_serial_deregister(&cypress_ca42v2_device); | 1689 | usb_serial_deregister(&cypress_ca42v2_device); |
1691 | failed_hidcom_register: | 1690 | failed_ca42v2_register: |
1692 | usb_serial_deregister(&cypress_hidcom_device); | 1691 | usb_serial_deregister(&cypress_hidcom_device); |
1693 | failed_em_register: | 1692 | failed_hidcom_register: |
1694 | usb_serial_deregister(&cypress_earthmate_device); | 1693 | usb_serial_deregister(&cypress_earthmate_device); |
1695 | 1694 | failed_em_register: | |
1696 | return retval; | 1695 | return retval; |
1697 | } | 1696 | } |
1698 | 1697 | ||
diff --git a/drivers/usb/serial/digi_acceleport.c b/drivers/usb/serial/digi_acceleport.c index fd159b040bfb..83d0e21145b0 100644 --- a/drivers/usb/serial/digi_acceleport.c +++ b/drivers/usb/serial/digi_acceleport.c | |||
@@ -157,7 +157,7 @@ | |||
157 | * to TASK_RUNNING will be lost and write_chan's subsequent call to | 157 | * to TASK_RUNNING will be lost and write_chan's subsequent call to |
158 | * schedule() will never return (unless it catches a signal). | 158 | * schedule() will never return (unless it catches a signal). |
159 | * This race condition occurs because write_bulk_callback() (and thus | 159 | * This race condition occurs because write_bulk_callback() (and thus |
160 | * the wakeup) are called asynchonously from an interrupt, rather than | 160 | * the wakeup) are called asynchronously from an interrupt, rather than |
161 | * from the scheduler. We can avoid the race by calling the wakeup | 161 | * from the scheduler. We can avoid the race by calling the wakeup |
162 | * from the scheduler queue and that's our fix: Now, at the end of | 162 | * from the scheduler queue and that's our fix: Now, at the end of |
163 | * write_bulk_callback() we queue up a wakeup call on the scheduler | 163 | * write_bulk_callback() we queue up a wakeup call on the scheduler |
diff --git a/drivers/usb/serial/ezusb.c b/drivers/usb/serial/ezusb.c index 5169c2d154ab..97ee718b1da2 100644 --- a/drivers/usb/serial/ezusb.c +++ b/drivers/usb/serial/ezusb.c | |||
@@ -31,12 +31,11 @@ int ezusb_writememory (struct usb_serial *serial, int address, unsigned char *da | |||
31 | return -ENODEV; | 31 | return -ENODEV; |
32 | } | 32 | } |
33 | 33 | ||
34 | transfer_buffer = kmalloc (length, GFP_KERNEL); | 34 | transfer_buffer = kmemdup(data, length, GFP_KERNEL); |
35 | if (!transfer_buffer) { | 35 | if (!transfer_buffer) { |
36 | dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, length); | 36 | dev_err(&serial->dev->dev, "%s - kmalloc(%d) failed.\n", __FUNCTION__, length); |
37 | return -ENOMEM; | 37 | return -ENOMEM; |
38 | } | 38 | } |
39 | memcpy (transfer_buffer, data, length); | ||
40 | result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), bRequest, 0x40, address, 0, transfer_buffer, length, 3000); | 39 | result = usb_control_msg (serial->dev, usb_sndctrlpipe(serial->dev, 0), bRequest, 0x40, address, 0, transfer_buffer, length, 3000); |
41 | kfree (transfer_buffer); | 40 | kfree (transfer_buffer); |
42 | return result; | 41 | return result; |
diff --git a/drivers/usb/serial/ftdi_sio.c b/drivers/usb/serial/ftdi_sio.c index 88ed5c1d236c..72e4d48f51e9 100644 --- a/drivers/usb/serial/ftdi_sio.c +++ b/drivers/usb/serial/ftdi_sio.c | |||
@@ -1390,8 +1390,7 @@ static void ftdi_close (struct usb_serial_port *port, struct file *filp) | |||
1390 | flush_scheduled_work(); | 1390 | flush_scheduled_work(); |
1391 | 1391 | ||
1392 | /* shutdown our bulk read */ | 1392 | /* shutdown our bulk read */ |
1393 | if (port->read_urb) | 1393 | usb_kill_urb(port->read_urb); |
1394 | usb_kill_urb(port->read_urb); | ||
1395 | } /* ftdi_close */ | 1394 | } /* ftdi_close */ |
1396 | 1395 | ||
1397 | 1396 | ||
diff --git a/drivers/usb/serial/garmin_gps.c b/drivers/usb/serial/garmin_gps.c index 4543152a9966..6530d391ebed 100644 --- a/drivers/usb/serial/garmin_gps.c +++ b/drivers/usb/serial/garmin_gps.c | |||
@@ -1523,12 +1523,11 @@ static int garmin_attach (struct usb_serial *serial) | |||
1523 | 1523 | ||
1524 | dbg("%s", __FUNCTION__); | 1524 | dbg("%s", __FUNCTION__); |
1525 | 1525 | ||
1526 | garmin_data_p = kmalloc (sizeof(struct garmin_data), GFP_KERNEL); | 1526 | garmin_data_p = kzalloc(sizeof(struct garmin_data), GFP_KERNEL); |
1527 | if (garmin_data_p == NULL) { | 1527 | if (garmin_data_p == NULL) { |
1528 | dev_err(&port->dev, "%s - Out of memory\n", __FUNCTION__); | 1528 | dev_err(&port->dev, "%s - Out of memory\n", __FUNCTION__); |
1529 | return -ENOMEM; | 1529 | return -ENOMEM; |
1530 | } | 1530 | } |
1531 | memset (garmin_data_p, 0, sizeof(struct garmin_data)); | ||
1532 | init_timer(&garmin_data_p->timer); | 1531 | init_timer(&garmin_data_p->timer); |
1533 | spin_lock_init(&garmin_data_p->lock); | 1532 | spin_lock_init(&garmin_data_p->lock); |
1534 | INIT_LIST_HEAD(&garmin_data_p->pktlist); | 1533 | INIT_LIST_HEAD(&garmin_data_p->pktlist); |
diff --git a/drivers/usb/serial/io_edgeport.c b/drivers/usb/serial/io_edgeport.c index 91bd3014ef1e..d06547a13f28 100644 --- a/drivers/usb/serial/io_edgeport.c +++ b/drivers/usb/serial/io_edgeport.c | |||
@@ -1038,9 +1038,7 @@ static void edge_close (struct usb_serial_port *port, struct file * filp) | |||
1038 | edge_port->open = FALSE; | 1038 | edge_port->open = FALSE; |
1039 | edge_port->openPending = FALSE; | 1039 | edge_port->openPending = FALSE; |
1040 | 1040 | ||
1041 | if (edge_port->write_urb) { | 1041 | usb_kill_urb(edge_port->write_urb); |
1042 | usb_kill_urb(edge_port->write_urb); | ||
1043 | } | ||
1044 | 1042 | ||
1045 | if (edge_port->write_urb) { | 1043 | if (edge_port->write_urb) { |
1046 | /* if this urb had a transfer buffer already (old transfer) free it */ | 1044 | /* if this urb had a transfer buffer already (old transfer) free it */ |
diff --git a/drivers/usb/serial/ipw.c b/drivers/usb/serial/ipw.c index 2a4bb66691ad..d3b9a351cef8 100644 --- a/drivers/usb/serial/ipw.c +++ b/drivers/usb/serial/ipw.c | |||
@@ -206,10 +206,9 @@ static int ipw_open(struct usb_serial_port *port, struct file *filp) | |||
206 | 206 | ||
207 | dbg("%s", __FUNCTION__); | 207 | dbg("%s", __FUNCTION__); |
208 | 208 | ||
209 | buf_flow_init = kmalloc(16, GFP_KERNEL); | 209 | buf_flow_init = kmemdup(buf_flow_static, 16, GFP_KERNEL); |
210 | if (!buf_flow_init) | 210 | if (!buf_flow_init) |
211 | return -ENOMEM; | 211 | return -ENOMEM; |
212 | memcpy(buf_flow_init, buf_flow_static, 16); | ||
213 | 212 | ||
214 | if (port->tty) | 213 | if (port->tty) |
215 | port->tty->low_latency = 1; | 214 | port->tty->low_latency = 1; |
diff --git a/drivers/usb/serial/keyspan.c b/drivers/usb/serial/keyspan.c index 53be824eb1bf..7639652cec42 100644 --- a/drivers/usb/serial/keyspan.c +++ b/drivers/usb/serial/keyspan.c | |||
@@ -2306,22 +2306,16 @@ static void keyspan_shutdown (struct usb_serial *serial) | |||
2306 | } | 2306 | } |
2307 | 2307 | ||
2308 | /* Now free them */ | 2308 | /* Now free them */ |
2309 | if (s_priv->instat_urb) | 2309 | usb_free_urb(s_priv->instat_urb); |
2310 | usb_free_urb(s_priv->instat_urb); | 2310 | usb_free_urb(s_priv->glocont_urb); |
2311 | if (s_priv->glocont_urb) | ||
2312 | usb_free_urb(s_priv->glocont_urb); | ||
2313 | for (i = 0; i < serial->num_ports; ++i) { | 2311 | for (i = 0; i < serial->num_ports; ++i) { |
2314 | port = serial->port[i]; | 2312 | port = serial->port[i]; |
2315 | p_priv = usb_get_serial_port_data(port); | 2313 | p_priv = usb_get_serial_port_data(port); |
2316 | if (p_priv->inack_urb) | 2314 | usb_free_urb(p_priv->inack_urb); |
2317 | usb_free_urb(p_priv->inack_urb); | 2315 | usb_free_urb(p_priv->outcont_urb); |
2318 | if (p_priv->outcont_urb) | ||
2319 | usb_free_urb(p_priv->outcont_urb); | ||
2320 | for (j = 0; j < 2; j++) { | 2316 | for (j = 0; j < 2; j++) { |
2321 | if (p_priv->in_urbs[j]) | 2317 | usb_free_urb(p_priv->in_urbs[j]); |
2322 | usb_free_urb(p_priv->in_urbs[j]); | 2318 | usb_free_urb(p_priv->out_urbs[j]); |
2323 | if (p_priv->out_urbs[j]) | ||
2324 | usb_free_urb(p_priv->out_urbs[j]); | ||
2325 | } | 2319 | } |
2326 | } | 2320 | } |
2327 | 2321 | ||
diff --git a/drivers/usb/serial/kobil_sct.c b/drivers/usb/serial/kobil_sct.c index ff03331e0bcf..237289920f03 100644 --- a/drivers/usb/serial/kobil_sct.c +++ b/drivers/usb/serial/kobil_sct.c | |||
@@ -185,13 +185,11 @@ static int kobil_startup (struct usb_serial *serial) | |||
185 | 185 | ||
186 | for (i = 0; i < altsetting->desc.bNumEndpoints; i++) { | 186 | for (i = 0; i < altsetting->desc.bNumEndpoints; i++) { |
187 | endpoint = &altsetting->endpoint[i]; | 187 | endpoint = &altsetting->endpoint[i]; |
188 | if (((endpoint->desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) && | 188 | if (usb_endpoint_is_int_out(&endpoint->desc)) { |
189 | ((endpoint->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
190 | dbg("%s Found interrupt out endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress); | 189 | dbg("%s Found interrupt out endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress); |
191 | priv->write_int_endpoint_address = endpoint->desc.bEndpointAddress; | 190 | priv->write_int_endpoint_address = endpoint->desc.bEndpointAddress; |
192 | } | 191 | } |
193 | if (((endpoint->desc.bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_IN) && | 192 | if (usb_endpoint_is_int_in(&endpoint->desc)) { |
194 | ((endpoint->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)) { | ||
195 | dbg("%s Found interrupt in endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress); | 193 | dbg("%s Found interrupt in endpoint. Address: %d", __FUNCTION__, endpoint->desc.bEndpointAddress); |
196 | priv->read_int_endpoint_address = endpoint->desc.bEndpointAddress; | 194 | priv->read_int_endpoint_address = endpoint->desc.bEndpointAddress; |
197 | } | 195 | } |
@@ -355,8 +353,7 @@ static void kobil_close (struct usb_serial_port *port, struct file *filp) | |||
355 | usb_free_urb( port->write_urb ); | 353 | usb_free_urb( port->write_urb ); |
356 | port->write_urb = NULL; | 354 | port->write_urb = NULL; |
357 | } | 355 | } |
358 | if (port->interrupt_in_urb) | 356 | usb_kill_urb(port->interrupt_in_urb); |
359 | usb_kill_urb(port->interrupt_in_urb); | ||
360 | } | 357 | } |
361 | 358 | ||
362 | 359 | ||
diff --git a/drivers/usb/serial/mct_u232.c b/drivers/usb/serial/mct_u232.c index b7582cc496dc..a906e500a02b 100644 --- a/drivers/usb/serial/mct_u232.c +++ b/drivers/usb/serial/mct_u232.c | |||
@@ -358,10 +358,8 @@ static int mct_u232_startup (struct usb_serial *serial) | |||
358 | /* Puh, that's dirty */ | 358 | /* Puh, that's dirty */ |
359 | port = serial->port[0]; | 359 | port = serial->port[0]; |
360 | rport = serial->port[1]; | 360 | rport = serial->port[1]; |
361 | if (port->read_urb) { | 361 | /* No unlinking, it wasn't submitted yet. */ |
362 | /* No unlinking, it wasn't submitted yet. */ | 362 | usb_free_urb(port->read_urb); |
363 | usb_free_urb(port->read_urb); | ||
364 | } | ||
365 | port->read_urb = rport->interrupt_in_urb; | 363 | port->read_urb = rport->interrupt_in_urb; |
366 | rport->interrupt_in_urb = NULL; | 364 | rport->interrupt_in_urb = NULL; |
367 | port->read_urb->context = port; | 365 | port->read_urb->context = port; |
diff --git a/drivers/usb/serial/mos7840.c b/drivers/usb/serial/mos7840.c index 5b71962d0351..02c89e10b2cf 100644 --- a/drivers/usb/serial/mos7840.c +++ b/drivers/usb/serial/mos7840.c | |||
@@ -2596,12 +2596,11 @@ static int mos7840_startup(struct usb_serial *serial) | |||
2596 | 2596 | ||
2597 | /* set up port private structures */ | 2597 | /* set up port private structures */ |
2598 | for (i = 0; i < serial->num_ports; ++i) { | 2598 | for (i = 0; i < serial->num_ports; ++i) { |
2599 | mos7840_port = kmalloc(sizeof(struct moschip_port), GFP_KERNEL); | 2599 | mos7840_port = kzalloc(sizeof(struct moschip_port), GFP_KERNEL); |
2600 | if (mos7840_port == NULL) { | 2600 | if (mos7840_port == NULL) { |
2601 | err("%s - Out of memory", __FUNCTION__); | 2601 | err("%s - Out of memory", __FUNCTION__); |
2602 | return -ENOMEM; | 2602 | return -ENOMEM; |
2603 | } | 2603 | } |
2604 | memset(mos7840_port, 0, sizeof(struct moschip_port)); | ||
2605 | 2604 | ||
2606 | /* Initialize all port interrupt end point to port 0 int endpoint * | 2605 | /* Initialize all port interrupt end point to port 0 int endpoint * |
2607 | * Our device has only one interrupt end point comman to all port */ | 2606 | * Our device has only one interrupt end point comman to all port */ |
diff --git a/drivers/usb/serial/navman.c b/drivers/usb/serial/navman.c index 0610409a6568..054abee81652 100644 --- a/drivers/usb/serial/navman.c +++ b/drivers/usb/serial/navman.c | |||
@@ -95,8 +95,7 @@ static void navman_close(struct usb_serial_port *port, struct file *filp) | |||
95 | { | 95 | { |
96 | dbg("%s - port %d", __FUNCTION__, port->number); | 96 | dbg("%s - port %d", __FUNCTION__, port->number); |
97 | 97 | ||
98 | if (port->interrupt_in_urb) | 98 | usb_kill_urb(port->interrupt_in_urb); |
99 | usb_kill_urb(port->interrupt_in_urb); | ||
100 | } | 99 | } |
101 | 100 | ||
102 | static int navman_write(struct usb_serial_port *port, | 101 | static int navman_write(struct usb_serial_port *port, |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.c b/drivers/usb/serial/ti_usb_3410_5052.c index 07400c0c8a8c..ae98d8cbdbb8 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.c +++ b/drivers/usb/serial/ti_usb_3410_5052.c | |||
@@ -228,6 +228,7 @@ static int product_5052_count; | |||
228 | /* null entry */ | 228 | /* null entry */ |
229 | static struct usb_device_id ti_id_table_3410[1+TI_EXTRA_VID_PID_COUNT+1] = { | 229 | static struct usb_device_id ti_id_table_3410[1+TI_EXTRA_VID_PID_COUNT+1] = { |
230 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, | 230 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, |
231 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, | ||
231 | }; | 232 | }; |
232 | 233 | ||
233 | static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = { | 234 | static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = { |
@@ -239,6 +240,7 @@ static struct usb_device_id ti_id_table_5052[4+TI_EXTRA_VID_PID_COUNT+1] = { | |||
239 | 240 | ||
240 | static struct usb_device_id ti_id_table_combined[] = { | 241 | static struct usb_device_id ti_id_table_combined[] = { |
241 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, | 242 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_PRODUCT_ID) }, |
243 | { USB_DEVICE(TI_VENDOR_ID, TI_3410_EZ430_ID) }, | ||
242 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, | 244 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_BOOT_PRODUCT_ID) }, |
243 | { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, | 245 | { USB_DEVICE(TI_VENDOR_ID, TI_5152_BOOT_PRODUCT_ID) }, |
244 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, | 246 | { USB_DEVICE(TI_VENDOR_ID, TI_5052_EEPROM_PRODUCT_ID) }, |
@@ -459,13 +461,12 @@ static int ti_startup(struct usb_serial *serial) | |||
459 | 461 | ||
460 | /* set up port structures */ | 462 | /* set up port structures */ |
461 | for (i = 0; i < serial->num_ports; ++i) { | 463 | for (i = 0; i < serial->num_ports; ++i) { |
462 | tport = kmalloc(sizeof(struct ti_port), GFP_KERNEL); | 464 | tport = kzalloc(sizeof(struct ti_port), GFP_KERNEL); |
463 | if (tport == NULL) { | 465 | if (tport == NULL) { |
464 | dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__); | 466 | dev_err(&dev->dev, "%s - out of memory\n", __FUNCTION__); |
465 | status = -ENOMEM; | 467 | status = -ENOMEM; |
466 | goto free_tports; | 468 | goto free_tports; |
467 | } | 469 | } |
468 | memset(tport, 0, sizeof(struct ti_port)); | ||
469 | spin_lock_init(&tport->tp_lock); | 470 | spin_lock_init(&tport->tp_lock); |
470 | tport->tp_uart_base_addr = (i == 0 ? TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); | 471 | tport->tp_uart_base_addr = (i == 0 ? TI_UART1_BASE_ADDR : TI_UART2_BASE_ADDR); |
471 | tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0; | 472 | tport->tp_flags = low_latency ? ASYNC_LOW_LATENCY : 0; |
diff --git a/drivers/usb/serial/ti_usb_3410_5052.h b/drivers/usb/serial/ti_usb_3410_5052.h index 02c1aeb9e1b8..b5541bf991ba 100644 --- a/drivers/usb/serial/ti_usb_3410_5052.h +++ b/drivers/usb/serial/ti_usb_3410_5052.h | |||
@@ -28,6 +28,7 @@ | |||
28 | /* Vendor and product ids */ | 28 | /* Vendor and product ids */ |
29 | #define TI_VENDOR_ID 0x0451 | 29 | #define TI_VENDOR_ID 0x0451 |
30 | #define TI_3410_PRODUCT_ID 0x3410 | 30 | #define TI_3410_PRODUCT_ID 0x3410 |
31 | #define TI_3410_EZ430_ID 0xF430 /* TI ez430 development tool */ | ||
31 | #define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */ | 32 | #define TI_5052_BOOT_PRODUCT_ID 0x5052 /* no EEPROM, no firmware */ |
32 | #define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */ | 33 | #define TI_5152_BOOT_PRODUCT_ID 0x5152 /* no EEPROM, no firmware */ |
33 | #define TI_5052_EEPROM_PRODUCT_ID 0x505A /* EEPROM, no firmware */ | 34 | #define TI_5052_EEPROM_PRODUCT_ID 0x505A /* EEPROM, no firmware */ |
diff --git a/drivers/usb/serial/usb-serial.c b/drivers/usb/serial/usb-serial.c index 2cfba8488a93..3d5072f14b8d 100644 --- a/drivers/usb/serial/usb-serial.c +++ b/drivers/usb/serial/usb-serial.c | |||
@@ -953,32 +953,28 @@ probe_error: | |||
953 | port = serial->port[i]; | 953 | port = serial->port[i]; |
954 | if (!port) | 954 | if (!port) |
955 | continue; | 955 | continue; |
956 | if (port->read_urb) | 956 | usb_free_urb(port->read_urb); |
957 | usb_free_urb (port->read_urb); | ||
958 | kfree(port->bulk_in_buffer); | 957 | kfree(port->bulk_in_buffer); |
959 | } | 958 | } |
960 | for (i = 0; i < num_bulk_out; ++i) { | 959 | for (i = 0; i < num_bulk_out; ++i) { |
961 | port = serial->port[i]; | 960 | port = serial->port[i]; |
962 | if (!port) | 961 | if (!port) |
963 | continue; | 962 | continue; |
964 | if (port->write_urb) | 963 | usb_free_urb(port->write_urb); |
965 | usb_free_urb (port->write_urb); | ||
966 | kfree(port->bulk_out_buffer); | 964 | kfree(port->bulk_out_buffer); |
967 | } | 965 | } |
968 | for (i = 0; i < num_interrupt_in; ++i) { | 966 | for (i = 0; i < num_interrupt_in; ++i) { |
969 | port = serial->port[i]; | 967 | port = serial->port[i]; |
970 | if (!port) | 968 | if (!port) |
971 | continue; | 969 | continue; |
972 | if (port->interrupt_in_urb) | 970 | usb_free_urb(port->interrupt_in_urb); |
973 | usb_free_urb (port->interrupt_in_urb); | ||
974 | kfree(port->interrupt_in_buffer); | 971 | kfree(port->interrupt_in_buffer); |
975 | } | 972 | } |
976 | for (i = 0; i < num_interrupt_out; ++i) { | 973 | for (i = 0; i < num_interrupt_out; ++i) { |
977 | port = serial->port[i]; | 974 | port = serial->port[i]; |
978 | if (!port) | 975 | if (!port) |
979 | continue; | 976 | continue; |
980 | if (port->interrupt_out_urb) | 977 | usb_free_urb(port->interrupt_out_urb); |
981 | usb_free_urb (port->interrupt_out_urb); | ||
982 | kfree(port->interrupt_out_buffer); | 978 | kfree(port->interrupt_out_buffer); |
983 | } | 979 | } |
984 | 980 | ||
diff --git a/drivers/usb/serial/usb_debug.c b/drivers/usb/serial/usb_debug.c new file mode 100644 index 000000000000..257a5e436873 --- /dev/null +++ b/drivers/usb/serial/usb_debug.c | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * USB Debug cable driver | ||
3 | * | ||
4 | * Copyright (C) 2006 Greg Kroah-Hartman <greg@kroah.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or | ||
7 | * modify it under the terms of the GNU General Public License version | ||
8 | * 2 as published by the Free Software Foundation. | ||
9 | */ | ||
10 | |||
11 | #include <linux/kernel.h> | ||
12 | #include <linux/init.h> | ||
13 | #include <linux/tty.h> | ||
14 | #include <linux/module.h> | ||
15 | #include <linux/usb.h> | ||
16 | #include <linux/usb/serial.h> | ||
17 | |||
18 | static struct usb_device_id id_table [] = { | ||
19 | { USB_DEVICE(0x0525, 0x127a) }, | ||
20 | { }, | ||
21 | }; | ||
22 | MODULE_DEVICE_TABLE(usb, id_table); | ||
23 | |||
24 | static struct usb_driver debug_driver = { | ||
25 | .name = "debug", | ||
26 | .probe = usb_serial_probe, | ||
27 | .disconnect = usb_serial_disconnect, | ||
28 | .id_table = id_table, | ||
29 | .no_dynamic_id = 1, | ||
30 | }; | ||
31 | |||
32 | static struct usb_serial_driver debug_device = { | ||
33 | .driver = { | ||
34 | .owner = THIS_MODULE, | ||
35 | .name = "debug", | ||
36 | }, | ||
37 | .id_table = id_table, | ||
38 | .num_interrupt_in = NUM_DONT_CARE, | ||
39 | .num_bulk_in = NUM_DONT_CARE, | ||
40 | .num_bulk_out = NUM_DONT_CARE, | ||
41 | .num_ports = 1, | ||
42 | }; | ||
43 | |||
44 | static int __init debug_init(void) | ||
45 | { | ||
46 | int retval; | ||
47 | |||
48 | retval = usb_serial_register(&debug_device); | ||
49 | if (retval) | ||
50 | return retval; | ||
51 | retval = usb_register(&debug_driver); | ||
52 | if (retval) | ||
53 | usb_serial_deregister(&debug_device); | ||
54 | return retval; | ||
55 | } | ||
56 | |||
57 | static void __exit debug_exit(void) | ||
58 | { | ||
59 | usb_deregister(&debug_driver); | ||
60 | usb_serial_deregister(&debug_device); | ||
61 | } | ||
62 | |||
63 | module_init(debug_init); | ||
64 | module_exit(debug_exit); | ||
65 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/usb/serial/visor.c b/drivers/usb/serial/visor.c index befe2e11a041..eef5eaa5fa0b 100644 --- a/drivers/usb/serial/visor.c +++ b/drivers/usb/serial/visor.c | |||
@@ -348,8 +348,7 @@ static void visor_close (struct usb_serial_port *port, struct file * filp) | |||
348 | 348 | ||
349 | /* shutdown our urbs */ | 349 | /* shutdown our urbs */ |
350 | usb_kill_urb(port->read_urb); | 350 | usb_kill_urb(port->read_urb); |
351 | if (port->interrupt_in_urb) | 351 | usb_kill_urb(port->interrupt_in_urb); |
352 | usb_kill_urb(port->interrupt_in_urb); | ||
353 | 352 | ||
354 | /* Try to send shutdown message, if the device is gone, this will just fail. */ | 353 | /* Try to send shutdown message, if the device is gone, this will just fail. */ |
355 | transfer_buffer = kmalloc (0x12, GFP_KERNEL); | 354 | transfer_buffer = kmalloc (0x12, GFP_KERNEL); |
diff --git a/drivers/usb/storage/onetouch.c b/drivers/usb/storage/onetouch.c index 3baf448e300d..3a158d58441f 100644 --- a/drivers/usb/storage/onetouch.c +++ b/drivers/usb/storage/onetouch.c | |||
@@ -142,10 +142,7 @@ int onetouch_connect_input(struct us_data *ss) | |||
142 | return -ENODEV; | 142 | return -ENODEV; |
143 | 143 | ||
144 | endpoint = &interface->endpoint[2].desc; | 144 | endpoint = &interface->endpoint[2].desc; |
145 | if (!(endpoint->bEndpointAddress & USB_DIR_IN)) | 145 | if (!usb_endpoint_is_int_in(endpoint)) |
146 | return -ENODEV; | ||
147 | if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | ||
148 | != USB_ENDPOINT_XFER_INT) | ||
149 | return -ENODEV; | 146 | return -ENODEV; |
150 | 147 | ||
151 | pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); | 148 | pipe = usb_rcvintpipe(udev, endpoint->bEndpointAddress); |
diff --git a/drivers/usb/storage/unusual_devs.h b/drivers/usb/storage/unusual_devs.h index efb047f431e8..db8b26012c75 100644 --- a/drivers/usb/storage/unusual_devs.h +++ b/drivers/usb/storage/unusual_devs.h | |||
@@ -1318,6 +1318,16 @@ UNUSUAL_DEV( 0x1019, 0x0c55, 0x0000, 0x0110, | |||
1318 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, | 1318 | US_SC_DEVICE, US_PR_DEVICE, usb_stor_ucr61s2b_init, |
1319 | 0 ), | 1319 | 0 ), |
1320 | 1320 | ||
1321 | /* Reported by Jaco Kroon <jaco@kroon.co.za> | ||
1322 | * The usb-storage module found on the Digitech GNX4 (and supposedly other | ||
1323 | * devices) misbehaves and causes a bunch of invalid I/O errors. | ||
1324 | */ | ||
1325 | UNUSUAL_DEV( 0x1210, 0x0003, 0x0100, 0x0100, | ||
1326 | "Digitech HMG", | ||
1327 | "DigiTech Mass Storage", | ||
1328 | US_SC_DEVICE, US_PR_DEVICE, NULL, | ||
1329 | US_FL_IGNORE_RESIDUE ), | ||
1330 | |||
1321 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ | 1331 | /* Reported by Vilius Bilinkevicius <vilisas AT xxx DOT lt) */ |
1322 | UNUSUAL_DEV( 0x132b, 0x000b, 0x0001, 0x0001, | 1332 | UNUSUAL_DEV( 0x132b, 0x000b, 0x0001, 0x0001, |
1323 | "Minolta", | 1333 | "Minolta", |
diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c index b8d6031b0975..b401084b3d22 100644 --- a/drivers/usb/storage/usb.c +++ b/drivers/usb/storage/usb.c | |||
@@ -740,18 +740,16 @@ static int get_pipes(struct us_data *us) | |||
740 | ep = &altsetting->endpoint[i].desc; | 740 | ep = &altsetting->endpoint[i].desc; |
741 | 741 | ||
742 | /* Is it a BULK endpoint? */ | 742 | /* Is it a BULK endpoint? */ |
743 | if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | 743 | if (usb_endpoint_xfer_bulk(ep)) { |
744 | == USB_ENDPOINT_XFER_BULK) { | ||
745 | /* BULK in or out? */ | 744 | /* BULK in or out? */ |
746 | if (ep->bEndpointAddress & USB_DIR_IN) | 745 | if (usb_endpoint_dir_in(ep)) |
747 | ep_in = ep; | 746 | ep_in = ep; |
748 | else | 747 | else |
749 | ep_out = ep; | 748 | ep_out = ep; |
750 | } | 749 | } |
751 | 750 | ||
752 | /* Is it an interrupt endpoint? */ | 751 | /* Is it an interrupt endpoint? */ |
753 | else if ((ep->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) | 752 | else if (usb_endpoint_xfer_int(ep)) { |
754 | == USB_ENDPOINT_XFER_INT) { | ||
755 | ep_int = ep; | 753 | ep_int = ep; |
756 | } | 754 | } |
757 | } | 755 | } |