Commit 52d3e561 authored by Finn Thain's avatar Finn Thain Committed by Martin K. Petersen

atari_scsi: Adopt NCR5380.c core driver

Add support for the Atari ST DMA chip to the NCR5380.c core driver.
This code is copied from atari_NCR5380.c.
Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Tested-by: default avatarMichael Schmitz <schmitzmic@gmail.com>
Tested-by: default avatarOndrej Zary <linux@rainbow-software.org>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 8053b0ee
...@@ -29,6 +29,8 @@ ...@@ -29,6 +29,8 @@
* Ronald van Cuijlenborg, Alan Cox and others. * Ronald van Cuijlenborg, Alan Cox and others.
*/ */
/* Ported to Atari by Roman Hodek and others. */
/* /*
* Further development / testing that should be done : * Further development / testing that should be done :
* *
...@@ -141,6 +143,14 @@ ...@@ -141,6 +143,14 @@
#define NCR5380_io_delay(x) #define NCR5380_io_delay(x)
#endif #endif
#ifndef NCR5380_acquire_dma_irq
#define NCR5380_acquire_dma_irq(x) (1)
#endif
#ifndef NCR5380_release_dma_irq
#define NCR5380_release_dma_irq(x)
#endif
static int do_abort(struct Scsi_Host *); static int do_abort(struct Scsi_Host *);
static void do_reset(struct Scsi_Host *); static void do_reset(struct Scsi_Host *);
...@@ -658,6 +668,9 @@ static int NCR5380_queue_command(struct Scsi_Host *instance, ...@@ -658,6 +668,9 @@ static int NCR5380_queue_command(struct Scsi_Host *instance,
cmd->result = 0; cmd->result = 0;
if (!NCR5380_acquire_dma_irq(instance))
return SCSI_MLQUEUE_HOST_BUSY;
spin_lock_irqsave(&hostdata->lock, flags); spin_lock_irqsave(&hostdata->lock, flags);
/* /*
...@@ -682,6 +695,19 @@ static int NCR5380_queue_command(struct Scsi_Host *instance, ...@@ -682,6 +695,19 @@ static int NCR5380_queue_command(struct Scsi_Host *instance,
return 0; return 0;
} }
static inline void maybe_release_dma_irq(struct Scsi_Host *instance)
{
struct NCR5380_hostdata *hostdata = shost_priv(instance);
/* Caller does the locking needed to set & test these data atomically */
if (list_empty(&hostdata->disconnected) &&
list_empty(&hostdata->unissued) &&
list_empty(&hostdata->autosense) &&
!hostdata->connected &&
!hostdata->selecting)
NCR5380_release_dma_irq(instance);
}
/** /**
* dequeue_next_cmd - dequeue a command for processing * dequeue_next_cmd - dequeue a command for processing
* @instance: the scsi host instance * @instance: the scsi host instance
...@@ -783,6 +809,7 @@ static void NCR5380_main(struct work_struct *work) ...@@ -783,6 +809,7 @@ static void NCR5380_main(struct work_struct *work)
if (!NCR5380_select(instance, cmd)) { if (!NCR5380_select(instance, cmd)) {
dsprintk(NDEBUG_MAIN, instance, "main: select complete\n"); dsprintk(NDEBUG_MAIN, instance, "main: select complete\n");
maybe_release_dma_irq(instance);
} else { } else {
dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES, instance, dsprintk(NDEBUG_MAIN | NDEBUG_QUEUES, instance,
"main: select failed, returning %p to queue\n", cmd); "main: select failed, returning %p to queue\n", cmd);
...@@ -1828,6 +1855,8 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) ...@@ -1828,6 +1855,8 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
/* Enable reselect interrupts */ /* Enable reselect interrupts */
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
maybe_release_dma_irq(instance);
return; return;
case MESSAGE_REJECT: case MESSAGE_REJECT:
/* Accept message by clearing ACK */ /* Accept message by clearing ACK */
...@@ -1963,6 +1992,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) ...@@ -1963,6 +1992,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)
hostdata->connected = NULL; hostdata->connected = NULL;
cmd->result = DID_ERROR << 16; cmd->result = DID_ERROR << 16;
complete_cmd(instance, cmd); complete_cmd(instance, cmd);
maybe_release_dma_irq(instance);
NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask); NCR5380_write(SELECT_ENABLE_REG, hostdata->id_mask);
return; return;
} }
...@@ -2256,6 +2286,7 @@ static int NCR5380_abort(struct scsi_cmnd *cmd) ...@@ -2256,6 +2286,7 @@ static int NCR5380_abort(struct scsi_cmnd *cmd)
dsprintk(NDEBUG_ABORT, instance, "abort: successfully aborted %p\n", cmd); dsprintk(NDEBUG_ABORT, instance, "abort: successfully aborted %p\n", cmd);
queue_work(hostdata->work_q, &hostdata->main_task); queue_work(hostdata->work_q, &hostdata->main_task);
maybe_release_dma_irq(instance);
spin_unlock_irqrestore(&hostdata->lock, flags); spin_unlock_irqrestore(&hostdata->lock, flags);
return result; return result;
...@@ -2336,6 +2367,7 @@ static int NCR5380_bus_reset(struct scsi_cmnd *cmd) ...@@ -2336,6 +2367,7 @@ static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
hostdata->dma_len = 0; hostdata->dma_len = 0;
queue_work(hostdata->work_q, &hostdata->main_task); queue_work(hostdata->work_q, &hostdata->main_task);
maybe_release_dma_irq(instance);
spin_unlock_irqrestore(&hostdata->lock, flags); spin_unlock_irqrestore(&hostdata->lock, flags);
return SUCCESS; return SUCCESS;
......
...@@ -99,9 +99,9 @@ ...@@ -99,9 +99,9 @@
#define NCR5380_abort atari_scsi_abort #define NCR5380_abort atari_scsi_abort
#define NCR5380_info atari_scsi_info #define NCR5380_info atari_scsi_info
#define NCR5380_dma_read_setup(instance, data, count) \ #define NCR5380_dma_recv_setup(instance, data, count) \
atari_scsi_dma_setup(instance, data, count, 0) atari_scsi_dma_setup(instance, data, count, 0)
#define NCR5380_dma_write_setup(instance, data, count) \ #define NCR5380_dma_send_setup(instance, data, count) \
atari_scsi_dma_setup(instance, data, count, 1) atari_scsi_dma_setup(instance, data, count, 1)
#define NCR5380_dma_residual(instance) \ #define NCR5380_dma_residual(instance) \
atari_scsi_dma_residual(instance) atari_scsi_dma_residual(instance)
...@@ -715,7 +715,7 @@ static void atari_scsi_falcon_reg_write(unsigned char reg, unsigned char value) ...@@ -715,7 +715,7 @@ static void atari_scsi_falcon_reg_write(unsigned char reg, unsigned char value)
} }
#include "atari_NCR5380.c" #include "NCR5380.c"
static int atari_scsi_bus_reset(struct scsi_cmnd *cmd) static int atari_scsi_bus_reset(struct scsi_cmnd *cmd)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment