Merge tag 'please-pull-morepstore' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / drivers / scsi / NCR5380.c
index 2bb4df0..36244d6 100644 (file)
@@ -11,8 +11,6 @@
  *      drew@colorado.edu
  *      +1 (303) 666-5836
  *
- * DISTRIBUTION RELEASE 6. 
- *
  * For more information, please consult 
  *
  * NCR 5380 Family
@@ -279,7 +277,7 @@ static void do_reset(struct Scsi_Host *host);
  *     Set up the internal fields in the SCSI command.
  */
 
-static __inline__ void initialize_SCp(Scsi_Cmnd * cmd)
+static inline void initialize_SCp(struct scsi_cmnd *cmd)
 {
        /* 
         * Initialize the Scsi Pointer field so that all of the commands in the 
@@ -610,47 +608,70 @@ static int __init __maybe_unused NCR5380_probe_irq(struct Scsi_Host *instance,
 }
 
 /**
- *     NCR58380_print_options  -       show options
- *     @instance: unused for now
+ *     NCR58380_info - report driver and host information
+ *     @instance: relevant scsi host instance
  *
- *     Called by probe code indicating the NCR5380 driver options that 
- *     were selected. At some point this will switch to runtime options
- *     read from the adapter in question
+ *     For use as the host template info() handler.
  *
  *     Locks: none
  */
 
-static void __init __maybe_unused
-NCR5380_print_options(struct Scsi_Host *instance)
+static const char *NCR5380_info(struct Scsi_Host *instance)
 {
-       printk(" generic options"
+       struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+       return hostdata->info;
+}
+
+static void prepare_info(struct Scsi_Host *instance)
+{
+       struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+       snprintf(hostdata->info, sizeof(hostdata->info),
+                "%s, io_port 0x%lx, n_io_port %d, "
+                "base 0x%lx, irq %d, "
+                "can_queue %d, cmd_per_lun %d, "
+                "sg_tablesize %d, this_id %d, "
+                "flags { %s%s%s}, "
+#if defined(USLEEP_POLL) && defined(USLEEP_WAITLONG)
+                "USLEEP_POLL %d, USLEEP_WAITLONG %d, "
+#endif
+                "options { %s} ",
+                instance->hostt->name, instance->io_port, instance->n_io_port,
+                instance->base, instance->irq,
+                instance->can_queue, instance->cmd_per_lun,
+                instance->sg_tablesize, instance->this_id,
+                hostdata->flags & FLAG_NCR53C400     ? "NCR53C400 "     : "",
+                hostdata->flags & FLAG_DTC3181E      ? "DTC3181E "      : "",
+                hostdata->flags & FLAG_NO_PSEUDO_DMA ? "NO_PSEUDO_DMA " : "",
+#if defined(USLEEP_POLL) && defined(USLEEP_WAITLONG)
+                USLEEP_POLL, USLEEP_WAITLONG,
+#endif
 #ifdef AUTOPROBE_IRQ
-              " AUTOPROBE_IRQ"
+                "AUTOPROBE_IRQ "
 #endif
 #ifdef DIFFERENTIAL
-              " DIFFERENTIAL"
+                "DIFFERENTIAL "
 #endif
 #ifdef REAL_DMA
-              " REAL DMA"
+                "REAL_DMA "
 #endif
 #ifdef REAL_DMA_POLL
-              " REAL DMA POLL"
+                "REAL_DMA_POLL "
 #endif
 #ifdef PARITY
-              " PARITY"
+                "PARITY "
 #endif
 #ifdef PSEUDO_DMA
-              " PSEUDO DMA"
+                "PSEUDO_DMA "
 #endif
 #ifdef UNSAFE
-              UNSAFE "
+                "UNSAFE "
 #endif
-           );
-       printk(" USLEEP_POLL=%d USLEEP_SLEEP=%d", USLEEP_POLL, USLEEP_SLEEP);
-       printk(" generic release=%d", NCR5380_PUBLIC_RELEASE);
-       if (((struct NCR5380_hostdata *) instance->hostdata)->flags & FLAG_NCR53C400) {
-               printk(" ncr53c400 release=%d", NCR53C400_PUBLIC_RELEASE);
-       }
+#ifdef NCR53C400
+                "NCR53C400 "
+#endif
+                "");
 }
 
 /**
@@ -669,6 +690,7 @@ static void NCR5380_print_status(struct Scsi_Host *instance)
        NCR5380_dprint_phase(NDEBUG_ANY, instance);
 }
 
+#ifdef PSEUDO_DMA
 /******************************************/
 /*
  * /proc/scsi/[dtc pas16 t128 generic]/[0-ASC_NUM_BOARD_SUPPORTED]
@@ -686,19 +708,18 @@ static void NCR5380_print_status(struct Scsi_Host *instance)
 static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance,
        char *buffer, int length)
 {
-#ifdef DTC_PUBLIC_RELEASE
-       dtc_wmaxi = dtc_maxi = 0;
-#endif
-#ifdef PAS16_PUBLIC_RELEASE
-       pas_wmaxi = pas_maxi = 0;
-#endif
-       return (-ENOSYS);       /* Currently this is a no-op */
+       struct NCR5380_hostdata *hostdata = shost_priv(instance);
+
+       hostdata->spin_max_r = 0;
+       hostdata->spin_max_w = 0;
+       return 0;
 }
