diff options
author | David Vrabel <david.vrabel@csr.com> | 2008-04-08 16:24:46 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2008-04-25 00:16:59 -0400 |
commit | 4953d141dc5db748475001cfbfdcc42e66cf900e (patch) | |
tree | d05465dd6ca1fa1fb3e271f436a85f0f0b2cf978 | |
parent | fc721f5194dc98c8108fb155a4fbae1cd746cf41 (diff) |
usb: don't update devnum for wusb devices
For WUSB devices, usb_dev.devnum is a device index and not the real
device address (which is managed by wusbcore). Therefore, only set
devnum once (in choose_address()) and never change it.
Signed-off-by: David Vrabel <david.vrabel@csr.com>
Cc: Inaky Perez-Gonzalez <inaky@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | drivers/usb/core/hub.c | 14 |
1 files changed, 11 insertions, 3 deletions
diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c index 830c851384bf..eb57fcc701d7 100644 --- a/drivers/usb/core/hub.c +++ b/drivers/usb/core/hub.c | |||
@@ -1245,6 +1245,13 @@ static void release_address(struct usb_device *udev) | |||
1245 | } | 1245 | } |
1246 | } | 1246 | } |
1247 | 1247 | ||
1248 | static void update_address(struct usb_device *udev, int devnum) | ||
1249 | { | ||
1250 | /* The address for a WUSB device is managed by wusbcore. */ | ||
1251 | if (!udev->wusb) | ||
1252 | udev->devnum = devnum; | ||
1253 | } | ||
1254 | |||
1248 | #ifdef CONFIG_USB_SUSPEND | 1255 | #ifdef CONFIG_USB_SUSPEND |
1249 | 1256 | ||
1250 | static void usb_stop_pm(struct usb_device *udev) | 1257 | static void usb_stop_pm(struct usb_device *udev) |
@@ -1733,7 +1740,7 @@ static int hub_port_reset(struct usb_hub *hub, int port1, | |||
1733 | case 0: | 1740 | case 0: |
1734 | /* TRSTRCY = 10 ms; plus some extra */ | 1741 | /* TRSTRCY = 10 ms; plus some extra */ |
1735 | msleep(10 + 40); | 1742 | msleep(10 + 40); |
1736 | udev->devnum = 0; /* Device now at address 0 */ | 1743 | update_address(udev, 0); |
1737 | /* FALL THROUGH */ | 1744 | /* FALL THROUGH */ |
1738 | case -ENOTCONN: | 1745 | case -ENOTCONN: |
1739 | case -ENODEV: | 1746 | case -ENODEV: |
@@ -2236,7 +2243,8 @@ static int hub_set_address(struct usb_device *udev, int devnum) | |||
2236 | USB_REQ_SET_ADDRESS, 0, devnum, 0, | 2243 | USB_REQ_SET_ADDRESS, 0, devnum, 0, |
2237 | NULL, 0, USB_CTRL_SET_TIMEOUT); | 2244 | NULL, 0, USB_CTRL_SET_TIMEOUT); |
2238 | if (retval == 0) { | 2245 | if (retval == 0) { |
2239 | udev->devnum = devnum; /* Device now using proper address */ | 2246 | /* Device now using proper address. */ |
2247 | update_address(udev, devnum); | ||
2240 | usb_set_device_state(udev, USB_STATE_ADDRESS); | 2248 | usb_set_device_state(udev, USB_STATE_ADDRESS); |
2241 | usb_ep0_reinit(udev); | 2249 | usb_ep0_reinit(udev); |
2242 | } | 2250 | } |
@@ -2491,7 +2499,7 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1, | |||
2491 | fail: | 2499 | fail: |
2492 | if (retval) { | 2500 | if (retval) { |
2493 | hub_port_disable(hub, port1, 0); | 2501 | hub_port_disable(hub, port1, 0); |
2494 | udev->devnum = devnum; /* for disconnect processing */ | 2502 | update_address(udev, devnum); /* for disconnect processing */ |
2495 | } | 2503 | } |
2496 | mutex_unlock(&usb_address0_mutex); | 2504 | mutex_unlock(&usb_address0_mutex); |
2497 | return retval; | 2505 | return retval; |