diff options
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; |