|
@@ -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.
|