From: Christoph Hellwig <hch@lst.de>
To: James.Bottomley@steeleye.com
Cc: linux-scsi@vger.kernel.org
Subject: [PATCH] give all LLDD driver a ->release method
Date: Tue, 3 Jun 2003 22:19:02 +0200 [thread overview]
Message-ID: <20030603201902.GA8874@lst.de> (raw)
This allows us to kill the horrible scsi_host_legacy_release hack.
Note that the new ->release methods still seem to be incorrect in
some case, but I really want to kill that hack in core code not
to make all drivers perfect.
diff -Nru a/drivers/scsi/NCR53c406a.c b/drivers/scsi/NCR53c406a.c
--- a/drivers/scsi/NCR53c406a.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/NCR53c406a.c Tue Jun 3 00:27:44 2003
@@ -590,6 +590,21 @@
return 0;
}
+static int NCR53c406a_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+#ifdef USE_DMA
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+#endif
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+
+ scsi_unregister(shost);
+ return 0;
+}
+
/* called from init/main.c */
static void __init NCR53c406a_setup(char *str, int *ints)
{
@@ -1074,6 +1089,7 @@
.proc_name = "NCR53c406a" /* proc_name */,
.name = "NCR53c406a" /* name */,
.detect = NCR53c406a_detect /* detect */,
+ .release = NCR53c406a_release,
.info = NCR53c406a_info /* info */,
.command = NCR53c406a_command /* command */,
.queuecommand = NCR53c406a_queue /* queuecommand */,
diff -Nru a/drivers/scsi/aha1542.c b/drivers/scsi/aha1542.c
--- a/drivers/scsi/aha1542.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/aha1542.c Tue Jun 3 00:27:44 2003
@@ -1325,6 +1325,18 @@
return count;
}
+static int aha1542_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static int aha1542_restart(struct Scsi_Host *shost)
{
int i;
@@ -1817,6 +1829,7 @@
.proc_name = "aha1542",
.name = "Adaptec 1542",
.detect = aha1542_detect,
+ .release = aha1542_release,
.command = aha1542_command,
.queuecommand = aha1542_queuecommand,
.eh_abort_handler = aha1542_abort,
diff -Nru a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c
--- a/drivers/scsi/aha1740.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/aha1740.c Tue Jun 3 00:27:44 2003
@@ -567,6 +567,16 @@
return count;
}
+static int aha1740_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static int aha1740_biosparam(struct scsi_device *sdev, struct block_device *dev,
sector_t capacity, int* ip)
{
@@ -596,6 +606,7 @@
.proc_info = aha1740_proc_info,
.name = "Adaptec 174x (EISA)",
.detect = aha1740_detect,
+ .release = aha1740_release,
.command = aha1740_command,
.queuecommand = aha1740_queuecommand,
.bios_param = aha1740_biosparam,
diff -Nru a/drivers/scsi/amiga7xx.c b/drivers/scsi/amiga7xx.c
--- a/drivers/scsi/amiga7xx.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/amiga7xx.c Tue Jun 3 00:27:44 2003
@@ -134,9 +134,22 @@
return num;
}
+static int amiga7xx_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static Scsi_Host_Template driver_template = {
.name = "Amiga NCR53c710 SCSI",
.detect = amiga7xx_detect,
+ .release = amiga7xx_release,
.queuecommand = NCR53c7xx_queue_command,
.abort = NCR53c7xx_abort,
.reset = NCR53c7xx_reset,
diff -Nru a/drivers/scsi/bvme6000.c b/drivers/scsi/bvme6000.c
--- a/drivers/scsi/bvme6000.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/bvme6000.c Tue Jun 3 00:27:44 2003
@@ -51,9 +51,22 @@
return 1;
}
+static int mvme6000_scsi_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static Scsi_Host_Template driver_template = {
.name = "BVME6000 NCR53c710 SCSI",
.detect = bvme6000_scsi_detect,
+ .release = bvme6000_scsi_release,
.queuecommand = NCR53c7xx_queue_command,
.abort = NCR53c7xx_abort,
.reset = NCR53c7xx_reset,
diff -Nru a/drivers/scsi/dec_esp.c b/drivers/scsi/dec_esp.c
--- a/drivers/scsi/dec_esp.c Tue Jun 3 00:27:45 2003
+++ b/drivers/scsi/dec_esp.c Tue Jun 3 00:27:45 2003
@@ -109,11 +109,22 @@
int dec_esp_detect(Scsi_Host_Template * tpnt);
+static int dec_esp_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static Scsi_Host_Template driver_template = {
.proc_name = "esp",
.proc_info = &esp_proc_info,
.name = "NCR53C94",
.detect = dec_esp_detect,
+ .release = dec_esp_release,
.info = esp_info,
.command = esp_command,
.queuecommand = esp_queue,
diff -Nru a/drivers/scsi/dtc.c b/drivers/scsi/dtc.c
--- a/drivers/scsi/dtc.c Tue Jun 3 00:27:45 2003
+++ b/drivers/scsi/dtc.c Tue Jun 3 00:27:45 2003
@@ -447,9 +447,20 @@
#include "NCR5380.c"
+static int dtc_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static Scsi_Host_Template driver_template = {
.name = "DTC 3180/3280 ",
.detect = dtc_detect,
+ .release = dtc_release,
.queuecommand = dtc_queue_command,
.eh_abort_handler = dtc_abort,
.eh_bus_reset_handler = dtc_bus_reset,
diff -Nru a/drivers/scsi/esp.c b/drivers/scsi/esp.c
--- a/drivers/scsi/esp.c Tue Jun 3 00:27:45 2003
+++ b/drivers/scsi/esp.c Tue Jun 3 00:27:45 2003
@@ -1237,6 +1237,17 @@
return 0;
}
+/* this is clearly wrong for esp.. */
+static int esp_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
/* The info function will return whatever useful
* information the developer sees fit. If not provided, then
* the name field will be used instead.
@@ -4384,12 +4395,12 @@
SDptr->hostdata = NULL;
}
-
static Scsi_Host_Template driver_template = {
.proc_name = "esp",
.proc_info = esp_proc_info,
.name = "Sun ESP 100/100a/200",
.detect = esp_detect,
+ .release = esp_release,
.slave_alloc = esp_slave_alloc,
.slave_destroy = esp_slave_destroy,
.release = esp_release,
diff -Nru a/drivers/scsi/hosts.c b/drivers/scsi/hosts.c
--- a/drivers/scsi/hosts.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/hosts.c Tue Jun 3 00:27:44 2003
@@ -34,11 +34,9 @@
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/init.h>
-#include <linux/interrupt.h>
#include <linux/list.h>
#include <linux/completion.h>
#include <linux/unistd.h>
-#include <asm/dma.h>
#include "scsi.h"
#include "hosts.h"
@@ -83,28 +81,6 @@
}
/**
- * scsi_host_legacy_release - default release function for hosts
- * @shost:
- *
- * Description:
- * This is the default case for the release function. Its completely
- * useless for anything but old ISA adapters
- **/
-static int scsi_host_legacy_release(struct Scsi_Host *shost)
-{
- if (shost->irq)
- free_irq(shost->irq, NULL);
-#ifdef CONFIG_GENERIC_ISA_DMA
- if (shost->dma_channel != 0xff)
- free_dma(shost->dma_channel);
-#endif
- if (shost->io_port && shost->n_io_port)
- release_region(shost->io_port, shost->n_io_port);
-
- return 0;
-}
-
-/**
* scsi_remove_host - check a scsi host for release and release
* @shost: a pointer to a scsi host to release
*
@@ -355,7 +331,9 @@
printk(KERN_WARNING
"scsi HBA driver %s didn't set a release method, "
"please fix the template\n", shost_tp->name);
- shost_tp->release = &scsi_host_legacy_release;
+ dump_stack();
+ return -EINVAL;
+
}
shost_tp->detect(shost_tp);
diff -Nru a/drivers/scsi/jazz_esp.c b/drivers/scsi/jazz_esp.c
--- a/drivers/scsi/jazz_esp.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/jazz_esp.c Tue Jun 3 00:27:44 2003
@@ -139,6 +139,18 @@
return 0;
}
+static int jazz_esp_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
/************************************************************* DMA Functions */
static int dma_bytes_sent(struct NCR_ESP *esp, int fifo_count)
{
@@ -278,6 +290,7 @@
.proc_info = &esp_proc_info,
.name = "ESP 100/100a/200",
.detect = jazz_esp_detect,
+ .release = jazz_esp_release,
.info = esp_info,
.command = esp_command,
.queuecommand = esp_queue,
diff -Nru a/drivers/scsi/mac_esp.c b/drivers/scsi/mac_esp.c
--- a/drivers/scsi/mac_esp.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/mac_esp.c Tue Jun 3 00:27:44 2003
@@ -464,6 +464,16 @@
return chipspresent;
}
+static int mac_esp_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
/*
* I've been wondering what this is supposed to do, for some time. Talking
* to Allen Briggs: These machines have an extra register someplace where the
@@ -717,6 +727,7 @@
.proc_name = "esp",
.name = "Mac 53C9x SCSI",
.detect = mac_esp_detect,
+ .release = mac_esp_release,
.info = esp_info,
/* .command = esp_command, */
.queuecommand = esp_queue,
diff -Nru a/drivers/scsi/mvme16x.c b/drivers/scsi/mvme16x.c
--- a/drivers/scsi/mvme16x.c Tue Jun 3 00:27:45 2003
+++ b/drivers/scsi/mvme16x.c Tue Jun 3 00:27:45 2003
@@ -53,9 +53,22 @@
return 1;
}
+static int mvme16x_scsi_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static Scsi_Host_Template driver_template = {
.name = "MVME16x NCR53c710 SCSI",
.detect = mvme16x_scsi_detect,
+ .release = mvme16x_scsi_release,
.queuecommand = NCR53c7xx_queue_command,
.abort = NCR53c7xx_abort,
.reset = NCR53c7xx_reset,
diff -Nru a/drivers/scsi/pas16.c b/drivers/scsi/pas16.c
--- a/drivers/scsi/pas16.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/pas16.c Tue Jun 3 00:27:44 2003
@@ -600,9 +600,22 @@
#include "NCR5380.c"
+static int pas16_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static Scsi_Host_Template driver_template = {
.name = "Pro Audio Spectrum-16 SCSI",
.detect = pas16_detect,
+ .release = pas16_release,
.queuecommand = pas16_queue_command,
.eh_abort_handler = pas16_abort,
.eh_bus_reset_handler = pas16_bus_reset,
diff -Nru a/drivers/scsi/psi240i.c b/drivers/scsi/psi240i.c
--- a/drivers/scsi/psi240i.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/psi240i.c Tue Jun 3 00:27:45 2003
@@ -655,6 +655,17 @@
}
return count;
}
+
+static int Psi240i_Release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
/****************************************************************
* Name: Psi240i_Abort
*
@@ -722,6 +733,7 @@
.proc_name = "psi240i",
.name = "PSI-240I EIDE Disk Controller",
.detect = Psi240i_Detect,
+ .release = Psi240i_Release,
.command = Psi240i_Command,
.queuecommand = Psi240i_QueueCommand,
.abort = Psi240i_Abort,
diff -Nru a/drivers/scsi/qlogicfas.c b/drivers/scsi/qlogicfas.c
--- a/drivers/scsi/qlogicfas.c Tue Jun 3 00:27:45 2003
+++ b/drivers/scsi/qlogicfas.c Tue Jun 3 00:27:45 2003
@@ -739,6 +739,18 @@
return (__qlogicfas_detect(sht) != NULL);
}
+static int qlogicfas_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
/*
* Return bios parameters
*/
@@ -826,6 +838,7 @@
.name = "qlogicfas",
.proc_name = "qlogicfas",
.detect = qlogicfas_detect,
+ .release = qlogicfas_release,
.info = qlogicfas_info,
.command = qlogicfas_command,
.queuecommand = qlogicfas_queuecommand,
diff -Nru a/drivers/scsi/t128.c b/drivers/scsi/t128.c
--- a/drivers/scsi/t128.c Tue Jun 3 00:27:45 2003
+++ b/drivers/scsi/t128.c Tue Jun 3 00:27:45 2003
@@ -280,6 +280,16 @@
return count;
}
+static int t128_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
/*
* Function : int t128_biosparam(Disk * disk, struct block_device *dev, int *ip)
*
@@ -403,6 +413,7 @@
static Scsi_Host_Template driver_template = {
.name = "Trantor T128/T128F/T228",
.detect = t128_detect,
+ .release = t128_release,
.queuecommand = t128_queue_command,
.eh_abort_handler = t128_abort,
.eh_bus_reset_handler = t128_bus_reset,
diff -Nru a/drivers/scsi/ultrastor.c b/drivers/scsi/ultrastor.c
--- a/drivers/scsi/ultrastor.c Tue Jun 3 00:27:44 2003
+++ b/drivers/scsi/ultrastor.c Tue Jun 3 00:27:44 2003
@@ -643,6 +643,18 @@
return ultrastor_14f_detect(tpnt) || ultrastor_24f_detect(tpnt);
}
+static int ultrastor_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->dma_channel != 0xff)
+ free_dma(shost->dma_channel);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
+
static const char *ultrastor_info(struct Scsi_Host * shpnt)
{
static char buf[64];
@@ -1177,6 +1189,7 @@
static Scsi_Host_Template driver_template = {
.name = "UltraStor 14F/24F/34F",
.detect = ultrastor_detect,
+ .release = ultrastor_release,
.info = ultrastor_info,
.queuecommand = ultrastor_queuecommand,
.eh_abort_handler = ultrastor_abort,
diff -Nru a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c
--- a/drivers/scsi/wd7000.c Tue Jun 3 00:27:45 2003
+++ b/drivers/scsi/wd7000.c Tue Jun 3 00:27:45 2003
@@ -1616,6 +1616,15 @@
return (present);
}
+static int wd7000_release(struct Scsi_Host *shost)
+{
+ if (shost->irq)
+ free_irq(shost->irq, NULL);
+ if (shost->io_port && shost->n_io_port)
+ release_region(shost->io_port, shost->n_io_port);
+ scsi_unregister(shost);
+ return 0;
+}
/*
* I have absolutely NO idea how to do an abort with the WD7000...
@@ -1722,6 +1731,7 @@
.proc_info = wd7000_proc_info,
.name = "Western Digital WD-7000",
.detect = wd7000_detect,
+ .release = wd7000_release,
.command = wd7000_command,
.queuecommand = wd7000_queuecommand,
.eh_bus_reset_handler = wd7000_bus_reset,
reply other threads:[~2003-06-03 20:05 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20030603201902.GA8874@lst.de \
--to=hch@lst.de \
--cc=James.Bottomley@steeleye.com \
--cc=linux-scsi@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.