diff options
Diffstat (limited to 'sys/dev')
-rw-r--r-- | sys/dev/pci/auvia.c | 22 | ||||
-rw-r--r-- | sys/dev/pci/auviavar.h | 5 |
2 files changed, 24 insertions, 3 deletions
diff --git a/sys/dev/pci/auvia.c b/sys/dev/pci/auvia.c index b671cb43c40..f6307d4a960 100644 --- a/sys/dev/pci/auvia.c +++ b/sys/dev/pci/auvia.c @@ -1,4 +1,4 @@ -/* $OpenBSD: auvia.c,v 1.41 2008/09/24 19:09:05 chl Exp $ */ +/* $OpenBSD: auvia.c,v 1.42 2008/10/02 18:29:40 jakemsr Exp $ */ /* $NetBSD: auvia.c,v 1.28 2002/11/04 16:38:49 kent Exp $ */ /*- @@ -91,6 +91,7 @@ int auvia_get_port(void *, mixer_ctrl_t *); int auvia_query_devinfo(void *, mixer_devinfo_t *); void * auvia_malloc(void *, int, size_t, int, int); void auvia_free(void *, void *, int); +size_t auvia_round_buffersize(void *, int, size_t); paddr_t auvia_mappage(void *, void *, off_t, int); int auvia_get_props(void *); int auvia_build_dma_ops(struct auvia_softc *, struct auvia_softc_chan *, @@ -202,7 +203,7 @@ struct audio_hw_if auvia_hw_if = { auvia_query_devinfo, auvia_malloc, auvia_free, - NULL, /* auvia_round_buffersize */ + auvia_round_buffersize, auvia_mappage, auvia_get_props, auvia_trigger_output, @@ -705,6 +706,10 @@ auvia_set_params(void *addr, int setmode, int usemode, int auvia_round_blocksize(void *addr, int blk) { + struct auvia_softc *sc = addr; + + if (sc->bufsize / blk > AUVIA_DMALIST_MAX) + blk = sc->bufsize / AUVIA_DMALIST_MAX + 1; return ((blk + 31) & -32); } @@ -857,6 +862,15 @@ auvia_free(void *addr, void *ptr, int pool) panic("auvia_free: trying to free unallocated memory"); } +size_t +auvia_round_buffersize(void *addr, int direction, size_t bufsize) +{ + struct auvia_softc *sc = addr; + + sc->bufsize = bufsize; + return bufsize; +} + paddr_t auvia_mappage(void *addr, void *mem, off_t off, int prot) { @@ -901,6 +915,10 @@ auvia_build_dma_ops(struct auvia_softc *sc, struct auvia_softc_chan *ch, s = p->map->dm_segs[0].ds_addr; l = (vaddr_t)end - (vaddr_t)start; segs = howmany(l, blksize); + if (segs > AUVIA_DMALIST_MAX) { + panic("%s: build_dma_ops: too many DMA segments", + sc->sc_dev.dv_xname); + } if (segs > ch->sc_dma_op_count) { /* if old list was too small, free it */ diff --git a/sys/dev/pci/auviavar.h b/sys/dev/pci/auviavar.h index 93904ccb69f..d83879ab9c4 100644 --- a/sys/dev/pci/auviavar.h +++ b/sys/dev/pci/auviavar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: auviavar.h,v 1.9 2008/06/26 05:42:17 ray Exp $ */ +/* $OpenBSD: auviavar.h,v 1.10 2008/10/02 18:29:40 jakemsr Exp $ */ /* $NetBSD: auviavar.h,v 1.1 2000/03/31 04:45:29 tsarna Exp $ */ /*- @@ -62,10 +62,13 @@ struct auvia_softc { struct ac97_host_if host_if; struct ac97_codec_if *codec_if; + int bufsize; struct auvia_dma *sc_dmas; struct auvia_softc_chan sc_play, sc_record; }; +#define AUVIA_DMALIST_MAX 255 + #endif |