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.ba...@linux.intel.com>
> ---
>  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 majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to