Merge tag 'pinctrl-v3.19-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw...
[cascardo/linux.git] / drivers / scsi / atari_NCR5380.c
index 590035f..6daed6b 100644 (file)
  * possible) function may be used.
  */
 
-static struct Scsi_Host *first_instance = NULL;
-static struct scsi_host_template *the_template = NULL;
-
 /* Macros ease life... :-) */
 #define        SETUP_HOSTDATA(in)                              \
     struct NCR5380_hostdata *hostdata =                        \
@@ -595,32 +592,19 @@ static void NCR5380_print_phase(struct Scsi_Host *instance)
 #include <linux/workqueue.h>
 #include <linux/interrupt.h>
 
-static volatile int main_running;
-static DECLARE_WORK(NCR5380_tqueue, NCR5380_main);
-
-static inline void queue_main(void)
+static inline void queue_main(struct NCR5380_hostdata *hostdata)
 {
-       if (!main_running) {
+       if (!hostdata->main_running) {
                /* If in interrupt and NCR5380_main() not already running,
                   queue it on the 'immediate' task queue, to be processed
                   immediately after the current interrupt processing has
                   finished. */
-               schedule_work(&NCR5380_tqueue);
+               schedule_work(&hostdata->main_task);
        }
        /* else: nothing to do: the running NCR5380_main() will pick up
           any newly queued command. */
 }
 
-
-static inline void NCR5380_all_init(void)
-{
-       static int done = 0;
-       if (!done) {
-               dprintk(NDEBUG_INIT, "scsi : NCR5380_all_init()\n");
-               done = 1;
-       }
-}
-
 /**
  * NCR58380_info - report driver and host information
  * @instance: relevant scsi host instance
@@ -703,7 +687,7 @@ static void NCR5380_print_status(struct Scsi_Host *instance)
 
        local_irq_save(flags);
        printk("NCR5380: coroutine is%s running.\n",
-               main_running ? "" : "n't");
+               hostdata->main_running ? "" : "n't");
        if (!hostdata->connected)
                printk("scsi%d: no currently connected command\n", HOSTNO);
        else
@@ -746,7 +730,7 @@ static int __maybe_unused NCR5380_show_info(struct seq_file *m,
 
        local_irq_save(flags);
        seq_printf(m, "NCR5380: coroutine is%s running.\n",
-               main_running ? "" : "n't");
+               hostdata->main_running ? "" : "n't");
        if (!hostdata->connected)
                seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO);
        else
@@ -783,8 +767,7 @@ static int __init NCR5380_init(struct Scsi_Host *instance, int flags)
        int i;
        SETUP_HOSTDATA(instance);
 
-       NCR5380_all_init();
-
+       hostdata->host = instance;
        hostdata->aborted = 0;
        hostdata->id_mask = 1 << instance->this_id;
        hostdata->id_higher_mask = 0;
@@ -805,10 +788,7 @@ static int __init NCR5380_init(struct Scsi_Host *instance, int flags)
        hostdata->disconnected_queue = NULL;
        hostdata->flags = flags;
 
-       if (!the_template) {
-               the_template = instance->hostt;
-               first_instance = instance;
-       }
+       INIT_WORK(&hostdata->main_task, NCR5380_main);
 
        prepare_info(instance);
 
@@ -829,7 +809,9 @@ static int __init NCR5380_init(struct Scsi_Host *instance, int flags)
 
 static void NCR5380_exit(struct Scsi_Host *instance)
 {
-       cancel_work_sync(&NCR5380_tqueue);
+       struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+       cancel_work_sync(&hostdata->main_task);
 }
 
 /**
@@ -924,9 +906,9 @@ static int NCR5380_queue_command(struct Scsi_Host *instance,
         * unconditionally, because it cannot be already running.
         */
        if (in_interrupt() || irqs_disabled())
-               queue_main();
+               queue_main(hostdata);
        else
-               NCR5380_main(NULL);
+               NCR5380_main(&hostdata->main_task);
        return 0;
 }
 
