diff --git a/[refs] b/[refs] index 7ee6cb0046ed..ba39166e09c1 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0af212ba8f123c2eba151af7726c34a50b127962 +refs/heads/master: fa75ac379e63c2864e9049b5e8615e40f65c1e70 diff --git a/trunk/MAINTAINERS b/trunk/MAINTAINERS index 4307673415f7..e50fc6eb99e0 100644 --- a/trunk/MAINTAINERS +++ b/trunk/MAINTAINERS @@ -6430,9 +6430,8 @@ S: Maintained F: drivers/usb/misc/rio500* USB EHCI DRIVER -M: Alan Stern L: linux-usb@vger.kernel.org -S: Maintained +S: Orphan F: Documentation/usb/ehci.txt F: drivers/usb/host/ehci* @@ -6491,9 +6490,8 @@ S: Maintained F: sound/usb/midi.* USB OHCI DRIVER -M: Alan Stern L: linux-usb@vger.kernel.org -S: Maintained +S: Orphan F: Documentation/usb/ohci.txt F: drivers/usb/host/ohci* diff --git a/trunk/drivers/usb/core/driver.c b/trunk/drivers/usb/core/driver.c index 81add81ab040..e35a17687c05 100644 --- a/trunk/drivers/usb/core/driver.c +++ b/trunk/drivers/usb/core/driver.c @@ -1187,22 +1187,13 @@ static int usb_suspend_both(struct usb_device *udev, pm_message_t msg) for (i = n - 1; i >= 0; --i) { intf = udev->actconfig->interface[i]; status = usb_suspend_interface(udev, intf, msg); - - /* Ignore errors during system sleep transitions */ - if (!(msg.event & PM_EVENT_AUTO)) - status = 0; if (status != 0) break; } } - if (status == 0) { + if (status == 0) status = usb_suspend_device(udev, msg); - /* Again, ignore errors during system sleep transitions */ - if (!(msg.event & PM_EVENT_AUTO)) - status = 0; - } - /* If the suspend failed, resume interfaces that did get suspended */ if (status != 0) { msg.event ^= (PM_EVENT_SUSPEND | PM_EVENT_RESUME); diff --git a/trunk/drivers/usb/core/hub.c b/trunk/drivers/usb/core/hub.c index c2ac08755f27..90ae1753dda1 100644 --- a/trunk/drivers/usb/core/hub.c +++ b/trunk/drivers/usb/core/hub.c @@ -2362,10 +2362,6 @@ int usb_port_suspend(struct usb_device *udev, pm_message_t msg) USB_DEVICE_REMOTE_WAKEUP, 0, NULL, 0, USB_CTRL_SET_TIMEOUT); - - /* System sleep transitions should never fail */ - if (!(msg.event & PM_EVENT_AUTO)) - status = 0; } else { /* device has up to 10 msec to fully suspend */ dev_dbg(&udev->dev, "usb %ssuspend\n", @@ -2615,15 +2611,16 @@ static int hub_suspend(struct usb_interface *intf, pm_message_t msg) struct usb_device *hdev = hub->hdev; unsigned port1; - /* Warn if children aren't already suspended */ + /* fail if children aren't already suspended */ for (port1 = 1; port1 <= hdev->maxchild; port1++) { struct usb_device *udev; udev = hdev->children [port1-1]; if (udev && udev->can_submit) { - dev_warn(&intf->dev, "port %d nyet suspended\n", port1); - if (msg.event & PM_EVENT_AUTO) - return -EBUSY; + if (!(msg.event & PM_EVENT_AUTO)) + dev_dbg(&intf->dev, "port %d nyet suspended\n", + port1); + return -EBUSY; } } diff --git a/trunk/drivers/usb/host/ehci-hcd.c b/trunk/drivers/usb/host/ehci-hcd.c index f8030ee928e8..b435ed67dd5c 100644 --- a/trunk/drivers/usb/host/ehci-hcd.c +++ b/trunk/drivers/usb/host/ehci-hcd.c @@ -1,8 +1,4 @@ /* - * Enhanced Host Controller Interface (EHCI) driver for USB. - * - * Maintainer: Alan Stern - * * Copyright (c) 2000-2004 by David Brownell * * This program is free software; you can redistribute it and/or modify it diff --git a/trunk/drivers/usb/host/ohci-hcd.c b/trunk/drivers/usb/host/ohci-hcd.c index f9cf3f04b742..9aa10bdf3918 100644 --- a/trunk/drivers/usb/host/ohci-hcd.c +++ b/trunk/drivers/usb/host/ohci-hcd.c @@ -1,7 +1,5 @@ /* - * Open Host Controller Interface (OHCI) driver for USB. - * - * Maintainer: Alan Stern + * OHCI HCD (Host Controller Driver) for USB. * * (C) Copyright 1999 Roman Weissgaerber * (C) Copyright 2000-2004 David Brownell diff --git a/trunk/drivers/usb/host/xhci.c b/trunk/drivers/usb/host/xhci.c index 06e7023258d0..e5a01713f937 100644 --- a/trunk/drivers/usb/host/xhci.c +++ b/trunk/drivers/usb/host/xhci.c @@ -1401,6 +1401,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, u32 added_ctxs; unsigned int last_ctx; u32 new_add_flags, new_drop_flags, new_slot_info; + struct xhci_virt_device *virt_dev; int ret = 0; ret = xhci_check_args(hcd, udev, ep, 1, true, __func__); @@ -1425,11 +1426,25 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, return 0; } - in_ctx = xhci->devs[udev->slot_id]->in_ctx; - out_ctx = xhci->devs[udev->slot_id]->out_ctx; + virt_dev = xhci->devs[udev->slot_id]; + in_ctx = virt_dev->in_ctx; + out_ctx = virt_dev->out_ctx; ctrl_ctx = xhci_get_input_control_ctx(xhci, in_ctx); ep_index = xhci_get_endpoint_index(&ep->desc); ep_ctx = xhci_get_ep_ctx(xhci, out_ctx, ep_index); + + /* If this endpoint is already in use, and the upper layers are trying + * to add it again without dropping it, reject the addition. + */ + if (virt_dev->eps[ep_index].ring && + !(le32_to_cpu(ctrl_ctx->drop_flags) & + xhci_get_endpoint_flag(&ep->desc))) { + xhci_warn(xhci, "Trying to add endpoint 0x%x " + "without dropping it.\n", + (unsigned int) ep->desc.bEndpointAddress); + return -EINVAL; + } + /* If the HCD has already noted the endpoint is enabled, * ignore this request. */ @@ -1445,8 +1460,7 @@ int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, * process context, not interrupt context (or so documenation * for usb_set_interface() and usb_set_configuration() claim). */ - if (xhci_endpoint_init(xhci, xhci->devs[udev->slot_id], - udev, ep, GFP_NOIO) < 0) { + if (xhci_endpoint_init(xhci, virt_dev, udev, ep, GFP_NOIO) < 0) { dev_dbg(&udev->dev, "%s - could not initialize ep %#x\n", __func__, ep->desc.bEndpointAddress); return -ENOMEM;