Date: Fri, 31 Jul 2015 09:57:19 +0200 From: Hans Petter Selasky <hps@selasky.org> To: freebsd-arm@FreeBSD.org Subject: Re: DWC OTG TX path optimisation for 11-current Message-ID: <55BB2A5F.9000502@selasky.org> In-Reply-To: <46aece00b53.3c1cdc1f@mail.schwarzes.net> 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>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------000600070201000204010603 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit On 07/31/15 05:52, Andreas Schwarz wrote: > On 31.07.15, Andreas Schwarz wrote: >> On 30.07.15, Hans Petter Selasky wrote: >>> On 07/29/15 21:41, Andreas Schwarz wrote: >>>> On 29.07.15, Hans Petter Selasky wrote: >>>> >>>>> On 07/29/15 17:45, John-Mark Gurney wrote: >>>>>> Just for your information, when I start buildworld, the system >>>>>>> responds very fast (console, ssh). After about one hour, it starts to >>>>>>> print the following warnings: >>>>> >>>>> Did this happen before r285935 aswell or only after this revision? >>>> >>>> This will happen since ~r283xxx, there are some reports in this ml, >>>> have a look at my post from 2015-06-03. >>>> >>> >>> If this is easy to reproduce for you, can you try the SMSC patch I made? >> >> It's not so easy to reproduce, it will occur under high load (and disk IO) >> situations, e.g.when building the world (-j4). But not in every case, >> sometimes buildworld complete without a problem. >> >> If the system is in this state, it will react very very slow. System load >> is high (without a causing process) and it will often hang (during shutdown) >> when performing a reboot. >> >> I'll try your patch. > > This was fast. Patch (smsc.diff) did not help. I've applied the patch, compiled and > installed the new kernel and started to build the kernel tool-chain. Just 10 minutes > ago the problem occur again. > Hi, Can you try this patch separately from the attached one? > Index: sys/dev/usb/controller/dwc_otg.c > =================================================================== > --- sys/dev/usb/controller/dwc_otg.c (revision 286002) > +++ sys/dev/usb/controller/dwc_otg.c (working copy) > @@ -579,6 +579,9 @@ > sc->sc_irq_mask |= GINTMSK_RXFLVLMSK; > DWC_OTG_WRITE_4(sc, DOTG_GINTMSK, sc->sc_irq_mask); > > + /* clear RX FIFO level interrupt */ > + DWC_OTG_WRITE_4(sc, DOTG_GINTSTS, GINTSTS_RXFLVL); > + > /* clear cached status */ > sc->sc_last_rx_status = 0; > } The attached patch will add some more debug prints so that I know what is going on in the problematic function. You'll need to C&P me the resulting console prints. --HPS --------------000600070201000204010603 Content-Type: text/x-diff; name="dwc_otg.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="dwc_otg.diff" Index: dev/usb/controller/dwc_otg.c =================================================================== --- dev/usb/controller/dwc_otg.c (revision 286002) +++ dev/usb/controller/dwc_otg.c (working copy) @@ -2554,8 +2554,17 @@ uint32_t temp; uint8_t got_rx_status; uint8_t x; + uint32_t count = 0; + int came_from = -1; + static uint32_t max_count; repeat: + if (++count > max_count && came_from != -1) { + max_count = count; + printf("MAX=%d CAME=%d STS=0x%08x ACTIVE=0x%08x\n", + (int)max_count, came_from, sc->sc_last_rx_status, + sc->sc_active_rx_ep); + } /* get all channel interrupts */ for (x = 0; x != sc->sc_host_ch_max; x++) { temp = DWC_OTG_READ_4(sc, DOTG_HCINT(x)); @@ -2593,6 +2602,7 @@ DPRINTFN(5, "channel halt complete ch=%u\n", ep_no); } dwc_otg_common_rx_ack(sc); + came_from = 1; goto repeat; } @@ -2612,6 +2622,7 @@ /* check if we should dump the data */ if (!(sc->sc_active_rx_ep & (1U << ep_no))) { dwc_otg_common_rx_ack(sc); + came_from = 2; goto repeat; } @@ -2634,6 +2645,7 @@ /* check if we should dump the data */ if (!(sc->sc_active_rx_ep & (1U << ep_no))) { dwc_otg_common_rx_ack(sc); + came_from = 3; goto repeat; } @@ -2646,8 +2658,10 @@ if (got_rx_status) { /* check if data was consumed */ - if (sc->sc_last_rx_status == 0) + if (sc->sc_last_rx_status == 0) { + came_from = 4; goto repeat; + } /* disable RX FIFO level interrupt */ sc->sc_irq_mask &= ~GINTMSK_RXFLVLMSK; @@ -2656,8 +2670,10 @@ if (sc->sc_flags.status_device_mode == 0 && sc->sc_xfer_complete == 0) { /* update host transfer schedule, so that new transfers can be issued */ - if (dwc_otg_update_host_transfer_schedule_locked(sc)) + if (dwc_otg_update_host_transfer_schedule_locked(sc)) { + came_from = 5; goto repeat; + } } } --------------000600070201000204010603--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?55BB2A5F.9000502>