On Sun, 21 May 2006 20:13:24 +0200, rincewind@xxxxxxxxxxxxxxxxxxx (Michael Schwingen) wrote: > I installed Debian testing and compiled a kernel.org 2.6.16.14 kernel. > Everything works fine until I start playing sound - at that point, I get > crash #1 below. > > Just for comparison, I tried two different soundcards - a Yamaha > YMF744-based card, which at least plays 8-bit WAV files using aplay, but > causes crash #2 when playing mp3 files using mocp. A ES1938-based card does > not respond to alsamixer, and showed crash #3 when playing mp3 files using > mocp. An Intel EEPRO100 ethernet card works just fine. > > I am only really interested in getting the ICE1712 card working, but the > other two crashes seemed quite similar, so there may be a common or similar > problem in the drivers. I have a bit of kernel driver experience, but have > not used DMA or interrupts until now, and have no experience on MIPS. > > Do you have any idea what goes wrong, or lacking that, where I might start > looking? I know one problem in ALSA on mips, but not sure it is relevant to your crash. http://www.linux-mips.org/archives/linux-mips/2006-01/msg00327.html And here is an updated (still ugly) patch against current git. diff --git a/sound/core/pcm_native.c b/sound/core/pcm_native.c index 0860c5a..8f9fd64 100644 --- a/sound/core/pcm_native.c +++ b/sound/core/pcm_native.c @@ -3110,6 +3110,10 @@ static struct page *snd_pcm_mmap_data_no return NOPAGE_OOM; } else { vaddr = runtime->dma_area + offset; +#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT) + /* dma_area is nocache addr */ + vaddr = CAC_ADDR(vaddr); +#endif page = virt_to_page(vaddr); } get_page(page); @@ -3131,6 +3135,10 @@ static struct vm_operations_struct snd_p static int snd_pcm_default_mmap(struct snd_pcm_substream *substream, struct vm_area_struct *area) { +#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT) + /* use uncached access for dma_area */ + area->vm_page_prot = pgprot_noncached(area->vm_page_prot); +#endif area->vm_ops = &snd_pcm_vm_ops_data; area->vm_private_data = substream; area->vm_flags |= VM_RESERVED; diff --git a/sound/core/sgbuf.c b/sound/core/sgbuf.c index 74745da..c4828d7 100644 --- a/sound/core/sgbuf.c +++ b/sound/core/sgbuf.c @@ -95,7 +95,12 @@ void *snd_malloc_sgbuf_pages(struct devi } sgbuf->table[i].buf = tmpb.area; sgbuf->table[i].addr = tmpb.addr; +#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT) + /* snd_dma_malloc_pages returns nocache addr */ + sgbuf->page_table[i] = virt_to_page(CAC_ADDR(tmpb.area)); +#else sgbuf->page_table[i] = virt_to_page(tmpb.area); +#endif sgbuf->pages++; }