• Finn Thain's avatar
    ncr5380: Standardize interrupt handling · cd400825
    Finn Thain authored
    Because interrupt handling is crucial to the core driver(s), all wrapper
    drivers need to agree on this code. This patch removes discrepancies.
    
    NCR5380_intr() in NCR5380.c has the following pointless loop that differs
    from the code in atari_NCR5380.c.
    
    	done = 1;
    	do {
    		/* ... */
    	} while (!done);
    
    The 'done' flag gets cleared when a reconnected command is to be processed
    from the work queue. But in NCR5380.c, the flag is also used to cause the
    interrupt conditions to be re-examined. Perhaps this was because
    NCR5380_reselect() was expected to cause another interrupt, or perhaps
    the remaining present interrupt conditions need to be handled after the
    NCR5380_reselect() call?
    
    Actually, both possibilities are bogus, as is the loop itself. It seems
    have been overlooked in the hit-and-miss removal of scsi host instance
    list iteration many years ago; see history/history.git commit 491447e1
    ("[PATCH] next NCR5380 updates") and commit 69e1a948 ("[PATCH] fix up
    NCR5380 private data"). See also my earlier patch, "Always retry
    arbitration and selection".
    
    The datasheet says, "IRQ can be reset simply by reading the Reset
    Parity/Interrupt Register". So don't treat the chip IRQ like a
    level-triggered interrupt. Of the conditions that set the IRQ flag,
    some are level-triggered and some are edge-triggered, which means IRQ
    itself must be edge-triggered.
    
    Some interrupt conditions are latched and some are not. Before clearing
    the chip IRQ flag, clear all state that may cause it to be raised. That
    means clearing the DMA Mode and Busy Monitor bits in the Mode Register
    and clearing the host ID in the Select Enable register.
    
    Also clean up some printk's and some comments. Keep atari_NCR5380.c and
    NCR5380.c in agreement.
    Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
    Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
    Tested-by: default avatarOndrej Zary <linux@rainbow-software.org>
    Tested-by: default avatarMichael Schmitz <schmitzmic@gmail.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    cd400825
atari_NCR5380.c 86.7 KB