Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+26 −8
Original line number Diff line number Diff line
@@ -2049,7 +2049,7 @@ int usb_alloc_streams(struct usb_interface *interface,
{
	struct usb_hcd *hcd;
	struct usb_device *dev;
	int i;
	int i, ret;

	dev = interface_to_usbdev(interface);
	hcd = bus_to_hcd(dev->bus);
@@ -2058,13 +2058,24 @@ int usb_alloc_streams(struct usb_interface *interface,
	if (dev->speed != USB_SPEED_SUPER)
		return -EINVAL;

	for (i = 0; i < num_eps; i++) {
		/* Streams only apply to bulk endpoints. */
	for (i = 0; i < num_eps; i++)
		if (!usb_endpoint_xfer_bulk(&eps[i]->desc))
			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);
	if (ret < 0)
		return ret;

	for (i = 0; i < num_eps; i++)
		eps[i]->streams = ret;

	return ret;
}
EXPORT_SYMBOL_GPL(usb_alloc_streams);

@@ -2086,19 +2097,26 @@ int usb_free_streams(struct usb_interface *interface,
{
	struct usb_hcd *hcd;
	struct usb_device *dev;
	int i;
	int i, ret;

	dev = interface_to_usbdev(interface);
	hcd = bus_to_hcd(dev->bus);
	if (dev->speed != USB_SPEED_SUPER)
		return -EINVAL;

	/* Streams only apply to bulk endpoints. */
	/* Double-free is not allowed */
	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 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);

+2 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ struct ep_device;
 * @extra: descriptors following this endpoint in the configuration
 * @extralen: how many bytes of "extra" are valid
 * @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
 * descriptor within an active interface in a given USB configuration.
@@ -71,6 +72,7 @@ struct usb_host_endpoint {
	unsigned char *extra;   /* Extra descriptors */
	int extralen;
	int enabled;
	int streams;
};

/* host-side wrapper for one interface setting's parsed descriptors */