diff mbox

[V2,RFC,1/6] usb: dwc2: core: Avoid nonsense error in gadget mode

Message ID 1469559213-16160-2-git-send-email-stefan.wahren@i2se.com (mailing list archive)
State New, archived
Headers show

Commit Message

Stefan Wahren July 26, 2016, 6:53 p.m. UTC
In gadget mode On bcm2835 platform the host tx fifo size could be zero.
So add zero to range and avoid such nonsense errors:

dwc2 20980000.usb: 0 invalid for host_nperio_tx_fifo_size.
dwc2 20980000.usb: Setting host_nperio_tx_fifo_size to 0
dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size.
dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0

Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
---
 drivers/usb/dwc2/core.c |   10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

John Youn Aug. 16, 2016, 1:30 a.m. UTC | #1
On 7/26/2016 11:54 AM, Stefan Wahren wrote:
> In gadget mode On bcm2835 platform the host tx fifo size could be zero.
> So add zero to range and avoid such nonsense errors:
> 
> dwc2 20980000.usb: 0 invalid for host_nperio_tx_fifo_size.
> dwc2 20980000.usb: Setting host_nperio_tx_fifo_size to 0
> dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size.
> dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0

Hi Stefan,

Are those the power on reset values of GNPTXFSIZ and HPTXFSIZ?

If these values can be 0, I think the patch is ok. But I'm not sure
about that. I can check with some hardware engineers to see under what
conditions this is possible.

Regards,
John


