提交 a9c2dc43 编写于 作者: F Finn Thain 提交者: Christoph Hellwig

ncr5380: Move static PDMA spin counters to host data

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: NFinn Thain <fthain@telegraphics.com.au>
Reviewed-by: NHannes Reinecke <hare@suse.de>
Tested-by: NMichael Schmitz <schmitzmic@gmail.com>
Signed-off-by: NChristoph Hellwig <hch@lst.de>
上级 8c32513b
...@@ -692,6 +692,7 @@ static void NCR5380_print_status(struct Scsi_Host *instance) ...@@ -692,6 +692,7 @@ static void NCR5380_print_status(struct Scsi_Host *instance)
NCR5380_dprint_phase(NDEBUG_ANY, instance); NCR5380_dprint_phase(NDEBUG_ANY, instance);
} }
#ifdef PSEUDO_DMA
/******************************************/ /******************************************/
/* /*
* /proc/scsi/[dtc pas16 t128 generic]/[0-ASC_NUM_BOARD_SUPPORTED] * /proc/scsi/[dtc pas16 t128 generic]/[0-ASC_NUM_BOARD_SUPPORTED]
...@@ -709,14 +710,13 @@ static void NCR5380_print_status(struct Scsi_Host *instance) ...@@ -709,14 +710,13 @@ static void NCR5380_print_status(struct Scsi_Host *instance)
static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance, static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance,
char *buffer, int length) char *buffer, int length)
{ {
#ifdef DTC_PUBLIC_RELEASE struct NCR5380_hostdata *hostdata = shost_priv(instance);
dtc_wmaxi = dtc_maxi = 0;
#endif hostdata->spin_max_r = 0;
#ifdef PAS16_PUBLIC_RELEASE hostdata->spin_max_w = 0;
pas_wmaxi = pas_maxi = 0; return 0;
#endif
return (-ENOSYS); /* Currently this is a no-op */
} }
#endif
#undef SPRINTF #undef SPRINTF
#define SPRINTF(args...) seq_printf(m, ## args) #define SPRINTF(args...) seq_printf(m, ## args)
...@@ -751,11 +751,9 @@ static int __maybe_unused NCR5380_show_info(struct seq_file *m, ...@@ -751,11 +751,9 @@ static int __maybe_unused NCR5380_show_info(struct seq_file *m,
SPRINTF("PAS16 release=%d", PAS16_PUBLIC_RELEASE); SPRINTF("PAS16 release=%d", PAS16_PUBLIC_RELEASE);
#endif #endif
#ifdef DTC_PUBLIC_RELEASE #ifdef PSEUDO_DMA
SPRINTF("Highwater I/O busy_spin_counts -- write: %d read: %d\n", dtc_wmaxi, dtc_maxi); SPRINTF("Highwater I/O busy spin counts: write %d, read %d\n",
#endif hostdata->spin_max_w, hostdata->spin_max_r);
#ifdef PAS16_PUBLIC_RELEASE
SPRINTF("Highwater I/O busy_spin_counts -- write: %d read: %d\n", pas_wmaxi, pas_maxi);
#endif #endif
spin_lock_irq(instance->host_lock); spin_lock_irq(instance->host_lock);
if (!hostdata->connected) if (!hostdata->connected)
......
...@@ -274,6 +274,10 @@ struct NCR5380_hostdata { ...@@ -274,6 +274,10 @@ struct NCR5380_hostdata {
struct delayed_work coroutine; /* our co-routine */ struct delayed_work coroutine; /* our co-routine */
struct scsi_eh_save ses; struct scsi_eh_save ses;
char info[256]; char info[256];
#ifdef PSEUDO_DMA
unsigned spin_max_r;
unsigned spin_max_w;
#endif
}; };
#ifdef __KERNEL__ #ifdef __KERNEL__
......
...@@ -31,7 +31,6 @@ ...@@ -31,7 +31,6 @@
#define NCR5380_queue_command oakscsi_queue_command #define NCR5380_queue_command oakscsi_queue_command
#define NCR5380_info oakscsi_info #define NCR5380_info oakscsi_info
#define NCR5380_show_info oakscsi_show_info #define NCR5380_show_info oakscsi_show_info
#define NCR5380_write_info oakscsi_write_info
#define NCR5380_implementation_fields \ #define NCR5380_implementation_fields \
void __iomem *base void __iomem *base
...@@ -108,7 +107,6 @@ printk("reading %p len %d\n", addr, len); ...@@ -108,7 +107,6 @@ printk("reading %p len %d\n", addr, len);
static struct scsi_host_template oakscsi_template = { static struct scsi_host_template oakscsi_template = {
.module = THIS_MODULE, .module = THIS_MODULE,
.show_info = oakscsi_show_info, .show_info = oakscsi_show_info,
.write_info = oakscsi_write_info,
.name = "Oak 16-bit SCSI", .name = "Oak 16-bit SCSI",
.info = oakscsi_info, .info = oakscsi_info,
.queuecommand = oakscsi_queue_command, .queuecommand = oakscsi_queue_command,
......
...@@ -332,13 +332,11 @@ static int dtc_biosparam(struct scsi_device *sdev, struct block_device *dev, ...@@ -332,13 +332,11 @@ static int dtc_biosparam(struct scsi_device *sdev, struct block_device *dev,
* timeout. * 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) static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, int len)
{ {
unsigned char *d = dst; unsigned char *d = dst;
int i; /* For counting time spent in the poll-loop */ int i; /* For counting time spent in the poll-loop */
struct NCR5380_hostdata *hostdata = shost_priv(instance);
NCR5380_local_declare(); NCR5380_local_declare();
NCR5380_setup(instance); NCR5380_setup(instance);
...@@ -369,8 +367,8 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, ...@@ -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 */ NCR5380_write(MODE_REG, 0); /* Clear the operating mode */
rtrc(0); rtrc(0);
NCR5380_read(RESET_PARITY_INTERRUPT_REG); NCR5380_read(RESET_PARITY_INTERRUPT_REG);
if (i > dtc_maxi) if (i > hostdata->spin_max_r)
dtc_maxi = i; hostdata->spin_max_r = i;
return (0); return (0);
} }
...@@ -390,6 +388,7 @@ static inline int NCR5380_pread(struct Scsi_Host *instance, unsigned char *dst, ...@@ -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) static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, int len)
{ {
int i; int i;
struct NCR5380_hostdata *hostdata = shost_priv(instance);
NCR5380_local_declare(); NCR5380_local_declare();
NCR5380_setup(instance); NCR5380_setup(instance);
...@@ -422,8 +421,8 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src, ...@@ -422,8 +421,8 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,
/* Check for parity error here. fixme. */ /* Check for parity error here. fixme. */
NCR5380_write(MODE_REG, 0); /* Clear the operating mode */ NCR5380_write(MODE_REG, 0); /* Clear the operating mode */
rtrc(0); rtrc(0);
if (i > dtc_wmaxi) if (i > hostdata->spin_max_w)
dtc_wmaxi = i; hostdata->spin_max_w = i;
return (0); return (0);
} }
......
...@@ -88,8 +88,6 @@ ...@@ -88,8 +88,6 @@
#include "NCR5380.h" #include "NCR5380.h"
static int pas_maxi = 0;
static int pas_wmaxi = 0;
static unsigned short pas16_addr = 0; static unsigned short pas16_addr = 0;
static int pas16_irq = 0; static int pas16_irq = 0;
...@@ -502,6 +500,7 @@ static inline int NCR5380_pread (struct Scsi_Host *instance, unsigned char *dst, ...@@ -502,6 +500,7 @@ static inline int NCR5380_pread (struct Scsi_Host *instance, unsigned char *dst,
P_DATA_REG_OFFSET); P_DATA_REG_OFFSET);
register int i = len; register int i = len;
int ii = 0; int ii = 0;
struct NCR5380_hostdata *hostdata = shost_priv(instance);
while ( !(inb(instance->io_port + P_STATUS_REG_OFFSET) & P_ST_RDY) ) while ( !(inb(instance->io_port + P_STATUS_REG_OFFSET) & P_ST_RDY) )
++ii; ++ii;
...@@ -514,8 +513,8 @@ static inline int NCR5380_pread (struct Scsi_Host *instance, unsigned char *dst, ...@@ -514,8 +513,8 @@ static inline int NCR5380_pread (struct Scsi_Host *instance, unsigned char *dst,
instance->host_no); instance->host_no);
return -1; return -1;
} }
if (ii > pas_maxi) if (ii > hostdata->spin_max_r)
pas_maxi = ii; hostdata->spin_max_r = ii;
return 0; return 0;
} }
...@@ -538,6 +537,7 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src ...@@ -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 unsigned short reg = (instance->io_port + P_DATA_REG_OFFSET);
register int i = len; register int i = len;
int ii = 0; int ii = 0;
struct NCR5380_hostdata *hostdata = shost_priv(instance);
while ( !((inb(instance->io_port + P_STATUS_REG_OFFSET)) & P_ST_RDY) ) while ( !((inb(instance->io_port + P_STATUS_REG_OFFSET)) & P_ST_RDY) )
++ii; ++ii;
...@@ -550,8 +550,8 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src ...@@ -550,8 +550,8 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src
instance->host_no); instance->host_no);
return -1; return -1;
} }
if (ii > pas_maxi) if (ii > hostdata->spin_max_w)
pas_wmaxi = ii; hostdata->spin_max_w = ii;
return 0; return 0;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册