Merge tag 'usb-for-v4.15' of git://git.kernel.org/pub/scm/linux/kernel/git/balbi/usb into usb-next
Felipe writes: usb: changes for v4.15 merge window Not much going on this time around. With only 51 non-merge commits, this was one of the smallest pull requests from the Gadget tree. Most of the changes are in the mtu3 driver which added support for 36-bit DMA, support for USB 3.1 and support for dual-role (along with some non-critical fixes). The dwc2 driver got a few improvements to how we handle gadget state tracking and also added support for STM32F7xx devices. Other than that, we just some minor non-critical fixes and improvements all over the place.
This commit is contained in:
@@ -23,6 +23,8 @@
|
||||
*
|
||||
* Having this all in one kernel can help some stages of development,
|
||||
* bypassing some hardware (and driver) issues. UML could help too.
|
||||
*
|
||||
* Note: The emulation does not include isochronous transfers!
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
@@ -137,6 +139,9 @@ static const struct {
|
||||
.caps = _caps, \
|
||||
}
|
||||
|
||||
/* we don't provide isochronous endpoints since we don't support them */
|
||||
#define TYPE_BULK_OR_INT (USB_EP_CAPS_TYPE_BULK | USB_EP_CAPS_TYPE_INT)
|
||||
|
||||
/* everyone has ep0 */
|
||||
EP_INFO(ep0name,
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_CONTROL, USB_EP_CAPS_DIR_ALL)),
|
||||
@@ -145,64 +150,72 @@ static const struct {
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep2out-bulk",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
|
||||
/*
|
||||
EP_INFO("ep3in-iso",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep4out-iso",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
|
||||
*/
|
||||
EP_INFO("ep5in-int",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep6in-bulk",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep7out-bulk",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
|
||||
/*
|
||||
EP_INFO("ep8in-iso",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep9out-iso",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
|
||||
*/
|
||||
EP_INFO("ep10in-int",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep11in-bulk",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep12out-bulk",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
|
||||
/*
|
||||
EP_INFO("ep13in-iso",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep14out-iso",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ISO, USB_EP_CAPS_DIR_OUT)),
|
||||
*/
|
||||
EP_INFO("ep15in-int",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_INT, USB_EP_CAPS_DIR_IN)),
|
||||
|
||||
/* or like sa1100: two fixed function endpoints */
|
||||
EP_INFO("ep1out-bulk",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_OUT)),
|
||||
EP_INFO("ep2in-bulk",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_BULK, USB_EP_CAPS_DIR_IN)),
|
||||
|
||||
/* and now some generic EPs so we have enough in multi config */
|
||||
EP_INFO("ep3out",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_OUT)),
|
||||
EP_INFO("ep4in",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep5out",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_OUT)),
|
||||
EP_INFO("ep6out",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_OUT)),
|
||||
EP_INFO("ep7in",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep8out",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_OUT)),
|
||||
EP_INFO("ep9in",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep10out",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_OUT)),
|
||||
EP_INFO("ep11out",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_OUT)),
|
||||
EP_INFO("ep12in",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep13out",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_OUT)),
|
||||
EP_INFO("ep14in",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_IN)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_IN)),
|
||||
EP_INFO("ep15out",
|
||||
USB_EP_CAPS(USB_EP_CAPS_TYPE_ALL, USB_EP_CAPS_DIR_OUT)),
|
||||
USB_EP_CAPS(TYPE_BULK_OR_INT, USB_EP_CAPS_DIR_OUT)),
|
||||
|
||||
#undef EP_INFO
|
||||
};
|
||||
@@ -1769,6 +1782,7 @@ static void dummy_timer(unsigned long _dum_hcd)
|
||||
int i;
|
||||
|
||||
/* simplistic model for one frame's bandwidth */
|
||||
/* FIXME: account for transaction and packet overhead */
|
||||
switch (dum->gadget.speed) {
|
||||
case USB_SPEED_LOW:
|
||||
total = 8/*bytes*/ * 12/*packets*/;
|
||||
@@ -1813,7 +1827,6 @@ restart:
|
||||
struct dummy_request *req;
|
||||
u8 address;
|
||||
struct dummy_ep *ep = NULL;
|
||||
int type;
|
||||
int status = -EINPROGRESS;
|
||||
|
||||
/* stop when we reach URBs queued after the timer interrupt */
|
||||
@@ -1825,14 +1838,10 @@ restart:
|
||||
goto return_urb;
|
||||
else if (dum_hcd->rh_state != DUMMY_RH_RUNNING)
|
||||
continue;
|
||||
type = usb_pipetype(urb->pipe);
|
||||
|
||||
/* used up this frame's non-periodic bandwidth?
|
||||
* FIXME there's infinite bandwidth for control and
|
||||
* periodic transfers ... unrealistic.
|
||||
*/
|
||||
if (total <= 0 && type == PIPE_BULK)
|
||||
continue;
|
||||
/* Used up this frame's bandwidth? */
|
||||
if (total <= 0)
|
||||
break;
|
||||
|
||||
/* find the gadget's ep for this request (if configured) */
|
||||
address = usb_pipeendpoint (urb->pipe);
|
||||
@@ -1930,13 +1939,17 @@ restart:
|
||||
limit = total;
|
||||
switch (usb_pipetype(urb->pipe)) {
|
||||
case PIPE_ISOCHRONOUS:
|
||||
/* FIXME is it urb->interval since the last xfer?
|
||||
* use urb->iso_frame_desc[i].
|
||||
* complete whether or not ep has requests queued.
|
||||
* report random errors, to debug drivers.
|
||||
/*
|
||||
* We don't support isochronous. But if we did,
|
||||
* here are some of the issues we'd have to face:
|
||||
*
|
||||
* Is it urb->interval since the last xfer?
|
||||
* Use urb->iso_frame_desc[i].
|
||||
* Complete whether or not ep has requests queued.
|
||||
* Report random errors, to debug drivers.
|
||||
*/
|
||||
limit = max(limit, periodic_bytes(dum, ep));
|
||||
status = -ENOSYS;
|
||||
status = -EINVAL; /* fail all xfers */
|
||||
break;
|
||||
|
||||
case PIPE_INTERRUPT:
|
||||
|
Reference in New Issue
Block a user