Commit 8d8601a7 authored by Finn Thain's avatar Finn Thain Committed by Martin K. Petersen

ncr5380: Use work_struct instead of delayed_work

Each host instance now has it's own work queue so the main() work item can
sleep when necessary. That means we can use a simple work item rather than
a delayed work item. This brings NCR5380.c closer to atari_NCR5380.c.
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>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 401e79fe
...@@ -697,7 +697,7 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags) ...@@ -697,7 +697,7 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
hostdata->issue_queue = NULL; hostdata->issue_queue = NULL;
hostdata->disconnected_queue = NULL; hostdata->disconnected_queue = NULL;
INIT_DELAYED_WORK(&hostdata->coroutine, NCR5380_main); INIT_WORK(&hostdata->main_task, NCR5380_main);
hostdata->work_q = alloc_workqueue("ncr5380_%d", hostdata->work_q = alloc_workqueue("ncr5380_%d",
WQ_UNBOUND | WQ_MEM_RECLAIM, WQ_UNBOUND | WQ_MEM_RECLAIM,
1, instance->host_no); 1, instance->host_no);
...@@ -797,7 +797,7 @@ static void NCR5380_exit(struct Scsi_Host *instance) ...@@ -797,7 +797,7 @@ static void NCR5380_exit(struct Scsi_Host *instance)
{ {
struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata; struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
cancel_delayed_work_sync(&hostdata->coroutine); cancel_work_sync(&hostdata->main_task);
destroy_workqueue(hostdata->work_q); destroy_workqueue(hostdata->work_q);
} }
...@@ -859,9 +859,8 @@ static int NCR5380_queue_command(struct Scsi_Host *instance, ...@@ -859,9 +859,8 @@ static int NCR5380_queue_command(struct Scsi_Host *instance,
dprintk(NDEBUG_QUEUES, "scsi%d : command added to %s of queue\n", instance->host_no, (cmd->cmnd[0] == REQUEST_SENSE) ? "head" : "tail"); dprintk(NDEBUG_QUEUES, "scsi%d : command added to %s of queue\n", instance->host_no, (cmd->cmnd[0] == REQUEST_SENSE) ? "head" : "tail");
/* Run the coroutine if it isn't already running. */
/* Kick off command processing */ /* Kick off command processing */
queue_delayed_work(hostdata->work_q, &hostdata->coroutine, 0); queue_work(hostdata->work_q, &hostdata->main_task);
return 0; return 0;
} }
...@@ -880,7 +879,7 @@ static int NCR5380_queue_command(struct Scsi_Host *instance, ...@@ -880,7 +879,7 @@ static int NCR5380_queue_command(struct Scsi_Host *instance,
static void NCR5380_main(struct work_struct *work) static void NCR5380_main(struct work_struct *work)
{ {
struct NCR5380_hostdata *hostdata = struct NCR5380_hostdata *hostdata =
container_of(work, struct NCR5380_hostdata, coroutine.work); container_of(work, struct NCR5380_hostdata, main_task);
struct Scsi_Host *instance = hostdata->host; struct Scsi_Host *instance = hostdata->host;
struct scsi_cmnd *tmp, *prev; struct scsi_cmnd *tmp, *prev;
int done; int done;
...@@ -1037,8 +1036,7 @@ static irqreturn_t NCR5380_intr(int dummy, void *dev_id) ...@@ -1037,8 +1036,7 @@ static irqreturn_t NCR5380_intr(int dummy, void *dev_id)
} /* if BASR_IRQ */ } /* if BASR_IRQ */
spin_unlock_irqrestore(instance->host_lock, flags); spin_unlock_irqrestore(instance->host_lock, flags);
if(!done) if(!done)
queue_delayed_work(hostdata->work_q, queue_work(hostdata->work_q, &hostdata->main_task);
&hostdata->coroutine, 0);
} while (!done); } while (!done);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
......
...@@ -256,7 +256,6 @@ struct NCR5380_hostdata { ...@@ -256,7 +256,6 @@ struct NCR5380_hostdata {
volatile struct scsi_cmnd *issue_queue; /* waiting to be issued */ volatile struct scsi_cmnd *issue_queue; /* waiting to be issued */
volatile struct scsi_cmnd *disconnected_queue; /* waiting for reconnect */ volatile struct scsi_cmnd *disconnected_queue; /* waiting for reconnect */
int flags; int flags;
struct delayed_work coroutine; /* our co-routine */
struct scsi_eh_save ses; struct scsi_eh_save ses;
char info[256]; char info[256];
int read_overruns; /* number of bytes to cut from a int read_overruns; /* number of bytes to cut from a
......
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