On 4/28/2016 1:01 AM, Felipe Balbi wrote: > NumP field of DCFG register is used on NumP field of > ACK TP header and it tells the host how many packets > an endpoint can receive before waiting for > synchronization. > > Documentation says it should be set to anything > <=bMaxBurst. Interestingly, however, this setting is > not per-endpoint how it should be (different > endpoints could have different burst sizes), but > things seem to work okay right now. > > Signed-off-by: Felipe Balbi <felipe.balbi@xxxxxxxxxxxxxxx> > --- > drivers/usb/dwc3/core.h | 3 +++ > drivers/usb/dwc3/gadget.c | 14 ++++++++++++-- > 2 files changed, 15 insertions(+), 2 deletions(-) > > diff --git a/drivers/usb/dwc3/core.h b/drivers/usb/dwc3/core.h > index 87df6dd20d23..c5f576aa1903 100644 > --- a/drivers/usb/dwc3/core.h > +++ b/drivers/usb/dwc3/core.h > @@ -271,6 +271,9 @@ > #define DWC3_DCFG_LOWSPEED (2 << 0) > #define DWC3_DCFG_FULLSPEED1 (3 << 0) > > +#define DWC3_DCFG_NUMP_SHIFT 17 > +#define DWC3_DCFG_NUMP(n) (((n) & 0x1f) >> DWC3_DCFG_NUMP_SHIFT) > +#define DWC3_DCFG_NUMP_MASK (0x1f << DWC3_DCFG_NUMP_SHIFT) > #define DWC3_DCFG_LPM_CAP (1 << 22) > > /* Device Control Register */ > diff --git a/drivers/usb/dwc3/gadget.c b/drivers/usb/dwc3/gadget.c > index 43efb627d1cf..4b681b0d420f 100644 > --- a/drivers/usb/dwc3/gadget.c > +++ b/drivers/usb/dwc3/gadget.c > @@ -464,9 +464,19 @@ static int dwc3_gadget_set_ep_config(struct dwc3 *dwc, struct dwc3_ep *dep, > > /* Burst size is only needed in SuperSpeed mode */ > if (dwc->gadget.speed >= USB_SPEED_SUPER) { > - u32 burst = dep->endpoint.maxburst - 1; > + u32 burst = dep->endpoint.maxburst; > + u32 nump; > + u32 reg; > > - params.param0 |= DWC3_DEPCFG_BURST_SIZE(burst); > + /* update NumP */ > + reg = dwc3_readl(dwc->regs, DWC3_DCFG); > + nump = DWC3_DCFG_NUMP(reg); > + nump = max(nump, burst); > + reg &= ~DWC3_DCFG_NUMP_MASK; > + reg |= nump << DWC3_DCFG_NUMP_SHIFT; > + dwc3_writel(dwc->regs, DWC3_DCFG, reg); > + > + params.param0 |= DWC3_DEPCFG_BURST_SIZE(burst - 1); Hi Felipe, The controller already takes care not to send a NUMP greater than the configured maxburst for the endpoint. So there is no need to do this. You can just set it globally in core init. NUMP actually should be a global setting because The NUMP is a function of the space left on the singular, global, RX fifo, regardless of what EP is receiving the data. John -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html