Skip site navigation (1)Skip section navigation (2)
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>