Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 31 Jul 2015 14:30:55 +0200
From:      Hans Petter Selasky <hps@selasky.org>
To:        Svatopluk Kraus <onwahe@gmail.com>
Cc:        "freebsd-arm@freebsd.org" <freebsd-arm@freebsd.org>
Subject:   Re: DWC OTG TX path optimisation for 11-current
Message-ID:  <55BB6A7F.3060402@selasky.org>
In-Reply-To: <CAFHCsPXFJ_XhVsT1bRw=d20Mz=cbYdmwNNLvfs_cxJvEo8B6LA@mail.gmail.com>
References:  <55A7D8CE.4020809@selasky.org>	<CAHNYxxMp9jGDbV-5=-cE6daR-O3eN5pdvO1s-=QfX=A9XYqYmA@mail.gmail.com>	<55B23276.8090703@selasky.org>	<CAHNYxxNc9uB62hHEv1PM9PcsGgUs=zsvNgatqLD0p%2BiiDA3Aiw@mail.gmail.com>	<55B73113.2020308@selasky.org>	<CAFHCsPVaPZpqXLS7OApa=Xz5VLnLjVpV5dYV8Pn2uHh1Lcz7Tg@mail.gmail.com>	<55B8AB76.7030603@selasky.org>	<CAFHCsPUMaYEwJsaGUFuw9yZi_5bmraSBsOYpRWvSeuebpXBJUA@mail.gmail.com>	<55B8B297.1010008@selasky.org>	<CAFHCsPVGLs8j6LAV%2Bg4rP_ueTOd8pUOupYFGvmgC3XGcJC720Q@mail.gmail.com>	<20150729154516.GH78154@funkthat.com>	<55B8F5EC.2050908@selasky.org>	<46ad096c958.1a82a175@mail.schwarzes.net>	<55B9C3E2.5040501@selasky.org>	<46ae815c7c3.447237c8@mail.schwarzes.net>	<46aece00b53.3c1cdc1f@mail.schwarzes.net>	<55BB2A5F.9000502@selasky.org>	<55BB3CC6.4030002@selasky.org> <CAFHCsPXFJ_XhVsT1bRw=d20Mz=cbYdmwNNLvfs_cxJvEo8B6LA@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format.
--------------080704010005060204020007
Content-Type: text/plain; charset=utf-8; format=flowed
Content-Transfer-Encoding: 7bit

On 07/31/15 13:55, Svatopluk Kraus wrote:
> On Fri, Jul 31, 2015 at 11:15 AM, Hans Petter Selasky <hps@selasky.org> wrote:
>> Hi,
>>
>> I did some testing myself and I see the polling handler can loop many times
>> when USB is active. Instead of 2 as a polling limit I've set 16. Hope this
>> works too. Works fine over here.
>>
>> https://svnweb.freebsd.org/changeset/base/286118
>>

Hi,

>
> Definitely, some limitation was needed there. Thanks.
>
> Unfortunatelly, it turned out that it does not help with my problem.
> It has affected system response time in good way for some time after
> the trigger is pulled. However, after 17 hours when buildworld
> finished, system response time is bad again.
>
> It also turns out that I have a problem with booting my kernels. So I
> cannot test the extra "clear RX FIFO level interrupt" patch as even
> this one line of code causes that kernel does not boot. It freezes at
> very beginning and even first printf is not printed. Thus I have to
> debug this problem firstly. It will be very funny without either jtag
> or early printf. ;)
>

I'll possibly order an RPI2 for myself.

> Meantime, I have noticed that after reboot (system is 99% idle), I'm
> getting the following output from vmstat:
>
>

> IMO, 24000 interrupts per a second for bcm283x_dwco is too many.

Yes, that's right.

BTW: I see you are using RPI2 while I'm using an RPI-B. That's probably 
why this won't preproduce over here.

I've made another patch to not write the GINTMSK with same values. Not 
sure if it makes any difference.

--HPS


--------------080704010005060204020007
Content-Type: text/x-diff;
 name="dwc_otg.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="dwc_otg.diff"

Index: dwc_otg.c
===================================================================
--- dwc_otg.c	(revision 286118)
+++ dwc_otg.c	(working copy)
@@ -576,8 +576,10 @@
 	DPRINTFN(5, "RX status clear\n");
 
 	/* enable RX FIFO level interrupt */
-	sc->sc_irq_mask |= GINTMSK_RXFLVLMSK;
-	DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
+	if (!(sc->sc_irq_mask & GINTMSK_RXFLVLMSK)) {
+		sc->sc_irq_mask |= GINTMSK_RXFLVLMSK;
+		DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
+	}
 
 	/* clear cached status */
 	sc->sc_last_rx_status = 0;
@@ -2656,8 +2658,10 @@
 			goto repeat;
 
 		/* disable RX FIFO level interrupt */
-		sc->sc_irq_mask &= ~GINTMSK_RXFLVLMSK;
-		DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
+		if (sc->sc_irq_mask & GINTMSK_RXFLVLMSK) {
+			sc->sc_irq_mask &= ~GINTMSK_RXFLVLMSK;
+			DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask);
+		}
 	}
 
 	if (sc->sc_flags.status_device_mode == 0 && sc->sc_xfer_complete == 0) {

--------------080704010005060204020007--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?55BB6A7F.3060402>