Commit 820682b1 authored by Finn Thain's avatar Finn Thain Committed by Martin K. Petersen
Browse files

scsi: ncr5380: Store IO ports and addresses in host private data



The 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.

Signed-off-by: default avatarFinn Thain <fthain@telegraphics.com.au>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Tested-by: default avatarOndrej Zary <linux@rainbow-software.org>
Tested-by: default avatarMichael Schmitz <schmitzmic@gmail.com>
Acked-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 25894d1f
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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 "     : "",
+5 −0
Original line number Diff line number Diff line
@@ -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];
};

+31 −29
Original line number Diff line number Diff line
@@ -27,9 +27,7 @@
#define NCR5380_info			cumanascsi_info

#define NCR5380_implementation_fields	\
	unsigned ctrl;			\
	void __iomem *base;		\
	void __iomem *dma
	unsigned ctrl

#include "../NCR5380.h"

@@ -42,17 +40,18 @@ static inline int cumanascsi_pwrite(struct Scsi_Host *host,
                                    unsigned char *addr, int len)
{
  unsigned long *laddr;
  void __iomem *dma = priv(host)->dma + 0x2000;
  u8 __iomem *base = priv(host)->io;
  u8 __iomem *dma = priv(host)->pdma_io + 0x2000;

  if(!len) return 0;

  writeb(0x02, priv(host)->base + CTRL);
  writeb(0x02, base + CTRL);
  laddr = (unsigned long *)addr;
  while(len >= 32)
  {
    unsigned int status;
    unsigned long v;
    status = readb(priv(host)->base + STAT);
    status = readb(base + STAT);
    if(status & 0x80)
      goto end;
    if(!(status & 0x40))
@@ -71,12 +70,12 @@ static inline int cumanascsi_pwrite(struct Scsi_Host *host,
  }

  addr = (unsigned char *)laddr;
  writeb(0x12, priv(host)->base + CTRL);
  writeb(0x12, base + CTRL);

  while(len > 0)
  {
    unsigned int status;
    status = readb(priv(host)->base + STAT);
    status = readb(base + STAT);
    if(status & 0x80)
      goto end;
    if(status & 0x40)
@@ -86,7 +85,7 @@ static inline int cumanascsi_pwrite(struct Scsi_Host *host,
        break;
    }

    status = readb(priv(host)->base + STAT);
    status = readb(base + STAT);
    if(status & 0x80)
      goto end;
    if(status & 0x40)
@@ -97,7 +96,7 @@ static inline int cumanascsi_pwrite(struct Scsi_Host *host,
    }
  }
end:
  writeb(priv(host)->ctrl | 0x40, priv(host)->base + CTRL);
  writeb(priv(host)->ctrl | 0x40, base + CTRL);

	if (len)
		return -1;
@@ -108,16 +107,17 @@ static inline int cumanascsi_pread(struct Scsi_Host *host,
                                   unsigned char *addr, int len)
{
  unsigned long *laddr;
  void __iomem *dma = priv(host)->dma + 0x2000;
  u8 __iomem *base = priv(host)->io;
  u8 __iomem *dma = priv(host)->pdma_io + 0x2000;

  if(!len) return 0;

  writeb(0x00, priv(host)->base + CTRL);
  writeb(0x00, base + CTRL);
  laddr = (unsigned long *)addr;
  while(len >= 32)
  {
    unsigned int status;
    status = readb(priv(host)->base + STAT);
    status = readb(base + STAT);
    if(status & 0x80)
      goto end;
    if(!(status & 0x40))
@@ -136,12 +136,12 @@ static inline int cumanascsi_pread(struct Scsi_Host *host,
  }

  addr = (unsigned char *)laddr;
  writeb(0x10, priv(host)->base + CTRL);
  writeb(0x10, base + CTRL);

  while(len > 0)
  {
    unsigned int status;
    status = readb(priv(host)->base + STAT);
    status = readb(base + STAT);
    if(status & 0x80)
      goto end;
    if(status & 0x40)
@@ -151,7 +151,7 @@ static inline int cumanascsi_pread(struct Scsi_Host *host,
        break;
    }

    status = readb(priv(host)->base + STAT);
    status = readb(base + STAT);
    if(status & 0x80)
      goto end;
    if(status & 0x40)
@@ -162,7 +162,7 @@ static inline int cumanascsi_pread(struct Scsi_Host *host,
    }
  }
end:
  writeb(priv(host)->ctrl | 0x40, priv(host)->base + CTRL);
  writeb(priv(host)->ctrl | 0x40, base + CTRL);

	if (len)
		return -1;
@@ -171,7 +171,7 @@ static inline int cumanascsi_pread(struct Scsi_Host *host,

static unsigned char cumanascsi_read(struct Scsi_Host *host, unsigned int reg)
{
	void __iomem *base = priv(host)->base;
	u8 __iomem *base = priv(host)->io;
	unsigned char val;

	writeb(0, base + CTRL);
@@ -186,7 +186,7 @@ static unsigned char cumanascsi_read(struct Scsi_Host *host, unsigned int reg)

static void cumanascsi_write(struct Scsi_Host *host, unsigned int reg, unsigned int value)
{
	void __iomem *base = priv(host)->base;
	u8 __iomem *base = priv(host)->io;

	writeb(0, base + CTRL);

@@ -231,11 +231,11 @@ static int cumanascsi1_probe(struct expansion_card *ec,
		goto out_release;
	}

	priv(host)->base = ioremap(ecard_resource_start(ec, ECARD_RES_IOCSLOW),
	priv(host)->io = ioremap(ecard_resource_start(ec, ECARD_RES_IOCSLOW),
	                         ecard_resource_len(ec, ECARD_RES_IOCSLOW));
	priv(host)->dma = ioremap(ecard_resource_start(ec, ECARD_RES_MEMC),
	priv(host)->pdma_io = ioremap(ecard_resource_start(ec, ECARD_RES_MEMC),
	                              ecard_resource_len(ec, ECARD_RES_MEMC));
	if (!priv(host)->base || !priv(host)->dma) {
	if (!priv(host)->io || !priv(host)->pdma_io) {
		ret = -ENOMEM;
		goto out_unmap;
	}
@@ -249,7 +249,7 @@ static int cumanascsi1_probe(struct expansion_card *ec,
	NCR5380_maybe_reset_bus(host);

        priv(host)->ctrl = 0;
        writeb(0, priv(host)->base + CTRL);
        writeb(0, priv(host)->io + CTRL);

	ret = request_irq(host->irq, cumanascsi_intr, 0,
			  "CumanaSCSI-1", host);
@@ -271,8 +271,8 @@ static int cumanascsi1_probe(struct expansion_card *ec,
 out_exit:
	NCR5380_exit(host);
 out_unmap:
	iounmap(priv(host)->base);
	iounmap(priv(host)->dma);
	iounmap(priv(host)->io);
	iounmap(priv(host)->pdma_io);
	scsi_host_put(host);
 out_release:
	ecard_release_resources(ec);
@@ -283,15 +283,17 @@ static int cumanascsi1_probe(struct expansion_card *ec,
static void cumanascsi1_remove(struct expansion_card *ec)
{
	struct Scsi_Host *host = ecard_get_drvdata(ec);
	void __iomem *base = priv(host)->io;
	void __iomem *dma = priv(host)->pdma_io;

	ecard_set_drvdata(ec, NULL);

	scsi_remove_host(host);
	free_irq(host->irq, host);
	NCR5380_exit(host);
	iounmap(priv(host)->base);
	iounmap(priv(host)->dma);
	scsi_host_put(host);
	iounmap(base);
	iounmap(dma);
	ecard_release_resources(ec);
}

+11 −12
Original line number Diff line number Diff line
@@ -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),
	priv(host)->io = ioremap(ecard_resource_start(ec, ECARD_RES_MEMC),
	                         ecard_resource_len(ec, ECARD_RES_MEMC));
	if (!priv(host)->base) {
	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);
}

+10 −4
Original line number Diff line number Diff line
@@ -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 @@ static int dmx3191d_probe_one(struct pci_dev *pdev,
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);

Loading