+#endif
 
 #undef SPRINTF
 #define SPRINTF(args...) seq_printf(m, ## args)
 static
-void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m);
+void lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, struct seq_file *m);
 static
 void lprint_command(unsigned char *cmd, struct seq_file *m);
 static
@@ -708,56 +729,31 @@ static int __maybe_unused NCR5380_show_info(struct seq_file *m,
        struct Scsi_Host *instance)
 {
        struct NCR5380_hostdata *hostdata;
-       Scsi_Cmnd *ptr;
+       struct scsi_cmnd *ptr;
 
        hostdata = (struct NCR5380_hostdata *) instance->hostdata;
 
-       SPRINTF("NCR5380 core release=%d.   ", NCR5380_PUBLIC_RELEASE);
-       if (((struct NCR5380_hostdata *) instance->hostdata)->flags & FLAG_NCR53C400)
-               SPRINTF("ncr53c400 release=%d.  ", NCR53C400_PUBLIC_RELEASE);
-#ifdef DTC_PUBLIC_RELEASE
-       SPRINTF("DTC 3180/3280 release %d", DTC_PUBLIC_RELEASE);
-#endif
-#ifdef T128_PUBLIC_RELEASE
-       SPRINTF("T128 release %d", T128_PUBLIC_RELEASE);
-#endif
-#ifdef GENERIC_NCR5380_PUBLIC_RELEASE
-       SPRINTF("Generic5380 release %d", GENERIC_NCR5380_PUBLIC_RELEASE);
-#endif
-#ifdef PAS16_PUBLIC_RELEASE
-       SPRINTF("PAS16 release=%d", PAS16_PUBLIC_RELEASE);
-#endif
-
-       SPRINTF("\nBase Addr: 0x%05lX    ", (long) instance->base);
-       SPRINTF("io_port: %04x      ", (int) instance->io_port);
-       if (instance->irq == NO_IRQ)
-               SPRINTF("IRQ: None.\n");
-       else
-               SPRINTF("IRQ: %d.\n", instance->irq);
-
-#ifdef DTC_PUBLIC_RELEASE
-       SPRINTF("Highwater I/O busy_spin_counts -- write: %d  read: %d\n", dtc_wmaxi, dtc_maxi);
-#endif
-#ifdef PAS16_PUBLIC_RELEASE
-       SPRINTF("Highwater I/O busy_spin_counts -- write: %d  read: %d\n", pas_wmaxi, pas_maxi);
+#ifdef PSEUDO_DMA
+       SPRINTF("Highwater I/O busy spin counts: write %d, read %d\n",
+               hostdata->spin_max_w, hostdata->spin_max_r);
 #endif
        spin_lock_irq(instance->host_lock);
        if (!hostdata->connected)
                SPRINTF("scsi%d: no currently connected command\n", instance->host_no);
        else
-               lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m);
+               lprint_Scsi_Cmnd((struct scsi_cmnd *) hostdata->connected, m);
        SPRINTF("scsi%d: issue_queue\n", instance->host_no);
-       for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
+       for (ptr = (struct scsi_cmnd *) hostdata->issue_queue; ptr; ptr = (struct scsi_cmnd *) ptr->host_scribble)
                lprint_Scsi_Cmnd(ptr, m);
 
        SPRINTF("scsi%d: disconnected_queue\n", instance->host_no);
-       for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
+       for (ptr = (struct scsi_cmnd *) hostdata->disconnected_queue; ptr; ptr = (struct scsi_cmnd *) ptr->host_scribble)
                lprint_Scsi_Cmnd(ptr, m);
        spin_unlock_irq(instance->host_lock);
        return 0;
 }
 
