Fixes, cleanup and g_NCR5380_mmio/g_NCR5380 merger
Subsystems (3)
v2 cover Fixes, cleanup and g_NCR5380_mmio/g_NCR5380 merger
This patch series has fixes for compatibility, reliability and performance issues and some cleanup. It also includes a new version of Ondrej Zary's patch that merges g_NCR5380_mmio into g_NCR5380.
I've tested this patch series on a Powerbook 180. If someone would test some of the other platforms that would be very helpful. All drivers were compile-tested.
Changes since v1:
- rebased on 4.9/scsi-queue
- added reviewed-by tags
- tweaked the order of struct members in patch 7/12
Finn Thain (12):
scsi/g_NCR5380: Merge g_NCR5380 and g_NCR5380_mmio drivers scsi/cumana_1: Remove unused cumanascsi_setup() function scsi/atari_scsi: Make device register accessors re-enterant scsi/ncr5380: Simplify register polling limit scsi/ncr5380: Increase register polling limit scsi/ncr5380: Improve hostdata struct member alignment and
cache-ability
scsi/ncr5380: Store IO ports and addresses in host private data scsi/ncr5380: Use correct types for device register accessors scsi/ncr5380: Pass hostdata pointer to register polling routines scsi/ncr5380: Expedite register polling
scsi/ncr5380: Use correct types for DMA routines scsi/ncr5380: Suppress unhelpful "interrupt without IRQ bit" message
MAINTAINERS | 1 - drivers/scsi/Kconfig | 32 +---- drivers/scsi/Makefile | 1 - drivers/scsi/NCR5380.c | 137 +++++++++++--------- drivers/scsi/NCR5380.h | 87 +++++++++---- drivers/scsi/arm/cumana_1.c | 98 +++++++------- drivers/scsi/arm/oak.c | 34 +++-- drivers/scsi/atari_scsi.c | 77 ++++++----- drivers/scsi/dmx3191d.c | 20 +-- drivers/scsi/g_NCR5380.c | 290 ++++++++++++++++++++---------------------- drivers/scsi/g_NCR5380.h | 32 +---- drivers/scsi/g_NCR5380_mmio.c | 10 -- drivers/scsi/mac_scsi.c | 83 +++++------- drivers/scsi/sun3_scsi.c | 80 ++++++------ 14 files changed, 495 insertions(+), 487 deletions(-) delete mode 100644 drivers/scsi/g_NCR5380_mmio.c
Signature · 1 line
2.7.3
PATCH v2 1/12 scsi/g_NCR5380: Merge g_NCR5380 and g_NCR5380_mmio drivers
From: Ondrej Zary <[email protected]>
Merge the port-mapped IO and memory-mapped IO support (with the help of ioport_map) into the g_NCR5380 module and delete g_NCR5380_mmio.
--- MAINTAINERS | 1 - drivers/scsi/Kconfig | 32 +----- drivers/scsi/Makefile | 1 - drivers/scsi/g_NCR5380.c | 252 ++++++++++++++++++++---------------------- drivers/scsi/g_NCR5380.h | 33 ++---- drivers/scsi/g_NCR5380_mmio.c | 10 -- 6 files changed, 134 insertions(+), 195 deletions(-) delete mode 100644 drivers/scsi/g_NCR5380_mmio.c
MAINTAINERS +0 -1
@@ -8048,7 +8048,6 @@ F: drivers/scsi/arm/oak.c F: drivers/scsi/atari_scsi.* F: drivers/scsi/dmx3191d.c F: drivers/scsi/g_NCR5380.* -F: drivers/scsi/g_NCR5380_mmio.c F: drivers/scsi/mac_scsi.* F: drivers/scsi/sun3_scsi.* F: drivers/scsi/sun3_scsi_vme.c
drivers/scsi/Kconfig +5 -27
@@ -743,40 +743,18 @@ config SCSI_ISCI control unit found in the Intel(R) C600 series chipset. config SCSI_GENERIC_NCR5380 - tristate "Generic NCR5380/53c400 SCSI PIO support" + tristate "Generic NCR5380/53c400 SCSI ISA card support" depends on ISA && SCSI select SCSI_SPI_ATTRS ---help--- - This is a driver for the old NCR 53c80 series of SCSI controllers - on boards using PIO. Most boards such as the Trantor T130 fit this - category, along with a large number of ISA 8bit controllers shipped - for free with SCSI scanners. If you have a PAS16, T128 or DMX3191 - you should select the specific driver for that card rather than - generic 5380 support. - - It is explained in section 3.8 of the SCSI-HOWTO, available from - <http://www.tldp.org/docs.html#howto>. If it doesn't work out - of the box, you may have to change some settings in - <file:drivers/scsi/g_NCR5380.h>. + This is a driver for old ISA card SCSI controllers based on a + NCR 5380, 53C80, 53C400, 53C400A, or DTC 436 device. + Most boards such as the Trantor T130 fit this category, as do + various 8-bit and 16-bit ISA cards bundled with SCSI scanners. To compile this driver as a module, choose M here: the module will be called g_NCR5380. -config SCSI_GENERIC_NCR5380_MMIO - tristate "Generic NCR5380/53c400 SCSI MMIO support" - depends on ISA && SCSI - select SCSI_SPI_ATTRS - ---help--- - This is a driver for the old NCR 53c80 series of SCSI controllers - on boards using memory mapped I/O. - It is explained in section 3.8 of the SCSI-HOWTO, available from - <http://www.tldp.org/docs.html#howto>. If it doesn't work out - of the box, you may have to change some settings in - <file:drivers/scsi/g_NCR5380.h>. - - To compile this driver as a module, choose M here: the - module will be called g_NCR5380_mmio. - config SCSI_IPS tristate "IBM ServeRAID support" depends on PCI && SCSI
drivers/scsi/Makefile +0 -1
@@ -74,7 +74,6 @@ obj-$(CONFIG_SCSI_ISCI) += isci/ obj-$(CONFIG_SCSI_IPS) += ips.o obj-$(CONFIG_SCSI_FUTURE_DOMAIN)+= fdomain.o obj-$(CONFIG_SCSI_GENERIC_NCR5380) += g_NCR5380.o -obj-$(CONFIG_SCSI_GENERIC_NCR5380_MMIO) += g_NCR5380_mmio.o obj-$(CONFIG_SCSI_NCR53C406A) += NCR53c406a.o obj-$(CONFIG_SCSI_NCR_D700) += 53c700.o NCR_D700.o obj-$(CONFIG_SCSI_NCR_Q720) += NCR_Q720_mod.o
drivers/scsi/g_NCR5380.c +120 -132
395 lines not on this page · raw message
drivers/scsi/g_NCR5380.h +9 -24
@@ -14,44 +14,30 @@#ifndef GENERIC_NCR5380_H #define GENERIC_NCR5380_H -#ifndef SCSI_G_NCR5380_MEM #define DRV_MODULE_NAME "g_NCR5380"#define NCR5380_read (reg) \ - inb(instance->io_port + (reg)) + ioread8(((struct NCR5380_hostdata *)shost_priv(instance))->iomem + \ + ((struct NCR5380_hostdata *)shost_priv(instance))->offset + \ + (reg))#define NCR5380_write (reg, value) \ - outb(value, instance->io_port + (reg)) + iowrite8(value, ((struct NCR5380_hostdata *)shost_priv(instance))->iomem + \ + ((struct NCR5380_hostdata *)shost_priv(instance))->offset + \ + (reg))#define NCR5380_implementation_fields \ + int offset; \ + void __iomem *iomem; \ + resource_size_t iomem_size; \ int c400_ctl_status; \ int c400_blk_cnt; \ int c400_host_buf; \ int io_width; -#else -/* therefore SCSI_G_NCR5380_MEM */ -#define DRV_MODULE_NAME "g_NCR5380_mmio" -#define NCR53C400_mem_base 0x3880#define NCR53C400_host_buffer 0x3900#define NCR53C400_region_size 0x3a00 -#define NCR5380_read (reg) \ - readb(((struct NCR5380_hostdata *)shost_priv(instance))->iomem + \ - NCR53C400_mem_base + (reg)) -#define NCR5380_write (reg, value) \ - writeb(value, ((struct NCR5380_hostdata *)shost_priv(instance))->iomem + \ - NCR53C400_mem_base + (reg)) - -#define NCR5380_implementation_fields \ - void __iomem *iomem; \ - resource_size_t iomem_size; \ - int c400_ctl_status; \ - int c400_blk_cnt; \ - int c400_host_buf; - -#endif -#define NCR5380_dma_xfer_len (instance, cmd, phase) \ generic_NCR5380_dma_xfer_len(instance, cmd)#define NCR5380_dma_recv_setup generic_NCR5380_pread
@@ -73,4 +59,3 @@#define BOARD_HP_C2502 4#endif /* GENERIC_NCR5380_H */ -
drivers/scsi/g_NCR5380_mmio.c deleted +0 -10
@@ -1,10 +0,0 @@ -/* -* There is probably a nicer way to do this but this one makes -* pretty obvious what is happening. We rebuild the same file with -* different options for mmio versus pio. -*/ - -#define SCSI_G_NCR5380_MEM - -#include "g_NCR5380.c" -
Signature · 1 line
2.7.3
PATCH v2 2/12 scsi/cumana_1: Remove unused cumanascsi_setup() function
In reply to Finn Thain--- drivers/scsi/arm/cumana_1.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/scsi/arm/cumana_1.c +0 -4
@@ -33,10 +33,6 @@#include "../NCR5380.h" -void cumanascsi_setup (char *str,int *ints) -{ -} -#define CTRL 0x16fc#define STAT 0x2004#define L (v) (((v)<<16)|((v) & 0x0000ffff))
Signature · 1 line
2.7.3
PATCH v2 3/12 scsi/atari_scsi: Make device register accessors re-enterant
In reply to Finn ThainThis patch fixes an old bug: accesses to device registers from the interrupt handler (after reselection, DMA completion etc.) could mess up a device register access elsewhere, if the latter takes place outside of an irq lock (during selection etc.).
--- drivers/scsi/atari_scsi.c | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-)
drivers/scsi/atari_scsi.c +15 -3
@@ -670,14 +670,26 @@ static void atari_scsi_tt_reg_write(unsigned char reg, unsigned char value)static unsigned char atari_scsi_falcon_reg_read (unsigned char reg) { - dma_wd.dma_mode_status= (u_short)(0x88 + reg); -return (u_char )dma_wd.fdc_acces_seccount; +unsigned long flags; +unsigned char result; + + reg +=0x88 ; +local_irq_save (flags); + dma_wd.dma_mode_status = (u_short )reg; + result = (u_char )dma_wd.fdc_acces_seccount; +local_irq_restore (flags); +return result; }static void atari_scsi_falcon_reg_write (unsigned char reg,unsigned char value) { - dma_wd.dma_mode_status = (u_short)(0x88 + reg); +unsigned long flags; + + reg +=0x88 ; +local_irq_save (flags); + dma_wd.dma_mode_status = (u_short )reg; dma_wd.fdc_acces_seccount = (u_short )value; +local_irq_restore (flags); }
Signature · 1 line
2.7.3
PATCH v2 4/12 scsi/ncr5380: Simplify register polling limit
In reply to Finn ThainWhen polling a device register under irq lock the polling loop terminates after a given number of jiffies. Make this timeout independent of the HZ setting.
All 5380 drivers benefit from this patch, which optimizes the PIO fast path, because they all use PIO transfers (for phases other than DATA IN and DATA OUT). Some cards support only PIO transfers (even for DATA phases). CPU cycles are scarce on some of these systems, so a small improvement here makes a big difference.
---
This patch eliminates a call to jiffies_to_usecs from the fast path. For g_NCR5380 it also eliminates a mul instruction and an imul instruction. For ARM drivers like oak, this change eliminates an __aeabi_uidiv call.
--- drivers/scsi/NCR5380.c | 10 ++++------ drivers/scsi/NCR5380.h | 5 ++++- 2 files changed, 8 insertions(+), 7 deletions(-)
drivers/scsi/NCR5380.c +4 -6
@@ -200,13 +200,9 @@ static int NCR5380_poll_politely2(struct Scsi_Host *instance, int reg2, int bit2, int val2, int wait) { struct NCR5380_hostdata *hostdata = shost_priv(instance); +unsigned long n = hostdata->poll_loops;unsigned long deadline = jiffies + wait; -unsigned long n; -/* Busy-wait for up to 10 ms */ - n =min (10000U ,jiffies_to_usecs (wait)); - n *= hostdata->accesses_per_ms; - n /=2000 ; do { if ((NCR5380_read(reg1) & bit1) == val1) return 0;
@@ -482,6 +478,7 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags)struct NCR5380_hostdata *hostdata =shost_priv (instance);int i;unsigned long deadline; +unsigned long accesses_per_ms; instance->max_lun =7 ;
@@ -530,7 +527,8 @@ static int NCR5380_init(struct Scsi_Host *instance, int flags) ++i;cpu_relax (); }while (time_is_after_jiffies (deadline)); - hostdata->accesses_per_ms = i /256 ; + accesses_per_ms = i /256 ; + hostdata->poll_loops =NCR5380_REG_POLL_TIME * accesses_per_ms /2 ;return 0 ; }
drivers/scsi/NCR5380.h +4 -1
@@ -239,7 +239,7 @@ struct NCR5380_hostdata {* transfer to handle chip overruns */ struct work_struct main_task;struct workqueue_struct *work_q; -unsigned long accesses_per_ms;/* chip register accesses per ms */ +unsigned long poll_loops;/* register polling limit */ };#ifdef __KERNEL__
@@ -252,6 +252,9 @@ struct NCR5380_cmd {#define NCR5380_PIO_CHUNK_SIZE 256 +/* Time limit (ms) to poll registers when IRQs are disabled, e.g. during PDMA */ +#define NCR5380_REG_POLL_TIME 10 +static inline struct scsi_cmnd *NCR5380_to_scmd (struct NCR5380_cmd *ncmd_ptr) {return ((struct scsi_cmnd *)ncmd_ptr) -1 ;
Signature · 1 line
2.7.3
PATCH v2 5/12 scsi/ncr5380: Increase register polling limit
In reply to Finn ThainIf NCR5380_poll_politely() is called under irq lock, the polling time limit is clamped to avoid a spike in interrupt latency. When not under irq lock, the same polling time limit acts as the worst case delay between schedule() calls.
During PDMA (under irq lock) I've found that the 10 ms time limit is sometimes too short, and leads to the error message,
sd 0:0:0:0: [sda] tag#1 macscsi_pread: !REQ and !ACK
This particular target identifies itself as a QUANTUM DAYTONA514S. It seems to be slower to assert ACK than the other targets I've tested. This patch solves the problem by increasing the polling timeout.
---
When irqs are disabled, this change will make no difference unless the driver or target happens to suffer from timeout errors. In the irqs enabled case, this patch may delay the next call to schedule() by an additional 5 ms (in all 5380 drivers). Normally that would only happen for a target selection timeout during a SCSI bus scan, which should not bother anyone too much.
--- drivers/scsi/NCR5380.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/NCR5380.h +1 -1
@@ -253,7 +253,7 @@ struct NCR5380_cmd {#define NCR5380_PIO_CHUNK_SIZE 256/* Time limit (ms) to poll registers when IRQs are disabled, e.g. during PDMA */ -#define NCR5380_REG_POLL_TIME 10 +#define NCR5380_REG_POLL_TIME 15static inline struct scsi_cmnd *NCR5380_to_scmd (struct NCR5380_cmd *ncmd_ptr) {
Signature · 1 line
2.7.3
PATCH v2 6/12 scsi/ncr5380: Improve hostdata struct member alignment and cache-ability
In reply to Finn ThainRe-order struct members so that hot data lies at the beginning of the struct and cold data at the end. Improve the comments while we're here.
--- drivers/scsi/NCR5380.h | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-)
drivers/scsi/NCR5380.h +20 -20
@@ -219,27 +219,27 @@#define FLAG_TOSHIBA_DELAY 128/* Allow for borken CD-ROMs */ struct NCR5380_hostdata { -NCR5380_implementation_fields ;/* implementation specific */ -struct Scsi_Host *host;/* Host backpointer */ -unsigned char id_mask, id_higher_mask;/* 1 << id, all bits greater */ -unsigned char busy[8 ];/* index = target, bit = lun */ -int dma_len;/* requested length of DMA */ -unsigned char last_message;/* last message OUT */ -struct scsi_cmnd *connected;/* currently connected cmnd */ -struct scsi_cmnd *selecting;/* cmnd to be connected */ -struct list_head unissued;/* waiting to be issued */ -struct list_head autosense;/* priority issue queue */ -struct list_head disconnected;/* waiting for reconnect */ -spinlock_t lock;/* protects this struct */ -int flags; -struct scsi_eh_save ses; -struct scsi_cmnd *sensing; +NCR5380_implementation_fields ;/* Board-specific data */ +unsigned long poll_loops;/* Register polling limit */ +spinlock_t lock;/* Protects this struct */ +struct scsi_cmnd *connected;/* Currently connected cmnd */ +struct list_head disconnected;/* Waiting for reconnect */ +struct Scsi_Host *host;/* SCSI host backpointer */ +struct workqueue_struct *work_q;/* SCSI host work queue */ +struct work_struct main_task;/* Work item for main loop */ +int flags;/* Board-specific quirks */ +int dma_len;/* Requested length of DMA */ +int read_overruns;/* Transfer size reduction for DMA erratum */ +struct list_head unissued;/* Waiting to be issued */ +struct scsi_cmnd *selecting;/* Cmnd to be connected */ +struct list_head autosense;/* Priority cmnd queue */ +struct scsi_cmnd *sensing;/* Cmnd needing autosense */ +struct scsi_eh_save ses;/* Cmnd state saved for EH */ +unsigned char busy[8 ];/* Index = target, bit = lun */ +unsigned char id_mask;/* 1 << Host ID */ +unsigned char id_higher_mask;/* All bits above id_mask */ +unsigned char last_message;/* Last Message Out */ char info[256 ]; -int read_overruns;/* number of bytes to cut from a -* transfer to handle chip overruns */ -struct work_struct main_task; -struct workqueue_struct *work_q; -unsigned long poll_loops;/* register polling limit */ };#ifdef __KERNEL__
Signature · 1 line
2.7.3
PATCH v2 7/12 scsi/ncr5380: Store IO ports and addresses in host private data
In reply to Finn ThainThe various 5380 drivers inconsistently store register pointers either in the Scsi_Host struct "legacy crap" area or in special, board-specific members of the NCR5380_hostdata struct. Uniform use of the latter struct makes for simpler and faster code (see the following patches) and helps to reduce use of the NCR5380_implementation_fields macro.
--- drivers/scsi/NCR5380.c | 8 +++--- drivers/scsi/NCR5380.h | 5 ++++ drivers/scsi/arm/cumana_1.c | 60 ++++++++++++++++++++-------------------- drivers/scsi/arm/oak.c | 23 ++++++++-------- drivers/scsi/dmx3191d.c | 14 +++++++--- drivers/scsi/g_NCR5380.c | 67 +++++++++++++++++++++++---------------------- drivers/scsi/g_NCR5380.h | 6 ++-- drivers/scsi/mac_scsi.c | 27 ++++++++++-------- drivers/scsi/sun3_scsi.c | 5 +++- 9 files changed, 118 insertions(+), 97 deletions(-)
drivers/scsi/NCR5380.c +4 -4
@@ -437,14 +437,14 @@ 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, " + "%s, irq %d, " + "io_port 0x%lx, base 0x%lx, " "can_queue %d, cmd_per_lun %d, " "sg_tablesize %d, this_id %d, " "flags { %s%s%s}, " "options { %s} ", - instance->hostt->name, instance->io_port, instance->n_io_port, - instance->base, instance->irq, + instance->hostt->name, instance->irq, + hostdata->io_port, hostdata->base, instance->can_queue, instance->cmd_per_lun, instance->sg_tablesize, instance->this_id, hostdata->flags & FLAG_DMA_FIXUP ? "DMA_FIXUP " : "",
drivers/scsi/NCR5380.h +5 -0
@@ -220,6 +220,8 @@struct NCR5380_hostdata {NCR5380_implementation_fields ;/* Board-specific data */ +u8 __iomem *io;/* Remapped 5380 address */ +u8 __iomem *pdma_io;/* Remapped PDMA address */ unsigned long poll_loops;/* Register polling limit */ spinlock_t lock;/* Protects this struct */ struct scsi_cmnd *connected;/* Currently connected cmnd */
@@ -230,6 +232,8 @@ struct NCR5380_hostdata {int flags;/* Board-specific quirks */ int dma_len;/* Requested length of DMA */ int read_overruns;/* Transfer size reduction for DMA erratum */ +unsigned long io_port;/* Device IO port */ +unsigned long base;/* Device base address */ struct list_head unissued;/* Waiting to be issued */ struct scsi_cmnd *selecting;/* Cmnd to be connected */ struct list_head autosense;/* Priority cmnd queue */
@@ -239,6 +243,7 @@ struct NCR5380_hostdata {unsigned char id_mask;/* 1 << Host ID */ unsigned char id_higher_mask;/* All bits above id_mask */ unsigned char last_message;/* Last Message Out */ +unsigned long region_size;/* Size of address/port range */ char info[256 ]; };
drivers/scsi/arm/cumana_1.c +31 -29
180 lines not on this page · raw message
drivers/scsi/arm/oak.c +11 -12
@@ -17,9 +17,9 @@#define priv (host) ((struct NCR5380_hostdata *)(host)->hostdata)#define NCR5380_read (reg) \ - readb(priv(instance)->base + ((reg) << 2)) + readb(priv(instance)->io + ((reg) << 2))#define NCR5380_write (reg, value) \ - writeb(value, priv(instance)->base + ((reg) << 2)) + writeb(value, priv(instance)->io + ((reg) << 2))#define NCR5380_dma_xfer_len (instance, cmd, phase) (0)#define NCR5380_dma_recv_setup oakscsi_pread
@@ -29,8 +29,7 @@#define NCR5380_queue_command oakscsi_queue_command#define NCR5380_info oakscsi_info -#define NCR5380_implementation_fields \ - void __iomem *base +#define NCR5380_implementation_fields/* none */ #include "../NCR5380.h"
@@ -43,7 +42,7 @@static inline int oakscsi_pwrite (struct Scsi_Host *instance,unsigned char *addr,int len) { -void __iomem *base =priv (instance)->base; +u8 __iomem *base =priv (instance)->io;printk ("writing %p len %d\n" ,addr, len);
@@ -58,7 +57,7 @@ printk("writing %p len %d\n",addr, len);static inline int oakscsi_pread (struct Scsi_Host *instance,unsigned char *addr,int len) { -void __iomem *base =priv (instance)->base; +u8 __iomem *base =priv (instance)->io;printk ("reading %p len %d\n" , addr, len);while (len >0 ) {
@@ -133,15 +132,14 @@ static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id) goto release; } -priv (host)->base =ioremap (ecard_resource_start (ec,ECARD_RES_MEMC ), -ecard_resource_len (ec,ECARD_RES_MEMC )); -if (!priv (host)->base) { +priv (host)->io =ioremap (ecard_resource_start (ec,ECARD_RES_MEMC ), +ecard_resource_len (ec,ECARD_RES_MEMC )); +if (!priv (host)->io) { ret = -ENOMEM ; goto unreg; } host->irq =NO_IRQ ; - host->n_io_port =255 ; ret =NCR5380_init (host,FLAG_DMA_FIXUP |FLAG_LATE_DMA_SETUP );if (ret)
@@ -159,7 +157,7 @@ static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id) out_exit:NCR5380_exit (host); out_unmap: -iounmap (priv (host)->base); +iounmap (priv (host)->io); unreg:scsi_host_put (host); release:
@@ -171,13 +169,14 @@ static int oakscsi_probe(struct expansion_card *ec, const struct ecard_id *id)static void oakscsi_remove (struct expansion_card *ec) {struct Scsi_Host *host =ecard_get_drvdata (ec); +void __iomem *base =priv (host)->io;ecard_set_drvdata (ec,NULL );scsi_remove_host (host);NCR5380_exit (host); -iounmap (priv (host)->base);scsi_host_put (host); +iounmap (base);ecard_release_resources (ec); }
drivers/scsi/dmx3191d.c +10 -4
@@ -34,8 +34,10 @@* Definitions for the generic 5380 driver. */ -#define NCR5380_read (reg) inb(instance->io_port + reg) -#define NCR5380_write (reg, value) outb(value, instance->io_port + reg) +#define priv (instance) ((struct NCR5380_hostdata *)shost_priv(instance)) + +#define NCR5380_read (reg) inb(priv(instance)->base + (reg)) +#define NCR5380_write (reg, value) outb(value, priv(instance)->base + (reg))#define NCR5380_dma_xfer_len (instance, cmd, phase) (0)#define NCR5380_dma_recv_setup (instance, dst, len) (0)
@@ -71,6 +73,7 @@ static int dmx3191d_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) {struct Scsi_Host *shost; +struct NCR5380_hostdata *hostdata;unsigned long io;int error = -ENODEV ;
@@ -88,7 +91,9 @@ static int dmx3191d_probe_one(struct pci_dev *pdev, sizeof(struct NCR5380_hostdata));if (!shost) goto out_release_region; - shost->io_port = io; + + hostdata =shost_priv (shost); + hostdata->base = io;/* This card does not seem to raise an interrupt on pdev->irq. * Steam-powered SCSI controllers run without an IRQ anyway.
@@ -125,7 +130,8 @@ out_host_put:static void dmx3191d_remove_one (struct pci_dev *pdev) {struct Scsi_Host *shost =pci_get_drvdata (pdev); -unsigned long io = shost->io_port; +struct NCR5380_hostdata *hostdata =shost_priv (shost); +unsigned long io = hostdata->base;scsi_remove_host (shost);
drivers/scsi/g_NCR5380.c +35 -32
143 lines not on this page · raw message
drivers/scsi/g_NCR5380.h +2 -4
@@ -17,18 +17,16 @@#define DRV_MODULE_NAME "g_NCR5380"#define NCR5380_read (reg) \ - ioread8(((struct NCR5380_hostdata *)shost_priv(instance))->iomem + \ + ioread8(((struct NCR5380_hostdata *)shost_priv(instance))->io + \ ((struct NCR5380_hostdata *)shost_priv(instance))->offset + \ (reg))#define NCR5380_write (reg, value) \ - iowrite8(value, ((struct NCR5380_hostdata *)shost_priv(instance))->iomem + \ + iowrite8(value, ((struct NCR5380_hostdata *)shost_priv(instance))->io + \ ((struct NCR5380_hostdata *)shost_priv(instance))->offset + \ (reg))#define NCR5380_implementation_fields \ int offset; \ - void __iomem *iomem; \ - resource_size_t iomem_size; \ int c400_ctl_status; \ int c400_blk_cnt; \ int c400_host_buf; \
drivers/scsi/mac_scsi.c +16 -11
@@ -28,8 +28,7 @@/* Definitions for the core NCR5380 driver. */ -#define NCR5380_implementation_fields unsigned char *pdma_base; \ - int pdma_residual +#define NCR5380_implementation_fields int pdma_residual#define NCR5380_read (reg) macscsi_read(instance, reg)#define NCR5380_write (reg, value) macscsi_write(instance, reg, value)
@@ -67,12 +66,16 @@ module_param(setup_toshiba_delay, int, 0);static inline char macscsi_read (struct Scsi_Host *instance,int reg) { -return in_8 (instance->base + (reg <<4 )); +struct NCR5380_hostdata *hostdata =shost_priv (instance); + +return in_8 (hostdata->io + (reg <<4 )); }static inline void macscsi_write (struct Scsi_Host *instance,int reg,int value) { -out_8 (instance->base + (reg <<4 ), value); +struct NCR5380_hostdata *hostdata =shost_priv (instance); + +out_8 (hostdata->io + (reg <<4 ), value); }#ifndef MODULE
@@ -171,7 +174,7 @@ static int macscsi_pread(struct Scsi_Host *instance, unsigned char *dst, int len) {struct NCR5380_hostdata *hostdata =shost_priv (instance); -unsigned char *s = hostdata->pdma_base + (INPUT_DATA_REG <<4 ); +unsigned char *s = hostdata->pdma_io + (INPUT_DATA_REG <<4 );unsigned char *d = dst;int n = len;int transferred;
@@ -275,7 +278,7 @@ static int macscsi_pwrite(struct Scsi_Host *instance, {struct NCR5380_hostdata *hostdata =shost_priv (instance);unsigned char *s = src; -unsigned char *d = hostdata->pdma_base + (OUTPUT_DATA_REG <<4 ); +unsigned char *d = hostdata->pdma_io + (OUTPUT_DATA_REG <<4 );int n = len;int transferred;
@@ -356,6 +359,7 @@ static struct scsi_host_template mac_scsi_template = {static int __init mac_scsi_probe (struct platform_device *pdev) {struct Scsi_Host *instance; +struct NCR5380_hostdata *hostdata;int error;int host_flags =0 ;struct resource *irq, *pio_mem, *pdma_mem =NULL ;
@@ -388,17 +392,18 @@ static int __init mac_scsi_probe(struct platform_device *pdev)if (!instance)return -ENOMEM ; - instance->base = pio_mem->start;if (irq) instance->irq = irq->start;else instance->irq =NO_IRQ ; -if (pdma_mem && setup_use_pdma) { -struct NCR5380_hostdata *hostdata =shost_priv (instance); + hostdata =shost_priv (instance); + hostdata->base = pio_mem->start; + hostdata->io = (void *)pio_mem->start; - hostdata->pdma_base = (unsigned char *)pdma_mem->start; - }else +if (pdma_mem && setup_use_pdma) + hostdata->pdma_io = (void *)pdma_mem->start; +else host_flags |=FLAG_NO_PSEUDO_DMA ; host_flags |= setup_toshiba_delay >0 ?FLAG_TOSHIBA_DELAY :0 ;
drivers/scsi/sun3_scsi.c +4 -1
@@ -428,6 +428,7 @@ static struct scsi_host_template sun3_scsi_template = {static int __init sun3_scsi_probe (struct platform_device *pdev) {struct Scsi_Host *instance; +struct NCR5380_hostdata *hostdata;int error;struct resource *irq, *mem;unsigned char *ioaddr;
@@ -502,9 +503,11 @@ static int __init sun3_scsi_probe(struct platform_device *pdev) goto fail_alloc; } - instance->io_port = (unsigned long )ioaddr; instance->irq = irq->start; + hostdata =shost_priv (instance); + hostdata->base = (unsigned long )ioaddr; + error =NCR5380_init (instance, host_flags);if (error) goto fail_init;
Signature · 1 line
2.7.3
PATCH v2 8/12 scsi/ncr5380: Use correct types for device register accessors
In reply to Finn ThainFor timeout values adopt unsigned long, which is the type of jiffies etc.
For chip register values and bit masks pass u8, which is the return type of readb, inb etc.
For device register offsets adopt unsigned int, as it is suitable for adding to base addresses.
Pass the NCR5380_hostdata pointer to the board-specific routines instead of the Scsi_Host pointer. The board-specific code is concerned with hardware and not with SCSI protocol or the mid-layer.
--- drivers/scsi/NCR5380.c | 10 ++++++++-- drivers/scsi/NCR5380.h | 7 +++++-- drivers/scsi/arm/cumana_1.c | 20 +++++++++++--------- drivers/scsi/arm/oak.c | 6 ++---- drivers/scsi/atari_scsi.c | 16 ++++++++-------- drivers/scsi/dmx3191d.c | 6 ++---- drivers/scsi/g_NCR5380.h | 8 ++------ drivers/scsi/mac_scsi.c | 22 ++-------------------- drivers/scsi/sun3_scsi.c | 32 +++++++++----------------------- 9 files changed, 49 insertions(+), 78 deletions(-)
drivers/scsi/NCR5380.c +8 -2
@@ -196,8 +196,9 @@ static inline void initialize_SCp(struct scsi_cmnd *cmd)*/ static int NCR5380_poll_politely2 (struct Scsi_Host *instance, -int reg1,int bit1,int val1, -int reg2,int bit2,int val2,int wait) +unsigned int reg1,u8 bit1,u8 val1, +unsigned int reg2,u8 bit2,u8 val2, +unsigned long wait) {struct NCR5380_hostdata *hostdata =shost_priv (instance);unsigned long n = hostdata->poll_loops;
@@ -284,6 +285,7 @@ mrs[] = {static void NCR5380_print (struct Scsi_Host *instance) { +struct NCR5380_hostdata *hostdata =shost_priv (instance);unsigned char status, data, basr, mr, icr, i; data =NCR5380_read (CURRENT_SCSI_DATA_REG );
@@ -333,6 +335,7 @@ static struct {static void NCR5380_print_phase (struct Scsi_Host *instance) { +struct NCR5380_hostdata *hostdata =shost_priv (instance);unsigned char status;int i;
@@ -1316,6 +1319,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance, unsigned char *phase, int *count, unsigned char **data) { + struct NCR5380_hostdata *hostdata = shost_priv(instance);unsigned char p = *phase, tmp;int c = *count;unsigned char *d = *data;
@@ -1438,6 +1442,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance,static void do_reset (struct Scsi_Host *instance) { +struct NCR5380_hostdata __maybe_unused *hostdata =shost_priv (instance);unsigned long flags;local_irq_save (flags);
@@ -1460,6 +1465,7 @@ static void do_reset(struct Scsi_Host *instance)static int do_abort (struct Scsi_Host *instance) { +struct NCR5380_hostdata *hostdata =shost_priv (instance);unsigned char *msgptr, phase, tmp;int len;int rc;
drivers/scsi/NCR5380.h +5 -2
@@ -302,10 +302,13 @@ static void NCR5380_reselect(struct Scsi_Host *instance);static struct scsi_cmnd *NCR5380_select (struct Scsi_Host *,struct scsi_cmnd *);static int NCR5380_transfer_dma (struct Scsi_Host *instance,unsigned char *phase,int *count,unsigned char **data);static int NCR5380_transfer_pio (struct Scsi_Host *instance,unsigned char *phase,int *count,unsigned char **data); -static int NCR5380_poll_politely2 (struct Scsi_Host *,int ,int ,int ,int ,int ,int ,int ); +static int NCR5380_poll_politely2 (struct Scsi_Host *, +unsigned int ,u8 ,u8 , +unsigned int ,u8 ,u8 ,unsigned long );static inline int NCR5380_poll_politely (struct Scsi_Host *instance, -int reg,int bit,int val,int wait) +unsigned int reg,u8 bit,u8 val, +unsigned long wait) {return NCR5380_poll_politely2 (instance, reg, bit, val, reg, bit, val, wait);
drivers/scsi/arm/cumana_1.c +11 -9
@@ -14,8 +14,8 @@#include <scsi/scsi_host.h> #define priv (host) ((struct NCR5380_hostdata *)(host)->hostdata) -#define NCR5380_read (reg) cumanascsi_read(instance, reg) -#define NCR5380_write (reg, value) cumanascsi_write(instance, reg, value) +#define NCR5380_read (reg) cumanascsi_read(hostdata, reg) +#define NCR5380_write (reg, value) cumanascsi_write(hostdata, reg, value)#define NCR5380_dma_xfer_len (instance, cmd, phase) (cmd->transfersize)#define NCR5380_dma_recv_setup cumanascsi_pread
@@ -169,30 +169,32 @@ end:return 0 ; } -static unsigned char cumanascsi_read (struct Scsi_Host *host,unsigned int reg) +static u8 cumanascsi_read (struct NCR5380_hostdata *hostdata, +unsigned int reg) { -u8 __iomem *base =priv (host)->io; -unsigned char val; +u8 __iomem *base = hostdata->io; +u8 val;writeb (0 , base +CTRL ); val =readb (base +0x2100 + (reg <<2 )); -priv (host)->ctrl =0x40 ; + hostdata->ctrl =0x40 ;writeb (0x40 , base +CTRL );return val; } -static void cumanascsi_write (struct Scsi_Host *host,unsigned int reg,unsigned int value) +static void cumanascsi_write (struct NCR5380_hostdata *hostdata, +unsigned int reg,u8 value) { -u8 __iomem *base =priv (host)->io; +u8 __iomem *base = hostdata->io;writeb (0 , base +CTRL );writeb (value, base +0x2100 + (reg <<2 )); -priv (host)->ctrl =0x40 ; + hostdata->ctrl =0x40 ;writeb (0x40 , base +CTRL ); }
drivers/scsi/arm/oak.c +2 -4
@@ -16,10 +16,8 @@#define priv (host) ((struct NCR5380_hostdata *)(host)->hostdata) -#define NCR5380_read (reg) \ - readb(priv(instance)->io + ((reg) << 2)) -#define NCR5380_write (reg, value) \ - writeb(value, priv(instance)->io + ((reg) << 2)) +#define NCR5380_read (reg) readb(hostdata->io + ((reg) << 2)) +#define NCR5380_write (reg, value) writeb(value, hostdata->io + ((reg) << 2))#define NCR5380_dma_xfer_len (instance, cmd, phase) (0)#define NCR5380_dma_recv_setup oakscsi_pread
drivers/scsi/atari_scsi.c +8 -8
@@ -126,8 +126,8 @@ static inline unsigned long SCSI_DMA_GETADR(void)static void atari_scsi_fetch_restbytes (void ); -static unsigned char (*atari_scsi_reg_read)(unsigned char reg); -static void (*atari_scsi_reg_write)(unsigned char reg,unsigned char value); +static u8 (*atari_scsi_reg_read)(unsigned int ); +static void (*atari_scsi_reg_write)(unsigned int ,u8 );static unsigned long atari_dma_residual, atari_dma_startaddr;static short atari_dma_active;
@@ -658,30 +658,30 @@ static unsigned long atari_dma_xfer_len(unsigned long wanted_len,* NCR5380_write call these functions via function pointers. */ -static unsigned char atari_scsi_tt_reg_read (unsigned char reg) +static u8 atari_scsi_tt_reg_read (unsigned int reg) {return tt_scsi_regp[reg *2 ]; } -static void atari_scsi_tt_reg_write (unsigned char reg,unsigned char value) +static void atari_scsi_tt_reg_write (unsigned int reg,u8 value) { tt_scsi_regp[reg *2 ] = value; } -static unsigned char atari_scsi_falcon_reg_read (unsigned char reg) +static u8 atari_scsi_falcon_reg_read (unsigned int reg) {unsigned long flags; -unsigned char result; +u8 result; reg +=0x88 ;local_irq_save (flags); dma_wd.dma_mode_status = (u_short )reg; - result = (u_char )dma_wd.fdc_acces_seccount; + result = (u8 )dma_wd.fdc_acces_seccount;local_irq_restore (flags);return result; } -static void atari_scsi_falcon_reg_write (unsigned char reg,unsigned char value) +static void atari_scsi_falcon_reg_write (unsigned int reg,u8 value) {unsigned long flags;
drivers/scsi/dmx3191d.c +2 -4
@@ -34,10 +34,8 @@* Definitions for the generic 5380 driver. */ -#define priv (instance) ((struct NCR5380_hostdata *)shost_priv(instance)) - -#define NCR5380_read (reg) inb(priv(instance)->base + (reg)) -#define NCR5380_write (reg, value) outb(value, priv(instance)->base + (reg)) +#define NCR5380_read (reg) inb(hostdata->base + (reg)) +#define NCR5380_write (reg, value) outb(value, hostdata->base + (reg))#define NCR5380_dma_xfer_len (instance, cmd, phase) (0)#define NCR5380_dma_recv_setup (instance, dst, len) (0)
drivers/scsi/g_NCR5380.h +2 -6
@@ -17,13 +17,9 @@#define DRV_MODULE_NAME "g_NCR5380"#define NCR5380_read (reg) \ - ioread8(((struct NCR5380_hostdata *)shost_priv(instance))->io + \ - ((struct NCR5380_hostdata *)shost_priv(instance))->offset + \ - (reg)) + ioread8(hostdata->io + hostdata->offset + (reg))#define NCR5380_write (reg, value) \ - iowrite8(value, ((struct NCR5380_hostdata *)shost_priv(instance))->io + \ - ((struct NCR5380_hostdata *)shost_priv(instance))->offset + \ - (reg)) + iowrite8(value, hostdata->io + hostdata->offset + (reg))#define NCR5380_implementation_fields \ int offset; \
drivers/scsi/mac_scsi.c +2 -20
@@ -30,8 +30,8 @@#define NCR5380_implementation_fields int pdma_residual -#define NCR5380_read (reg) macscsi_read(instance, reg) -#define NCR5380_write (reg, value) macscsi_write(instance, reg, value) +#define NCR5380_read (reg) in_8(hostdata->io + ((reg) << 4)) +#define NCR5380_write (reg, value) out_8(hostdata->io + ((reg) << 4), value)#define NCR5380_dma_xfer_len (instance, cmd, phase) \ macscsi_dma_xfer_len(instance, cmd)
@@ -60,24 +60,6 @@ module_param(setup_hostid, int, 0);static int setup_toshiba_delay =-1 ;module_param (setup_toshiba_delay, int,0 ); -/* -* NCR 5380 register access functions -*/ - -static inline char macscsi_read (struct Scsi_Host *instance,int reg) -{ -struct NCR5380_hostdata *hostdata =shost_priv (instance); - -return in_8 (hostdata->io + (reg <<4 )); -} - -static inline void macscsi_write (struct Scsi_Host *instance,int reg,int value) -{ -struct NCR5380_hostdata *hostdata =shost_priv (instance); - -out_8 (hostdata->io + (reg <<4 ), value); -} -#ifndef MODULE static int __init mac_scsi_setup (char *str) {
drivers/scsi/sun3_scsi.c +9 -23
@@ -43,8 +43,8 @@#define NCR5380_implementation_fields/* none */ -#define NCR5380_read (reg) sun3scsi_read(reg) -#define NCR5380_write (reg, value) sun3scsi_write(reg, value) +#define NCR5380_read (reg) in_8(hostdata->io + (reg)) +#define NCR5380_write (reg, value) out_8(hostdata->io + (reg), value)#define NCR5380_queue_command sun3scsi_queue_command#define NCR5380_bus_reset sun3scsi_bus_reset
@@ -82,7 +82,6 @@ module_param(setup_hostid, int, 0);#define SUN3_DVMA_BUFSIZE 0xe000static struct scsi_cmnd *sun3_dma_setup_done; -static unsigned char *sun3_scsi_regp;static volatile struct sun3_dma_regs *dregs;static struct sun3_udc_regs *udc_regs;static unsigned char *sun3_dma_orig_addr;
@@ -90,20 +89,6 @@ static unsigned long sun3_dma_orig_count;static int sun3_dma_active;static unsigned long last_residual; -/* -* NCR 5380 register access functions -*/ - -static inline unsigned char sun3scsi_read (int reg) -{ -return in_8 (sun3_scsi_regp + reg); -} - -static inline void sun3scsi_write (int reg,int value) -{ -out_8 (sun3_scsi_regp + reg, value); -} -#ifndef SUN3_SCSI_VME /* dma controller register access functions */
@@ -431,7 +416,7 @@ static int __init sun3_scsi_probe(struct platform_device *pdev)struct NCR5380_hostdata *hostdata;int error;struct resource *irq, *mem; -unsigned char *ioaddr; +void __iomem *ioaddr;int host_flags =0 ;#ifdef SUN3_SCSI_VME int i;
@@ -494,8 +479,6 @@ static int __init sun3_scsi_probe(struct platform_device *pdev) }#endif - sun3_scsi_regp = ioaddr; - instance =scsi_host_alloc (&sun3_scsi_template,sizeof (struct NCR5380_hostdata ));if (!instance) {
@@ -506,7 +489,8 @@ static int __init sun3_scsi_probe(struct platform_device *pdev) instance->irq = irq->start; hostdata =shost_priv (instance); - hostdata->base = (unsigned long )ioaddr; + hostdata->base = mem->start; + hostdata->io = ioaddr; error =NCR5380_init (instance, host_flags);if (error)
@@ -555,13 +539,15 @@ fail_init: fail_alloc:if (udc_regs)dvma_free (udc_regs); -iounmap (sun3_scsi_regp); +iounmap (ioaddr);return error; } static int __exit sun3_scsi_remove(struct platform_device *pdev) {struct Scsi_Host *instance =platform_get_drvdata (pdev); +struct NCR5380_hostdata *hostdata =shost_priv (instance); +void __iomem *ioaddr = hostdata->io;scsi_remove_host (instance);free_irq (instance->irq, instance);
@@ -569,7 +555,7 @@ static int __exit sun3_scsi_remove(struct platform_device *pdev)scsi_host_put (instance);if (udc_regs)dvma_free (udc_regs); -iounmap (sun3_scsi_regp); +iounmap (ioaddr);return 0 ; }
Signature · 1 line
2.7.3
PATCH v2 9/12 scsi/ncr5380: Pass hostdata pointer to register polling routines
In reply to Finn ThainPass a NCR5380_hostdata struct pointer to the board-specific routines instead of a Scsi_Host struct pointer. This reduces pointer chasing in the PIO and PDMA fast paths. The old way was a mistake because it is slow and the board-specific code is not concerned with the mid-layer.
--- drivers/scsi/NCR5380.c | 33 ++++++++++++++++----------------- drivers/scsi/NCR5380.h | 6 +++--- drivers/scsi/mac_scsi.c | 10 +++++----- 3 files changed, 24 insertions(+), 25 deletions(-)
drivers/scsi/NCR5380.c +16 -17
@@ -178,7 +178,7 @@ static inline void initialize_SCp(struct scsi_cmnd *cmd)/** * NCR5380_poll_politely2 - wait for two chip register values -* @instance: controller to poll +* @hostdata: host private data * @reg1: 5380 register to poll * @bit1: Bitmask to check * @val1: Expected value
@@ -195,12 +195,11 @@ static inline void initialize_SCp(struct scsi_cmnd *cmd)* Returns 0 if either or both event(s) occurred otherwise -ETIMEDOUT. */ -static int NCR5380_poll_politely2 (struct Scsi_Host *instance, +static int NCR5380_poll_politely2 (struct NCR5380_hostdata *hostdata,unsigned int reg1,u8 bit1,u8 val1,unsigned int reg2,u8 bit2,u8 val2,unsigned long wait) { -struct NCR5380_hostdata *hostdata =shost_priv (instance);unsigned long n = hostdata->poll_loops;unsigned long deadline = jiffies + wait;
@@ -561,7 +560,7 @@ static int NCR5380_maybe_reset_bus(struct Scsi_Host *instance)case 3 :case 5 :shost_printk (KERN_ERR , instance,"SCSI bus busy, waiting up to five seconds\n" ); -NCR5380_poll_politely (instance, +NCR5380_poll_politely (hostdata,STATUS_REG ,SR_BSY ,0 ,5 *HZ );break ;case 2 :
@@ -1076,7 +1075,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,*/ spin_unlock_irq (&hostdata->lock); - err =NCR5380_poll_politely2 (instance,MODE_REG ,MR_ARBITRATE ,0 , + err =NCR5380_poll_politely2 (hostdata,MODE_REG ,MR_ARBITRATE ,0 ,INITIATOR_COMMAND_REG ,ICR_ARBITRATION_PROGRESS ,ICR_ARBITRATION_PROGRESS ,HZ );spin_lock_irq (&hostdata->lock);
@@ -1202,7 +1201,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,* selection. */ - err =NCR5380_poll_politely (instance,STATUS_REG ,SR_BSY ,SR_BSY , + err =NCR5380_poll_politely (hostdata,STATUS_REG ,SR_BSY ,SR_BSY ,msecs_to_jiffies (250 ));if ((NCR5380_read (STATUS_REG ) & (SR_SEL |SR_IO )) == (SR_SEL |SR_IO )) {
@@ -1248,7 +1247,7 @@ static struct scsi_cmnd *NCR5380_select(struct Scsi_Host *instance,/* Wait for start of REQ/ACK handshake */ - err =NCR5380_poll_politely (instance,STATUS_REG ,SR_REQ ,SR_REQ ,HZ ); + err =NCR5380_poll_politely (hostdata,STATUS_REG ,SR_REQ ,SR_REQ ,HZ );spin_lock_irq (&hostdata->lock);if (err <0 ) {shost_printk (KERN_ERR , instance,"select: REQ timeout\n" );
@@ -1338,7 +1337,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance,* valid */ -if (NCR5380_poll_politely (instance,STATUS_REG ,SR_REQ ,SR_REQ ,HZ ) <0 ) +if (NCR5380_poll_politely (hostdata,STATUS_REG ,SR_REQ ,SR_REQ ,HZ ) <0 )break ;dsprintk (NDEBUG_HANDSHAKE , instance,"REQ asserted\n" );
@@ -1383,7 +1382,7 @@ static int NCR5380_transfer_pio(struct Scsi_Host *instance,NCR5380_write (INITIATOR_COMMAND_REG ,ICR_BASE |ICR_ASSERT_ACK ); } -if (NCR5380_poll_politely (instance, +if (NCR5380_poll_politely (hostdata,STATUS_REG ,SR_REQ ,0 ,5 *HZ ) <0 )break ;
@@ -1483,7 +1482,7 @@ static int do_abort(struct Scsi_Host *instance)* the target sees, so we just handshake. */ - rc =NCR5380_poll_politely (instance,STATUS_REG ,SR_REQ ,SR_REQ ,10 *HZ ); + rc =NCR5380_poll_politely (hostdata,STATUS_REG ,SR_REQ ,SR_REQ ,10 *HZ );if (rc <0 ) goto timeout;
@@ -1494,7 +1493,7 @@ static int do_abort(struct Scsi_Host *instance)if (tmp !=PHASE_MSGOUT ) {NCR5380_write (INITIATOR_COMMAND_REG ,ICR_BASE |ICR_ASSERT_ATN |ICR_ASSERT_ACK ); - rc =NCR5380_poll_politely (instance,STATUS_REG ,SR_REQ ,0 ,3 *HZ ); + rc =NCR5380_poll_politely (hostdata,STATUS_REG ,SR_REQ ,0 ,3 *HZ );if (rc <0 ) goto timeout;NCR5380_write (INITIATOR_COMMAND_REG ,ICR_BASE |ICR_ASSERT_ATN );
@@ -1682,12 +1681,12 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,* byte. */ -if (NCR5380_poll_politely (instance,BUS_AND_STATUS_REG , +if (NCR5380_poll_politely (hostdata,BUS_AND_STATUS_REG ,BASR_DRQ ,BASR_DRQ ,HZ ) <0 ) { result =-1 ;shost_printk (KERN_ERR , instance,"PDMA read: DRQ timeout\n" ); } -if (NCR5380_poll_politely (instance,STATUS_REG , +if (NCR5380_poll_politely (hostdata,STATUS_REG ,SR_REQ ,0 ,HZ ) <0 ) { result =-1 ;shost_printk (KERN_ERR , instance,"PDMA read: !REQ timeout\n" );
@@ -1698,7 +1697,7 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,* Wait for the last byte to be sent. If REQ is being asserted for * the byte we're interested, we'll ACK it and it will go false. */ -if (NCR5380_poll_politely2 (instance, +if (NCR5380_poll_politely2 (hostdata,BUS_AND_STATUS_REG ,BASR_DRQ ,BASR_DRQ ,BUS_AND_STATUS_REG ,BASR_PHASE_MATCH ,0 ,HZ ) <0 ) { result =-1 ;
@@ -2077,7 +2076,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) }/* switch(phase) */ }else {spin_unlock_irq (&hostdata->lock); -NCR5380_poll_politely (instance,STATUS_REG ,SR_REQ ,SR_REQ ,HZ ); +NCR5380_poll_politely (hostdata,STATUS_REG ,SR_REQ ,SR_REQ ,HZ );spin_lock_irq (&hostdata->lock); } }
@@ -2123,7 +2122,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance)*/ NCR5380_write (INITIATOR_COMMAND_REG ,ICR_BASE |ICR_ASSERT_BSY ); -if (NCR5380_poll_politely (instance, +if (NCR5380_poll_politely (hostdata,STATUS_REG ,SR_SEL ,0 ,2 *HZ ) <0 ) {NCR5380_write (INITIATOR_COMMAND_REG ,ICR_BASE );return ;
@@ -2134,7 +2133,7 @@ static void NCR5380_reselect(struct Scsi_Host *instance)* Wait for target to go into MSGIN. */ -if (NCR5380_poll_politely (instance, +if (NCR5380_poll_politely (hostdata,STATUS_REG ,SR_REQ ,SR_REQ ,2 *HZ ) <0 ) {do_abort (instance);return ;
drivers/scsi/NCR5380.h +3 -3
@@ -302,15 +302,15 @@ static void NCR5380_reselect(struct Scsi_Host *instance);static struct scsi_cmnd *NCR5380_select (struct Scsi_Host *,struct scsi_cmnd *);static int NCR5380_transfer_dma (struct Scsi_Host *instance,unsigned char *phase,int *count,unsigned char **data);static int NCR5380_transfer_pio (struct Scsi_Host *instance,unsigned char *phase,int *count,unsigned char **data); -static int NCR5380_poll_politely2 (struct Scsi_Host *, +static int NCR5380_poll_politely2 (struct NCR5380_hostdata *,unsigned int ,u8 ,u8 ,unsigned int ,u8 ,u8 ,unsigned long ); -static inline int NCR5380_poll_politely (struct Scsi_Host *instance, +static inline int NCR5380_poll_politely (struct NCR5380_hostdata *hostdata,unsigned int reg,u8 bit,u8 val,unsigned long wait) { -return NCR5380_poll_politely2 (instance, reg, bit, val, +return NCR5380_poll_politely2 (hostdata, reg, bit, val, reg, bit, val, wait); }
drivers/scsi/mac_scsi.c +5 -5
@@ -161,7 +161,7 @@ static int macscsi_pread(struct Scsi_Host *instance,int n = len;int transferred; -while (!NCR5380_poll_politely (instance,BUS_AND_STATUS_REG , +while (!NCR5380_poll_politely (hostdata,BUS_AND_STATUS_REG ,BASR_DRQ |BASR_PHASE_MATCH ,BASR_DRQ |BASR_PHASE_MATCH ,HZ /64 )) {CP_IO_TO_MEM (s, d, n);
@@ -174,7 +174,7 @@ static int macscsi_pread(struct Scsi_Host *instance,return 0 ;/* Target changed phase early? */ -if (NCR5380_poll_politely2 (instance,STATUS_REG ,SR_REQ ,SR_REQ , +if (NCR5380_poll_politely2 (hostdata,STATUS_REG ,SR_REQ ,SR_REQ ,BUS_AND_STATUS_REG ,BASR_ACK ,BASR_ACK ,HZ /64 ) <0 )scmd_printk (KERN_ERR , hostdata->connected,"%s: !REQ and !ACK\n" , __func__);
@@ -264,7 +264,7 @@ static int macscsi_pwrite(struct Scsi_Host *instance,int n = len;int transferred; -while (!NCR5380_poll_politely (instance,BUS_AND_STATUS_REG , +while (!NCR5380_poll_politely (hostdata,BUS_AND_STATUS_REG ,BASR_DRQ |BASR_PHASE_MATCH ,BASR_DRQ |BASR_PHASE_MATCH ,HZ /64 )) {CP_MEM_TO_IO (s, d, n);
@@ -273,7 +273,7 @@ static int macscsi_pwrite(struct Scsi_Host *instance, hostdata->pdma_residual = len - transferred;/* Target changed phase early? */ -if (NCR5380_poll_politely2 (instance,STATUS_REG ,SR_REQ ,SR_REQ , +if (NCR5380_poll_politely2 (hostdata,STATUS_REG ,SR_REQ ,SR_REQ ,BUS_AND_STATUS_REG ,BASR_ACK ,BASR_ACK ,HZ /64 ) <0 )scmd_printk (KERN_ERR , hostdata->connected,"%s: !REQ and !ACK\n" , __func__);
@@ -282,7 +282,7 @@ static int macscsi_pwrite(struct Scsi_Host *instance,/* No bus error. */ if (n ==0 ) { -if (NCR5380_poll_politely (instance,TARGET_COMMAND_REG , +if (NCR5380_poll_politely (hostdata,TARGET_COMMAND_REG ,TCR_LAST_BYTE_SENT ,TCR_LAST_BYTE_SENT ,HZ /64 ) <0 ) scmd_printk(KERN_ERR, hostdata->connected,
Signature · 1 line
2.7.3
PATCH v2 10/12 scsi/ncr5380: Expedite register polling
In reply to Finn ThainAvoid the call to NCR5380_poll_politely2() when possible. The call is easily short-circuited on the PIO fast path, using the inline wrapper. This requires that the NCR5380_read macro be made available before any #include "NCR5380.h" so a few declarations have to be moved too.
--- drivers/scsi/NCR5380.h | 3 +++ drivers/scsi/arm/cumana_1.c | 4 ++++ drivers/scsi/atari_scsi.c | 6 +++--- 3 files changed, 10 insertions(+), 3 deletions(-)
drivers/scsi/NCR5380.h +3 -0
@@ -310,6 +310,9 @@ static inline int NCR5380_poll_politely(struct NCR5380_hostdata *hostdata, unsigned int reg, u8 bit, u8 val, unsigned long wait) { + if ((NCR5380_read(reg) & bit) == val) + return 0; +return NCR5380_poll_politely2 (hostdata, reg, bit, val, reg, bit, val, wait); }
drivers/scsi/arm/cumana_1.c +4 -0
@@ -29,6 +29,10 @@#define NCR5380_implementation_fields \ unsigned ctrl +struct NCR5380_hostdata ; +static u8 cumanascsi_read (struct NCR5380_hostdata *,unsigned int ); +static void cumanascsi_write (struct NCR5380_hostdata *,unsigned int ,u8 ); +#include "../NCR5380.h" #define CTRL 0x16fc
drivers/scsi/atari_scsi.c +3 -3
@@ -57,6 +57,9 @@#define NCR5380_implementation_fields/* none */ +static u8 (*atari_scsi_reg_read)(unsigned int ); +static void (*atari_scsi_reg_write)(unsigned int ,u8 ); +#define NCR5380_read (reg) atari_scsi_reg_read(reg)#define NCR5380_write (reg, value) atari_scsi_reg_write(reg, value)
@@ -126,9 +129,6 @@ static inline unsigned long SCSI_DMA_GETADR(void)static void atari_scsi_fetch_restbytes (void ); -static u8 (*atari_scsi_reg_read)(unsigned int ); -static void (*atari_scsi_reg_write)(unsigned int ,u8 ); -static unsigned long atari_dma_residual, atari_dma_startaddr;static short atari_dma_active;/* pointer to the dribble buffer */
Signature · 1 line
2.7.3
PATCH v2 11/12 scsi/ncr5380: Use correct types for DMA routines
In reply to Finn ThainApply prototypes to get consistent function signatures for the DMA functions implemented in the board-specific drivers. To avoid using macros to alter actual parameters, some of those functions are reworked slightly.
This is a step toward the goal of passing the board-specific routines to the core driver using an ops struct (as in a platform driver or library module).
This also helps fix some inconsistent types: where the core driver uses ints (cmd->SCp.this_residual and hostdata->dma_len) for keeping track of transfers, certain board-specific routines used unsigned long.
While we are fixing these function signatures, pass the hostdata pointer to DMA routines instead of a Scsi_Host pointer, for shorter and faster code.
--- drivers/scsi/NCR5380.c | 74 +++++++++++++++++++++++++-------------------- drivers/scsi/NCR5380.h | 25 +++++++++++++++ drivers/scsi/arm/cumana_1.c | 26 ++++++++++------ drivers/scsi/arm/oak.c | 13 ++++---- drivers/scsi/atari_scsi.c | 45 +++++++++++++++------------ drivers/scsi/dmx3191d.c | 8 ++--- drivers/scsi/g_NCR5380.c | 13 +++----- drivers/scsi/g_NCR5380.h | 5 ++- drivers/scsi/mac_scsi.c | 36 +++++++++++----------- drivers/scsi/sun3_scsi.c | 45 +++++++++++++++++++-------- 10 files changed, 176 insertions(+), 114 deletions(-)
drivers/scsi/NCR5380.c +41 -33
@@ -121,9 +121,10 @@* * Either real DMA *or* pseudo DMA may be implemented * -* NCR5380_dma_write_setup(instance, src, count) - initialize -* NCR5380_dma_read_setup(instance, dst, count) - initialize -* NCR5380_dma_residual(instance); - residual count +* NCR5380_dma_xfer_len - determine size of DMA/PDMA transfer +* NCR5380_dma_send_setup - execute DMA/PDMA from memory to 5380 +* NCR5380_dma_recv_setup - execute DMA/PDMA from 5380 to memory +* NCR5380_dma_residual - residual byte count * * The generic driver is initialized by calling NCR5380_init(instance), * after setting the appropriate host specific fields and ID. If the
@@ -871,7 +872,7 @@ static void NCR5380_dma_complete(struct Scsi_Host *instance)NCR5380_write (INITIATOR_COMMAND_REG ,ICR_BASE );NCR5380_read (RESET_PARITY_INTERRUPT_REG ); - transferred = hostdata->dma_len -NCR5380_dma_residual (instance); + transferred = hostdata->dma_len -NCR5380_dma_residual (hostdata); hostdata->dma_len =0 ; data = (unsigned char **)&hostdata->connected->SCp.ptr;
@@ -1578,9 +1579,9 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,* starting the NCR. This is also the cleaner way for the TT. */ if (p &SR_IO ) - result =NCR5380_dma_recv_setup (instance, d, c); + result =NCR5380_dma_recv_setup (hostdata, d, c);else - result =NCR5380_dma_send_setup (instance, d, c); + result =NCR5380_dma_send_setup (hostdata, d, c); }/*
@@ -1612,9 +1613,9 @@ static int NCR5380_transfer_dma(struct Scsi_Host *instance,* NCR access, else the DMA setup gets trashed! */ if (p &SR_IO ) - result =NCR5380_dma_recv_setup (instance, d, c); + result =NCR5380_dma_recv_setup (hostdata, d, c);else - result =NCR5380_dma_send_setup (instance, d, c); + result =NCR5380_dma_send_setup (hostdata, d, c); }/* On failure, NCR5380_dma_xxxx_setup() returns a negative int. */
@@ -1754,22 +1755,26 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance)NCR5380_dprint_phase (NDEBUG_INFORMATION , instance); }#ifdef CONFIG_SUN3 -if (phase ==PHASE_CMDOUT ) { -void *d; -unsigned long count; +if (phase ==PHASE_CMDOUT && + sun3_dma_setup_done != cmd) { +int count;if (!cmd->SCp.this_residual && cmd->SCp.buffers_residual) { - count = cmd->SCp.buffer->length; - d =sg_virt (cmd->SCp.buffer); - }else { - count = cmd->SCp.this_residual; - d = cmd->SCp.ptr; + ++cmd->SCp.buffer; + --cmd->SCp.buffers_residual; + cmd->SCp.this_residual = cmd->SCp.buffer->length; + cmd->SCp.ptr =sg_virt (cmd->SCp.buffer); } -if (sun3_dma_setup_done != cmd && -sun3scsi_dma_xfer_len (count, cmd) >0 ) { -sun3scsi_dma_setup (instance, d, count, -rq_data_dir (cmd->request)); + count =sun3scsi_dma_xfer_len (hostdata, cmd); + +if (count >0 ) { +if (rq_data_dir (cmd->request)) +sun3scsi_dma_send_setup (hostdata, + cmd->SCp.ptr, count); +else +sun3scsi_dma_recv_setup (hostdata, + cmd->SCp.ptr, count); sun3_dma_setup_done = cmd; }#ifdef SUN3_SCSI_VME
@@ -1830,7 +1835,7 @@ static void NCR5380_information_transfer(struct Scsi_Host *instance) transfersize =0 ;if (!cmd->device->borken) - transfersize =NCR5380_dma_xfer_len (instance, cmd, phase); + transfersize =NCR5380_dma_xfer_len (hostdata, cmd);if (transfersize >0 ) { len = transfersize;
@@ -2207,22 +2212,25 @@ static void NCR5380_reselect(struct Scsi_Host *instance) }#ifdef CONFIG_SUN3 - { -void *d; -unsigned long count; +if (sun3_dma_setup_done != tmp) { +int count;if (!tmp->SCp.this_residual && tmp->SCp.buffers_residual) { - count = tmp->SCp.buffer->length; - d =sg_virt (tmp->SCp.buffer); - }else { - count = tmp->SCp.this_residual; - d = tmp->SCp.ptr; + ++tmp->SCp.buffer; + --tmp->SCp.buffers_residual; + tmp->SCp.this_residual = tmp->SCp.buffer->length; + tmp->SCp.ptr =sg_virt (tmp->SCp.buffer); } -if (sun3_dma_setup_done != tmp && -sun3scsi_dma_xfer_len (count, tmp) >0 ) { -sun3scsi_dma_setup (instance, d, count, -rq_data_dir (tmp->request)); + count =sun3scsi_dma_xfer_len (hostdata, tmp); + +if (count >0 ) { +if (rq_data_dir (tmp->request)) +sun3scsi_dma_send_setup (hostdata, + tmp->SCp.ptr, count); +else +sun3scsi_dma_recv_setup (hostdata, + tmp->SCp.ptr, count); sun3_dma_setup_done = tmp; } }
drivers/scsi/NCR5380.h +25 -0
@@ -317,5 +317,30 @@ static inline int NCR5380_poll_politely(struct NCR5380_hostdata *hostdata, reg, bit, val, wait); } +static int NCR5380_dma_xfer_len (struct NCR5380_hostdata *, +struct scsi_cmnd *); +static int NCR5380_dma_send_setup (struct NCR5380_hostdata *, +unsigned char *,int ); +static int NCR5380_dma_recv_setup (struct NCR5380_hostdata *, +unsigned char *,int ); +static int NCR5380_dma_residual (struct NCR5380_hostdata *); + +static inline int NCR5380_dma_xfer_none (struct NCR5380_hostdata *hostdata, +struct scsi_cmnd *cmd) +{ +return 0 ; +} + +static inline int NCR5380_dma_setup_none (struct NCR5380_hostdata *hostdata, +unsigned char *data,int count) +{ +return 0 ; +} + +static inline int NCR5380_dma_residual_none (struct NCR5380_hostdata *hostdata) +{ +return 0 ; +} +#endif /* __KERNEL__ */ #endif /* NCR5380_H */
drivers/scsi/arm/cumana_1.c +16 -10
@@ -17,10 +17,10 @@#define NCR5380_read (reg) cumanascsi_read(hostdata, reg)#define NCR5380_write (reg, value) cumanascsi_write(hostdata, reg, value) -#define NCR5380_dma_xfer_len (instance, cmd, phase) (cmd->transfersize) +#define NCR5380_dma_xfer_len cumanascsi_dma_xfer_len#define NCR5380_dma_recv_setup cumanascsi_pread#define NCR5380_dma_send_setup cumanascsi_pwrite -#define NCR5380_dma_residual (instance) (0) +#define NCR5380_dma_residual NCR5380_dma_residual_none#define NCR5380_intr cumanascsi_intr#define NCR5380_queue_command cumanascsi_queue_command
@@ -40,12 +40,12 @@ static void cumanascsi_write(struct NCR5380_hostdata *, unsigned int, u8);#define L (v) (((v)<<16)|((v) & 0x0000ffff))#define H (v) (((v)>>16)|((v) & 0xffff0000)) -static inline int cumanascsi_pwrite (struct Scsi_Host *host, +static inline int cumanascsi_pwrite (struct NCR5380_hostdata *hostdata,unsigned char *addr,int len) {unsigned long *laddr; -u8 __iomem *base =priv (host)->io; -u8 __iomem *dma =priv (host)->pdma_io +0x2000 ; +u8 __iomem *base = hostdata->io; +u8 __iomem *dma = hostdata->pdma_io +0x2000 ;if (!len)return 0 ;
@@ -100,19 +100,19 @@ static inline int cumanascsi_pwrite(struct Scsi_Host *host, } } end: -writeb (priv (host)->ctrl |0x40 , base +CTRL ); +writeb (hostdata->ctrl |0x40 , base +CTRL );if (len)return -1 ;return 0 ; } -static inline int cumanascsi_pread (struct Scsi_Host *host, +static inline int cumanascsi_pread (struct NCR5380_hostdata *hostdata,unsigned char *addr,int len) {unsigned long *laddr; -u8 __iomem *base =priv (host)->io; -u8 __iomem *dma =priv (host)->pdma_io +0x2000 ; +u8 __iomem *base = hostdata->io; +u8 __iomem *dma = hostdata->pdma_io +0x2000 ;if (!len)return 0 ;
@@ -166,13 +166,19 @@ static inline int cumanascsi_pread(struct Scsi_Host *host, } } end: -writeb (priv (host)->ctrl |0x40 , base +CTRL ); +writeb (hostdata->ctrl |0x40 , base +CTRL );if (len)return -1 ;return 0 ; } +static int cumanascsi_dma_xfer_len (struct NCR5380_hostdata *hostdata, +struct scsi_cmnd *cmd) +{ +return cmd->transfersize; +} +static u8 cumanascsi_read (struct NCR5380_hostdata *hostdata,unsigned int reg) {
drivers/scsi/arm/oak.c +7 -6
@@ -19,10 +19,10 @@#define NCR5380_read (reg) readb(hostdata->io + ((reg) << 2))#define NCR5380_write (reg, value) writeb(value, hostdata->io + ((reg) << 2)) -#define NCR5380_dma_xfer_len (instance, cmd, phase) (0) +#define NCR5380_dma_xfer_len NCR5380_dma_xfer_none#define NCR5380_dma_recv_setup oakscsi_pread#define NCR5380_dma_send_setup oakscsi_pwrite -#define NCR5380_dma_residual (instance) (0) +#define NCR5380_dma_residual NCR5380_dma_residual_none#define NCR5380_queue_command oakscsi_queue_command#define NCR5380_info oakscsi_info
@@ -37,10 +37,10 @@#define STAT ((128 + 16) << 2)#define DATA ((128 + 8) << 2) -static inline int oakscsi_pwrite (struct Scsi_Host *instance, +static inline int oakscsi_pwrite (struct NCR5380_hostdata *hostdata,unsigned char *addr,int len) { -u8 __iomem *base =priv (instance)->io; +u8 __iomem *base = hostdata->io;printk ("writing %p len %d\n" ,addr, len);
@@ -52,10 +52,11 @@ printk("writing %p len %d\n",addr, len);return 0 ; } -static inline int oakscsi_pread (struct Scsi_Host *instance, +static inline int oakscsi_pread (struct NCR5380_hostdata *hostdata,unsigned char *addr,int len) { -u8 __iomem *base =priv (instance)->io; +u8 __iomem *base = hostdata->io; +printk ("reading %p len %d\n" , addr, len);while (len >0 ) {
drivers/scsi/atari_scsi.c +26 -19
88 lines not on this page · raw message
drivers/scsi/dmx3191d.c +4 -4
@@ -37,10 +37,10 @@#define NCR5380_read (reg) inb(hostdata->base + (reg))#define NCR5380_write (reg, value) outb(value, hostdata->base + (reg)) -#define NCR5380_dma_xfer_len (instance, cmd, phase) (0) -#define NCR5380_dma_recv_setup (instance, dst, len) (0) -#define NCR5380_dma_send_setup (instance, src, len) (0) -#define NCR5380_dma_residual (instance) (0) +#define NCR5380_dma_xfer_len NCR5380_dma_xfer_none +#define NCR5380_dma_recv_setup NCR5380_dma_setup_none +#define NCR5380_dma_send_setup NCR5380_dma_setup_none +#define NCR5380_dma_residual NCR5380_dma_residual_none#define NCR5380_implementation_fields/* none */
drivers/scsi/g_NCR5380.c +5 -8
@@ -332,7 +332,7 @@ static void generic_NCR5380_release_resources(struct Scsi_Host *instance)/** * generic_NCR5380_pread - pseudo DMA read -* @instance: adapter to read from +* @hostdata: scsi host private data * @dst: buffer to read into * @len: buffer length *
@@ -340,10 +340,9 @@ static void generic_NCR5380_release_resources(struct Scsi_Host *instance)* controller */ -static inline int generic_NCR5380_pread (struct Scsi_Host *instance, +static inline int generic_NCR5380_pread (struct NCR5380_hostdata *hostdata,unsigned char *dst,int len) { -struct NCR5380_hostdata *hostdata =shost_priv (instance);int blocks = len /128 ;int start =0 ;
@@ -406,7 +405,7 @@ static inline int generic_NCR5380_pread(struct Scsi_Host *instance,/** * generic_NCR5380_pwrite - pseudo DMA write -* @instance: adapter to read from +* @hostdata: scsi host private data * @dst: buffer to read into * @len: buffer length *
@@ -414,10 +413,9 @@ static inline int generic_NCR5380_pread(struct Scsi_Host *instance,* controller */ -static inline int generic_NCR5380_pwrite (struct Scsi_Host *instance, +static inline int generic_NCR5380_pwrite (struct NCR5380_hostdata *hostdata,unsigned char *src,int len) { -struct NCR5380_hostdata *hostdata =shost_priv (instance);int blocks = len /128 ;int start =0 ;
@@ -480,10 +478,9 @@ static inline int generic_NCR5380_pwrite(struct Scsi_Host *instance,return 0 ; } -static int generic_NCR5380_dma_xfer_len (struct Scsi_Host *instance, +static int generic_NCR5380_dma_xfer_len (struct NCR5380_hostdata *hostdata,struct scsi_cmnd *cmd) { -struct NCR5380_hostdata *hostdata =shost_priv (instance);int transfersize = cmd->transfersize;if (hostdata->flags &FLAG_NO_PSEUDO_DMA )
drivers/scsi/g_NCR5380.h +2 -3
@@ -32,11 +32,10 @@#define NCR53C400_host_buffer 0x3900#define NCR53C400_region_size 0x3a00 -#define NCR5380_dma_xfer_len (instance, cmd, phase) \ - generic_NCR5380_dma_xfer_len(instance, cmd) +#define NCR5380_dma_xfer_len generic_NCR5380_dma_xfer_len#define NCR5380_dma_recv_setup generic_NCR5380_pread#define NCR5380_dma_send_setup generic_NCR5380_pwrite -#define NCR5380_dma_residual (instance) (0) +#define NCR5380_dma_residual NCR5380_dma_residual_none#define NCR5380_intr generic_NCR5380_intr#define NCR5380_queue_command generic_NCR5380_queue_command
drivers/scsi/mac_scsi.c +18 -18
@@ -33,11 +33,10 @@#define NCR5380_read (reg) in_8(hostdata->io + ((reg) << 4))#define NCR5380_write (reg, value) out_8(hostdata->io + ((reg) << 4), value) -#define NCR5380_dma_xfer_len (instance, cmd, phase) \ - macscsi_dma_xfer_len(instance, cmd) +#define NCR5380_dma_xfer_len macscsi_dma_xfer_len#define NCR5380_dma_recv_setup macscsi_pread#define NCR5380_dma_send_setup macscsi_pwrite -#define NCR5380_dma_residual (instance) (hostdata->pdma_residual) +#define NCR5380_dma_residual macscsi_dma_residual#define NCR5380_intr macscsi_intr#define NCR5380_queue_command macscsi_queue_command
@@ -152,10 +151,9 @@ __asm__ __volatile__ \ : "0"(s), "1"(d), "2"(n) \ : "d0") -static int macscsi_pread (struct Scsi_Host *instance, -unsigned char *dst,int len) +static inline int macscsi_pread (struct NCR5380_hostdata *hostdata, +unsigned char *dst,int len) { -struct NCR5380_hostdata *hostdata =shost_priv (instance);unsigned char *s = hostdata->pdma_io + (INPUT_DATA_REG <<4 );unsigned char *d = dst;int n = len;
@@ -181,16 +179,16 @@ static int macscsi_pread(struct Scsi_Host *instance,if (!(NCR5380_read (BUS_AND_STATUS_REG ) &BASR_PHASE_MATCH ))return 0 ; -dsprintk (NDEBUG_PSEUDO_DMA , instance, +dsprintk (NDEBUG_PSEUDO_DMA , hostdata->host,"%s: bus error (%d/%d)\n" , __func__, transferred, len); -NCR5380_dprint (NDEBUG_PSEUDO_DMA , instance); +NCR5380_dprint (NDEBUG_PSEUDO_DMA , hostdata->host); d = dst + transferred; n = len - transferred; }scmd_printk (KERN_ERR , hostdata->connected,"%s: phase mismatch or !DRQ\n" , __func__); -NCR5380_dprint (NDEBUG_PSEUDO_DMA , instance); +NCR5380_dprint (NDEBUG_PSEUDO_DMA , hostdata->host);return -1 ; }
@@ -255,10 +253,9 @@ __asm__ __volatile__ \ : "0"(s), "1"(d), "2"(n) \ : "d0") -static int macscsi_pwrite (struct Scsi_Host *instance, -unsigned char *src,int len) +static inline int macscsi_pwrite (struct NCR5380_hostdata *hostdata, +unsigned char *src,int len) { -struct NCR5380_hostdata *hostdata =shost_priv (instance);unsigned char *s = src;unsigned char *d = hostdata->pdma_io + (OUTPUT_DATA_REG <<4 );int n = len;
@@ -290,25 +287,23 @@ static int macscsi_pwrite(struct Scsi_Host *instance,return 0 ; } -dsprintk (NDEBUG_PSEUDO_DMA , instance, +dsprintk (NDEBUG_PSEUDO_DMA , hostdata->host,"%s: bus error (%d/%d)\n" , __func__, transferred, len); -NCR5380_dprint (NDEBUG_PSEUDO_DMA , instance); +NCR5380_dprint (NDEBUG_PSEUDO_DMA , hostdata->host); s = src + transferred; n = len - transferred; }scmd_printk (KERN_ERR , hostdata->connected,"%s: phase mismatch or !DRQ\n" , __func__); -NCR5380_dprint (NDEBUG_PSEUDO_DMA , instance); +NCR5380_dprint (NDEBUG_PSEUDO_DMA , hostdata->host);return -1 ; } -static int macscsi_dma_xfer_len (struct Scsi_Host *instance, +static int macscsi_dma_xfer_len (struct NCR5380_hostdata *hostdata,struct scsi_cmnd *cmd) { -struct NCR5380_hostdata *hostdata =shost_priv (instance); -if (hostdata->flags &FLAG_NO_PSEUDO_DMA || cmd->SCp.this_residual <16 )return 0 ;
@@ -316,6 +311,11 @@ static int macscsi_dma_xfer_len(struct Scsi_Host *instance,return cmd->SCp.this_residual; } +static int macscsi_dma_residual (struct NCR5380_hostdata *hostdata) +{ +return hostdata->pdma_residual; +} +#include "NCR5380.c" #define DRV_MODULE_NAME "mac_scsi"
drivers/scsi/sun3_scsi.c +32 -13
75 lines not on this page · raw message
Signature · 1 line
2.7.3
PATCH v2 12/12 scsi/ncr5380: Suppress unhelpful "interrupt without IRQ bit" message
In reply to Finn ThainIf a NCR5380 host instance ends up on a shared interrupt line then this printk will be a problem. It is already a problem on some Mac
models: when testing mac_scsi on a PowerBook 180 I found that PDMA transfers (but not PIO transfers) cause the message to be logged.
These spurious interrupts don't appear to come from the DRQ signal from the 5380. And they don't happen at all on the Mac LC III. A comment in the NetBSD source code mentions this mystery. Testing seems to show that we can safely ignore these interrupts.
--- drivers/scsi/NCR5380.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/NCR5380.c +1 -1
@@ -995,7 +995,7 @@ static irqreturn_t __maybe_unused NCR5380_intr(int irq, void *dev_id) } handled =1 ; }else { -shost_printk (KERN_NOTICE , instance,"interrupt without IRQ bit\n" ); +dsprintk (NDEBUG_INTR , instance,"interrupt without IRQ bit\n" );#ifdef SUN3_SCSI_VME dregs->csr |=CSR_DMA_ENABLE ;#endif
Signature · 1 line
2.7.3
Quoted 14 lines · On Friday 07 October 2016 01:41:06 Finn Thain wrote:
This patch series has fixes for compatibility, reliability and performance issues and some cleanup. It also includes a new version of Ondrej Zary's patch that merges
g_NCR5380_mmiointog_NCR5380.I've tested this patch series on a Powerbook 180. If someone would test some of the other platforms that would be very helpful. All drivers were compile-tested.
Changes since v1:
- rebased on 4.9/scsi-queue
- added reviewed-by tags
- tweaked the order of struct members in patch 7/12
Quoted 14 lines
Finn Thain (12):
scsi/g_NCR5380: Mergeg_NCR5380andg_NCR5380_mmiodrivers scsi/cumana_1: Remove unusedcumanascsi_setup()function scsi/atari_scsi: Make device register accessors re-enterant scsi/ncr5380: Simplify register polling limit scsi/ncr5380: Increase register polling limit scsi/ncr5380: Improve hostdata struct member alignment and
cache-ability
scsi/ncr5380: Store IO ports and addresses in host private data scsi/ncr5380: Use correct types for device register accessors scsi/ncr5380: Pass hostdata pointer to register polling routines scsi/ncr5380: Expedite register polling
scsi/ncr5380: Use correct types for DMA routines scsi/ncr5380: Suppress unhelpful "interrupt without IRQ bit" message
Tested on HP C2502 (53C400A chip), Canon FG2-5202 (53C400 chip) and DTC-3181L (DTCT-436P chip) ISA cards - everything works fine!
Thanks.
Signature · 1 line
Ondrej Zary
Quoted 14 lines
This patch series has fixes for compatibility, reliability and performance issues and some cleanup. It also includes a new version of Ondrej Zary's patch that merges
g_NCR5380_mmiointog_NCR5380.I've tested this patch series on a Powerbook 180. If someone would test some of the other platforms that would be very helpful. All drivers were compile-tested.
Changes since v1:
- rebased on 4.9/scsi-queue
- added reviewed-by tags
- tweaked the order of struct members in patch 7/12
Quoted 14 lines
Finn Thain (12):
scsi/g_NCR5380: Mergeg_NCR5380andg_NCR5380_mmiodrivers scsi/cumana_1: Remove unusedcumanascsi_setup()function scsi/atari_scsi: Make device register accessors re-enterant scsi/ncr5380: Simplify register polling limit scsi/ncr5380: Increase register polling limit scsi/ncr5380: Improve hostdata struct member alignment and
cache-ability
scsi/ncr5380: Store IO ports and addresses in host private data scsi/ncr5380: Use correct types for device register accessors scsi/ncr5380: Pass hostdata pointer to register polling routines scsi/ncr5380: Expedite register polling
scsi/ncr5380: Use correct types for DMA routines scsi/ncr5380: Suppress unhelpful "interrupt without IRQ bit" message
Tested on Atari SCSI (Falcon) - no regressions.