mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
USB: reorganize code in hub.c
This patch (as1045) reorganizes some code in the hub driver. hub_port_status() is moved earlier in the file, and a new hub_stop() routine is created to do the work currently in hub_preset() (i.e., disconnect all child devices and quiesce the hub). There are no functional changes. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
3bb1af5243
commit
3eb14915a3
@ -333,6 +333,27 @@ static int get_port_status(struct usb_device *hdev, int port1,
|
||||
return status;
|
||||
}
|
||||
|
||||
static int hub_port_status(struct usb_hub *hub, int port1,
|
||||
u16 *status, u16 *change)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&hub->status_mutex);
|
||||
ret = get_port_status(hub->hdev, port1, &hub->status->port);
|
||||
if (ret < 4) {
|
||||
dev_err(hub->intfdev,
|
||||
"%s failed (err = %d)\n", __func__, ret);
|
||||
if (ret >= 0)
|
||||
ret = -EIO;
|
||||
} else {
|
||||
*status = le16_to_cpu(hub->status->port.wPortStatus);
|
||||
*change = le16_to_cpu(hub->status->port.wPortChange);
|
||||
ret = 0;
|
||||
}
|
||||
mutex_unlock(&hub->status_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void kick_khubd(struct usb_hub *hub)
|
||||
{
|
||||
unsigned long flags;
|
||||
@ -610,9 +631,8 @@ static void hub_port_logical_disconnect(struct usb_hub *hub, int port1)
|
||||
}
|
||||
|
||||
/* caller has locked the hub device */
|
||||
static int hub_pre_reset(struct usb_interface *intf)
|
||||
static void hub_stop(struct usb_hub *hub)
|
||||
{
|
||||
struct usb_hub *hub = usb_get_intfdata(intf);
|
||||
struct usb_device *hdev = hub->hdev;
|
||||
int i;
|
||||
|
||||
@ -622,6 +642,14 @@ static int hub_pre_reset(struct usb_interface *intf)
|
||||
usb_disconnect(&hdev->children[i]);
|
||||
}
|
||||
hub_quiesce(hub);
|
||||
}
|
||||
|
||||
/* caller has locked the hub device */
|
||||
static int hub_pre_reset(struct usb_interface *intf)
|
||||
{
|
||||
struct usb_hub *hub = usb_get_intfdata(intf);
|
||||
|
||||
hub_stop(hub);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -910,7 +938,7 @@ static void hub_disconnect(struct usb_interface *intf)
|
||||
|
||||
/* Disconnect all children and quiesce the hub */
|
||||
hub->error = 0;
|
||||
hub_pre_reset(intf);
|
||||
hub_stop(hub);
|
||||
|
||||
usb_set_intfdata (intf, NULL);
|
||||
|
||||
@ -1510,28 +1538,6 @@ out_authorized:
|
||||
}
|
||||
|
||||
|
||||
static int hub_port_status(struct usb_hub *hub, int port1,
|
||||
u16 *status, u16 *change)
|
||||
{
|
||||
int ret;
|
||||
|
||||
mutex_lock(&hub->status_mutex);
|
||||
ret = get_port_status(hub->hdev, port1, &hub->status->port);
|
||||
if (ret < 4) {
|
||||
dev_err (hub->intfdev,
|
||||
"%s failed (err = %d)\n", __FUNCTION__, ret);
|
||||
if (ret >= 0)
|
||||
ret = -EIO;
|
||||
} else {
|
||||
*status = le16_to_cpu(hub->status->port.wPortStatus);
|
||||
*change = le16_to_cpu(hub->status->port.wPortChange);
|
||||
ret = 0;
|
||||
}
|
||||
mutex_unlock(&hub->status_mutex);
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/* Returns 1 if @hub is a WUSB root hub, 0 otherwise */
|
||||
static unsigned hub_is_wusb(struct usb_hub *hub)
|
||||
{
|
||||
@ -2726,7 +2732,7 @@ static void hub_events(void)
|
||||
/* If the hub has died, clean up after it */
|
||||
if (hdev->state == USB_STATE_NOTATTACHED) {
|
||||
hub->error = -ENODEV;
|
||||
hub_pre_reset(intf);
|
||||
hub_stop(hub);
|
||||
goto loop;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user