Re: [PATCH 2/6] mvme147: stop using scsi_module.c

2018-03-19 Thread John Paul Adrian Glaubitz
Hi Christoph!

On 03/19/2018 04:37 PM, Christoph Hellwig wrote:
> 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.

Thanks a lot for this work, much appreciated. I wish I could have been more
helpful with this driver. I will hopefully have the time to test it soon
with my VME system.

Adrian

-- 
 .''`.  John Paul Adrian Glaubitz
: :' :  Debian Developer - glaub...@debian.org
`. `'   Freie Universitaet Berlin - glaub...@physik.fu-berlin.de
  `-GPG: 62FF 8A75 84E0 2956 9546  0006 7426 3B37 F5B5 F913


[PATCH 2/6] mvme147: stop using scsi_module.c

2018-03-19 Thread Christoph Hellwig
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 
---
 drivers/scsi/mvme147.c | 107 ++---
 1 file changed, 57 insertions(+), 50 deletions(-)

diff --git a/drivers/scsi/mvme147.c b/drivers/scsi/mvme147.c
index e6b2b681fda3..7d1ab414b78f 100644
--- a/drivers/scsi/mvme147.c
+++ b/drivers/scsi/mvme147.c
@@ -3,6 +3,9 @@
 #include 
 #include 
 #include 
+#include 
+#include 
+#include 
 
 #include 
 #include 
@@ -14,9 +17,6 @@
 #include "wd33c93.h"
 #include "mvme147.h"
 
-#include 
-
-
 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_re