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