public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Doug Ledford <dledford@redhat.com>
To: Nathan Bryant <nbryant@allegientsystems.com>
Cc: Thomas Gschwind <tom@infosys.tuwien.ac.at>, linux-kernel@vger.kernel.org
Subject: Re: i810_audio
Date: Tue, 08 Jan 2002 15:15:36 -0500	[thread overview]
Message-ID: <3C3B5368.7090105@redhat.com> (raw)
In-Reply-To: <20020105031329.B6158@infosys.tuwien.ac.at> <3C3A2B5D.8070707@allegientsystems.com> <3C3A301A.2050501@redhat.com> <3C3AA6F9.5090407@redhat.com> <3C3B501D.7050508@allegientsystems.com>

Nathan Bryant wrote:

> Doug Ledford wrote:
> 
>>>  Added stop_dac at the end.  Otherwise the system gets locked up 
>>> sometimes.
>>
>>
>>
>>
>> This is (I think) a red herring.  I would suspect that the lockup you 
>> are seeing is more likely to have something to do with the changes in 
>> i810_get_dma_address().  I'm referring to the change to the do 
>> {}while() loop in particular.  Also, if the change you made in 
>> i810_get_dma_address() is needed for the SiS chipset, then there would 
>> appear to be a hardware bug that needs worked around.  However, I 
>> think this is the wrong way to solve it.  In prog_dmabuf(), we set the 
>> control bits on the device such that when it finishes the LVI, it's 
>> *suppossed* to stop playback.  Now, the only way I can think of that 
>> the CIV register would update as fast as you can read it in 
>> i810_get_dma_address() is if at the end of LVI, the card went into a 
>> loop and the CIV is essentially running from 0 to 31 and going round 
>> and round without doing anything.  In that case, the proper fix may 
>> actually be to go into the interrupt handler and on LVI interrupt with 
>> count==0 (for playback) call stop_dac and do similarly for record.  
>> This is because I suspect that we aren't ever getting the DCH Stopped 
>> interrupt on the SiS card.  Of course, the DCH Stop interrupt causes 
>> us to call stop_{dac,adc} as appropriate, so the call to stop_dac in 
>> drain_dac is redundant if this code is working as advertised.  I 
>> suspect that fixing things in the interrupt handler will make the 
>> stop_dac call in drain_dac and the change in i810_get_dma_address() 
>> both unnecessary.  Can you test that for me? 
> 
> 
> 1) Is the LVI interrupt supposed to arrive when the chip *starts* 
> playing the last buffer?


No, when the last buffer is complete.


> 2) Does SiS actually do it this way?


No clue.  If they follow the spec, then yes.


> If your theory on why the registers are spinning is correct, and if we 
> receive the LVI interrupt with too much latency, your code will still 
> deadlock, Doug. (The LVI interrupt handler calls update_ptr first thing, 
> which calls get_dma_address.)


My theory about get_dma_address at this point is that the upper 3 bits of 
CIV are garbage and are subject to different states each time you read the 
register.  Since I bounded the read by using &31 to mask off the garbage 
bits, that should no longer be an issue.

> Furthermore, if this turns out to be the 
> case, the LVI IRQ handler uses dmabuf->count to determine whether to 
> call stop_dac, and needs to call update_ptr to update dmabuf->count... 
> so an explicit stop_dac might be needed elsewhere.


I don't think so.  See above.


> Even if the LVI interrupt comes at the beginning of the buffer, those 
> 2048 bytes will play in 10.67 ms. Can we really guarantee that kind of 
> latency?
> 

We don't need to.  This is also where the spurious DMA Overrun on write 
errors were coming from.  We *expect* to have a dma overrun on write if the 
last block was not completely filled (notice in i810_write() that we filled 
the remainder of the block with silence).  So, we check if LVI == CIV when 
we appear to have an overrun.  If they are the same, then no overrun, we 
just played the silence until the end of the buffer, then things stopped 
because this was the LVI, and all is good and right in the world.  If they 
aren't the same (which they aren't if you are getting garbage in the upper 3 
bits that is random), then we print out spurious messages.  I think a lot of 
the problems that people have been chasing with the SiS chipset are this 
exact kind of thing.  You'll also notice that support for the NVIDIA nForce 
Audio is now in 0.15.  Based upon the fact that the guy from NVIDIA that 
contacted me had been seeing the same sort of random DMA Overrun on write 
messages, I'm guessing that both the SiS and the NVIDIA audio devices have 
this same garbage in the upper 3 bits of CIV register problem.




-- 

  Doug Ledford <dledford@redhat.com>  http://people.redhat.com/dledford
       Please check my web site for aic7xxx updates/answers before
                       e-mailing me about problems


  reply	other threads:[~2002-01-08 20:16 UTC|newest]

Thread overview: 35+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <3C338217.1080207@allegientsystems.com>
2002-01-05  2:13 ` i810_audio Thomas Gschwind
2002-01-07 19:32   ` i810_audio Nathan Bryant
2002-01-07 23:12   ` i810_audio Nathan Bryant
2002-01-07 23:32     ` i810_audio Doug Ledford
2002-01-08  7:59       ` i810_audio Doug Ledford
2002-01-08  8:11         ` i810_audio Doug Ledford
2002-01-08  9:02           ` i810_audio Doug Ledford
2002-01-08 15:11             ` i810_audio Mario Mikocevic
2002-01-08 19:21               ` i810_audio Doug Ledford
2002-01-08 19:22               ` i810_audio Nathan Bryant
2002-01-09 15:47             ` i810_audio Mario Mikocevic
2002-01-08 20:01         ` i810_audio Nathan Bryant
2002-01-08 20:15           ` Doug Ledford [this message]
2002-01-08 20:23           ` i810_audio Nathan Bryant
2002-01-08  8:22   ` i810_audio Martin Dalecki
2002-01-08 16:31 i810_audio willy tarreau
2002-01-08 19:58 ` i810_audio Doug Ledford
2002-01-08 23:03   ` i810_audio willy tarreau
2002-01-09  6:28   ` i810_audio Nick Papadonis
2002-01-09  7:16   ` i810_audio willy tarreau
  -- strict thread matches above, loose matches on Subject: below --
2002-01-09  7:09 i810_audio reddog83
     [not found] <3C3BFF98.9080309@redhat.com>
2002-01-09  9:08 ` i810_audio willy tarreau
2002-01-10  6:42 i810_audio reddog83
2002-01-10 18:59 i810_audio reddog83
2002-01-10 19:21 i810_audio reddog83
2002-01-11  0:33 ` i810_audio Doug Ledford
2002-11-10 23:37 i810 audio Alan Cox
2002-11-12 23:06 ` Brian C. Huffman
2002-11-12 23:38   ` Alan Cox
2002-11-12 23:43     ` Doug Ledford
2002-11-13  0:04       ` Peter Kundrat
2002-11-13  0:43         ` Alan Cox
2002-11-13 12:08           ` Brian C. Huffman
2002-11-12 23:52     ` Peter Kundrat
2002-11-11 21:16 i810_audio Rus Foster

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=3C3B5368.7090105@redhat.com \
    --to=dledford@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=nbryant@allegientsystems.com \
    --cc=tom@infosys.tuwien.ac.at \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox