forked from luck/tmp_suning_uos_patched
[PATCH] updates for "controller suspended" handling
Reject URBs to _all_ devices when their host controllers are suspended; even root hub registers will be unavailable. Also, don't reject urbs to root hubs in other cases; the only upstream link is through that controller (on PCI or whatever SOC bus is in use). Signed-off-by: David Brownell <dbrownell@users.sourceforge.net> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> drivers/usb/core/hcd.c | 28 ++++++++++++---------------- drivers/usb/core/urb.c | 3 ++- 2 files changed, 14 insertions(+), 17 deletions(-)
This commit is contained in:
parent
5edbfb7c8a
commit
b13296c661
@ -458,22 +458,18 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
/* non-generic request */
|
/* non-generic request */
|
||||||
if (HC_IS_SUSPENDED (hcd->state))
|
switch (typeReq) {
|
||||||
status = -EAGAIN;
|
case GetHubStatus:
|
||||||
else {
|
case GetPortStatus:
|
||||||
switch (typeReq) {
|
len = 4;
|
||||||
case GetHubStatus:
|
break;
|
||||||
case GetPortStatus:
|
case GetHubDescriptor:
|
||||||
len = 4;
|
len = sizeof (struct usb_hub_descriptor);
|
||||||
break;
|
break;
|
||||||
case GetHubDescriptor:
|
|
||||||
len = sizeof (struct usb_hub_descriptor);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
status = hcd->driver->hub_control (hcd,
|
|
||||||
typeReq, wValue, wIndex,
|
|
||||||
tbuf, wLength);
|
|
||||||
}
|
}
|
||||||
|
status = hcd->driver->hub_control (hcd,
|
||||||
|
typeReq, wValue, wIndex,
|
||||||
|
tbuf, wLength);
|
||||||
break;
|
break;
|
||||||
error:
|
error:
|
||||||
/* "protocol stall" on error */
|
/* "protocol stall" on error */
|
||||||
@ -487,7 +483,7 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb)
|
|||||||
"CTRL: TypeReq=0x%x val=0x%x "
|
"CTRL: TypeReq=0x%x val=0x%x "
|
||||||
"idx=0x%x len=%d ==> %d\n",
|
"idx=0x%x len=%d ==> %d\n",
|
||||||
typeReq, wValue, wIndex,
|
typeReq, wValue, wIndex,
|
||||||
wLength, urb->status);
|
wLength, status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (len) {
|
if (len) {
|
||||||
|
@ -237,7 +237,8 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
|
|||||||
(dev->state < USB_STATE_DEFAULT) ||
|
(dev->state < USB_STATE_DEFAULT) ||
|
||||||
(!dev->bus) || (dev->devnum <= 0))
|
(!dev->bus) || (dev->devnum <= 0))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
if (dev->state == USB_STATE_SUSPENDED)
|
if (dev->bus->controller->power.power_state.event != PM_EVENT_ON
|
||||||
|
|| dev->state == USB_STATE_SUSPENDED)
|
||||||
return -EHOSTUNREACH;
|
return -EHOSTUNREACH;
|
||||||
if (!(op = dev->bus->op) || !op->submit_urb)
|
if (!(op = dev->bus->op) || !op->submit_urb)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
Loading…
Reference in New Issue
Block a user