- 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>
This commit is contained in:
Matthew N. Dodd 2003-04-07 10:13:25 +00:00
parent 887938c12f
commit efc5f672bd
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=113205
7 changed files with 359 additions and 341 deletions

View file

@ -723,8 +723,10 @@ dev/sr/if_sr.c optional sr
dev/sr/if_sr_pci.c optional sr pci
dev/streams/streams.c optional streams
dev/stg/tmc18c30.c optional stg
dev/stg/tmc18c30_subr.c optional stg
dev/stg/tmc18c30_pccard.c optional stg card
dev/stg/tmc18c30_pccard.c optional stg pccard
dev/stg/tmc18c30_pci.c optional stg pci
dev/stg/tmc18c30_isa.c optional stg isa
dev/sym/sym_hipd.c optional sym \
dependency "$S/dev/sym/sym_{conf,defs}.h"

12
sys/dev/stg/tmc18c30.h Normal file
View file

@ -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 *);

View file

@ -52,103 +52,12 @@
#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);
}
}
static int
stg_alloc_resource(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);
}
#include <dev/stg/tmc18c30.h>
static int
stg_isa_probe(device_t dev)
@ -156,14 +65,14 @@ stg_isa_probe(device_t 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);
}
@ -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);

View file

@ -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);

135
sys/dev/stg/tmc18c30_pci.c Normal file
View file

@ -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);

185
sys/dev/stg/tmc18c30_subr.c Normal file
View file

@ -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;
}

View file

@ -3,8 +3,11 @@
.PATH: ${.CURDIR}/../../dev/stg
KMOD= stg
SRCS= tmc18c30.c tmc18c30_isa.c tmc18c30_pccard.c
SRCS+= opt_bdg.h device_if.h bus_if.h pci_if.h isa_if.h card_if.h
SRCS= tmc18c30.c tmc18c30_subr.c \
tmc18c30_isa.c isa_if.h \
tmc18c30_pccard.c card_if.h \
tmc18c30_pci.c pci_if.h
SRCS+= opt_bdg.h device_if.h bus_if.h
SRCS+= opt_cam.h opt_scsi.h opt_ddb.h
.include <bsd.kmod.mk>