usb-core: Track if an endpoint has streams

This is a preparation patch for adding support for bulk streams to usbfs.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
This commit is contained in:
Hans de Goede 2013-10-09 17:19:25 +02:00 коммит произвёл Sarah Sharp
Родитель 8f5d35441f
Коммит 8d4f70b2fa
2 изменённых файлов: 28 добавлений и 8 удалений

Просмотреть файл

@ -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,
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,
{ {
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;
* @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 {
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 */