Restructure the 53c700-based drivers so that:

 - They call scsi_host_alloc themselves rather than leaving it to
   NCR_700_detect.
 - NCR_700_detect now returns an int error rather than NULL, allowing
   drivers to do better error handling
 - hostdata is now allocated with the Scsi_Host rather than separately.
   Fixes a bug on 64-bit systems.
 - hostdata now accessed through shost_priv()
 - They handle calling scsi_host_put themselves at the appropriate time
   to avoid leaking Scsi_Hosts
 - Use of host->irq is avoided where possible

Signed-off-by: Matthew Wilcox <[EMAIL PROTECTED]>

diff --git a/drivers/scsi/53c700.c b/drivers/scsi/53c700.c
index 71ff3fb..19431de 100644
--- a/drivers/scsi/53c700.c
+++ b/drivers/scsi/53c700.c
@@ -275,33 +275,31 @@ NCR_700_offset_period_to_sxfer(struct 
NCR_700_Host_Parameters *hostdata,
 static inline __u8
 NCR_700_get_SXFER(struct scsi_device *SDp)
 {
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(SDp->host);
 
        return NCR_700_offset_period_to_sxfer(hostdata,
                                              spi_offset(SDp->sdev_target),
                                              spi_period(SDp->sdev_target));
 }
 
-struct Scsi_Host *
-NCR_700_detect(struct scsi_host_template *tpnt,
-              struct NCR_700_Host_Parameters *hostdata, struct device *dev)
+int NCR_700_detect(struct Scsi_Host *host, struct device *dev)
 {
        dma_addr_t pScript, pSlots;
        __u8 *memory;
        __u32 *script;
-       struct Scsi_Host *host;
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
+       struct scsi_host_template *tpnt = host->hostt;
        static int banner = 0;
-       int j;
+       int j, error;
 
-       if(tpnt->sdev_attrs == NULL)
+       if (!tpnt->sdev_attrs)
                tpnt->sdev_attrs = NCR_700_dev_attrs;
 
        memory = dma_alloc_noncoherent(hostdata->dev, TOTAL_MEM_SIZE,
                                       &pScript, GFP_KERNEL);
-       if(memory == NULL) {
-               printk(KERN_ERR "53c700: Failed to allocate memory for driver, 
detatching\n");
-               return NULL;
+       if (!memory) {
+               printk(KERN_ERR "53c700: Failed to allocate memory for driver, 
detaching\n");
+               return -ENOMEM;;
        }
 
        script = (__u32 *)memory;
@@ -336,9 +334,6 @@ NCR_700_detect(struct scsi_host_template *tpnt,
        if(tpnt->proc_name == NULL)
                tpnt->proc_name = "53c700";
 
-       host = scsi_host_alloc(tpnt, 4);
-       if (!host)
-               return NULL;
        memset(hostdata->slots, 0, sizeof(struct NCR_700_command_slot)
               * NCR_700_COMMAND_SLOTS_PER_HOST);
        for (j = 0; j < NCR_700_COMMAND_SLOTS_PER_HOST; j++) {
@@ -397,23 +392,22 @@ NCR_700_detect(struct scsi_host_template *tpnt,
        /* reset the chip */
        NCR_700_chip_reset(host);
 
-       if (scsi_add_host(host, dev)) {
+       error = scsi_add_host(host, dev);
+       if (error) {
                dev_printk(KERN_ERR, dev, "53c700: scsi_add_host failed\n");
-               scsi_host_put(host);
-               return NULL;
+               return error;
        }
 
        spi_signalling(host) = hostdata->differential ? SPI_SIGNAL_HVD :
                SPI_SIGNAL_SE;
 
-       return host;
+       return 0;
 }
 
 int
 NCR_700_release(struct Scsi_Host *host)
 {
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
 
        dma_free_noncoherent(hostdata->dev, TOTAL_MEM_SIZE,
                               hostdata->script, hostdata->pScript);
@@ -440,8 +434,7 @@ NCR_700_identify(int can_disconnect, __u8 lun)
  * Inputs : host - SCSI host */
 static inline int
 NCR_700_data_residual (struct Scsi_Host *host) {
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
        int count, synchronous = 0;
        unsigned int ddir;
 
@@ -649,8 +642,7 @@ NCR_700_internal_bus_reset(struct Scsi_Host *host)
 STATIC void
 NCR_700_chip_setup(struct Scsi_Host *host)
 {
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
        __u8 min_period;
        __u8 min_xferp = (hostdata->chip710 ? NCR_710_MIN_XFERP : 
NCR_700_MIN_XFERP);
 
@@ -759,8 +751,7 @@ NCR_700_chip_setup(struct Scsi_Host *host)
 STATIC void
 NCR_700_chip_reset(struct Scsi_Host *host)
 {
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
        if(hostdata->chip710) {
                NCR_700_writeb(SOFTWARE_RESET_710, host, ISTAT_REG);
                udelay(100);
@@ -1286,8 +1277,7 @@ process_selection(struct Scsi_Host *host, __u32 dsp)
        __u8 id = 0;    /* Squash compiler warning */
        int count = 0;
        __u32 resume_offset = 0;
-       struct NCR_700_Host_Parameters *hostdata =
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
        struct scsi_cmnd *SCp = hostdata->cmd;
        __u8 sbcl;
 
@@ -1363,8 +1353,7 @@ process_selection(struct Scsi_Host *host, __u32 dsp)
 
 static inline void
 NCR_700_clear_fifo(struct Scsi_Host *host) {
-       const struct NCR_700_Host_Parameters *hostdata
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       const struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
        if(hostdata->chip710) {
                NCR_700_writeb(CLR_FIFO_710, host, CTEST8_REG);
        } else {
@@ -1374,8 +1363,7 @@ NCR_700_clear_fifo(struct Scsi_Host *host) {
 
 static inline void
 NCR_700_flush_fifo(struct Scsi_Host *host) {
-       const struct NCR_700_Host_Parameters *hostdata
-               = (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       const struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
        if(hostdata->chip710) {
                NCR_700_writeb(FLUSH_DMA_FIFO_710, host, CTEST8_REG);
                udelay(10);
@@ -1396,7 +1384,7 @@ NCR_700_start_command(struct scsi_cmnd *SCp)
        struct NCR_700_command_slot *slot =
                (struct NCR_700_command_slot *)SCp->host_scribble;
        struct NCR_700_Host_Parameters *hostdata =
-               (struct NCR_700_Host_Parameters 
*)SCp->device->host->hostdata[0];
+                                               shost_priv(SCp->device->host);
        __u16 count = 1;        /* for IDENTIFY message */
        
        if(hostdata->state != NCR_700_HOST_FREE) {
@@ -1482,8 +1470,7 @@ irqreturn_t
 NCR_700_intr(int irq, void *dev_id)
 {
        struct Scsi_Host *host = (struct Scsi_Host *)dev_id;
-       struct NCR_700_Host_Parameters *hostdata =
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
        __u8 istat;
        __u32 resume_offset = 0;
        __u8 pun = 0xff, lun = 0xff;
@@ -1753,8 +1740,8 @@ NCR_700_intr(int irq, void *dev_id)
 STATIC int
 NCR_700_queuecommand(struct scsi_cmnd *SCp, void (*done)(struct scsi_cmnd *))
 {
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters 
*)SCp->device->host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata =
+                                               shost_priv(SCp->device->host);
        __u32 move_ins;
        enum dma_data_direction direction;
        struct NCR_700_command_slot *slot;
@@ -1941,8 +1928,8 @@ STATIC int
 NCR_700_bus_reset(struct scsi_cmnd * SCp)
 {
        DECLARE_COMPLETION_ONSTACK(complete);
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters 
*)SCp->device->host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata =
+                                               shost_priv(SCp->device->host);
 
        scmd_printk(KERN_INFO, SCp,
                "New error handler wants BUS reset, cmd %p\n\t", SCp);
@@ -1994,9 +1981,8 @@ STATIC void
 NCR_700_set_period(struct scsi_target *STp, int period)
 {
        struct Scsi_Host *SHp = dev_to_shost(STp->dev.parent);
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)SHp->hostdata[0];
-       
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(SHp);
+
        if(!hostdata->fast)
                return;
 
@@ -2013,8 +1999,7 @@ STATIC void
 NCR_700_set_offset(struct scsi_target *STp, int offset)
 {
        struct Scsi_Host *SHp = dev_to_shost(STp->dev.parent);
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)SHp->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(SHp);
        int max_offset = hostdata->chip710
                ? NCR_710_MAX_OFFSET : NCR_700_MAX_OFFSET;
        
@@ -2050,8 +2035,7 @@ NCR_700_slave_alloc(struct scsi_device *SDp)
 STATIC int
 NCR_700_slave_configure(struct scsi_device *SDp)
 {
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(SDp->host);
 
        /* to do here: allocate memory; build a queue_full list */
        if(SDp->tagged_supported) {
@@ -2094,8 +2078,7 @@ static int NCR_700_change_queue_type(struct scsi_device 
*SDp, int tag_type)
 {
        int change_tag = ((tag_type ==0 &&  scsi_get_tag_type(SDp) != 0)
                          || (tag_type != 0 && scsi_get_tag_type(SDp) == 0));
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)SDp->host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(SDp->host);
 
        scsi_set_tag_type(SDp, tag_type);
 
diff --git a/drivers/scsi/53c700.h b/drivers/scsi/53c700.h
index e06bdfe..e2372e4 100644
--- a/drivers/scsi/53c700.h
+++ b/drivers/scsi/53c700.h
@@ -54,8 +54,7 @@
 struct NCR_700_Host_Parameters;
 
 /* These are the externally used routines */
-struct Scsi_Host *NCR_700_detect(struct scsi_host_template *,
-               struct NCR_700_Host_Parameters *, struct device *);
+int NCR_700_detect(struct Scsi_Host *host, struct device *);
 int NCR_700_release(struct Scsi_Host *host);
 irqreturn_t NCR_700_intr(int, void *);
 
diff --git a/drivers/scsi/NCR_D700.c b/drivers/scsi/NCR_D700.c
index 3a80897..e432350 100644
--- a/drivers/scsi/NCR_D700.c
+++ b/drivers/scsi/NCR_D700.c
@@ -181,12 +181,13 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, 
int irq,
        struct Scsi_Host *host;
        int ret;
 
-       hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);
-       if (!hostdata) {
-               printk(KERN_ERR "NCR D700: SIOP%d: Failed to allocate host"
-                      "data, detatching\n", siop);
+       host = scsi_host_alloc(&NCR_D700_driver_template, sizeof(*hostdata));
+       if (!host) {
+               printk(KERN_ERR "NCR D700: SIOP%d: Failed to allocate host, "
+                      "detaching\n", siop);
                return -ENOMEM;
        }
+       hostdata = shost_priv(host);
 
        if (!request_region(region, 64, "NCR_D700")) {
                printk(KERN_ERR "NCR D700: Failed to reserve IO region 0x%x\n",
@@ -195,18 +196,16 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, 
int irq,
                goto region_failed;
        }
                
-       /* Fill in the three required pieces of hostdata */
+       /* Fill in the required pieces of hostdata */
        hostdata->base = ioport_map(region, 64);
        hostdata->differential = (((1<<siop) & differential) != 0);
        hostdata->clock = NCR_D700_CLOCK_MHZ;
        hostdata->burst_length = 8;
 
        /* and register the siop */
-       host = NCR_700_detect(&NCR_D700_driver_template, hostdata, p->dev);
-       if (!host) {
-               ret = -ENOMEM;
+       ret = NCR_700_detect(host, p->dev);
+       if (ret)
                goto detect_failed;
-       }
 
        p->hosts[siop] = host;
        /* FIXME: read this from SUS */
@@ -220,7 +219,7 @@ NCR_D700_probe_one(struct NCR_D700_private *p, int siop, 
int irq,
  detect_failed:
        release_region(region, 64);
  region_failed:
-       kfree(hostdata);
+       scsi_host_put(host);
 
        return ret;
 }
@@ -354,9 +353,9 @@ NCR_D700_remove_one(struct Scsi_Host *host)
 {
        scsi_remove_host(host);
        NCR_700_release(host);
-       kfree((struct NCR_700_Host_Parameters *)host->hostdata[0]);
        free_irq(host->irq, host);
        release_region(host->base, 64);
+       scsi_host_put(host);
 }
 
 static int __devexit
diff --git a/drivers/scsi/a4000t.c b/drivers/scsi/a4000t.c
index 0c758d1..abf96b8 100644
--- a/drivers/scsi/a4000t.c
+++ b/drivers/scsi/a4000t.c
@@ -37,22 +37,24 @@ static struct platform_device *a4000t_scsi_device;
 
 static int __devinit a4000t_probe(struct device *dev)
 {
-       struct Scsi_Host * host = NULL;
+       struct Scsi_Host *host;
        struct NCR_700_Host_Parameters *hostdata;
+       int err = -ENODEV;
 
        if (!(MACH_IS_AMIGA && AMIGAHW_PRESENT(A4000_SCSI)))
                goto out;
 
+       err = -EBUSY;
        if (!request_mem_region(A4000T_SCSI_ADDR, 0x1000,
                                "A4000T builtin SCSI"))
                goto out;
 
-       hostdata = kmalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL);
-       if (hostdata == NULL) {
-               printk(KERN_ERR "a4000t-scsi: Failed to allocate host data\n");
+       err = -ENOMEM;
+       host = scsi_host_alloc(&a4000t_scsi_driver_template, sizeof(*hostdata));
+       if (!host)
                goto out_release;
-       }
-       memset(hostdata, 0, sizeof(struct NCR_700_Host_Parameters));
+
+       hostdata = shost_priv(host);
 
        /* Fill in the required pieces of hostdata */
        hostdata->base = (void __iomem *)ZTWO_VADDR(A4000T_SCSI_ADDR);
@@ -62,19 +64,19 @@ static int __devinit a4000t_probe(struct device *dev)
        hostdata->dcntl_extra = EA_710;
 
        /* and register the chip */
-       host = NCR_700_detect(&a4000t_scsi_driver_template, hostdata, dev);
-       if (!host) {
+       err = NCR_700_detect(host, dev);
+       if (err) {
                printk(KERN_ERR "a4000t-scsi: No host detected; "
                                "board configuration problem?\n");
-               goto out_free;
+               goto out_put_host;
        }
 
        host->this_id = 7;
        host->base = A4000T_SCSI_ADDR;
-       host->irq = IRQ_AMIGA_PORTS;
 
-       if (request_irq(host->irq, NCR_700_intr, IRQF_SHARED, "a4000t-scsi",
-                       host)) {
+       err = request_irq(IRQ_AMIGA_PORTS, NCR_700_intr, IRQF_SHARED,
+                       "a4000t-scsi", host);
+       if (err) {
                printk(KERN_ERR "a4000t-scsi: request_irq failed\n");
                goto out_put_host;
        }
@@ -86,25 +88,21 @@ static int __devinit a4000t_probe(struct device *dev)
 
  out_put_host:
        scsi_host_put(host);
- out_free:
-       kfree(hostdata);
  out_release:
        release_mem_region(A4000T_SCSI_ADDR, 0x1000);
  out:
-       return -ENODEV;
+       return err;
 }
 
 static __devexit int a4000t_device_remove(struct device *dev)
 {
        struct Scsi_Host *host = dev_get_drvdata(dev);
-       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
 
        scsi_remove_host(host);
-
        NCR_700_release(host);
-       kfree(hostdata);
-       free_irq(host->irq, host);
+       free_irq(IRQ_AMIGA_PORTS, host);
        release_mem_region(A4000T_SCSI_ADDR, 0x1000);
+       scsi_host_put(host);
 
        return 0;
 }
diff --git a/drivers/scsi/bvme6000_scsi.c b/drivers/scsi/bvme6000_scsi.c
index cac3540..3e46a1a 100644
--- a/drivers/scsi/bvme6000_scsi.c
+++ b/drivers/scsi/bvme6000_scsi.c
@@ -36,19 +36,19 @@ static struct platform_device *bvme6000_scsi_device;
 static __devinit int
 bvme6000_probe(struct device *dev)
 {
-       struct Scsi_Host * host = NULL;
+       struct Scsi_Host *host;
        struct NCR_700_Host_Parameters *hostdata;
 
        if (!MACH_IS_BVME6000)
                goto out;
 
-       hostdata = kmalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL);
-       if (hostdata == NULL) {
-               printk(KERN_ERR "bvme6000-scsi: "
-                               "Failed to allocate host data\n");
+       host = scsi_host_alloc(&bvme6000_scsi_driver_template,
+                               sizeof(*hostdata));
+       if (!host) {
+               printk(KERN_ERR "bvme6000-scsi: Failed to allocate host\n");
                goto out;
        }
-       memset(hostdata, 0, sizeof(struct NCR_700_Host_Parameters));
+       hostdata = shost_priv(host);
 
        /* Fill in the required pieces of hostdata */
        hostdata->base = (void __iomem *)BVME_NCR53C710_BASE;
@@ -59,15 +59,13 @@ bvme6000_probe(struct device *dev)
        hostdata->ctest7_extra = CTEST7_TT1;
 
        /* and register the chip */
-       host = NCR_700_detect(&bvme6000_scsi_driver_template, hostdata, dev);
-       if (!host) {
+       if (NCR_700_detect(host, dev)) {
                printk(KERN_ERR "bvme6000-scsi: No host detected; "
                                "board configuration problem?\n");
-               goto out_free;
+               goto out_put_host;
        }
        host->base = BVME_NCR53C710_BASE;
        host->this_id = 7;
-       host->irq = BVME_IRQ_SCSI;
        if (request_irq(BVME_IRQ_SCSI, NCR_700_intr, 0, "bvme6000-scsi",
                        host)) {
                printk(KERN_ERR "bvme6000-scsi: request_irq failed\n");
@@ -81,8 +79,6 @@ bvme6000_probe(struct device *dev)
 
  out_put_host:
        scsi_host_put(host);
- out_free:
-       kfree(hostdata);
  out:
        return -ENODEV;
 }
@@ -91,12 +87,11 @@ static __devexit int
 bvme6000_device_remove(struct device *dev)
 {
        struct Scsi_Host *host = dev_get_drvdata(dev);
-       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
 
        scsi_remove_host(host);
        NCR_700_release(host);
-       kfree(hostdata);
-       free_irq(host->irq, host);
+       free_irq(BVME_IRQ_SCSI, host);
+       scsi_host_put(host);
 
        return 0;
 }
diff --git a/drivers/scsi/lasi700.c b/drivers/scsi/lasi700.c
index 3126824..cbd45eb 100644
--- a/drivers/scsi/lasi700.c
+++ b/drivers/scsi/lasi700.c
@@ -101,12 +101,13 @@ lasi700_probe(struct parisc_device *dev)
        struct NCR_700_Host_Parameters *hostdata;
        struct Scsi_Host *host;
 
-       hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);
-       if (!hostdata) {
-               printk(KERN_ERR "%s: Failed to allocate host data\n",
+       host = scsi_host_alloc(&lasi700_template, sizeof(*hostdata));
+       if (!host) {
+               printk(KERN_ERR "%s: Failed to allocate host\n",
                       dev->dev.bus_id);
                return -ENOMEM;
        }
+       hostdata = shost_priv(host);
 
        hostdata->dev = &dev->dev;
        dma_set_mask(&dev->dev, DMA_32BIT_MASK);
@@ -124,12 +125,10 @@ lasi700_probe(struct parisc_device *dev)
                hostdata->burst_length = 8;
        }
 
-       host = NCR_700_detect(&lasi700_template, hostdata, &dev->dev);
-       if (!host)
-               goto out_kfree;
+       if (NCR_700_detect(host, &dev->dev))
+               goto out_put_host;
        host->this_id = 7;
        host->base = base;
-       host->irq = dev->irq;
        if(request_irq(dev->irq, NCR_700_intr, IRQF_SHARED, "lasi700", host)) {
                printk(KERN_ERR "lasi700: request_irq failed!\n");
                goto out_put_host;
@@ -141,10 +140,8 @@ lasi700_probe(struct parisc_device *dev)
        return 0;
 
  out_put_host:
-       scsi_host_put(host);
- out_kfree:
        iounmap(hostdata->base);
-       kfree(hostdata);
+       scsi_host_put(host);
        return -ENODEV;
 }
 
@@ -152,14 +149,13 @@ static int __exit
 lasi700_driver_remove(struct parisc_device *dev)
 {
        struct Scsi_Host *host = dev_get_drvdata(&dev->dev);
-       struct NCR_700_Host_Parameters *hostdata = 
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
 
        scsi_remove_host(host);
        NCR_700_release(host);
-       free_irq(host->irq, host);
+       free_irq(dev->irq, host);
        iounmap(hostdata->base);
-       kfree(hostdata);
+       scsi_host_put(host);
 
        return 0;
 }
diff --git a/drivers/scsi/mvme16x_scsi.c b/drivers/scsi/mvme16x_scsi.c
index 1bdddad..a62c222 100644
--- a/drivers/scsi/mvme16x_scsi.c
+++ b/drivers/scsi/mvme16x_scsi.c
@@ -36,7 +36,7 @@ static struct platform_device *mvme16x_scsi_device;
 static __devinit int
 mvme16x_probe(struct device *dev)
 {
-       struct Scsi_Host * host = NULL;
+       struct Scsi_Host *host;
        struct NCR_700_Host_Parameters *hostdata;
 
        if (!MACH_IS_MVME16x)
@@ -48,13 +48,13 @@ mvme16x_probe(struct device *dev)
                goto out;
        }
 
-       hostdata = kmalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL);
-       if (hostdata == NULL) {
-               printk(KERN_ERR "mvme16x-scsi: "
-                               "Failed to allocate host data\n");
+       host = scsi_host_alloc(&mvme16x_scsi_driver_template,
+                               sizeof(*hostdata));
+       if (!host) {
+               printk(KERN_ERR "mvme16x-scsi: Failed to allocate host\n");
                goto out;
        }
-       memset(hostdata, 0, sizeof(struct NCR_700_Host_Parameters));
+       hostdata = shost_priv(host);
 
        /* Fill in the required pieces of hostdata */
        hostdata->base = (void __iomem *)0xfff47000UL;
@@ -65,16 +65,15 @@ mvme16x_probe(struct device *dev)
        hostdata->ctest7_extra = CTEST7_TT1;
 
        /* and register the chip */
-       host = NCR_700_detect(&mvme16x_scsi_driver_template, hostdata, dev);
-       if (!host) {
+       if (NCR_700_detect(host, dev)) {
                printk(KERN_ERR "mvme16x-scsi: No host detected; "
                                "board configuration problem?\n");
-               goto out_free;
+               goto out_put_host;
        }
        host->this_id = 7;
        host->base = 0xfff47000UL;
-       host->irq = MVME16x_IRQ_SCSI;
-       if (request_irq(host->irq, NCR_700_intr, 0, "mvme16x-scsi", host)) {
+       if (request_irq(MVME16x_IRQ_SCSI, NCR_700_intr, 0, "mvme16x-scsi",
+                       host)) {
                printk(KERN_ERR "mvme16x-scsi: request_irq failed\n");
                goto out_put_host;
        }
@@ -96,8 +95,6 @@ mvme16x_probe(struct device *dev)
 
  out_put_host:
        scsi_host_put(host);
- out_free:
-       kfree(hostdata);
  out:
        return -ENODEV;
 }
@@ -106,8 +103,8 @@ static __devexit int
 mvme16x_device_remove(struct device *dev)
 {
        struct Scsi_Host *host = dev_get_drvdata(dev);
-       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
 
+       scsi_remove_host(host);
        /* Disable scsi chip ints */
        {
                volatile unsigned long v;
@@ -116,10 +113,9 @@ mvme16x_device_remove(struct device *dev)
                v &= ~0x10;
                out_be32(0xfff4202c, v);
        }
-       scsi_remove_host(host);
        NCR_700_release(host);
-       kfree(hostdata);
-       free_irq(host->irq, host);
+       free_irq(MVME16x_IRQ_SCSI, host);
+       scsi_host_put(host);
 
        return 0;
 }
diff --git a/drivers/scsi/sim710.c b/drivers/scsi/sim710.c
index d63d229..23ef3a8 100644
--- a/drivers/scsi/sim710.c
+++ b/drivers/scsi/sim710.c
@@ -98,26 +98,27 @@ static __devinit int
 sim710_probe_common(struct device *dev, unsigned long base_addr,
                    int irq, int clock, int differential, int scsi_id)
 {
-       struct Scsi_Host * host = NULL;
-       struct NCR_700_Host_Parameters *hostdata =
-               kzalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL);
+       struct Scsi_Host *host;
+       struct NCR_700_Host_Parameters *hostdata;
 
        printk(KERN_NOTICE "sim710: %s\n", dev->bus_id);
        printk(KERN_NOTICE "sim710: irq = %d, clock = %d, base = 0x%lx, scsi_id 
= %d\n",
               irq, clock, base_addr, scsi_id);
 
-       if(hostdata == NULL) {
-               printk(KERN_ERR "sim710: Failed to allocate host data\n");
+       host = scsi_host_alloc(&sim710_driver_template, sizeof(*hostdata));
+       if (!host) {
+               printk(KERN_ERR "sim710: Failed to allocate host\n");
                goto out;
        }
+       hostdata = shost_priv(host);
 
        if(request_region(base_addr, 64, "sim710") == NULL) {
                printk(KERN_ERR "sim710: Failed to reserve IO region 0x%lx\n",
                       base_addr);
-               goto out_free;
+               goto out_put_host;
        }
 
-       /* Fill in the three required pieces of hostdata */
+       /* Fill in the required pieces of hostdata */
        hostdata->base = ioport_map(base_addr, 64);
        hostdata->differential = differential;
        hostdata->clock = clock;
@@ -125,8 +126,7 @@ sim710_probe_common(struct device *dev, unsigned long 
base_addr,
        hostdata->burst_length = 8;
 
        /* and register the chip */
-       if((host = NCR_700_detect(&sim710_driver_template, hostdata, dev))
-          == NULL) {
+       if (NCR_700_detect(host, dev)) {
                printk(KERN_ERR "sim710: No host detected; card configuration 
problem?\n");
                goto out_release;
        }
@@ -135,7 +135,7 @@ sim710_probe_common(struct device *dev, unsigned long 
base_addr,
        host->irq = irq;
        if (request_irq(irq, NCR_700_intr, IRQF_SHARED, "sim710", host)) {
                printk(KERN_ERR "sim710: request_irq failed\n");
-               goto out_put_host;
+               goto out_release;
        }
 
        dev_set_drvdata(dev, host);
@@ -143,12 +143,10 @@ sim710_probe_common(struct device *dev, unsigned long 
base_addr,
 
        return 0;
 
- out_put_host:
-       scsi_host_put(host);
  out_release:
        release_region(base_addr, 64);
- out_free:
-       kfree(hostdata);
+ out_put_host:
+       scsi_host_put(host);
  out:
        return -ENODEV;
 }
@@ -157,14 +155,12 @@ static __devexit int
 sim710_device_remove(struct device *dev)
 {
        struct Scsi_Host *host = dev_get_drvdata(dev);
-       struct NCR_700_Host_Parameters *hostdata =
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
 
        scsi_remove_host(host);
        NCR_700_release(host);
-       kfree(hostdata);
        free_irq(host->irq, host);
        release_region(host->base, 64);
+       scsi_host_put(host);
        return 0;
 }
 
diff --git a/drivers/scsi/sni_53c710.c b/drivers/scsi/sni_53c710.c
index 0a6b45b..bd42a78 100644
--- a/drivers/scsi/sni_53c710.c
+++ b/drivers/scsi/sni_53c710.c
@@ -75,12 +75,13 @@ static int __init snirm710_probe(struct platform_device 
*dev)
                return -ENODEV;
 
        base = res->start;
-       hostdata = kzalloc(sizeof(*hostdata), GFP_KERNEL);
-       if (!hostdata) {
-               printk(KERN_ERR "%s: Failed to allocate host data\n",
+       host = scsi_host_alloc(&snirm710_template, sizeof(*hostdata));
+       if (!host) {
+               printk(KERN_ERR "%s: Failed to allocate host\n",
                       dev->dev.bus_id);
                return -ENOMEM;
        }
+       hostdata = shost_priv(host);
 
        hostdata->dev = &dev->dev;
        dma_set_mask(&dev->dev, DMA_32BIT_MASK);
@@ -92,9 +93,8 @@ static int __init snirm710_probe(struct platform_device *dev)
        hostdata->chip710 = 1;
        hostdata->burst_length = 4;
 
-       host = NCR_700_detect(&snirm710_template, hostdata, &dev->dev);
-       if (!host)
-               goto out_kfree;
+       if (NCR_700_detect(host, &dev->dev))
+               goto out_put_host;
        host->this_id = 7;
        host->base = base;
        host->irq = platform_get_irq(dev, 0);
@@ -109,24 +109,21 @@ static int __init snirm710_probe(struct platform_device 
*dev)
        return 0;
 
  out_put_host:
-       scsi_host_put(host);
- out_kfree:
        iounmap(hostdata->base);
-       kfree(hostdata);
+       scsi_host_put(host);
        return -ENODEV;
 }
 
 static int __exit snirm710_driver_remove(struct platform_device *dev)
 {
        struct Scsi_Host *host = dev_get_drvdata(&dev->dev);
-       struct NCR_700_Host_Parameters *hostdata =
-               (struct NCR_700_Host_Parameters *)host->hostdata[0];
+       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
 
        scsi_remove_host(host);
        NCR_700_release(host);
        free_irq(host->irq, host);
        iounmap(hostdata->base);
-       kfree(hostdata);
+       scsi_host_put(host);
 
        return 0;
 }
diff --git a/drivers/scsi/zorro7xx.c b/drivers/scsi/zorro7xx.c
index c822deb..cc99c22 100644
--- a/drivers/scsi/zorro7xx.c
+++ b/drivers/scsi/zorro7xx.c
@@ -69,7 +69,7 @@ static struct zorro_device_id zorro7xx_zorro_tbl[] 
__devinitdata = {
 static int __devinit zorro7xx_init_one(struct zorro_dev *z,
                                       const struct zorro_device_id *ent)
 {
-       struct Scsi_Host * host = NULL;
+       struct Scsi_Host *host;
        struct NCR_700_Host_Parameters *hostdata;
        struct zorro_driver_data *zdd;
        unsigned long board, ioaddr;
@@ -89,13 +89,13 @@ static int __devinit zorro7xx_init_one(struct zorro_dev *z,
                return -EBUSY;
        }
 
-       hostdata = kmalloc(sizeof(struct NCR_700_Host_Parameters), GFP_KERNEL);
-       if (hostdata == NULL) {
-               printk(KERN_ERR "zorro7xx: Failed to allocate host data\n");
+       host = scsi_host_alloc(&zorro7xx_scsi_driver_template,
+                               sizeof(*hostdata));
+       if (!host) {
+               printk(KERN_ERR "zorro7xx: Failed to allocate host\n");
                goto out_release;
        }
-
-       memset(hostdata, 0, sizeof(struct NCR_700_Host_Parameters));
+       hostdata = shost_priv(host);
 
        /* Fill in the required pieces of hostdata */
        if (ioaddr > 0x01000000)
@@ -112,22 +112,19 @@ static int __devinit zorro7xx_init_one(struct zorro_dev 
*z,
        zorro7xx_scsi_driver_template.name = zdd->name;
 
        /* and register the chip */
-       host = NCR_700_detect(&zorro7xx_scsi_driver_template, hostdata,
-                             &z->dev);
-       if (!host) {
+       if (NCR_700_detect(host, &z->dev)) {
                printk(KERN_ERR "zorro7xx: No host detected; "
                                "board configuration problem?\n");
-               goto out_free;
+               goto out_put_host;
        }
 
        host->this_id = 7;
        host->base = ioaddr;
-       host->irq = IRQ_AMIGA_PORTS;
 
-       if (request_irq(host->irq, NCR_700_intr, IRQF_SHARED, "zorro7xx-scsi",
-                       host)) {
+       if (request_irq(IRQ_AMIGA_PORTS, NCR_700_intr, IRQF_SHARED,
+                       "zorro7xx-scsi", host)) {
                printk(KERN_ERR "zorro7xx: request_irq failed\n");
-               goto out_put_host;
+               goto out_unmap;
        }
 
        zorro_set_drvdata(z, host);
@@ -135,12 +132,11 @@ static int __devinit zorro7xx_init_one(struct zorro_dev 
*z,
 
        return 0;
 
- out_put_host:
-       scsi_host_put(host);
- out_free:
+ out_unmap:
        if (ioaddr > 0x01000000)
                iounmap(hostdata->base);
-       kfree(hostdata);
+ out_put_host:
+       scsi_host_put(host);
  out_release:
        zorro_release_device(z);
 
@@ -150,13 +146,11 @@ static int __devinit zorro7xx_init_one(struct zorro_dev 
*z,
 static __devexit void zorro7xx_remove_one(struct zorro_dev *z)
 {
        struct Scsi_Host *host = zorro_get_drvdata(z);
-       struct NCR_700_Host_Parameters *hostdata = shost_priv(host);
 
        scsi_remove_host(host);
-
        NCR_700_release(host);
-       kfree(hostdata);
-       free_irq(host->irq, host);
+       free_irq(IRQ_AMIGA_PORTS, host);
+       scsi_host_put(host);
        zorro_release_device(z);
 }
 
-- 
"Bill, look, we understand that you're interested in selling us this
operating system, but compare it to ours.  We can't possibly take such
a retrograde step."
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to