Audio drivers failed to detect failure condition and attempted to

assign DMA address to the wrong address. It can cause system lockup
or other mysterious errors. Since most sound cards requires low DMA
address(BUS_SPACE_MAXADDR_24BIT) sndbuf_alloc() would fail when the
audio driver is loaded after long running of operations.

Approved by:	jake (mentor)
Reviewed by:	truckman, matk
This commit is contained in:
Pyun YongHyeon 2004-10-13 05:45:16 +00:00
parent fdebdf10bc
commit eba1cb6e3e
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=136469
18 changed files with 29 additions and 23 deletions

View File

@ -314,7 +314,8 @@ ad1816chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channe
ch->parent = ad1816;
ch->channel = c;
ch->buffer = b;
if (sndbuf_alloc(ch->buffer, ad1816->parent_dmat, ad1816->bufsize) == -1) return NULL;
if (sndbuf_alloc(ch->buffer, ad1816->parent_dmat, ad1816->bufsize) != 0)
return NULL;
return ch;
}

View File

@ -557,7 +557,7 @@ esschan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->parent = sc;
ch->channel = c;
ch->buffer = b;
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsize) == -1)
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsize) != 0)
return NULL;
ch->dir = dir;
ch->hwch = 1;

View File

@ -1131,7 +1131,8 @@ msschan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->channel = c;
ch->buffer = b;
ch->dir = dir;
if (sndbuf_alloc(ch->buffer, mss->parent_dmat, mss->bufsize) == -1) return NULL;
if (sndbuf_alloc(ch->buffer, mss->parent_dmat, mss->bufsize) != 0)
return NULL;
sndbuf_dmasetup(ch->buffer, (dir == PCMDIR_PLAY)? mss->drq1 : mss->drq2);
return ch;
}

View File

@ -671,7 +671,7 @@ sb16chan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->buffer = b;
ch->dir = dir;
if (sndbuf_alloc(ch->buffer, sb->parent_dmat, sb->bufsize) == -1)
if (sndbuf_alloc(ch->buffer, sb->parent_dmat, sb->bufsize) != 0)
return NULL;
return ch;

View File

@ -585,7 +585,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->bufsize) == -1)
if (sndbuf_alloc(ch->buffer, sb->parent_dmat, sb->bufsize) != 0)
return NULL;
sndbuf_dmasetup(ch->buffer, sb->drq);
return ch;

View File

@ -332,7 +332,7 @@ au88x0_chan_init(kobj_t obj, void *arg,
struct au88x0_info *aui = arg;
struct au88x0_chan_info *auci = au88x0_channel(aui, dir);
if (sndbuf_alloc(buf, aui->aui_dmat, aui->aui_bufsize) == -1)
if (sndbuf_alloc(buf, aui->aui_dmat, aui->aui_bufsize) != 0)
return (NULL);
auci->auci_aui = aui;
auci->auci_pcmchan = chan;

View File

@ -303,7 +303,8 @@ auchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c
ch->channel = c;
ch->buffer = b;
ch->dir = dir;
if (sndbuf_alloc(ch->buffer, au->parent_dmat, AU_BUFFSIZE) == -1) return NULL;
if (sndbuf_alloc(ch->buffer, au->parent_dmat, AU_BUFFSIZE) != 0)
return NULL;
return ch;
}

View File

@ -516,7 +516,8 @@ csachan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->channel = c;
ch->buffer = b;
ch->dir = dir;
if (sndbuf_alloc(ch->buffer, csa->parent_dmat, CS461x_BUFFSIZE) == -1) return NULL;
if (sndbuf_alloc(ch->buffer, csa->parent_dmat, CS461x_BUFFSIZE) != 0)
return NULL;
return ch;
}

View File

@ -490,7 +490,7 @@ ds1pchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->fmt = AFMT_U8;
ch->spd = 8000;
ch->run = 0;
if (sndbuf_alloc(ch->buffer, sc->buffer_dmat, sc->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, sc->buffer_dmat, sc->bufsz) != 0)
return NULL;
else {
ch->lsnum = sc->pslotfree;
@ -621,7 +621,7 @@ ds1rchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->dir = dir;
ch->fmt = AFMT_U8;
ch->spd = 8000;
if (sndbuf_alloc(ch->buffer, sc->buffer_dmat, sc->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, sc->buffer_dmat, sc->bufsz) != 0)
return NULL;
else {
ch->slot = (ch->num == DS1_RECPRIMARY)? sc->rbank + 2: sc->rbank;

View File

@ -889,7 +889,7 @@ emurchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
break;
}
sc->rnum++;
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) != 0)
return NULL;
else {
snd_mtxlock(sc->lock);

View File

@ -274,7 +274,8 @@ eschan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *c
ch->bufsz = es->bufsz;
ch->blksz = ch->bufsz / 2;
ch->num = ch->parent->num++;
if (sndbuf_alloc(ch->buffer, es->parent_dmat, ch->bufsz) == -1) return NULL;
if (sndbuf_alloc(ch->buffer, es->parent_dmat, ch->bufsz) != 0)
return NULL;
return ch;
}

