From owner-freebsd-multimedia@FreeBSD.ORG Sun Apr 10 19:57:13 2005 Return-Path: Delivered-To: freebsd-multimedia@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 3517516A4CE for ; Sun, 10 Apr 2005 19:57:13 +0000 (GMT) Received: from torrent.cc.mcgill.ca (torrent.CC.McGill.CA [132.206.27.49]) by mx1.FreeBSD.org (Postfix) with ESMTP id 2132B43D2D for ; Sun, 10 Apr 2005 19:57:12 +0000 (GMT) (envelope-from mat@cnd.mcgill.ca) Received: from mailscan2.cc.mcgill.ca (mailscan2.CC.McGill.CA [132.216.77.249])j3AJuwXP031067; Sun, 10 Apr 2005 15:56:59 -0400 Received: from cube.cnd.mcgill.ca (cube.CND.McGill.CA [132.216.25.196]) j3AJupdM005032; Sun, 10 Apr 2005 15:56:53 -0400 (EDT) Received: from localhost.localdomain (acid.cnd.mcgill.ca [132.216.11.151]) by cube.cnd.mcgill.ca (8.12.11/8.12.11) with ESMTP id j3AJun2R000336; Sun, 10 Apr 2005 15:56:51 -0400 Received: from localhost.localdomain (acid [127.0.0.1]) j3AJumVU002207; Sun, 10 Apr 2005 15:56:49 -0400 Received: (from mat@localhost) by localhost.localdomain (8.12.11/8.12.11/Submit) id j3AJujkQ002206; Sun, 10 Apr 2005 15:56:45 -0400 Date: Sun, 10 Apr 2005 15:56:45 -0400 From: Mathew Kanner To: freebsd-multimedia@freebsd.org Message-ID: <20050410195645.GA2178@cnd.mcgill.ca> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="h31gzZEtNLTqOjlF" Content-Disposition: inline User-Agent: Mutt/1.4.2i Organization: I speak for myself, operating in Montreal, CANADA cc: Julian Elischer Subject: de-dma uaudio X-BeenThere: freebsd-multimedia@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Multimedia discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 10 Apr 2005 19:57:13 -0000 --h31gzZEtNLTqOjlF Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Hello, The uaudio dma problem came up again on the -current list so I had another look at it seems that we don't even need to do DMA at all at that layer of the driver. Attached is patch that de-dma's the uaudio_pcm.c file. It's for -HEAD but should work ok for -stable as well. It makes my old uaudio adapter much happier. The tunable hw.snd.pcm0.buffersize is a bit of misnomer, it the size per channel, eg one each for play/record. You should be able to override it with (from the loader) hint.pcm.%d.buffersize=(some int <=65536) --Mat --h31gzZEtNLTqOjlF Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="uaudio_dedma.2.patch" Index: uaudio_pcm.c =================================================================== RCS file: /home/ncvs/src/sys/dev/sound/usb/uaudio_pcm.c,v retrieving revision 1.10 diff -u -r1.10 uaudio_pcm.c --- uaudio_pcm.c 1 Mar 2005 08:58:06 -0000 1.10 +++ uaudio_pcm.c 10 Apr 2005 19:51:26 -0000 @@ -40,14 +40,15 @@ struct ua_info *parent; struct pcm_channel *channel; struct snd_dbuf *buffer; + u_char *buf; int dir, hwch; u_int32_t fmt, spd, blksz; /* XXXXX */ }; struct ua_info { device_t sc_dev; + u_int32_t bufsz; struct ua_chinfo pch, rch; - bus_dma_tag_t parent_dmat; }; static u_int32_t ua_playfmt[8*2+1]; /* 8 format * (stereo or mono) + endptr */ @@ -58,14 +59,13 @@ static struct pcmchan_caps ua_reccaps = {8000, 48000, ua_recfmt, 0}; -#define UAUDIO_PCM_BUFF_SIZE 16*1024 +#define UAUDIO_DEFAULT_BUFSZ 16*1024 /************************************************************/ static void * ua_chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c, int dir) { device_t pa_dev; - u_char *buf,*end; struct ua_info *sc = devinfo; struct ua_chinfo *ch = (dir == PCMDIR_PLAY)? &sc->pch : &sc->rch; @@ -83,14 +83,17 @@ return NULL; } - /* allocate PCM side DMA buffer */ - if (sndbuf_alloc(ch->buffer, sc->parent_dmat, UAUDIO_PCM_BUFF_SIZE) != 0) { - return NULL; - } - - buf = end = sndbuf_getbuf(b); - end += sndbuf_getsize(b); - uaudio_chan_set_param_pcm_dma_buff(pa_dev, buf, end, ch->channel, dir); + ch->buf = malloc(sc->bufsz, M_DEVBUF, M_NOWAIT); + if (ch->buf == NULL) + return NULL; + if (sndbuf_setup(b, ch->buf, sc->bufsz) != 0) { + free(ch->buf, M_DEVBUF); + return NULL; + } + uaudio_chan_set_param_pcm_dma_buff(pa_dev, ch->buf, ch->buf+sc->bufsz, ch->channel, dir); + if (bootverbose) + device_printf(pa_dev, "%s buf %p\n", (dir == PCMDIR_PLAY)? + "play" : "rec", sndbuf_getbuf(ch->buffer)); ch->dir = dir; #ifndef NO_RECORDING @@ -105,6 +108,16 @@ } static int +ua_chan_free(kobj_t obj, void *data) +{ + struct ua_chinfo *ua = data; + + if (ua->buf != NULL) + free(ua->buf, M_DEVBUF); + return 0; +} + +static int ua_chan_setformat(kobj_t obj, void *data, u_int32_t format) { device_t pa_dev; @@ -140,17 +153,15 @@ ua_chan_setblocksize(kobj_t obj, void *data, u_int32_t blocksize) { device_t pa_dev; - struct ua_info *ua; struct ua_chinfo *ch = data; - /* ch->blksz = blocksize; */ + struct ua_info *ua = ch->parent; + if (blocksize) { - ch->blksz = blocksize; - } else { - ch->blksz = UAUDIO_PCM_BUFF_SIZE/2; + RANGE(blocksize, 128, ua->bufsz / 2); + if (sndbuf_resize(ch->buffer, ua->bufsz/blocksize, blocksize) != 0) { + ch->blksz = blocksize; + } } - - /* XXXXX */ - ua = ch->parent; pa_dev = device_get_parent(ua->sc_dev); uaudio_chan_set_param_blocksize(pa_dev, blocksize, ch->dir); @@ -212,6 +223,7 @@ static kobj_method_t ua_chan_methods[] = { KOBJMETHOD(channel_init, ua_chan_init), + KOBJMETHOD(channel_free, ua_chan_free), KOBJMETHOD(channel_setformat, ua_chan_setformat), KOBJMETHOD(channel_setspeed, ua_chan_setspeed), KOBJMETHOD(channel_setblocksize, ua_chan_setblocksize), @@ -298,7 +310,6 @@ { struct ua_info *ua; char status[SND_STATUSLEN]; - unsigned int bufsz; ua = (struct ua_info *)malloc(sizeof *ua, M_DEVBUF, M_NOWAIT); if (!ua) @@ -307,20 +318,10 @@ ua->sc_dev = dev; - bufsz = pcm_getbuffersize(dev, 4096, UAUDIO_PCM_BUFF_SIZE, 65536); - - if (bus_dma_tag_create(/*parent*/NULL, /*alignment*/2, /*boundary*/0, - /*lowaddr*/BUS_SPACE_MAXADDR_32BIT, - /*highaddr*/BUS_SPACE_MAXADDR, - /*filter*/NULL, /*filterarg*/NULL, - /*maxsize*/bufsz, /*nsegments*/1, - /*maxsegz*/0x3fff, /*flags*/0, - /*lockfunc*/busdma_lock_mutex, - /*lockarg*/&Giant, - &ua->parent_dmat) != 0) { - device_printf(dev, "unable to create dma tag\n"); - goto bad; - } + ua->bufsz = pcm_getbuffersize(dev, 4096, UAUDIO_DEFAULT_BUFSZ, 65536); + if (bootverbose) + device_printf(dev, "using a default buffer size of %jd\n", (intmax_t)ua->bufsz); + ua->bufsz = pcm_getbuffersize(dev, 4096, UAUDIO_DEFAULT_BUFSZ, 65536); if (mixer_init(dev, &ua_mixer_class, ua)) { return(ENXIO); @@ -343,12 +344,6 @@ pcm_setstatus(dev, status); return 0; -bad: - if (ua->parent_dmat) - bus_dma_tag_destroy(ua->parent_dmat); - free(ua, M_DEVBUF); - - return ENXIO; } static int @@ -362,7 +357,6 @@ return r; sc = pcm_getdevinfo(dev); - bus_dma_tag_destroy(sc->parent_dmat); free(sc, M_DEVBUF); return 0; --h31gzZEtNLTqOjlF--