summaryrefslogtreecommitdiffstats
path: root/sys/dev/stg
diff options
context:
space:
mode:
authormdodd <mdodd@FreeBSD.org>2003-04-07 10:13:25 +0000
committermdodd <mdodd@FreeBSD.org>2003-04-07 10:13:25 +0000
commitd3c5efd512618160903d96c5dec20ad2b1128a70 (patch)
tree1f10fb055d2a61296641d5ad02b5a5e0e71ec906 /sys/dev/stg
parente37a3b039d6472b09f196d02f3cff12ec1a4fade (diff)
downloadFreeBSD-src-d3c5efd512618160903d96c5dec20ad2b1128a70.zip
FreeBSD-src-d3c5efd512618160903d96c5dec20ad2b1128a70.tar.gz
- Add PCI support (Adaptec AHA-2920/A,Future Domain TMC-18XX/3260).
- Reduce duplicated code. PR: 50427 Submitted by: Bob Bishop <rb@gid.co.uk>
Diffstat (limited to 'sys/dev/stg')
-rw-r--r--sys/dev/stg/tmc18c30.h12
-rw-r--r--sys/dev/stg/tmc18c30_isa.c180
-rw-r--r--sys/dev/stg/tmc18c30_pccard.c177
-rw-r--r--sys/dev/stg/tmc18c30_pci.c135
-rw-r--r--sys/dev/stg/tmc18c30_subr.c185
5 files changed, 351 insertions, 338 deletions
diff --git a/sys/dev/stg/tmc18c30.h b/sys/dev/stg/tmc18c30.h
new file mode 100644
index 0000000..8a1848c
--- /dev/null
+++ b/sys/dev/stg/tmc18c30.h
@@ -0,0 +1,12 @@
+/*
+ * $FreeBSD$
+ */
+
+extern devclass_t stg_devclass;
+
+int stg_alloc_resource (device_t);
+void stg_release_resource (device_t);
+int stg_probe (device_t);
+int stg_attach (device_t);
+void stg_detach (device_t);
+void stg_intr (void *);
diff --git a/sys/dev/stg/tmc18c30_isa.c b/sys/dev/stg/tmc18c30_isa.c
index 24faae7..88cb7c5b 100644
--- a/sys/dev/stg/tmc18c30_isa.c
+++ b/sys/dev/stg/tmc18c30_isa.c
@@ -52,118 +52,27 @@
#include <machine/resource.h>
#include <sys/rman.h>
-#include <isa/isavar.h>
-
-#include <machine/dvcfg.h>
-
-#include <sys/device_port.h>
-
#include <cam/scsi/scsi_low.h>
-#include <isa/isa_common.h>
#include <cam/scsi/scsi_low_pisa.h>
#include <dev/stg/tmc18c30reg.h>
#include <dev/stg/tmc18c30var.h>
-
-#define STG_HOSTID 7
-
-#include <sys/kernel.h>
-#include <sys/module.h>
-
-static int stgprobe(device_t devi);
-static int stgattach(device_t devi);
-
-static void stg_isa_unload (device_t);
-
-static void
-stg_isa_intr(void * arg)
-{
- stgintr(arg);
-}
-
-static void
-stg_release_resource(device_t dev)
-{
- struct stg_softc *sc = device_get_softc(dev);
-
- if (sc->stg_intrhand) {
- bus_teardown_intr(dev, sc->irq_res, sc->stg_intrhand);
- }
-
- if (sc->port_res) {
- bus_release_resource(dev, SYS_RES_IOPORT,
- sc->port_rid, sc->port_res);
- }
-
- if (sc->irq_res) {
- bus_release_resource(dev, SYS_RES_IRQ,
- sc->irq_rid, sc->irq_res);
- }
-
- if (sc->mem_res) {
- bus_release_resource(dev, SYS_RES_MEMORY,
- sc->mem_rid, sc->mem_res);
- }
-}
+#include <dev/stg/tmc18c30.h>
static int
-stg_alloc_resource(device_t dev)
+stg_isa_probe(device_t dev)
{
struct stg_softc *sc = device_get_softc(dev);
- u_long maddr, msize;
int error;
sc->port_rid = 0;
- sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port_rid,
- 0, ~0, STGIOSZ, RF_ACTIVE);
- if (sc->port_res == NULL) {
- stg_release_resource(dev);
- return(ENOMEM);
- }
-
sc->irq_rid = 0;
- sc->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irq_rid,
- 0, ~0, 1, RF_ACTIVE);
- if (sc->irq_res == NULL) {
- stg_release_resource(dev);
- return(ENOMEM);
- }
-
- error = bus_get_resource(dev, SYS_RES_MEMORY, 0, &maddr, &msize);
- if (error) {
- return(0); /* XXX */
- }
-
- /* no need to allocate memory if not configured */
- if (maddr == 0 || msize == 0) {
- return(0);
- }
-
- sc->mem_rid = 0;
- sc->mem_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem_rid,
- 0, ~0, 1, RF_ACTIVE);
- if (sc->mem_res == NULL) {
- stg_release_resource(dev);
- return(ENOMEM);
- }
-
- return(0);
-}
-
-static int
-stg_isa_probe(device_t dev)
-{
- struct stg_softc *sc = device_get_softc(dev);
- int error;
-
- bzero(sc, sizeof(struct stg_softc));
-
error = stg_alloc_resource(dev);
if (error) {
return(error);
}
- if (stgprobe(dev) == 0) {
+ if (stg_probe(dev) == 0) {
stg_release_resource(dev);
return(ENXIO);
}
@@ -179,19 +88,21 @@ stg_isa_attach(device_t dev)
struct stg_softc *sc = device_get_softc(dev);
int error;
+ sc->port_rid = 0;
+ sc->irq_rid = 0;
error = stg_alloc_resource(dev);
if (error) {
return(error);
}
error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_CAM | INTR_ENTROPY,
- stg_isa_intr, (void *)sc, &sc->stg_intrhand);
+ stg_intr, (void *)sc, &sc->stg_intrhand);
if (error) {
stg_release_resource(dev);
return(error);
}
- if (stgattach(dev) == 0) {
+ if (stg_attach(dev) == 0) {
stg_release_resource(dev);
return(ENXIO);
}
@@ -199,18 +110,11 @@ stg_isa_attach(device_t dev)
return(0);
}
-static void
-stg_isa_detach(device_t dev)
-{
- stg_isa_unload(dev);
- stg_release_resource(dev);
-}
-
static device_method_t stg_isa_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, stg_isa_probe),
DEVMETHOD(device_attach, stg_isa_attach),
- DEVMETHOD(device_detach, stg_isa_detach),
+ DEVMETHOD(device_detach, stg_detach),
{ 0, 0 }
};
@@ -221,71 +125,5 @@ static driver_t stg_isa_driver = {
sizeof(struct stg_softc),
};
-static devclass_t stg_devclass;
-
DRIVER_MODULE(stg, isa, stg_isa_driver, stg_devclass, 0, 0);
-
-static void
-stg_isa_unload(device_t devi)
-{
- struct stg_softc *sc = device_get_softc(devi);
- intrmask_t s;
-
- printf("%s: unload\n",sc->sc_sclow.sl_xname);
- s = splcam();
- scsi_low_deactivate((struct scsi_low_softc *)sc);
- scsi_low_dettach(&sc->sc_sclow);
- splx(s);
-}
-
-static int
-stgprobe(device_t devi)
-{
- int rv;
- struct stg_softc *sc = device_get_softc(devi);
-
- rv = stgprobesubr(rman_get_bustag(sc->port_res),
- rman_get_bushandle(sc->port_res),
- device_get_flags(devi));
-
- return rv;
-}
-
-static int
-stgattach(device_t devi)
-{
- struct stg_softc *sc;
- struct scsi_low_softc *slp;
- u_int32_t flags = device_get_flags(devi);
- u_int iobase = bus_get_resource_start(devi, SYS_RES_IOPORT, 0);
- intrmask_t s;
- char dvname[16];
-
- strcpy(dvname,"stg");
-
-
- if (iobase == 0)
- {
- printf("%s: no ioaddr is given\n", dvname);
- return (0);
- }
-
- sc = device_get_softc(devi);
- if (sc == NULL) {
- return(0);
- }
-
- slp = &sc->sc_sclow;
- slp->sl_dev = devi;
- sc->sc_iot = rman_get_bustag(sc->port_res);
- sc->sc_ioh = rman_get_bushandle(sc->port_res);
-
- slp->sl_hostid = STG_HOSTID;
- slp->sl_cfgflags = flags;
-
- s = splcam();
- stgattachsubr(sc);
- splx(s);
-
- return(STGIOSZ);
-}
+MODULE_DEPEND(stg, scsi_low, 1, 1, 1);
diff --git a/sys/dev/stg/tmc18c30_pccard.c b/sys/dev/stg/tmc18c30_pccard.c
index 4b98b1f..b99fdd2 100644
--- a/sys/dev/stg/tmc18c30_pccard.c
+++ b/sys/dev/stg/tmc18c30_pccard.c
@@ -58,8 +58,7 @@
#include <dev/stg/tmc18c30reg.h>
#include <dev/stg/tmc18c30var.h>
-
-#define STG_HOSTID 7
+#include <dev/stg/tmc18c30.h>
#include <sys/kernel.h>
#include <sys/module.h>
@@ -69,11 +68,6 @@
#include <pccard/cardinfo.h>
#include <pccard/slot.h>
-static int stgprobe(DEVPORT_PDEVICE devi);
-static int stgattach(DEVPORT_PDEVICE devi);
-
-static void stg_card_unload (DEVPORT_PDEVICE);
-
static const struct pccard_product stg_products[] = {
PCMCIA_CARD(FUTUREDOMAIN, SCSI2GO, 0),
PCMCIA_CARD(IBM, SCSICARD, 0),
@@ -87,86 +81,6 @@ static const struct pccard_product stg_products[] = {
* Additional code for FreeBSD new-bus PCCard frontend
*/
-static void
-stg_pccard_intr(void * arg)
-{
- stgintr(arg);
-}
-
-static void
-stg_release_resource(DEVPORT_PDEVICE dev)
-{
- struct stg_softc *sc = device_get_softc(dev);
-
- if (sc->stg_intrhand) {
- bus_teardown_intr(dev, sc->irq_res, sc->stg_intrhand);
- }
-
- if (sc->port_res) {
- bus_release_resource(dev, SYS_RES_IOPORT,
- sc->port_rid, sc->port_res);
- }
-
- if (sc->irq_res) {
- bus_release_resource(dev, SYS_RES_IRQ,
- sc->irq_rid, sc->irq_res);
- }
-
- if (sc->mem_res) {
- bus_release_resource(dev, SYS_RES_MEMORY,
- sc->mem_rid, sc->mem_res);
- }
-}
-
-static int
-stg_alloc_resource(DEVPORT_PDEVICE dev)
-{
- struct stg_softc *sc = device_get_softc(dev);
- u_long ioaddr, iosize, maddr, msize;
- int error;
-
- error = bus_get_resource(dev, SYS_RES_IOPORT, 0, &ioaddr, &iosize);
- if (error || iosize < STGIOSZ) {
- return(ENOMEM);
- }
-
- sc->port_rid = 0;
- sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port_rid,
- 0, ~0, STGIOSZ, RF_ACTIVE);
- if (sc->port_res == NULL) {
- stg_release_resource(dev);
- return(ENOMEM);
- }
-
- sc->irq_rid = 0;
- sc->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irq_rid,
- 0, ~0, 1, RF_ACTIVE);
- if (sc->irq_res == NULL) {
- stg_release_resource(dev);
- return(ENOMEM);
- }
-
- error = bus_get_resource(dev, SYS_RES_MEMORY, 0, &maddr, &msize);
- if (error) {
- return(0); /* XXX */
- }
-
- /* no need to allocate memory if not configured */
- if (maddr == 0 || msize == 0) {
- return(0);
- }
-
- sc->mem_rid = 0;
- sc->mem_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem_rid,
- 0, ~0, 1, RF_ACTIVE);
- if (sc->mem_res == NULL) {
- stg_release_resource(dev);
- return(ENOMEM);
- }
-
- return(0);
-}
-
static int stg_pccard_match(device_t dev)
{
const struct pccard_product *pp;
@@ -185,14 +99,14 @@ stg_pccard_probe(DEVPORT_PDEVICE dev)
struct stg_softc *sc = device_get_softc(dev);
int error;
- bzero(sc, sizeof(struct stg_softc));
-
+ sc->port_rid = 0;
+ sc->irq_rid = 0;
error = stg_alloc_resource(dev);
if (error) {
return(error);
}
- if (stgprobe(dev) == 0) {
+ if (stg_probe(dev) == 0) {
stg_release_resource(dev);
return(ENXIO);
}
@@ -208,19 +122,21 @@ stg_pccard_attach(DEVPORT_PDEVICE dev)
struct stg_softc *sc = device_get_softc(dev);
int error;
+ sc->port_rid = 0;
+ sc->irq_rid = 0;
error = stg_alloc_resource(dev);
if (error) {
return(error);
}
error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_CAM | INTR_ENTROPY,
- stg_pccard_intr, (void *)sc, &sc->stg_intrhand);
+ stg_intr, (void *)sc, &sc->stg_intrhand);
if (error) {
stg_release_resource(dev);
return(error);
}
- if (stgattach(dev) == 0) {
+ if (stg_attach(dev) == 0) {
stg_release_resource(dev);
return(ENXIO);
}
@@ -228,18 +144,11 @@ stg_pccard_attach(DEVPORT_PDEVICE dev)
return(0);
}
-static void
-stg_pccard_detach(DEVPORT_PDEVICE dev)
-{
- stg_card_unload(dev);
- stg_release_resource(dev);
-}
-
static device_method_t stg_pccard_methods[] = {
/* Device interface */
DEVMETHOD(device_probe, pccard_compat_probe),
DEVMETHOD(device_attach, pccard_compat_attach),
- DEVMETHOD(device_detach, stg_pccard_detach),
+ DEVMETHOD(device_detach, stg_detach),
/* Card interface */
DEVMETHOD(card_compat_match, stg_pccard_match),
@@ -255,71 +164,5 @@ static driver_t stg_pccard_driver = {
sizeof(struct stg_softc),
};
-static devclass_t stg_devclass;
-
-MODULE_DEPEND(stg, scsi_low, 1, 1, 1);
DRIVER_MODULE(stg, pccard, stg_pccard_driver, stg_devclass, 0, 0);
-
-static void
-stg_card_unload(DEVPORT_PDEVICE devi)
-{
- struct stg_softc *sc = DEVPORT_PDEVGET_SOFTC(devi);
- intrmask_t s;
-
- printf("%s: unload\n",sc->sc_sclow.sl_xname);
- s = splcam();
- scsi_low_deactivate((struct scsi_low_softc *)sc);
- scsi_low_dettach(&sc->sc_sclow);
- splx(s);
-}
-
-static int
-stgprobe(DEVPORT_PDEVICE devi)
-{
- int rv;
- struct stg_softc *sc = device_get_softc(devi);
-
- rv = stgprobesubr(rman_get_bustag(sc->port_res),
- rman_get_bushandle(sc->port_res),
- DEVPORT_PDEVFLAGS(devi));
-
- return rv;
-}
-
-static int
-stgattach(DEVPORT_PDEVICE devi)
-{
- struct stg_softc *sc;
- struct scsi_low_softc *slp;
- u_int32_t flags = DEVPORT_PDEVFLAGS(devi);
- u_int iobase = DEVPORT_PDEVIOBASE(devi);
- intrmask_t s;
- char dvname[16];
-
- strcpy(dvname,"stg");
-
- if (iobase == 0)
- {
- printf("%s: no ioaddr is given\n", dvname);
- return (0);
- }
-
- sc = DEVPORT_PDEVALLOC_SOFTC(devi);
- if (sc == NULL) {
- return(0);
- }
-
- slp = &sc->sc_sclow;
- slp->sl_dev = devi;
- sc->sc_iot = rman_get_bustag(sc->port_res);
- sc->sc_ioh = rman_get_bushandle(sc->port_res);
-
- slp->sl_hostid = STG_HOSTID;
- slp->sl_cfgflags = flags;
-
- s = splcam();
- stgattachsubr(sc);
- splx(s);
-
- return(STGIOSZ);
-}
+MODULE_DEPEND(stg, scsi_low, 1, 1, 1);
diff --git a/sys/dev/stg/tmc18c30_pci.c b/sys/dev/stg/tmc18c30_pci.c
new file mode 100644
index 0000000..40bc575
--- /dev/null
+++ b/sys/dev/stg/tmc18c30_pci.c
@@ -0,0 +1,135 @@
+/*
+ * Copyright (c) 2003 Bob Bishop
+ * All rights reserved.
+ * [Ported for FreeBSD]
+ * Copyright (c) 2000
+ * Noriaki Mitsunaga, Mitsuru Iwasaki and Takanori Watanabe.
+ * All rights reserved.
+ * [NetBSD for NEC PC-98 series]
+ * Copyright (c) 1996, 1997, 1998
+ * NetBSD/pc98 porting staff. All rights reserved.
+ * Copyright (c) 1996, 1997, 1998
+ * Naofumi HONDA. All rights reserved.
+ * Copyright (c) 1996, 1997, 1998
+ * Kouichi Matsuda. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/bus.h>
+#include <sys/malloc.h>
+#include <sys/errno.h>
+
+#include <machine/bus_pio.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <pci/pcireg.h>
+#include <pci/pcivar.h>
+
+#include <cam/scsi/scsi_low.h>
+#include <cam/scsi/scsi_low_pisa.h>
+
+#include <dev/stg/tmc18c30reg.h>
+#include <dev/stg/tmc18c30var.h>
+#include <dev/stg/tmc18c30.h>
+
+static struct _pcsid
+{
+ u_int32_t type;
+ const char *desc;
+} pci_ids[] = {
+ { 0x00001036, "Adaptec AHA-2920/A,Future Domain TMC-18XX/3260" },
+ { 0x00000000, NULL }
+};
+
+static int
+stg_pci_probe(device_t dev)
+{
+ u_int32_t type = pci_get_devid(dev);
+ struct _pcsid *stg = pci_ids;
+
+ while (stg->type && stg->type != type)
+ ++stg;
+ if (stg->desc) {
+ device_set_desc(dev, stg->desc);
+ return 0;
+ }
+ return(ENXIO);
+}
+
+static int
+stg_pci_attach(device_t dev)
+{
+ struct stg_softc *sc = device_get_softc(dev);
+ int error;
+
+ sc->port_rid = PCIR_MAPS;
+ sc->irq_rid = 0;
+ error = stg_alloc_resource(dev);
+ if (error) {
+ return(error);
+ }
+
+ /* XXXX remove INTR_ENTROPY below for MFC */
+ error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_CAM | INTR_ENTROPY,
+ stg_intr, (void *)sc, &sc->stg_intrhand);
+ if (error) {
+ stg_release_resource(dev);
+ return(error);
+ }
+
+ if (stg_attach(dev) == 0) {
+ stg_release_resource(dev);
+ return(ENXIO);
+ }
+
+ return(0);
+}
+
+static device_method_t stg_pci_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, stg_pci_probe),
+ DEVMETHOD(device_attach, stg_pci_attach),
+ DEVMETHOD(device_detach, stg_detach),
+
+ { 0, 0 }
+};
+
+static driver_t stg_pci_driver = {
+ "stg",
+ stg_pci_methods,
+ sizeof(struct stg_softc),
+};
+
+DRIVER_MODULE(stg, pci, stg_pci_driver, stg_devclass, 0, 0);
+MODULE_DEPEND(stg, scsi_low, 1, 1, 1);
+MODULE_DEPEND(stg, pci, 1, 1, 1);
diff --git a/sys/dev/stg/tmc18c30_subr.c b/sys/dev/stg/tmc18c30_subr.c
new file mode 100644
index 0000000..fd9d4f4
--- /dev/null
+++ b/sys/dev/stg/tmc18c30_subr.c
@@ -0,0 +1,185 @@
+/*
+ * [Ported for FreeBSD]
+ * Copyright (c) 2000
+ * Noriaki Mitsunaga, Mitsuru Iwasaki and Takanori Watanabe.
+ * All rights reserved.
+ * [NetBSD for NEC PC-98 series]
+ * Copyright (c) 1996, 1997, 1998
+ * NetBSD/pc98 porting staff. All rights reserved.
+ * Copyright (c) 1996, 1997, 1998
+ * Naofumi HONDA. All rights reserved.
+ * Copyright (c) 1996, 1997, 1998
+ * Kouichi Matsuda. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. The name of the author may not be used to endorse or promote products
+ * derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/socket.h>
+
+#include <sys/module.h>
+#include <sys/bus.h>
+
+#include <machine/bus_memio.h>
+#include <machine/bus_pio.h>
+#include <machine/bus.h>
+#include <machine/resource.h>
+#include <sys/rman.h>
+
+#include <cam/scsi/scsi_low.h>
+#include <cam/scsi/scsi_low_pisa.h>
+
+#include <dev/stg/tmc18c30reg.h>
+#include <dev/stg/tmc18c30var.h>
+#include <dev/stg/tmc18c30.h>
+
+#define STG_HOSTID 7
+
+devclass_t stg_devclass;
+
+int
+stg_alloc_resource(device_t dev)
+{
+ struct stg_softc * sc = device_get_softc(dev);
+ u_long maddr, msize;
+ int error;
+
+ sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port_rid,
+ 0, ~0, 1, RF_ACTIVE);
+ if (sc->port_res == NULL) {
+ stg_release_resource(dev);
+ return(ENOMEM);
+ }
+
+ sc->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &sc->irq_rid,
+ 0, ~0, 1, RF_ACTIVE);
+ if (sc->irq_res == NULL) {
+ stg_release_resource(dev);
+ return(ENOMEM);
+ }
+ error = bus_get_resource(dev, SYS_RES_MEMORY, 0, &maddr, &msize);
+ if (error) {
+ return(0); /* XXX */
+ }
+
+ /* no need to allocate memory if not configured */
+ if (maddr == 0 || msize == 0) {
+ return(0);
+ }
+
+ sc->mem_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &sc->mem_rid,
+ 0, ~0, 1, RF_ACTIVE);
+ if (sc->mem_res == NULL) {
+ stg_release_resource(dev);
+ return(ENOMEM);
+ }
+
+ return(0);
+}
+
+void
+stg_release_resource(device_t dev)
+{
+ struct stg_softc *sc = device_get_softc(dev);
+
+ if (sc->stg_intrhand)
+ bus_teardown_intr(dev, sc->irq_res, sc->stg_intrhand);
+ if (sc->port_res)
+ bus_release_resource(dev, SYS_RES_IOPORT,
+ sc->port_rid, sc->port_res);
+ if (sc->irq_res)
+ bus_release_resource(dev, SYS_RES_IRQ,
+ sc->irq_rid, sc->irq_res);
+ if (sc->mem_res)
+ bus_release_resource(dev, SYS_RES_MEMORY,
+ sc->mem_rid, sc->mem_res);
+ return;
+}
+
+int
+stg_probe(device_t dev)
+{
+ int rv;
+ struct stg_softc *sc = device_get_softc(dev);
+
+ rv = stgprobesubr(rman_get_bustag(sc->port_res),
+ rman_get_bushandle(sc->port_res),
+ device_get_flags(dev));
+
+ return rv;
+}
+
+int
+stg_attach(device_t dev)
+{
+ struct stg_softc *sc;
+ struct scsi_low_softc *slp;
+ u_int32_t flags = device_get_flags(dev);
+ intrmask_t s;
+ char dvname[16];
+
+ sc = device_get_softc(dev);
+
+ strcpy(dvname,"stg");
+
+ slp = &sc->sc_sclow;
+ slp->sl_dev = dev;
+ sc->sc_iot = rman_get_bustag(sc->port_res);
+ sc->sc_ioh = rman_get_bushandle(sc->port_res);
+
+ slp->sl_hostid = STG_HOSTID;
+ slp->sl_cfgflags = flags;
+
+ s = splcam();
+ stgattachsubr(sc);
+ splx(s);
+
+ return(STGIOSZ);
+}
+
+void
+stg_detach (device_t dev)
+{
+ struct stg_softc *sc = device_get_softc(dev);
+ intrmask_t s;
+
+ printf("%s: unload\n",sc->sc_sclow.sl_xname);
+ s = splcam();
+ scsi_low_deactivate((struct scsi_low_softc *)sc);
+ scsi_low_dettach(&sc->sc_sclow);
+ splx(s);
+ stg_release_resource(dev);
+ return;
+}
+
+void
+stg_intr (void *arg)
+{
+ stgintr(arg);
+ return;
+}
OpenPOWER on IntegriCloud