Port-atari archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: Current kernel with http://gnats.netbsd.org/39965 and pmap patches
tjamaloo%gmail.com@localhost wrote:
> AFAIK Falcon sound system and SCSI use DMA, but DMA for SCSI is disabled from
> atari/dev/ncr5380.c since 1.57 (there can be DMA HW issues with some Falcons).
Is there any device which uses DMA on your machine?
Could DMA interrupts happen even if it's disabled?
> > What happens if "MFP->mf_iprb = (u_int8_t)~IB_DINT;"
> > is added before (or after) wdcintr() call in wdc_mb_intr()
> > as current free_hw() does?
>
> Adding it before wdcintr() call does not do better; couple of stray interrupt
> 71 error messages and many wdc:0:0:0: lost interrupt errors and
> freezing. If I place "MFP->mf_iprb = (u_int8_t)~IB_DINT;" after wdcintr() call
> behaviour is just like with current atari/dev/wdc_mb.c (kernel prints lost
> interrupt error messages as early as I mount partition from ATA drive)... I'm
> wondering why this happens? So it looks that handling MFP->mf_iprb in
> wdr_mb_intr() is not enough ?
atari/intr.c:intr_dispatch() function calls all established interrupt
handlers, so maybe we should not clear the interrupt register unless
it's actually processed in that handler.
(though I don't know about MFP interrupt registers on atari)
How about to handle MFP register only if wdcintr() returns non zero?
(Though this might cause a race condition if other DMA interrupts occur
during wdcintr(). If IB_DINT is also shared among dma and wdc,
maybe we should prepare special establish and dispatch functions for it)
static int
wdc_mb_intr(void *arg, int sr)
{
int rv;
rv = wdcintr(arg);
if (rv != 0)
MFP->mf_iprb = (u_int8_t)~IB_DINT;
return rv;
}
---
Izumi Tsutsui
Home |
Main Index |
Thread Index |
Old Index