scsi: mvme147: stop using scsi_module.c
authorChristoph Hellwig <hch@lst.de>
Mon, 19 Mar 2018 07:37:49 +0000 (08:37 +0100)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 20 Mar 2018 02:54:47 +0000 (22:54 -0400)
Convert the driver to modern style probing.  Given that there only is a
single instance for a given board that can be done using a global struct
Scsi_Host instance easily.

Also fix the removal path by passing the correct cookie to free_irq, and
enable it unconditionally.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/mvme147.c

index e6b2b68..7d1ab41 100644 (file)
@@ -3,6 +3,9 @@
 #include <linux/mm.h>
 #include <linux/blkdev.h>
 #include <linux/interrupt.h>
+#include <linux/init.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
 
 #include <asm/page.h>
 #include <asm/pgtable.h>
@@ -14,9 +17,6 @@
 #include "wd33c93.h"
 #include "mvme147.h"
 
-#include <linux/stat.h>
-
-
 static irqreturn_t mvme147_intr(int irq, void *data)
 {
        struct Scsi_Host *instance = data;
@@ -65,40 +65,57 @@ static void dma_stop(struct Scsi_Host *instance, struct scsi_cmnd *SCpnt,
        m147_pcc->dma_cntrl = 0;
 }
 
-int mvme147_detect(struct scsi_host_template *tpnt)
+static struct scsi_host_template mvme147_host_template = {
+       .module                 = THIS_MODULE,
+       .proc_name              = "MVME147",
+       .name                   = "MVME147 built-in SCSI",
+       .queuecommand           = wd33c93_queuecommand,
+       .eh_abort_handler       = wd33c93_abort,
+       .eh_host_reset_handler  = wd33c93_host_reset,
+       .show_info              = wd33c93_show_info,
+       .write_info             = wd33c93_write_info,
+       .can_queue              = CAN_QUEUE,
+       .this_id                = 7,
+       .sg_tablesize           = SG_ALL,
+       .cmd_per_lun            = CMD_PER_LUN,
+       .use_clustering         = ENABLE_CLUSTERING
+};
+
+static struct Scsi_Host *mvme147_shost;
+
+static int __init mvme147_init(void)
 {
-       static unsigned char called = 0;
-       struct Scsi_Host *instance;
        wd33c93_regs regs;
        struct WD33C93_hostdata *hdata;
+       int error = -ENOMEM;
 
-       if (!MACH_IS_MVME147 || called)
+       if (!MACH_IS_MVME147)
                return 0;
-       called++;
 
-       tpnt->proc_name = "MVME147";
-       tpnt->show_info = wd33c93_show_info,
-       tpnt->write_info = wd33c93_write_info,
-
-       instance = scsi_register(tpnt, sizeof(struct WD33C93_hostdata));
-       if (!instance)
+       mvme147_shost = scsi_host_alloc(&mvme147_host_template,
+                       sizeof(struct WD33C93_hostdata));
+       if (!mvme147_shost)
                goto err_out;
+       mvme147_shost->base = 0xfffe4000;
+       mvme147_shost->irq = MVME147_IRQ_SCSI_PORT;
 
-       instance->base = 0xfffe4000;
-       instance->irq = MVME147_IRQ_SCSI_PORT;
        regs.SASR = (volatile unsigned char *)0xfffe4000;
        regs.SCMD = (volatile unsigned char *)0xfffe4001;
-       hdata = shost_priv(instance);
+
+       hdata = shost_priv(mvme147_shost);
        hdata->no_sync = 0xff;
        hdata->fast = 0;
        hdata->dma_mode = CTRL_DMA;
-       wd33c93_init(instance, regs, dma_setup, dma_stop, WD33C93_FS_8_10);
 
-       if (request_irq(MVME147_IRQ_SCSI_PORT, mvme147_intr, 0,
-                       "MVME147 SCSI PORT", instance))
+       wd33c93_init(mvme147_shost, regs, dma_setup, dma_stop, WD33C93_FS_8_10);
+
+       error = request_irq(MVME147_IRQ_SCSI_PORT, mvme147_intr, 0,
+                       "MVME147 SCSI PORT", mvme147_shost);
+       if (error)
                goto err_unregister;
-       if (request_irq(MVME147_IRQ_SCSI_DMA, mvme147_intr, 0,
-                       "MVME147 SCSI DMA", instance))
+       error = request_irq(MVME147_IRQ_SCSI_DMA, mvme147_intr, 0,
+                       "MVME147 SCSI DMA", mvme147_shost);
+       if (error)
                goto err_free_irq;
 #if 0  /* Disabled; causes problems booting */
        m147_pcc->scsi_interrupt = 0x10;        /* Assert SCSI bus reset */
@@ -112,40 +129,30 @@ int mvme147_detect(struct scsi_host_template *tpnt)
        m147_pcc->dma_cntrl = 0x00;     /* ensure DMA is stopped */
        m147_pcc->dma_intr = 0x89;      /* Ack and enable ints */
 
-       return 1;
+       error = scsi_add_host(mvme147_shost, NULL);
+       if (error)
+               goto err_free_irq;
+       scsi_scan_host(mvme147_shost);
+       return 0;
 
 err_free_irq:
-       free_irq(MVME147_IRQ_SCSI_PORT, mvme147_intr);
+       free_irq(MVME147_IRQ_SCSI_PORT, mvme147_shost);
 err_unregister:
-       scsi_unregister(instance);
+       scsi_host_put(mvme147_shost);
 err_out:
-       return 0;
+       return error;
 }
 
-static struct scsi_host_template driver_template = {
-       .proc_name              = "MVME147",
-       .name                   = "MVME147 built-in SCSI",
-       .detect                 = mvme147_detect,
-       .release                = mvme147_release,
-       .queuecommand           = wd33c93_queuecommand,
-       .eh_abort_handler       = wd33c93_abort,
-       .eh_host_reset_handler  = wd33c93_host_reset,
-       .can_queue              = CAN_QUEUE,
-       .this_id                = 7,
-       .sg_tablesize           = SG_ALL,
-       .cmd_per_lun            = CMD_PER_LUN,
-       .use_clustering         = ENABLE_CLUSTERING
-};
-
-
-#include "scsi_module.c"
-
-int mvme147_release(struct Scsi_Host *instance)
+static void __exit mvme147_exit(void)
 {
-#ifdef MODULE
+       scsi_remove_host(mvme147_shost);
+
        /* XXX Make sure DMA is stopped! */
-       free_irq(MVME147_IRQ_SCSI_PORT, mvme147_intr);
-       free_irq(MVME147_IRQ_SCSI_DMA, mvme147_intr);
-#endif
-       return 1;
+       free_irq(MVME147_IRQ_SCSI_PORT, mvme147_shost);
+       free_irq(MVME147_IRQ_SCSI_DMA, mvme147_shost);
+
+       scsi_host_put(mvme147_shost);
 }
+
+module_init(mvme147_init);
+module_exit(mvme147_exit);