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:
Родитель
8f5d35441f
Коммит
8d4f70b2fa
|
@ -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 */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче