diff options
author | Jeremy Erickson <jerickso@cs.unc.edu> | 2014-04-11 13:24:45 -0400 |
---|---|---|
committer | Jeremy Erickson <jerickso@cs.unc.edu> | 2014-04-11 13:24:45 -0400 |
commit | 438145c7ef5c9445f25bb8fc4d52e2c9d11fdc7c (patch) | |
tree | 76941991e36f4a32bf1be0db3854959053f24619 /drivers/usb/core | |
parent | 9ddd1b8ad8abd321964b8add5581910de6d67c2a (diff) |
Update from 2.6.36 to 2.6.36.4wip-dissipation-jerickso
Diffstat (limited to 'drivers/usb/core')
-rw-r--r-- | drivers/usb/core/devio.c | 7 | ||||
-rw-r--r-- | drivers/usb/core/hcd.c | 2 | ||||
-rw-r--r-- | drivers/usb/core/hub.c | 35 | ||||
-rw-r--r-- | drivers/usb/core/message.c | 14 |
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 | ||
966 | static int proc_connectinfo(struct dev_state *ps, void __user *arg) | 966 | static 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); | |||
677 | static void hub_activate(struct usb_hub *hub, enum hub_activation_type type) | 677 | static 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 | /** |