- 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:
parent
887938c12f
commit
efc5f672bd
@ -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
12
sys/dev/stg/tmc18c30.h
Normal 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 *);
|
@ -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);
|
||||
|
@ -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
135
sys/dev/stg/tmc18c30_pci.c
Normal 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
185
sys/dev/stg/tmc18c30_subr.c
Normal 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;
|
||||
}
|
@ -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>
|
||||
|
Loading…
x
Reference in New Issue
Block a user