Date: Sat, 30 Aug 1997 12:37:31 -0700 From: Amancio Hasty <hasty@rah.star-gate.com> To: Johan Larsson <gozer@ludd.luth.se> Cc: multimedia@freebsd.org Subject: Re: Xquake, still no luck. Message-ID: <199708301937.MAA07420@rah.star-gate.com> In-Reply-To: Your message of "Sat, 30 Aug 1997 18:05:27 %2B0200." <Pine.SUN.3.95.970830180303.9129A-100000@father.ludd.luth.se>
next in thread | previous in thread | raw e-mail | index | archive | help
About isa.c ,
a static variable dma_auto_mode was added:
static u_int8_t dma_auto_mode = 0;
---
*/
int
isa_dma_acquire(chan)
int chan;
{
#ifdef DIAGNOSTIC
if (chan & ~VALID_DMA_MASK)
panic("isa_dma_acquire: channel out of range");
#endif
if (dma_inuse & (1 << chan)) {
printf("isa_dma_acquire: channel %d already in use\n", chan);
return (EBUSY);
}
dma_inuse |= (1 << chan);
dma_auto_mode &= ~(1 << chan);
^^^^^^^^^^^^^^^^^^^^^ clear auto dma state for channel
----
void
isa_dma_release(chan)
int chan;
{
#ifdef DIAGNOSTIC
if (chan & ~VALID_DMA_MASK)
panic("isa_dma_release: channel out of range");
if ((dma_inuse & (1 << chan)) == 0)
printf("isa_dma_release: channel %d not in use\n", chan);
#endif
if (dma_busy & (1 << chan)) {
dma_busy &= ~(1 << chan);
/*
* XXX We should also do "dma_bounced &= (1 << chan);"
* because we are acting on behalf of isa_dmadone() which
* was not called to end the last DMA operation. This does
* not matter now, but it may in the future.
*/
}
dma_inuse &= ~(1 << chan);
dma_auto_mode &= ~(1 << chan);
^^^^^^^^^^^^^^^^^^^^^ clear auto dma state for channel
----
void isa_dmastart(int flags, caddr_t addr, u_int nbytes, int chan)
{
vm_offset_t phys;
int waport;
caddr_t newaddr;
#ifdef DIAGNOSTIC
if (chan & ~VALID_DMA_MASK)
panic("isa_dmastart: channel out of range");
if ((chan < 4 && nbytes > (1<<16))
|| (chan >= 4 && (nbytes > (1<<17) || (u_int)addr & 1)))
panic("isa_dmastart: impossible request");
if ((dma_inuse & (1 << chan)) == 0)
printf("isa_dmastart: channel %d not acquired\n", chan);
#endif
#if 0
/*
* XXX This should be checked, but drivers like ad1848 only call
* isa_dmastart() once because they use Auto DMA mode. If we
* leave this in, drivers that do this will print this continuously.
*/
if (dma_busy & (1 << chan))
printf("isa_dmastart: channel %d busy\n", chan);
#endif
dma_busy |= (1 << chan);
if (isa_dmarangecheck(addr, nbytes, chan)) {
if (dma_bouncebuf[chan] == NULL
|| dma_bouncebufsize[chan] < nbytes)
panic("isa_dmastart: bad bounce buffer");
dma_bounced |= (1 << chan);
newaddr = dma_bouncebuf[chan];
/* copy bounce buffer on write */
if (!(flags & B_READ))
bcopy(addr, newaddr, nbytes);
addr = newaddr;
}
/* translate to physical */
phys = pmap_extract(pmap_kernel(), (vm_offset_t)addr);
if (flags & B_RAW) {
dma_auto_mode |= (1 << chan);
} else {
dma_auto_mode &= ~(1 << chan);
}
^^^^^^^^^^^^^^^^^^ set the auto dma flag if R_RAW is set otherwise
we are not using auto dma mode
void isa_dmadone(int flags, caddr_t addr, int nbytes, int chan)
{
#ifdef DIAGNOSTIC
if (chan & ~VALID_DMA_MASK)
panic("isa_dmadone: channel out of range");
if ((dma_inuse & (1 << chan)) == 0)
printf("isa_dmadone: channel %d not acquired\n", chan);
#endif
if (((dma_busy & (1 << chan)) == 0) &&
(dma_auto_mode & (1 << chan)) == 0 )
printf("isa_dmadone: channel %d not busy\n", chan);
^^^^^^^^^^^^^^^^^^^^^^^ don't print silly printf if we using auto dma ^^^^^^
----
int
isa_dmastatus(int chan)
{
u_long cnt = 0;
int ffport, waport;
u_long low1, high1, low2, high2;
u_long ef;
/* channel active? */
if ((dma_inuse & (1 << chan)) == 0) {
printf("isa_dmastatus: channel %d not active\n", chan);
return(-1);
}
/* channel busy? */
if (((dma_busy & (1 << chan)) == 0) &&
(dma_auto_mode & (1 << chan)) == 0 ) {
printf("chan %d not busy\n", chan);
return -2 ;
}
^^^^^^^^^^^^^^^ don't return if we are in auto dma mode ^^^^^^^^^^^^^^^^^^^^^
------
int isa_dmastop(int chan)
{
if (dma_inuse & (1 << chan) == 0)
printf("isa_dmastop: channel %d not acquired\n", chan);
if (((dma_busy & (1 << chan)) == 0) &&
(dma_auto_mode & (1 << chan)) == 0 ) {
printf("chan %d not busy\n", chan);
return -2 ;
}
^^^^^^^^^^^^^^^ don't return if we are in auto dma mode ^^^^^^^^^^^^^^^^^^^^^
Hope this helps,
Amancio
>From The Desk Of Johan Larsson :
> On Fri, 29 Aug 1997, Amancio Hasty wrote:
>
> > okay,
> > leave /etc/host.conf there and mail me your /compat/linux/etc/host.conf
>
> Don't bother about this problem nomore.. It was "my" fault. Of some reason
> that i don't know of, about /etc/hosts was messed up.
>
> Thanks for anything, now it's just the "isa_dmastatus: channel 5 not
> active" problem i gotta to solve. :-)
>
> Johan
> --
> * mailto:gozer@ludd.luth.se * http://www.ludd.luth.se/users/gozer/ *
> * finger gozer@mother.ludd.luth.se for more information... +-+-+-+ *
> * Powered by FreeBSD. http://www.se.freebsd.org/ +-+-+-+-+-+-+-+-+ *
>
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199708301937.MAA07420>
