aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/core
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/usb/core')
-rw-r--r--drivers/usb/core/devio.c7
-rw-r--r--drivers/usb/core/hcd.c2
-rw-r--r--drivers/usb/core/hub.c35
-rw-r--r--drivers/usb/core/message.c14
4 files changed, 44 insertions, 14 deletions
diff --git a/drivers/usb/core/devio.c b/drivers/usb/core/devio.c
index f1aaff6202a5..045bb4b823e1 100644
--- a/drivers/usb/core/devio.c
+++ b/drivers/usb/core/devio.c
@@ -965,10 +965,11 @@ static int proc_getdriver(struct dev_state *ps, void __user *arg)
965 965
966static int proc_connectinfo(struct dev_state *ps, void __user *arg) 966static int proc_connectinfo(struct dev_state *ps, void __user *arg)
967{ 967{
968 struct usbdevfs_connectinfo ci; 968 struct usbdevfs_connectinfo ci = {
969 .devnum = ps->dev->devnum,
970 .slow = ps->dev->speed == USB_SPEED_LOW
971 };
969 972
970 ci.devnum = ps->dev->devnum;
971 ci.slow = ps->dev->speed == USB_SPEED_LOW;
972 if (copy_to_user(arg, &ci, sizeof(ci))) 973 if (copy_to_user(arg, &ci, sizeof(ci)))
973 return -EFAULT; 974 return -EFAULT;
974 return 0; 975 return 0;
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 5cca00a6d09d..b5c965c031f9 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1945,7 +1945,6 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg)
1945 1945
1946 dev_dbg(&rhdev->dev, "usb %s%s\n", 1946 dev_dbg(&rhdev->dev, "usb %s%s\n",
1947 (msg.event & PM_EVENT_AUTO ? "auto-" : ""), "resume"); 1947 (msg.event & PM_EVENT_AUTO ? "auto-" : ""), "resume");
1948 clear_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags);
1949 if (!hcd->driver->bus_resume) 1948 if (!hcd->driver->bus_resume)
1950 return -ENOENT; 1949 return -ENOENT;
1951 if (hcd->state == HC_STATE_RUNNING) 1950 if (hcd->state == HC_STATE_RUNNING)
@@ -1953,6 +1952,7 @@ int hcd_bus_resume(struct usb_device *rhdev, pm_message_t msg)
1953 1952
1954 hcd->state = HC_STATE_RESUMING; 1953 hcd->state = HC_STATE_RESUMING;
1955 status = hcd->driver->bus_resume(hcd); 1954 status = hcd->driver->bus_resume(hcd);
1955 clear_bit(HCD_FLAG_WAKEUP_PENDING, &hcd->flags);
1956 if (status == 0) { 1956 if (status == 0) {
1957 /* TRSMRCY = 10 msec */ 1957 /* TRSMRCY = 10 msec */
1958 msleep(10); 1958 msleep(10);
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
index 84c1897188d2..6c16c4f2c741 100644
--- a/drivers/usb/core/hub.c
+++ b/drivers/usb/core/hub.c
@@ -677,6 +677,8 @@ static void hub_init_func3(struct work_struct *ws);
677static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) 677static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
678{ 678{
679 struct usb_device *hdev = hub->hdev; 679 struct usb_device *hdev = hub->hdev;
680 struct usb_hcd *hcd;
681 int ret;
680 int port1; 682 int port1;
681 int status; 683 int status;
682 bool need_debounce_delay = false; 684 bool need_debounce_delay = false;
@@ -715,6 +717,25 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
715 usb_autopm_get_interface_no_resume( 717 usb_autopm_get_interface_no_resume(
716 to_usb_interface(hub->intfdev)); 718 to_usb_interface(hub->intfdev));
717 return; /* Continues at init2: below */ 719 return; /* Continues at init2: below */
720 } else if (type == HUB_RESET_RESUME) {
721 /* The internal host controller state for the hub device
722 * may be gone after a host power loss on system resume.
723 * Update the device's info so the HW knows it's a hub.
724 */
725 hcd = bus_to_hcd(hdev->bus);
726 if (hcd->driver->update_hub_device) {
727 ret = hcd->driver->update_hub_device(hcd, hdev,
728 &hub->tt, GFP_NOIO);
729 if (ret < 0) {
730 dev_err(hub->intfdev, "Host not "
731 "accepting hub info "
732 "update.\n");
733 dev_err(hub->intfdev, "LS/FS devices "
734 "and hubs may not work "
735 "under this hub\n.");
736 }
737 }
738 hub_power_on(hub, true);
718 } else { 739 } else {
719 hub_power_on(hub, true); 740 hub_power_on(hub, true);
720 } 741 }
@@ -2722,6 +2743,11 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
2722 udev->ttport = hdev->ttport; 2743 udev->ttport = hdev->ttport;
2723 } else if (udev->speed != USB_SPEED_HIGH 2744 } else if (udev->speed != USB_SPEED_HIGH
2724 && hdev->speed == USB_SPEED_HIGH) { 2745 && hdev->speed == USB_SPEED_HIGH) {
2746 if (!hub->tt.hub) {
2747 dev_err(&udev->dev, "parent hub has no TT\n");
2748 retval = -EINVAL;
2749 goto fail;
2750 }
2725 udev->tt = &hub->tt; 2751 udev->tt = &hub->tt;
2726 udev->ttport = port1; 2752 udev->ttport = port1;
2727 } 2753 }
@@ -2860,13 +2886,16 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
2860 else 2886 else
2861 i = udev->descriptor.bMaxPacketSize0; 2887 i = udev->descriptor.bMaxPacketSize0;
2862 if (le16_to_cpu(udev->ep0.desc.wMaxPacketSize) != i) { 2888 if (le16_to_cpu(udev->ep0.desc.wMaxPacketSize) != i) {
2863 if (udev->speed != USB_SPEED_FULL || 2889 if (udev->speed == USB_SPEED_LOW ||
2864 !(i == 8 || i == 16 || i == 32 || i == 64)) { 2890 !(i == 8 || i == 16 || i == 32 || i == 64)) {
2865 dev_err(&udev->dev, "ep0 maxpacket = %d\n", i); 2891 dev_err(&udev->dev, "Invalid ep0 maxpacket: %d\n", i);
2866 retval = -EMSGSIZE; 2892 retval = -EMSGSIZE;
2867 goto fail; 2893 goto fail;
2868 } 2894 }
2869 dev_dbg(&udev->dev, "ep0 maxpacket = %d\n", i); 2895 if (udev->speed == USB_SPEED_FULL)
2896 dev_dbg(&udev->dev, "ep0 maxpacket = %d\n", i);
2897 else
2898 dev_warn(&udev->dev, "Using ep0 maxpacket: %d\n", i);
2870 udev->ep0.desc.wMaxPacketSize = cpu_to_le16(i); 2899 udev->ep0.desc.wMaxPacketSize = cpu_to_le16(i);
2871 usb_ep0_reinit(udev); 2900 usb_ep0_reinit(udev);
2872 } 2901 }
diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
index 9f0ce7de0e36..d6e3e410477e 100644
--- a/drivers/usb/core/message.c
+++ b/drivers/usb/core/message.c
@@ -1140,13 +1140,6 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
1140{ 1140{
1141 int i; 1141 int i;
1142 1142
1143 dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__,
1144 skip_ep0 ? "non-ep0" : "all");
1145 for (i = skip_ep0; i < 16; ++i) {
1146 usb_disable_endpoint(dev, i, true);
1147 usb_disable_endpoint(dev, i + USB_DIR_IN, true);
1148 }
1149
1150 /* getting rid of interfaces will disconnect 1143 /* getting rid of interfaces will disconnect
1151 * any drivers bound to them (a key side effect) 1144 * any drivers bound to them (a key side effect)
1152 */ 1145 */
@@ -1176,6 +1169,13 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
1176 if (dev->state == USB_STATE_CONFIGURED) 1169 if (dev->state == USB_STATE_CONFIGURED)
1177 usb_set_device_state(dev, USB_STATE_ADDRESS); 1170 usb_set_device_state(dev, USB_STATE_ADDRESS);
1178 } 1171 }
1172
1173 dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__,
1174 skip_ep0 ? "non-ep0" : "all");
1175 for (i = skip_ep0; i < 16; ++i) {
1176 usb_disable_endpoint(dev, i, true);
1177 usb_disable_endpoint(dev, i + USB_DIR_IN, true);
1178 }
1179} 1179}
1180 1180
1181/** 1181/**