> 
> Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
> ---
>  drivers/usb/dwc2/core.c |   10 ++++++++--
>  1 file changed, 8 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
> index 4135a5f..5645528 100644
> --- a/drivers/usb/dwc2/core.c
> +++ b/drivers/usb/dwc2/core.c
> @@ -819,7 +819,10 @@ void dwc2_set_param_host_nperio_tx_fifo_size(struct dwc2_hsotg *hsotg, int val)
>  {
>  	int valid = 1;
>  
> -	if (val < 16 || val > hsotg->hw_params.host_nperio_tx_fifo_size)
> +	if (val && (val < 16))
> +		valid = 0;
> +
> +	if (val > hsotg->hw_params.host_nperio_tx_fifo_size)
>  		valid = 0;
>  
>  	if (!valid) {
> @@ -839,7 +842,10 @@ void dwc2_set_param_host_perio_tx_fifo_size(struct dwc2_hsotg *hsotg, int val)
>  {
>  	int valid = 1;
>  
> -	if (val < 16 || val > hsotg->hw_params.host_perio_tx_fifo_size)
> +	if (val && (val < 16))
> +		valid = 0;
> +
> +	if (val > hsotg->hw_params.host_perio_tx_fifo_size)
>  		valid = 0;
>  
>  	if (!valid) {
>
Eric Anholt Aug. 16, 2016, 4:22 p.m. UTC | #2
John Youn <John.Youn@synopsys.com> writes:

> On 7/26/2016 11:54 AM, Stefan Wahren wrote:
>> In gadget mode On bcm2835 platform the host tx fifo size could be zero.
>> So add zero to range and avoid such nonsense errors:
>> 
>> dwc2 20980000.usb: 0 invalid for host_nperio_tx_fifo_size.
>> dwc2 20980000.usb: Setting host_nperio_tx_fifo_size to 0
>> dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size.
>> dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0
>
> Hi Stefan,
>
> Are those the power on reset values of GNPTXFSIZ and HPTXFSIZ?
>
> If these values can be 0, I think the patch is ok. But I'm not sure
> about that. I can check with some hardware engineers to see under what
> conditions this is possible.

FWIW, I don't see the firmware software doing any conditional setting of
these registers.
Stefan Wahren Aug. 16, 2016, 4:44 p.m. UTC | #3
Hi John,

> John Youn <John.Youn@synopsys.com> hat am 16. August 2016 um 03:30
> geschrieben:
> 
> 
> On 7/26/2016 11:54 AM, Stefan Wahren wrote:
> > In gadget mode On bcm2835 platform the host tx fifo size could be zero.
> > So add zero to range and avoid such nonsense errors:
> > 
> > dwc2 20980000.usb: 0 invalid for host_nperio_tx_fifo_size.
> > dwc2 20980000.usb: Setting host_nperio_tx_fifo_size to 0
> > dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size.
> > dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0
> 
> Hi Stefan,
> 
> Are those the power on reset values of GNPTXFSIZ and HPTXFSIZ?
> 
> If these values can be 0, I think the patch is ok. But I'm not sure
> about that. I can check with some hardware engineers to see under what
> conditions this is possible.

i'm not sure that i can answer your question correctly. Let me send you some
logs and i hope these answer your question.

Since the Raspberry Pi Zero with bcm2835 could handle all three dr_mode set in
DT ( otg, host, peripherial ), i made 3 logs before this patch is applied:

Raspberry Pi Zero
dr_mode = "host"

Linux raspberrypi 4.7.0-rc7-next-20160719+ #3 Thu Jul 21 17:12:23 UTC 2016
armv6l GNU/Linux

[    2.300866] dwc2_lowlevel_hw_init()
[    2.317961] dwc2 20980000.usb: dwc2: cannot get otg clock
[    2.327328] dwc2_lowlevel_hw_enable()
[    2.334868] dwc2_get_dr_mode()
[    2.341742] dwc2 20980000.usb: Forcing mode to host
[    2.459227] dwc2_get_hwparams()
[    2.466013] dwc2 20980000.usb: Core Release: 2.80a (snpsid=4f54280a)
[    2.466028] dwc2 20980000.usb: hwcfg1=00000000
[    2.466040] dwc2 20980000.usb: hwcfg2=228ddd50
[    2.466051] dwc2 20980000.usb: hwcfg3=0ff000e8
[    2.466061] dwc2 20980000.usb: hwcfg4=1ff00020
[    2.466071] dwc2 20980000.usb: grxfsiz=00001000
[    2.466083] dwc2 20980000.usb: gnptxfsiz=01001000
[    2.466093] dwc2 20980000.usb: hptxfsiz=02002000
[    2.466106] dwc2 20980000.usb: Detected values from hardware:
[    2.466116] dwc2 20980000.usb:   op_mode=0
[    2.466126] dwc2 20980000.usb:   arch=2
[    2.466136] dwc2 20980000.usb:   dma_desc_enable=0
[    2.466146] dwc2 20980000.usb:   power_optimized=0
[    2.466156] dwc2 20980000.usb:   i2c_enable=0
[    2.466165] dwc2 20980000.usb:   hs_phy_type=1
[    2.466175] dwc2 20980000.usb:   fs_phy_type=1
[    2.466185] dwc2 20980000.usb:   utmi_phy_data_width=0
[    2.466194] dwc2 20980000.usb:   num_dev_ep=7
[    2.466204] dwc2 20980000.usb:   num_dev_perio_in_ep=0
[    2.466213] dwc2 20980000.usb:   host_channels=8
[    2.466223] dwc2 20980000.usb:   max_transfer_size=524287
[    2.466233] dwc2 20980000.usb:   max_packet_count=1023
[    2.466243] dwc2 20980000.usb:   nperio_tx_q_depth=0x4
[    2.466253] dwc2 20980000.usb:   host_perio_tx_q_depth=0x4
[    2.466263] dwc2 20980000.usb:   dev_token_q_depth=0x8
[    2.466273] dwc2 20980000.usb:   enable_dynamic_fifo=1
[    2.466283] dwc2 20980000.usb:   en_multiple_tx_fifo=1
[    2.466293] dwc2 20980000.usb:   total_fifo_size=4080
[    2.466303] dwc2 20980000.usb:   host_rx_fifo_size=4096
[    2.466314] dwc2 20980000.usb:   host_nperio_tx_fifo_size=256
[    2.466324] dwc2 20980000.usb:   host_perio_tx_fifo_size=512
[    2.466332] dwc2 20980000.usb:
[    2.466342] dwc2 20980000.usb: dwc2_set_parameters()
[    2.466356] dwc2 20980000.usb: Setting dma_desc_fs_enable to 0
[    2.466384] dwc2 20980000.usb: Setting external_id_pin_ctl to 0
[    2.466395] dwc2 20980000.usb: Setting hibernation to 0
[    2.466399] dwc2_force_dr_mode()
[    2.473127] dwc2 20980000.usb: Forcing mode to host
[    2.589175] dwc2_hcd_init()
[    2.595685] dwc2 20980000.usb: DWC OTG Controller
[    2.604051] dwc2 20980000.usb: new USB bus registered, assigned bus number 1
[    2.614688] dwc2 20980000.usb: irq 33, io mem 0x00000000
--------------------------------------------------------------------------------

Raspberry Pi Zero
dr_mode = "otg"

Linux raspberrypi 4.7.0-rc7-next-20160719+ #3 Thu Jul 21 17:12:23 UTC 2016
armv6l GNU/Linux

[    2.310924] dwc2_lowlevel_hw_init()
[    2.328029] dwc2 20980000.usb: dwc2: cannot get otg clock
[    2.337385] dwc2_lowlevel_hw_enable()
[    2.344917] dwc2_get_dr_mode()
[    2.469263] dwc2_get_hwparams()
[    2.476042] dwc2 20980000.usb: Core Release: 2.80a (snpsid=4f54280a)
[    2.476059] dwc2 20980000.usb: hwcfg1=00000000
[    2.476072] dwc2 20980000.usb: hwcfg2=228ddd50
[    2.476082] dwc2 20980000.usb: hwcfg3=0ff000e8
[    2.476093] dwc2 20980000.usb: hwcfg4=1ff00020
[    2.476104] dwc2 20980000.usb: grxfsiz=00001000
[    2.476115] dwc2 20980000.usb: Forcing mode to host
[    2.519251] dwc2 20980000.usb: gnptxfsiz=00201000
[    2.519267] dwc2 20980000.usb: hptxfsiz=00000000
[    2.569237] dwc2 20980000.usb: gnptxfsiz=00201000
[    2.569255] dwc2 20980000.usb: Detected values from hardware:
[    2.569266] dwc2 20980000.usb:   op_mode=0
[    2.569276] dwc2 20980000.usb:   arch=2
[    2.569286] dwc2 20980000.usb:   dma_desc_enable=0
[    2.569296] dwc2 20980000.usb:   power_optimized=0
[    2.569306] dwc2 20980000.usb:   i2c_enable=0
[    2.569315] dwc2 20980000.usb:   hs_phy_type=1
[    2.569325] dwc2 20980000.usb:   fs_phy_type=1
[    2.569335] dwc2 20980000.usb:   utmi_phy_data_width=0
[    2.569345] dwc2 20980000.usb:   num_dev_ep=7
[    2.569354] dwc2 20980000.usb:   num_dev_perio_in_ep=0
[    2.569364] dwc2 20980000.usb:   host_channels=8
[    2.569375] dwc2 20980000.usb:   max_transfer_size=524287
[    2.569386] dwc2 20980000.usb:   max_packet_count=1023
[    2.569397] dwc2 20980000.usb:   nperio_tx_q_depth=0x4
[    2.569407] dwc2 20980000.usb:   host_perio_tx_q_depth=0x4
[    2.569417] dwc2 20980000.usb:   dev_token_q_depth=0x8
[    2.569427] dwc2 20980000.usb:   enable_dynamic_fifo=1
[    2.569437] dwc2 20980000.usb:   en_multiple_tx_fifo=1
[    2.569447] dwc2 20980000.usb:   total_fifo_size=4080
[    2.569458] dwc2 20980000.usb:   host_rx_fifo_size=4096
[    2.569468] dwc2 20980000.usb:   host_nperio_tx_fifo_size=32
[    2.569478] dwc2 20980000.usb:   host_perio_tx_fifo_size=0
[    2.569487] dwc2 20980000.usb:
[    2.569497] dwc2 20980000.usb: dwc2_set_parameters()
[    2.569511] dwc2 20980000.usb: Setting dma_desc_fs_enable to 0
[    2.569535] dwc2 20980000.usb: Setting external_id_pin_ctl to 0
[    2.569547] dwc2 20980000.usb: Setting hibernation to 0
[    2.569573] dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size. Check
HW configuration.
[    2.585354] dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0
[    2.585361] dwc2_force_dr_mode()
[    2.709215] dwc2_gadget_init()
[    2.715815] dwc2 20980000.usb: NonPeriodic TXFIFO size: 16
[    2.724903] dwc2 20980000.usb: RXFIFO size: 256
[    2.733024] dwc2 20980000.usb: Periodic TXFIFO 0 size: 0
[    2.741929] dwc2 20980000.usb: Periodic TXFIFO 1 size: 256
[    2.750902] dwc2 20980000.usb: Periodic TXFIFO 2 size: 128
[    2.759776] dwc2 20980000.usb: Periodic TXFIFO 3 size: 128
[    2.768438] dwc2 20980000.usb: Periodic TXFIFO 4 size: 64
[    2.776888] dwc2 20980000.usb: Periodic TXFIFO 5 size: 64
[    2.785266] dwc2 20980000.usb: Periodic TXFIFO 6 size: 64
[    2.793496] dwc2 20980000.usb: Periodic TXFIFO 7 size: 32
[    2.801570] dwc2 20980000.usb: Periodic TXFIFO 8 size: 0
[    2.809443] dwc2 20980000.usb: Periodic TXFIFO 9 size: 0
[    2.817055] dwc2 20980000.usb: Periodic TXFIFO10 size: 0
[    2.824633] dwc2 20980000.usb: Periodic TXFIFO11 size: 0
[    2.832100] dwc2 20980000.usb: Periodic TXFIFO12 size: 0
[    2.839457] dwc2 20980000.usb: Periodic TXFIFO13 size: 0
[    2.846659] dwc2 20980000.usb: Periodic TXFIFO14 size: 0
[    2.853852] dwc2 20980000.usb: Periodic TXFIFO15 size: 0
[    2.861043] dwc2 20980000.usb: EPs: 8, dedicated fifos, 4080 entries in SPRAM
[    2.887000] dwc2 20980000.usb: bound driver zero
[    2.893565] dwc2_hcd_init()
[    2.898407] dwc2 20980000.usb: DWC OTG Controller
[    2.905079] dwc2 20980000.usb: new USB bus registered, assigned bus number 1
[    2.914160] dwc2 20980000.usb: irq 33, io mem 0x00000000
------------------------------------------------------------------------------

Raspberry Pi Zero
dr_mode = "peripheral"

Linux raspberrypi 4.7.0-rc7-next-20160719+ #3 Thu Jul 21 17:12:23 UTC 2016
armv6l GNU/Linux

[    2.310942] dwc2_lowlevel_hw_init()
[    2.328044] dwc2 20980000.usb: dwc2: cannot get otg clock
[    2.337405] dwc2_lowlevel_hw_enable()
[    2.344937] dwc2_get_dr_mode()
[    2.351820] dwc2 20980000.usb: Forcing mode to device
[    2.469267] dwc2_get_hwparams()
[    2.476052] dwc2 20980000.usb: Core Release: 2.80a (snpsid=4f54280a)
[    2.476067] dwc2 20980000.usb: hwcfg1=00000000
[    2.476078] dwc2 20980000.usb: hwcfg2=228ddd50
[    2.476089] dwc2 20980000.usb: hwcfg3=0ff000e8
[    2.476100] dwc2 20980000.usb: hwcfg4=1ff00020
[    2.476110] dwc2 20980000.usb: grxfsiz=00001000
[    2.476123] dwc2 20980000.usb: gnptxfsiz=00201000
[    2.476135] dwc2 20980000.usb: Detected values from hardware:
[    2.476146] dwc2 20980000.usb:   op_mode=0
[    2.476156] dwc2 20980000.usb:   arch=2
[    2.476166] dwc2 20980000.usb:   dma_desc_enable=0
[    2.476176] dwc2 20980000.usb:   power_optimized=0
[    2.476186] dwc2 20980000.usb:   i2c_enable=0
[    2.476196] dwc2 20980000.usb:   hs_phy_type=1
[    2.476206] dwc2 20980000.usb:   fs_phy_type=1
[    2.476216] dwc2 20980000.usb:   utmi_phy_data_width=0
[    2.476225] dwc2 20980000.usb:   num_dev_ep=7
[    2.476235] dwc2 20980000.usb:   num_dev_perio_in_ep=0
[    2.476245] dwc2 20980000.usb:   host_channels=8
[    2.476256] dwc2 20980000.usb:   max_transfer_size=524287
[    2.476266] dwc2 20980000.usb:   max_packet_count=1023
[    2.476277] dwc2 20980000.usb:   nperio_tx_q_depth=0x4
[    2.476288] dwc2 20980000.usb:   host_perio_tx_q_depth=0x4
[    2.476297] dwc2 20980000.usb:   dev_token_q_depth=0x8
[    2.476308] dwc2 20980000.usb:   enable_dynamic_fifo=1
[    2.476318] dwc2 20980000.usb:   en_multiple_tx_fifo=1
[    2.476328] dwc2 20980000.usb:   total_fifo_size=4080
[    2.476338] dwc2 20980000.usb:   host_rx_fifo_size=4096
[    2.476349] dwc2 20980000.usb:   host_nperio_tx_fifo_size=0
[    2.476359] dwc2 20980000.usb:   host_perio_tx_fifo_size=0
[    2.476368] dwc2 20980000.usb:
[    2.476378] dwc2 20980000.usb: dwc2_set_parameters()
[    2.476391] dwc2 20980000.usb: Setting dma_desc_fs_enable to 0
[    2.476418] dwc2 20980000.usb: Setting external_id_pin_ctl to 0
[    2.476429] dwc2 20980000.usb: Setting hibernation to 0
[    2.476449] dwc2 20980000.usb: 0 invalid for host_rx_fifo_size. Check HW
configuration.
[    2.491704] dwc2 20980000.usb: Setting host_rx_fifo_size to 4096
[    2.491727] dwc2 20980000.usb: 0 invalid for host_nperio_tx_fifo_size. Check
HW configuration.
[    2.507853] dwc2 20980000.usb: Setting host_nperio_tx_fifo_size to 0
[    2.507875] dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size. Check
HW configuration.
[    2.524246] dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0
[    2.524252] dwc2_force_dr_mode()
[    2.531473] dwc2 20980000.usb: Forcing mode to device
[    2.649220] dwc2_gadget_init()
[    2.656183] dwc2 20980000.usb: NonPeriodic TXFIFO size: 16
[    2.665634] dwc2 20980000.usb: RXFIFO size: 256
[    2.674009] dwc2 20980000.usb: Periodic TXFIFO 0 size: 0
[    2.683076] dwc2 20980000.usb: Periodic TXFIFO 1 size: 256
[    2.692256] dwc2 20980000.usb: Periodic TXFIFO 2 size: 128
[    2.701280] dwc2 20980000.usb: Periodic TXFIFO 3 size: 128
[    2.710152] dwc2 20980000.usb: Periodic TXFIFO 4 size: 64
[    2.718734] dwc2 20980000.usb: Periodic TXFIFO 5 size: 64
[    2.727175] dwc2 20980000.usb: Periodic TXFIFO 6 size: 64
[    2.735545] dwc2 20980000.usb: Periodic TXFIFO 7 size: 32
[    2.743812] dwc2 20980000.usb: Periodic TXFIFO 8 size: 0
[    2.751878] dwc2 20980000.usb: Periodic TXFIFO 9 size: 0
[    2.759850] dwc2 20980000.usb: Periodic TXFIFO10 size: 0
[    2.767724] dwc2 20980000.usb: Periodic TXFIFO11 size: 0
[    2.775557] dwc2 20980000.usb: Periodic TXFIFO12 size: 0
[    2.783321] dwc2 20980000.usb: Periodic TXFIFO13 size: 0
[    2.791008] dwc2 20980000.usb: Periodic TXFIFO14 size: 0
[    2.798604] dwc2 20980000.usb: Periodic TXFIFO15 size: 0
[    2.806106] dwc2 20980000.usb: EPs: 8, dedicated fifos, 4080 entries in SPRAM
[    2.832686] dwc2 20980000.usb: bound driver zero
John Youn Aug. 16, 2016, 7:20 p.m. UTC | #4
On 8/16/2016 9:44 AM, Stefan Wahren wrote:
> Hi John,
> 
>> John Youn <John.Youn@synopsys.com> hat am 16. August 2016 um 03:30
>> geschrieben:
>>
>>
>> On 7/26/2016 11:54 AM, Stefan Wahren wrote:
>>> In gadget mode On bcm2835 platform the host tx fifo size could be zero.
>>> So add zero to range and avoid such nonsense errors:
>>>
>>> dwc2 20980000.usb: 0 invalid for host_nperio_tx_fifo_size.
>>> dwc2 20980000.usb: Setting host_nperio_tx_fifo_size to 0
>>> dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size.
>>> dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0
>>
>> Hi Stefan,
>>
>> Are those the power on reset values of GNPTXFSIZ and HPTXFSIZ?
>>
>> If these values can be 0, I think the patch is ok. But I'm not sure
>> about that. I can check with some hardware engineers to see under what
>> conditions this is possible.
> 
> i'm not sure that i can answer your question correctly. Let me send you some
> logs and i hope these answer your question.
> 
> Since the Raspberry Pi Zero with bcm2835 could handle all three dr_mode set in
> DT ( otg, host, peripherial ), i made 3 logs before this patch is applied:
> 

...

> 
> Raspberry Pi Zero
> dr_mode = "peripheral"
> 
> Linux raspberrypi 4.7.0-rc7-next-20160719+ #3 Thu Jul 21 17:12:23 UTC 2016
> armv6l GNU/Linux
> 
> [    2.310942] dwc2_lowlevel_hw_init()
> [    2.328044] dwc2 20980000.usb: dwc2: cannot get otg clock
> [    2.337405] dwc2_lowlevel_hw_enable()
> [    2.344937] dwc2_get_dr_mode()
> [    2.351820] dwc2 20980000.usb: Forcing mode to device
> [    2.469267] dwc2_get_hwparams()
> [    2.476052] dwc2 20980000.usb: Core Release: 2.80a (snpsid=4f54280a)
> [    2.476067] dwc2 20980000.usb: hwcfg1=00000000
> [    2.476078] dwc2 20980000.usb: hwcfg2=228ddd50
> [    2.476089] dwc2 20980000.usb: hwcfg3=0ff000e8
> [    2.476100] dwc2 20980000.usb: hwcfg4=1ff00020
> [    2.476110] dwc2 20980000.usb: grxfsiz=00001000
> [    2.476123] dwc2 20980000.usb: gnptxfsiz=00201000
> [    2.476135] dwc2 20980000.usb: Detected values from hardware:
> [    2.476146] dwc2 20980000.usb:   op_mode=0
> [    2.476156] dwc2 20980000.usb:   arch=2
> [    2.476166] dwc2 20980000.usb:   dma_desc_enable=0
> [    2.476176] dwc2 20980000.usb:   power_optimized=0
> [    2.476186] dwc2 20980000.usb:   i2c_enable=0
> [    2.476196] dwc2 20980000.usb:   hs_phy_type=1
> [    2.476206] dwc2 20980000.usb:   fs_phy_type=1
> [    2.476216] dwc2 20980000.usb:   utmi_phy_data_width=0
> [    2.476225] dwc2 20980000.usb:   num_dev_ep=7
> [    2.476235] dwc2 20980000.usb:   num_dev_perio_in_ep=0
> [    2.476245] dwc2 20980000.usb:   host_channels=8
> [    2.476256] dwc2 20980000.usb:   max_transfer_size=524287
> [    2.476266] dwc2 20980000.usb:   max_packet_count=1023
> [    2.476277] dwc2 20980000.usb:   nperio_tx_q_depth=0x4
> [    2.476288] dwc2 20980000.usb:   host_perio_tx_q_depth=0x4
> [    2.476297] dwc2 20980000.usb:   dev_token_q_depth=0x8
> [    2.476308] dwc2 20980000.usb:   enable_dynamic_fifo=1
> [    2.476318] dwc2 20980000.usb:   en_multiple_tx_fifo=1
> [    2.476328] dwc2 20980000.usb:   total_fifo_size=4080
> [    2.476338] dwc2 20980000.usb:   host_rx_fifo_size=4096
> [    2.476349] dwc2 20980000.usb:   host_nperio_tx_fifo_size=0
> [    2.476359] dwc2 20980000.usb:   host_perio_tx_fifo_size=0
> [    2.476368] dwc2 20980000.usb:
> [    2.476378] dwc2 20980000.usb: dwc2_set_parameters()
> [    2.476391] dwc2 20980000.usb: Setting dma_desc_fs_enable to 0
> [    2.476418] dwc2 20980000.usb: Setting external_id_pin_ctl to 0
> [    2.476429] dwc2 20980000.usb: Setting hibernation to 0
> [    2.476449] dwc2 20980000.usb: 0 invalid for host_rx_fifo_size. Check HW
> configuration.
> [    2.491704] dwc2 20980000.usb: Setting host_rx_fifo_size to 4096
> [    2.491727] dwc2 20980000.usb: 0 invalid for host_nperio_tx_fifo_size. Check
> HW configuration.
> [    2.507853] dwc2 20980000.usb: Setting host_nperio_tx_fifo_size to 0
> [    2.507875] dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size. Check
> HW configuration.
> [    2.524246] dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0

Thanks for the logs.

It looks like if dr_mode == peripheral, dwc2 doesn't populate the
following host-only values from the reset values of the registers.

* hw_params->host_nperio_tx_fifo_size
* hw_params->host_perio_tx_fifo_size

Thus when it goes to set the core_params based on the hw_params you
get the error. As peripheral-only, they are never used so it's fine.

To get rid of the error we can skip setting the host-only parameters
if dr_mode == peripheral.

John
Stefan Wahren Aug. 16, 2016, 8:09 p.m. UTC | #5
Hi John,

> John Youn <John.Youn@synopsys.com> hat am 16. August 2016 um 21:20
> geschrieben:
> 
> 
> On 8/16/2016 9:44 AM, Stefan Wahren wrote:
> > Hi John,
> > 
> >> John Youn <John.Youn@synopsys.com> hat am 16. August 2016 um 03:30
> ...
> > [    2.476378] dwc2 20980000.usb: dwc2_set_parameters()
> > [    2.476391] dwc2 20980000.usb: Setting dma_desc_fs_enable to 0
> > [    2.476418] dwc2 20980000.usb: Setting external_id_pin_ctl to 0
> > [    2.476429] dwc2 20980000.usb: Setting hibernation to 0
> > [    2.476449] dwc2 20980000.usb: 0 invalid for host_rx_fifo_size. Check HW
> > configuration.
> > [    2.491704] dwc2 20980000.usb: Setting host_rx_fifo_size to 4096
> > [    2.491727] dwc2 20980000.usb: 0 invalid for host_nperio_tx_fifo_size.
> > Check
> > HW configuration.
> > [    2.507853] dwc2 20980000.usb: Setting host_nperio_tx_fifo_size to 0
> > [    2.507875] dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size.
> > Check
> > HW configuration.
> > [    2.524246] dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0
> 
> Thanks for the logs.
> 
> It looks like if dr_mode == peripheral, dwc2 doesn't populate the
> following host-only values from the reset values of the registers.
> 
> * hw_params->host_nperio_tx_fifo_size
> * hw_params->host_perio_tx_fifo_size
> 
> Thus when it goes to set the core_params based on the hw_params you
> get the error. As peripheral-only, they are never used so it's fine.
> 
> To get rid of the error we can skip setting the host-only parameters
> if dr_mode == peripheral.

sorry the subject is imprecise. According to the logs if dr_mode == otg we also
get

[    2.569573] dwc2 20980000.usb: 0 invalid for host_perio_tx_fifo_size. Check
HW configuration.
[    2.585354] dwc2 20980000.usb: Setting host_perio_tx_fifo_size to 0

You already said in 6/6 that's faulty, but i only want to point it out.

Stefan
diff mbox

Patch

diff --git a/drivers/usb/dwc2/core.c b/drivers/usb/dwc2/core.c
index 4135a5f..5645528 100644
--- a/drivers/usb/dwc2/core.c
+++ b/drivers/usb/dwc2/core.c
@@ -819,7 +819,10 @@  void dwc2_set_param_host_nperio_tx_fifo_size(struct dwc2_hsotg *hsotg, int val)
 {
 	int valid = 1;
 
-	if (val < 16 || val > hsotg->hw_params.host_nperio_tx_fifo_size)
+	if (val && (val < 16))
+		valid = 0;
+
+	if (val > hsotg->hw_params.host_nperio_tx_fifo_size)
 		valid = 0;
 
 	if (!valid) {
@@ -839,7 +842,10 @@  void dwc2_set_param_host_perio_tx_fifo_size(struct dwc2_hsotg *hsotg, int val)
 {
 	int valid = 1;
 
-	if (val < 16 || val > hsotg->hw_params.host_perio_tx_fifo_size)
+	if (val && (val < 16))
+		valid = 0;
+
+	if (val > hsotg->hw_params.host_perio_tx_fifo_size)
 		valid = 0;
 
 	if (!valid) {