Date: Mon, 25 Aug 1997 21:19:19 -0700 From: Amancio Hasty <hasty@rah.star-gate.com> To: hackers@freebsd.org Subject: isa.c patch Message-ID: <199708260419.VAA00268@rah.star-gate.com>
next in thread | raw e-mail | index | archive | help
Here is a patch to alleviate the current problem with the dma interface and the sound driver which uses auto dma. The dma interface functionality remains however it now checks to see if a dma is operating in auto dma mode and if so it bypasses the busy flag check . I have modified the sound driver 3.5 to adjust for this new behavior and tested it under FreeBSD 3.0 -current Amancio *** isa.c.orig Mon Aug 25 21:04:10 1997 --- isa.c Mon Aug 25 21:04:22 1997 *************** *** 570,575 **** --- 570,576 ---- static u_int8_t dma_bounced = 0; static u_int8_t dma_busy = 0; /* Used in isa_dmastart() */ static u_int8_t dma_inuse = 0; /* User for acquire/release */ + static u_int8_t dma_auto_mode = 0; #define VALID_DMA_MASK (7) *************** *** 631,636 **** --- 632,638 ---- return (EBUSY); } dma_inuse |= (1 << chan); + dma_auto_mode &= ~(1 << chan); return (0); } *************** *** 662,667 **** --- 664,670 ---- } dma_inuse &= ~(1 << chan); + dma_auto_mode &= ~(1 << chan); } /* *************** *** 736,741 **** --- 739,750 ---- /* 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); + } + if ((chan & 4) == 0) { /* * Program one of DMA channels 0..3. These are *************** *** 816,830 **** printf("isa_dmadone: 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)) == 0) printf("isa_dmadone: channel %d not busy\n", chan); ! #endif if (dma_bounced & (1 << chan)) { /* copy bounce buffer on read */ --- 825,834 ---- 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); ! if (dma_bounced & (1 << chan)) { /* copy bounce buffer on read */ *************** *** 913,924 **** printf("isa_dmastatus: channel %d not active\n", chan); return(-1); } ! /* still busy? */ ! if ((dma_busy & (1 << chan)) == 0) { ! return(0); ! } ! if (chan < 4) { /* low DMA controller */ ffport = DMA1_FFC; waport = DMA1_CHN(chan) + 1; --- 917,929 ---- 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 ; ! } if (chan < 4) { /* low DMA controller */ ffport = DMA1_FFC; waport = DMA1_CHN(chan) + 1;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199708260419.VAA00268>