Commit 8d4f70b2 authored by Hans de Goede's avatar Hans de Goede Committed by Sarah Sharp

usb-core: Track if an endpoint has streams

This is a preparation patch for adding support for bulk streams to usbfs.
Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
parent 8f5d3544
...@@ -2049,7 +2049,7 @@ int usb_alloc_streams(struct usb_interface *interface, ...@@ -2049,7 +2049,7 @@ int usb_alloc_streams(struct usb_interface *interface,
{ {
struct usb_hcd *hcd; struct usb_hcd *hcd;
struct usb_device *dev; struct usb_device *dev;
int i; int i, ret;
dev = interface_to_usbdev(interface); dev = interface_to_usbdev(interface);
hcd = bus_to_hcd(dev->bus); hcd = bus_to_hcd(dev->bus);
...@@ -2058,13 +2058,24 @@ int usb_alloc_streams(struct usb_interface *interface, ...@@ -2058,13 +2058,24 @@ int usb_alloc_streams(struct usb_interface *interface,
if (dev->speed != USB_SPEED_SUPER) if (dev->speed != USB_SPEED_SUPER)
return -EINVAL; return -EINVAL;
/* Streams only apply to bulk endpoints. */ for (i = 0; i < num_eps; i++) {
for (i = 0; i < num_eps; i++) /* Streams only apply to bulk endpoints. */
if (!usb_endpoint_xfer_bulk(&eps[i]->desc)) if (!usb_endpoint_xfer_bulk(&eps[i]->desc))
return -EINVAL; return -EINVAL;
/* Re-alloc is not allowed */
if (eps[i]->streams)
return -EINVAL;
}
return hcd->driver->alloc_streams(hcd, dev, eps, num_eps, ret = hcd->driver->alloc_streams(hcd, dev, eps, num_eps,
num_streams, mem_flags); num_streams, mem_flags);
if (ret < 0)
return ret;
for (i = 0; i < num_eps; i++)
eps[i]->streams = ret;
return ret;
} }
EXPORT_SYMBOL_GPL(usb_alloc_streams); EXPORT_SYMBOL_GPL(usb_alloc_streams);
...@@ -2086,19 +2097,26 @@ int usb_free_streams(struct usb_interface *interface, ...@@ -2086,19 +2097,26 @@ int usb_free_streams(struct usb_interface *interface,
{ {
struct usb_hcd *hcd; struct usb_hcd *hcd;
struct usb_device *dev; struct usb_device *dev;
int i; int i, ret;
dev = interface_to_usbdev(interface); dev = interface_to_usbdev(interface);
hcd = bus_to_hcd(dev->bus); hcd = bus_to_hcd(dev->bus);
if (dev->speed != USB_SPEED_SUPER) if (dev->speed != USB_SPEED_SUPER)
return -EINVAL; return -EINVAL;
/* Streams only apply to bulk endpoints. */ /* Double-free is not allowed */
for (i = 0; i < num_eps; i++) for (i = 0; i < num_eps; i++)
if (!eps[i] || !usb_endpoint_xfer_bulk(&eps[i]->desc)) if (!eps[i] || !eps[i]->streams)
return -EINVAL; return -EINVAL;
return hcd->driver->free_streams(hcd, dev, eps, num_eps, mem_flags); ret = hcd->driver->free_streams(hcd, dev, eps, num_eps, mem_flags);
if (ret < 0)
return ret;
for (i = 0; i < num_eps; i++)
eps[i]->streams = 0;
return ret;
} }
EXPORT_SYMBOL_GPL(usb_free_streams); EXPORT_SYMBOL_GPL(usb_free_streams);
......
...@@ -57,6 +57,7 @@ struct ep_device; ...@@ -57,6 +57,7 @@ struct ep_device;
* @extra: descriptors following this endpoint in the configuration * @extra: descriptors following this endpoint in the configuration
* @extralen: how many bytes of "extra" are valid * @extralen: how many bytes of "extra" are valid
* @enabled: URBs may be submitted to this endpoint * @enabled: URBs may be submitted to this endpoint
* @streams: number of USB-3 streams allocated on the endpoint
* *
* USB requests are always queued to a given endpoint, identified by a * USB requests are always queued to a given endpoint, identified by a
* descriptor within an active interface in a given USB configuration. * descriptor within an active interface in a given USB configuration.
...@@ -71,6 +72,7 @@ struct usb_host_endpoint { ...@@ -71,6 +72,7 @@ struct usb_host_endpoint {
unsigned char *extra; /* Extra descriptors */ unsigned char *extra; /* Extra descriptors */
int extralen; int extralen;
int enabled; int enabled;
int streams;
}; };
/* host-side wrapper for one interface setting's parsed descriptors */ /* host-side wrapper for one interface setting's parsed descriptors */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment