Hi,

John Youn <[email protected]> writes:
>> John Youn <[email protected]> writes:
>>> 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 <[email protected]>
>>>> ---
>>>>  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.
>> 
>> iow, we just set this to the maximum value and forget about it ? That
>
> You can do that and it will always work, but it might not be optimal
> for every system. You may want to tweak this value in that case, or
> set it to calculate based on the rx fifo space.

How about setting it to rx_fifo_size / wMaxPacketSize ?

and I guess rx_fifo_size can be computed with num_words * mdwidth,
right?

-- 
balbi

Attachment: signature.asc
Description: PGP signature

Reply via email to