#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/module.h>
#include <asm/amigaints.h>
struct WD33C93_hostdata wh;
struct a2091_scsiregs *regs;
static irqreturn_t a2091_intr(int irq, void *data)
struct Scsi_Host *instance = data;
struct a2091_hostdata *hdata = shost_priv(instance);
unsigned int status = hdata->regs->ISTR;
if (!(status & (ISTR_INT_F | ISTR_INT_P)) || !(status & ISTR_INTS))
spin_lock_irqsave(instance->host_lock, flags);
spin_unlock_irqrestore(instance->host_lock, flags);
static int dma_setup(struct scsi_cmnd *cmd, int dir_in)
struct Scsi_Host *instance = cmd->device->host;
struct a2091_hostdata *hdata = shost_priv(instance);
struct WD33C93_hostdata *wh = &hdata->wh;
struct a2091_scsiregs *regs = hdata->regs;
unsigned short cntr = CNTR_PDMD | CNTR_INTEN;
unsigned long addr = virt_to_bus(cmd->SCp.ptr);
if (addr & A2091_XFER_MASK) {
wh->dma_bounce_len = (cmd->SCp.this_residual + 511) & ~0x1ff;
wh->dma_bounce_buffer = kmalloc(wh->dma_bounce_len,
if (!wh->dma_bounce_buffer) {
addr = virt_to_bus(wh->dma_bounce_buffer);
if (addr & A2091_XFER_MASK) {
kfree(wh->dma_bounce_buffer);
wh->dma_bounce_buffer = NULL;
memcpy(wh->dma_bounce_buffer, cmd->SCp.ptr,