View File

@ -334,7 +334,8 @@ fm801ch_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->channel = c;
ch->buffer = b;
ch->dir = dir;
if (sndbuf_alloc(ch->buffer, fm801->parent_dmat, fm801->bufsz) == -1) return NULL;
if (sndbuf_alloc(ch->buffer, fm801->parent_dmat, fm801->bufsz) != 0)
return NULL;
return (void *)ch;
}

View File

@ -282,7 +282,7 @@ ichchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
return NULL;
}
if (sndbuf_alloc(ch->buffer, sc->dmat, sc->bufsz))
if (sndbuf_alloc(ch->buffer, sc->dmat, sc->bufsz) != 0)
return NULL;
ich_wr(sc, ch->regbase + ICH_REG_X_BDBAR, (u_int32_t)(ch->desc_addr), 4);

View File

@ -383,7 +383,7 @@ m3_pchan_init(kobj_t kobj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->channel = c;
ch->fmt = AFMT_U8;
ch->spd = DSP_DEFAULT_SPEED;
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) == -1) {
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) != 0) {
device_printf(sc->dev, "m3_pchan_init chn_allocbuf failed\n");
return NULL;
}
@ -663,7 +663,7 @@ m3_rchan_init(kobj_t kobj, void *devinfo, struct snd_dbuf *b, struct pcm_channel
ch->channel = c;
ch->fmt = AFMT_U8;
ch->spd = DSP_DEFAULT_SPEED;
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) == -1) {
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) != 0) {
device_printf(sc->dev, "m3_rchan_init chn_allocbuf failed\n");
return NULL;
}

View File

@ -520,7 +520,7 @@ esschan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->channel = c;
ch->buffer = b;
ch->dir = dir;
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, sc->parent_dmat, sc->bufsz) != 0)
return NULL;
ch->hwch = 1;
if ((dir == PCMDIR_PLAY) && (sc->duplex))

View File

@ -484,7 +484,7 @@ trpchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->buffer = b;
ch->parent = tr;
ch->channel = c;
if (sndbuf_alloc(ch->buffer, tr->parent_dmat, tr->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, tr->parent_dmat, tr->bufsz) != 0)
return NULL;
return ch;
@ -592,7 +592,7 @@ trrchan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->buffer = b;
ch->parent = tr;
ch->channel = c;
if (sndbuf_alloc(ch->buffer, tr->parent_dmat, tr->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, tr->parent_dmat, tr->bufsz) != 0)
return NULL;
return ch;

View File

@ -447,7 +447,7 @@ via8233wr_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->rbase = VIA_WR_BASE(c->num);
via_wr(via, ch->rbase + VIA_WR_RP_SGD_FORMAT, WR_FIFO_ENABLE, 1);
if (sndbuf_alloc(ch->buffer, via->parent_dmat, via->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, via->parent_dmat, via->bufsz) != 0)
return NULL;
via8233chan_sgdinit(via, ch, c->num);
via8233chan_reset(via, ch);
@ -475,7 +475,7 @@ via8233dxs_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->rbase = VIA_DXS_BASE(NDXSCHANS - 1 - via->n_dxs_registered);
via->n_dxs_registered++;
if (sndbuf_alloc(ch->buffer, via->parent_dmat, via->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, via->parent_dmat, via->bufsz) != 0)
return NULL;
via8233chan_sgdinit(via, ch, NWRCHANS + c->num);
via8233chan_reset(via, ch);
@ -496,7 +496,7 @@ via8233msgd_init(kobj_t obj, void *devinfo, struct snd_dbuf *b,
ch->dir = dir;
ch->rbase = VIA_MC_SGD_STATUS;
if (sndbuf_alloc(ch->buffer, via->parent_dmat, via->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, via->parent_dmat, via->bufsz) != 0)
return NULL;
via8233chan_sgdinit(via, ch, NWRCHANS + c->num);
via8233chan_reset(via, ch);

View File

@ -267,7 +267,7 @@ viachan_init(kobj_t obj, void *devinfo, struct snd_dbuf *b, struct pcm_channel *
ch->buffer = b;
ch->dir = dir;
if (sndbuf_alloc(ch->buffer, via->parent_dmat, via->bufsz) == -1)
if (sndbuf_alloc(ch->buffer, via->parent_dmat, via->bufsz) != 0)
return NULL;
return ch;
}