ncr5380: Move static PDMA spin counters to host data
authorFinn Thain <fthain@telegraphics.com.au>
Wed, 12 Nov 2014 05:11:59 +0000 (16:11 +1100)
committerChristoph Hellwig <hch@lst.de>
Thu, 20 Nov 2014 08:11:09 +0000 (09:11 +0100)
Static variables from dtc.c and pas16.c should not appear in the core
NCR5380.c driver. Aside from being a layering issue this worsens the
divergence between the three core driver variants (atari_NCR5380.c and
sun3_NCR5380.c don't support PSEUDO_DMA) and it can mean multiple hosts
share the same counters.

Fix this by making the pseudo DMA spin counters in the core more generic.
This also avoids the abuse of the {DTC,PAS16}_PUBLIC_RELEASE macros, so
they can be removed.

oak.c doesn't use PDMA and hence it doesn't use the counters and hence it
needs no write_info() method. Remove it.

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Reviewed-by: Hannes Reinecke <hare@suse.de>
Tested-by: Michael Schmitz <schmitzmic@gmail.com>
Signed-off-by: Christoph Hellwig <hch@lst.de>
drivers/scsi/NCR5380.c
drivers/scsi/NCR5380.h
drivers/scsi/arm/oak.c
drivers/scsi/dtc.c
drivers/scsi/pas16.c

index f1792bb80e70a39b3f34473dd0140e6f5cc35748..77e8908f644e83a5bde6aeebcc5bc730353e82c8 100644 (file)
@@ -692,6 +692,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]
@@ -709,14 +710,13 @@ 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)
@@ -751,11 +751,9 @@ static int __maybe_unused NCR5380_show_info(struct seq_file *m,
        SPRINTF("PAS16 release=%d", PAS16_PUBLIC_RELEASE);
 #endif
 
-#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)
index dc37da49656bf06b121548d399b093ae13986479..6bd90eef4460c9e208c51aae14ed14df52e6c139 100644 (file)
@@ -274,6 +274,10 @@ struct NCR5380_hostdata {
        struct delayed_work coroutine;          /* our co-routine */
        struct scsi_eh_save ses;
        char info[256];
+#ifdef PSEUDO_DMA
+       unsigned spin_max_r;
+       unsigned spin_max_w;
+#endif
 };
 
 #ifdef __KERNEL__
index a5ef3f79a2fdeaa67ac6e2089a4f5d30adce278a..840a53dc556eb862f0c49a574c146da61b8a1812 100644 (file)
@@ -31,7 +31,6 @@
 #define NCR5380_queue_command          oakscsi_queue_command
 #define NCR5380_info                   oakscsi_info
 #define NCR5380_show_info              oakscsi_show_info
-#define NCR5380_write_info             oakscsi_write_info
 
 #define NCR5380_implementation_fields  \
        void __iomem *base
@@ -108,7 +107,6 @@ printk("reading %p len %d\n", addr, len);
 static struct scsi_host_template oakscsi_template = {
        .module                 = THIS_MODULE,
        .show_info              = oakscsi_show_info,
-       .write_info             = oakscsi_write_info,
        .name                   = "Oak 16-bit SCSI",
        .info                   = oakscsi_info,
        .queuecommand           = oakscsi_queue_command,
index 2dacf2833b64d12f61786bd78b40b4ff5185d098..62b8de67f65fba2e192fbe6314c6224c8ad8c648 100644 (file)
@@ -332,13 +332,11 @@ static int dtc_biosparam(struct scsi_device *sdev, struct block_device *dev,
  *     timeout.
 */
 
-static int dtc_maxi = 0;
-static int dtc_wmaxi = 0;
-
 static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, int len)
 {
        unsigned char *d = dst;
        int i;                  /* For counting time spent in the poll-loop */
+       struct NCR5380_hostdata *hostdata = shost_priv(instance);
        NCR5380_local_declare();
        NCR5380_setup(instance);
 
@@ -369,8 +367,8 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst,
        NCR5380_write(MODE_REG, 0);     /* Clear the operating mode */
        rtrc(0);
        NCR5380_read(RESET_PARITY_INTERRUPT_REG);
-       if (i > dtc_maxi)
-               dtc_maxi = i;
+       if (i > hostdata->spin_max_r)
+               hostdata->spin_max_r = i;
        return (0);
 }
 
@@ -390,6 +388,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst,
 static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, int len)
 {
        int i;
+       struct NCR5380_hostdata *hostdata = shost_priv(instance);
        NCR5380_local_declare();
        NCR5380_setup(instance);
 
@@ -422,8 +421,8 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,
        /* Check for parity error here. fixme. */
        NCR5380_write(MODE_REG, 0);     /* Clear the operating mode */
        rtrc(0);
-       if (i > dtc_wmaxi)
-               dtc_wmaxi = i;
+       if (i > hostdata->spin_max_w)
+               hostdata->spin_max_w = i;
        return (0);
 }
 
index 51766895e90e3b622959cd9ec4e71c92857b98d4..7994b52754317c6921ec00ee5f54995a1292b9b0 100644 (file)
@@ -88,8 +88,6 @@
 #include "NCR5380.h"
 
 
-static int pas_maxi = 0;
-static int pas_wmaxi = 0;
 static unsigned short pas16_addr = 0;
 static int pas16_irq = 0;
  
@@ -502,6 +500,7 @@ static inline int NCR5380_pread (struct Scsi_Host *instance, unsigned char *dst,
        P_DATA_REG_OFFSET);
     register int i = len;
     int ii = 0;
+    struct NCR5380_hostdata *hostdata = shost_priv(instance);
 
     while ( !(inb(instance->io_port + P_STATUS_REG_OFFSET) & P_ST_RDY) )
         ++ii;
@@ -514,8 +513,8 @@ static inline int NCR5380_pread (struct Scsi_Host *instance, unsigned char *dst,
            instance->host_no);
        return -1;
     }
-   if (ii > pas_maxi)
-      pas_maxi = ii;
+    if (ii > hostdata->spin_max_r)
+        hostdata->spin_max_r = ii;
     return 0;
 }
 
@@ -538,6 +537,7 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src
     register unsigned short reg = (instance->io_port + P_DATA_REG_OFFSET);
     register int i = len;
     int ii = 0;
+    struct NCR5380_hostdata *hostdata = shost_priv(instance);
 
     while ( !((inb(instance->io_port + P_STATUS_REG_OFFSET)) & P_ST_RDY) )
         ++ii;
@@ -550,8 +550,8 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src
            instance->host_no);
        return -1;
     }
-    if (ii > pas_maxi)
-        pas_wmaxi = ii;
+    if (ii > hostdata->spin_max_w)
+        hostdata->spin_max_w = ii;
     return 0;
 }