mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-19 18:53:52 +08:00
usb: dwc3: gadget: let us set lower max_speed
In some SoCs, dwc3 is implemented as a USB2.0 only core, meaning that it can't ever achieve SuperSpeed. Currect driver always sets gadget.max_speed to USB_SPEED_SUPER unconditionally. This can causes issues to some Host stacks where the host will issue a GetBOS() request and we will reply with a BOS containing Superspeed Capability Descriptor. At least Windows seems to be upset by this fact and prints a warning that we should connect $this device to another port. [ balbi@ti.com : rewrote entire commit, including source code comment to make a lot clearer what the problem is ] Cc: <stable@vger.kernel.org> Signed-off-by: Ben McCauley <ben.mccauley@garmin.com> Signed-off-by: Felipe Balbi <balbi@ti.com>
This commit is contained in:
parent
68fe05e2a4
commit
b9e51b2b1f
@ -2744,11 +2744,33 @@ int dwc3_gadget_init(struct dwc3 *dwc)
|
||||
}
|
||||
|
||||
dwc->gadget.ops = &dwc3_gadget_ops;
|
||||
dwc->gadget.max_speed = USB_SPEED_SUPER;
|
||||
dwc->gadget.speed = USB_SPEED_UNKNOWN;
|
||||
dwc->gadget.sg_supported = true;
|
||||
dwc->gadget.name = "dwc3-gadget";
|
||||
|
||||
/*
|
||||
* FIXME We might be setting max_speed to <SUPER, however versions
|
||||
* <2.20a of dwc3 have an issue with metastability (documented
|
||||
* elsewhere in this driver) which tells us we can't set max speed to
|
||||
* anything lower than SUPER.
|
||||
*
|
||||
* Because gadget.max_speed is only used by composite.c and function
|
||||
* drivers (i.e. it won't go into dwc3's registers) we are allowing this
|
||||
* to happen so we avoid sending SuperSpeed Capability descriptor
|
||||
* together with our BOS descriptor as that could confuse host into
|
||||
* thinking we can handle super speed.
|
||||
*
|
||||
* Note that, in fact, we won't even support GetBOS requests when speed
|
||||
* is less than super speed because we don't have means, yet, to tell
|
||||
* composite.c that we are USB 2.0 + LPM ECN.
|
||||
*/
|
||||
if (dwc->revision < DWC3_REVISION_220A)
|
||||
dwc3_trace(trace_dwc3_gadget,
|
||||
"Changing max_speed on rev %08x\n",
|
||||
dwc->revision);
|
||||
|
||||
dwc->gadget.max_speed = dwc->maximum_speed;
|
||||
|
||||
/*
|
||||
* Per databook, DWC3 needs buffer size to be aligned to MaxPacketSize
|
||||
* on ep out.
|
||||
|
Loading…
Reference in New Issue
Block a user