@@ -955,9 +937,10 @@ static inline void maybe_release_dma_irq(struct Scsi_Host *instance)
 
 static void NCR5380_main(struct work_struct *work)
 {
+       struct NCR5380_hostdata *hostdata =
+               container_of(work, struct NCR5380_hostdata, main_task);
+       struct Scsi_Host *instance = hostdata->host;
        struct scsi_cmnd *tmp, *prev;
-       struct Scsi_Host *instance = first_instance;
-       struct NCR5380_hostdata *hostdata = HOSTDATA(instance);
        int done;
        unsigned long flags;
 
@@ -982,9 +965,9 @@ static void NCR5380_main(struct work_struct *work)
           'main_running' is set here, and queues/executes main via the
           task queue, it doesn't do any harm, just this instance of main
           won't find any work left to do. */
-       if (main_running)
+       if (hostdata->main_running)
                return;
-       main_running = 1;
+       hostdata->main_running = 1;
 
        local_save_flags(flags);
        do {
@@ -1103,7 +1086,7 @@ static void NCR5380_main(struct work_struct *work)
        /* Better allow ints _after_ 'main_running' has been cleared, else
           an interrupt could believe we'll pick up the work it left for
           us, but we won't see it anymore here... */
-       main_running = 0;
+       hostdata->main_running = 0;
        local_irq_restore(flags);
 }
 
@@ -1122,7 +1105,7 @@ static void NCR5380_main(struct work_struct *work)
 static void NCR5380_dma_complete(struct Scsi_Host *instance)
 {
        SETUP_HOSTDATA(instance);
-       int transfered;
+       int transferred;
        unsigned char **data;
        volatile int *count;
        int saved_data = 0, overrun = 0;
@@ -1174,13 +1157,13 @@ static void NCR5380_dma_complete(struct Scsi_Host *instance)
        NCR5380_write(MODE_REG, MR_BASE);
        NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
 
-       transfered = hostdata->dma_len - NCR5380_dma_residual(instance);
+       transferred = hostdata->dma_len - NCR5380_dma_residual(instance);
        hostdata->dma_len = 0;
 
        data = (unsigned char **)&hostdata->connected->SCp.ptr;
        count = &hostdata->connected->SCp.this_residual;
-       *data += transfered;
-       *count -= transfered;
+       *data += transferred;
+       *count -= transferred;
 
        if (hostdata->read_overruns) {
                int cnt, toPIO;
@@ -1215,7 +1198,7 @@ static void NCR5380_dma_complete(struct Scsi_Host *instance)
 
 static irqreturn_t NCR5380_intr(int irq, void *dev_id)
 {
-       struct Scsi_Host *instance = first_instance;
+       struct Scsi_Host *instance = dev_id;
        int done = 1, handled = 0;
        unsigned char basr;
 
@@ -1287,7 +1270,7 @@ static irqreturn_t NCR5380_intr(int irq, void *dev_id)
        if (!done) {
                dprintk(NDEBUG_INTR, "scsi%d: in int routine, calling main\n", HOSTNO);
                /* Put a call to NCR5380_main() on the queue... */
-               queue_main();
+               queue_main(shost_priv(instance));
        }
        return IRQ_RETVAL(handled);
 }
@@ -1767,7 +1750,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance,
  * Returns : 0 on success, -1 on failure.
  */
 
-static int do_abort(struct Scsi_Host *host)
+static int do_abort(struct Scsi_Host *instance)
 {
        unsigned char tmp, *msgptr, phase;
        int len;
@@ -1802,7 +1785,7 @@ static int do_abort(struct Scsi_Host *host)
        msgptr = &tmp;
        len = 1;
        phase = PHASE_MSGOUT;
-       NCR5380_transfer_pio(host, &phase, &len, &msgptr);
+       NCR5380_transfer_pio(instance, &phase, &len, &msgptr);
 
        /*
         * If we got here, and the command completed successfully,
@@ -2893,9 +2876,6 @@ static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
        struct NCR5380_hostdata *hostdata = shost_priv(instance);
        int i;
        unsigned long flags;
-#if defined(RESET_RUN_DONE)
-       struct scsi_cmnd *connected, *disconnected_queue;
-#endif
 
        NCR5380_print_status(instance);
 
@@ -2914,89 +2894,6 @@ static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
         * through anymore ... */
        (void)NCR5380_read(RESET_PARITY_INTERRUPT_REG);
 
-       /* MSch 20140115 - looking at the generic NCR5380 driver, all of this
-        * should go.
-        * Catch-22: if we don't clear all queues, the SCSI driver lock will
-        * not be reset by atari_scsi_reset()!
-        */
-
-#if defined(RESET_RUN_DONE)
-       /* XXX Should now be done by midlevel code, but it's broken XXX */
-       /* XXX see below                                            XXX */
-
-       /* MSch: old-style reset: actually abort all command processing here */
-
-       /* After the reset, there are no more connected or disconnected commands
-        * and no busy units; to avoid problems with re-inserting the commands
-        * into the issue_queue (via scsi_done()), the aborted commands are
-        * remembered in local variables first.
-        */
-       local_irq_save(flags);
-       connected = (struct scsi_cmnd *)hostdata->connected;
-       hostdata->connected = NULL;
-       disconnected_queue = (struct scsi_cmnd *)hostdata->disconnected_queue;
-       hostdata->disconnected_queue = NULL;
-#ifdef SUPPORT_TAGS
-       free_all_tags();
-#endif
-       for (i = 0; i < 8; ++i)
-               hostdata->busy[i] = 0;
-#ifdef REAL_DMA
-       hostdata->dma_len = 0;
-#endif
-       local_irq_restore(flags);
-
-       /* In order to tell the mid-level code which commands were aborted,
-        * set the command status to DID_RESET and call scsi_done() !!!
-        * This ultimately aborts processing of these commands in the mid-level.
-        */
-
-       if ((cmd = connected)) {
-               dprintk(NDEBUG_ABORT, "scsi%d: reset aborted a connected command\n", H_NO(cmd));
-               cmd->result = (cmd->result & 0xffff) | (DID_RESET << 16);
-               cmd->scsi_done(cmd);
-       }
-
-       for (i = 0; (cmd = disconnected_queue); ++i) {
-               disconnected_queue = NEXT(cmd);
-               SET_NEXT(cmd, NULL);
-               cmd->result = (cmd->result & 0xffff) | (DID_RESET << 16);
-               cmd->scsi_done(cmd);
-       }
-       if (i > 0)
-               dprintk(NDEBUG_ABORT, "scsi: reset aborted %d disconnected command(s)\n", i);
-
-       /* The Falcon lock should be released after a reset...
-        */
-       /* ++guenther: moved to atari_scsi_reset(), to prevent a race between
-        * unlocking and enabling dma interrupt.
-        */
-/*     falcon_release_lock_if_possible( hostdata );*/
-
-       /* since all commands have been explicitly terminated, we need to tell
-        * the midlevel code that the reset was SUCCESSFUL, and there is no
-        * need to 'wake up' the commands by a request_sense
-        */
-       return SUCCESS;
-#else /* 1 */
-
-       /* MSch: new-style reset handling: let the mid-level do what it can */
-
-       /* ++guenther: MID-LEVEL IS STILL BROKEN.
-        * Mid-level is supposed to requeue all commands that were active on the
-        * various low-level queues. In fact it does this, but that's not enough
-        * because all these commands are subject to timeout. And if a timeout
-        * happens for any removed command, *_abort() is called but all queues
-        * are now empty. Abort then gives up the falcon lock, which is fatal,
-        * since the mid-level will queue more commands and must have the lock
-        * (it's all happening inside timer interrupt handler!!).
-        * Even worse, abort will return NOT_RUNNING for all those commands not
-        * on any queue, so they won't be retried ...
-        *
-        * Conclusion: either scsi.c disables timeout for all resetted commands
-        * immediately, or we lose!  As of linux-2.0.20 it doesn't.
-        */
-
        /* After the reset, there are no more connected or disconnected commands
         * and no busy units; so clear the low-level status here to avoid
         * conflicts when the mid-level code tries to wake up the affected
@@ -3026,7 +2923,5 @@ static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
        maybe_release_dma_irq(instance);
        local_irq_restore(flags);
 
-       /* we did no complete reset of all commands, so a wakeup is required */
        return SUCCESS;
-#endif /* 1 */
 }