Merge 5.9-rc5 into usb-next
We need the USB fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
@@ -1205,6 +1205,34 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf,
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* usb_disable_device_endpoints -- Disable all endpoints for a device
|
||||
* @dev: the device whose endpoints are being disabled
|
||||
* @skip_ep0: 0 to disable endpoint 0, 1 to skip it.
|
||||
*/
|
||||
static void usb_disable_device_endpoints(struct usb_device *dev, int skip_ep0)
|
||||
{
|
||||
struct usb_hcd *hcd = bus_to_hcd(dev->bus);
|
||||
int i;
|
||||
|
||||
if (hcd->driver->check_bandwidth) {
|
||||
/* First pass: Cancel URBs, leave endpoint pointers intact. */
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, false);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, false);
|
||||
}
|
||||
/* Remove endpoints from the host controller internal state */
|
||||
mutex_lock(hcd->bandwidth_mutex);
|
||||
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
}
|
||||
/* Second pass: remove endpoint pointers */
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, true);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* usb_disable_device - Disable all the endpoints for a USB device
|
||||
* @dev: the device whose endpoints are being disabled
|
||||
@@ -1218,7 +1246,6 @@ void usb_disable_interface(struct usb_device *dev, struct usb_interface *intf,
|
||||
void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
||||
{
|
||||
int i;
|
||||
struct usb_hcd *hcd = bus_to_hcd(dev->bus);
|
||||
|
||||
/* getting rid of interfaces will disconnect
|
||||
* any drivers bound to them (a key side effect)
|
||||
@@ -1264,22 +1291,8 @@ void usb_disable_device(struct usb_device *dev, int skip_ep0)
|
||||
|
||||
dev_dbg(&dev->dev, "%s nuking %s URBs\n", __func__,
|
||||
skip_ep0 ? "non-ep0" : "all");
|
||||
if (hcd->driver->check_bandwidth) {
|
||||
/* First pass: Cancel URBs, leave endpoint pointers intact. */
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, false);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, false);
|
||||
}
|
||||
/* Remove endpoints from the host controller internal state */
|
||||
mutex_lock(hcd->bandwidth_mutex);
|
||||
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
/* Second pass: remove endpoint pointers */
|
||||
}
|
||||
for (i = skip_ep0; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, true);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
||||
}
|
||||
|
||||
usb_disable_device_endpoints(dev, skip_ep0);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1522,6 +1535,9 @@ EXPORT_SYMBOL_GPL(usb_set_interface);
|
||||
* The caller must own the device lock.
|
||||
*
|
||||
* Return: Zero on success, else a negative error code.
|
||||
*
|
||||
* If this routine fails the device will probably be in an unusable state
|
||||
* with endpoints disabled, and interfaces only partially enabled.
|
||||
*/
|
||||
int usb_reset_configuration(struct usb_device *dev)
|
||||
{
|
||||
@@ -1537,10 +1553,7 @@ int usb_reset_configuration(struct usb_device *dev)
|
||||
* calls during probe() are fine
|
||||
*/
|
||||
|
||||
for (i = 1; i < 16; ++i) {
|
||||
usb_disable_endpoint(dev, i, true);
|
||||
usb_disable_endpoint(dev, i + USB_DIR_IN, true);
|
||||
}
|
||||
usb_disable_device_endpoints(dev, 1); /* skip ep0*/
|
||||
|
||||
config = dev->actconfig;
|
||||
retval = 0;
|
||||
@@ -1553,34 +1566,10 @@ int usb_reset_configuration(struct usb_device *dev)
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
return -ENOMEM;
|
||||
}
|
||||
/* Make sure we have enough bandwidth for each alternate setting 0 */
|
||||
for (i = 0; i < config->desc.bNumInterfaces; i++) {
|
||||
struct usb_interface *intf = config->interface[i];
|
||||
struct usb_host_interface *alt;
|
||||
|
||||
alt = usb_altnum_to_altsetting(intf, 0);
|
||||
if (!alt)
|
||||
alt = &intf->altsetting[0];
|
||||
if (alt != intf->cur_altsetting)
|
||||
retval = usb_hcd_alloc_bandwidth(dev, NULL,
|
||||
intf->cur_altsetting, alt);
|
||||
if (retval < 0)
|
||||
break;
|
||||
}
|
||||
/* If not, reinstate the old alternate settings */
|
||||
/* xHCI adds all endpoints in usb_hcd_alloc_bandwidth */
|
||||
retval = usb_hcd_alloc_bandwidth(dev, config, NULL, NULL);
|
||||
if (retval < 0) {
|
||||
reset_old_alts:
|
||||
for (i--; i >= 0; i--) {
|
||||
struct usb_interface *intf = config->interface[i];
|
||||
struct usb_host_interface *alt;
|
||||
|
||||
alt = usb_altnum_to_altsetting(intf, 0);
|
||||
if (!alt)
|
||||
alt = &intf->altsetting[0];
|
||||
if (alt != intf->cur_altsetting)
|
||||
usb_hcd_alloc_bandwidth(dev, NULL,
|
||||
alt, intf->cur_altsetting);
|
||||
}
|
||||
usb_enable_lpm(dev);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
return retval;
|
||||
@@ -1589,8 +1578,12 @@ reset_old_alts:
|
||||
USB_REQ_SET_CONFIGURATION, 0,
|
||||
config->desc.bConfigurationValue, 0,
|
||||
NULL, 0, USB_CTRL_SET_TIMEOUT);
|
||||
if (retval < 0)
|
||||
goto reset_old_alts;
|
||||
if (retval < 0) {
|
||||
usb_hcd_alloc_bandwidth(dev, NULL, NULL, NULL);
|
||||
usb_enable_lpm(dev);
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
return retval;
|
||||
}
|
||||
mutex_unlock(hcd->bandwidth_mutex);
|
||||
|
||||
/* re-init hc/hcd interface/endpoint state */
|
||||
|
||||
@@ -889,7 +889,11 @@ read_descriptors(struct file *filp, struct kobject *kobj,
|
||||
size_t srclen, n;
|
||||
int cfgno;
|
||||
void *src;
|
||||
int retval;
|
||||
|
||||
retval = usb_lock_device_interruptible(udev);
|
||||
if (retval < 0)
|
||||
return -EINTR;
|
||||
/* The binary attribute begins with the device descriptor.
|
||||
* Following that are the raw descriptor entries for all the
|
||||
* configurations (config plus subsidiary descriptors).
|
||||
@@ -914,6 +918,7 @@ read_descriptors(struct file *filp, struct kobject *kobj,
|
||||
off -= srclen;
|
||||
}
|
||||
}
|
||||
usb_unlock_device(udev);
|
||||
return count - nleft;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user