diff options
author | cg <cg@FreeBSD.org> | 2001-09-29 07:57:07 +0000 |
---|---|---|
committer | cg <cg@FreeBSD.org> | 2001-09-29 07:57:07 +0000 |
commit | 3113c29f9549f5a7c16cc00242d500baddb6c12a (patch) | |
tree | 6559337f7a3f52a77b76a5b766d52f978eb671da /sys/dev/sound/isa/sb8.c | |
parent | 5d69c42a56c5adbe4c103a3d603b419a8b6c00b4 (diff) | |
download | FreeBSD-src-3113c29f9549f5a7c16cc00242d500baddb6c12a.zip FreeBSD-src-3113c29f9549f5a7c16cc00242d500baddb6c12a.tar.gz |
allow the hardware buffer size to be controlled with hints
release isa dma channels on unload (ad1816, ess, sb8)
Diffstat (limited to 'sys/dev/sound/isa/sb8.c')
-rw-r--r-- | sys/dev/sound/isa/sb8.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/sys/dev/sound/isa/sb8.c b/sys/dev/sound/isa/sb8.c index b02e5e4..41c64ce 100644 --- a/sys/dev/sound/isa/sb8.c +++ b/sys/dev/sound/isa/sb8.c @@ -38,7 +38,7 @@ SND_DECLARE_FILE("$FreeBSD$"); -#define SB_BUFFSIZE 4096 +#define SB_DEFAULT_BUFSZ 4096 static u_int32_t sb_fmt[] = { AFMT_U8, @@ -75,6 +75,7 @@ struct sb_info { void *ih; bus_dma_tag_t parent_dmat; + unsigned int bufsize; int bd_id; u_long bd_flags; /* board-specific flags */ struct sb_chinfo pch, rch; @@ -261,6 +262,7 @@ sb_release_resources(struct sb_info *sb, device_t dev) sb->irq = 0; } if (sb->drq) { + isa_dma_release(rman_get_start(sb->drq)); bus_release_resource(dev, SYS_RES_DRQ, 0, sb->drq); sb->drq = 0; } @@ -291,10 +293,8 @@ sb_alloc_resources(struct sb_info *sb, device_t dev) sb->drq = bus_alloc_resource(dev, SYS_RES_DRQ, &rid, 0, ~0, 1, RF_ACTIVE); if (sb->io_base && sb->drq && sb->irq) { - int bs = SB_BUFFSIZE; - isa_dma_acquire(rman_get_start(sb->drq)); - isa_dmainit(rman_get_start(sb->drq), bs); + isa_dmainit(rman_get_start(sb->drq), sb->bufsize); return 0; } else return ENXIO; @@ -580,7 +580,7 @@ sbchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c ch->channel = c; ch->dir = dir; ch->buffer = b; - if (sndbuf_alloc(ch->buffer, sb->parent_dmat, SB_BUFFSIZE) == -1) + if (sndbuf_alloc(ch->buffer, sb->parent_dmat, sb->bufsize) == -1) return NULL; sndbuf_isadmasetup(ch->buffer, sb->drq); return ch; @@ -693,7 +693,6 @@ sb_attach(device_t dev) { struct sb_info *sb; char status[SND_STATUSLEN]; - int bs = SB_BUFFSIZE; uintptr_t ver; sb = (struct sb_info *)malloc(sizeof *sb, M_DEVBUF, M_NOWAIT | M_ZERO); @@ -704,6 +703,7 @@ sb_attach(device_t dev) BUS_READ_IVAR(device_get_parent(dev), dev, 1, &ver); sb->bd_id = ver & 0x0000ffff; sb->bd_flags = (ver & 0xffff0000) >> 16; + sb->bufsize = pcm_getbuffersize(dev, 4096, SB_DEFAULT_BUFSZ, 65536); if (sb_alloc_resources(sb, dev)) goto no; @@ -720,15 +720,15 @@ sb_attach(device_t dev) /*lowaddr*/BUS_SPACE_MAXADDR_24BIT, /*highaddr*/BUS_SPACE_MAXADDR, /*filter*/NULL, /*filterarg*/NULL, - /*maxsize*/bs, /*nsegments*/1, + /*maxsize*/sb->bufsize, /*nsegments*/1, /*maxsegz*/0x3ffff, /*flags*/0, &sb->parent_dmat) != 0) { device_printf(dev, "unable to create dma tag\n"); goto no; } - snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld", - rman_get_start(sb->io_base), rman_get_start(sb->irq), rman_get_start(sb->drq)); + snprintf(status, SND_STATUSLEN, "at io 0x%lx irq %ld drq %ld bufsz %u", + rman_get_start(sb->io_base), rman_get_start(sb->irq), rman_get_start(sb->drq), sb->bufsize); if (pcm_register(dev, sb, 1, 1)) goto no; |