Date: Sat, 10 May 2014 15:50:51 +0200 From: Hans Petter Selasky <hps@selasky.org> To: Ian Lepore <ian@FreeBSD.org> Cc: "freebsd-arm@freebsd.org" <freebsd-arm@FreeBSD.org>, Alexander Motin <mav@FreeBSD.org> Subject: Re: USB isochronous traffic with Rasberry Pi [WAS: Re: USB audio device on Raspberry Pi] Message-ID: <536E2EBB.7030104@selasky.org> In-Reply-To: <1399724697.22079.386.camel@revolution.hippie.lan> References: <20140425154430.GA76168@utility-01.thismonkey.com> <535A8AEA.1000100@selasky.org> <20140425204134.GA458@cicely7.cicely.de> <20140430091411.GA45015@utility-01.thismonkey.com> <5360C0A7.9010407@selasky.org> <1398867266.22079.51.camel@revolution.hippie.lan> <CAGW5k5bZ_bTQUXuzNm=tbwx3npz1_HoOR3vM8TBRVFs8zWCq-w@mail.gmail.com> <5362638B.1080104@selasky.org> <5363C133.2000304@selasky.org> <53677CB8.5000800@selasky.org> <CAJ-Vmo=XmH-RX6_i13NuAXhq-jTC%2BWedGiyOMJaPO4r014DSgw@mail.gmail.com> <1399303695.22079.239.camel@revolution.hippie.lan> <1399304157.22079.243.camel@revolution.hippie.lan> <CAJ-Vmok-%2B7%2Bcq%2BDa6_C2AA7BuP5readY_Gfwwm_RF5kh4VerQA@mail.gmail.com> <5368A93D.3070608@selasky.org> <5368AC03.8080401@selasky.org> <536CE5E9.8020408@selasky.org> <1399647986.22079.367.camel@revolution.hippie.lan> <536D0575.1040407@selasky.org> <1399661378.22079.376.camel@revolution.hippie.lan> <536DDA6D.7060101@selasky.org> <1399724697.22079.386.camel@revolution.hippie.lan>
next in thread | previous in thread | raw e-mail | index | archive | help
On 05/10/14 14:24, Ian Lepore wrote: > On Sat, 2014-05-10 at 09:51 +0200, Hans Petter Selasky wrote: >> Hi, >> >> I've made one more patch to the DWC OTG driver. Nice if you can test >> that too. >> >> http://svnweb.freebsd.org/changeset/base/265806 >> >> BTW: I think I've found what is causing the glitches when using USB >> audio devices: >> >> diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c >> index 0490be7..de7f015 100644 >> --- a/sys/arm/arm/machdep.c >> +++ b/sys/arm/arm/machdep.c >> @@ -423,7 +423,7 @@ cpu_est_clockrate(int cpu_id, uint64_t *rate) >> void >> cpu_idle(int busy) >> { >> - >> +#if 0 >> CTR2(KTR_SPARE2, "cpu_idle(%d) at %d", >> busy, curcpu); >> #ifndef NO_EVENTTIMERS >> @@ -442,6 +442,7 @@ cpu_idle(int busy) >> #endif >> CTR2(KTR_SPARE2, "cpu_idle(%d) at %d done", >> busy, curcpu); >> +#endif >> } >> >> int >> >> >> It appears that cpu_idle() is going to sleep when there are pending >> interrupts, and then waking up on the next timer IRQ! Can someone >> familiar with these parts of the kernel comment? >> >> Please try for yourself, with and without the patch above, using an USB >> audio device with the RPI-B! >> >> Still when the console is printing, there are significant glitches too >> :-) That's because the TTY layer is synchronously writing data to the >> serial line. That's OK for now. >> >> --HPS > > If there's an interrupt pending when the WaitForInterrupt instruction is > executed, the cpu doesn't go to sleep -- it acts like a nop. I think > the problem might be that the device write that re-enables the interrupt > hasn't yet made it to the device when the cpu clock stops. > > I don't have any usb audio gear to test with, could you please test the > attached patch and see if it fixes the glitches? > > -- Ian > Hi, That code is not used with RPI so it makes no difference. I think we need to do something like they are doing on x86, that the interrupts are enabled the instruction before the sleep instruction. Else we can loose interrupts. Can you write me a correct patch which implements that? diff --git a/sys/arm/arm/machdep.c b/sys/arm/arm/machdep.c index 0490be7..5e43c14 100644 --- a/sys/arm/arm/machdep.c +++ b/sys/arm/arm/machdep.c @@ -423,6 +423,7 @@ cpu_est_clockrate(int cpu_id, uint64_t *rate) void cpu_idle(int busy) { + register_t s; CTR2(KTR_SPARE2, "cpu_idle(%d) at %d", busy, curcpu); @@ -432,8 +433,11 @@ cpu_idle(int busy) cpu_idleclock(); } #endif - if (!sched_runnable()) - cpu_sleep(0); + s = intr_disable(); + if (sched_runnable()) + intr_restore(s); + else + cpu_sleep(0, s); #ifndef NO_EVENTTIMERS if (!busy) { cpu_activeclock(); --- a/sys/arm/arm/cpufunc_asm_arm11x6.S +++ b/sys/arm/arm/cpufunc_asm_arm11x6.S @@ -207,16 +207,21 @@ END(arm11x6_idcache_wbinv_range) ENTRY_NP(arm11x6_sleep) mov r0, #0 - mov r1, #2 -1: - subs r1, #1 +// mov r1, #2 +//1: +// subs r1, #1 nop mcreq p15, 0, r0, c7, c10, 4 /* data sync barrier */ + mrs r1, cpsr +// mov r1, #2 +//1: +// subs r1, #1 nop mcreq p15, 0, r0, c7, c10, 4 /* data sync barrier */ + mrs r1, cpsr + orr r1, r1, #(I32_bit|F32_bit) + eor r1, r1, #(I32_bit|F32_bit) + msr cpsr_c, r1 /* enable interrupts right before waiting */ + mcreq p15, 0, r0, c7, c0, 4 /* wait for interrupt */ nop nop nop - bne 1b +// bne 1b RET END(arm11x6_sleep) --HPS
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?536E2EBB.7030104>