-static void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m)
+static void lprint_Scsi_Cmnd(struct scsi_cmnd *cmd, struct seq_file *m)
 {
        SPRINTF("scsi%d : destination target %d, lun %llu\n", cmd->device->host->host_no, cmd->device->id, cmd->device->lun);
        SPRINTF("        command = ");
@@ -842,6 +838,8 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)
        hostdata->host = instance;
        hostdata->time_expires = 0;
 
+       prepare_info(instance);
+
        NCR5380_write(INITIATOR_COMMAND_REG, ICR_BASE);
        NCR5380_write(MODE_REG, MR_BASE);
        NCR5380_write(TARGET_COMMAND_REG, 0);
@@ -914,11 +912,11 @@ static void NCR5380_exit(struct Scsi_Host *instance)
  *     Locks: host lock taken by caller
  */
 
-static int NCR5380_queue_command_lck(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *))
+static int NCR5380_queue_command_lck(struct scsi_cmnd *cmd, void (*done) (struct scsi_cmnd *))
 {
        struct Scsi_Host *instance = cmd->device->host;
        struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
-       Scsi_Cmnd *tmp;
+       struct scsi_cmnd *tmp;
 
 #if (NDEBUG & NDEBUG_NO_WRITE)
        switch (cmd->cmnd[0]) {
@@ -952,7 +950,7 @@ static int NCR5380_queue_command_lck(Scsi_Cmnd * cmd, void (*done) (Scsi_Cmnd *)
                cmd->host_scribble = (unsigned char *) hostdata->issue_queue;
                hostdata->issue_queue = cmd;
        } else {
-               for (tmp = (Scsi_Cmnd *) hostdata->issue_queue; tmp->host_scribble; tmp = (Scsi_Cmnd *) tmp->host_scribble);
+               for (tmp = (struct scsi_cmnd *) hostdata->issue_queue; tmp->host_scribble; tmp = (struct scsi_cmnd *) tmp->host_scribble);
                LIST(cmd, tmp);
                tmp->host_scribble = (unsigned char *) cmd;
        }
@@ -983,7 +981,7 @@ static void NCR5380_main(struct work_struct *work)
        struct NCR5380_hostdata *hostdata =
                container_of(work, struct NCR5380_hostdata, coroutine.work);
        struct Scsi_Host *instance = hostdata->host;
-       Scsi_Cmnd *tmp, *prev;
+       struct scsi_cmnd *tmp, *prev;
        int done;
        
        spin_lock_irq(instance->host_lock);
@@ -996,7 +994,7 @@ static void NCR5380_main(struct work_struct *work)
                         * Search through the issue_queue for a command destined
                         * for a target that's not busy.
                         */
-                       for (tmp = (Scsi_Cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble) 
+                       for (tmp = (struct scsi_cmnd *) hostdata->issue_queue, prev = NULL; tmp; prev = tmp, tmp = (struct scsi_cmnd *) tmp->host_scribble)
                        {
                                if (prev != tmp)
                                    dprintk(NDEBUG_LISTS, "MAIN tmp=%p   target=%d   busy=%d lun=%llu\n", tmp, tmp->device->id, hostdata->busy[tmp->device->id], tmp->device->lun);
@@ -1008,7 +1006,7 @@ static void NCR5380_main(struct work_struct *work)
                                                prev->host_scribble = tmp->host_scribble;
                                        } else {
                                                REMOVE(-1, hostdata->issue_queue, tmp, tmp->host_scribble);
-                                               hostdata->issue_queue = (Scsi_Cmnd *) tmp->host_scribble;
+                                               hostdata->issue_queue = (struct scsi_cmnd *) tmp->host_scribble;
                                        }
                                        tmp->host_scribble = NULL;
 
@@ -1055,7 +1053,7 @@ static void NCR5380_main(struct work_struct *work)
                        /* exited locked */
                }       /* if (!hostdata->connected) */
                if (hostdata->selecting) {
-                       tmp = (Scsi_Cmnd *) hostdata->selecting;
+                       tmp = (struct scsi_cmnd *) hostdata->selecting;
                        /* Selection will drop and retake the lock */
                        if (!NCR5380_select(instance, tmp)) {
                                /* Ok ?? */
@@ -1177,7 +1175,8 @@ static irqreturn_t NCR5380_intr(int dummy, void *dev_id)
 #endif 
 
 /* 
- * Function : int NCR5380_select (struct Scsi_Host *instance, Scsi_Cmnd *cmd)
+ * Function : int NCR5380_select(struct Scsi_Host *instance,
+ *                               struct scsi_cmnd *cmd)
  *
  * Purpose : establishes I_T_L or I_T_L_Q nexus for new or existing command,
  *      including ARBITRATION, SELECTION, and initial message out for 
@@ -1206,7 +1205,7 @@ static irqreturn_t NCR5380_intr(int dummy, void *dev_id)
  *     Locks: caller holds hostdata lock in IRQ mode
  */
  
-static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd *cmd)
+static int NCR5380_select(struct Scsi_Host *instance, struct scsi_cmnd *cmd)
 {
        NCR5380_local_declare();
        struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
@@ -2013,7 +2012,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
 #endif
        unsigned char *data;
        unsigned char phase, tmp, extended_msg[10], old_phase = 0xff;
-       Scsi_Cmnd *cmd = (Scsi_Cmnd *) hostdata->connected;
+       struct scsi_cmnd *cmd = (struct scsi_cmnd *) hostdata->connected;
        /* RvC: we need to set the end of the polling time */
        unsigned long poll_time = jiffies + USLEEP_POLL;
 
@@ -2203,7 +2202,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
                                                LIST(cmd, hostdata->issue_queue);
                                                cmd->host_scribble = (unsigned char *)
                                                    hostdata->issue_queue;
-                                               hostdata->issue_queue = (Scsi_Cmnd *) cmd;
+                                               hostdata->issue_queue = (struct scsi_cmnd *) cmd;
                                                dprintk(NDEBUG_QUEUES, "scsi%d : REQUEST SENSE added to head of issue queue\n", instance->host_no);
                                        } else {
                                                cmd->scsi_done(cmd);
@@ -2400,7 +2399,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) {
  * Function : void NCR5380_reselect (struct Scsi_Host *instance)
  *
  * Purpose : does reselection, initializing the instance->connected 
- *      field to point to the Scsi_Cmnd for which the I_T_L or I_T_L_Q 
+ *      field to point to the scsi_cmnd for which the I_T_L or I_T_L_Q
  *      nexus has been reestablished,
  *      
  * Inputs : instance - this instance of the NCR5380.
@@ -2417,7 +2416,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
        int len;
        unsigned char msg[3];
        unsigned char *data;
-       Scsi_Cmnd *tmp = NULL, *prev;
+       struct scsi_cmnd *tmp = NULL, *prev;
        int abort = 0;
        NCR5380_setup(instance);
 
@@ -2483,7 +2482,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
                 */
 
 
-               for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue, prev = NULL; tmp; prev = tmp, tmp = (Scsi_Cmnd *) tmp->host_scribble)
+               for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue, prev = NULL; tmp; prev = tmp, tmp = (struct scsi_cmnd *) tmp->host_scribble)
                        if ((target_mask == (1 << tmp->device->id)) && (lun == (u8)tmp->device->lun)
                            ) {
                                if (prev) {
@@ -2491,7 +2490,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
                                        prev->host_scribble = tmp->host_scribble;
                                } else {
                                        REMOVE(-1, hostdata->disconnected_queue, tmp, tmp->host_scribble);
-                                       hostdata->disconnected_queue = (Scsi_Cmnd *) tmp->host_scribble;
+                                       hostdata->disconnected_queue = (struct scsi_cmnd *) tmp->host_scribble;
                                }
                                tmp->host_scribble = NULL;
                                break;
@@ -2522,7 +2521,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance) {
  *
  * Inputs : instance - this instance of the NCR5380.
  *
- * Returns : pointer to the Scsi_Cmnd structure for which the I_T_L
+ * Returns : pointer to the scsi_cmnd structure for which the I_T_L
  *      nexus has been reestablished, on failure NULL is returned.
  */
 
@@ -2564,11 +2563,11 @@ static void NCR5380_dma_complete(NCR5380_instance * instance) {
 #endif                         /* def REAL_DMA */
 
 /*
- * Function : int NCR5380_abort (Scsi_Cmnd *cmd)
+ * Function : int NCR5380_abort (struct scsi_cmnd *cmd)
  *
  * Purpose : abort a command
  *
- * Inputs : cmd - the Scsi_Cmnd to abort, code - code to set the
+ * Inputs : cmd - the scsi_cmnd to abort, code - code to set the
  *      host byte of the result field to, if zero DID_ABORTED is
  *      used.
  *
@@ -2582,11 +2581,12 @@ static void NCR5380_dma_complete(NCR5380_instance * instance) {
  * Locks: host lock taken by caller
  */
 
-static int NCR5380_abort(Scsi_Cmnd * cmd) {
+static int NCR5380_abort(struct scsi_cmnd *cmd)
+{
        NCR5380_local_declare();
        struct Scsi_Host *instance = cmd->device->host;
        struct NCR5380_hostdata *hostdata = (struct NCR5380_hostdata *) instance->hostdata;
-       Scsi_Cmnd *tmp, **prev;
+       struct scsi_cmnd *tmp, **prev;
 
        scmd_printk(KERN_WARNING, cmd, "aborting command\n");
 
@@ -2634,10 +2634,10 @@ static int NCR5380_abort(Scsi_Cmnd * cmd) {
  */
  
        dprintk(NDEBUG_ABORT, "scsi%d : abort going into loop.\n", instance->host_no);
-       for (prev = (Scsi_Cmnd **) & (hostdata->issue_queue), tmp = (Scsi_Cmnd *) hostdata->issue_queue; tmp; prev = (Scsi_Cmnd **) & (tmp->host_scribble), tmp = (Scsi_Cmnd *) tmp->host_scribble)
+       for (prev = (struct scsi_cmnd **) &(hostdata->issue_queue), tmp = (struct scsi_cmnd *) hostdata->issue_queue; tmp; prev = (struct scsi_cmnd **) &(tmp->host_scribble), tmp = (struct scsi_cmnd *) tmp->host_scribble)
                if (cmd == tmp) {
                        REMOVE(5, *prev, tmp, tmp->host_scribble);
-                       (*prev) = (Scsi_Cmnd *) tmp->host_scribble;
+                       (*prev) = (struct scsi_cmnd *) tmp->host_scribble;
                        tmp->host_scribble = NULL;
                        tmp->result = DID_ABORT << 16;
                        dprintk(NDEBUG_ABORT, "scsi%d : abort removed command from issue queue.\n", instance->host_no);
@@ -2690,7 +2690,7 @@ static int NCR5380_abort(Scsi_Cmnd * cmd) {
  * it from the disconnected queue.
  */
 
-       for (tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp; tmp = (Scsi_Cmnd *) tmp->host_scribble)
+       for (tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp; tmp = (struct scsi_cmnd *) tmp->host_scribble)
                if (cmd == tmp) {
                        dprintk(NDEBUG_ABORT, "scsi%d : aborting disconnected command.\n", instance->host_no);
 
@@ -2700,10 +2700,10 @@ static int NCR5380_abort(Scsi_Cmnd * cmd) {
 
                        do_abort(instance);
 
-                       for (prev = (Scsi_Cmnd **) & (hostdata->disconnected_queue), tmp = (Scsi_Cmnd *) hostdata->disconnected_queue; tmp; prev = (Scsi_Cmnd **) & (tmp->host_scribble), tmp = (Scsi_Cmnd *) tmp->host_scribble)
+                       for (prev = (struct scsi_cmnd **) &(hostdata->disconnected_queue), tmp = (struct scsi_cmnd *) hostdata->disconnected_queue; tmp; prev = (struct scsi_cmnd **) &(tmp->host_scribble), tmp = (struct scsi_cmnd *) tmp->host_scribble)
                                if (cmd == tmp) {
                                        REMOVE(5, *prev, tmp, tmp->host_scribble);
-                                       *prev = (Scsi_Cmnd *) tmp->host_scribble;
+                                       *prev = (struct scsi_cmnd *) tmp->host_scribble;
                                        tmp->host_scribble = NULL;
                                        tmp->result = DID_ABORT << 16;
                                        tmp->scsi_done(tmp);
@@ -2726,7 +2726,7 @@ static int NCR5380_abort(Scsi_Cmnd * cmd) {
 
 
 /* 
- * Function : int NCR5380_bus_reset (Scsi_Cmnd *cmd)
+ * Function : int NCR5380_bus_reset (struct scsi_cmnd *cmd)
  * 
  * Purpose : reset the SCSI bus.
  *
@@ -2735,7 +2735,7 @@ static int NCR5380_abort(Scsi_Cmnd * cmd) {
  * Locks: host lock taken by caller
  */
 
-static int NCR5380_bus_reset(Scsi_Cmnd * cmd)
+static int NCR5380_bus_reset(struct scsi_cmnd *cmd)
 {
        struct Scsi_Host *instance = cmd->device->host;