提交 b13296c6 编写于 作者: D David Brownell 提交者: Greg Kroah-Hartman

[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: NDavid Brownell <dbrownell@users.sourceforge.net>
Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>

 drivers/usb/core/hcd.c |   28 ++++++++++++----------------
 drivers/usb/core/urb.c |    3 ++-
 2 files changed, 14 insertions(+), 17 deletions(-)
上级 5edbfb7c
...@@ -458,22 +458,18 @@ static int rh_call_control (struct usb_hcd *hcd, struct urb *urb) ...@@ -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) ...@@ -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) ...@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册