Skip to content

Commit

Permalink
USB: Prepare for refactoring by adding extra udev checks.
Browse files Browse the repository at this point in the history
The next patch will refactor the hub port code to rip out the recursive
call to hub_port_reset on a failed hot reset.  In preparation for that,
make sure all code paths can deal with being called with a NULL udev.
The usb_device will not be valid if warm reset was issued because a port
transitioned to the Inactive or Compliance Mode on a device connect.

This patch should have no effect on current behavior.

Signed-off-by: Sarah Sharp <[email protected]>
Acked-by: Alan Stern <[email protected]>
  • Loading branch information
Sarah Sharp committed Jan 3, 2013
1 parent 0fe51aa commit 2d4fa94
Showing 1 changed file with 13 additions and 8 deletions.
21 changes: 13 additions & 8 deletions drivers/usb/core/hub.c
Original file line number Diff line number Diff line change
Expand Up @@ -2584,6 +2584,9 @@ static int hub_port_wait_reset(struct usb_hub *hub, int port1,
return -ENOTCONN;

if ((portstatus & USB_PORT_STAT_ENABLE)) {
if (!udev)
return 0;

if (hub_is_wusb(hub))
udev->speed = USB_SPEED_WIRELESS;
else if (hub_is_superspeed(hub->hdev))
Expand Down Expand Up @@ -2627,13 +2630,15 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1,
struct usb_hcd *hcd;
/* TRSTRCY = 10 ms; plus some extra */
msleep(10 + 40);
update_devnum(udev, 0);
hcd = bus_to_hcd(udev->bus);
/* The xHC may think the device is already reset,
* so ignore the status.
*/
if (hcd->driver->reset_device)
hcd->driver->reset_device(hcd, udev);
if (udev) {
update_devnum(udev, 0);
hcd = bus_to_hcd(udev->bus);
/* The xHC may think the device is already
* reset, so ignore the status.
*/
if (hcd->driver->reset_device)
hcd->driver->reset_device(hcd, udev);
}
}
/* FALL THROUGH */
case -ENOTCONN:
Expand All @@ -2647,7 +2652,7 @@ static void hub_port_finish_reset(struct usb_hub *hub, int port1,
clear_port_feature(hub->hdev, port1,
USB_PORT_FEAT_C_PORT_LINK_STATE);
}
if (!warm)
if (!warm && udev)
usb_set_device_state(udev, *status
? USB_STATE_NOTATTACHED
: USB_STATE_DEFAULT);
Expand Down

0 comments on commit 2d4fa94

Please sign in to comment.