Date: Thu, 23 Sep 2004 21:01:05 +0900 From: Pyun YongHyeon <yongari@kt-is.co.kr> To: Norikatsu Shigemura <nork@FreeBSD.org> Cc: gabor@zahemszky.hu Subject: Re: Maestro3 and 5.3-beta5 Message-ID: <20040923120105.GC13003@kt-is.co.kr> In-Reply-To: <200409231137.i8NBbDjt051259@sakura.ninth-nine.com> References: <20040923024038.GA11717@kt-is.co.kr> <200409231137.i8NBbDjt051259@sakura.ninth-nine.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: inline On Thu, Sep 23, 2004 at 08:37:13PM +0900, Norikatsu Shigemura wrote: > On Thu, 23 Sep 2004 11:40:38 +0900 > Pyun YongHyeon <yongari@kt-is.co.kr> wrote: > > Since it worked before, it sounds like DMA buffer allocation issue. > > Can you try attached patch? It doesn't fix your issue but it checks > > return code correctly and we can know whether DMA buffer allocation > > was successful or not. > > I was in trouble with this problem, too. So I tested your > patch. It looks good with Onkyo SE-120PCI(Maestro3). > Would you plase commit to CURRENT and RELENG_5? > Yes, I have plans to do it. But it's just part of other commits pending which would be committed after 5.3R. The reason I didn't commit it was lack of time. If you want to commit it please go ahead. Almost all audio drivers's code for sndbuf_alloc() call should be corrected. And possible memory leak in sound(4) should be fixed too. I have attached patch file and it was reviewed by truckman, mat.(Since the patch was tested on sparc64, you may have to add cast (unsigned long) in sndbuf_setmap() patch.) I'll not be reachable until Oct 1. Regards, Pyun YongHyeon -- Pyun YongHyeon <http://www.kr.freebsd.org/~yongari> --fUYQa+Pmc3FrFX/N Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="pcm.patch" --- sys/dev/sound/pcm/buffer.c.orig Thu Apr 29 11:51:59 2004 +++ sys/dev/sound/pcm/buffer.c Mon Aug 30 20:21:10 2004 @@ -61,11 +61,12 @@ struct snd_dbuf *b = (struct snd_dbuf *)arg; if (bootverbose) { - device_printf(b->dev, "sndbuf_setmap %lx, %lx; ", (unsigned long)segs->ds_addr, - (unsigned long)segs->ds_len); - printf("%p -> %lx\n", b->buf, (unsigned long)vtophys(b->buf)); + device_printf(b->dev, "sndbuf_setmap %lx, %lx; ", + segs[0].ds_addr, segs[0].ds_len); + printf("%p -> %lx\n", b->buf, segs[0].ds_addr); } - b->buf_addr = segs->ds_addr; + if ((b->map_error = error) == 0) + b->buf_addr = segs[0].ds_addr; } /* @@ -76,14 +77,26 @@ int sndbuf_alloc(struct snd_dbuf *b, bus_dma_tag_t dmatag, unsigned int size) { + int ret; + b->dmatag = dmatag; b->maxsize = size; b->bufsize = b->maxsize; - if (bus_dmamem_alloc(b->dmatag, (void **)&b->buf, BUS_DMA_NOWAIT, &b->dmamap)) - return ENOSPC; - if (bus_dmamap_load(b->dmatag, b->dmamap, b->buf, b->maxsize, sndbuf_setmap, b, 0)) - return ENOSPC; - return sndbuf_resize(b, 2, b->maxsize / 2); + b->map_error = 0; + if (bus_dmamem_alloc(b->dmatag, (void **)&b->buf, BUS_DMA_NOWAIT, + &b->dmamap)) + return (ENOMEM); + if (bus_dmamap_load(b->dmatag, b->dmamap, b->buf, b->maxsize, + sndbuf_setmap, b, 0) != 0 || b->map_error != 0) { + bus_dmamem_free(b->dmatag, b->buf, b->dmamap); + b->dmamap = NULL; + return (ENOMEM); + } + + ret = sndbuf_resize(b, 2, b->maxsize / 2); + if (ret != 0) + sndbuf_free(b); + return (ret); } int @@ -92,6 +105,7 @@ b->buf = buf; b->maxsize = size; b->bufsize = b->maxsize; + b->map_error = 0; return sndbuf_resize(b, 2, b->maxsize / 2); } --- sys/dev/sound/pcm/buffer.h.orig Wed Jan 28 17:02:15 2004 +++ sys/dev/sound/pcm/buffer.h Sat Aug 28 17:35:46 2004 @@ -52,6 +52,7 @@ bus_dmamap_t dmamap; bus_dma_tag_t dmatag; u_int32_t buf_addr; + int map_error; struct selinfo sel; struct pcm_channel *channel; char name[SNDBUF_NAMELEN]; --fUYQa+Pmc3FrFX/N--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20040923120105.GC13003>