diff options
author | Miod Vallat <miod@cvs.openbsd.org> | 2003-12-26 10:41:44 +0000 |
---|---|---|
committer | Miod Vallat <miod@cvs.openbsd.org> | 2003-12-26 10:41:44 +0000 |
commit | 69d0d338693edeb2d3c684c04a106376dac0a90d (patch) | |
tree | 473131ef079eae25edfeaa724988798df6a70191 /sys/arch/mvme88k/dev | |
parent | ac5246212226814e8b03e7512be199dac32a532c (diff) |
Merge the attachment part and the real work part of the SCSI drivers in
one file per driver.
Diffstat (limited to 'sys/arch/mvme88k/dev')
-rw-r--r-- | sys/arch/mvme88k/dev/ssh.c | 231 | ||||
-rw-r--r-- | sys/arch/mvme88k/dev/sshdma.c | 252 | ||||
-rw-r--r-- | sys/arch/mvme88k/dev/sshvar.h | 5 | ||||
-rw-r--r-- | sys/arch/mvme88k/dev/vs.c | 154 | ||||
-rw-r--r-- | sys/arch/mvme88k/dev/vsdma.c | 165 | ||||
-rw-r--r-- | sys/arch/mvme88k/dev/vsvar.h | 18 |
6 files changed, 306 insertions, 519 deletions
diff --git a/sys/arch/mvme88k/dev/ssh.c b/sys/arch/mvme88k/dev/ssh.c index 904e2bf9fe2..3ae79532dd7 100644 --- a/sys/arch/mvme88k/dev/ssh.c +++ b/sys/arch/mvme88k/dev/ssh.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ssh.c,v 1.19 2003/12/19 22:30:18 miod Exp $ */ +/* $OpenBSD: ssh.c,v 1.20 2003/12/26 10:41:43 miod Exp $ */ /* * Copyright (c) 1994 Michael L. Hitch @@ -48,7 +48,6 @@ #include <sys/malloc.h> #include <uvm/uvm_extern.h> -#include <uvm/uvm_pmap.h> #include <machine/autoconf.h> #include <machine/cmmu.h> @@ -60,29 +59,54 @@ #include <mvme88k/dev/sshreg.h> #include <mvme88k/dev/sshvar.h> -/* - * SCSI delays - * In u-seconds, primarily for state changes on the SPC. - */ -#define SCSI_CMD_WAIT 500000 /* wait per step of 'immediate' cmds */ -#define SCSI_DATA_WAIT 500000 /* wait per data in/out step */ -#define SCSI_INIT_WAIT 500000 /* wait per step (both) during init */ +#include "pcctwo.h" +#if NPCCTWO > 0 +#include <mvme88k/dev/pcctwofunc.h> +#include <mvme88k/dev/pcctworeg.h> +#endif -void ssh_select(struct ssh_softc *); -void sshabort(struct ssh_softc *, ssh_regmap_p, char *); -void ssherror(struct ssh_softc *, ssh_regmap_p, u_char); -void sshstart(struct ssh_softc *); -int ssh_checkintr(struct ssh_softc *, u_char, u_char, u_char, int *); -void sshreset(struct ssh_softc *); -void sshsetdelay(int); -void ssh_scsidone(struct ssh_acb *, int); -void ssh_sched(struct ssh_softc *); -int ssh_poll(struct ssh_softc *, struct ssh_acb *); -int sshintr(struct ssh_softc *); -void scsi_period_to_ssh(struct ssh_softc *, int); -void ssh_start(struct ssh_softc *, int, int, u_char *, int, u_char *, int); -void ssh_dump_acb(struct ssh_acb *); -void sshinitialize(struct ssh_softc *sc); +int sshmatch(struct device *, void *, void *); +void sshattach(struct device *, struct device *, void *); +int ssh_scsicmd(struct scsi_xfer *); + +struct scsi_adapter ssh_scsiswitch = { + ssh_scsicmd, + minphys, + 0, /* no lun support */ + 0, /* no lun support */ +}; + +struct scsi_device ssh_scsidev = { + NULL, /* use default error handler */ + NULL, /* do not have a start function */ + NULL, /* have no async handler */ + NULL, /* Use default done routine */ +}; + +struct cfattach ssh_ca = { + sizeof(struct ssh_softc), sshmatch, sshattach, +}; + +struct cfdriver ssh_cd = { + NULL, "ssh", DV_DULL, 0 +}; + +void scsi_period_to_ssh(struct ssh_softc *, int); +void sshabort(struct ssh_softc *, ssh_regmap_p, char *); +int ssh_checkintr(struct ssh_softc *, u_char, u_char, u_char, int *); +int ssh_dmaintr(void *); +void ssh_dump_acb(struct ssh_acb *); +void ssherror(struct ssh_softc *, ssh_regmap_p, u_char); +void sshinitialize(struct ssh_softc *); +int sshintr(struct ssh_softc *); +int ssh_poll(struct ssh_softc *, struct ssh_acb *); +void sshreset(struct ssh_softc *); +void ssh_sched(struct ssh_softc *); +void ssh_scsidone(struct ssh_acb *, int); +void ssh_select(struct ssh_softc *); +void sshsetdelay(int); +void sshstart(struct ssh_softc *); +void ssh_start(struct ssh_softc *, int, int, u_char *, int, u_char *, int); /* 53C710 script */ const @@ -98,6 +122,14 @@ int ssh_no_dma = 0; int ssh_reset_delay = 250; /* delay after reset, in milleseconds */ +/* + * SCSI delays + * In u-seconds, primarily for state changes on the SPC. + */ +#define SCSI_CMD_WAIT 500000 /* wait per step of 'immediate' cmds */ +#define SCSI_DATA_WAIT 500000 /* wait per data in/out step */ +#define SCSI_INIT_WAIT 500000 /* wait per step (both) during init */ + int ssh_cmd_wait = SCSI_CMD_WAIT; int ssh_data_wait = SCSI_DATA_WAIT; int ssh_init_wait = SCSI_INIT_WAIT; @@ -170,8 +202,143 @@ void ssh_dump_trace(void); #define SSH_TRACE(a,b,c,d) #endif -int kludge_city = 1; +int +sshmatch(pdp, vcf, args) + struct device *pdp; + void *vcf, *args; +{ + struct confargs *ca = args; + + if (badvaddr((vaddr_t)IIOV(ca->ca_vaddr), 4)) { + return(0); + } + + return (1); +} +void +sshattach(parent, self, auxp) + struct device *parent, *self; + void *auxp; +{ + struct ssh_softc *sc = (struct ssh_softc *)self; + struct confargs *ca = auxp; + ssh_regmap_p rp; + int tmp; + extern int cpuspeed; + + sc->sc_sshp = rp = ca->ca_vaddr; + + /* + * ssh uses sc_clock_freq to define the dcntl & ctest7 reg values + * (was 0x0221, but i added SSH_CTEST7_SC0 for snooping control) + * XXX does the clock frequency change for the 33MHz processors? + */ + sc->sc_clock_freq = cpuspeed * 2; + sc->sc_dcntl = SSH_DCNTL_EA; +/*X*/ if (sc->sc_clock_freq <= 25) +/*X*/ sc->sc_dcntl |= (2 << 6); +/*X*/ else if (sc->sc_clock_freq <= 37) +/*X*/ sc->sc_dcntl |= (1 << 6); +/*X*/ else if (sc->sc_clock_freq <= 50) +/*X*/ sc->sc_dcntl |= (0 << 6); +/*X*/ else +/*X*/ sc->sc_dcntl |= (3 << 6); + + sc->sc_ctest0 = SSH_CTEST0_BTD | SSH_CTEST0_EAN; + + /* + * MVME187 doesn't implement snooping... + */ + sc->sc_ctest7 = SSH_CTEST7_TT1; + + sc->sc_link.adapter_softc = sc; + sc->sc_link.adapter_target = 7; /* XXXX should ask ROM */ + sc->sc_link.adapter = &ssh_scsiswitch; + sc->sc_link.device = &ssh_scsidev; + sc->sc_link.openings = 1; + + sc->sc_ih.ih_fn = ssh_dmaintr; + sc->sc_ih.ih_arg = sc; + sc->sc_ih.ih_wantframe = 0; + sc->sc_ih.ih_ipl = ca->ca_ipl; + + sshinitialize(sc); + + switch (ca->ca_bustype) { +#if NPCCTWO > 0 + case BUS_PCCTWO: + { + /* + * Disable caching for the softc. Actually, I want + * to disable cache for acb structures, but they are + * part of softc, and I am disabling the entire softc + * just in case. + */ + + struct pcctworeg *pcc2 = (struct pcctworeg *)ca->ca_master; + + pmap_cache_ctrl(pmap_kernel(), trunc_page((vaddr_t)sc), + round_page((vaddr_t)sc + sizeof(*sc)), CACHE_INH); + + pcctwointr_establish(PCC2V_NCR, &sc->sc_ih); + /* enable interrupts at ca_ipl */ + pcc2->pcc2_ncrirq = ca->ca_ipl | PCC2_IRQ_IEN; + break; + } +#endif + } + + evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt); + + /* + * attach all scsi units on us, watching for boot device + * (see dk_establish). + */ + tmp = bootpart; + if (ca->ca_paddr != bootaddr) + bootpart = -1; /* invalid flag to dk_establish */ + config_found(self, &sc->sc_link, scsiprint); + bootpart = tmp; /* restore old value */ +} + +int +ssh_dmaintr(arg) + void *arg; +{ + struct ssh_softc *sc = arg; + + ssh_regmap_p rp; + u_char istat; + + rp = sc->sc_sshp; + istat = rp->ssh_istat; + if ((istat & (SSH_ISTAT_SIP | SSH_ISTAT_DIP)) == 0) + return (0); + if ((rp->ssh_sien | rp->ssh_dien) == 0) + return (0); /* no interrupts enabled */ + + /* + * 53c710 manual recommends reading dstat and sstat0 at least + * 12 clk cycles apart if reading as bytes (which is what + * pcc2 permits). Stick in a 1us delay between accessing dstat and + * sstat0 below. + * + * save interrupt status, DMA status, and SCSI status 0 + * (may need to deal with stacked interrupts?) + */ + sc->sc_istat = istat; + if (istat & SSH_ISTAT_SIP) { + sc->sc_sstat0 = rp->ssh_sstat0; + } + if (istat & SSH_ISTAT_DIP) { + delay(3); + sc->sc_dstat = rp->ssh_dstat; + } + sshintr(sc); + sc->sc_intrcnt.ev_count++; + return (1); +} /* * dummy routine to debug while loops */ @@ -188,20 +355,6 @@ wdummy(void) } /* - * default minphys routine for ssh based controllers - */ -void -ssh_minphys(bp) - struct buf *bp; -{ - - /* - * No max transfer at this level. - */ - minphys(bp); -} - -/* * used by specific ssh controller * */ diff --git a/sys/arch/mvme88k/dev/sshdma.c b/sys/arch/mvme88k/dev/sshdma.c deleted file mode 100644 index 5254ab41824..00000000000 --- a/sys/arch/mvme88k/dev/sshdma.c +++ /dev/null @@ -1,252 +0,0 @@ -/* $OpenBSD: sshdma.c,v 1.13 2003/10/05 20:27:48 miod Exp $ */ - -/* - * Copyright (c) 1996 Nivas Madhur - * Copyright (c) 1995 Theo de Raadt - * Copyright (c) 1994 Michael L. Hitch - * Copyright (c) 1982, 1990 The Regents of the University of California. - * 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. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. - * - * @(#)dma.c - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/device.h> - -#include <uvm/uvm_extern.h> -#include <uvm/uvm_pmap.h> - -#include <machine/autoconf.h> -#include <machine/board.h> -#include <machine/mmu.h> -#include <machine/pmap.h> - -#include <scsi/scsi_all.h> -#include <scsi/scsiconf.h> - -#include <mvme88k/dev/sshreg.h> -#include <mvme88k/dev/sshvar.h> - -#include "pcctwo.h" -#if NPCCTWO > 0 -#include <mvme88k/dev/pcctwofunc.h> -#include <mvme88k/dev/pcctworeg.h> -#endif - -int afscmatch(struct device *, void *, void *); -void afscattach(struct device *, struct device *, void *); - -int afscprint(void *auxp, char *); -int sshintr(struct ssh_softc *); -int afsc_dmaintr(void *); -void sshinitialize(struct ssh_softc *); - -struct scsi_adapter afsc_scsiswitch = { - ssh_scsicmd, - ssh_minphys, - 0, /* no lun support */ - 0, /* no lun support */ -}; - -struct scsi_device afsc_scsidev = { - NULL, /* use default error handler */ - NULL, /* do not have a start function */ - NULL, /* have no async handler */ - NULL, /* Use default done routine */ -}; - -struct cfattach ssh_ca = { - sizeof(struct ssh_softc), afscmatch, afscattach, -}; - -struct cfdriver ssh_cd = { - NULL, "ssh", DV_DULL, 0 -}; - -int -afscmatch(pdp, vcf, args) - struct device *pdp; - void *vcf, *args; -{ - struct confargs *ca = args; - - if (badvaddr((vaddr_t)IIOV(ca->ca_vaddr), 4)) { - return(0); - } - - return (1); -} - -void -afscattach(parent, self, auxp) - struct device *parent, *self; - void *auxp; -{ - struct ssh_softc *sc = (struct ssh_softc *)self; - struct confargs *ca = auxp; - ssh_regmap_p rp; - int tmp; - extern int cpuspeed; - - sc->sc_sshp = rp = ca->ca_vaddr; - - /* - * ssh uses sc_clock_freq to define the dcntl & ctest7 reg values - * (was 0x0221, but i added SSH_CTEST7_SC0 for snooping control) - * XXX does the clock frequency change for the 33MHz processors? - */ - sc->sc_clock_freq = cpuspeed * 2; - sc->sc_dcntl = SSH_DCNTL_EA; -/*X*/ if (sc->sc_clock_freq <= 25) -/*X*/ sc->sc_dcntl |= (2 << 6); -/*X*/ else if (sc->sc_clock_freq <= 37) -/*X*/ sc->sc_dcntl |= (1 << 6); -/*X*/ else if (sc->sc_clock_freq <= 50) -/*X*/ sc->sc_dcntl |= (0 << 6); -/*X*/ else -/*X*/ sc->sc_dcntl |= (3 << 6); - - sc->sc_ctest0 = SSH_CTEST0_BTD | SSH_CTEST0_EAN; - - /* - * MVME187 doesn't implement snooping... - */ - sc->sc_ctest7 = SSH_CTEST7_TT1; - - sc->sc_link.adapter_softc = sc; - sc->sc_link.adapter_target = 7; /* XXXX should ask ROM */ - sc->sc_link.adapter = &afsc_scsiswitch; - sc->sc_link.device = &afsc_scsidev; - sc->sc_link.openings = 1; - - sc->sc_ih.ih_fn = afsc_dmaintr; - sc->sc_ih.ih_arg = sc; - sc->sc_ih.ih_wantframe = 0; - sc->sc_ih.ih_ipl = ca->ca_ipl; - - sshinitialize(sc); - - switch (ca->ca_bustype) { -#if NPCCTWO > 0 - case BUS_PCCTWO: - { - /* - * Disable caching for the softc. Actually, I want - * to disable cache for acb structures, but they are - * part of softc, and I am disabling the entire softc - * just in case. - */ - - struct pcctworeg *pcc2 = (struct pcctworeg *)ca->ca_master; - - pmap_cache_ctrl(pmap_kernel(), trunc_page((vaddr_t)sc), - round_page((vaddr_t)sc + sizeof(*sc)), CACHE_INH); - - pcctwointr_establish(PCC2V_NCR, &sc->sc_ih); - /* enable interrupts at ca_ipl */ - pcc2->pcc2_ncrirq = ca->ca_ipl | PCC2_IRQ_IEN; - break; - } -#endif - } - - evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt); - - /* - * attach all scsi units on us, watching for boot device - * (see dk_establish). - */ - tmp = bootpart; - if (ca->ca_paddr != bootaddr) - bootpart = -1; /* invalid flag to dk_establish */ - config_found(self, &sc->sc_link, scsiprint); - bootpart = tmp; /* restore old value */ -} -/* - * print diag if pnp is NULL else just extra - */ -int -afscprint(auxp, pnp) - void *auxp; - char *pnp; -{ - if (pnp == NULL) - return (UNCONF); - return (QUIET); -} - -int -afsc_dmaintr(arg) - void *arg; -{ - struct ssh_softc *sc = arg; - - ssh_regmap_p rp; - u_char istat; - - rp = sc->sc_sshp; - istat = rp->ssh_istat; - if ((istat & (SSH_ISTAT_SIP | SSH_ISTAT_DIP)) == 0) - return (0); - if ((rp->ssh_sien | rp->ssh_dien) == 0) - return (0); /* no interrupts enabled */ - - /* - * 53c710 manual recommends reading dstat and sstat0 at least - * 12 clk cycles apart if reading as bytes (which is what - * pcc2 permits). Stick in a 1us delay between accessing dstat and - * sstat0 below. - * - * save interrupt status, DMA status, and SCSI status 0 - * (may need to deal with stacked interrupts?) - */ - sc->sc_istat = istat; - if (istat & SSH_ISTAT_SIP) { - sc->sc_sstat0 = rp->ssh_sstat0; - } - if (istat & SSH_ISTAT_DIP) { - delay(3); - sc->sc_dstat = rp->ssh_dstat; - } - sshintr(sc); - sc->sc_intrcnt.ev_count++; - return (1); -} - -#ifdef XXX_CD_DEBUG /* XXXsmurph What is afsccd ?? */ -void -afsc_dump() -{ - int i; - - for (i = 0; i < afsccd.cd_ndevs; ++i) - if (afsccd.cd_devs[i]) - ssh_dump(afsccd.cd_devs[i]); -} -#endif diff --git a/sys/arch/mvme88k/dev/sshvar.h b/sys/arch/mvme88k/dev/sshvar.h index a30d299f41d..422a983355f 100644 --- a/sys/arch/mvme88k/dev/sshvar.h +++ b/sys/arch/mvme88k/dev/sshvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: sshvar.h,v 1.3 2003/06/02 23:27:52 millert Exp $ */ +/* $OpenBSD: sshvar.h,v 1.4 2003/12/26 10:41:43 miod Exp $ */ /* * Copyright (c) 1995 Theo de Raadt @@ -194,7 +194,4 @@ struct ssh_softc { #define STS_INTERMED 0x10 /* Intermediate status sent */ #define STS_EXT 0x80 /* Extended status valid */ -void ssh_minphys(struct buf *bp); -int ssh_scsicmd(struct scsi_xfer *); - #endif /* _SSHVAR_H */ diff --git a/sys/arch/mvme88k/dev/vs.c b/sys/arch/mvme88k/dev/vs.c index 132522bb9ed..629358a621b 100644 --- a/sys/arch/mvme88k/dev/vs.c +++ b/sys/arch/mvme88k/dev/vs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vs.c,v 1.23 2003/12/25 21:01:39 miod Exp $ */ +/* $OpenBSD: vs.c,v 1.24 2003/12/26 10:41:43 miod Exp $ */ /* * Copyright (c) 1999 Steve Murphree, Jr. @@ -34,7 +34,7 @@ */ /* - * MVME328 scsi adaptor driver + * MVME328S scsi adaptor driver */ #include <sys/param.h> @@ -53,46 +53,118 @@ #include <machine/autoconf.h> #include <machine/param.h> -#if defined(mvme88k) #include <mvme88k/dev/vsreg.h> #include <mvme88k/dev/vsvar.h> #include <mvme88k/dev/vme.h> /* vme_findvec() */ #include <machine/cmmu.h> /* DMA_CACHE_SYNC, etc... */ -#else -#include <mvme68k/dev/vsreg.h> -#include <mvme68k/dev/vsvar.h> -#include <mvme68k/dev/vme.h> /* vme_findvec() */ -#endif /* mvme88k */ - -int vs_checkintr(struct vs_softc *, struct scsi_xfer *, int *); -void vs_chksense(struct scsi_xfer *); -void vs_reset(struct vs_softc *); -void vs_resync(struct vs_softc *); -int vs_initialize(struct vs_softc *); -int vs_nintr(struct vs_softc *); -int vs_eintr(struct vs_softc *); -int vs_poll(struct vs_softc *, struct scsi_xfer *); -void vs_scsidone(struct vs_softc *, struct scsi_xfer *, int); -M328_CQE * vs_getcqe(struct vs_softc *); -M328_IOPB * vs_getiopb(struct vs_softc *); -int do_vspoll(struct vs_softc *, int); -void thaw_queue(struct vs_softc *, u_int8_t); -void vs_link_sg_element(sg_list_element_t *, vaddr_t, int); -void vs_link_sg_list(sg_list_element_t *, vaddr_t, int); + +int vsmatch(struct device *, void *, void *); +void vsattach(struct device *, struct device *, void *); +int vs_scsicmd(struct scsi_xfer *); + +struct scsi_adapter vs_scsiswitch = { + vs_scsicmd, + minphys, + 0, /* no lun support */ + 0, /* no lun support */ +}; + +struct scsi_device vs_scsidev = { + NULL, /* use default error handler */ + NULL, /* do not have a start function */ + NULL, /* have no async handler */ + NULL, /* Use default done routine */ +}; + +struct cfattach vs_ca = { + sizeof(struct vs_softc), vsmatch, vsattach, +}; + +struct cfdriver vs_cd = { + NULL, "vs", DV_DULL, 0 +}; + +int do_vspoll(struct vs_softc *, int); +void thaw_queue(struct vs_softc *, u_int8_t); +M328_SG vs_alloc_scatter_gather(void); +M328_SG vs_build_memory_structure(struct scsi_xfer *, M328_IOPB *); +int vs_checkintr(struct vs_softc *, struct scsi_xfer *, int *); +void vs_chksense(struct scsi_xfer *); +void vs_dealloc_scatter_gather(M328_SG); +int vs_eintr(void *); +M328_CQE *vs_getcqe(struct vs_softc *); +M328_IOPB *vs_getiopb(struct vs_softc *); +int vs_initialize(struct vs_softc *); +int vs_intr(struct vs_softc *); +void vs_link_sg_element(sg_list_element_t *, vaddr_t, int); +void vs_link_sg_list(sg_list_element_t *, vaddr_t, int); +int vs_nintr(void *); +int vs_poll(struct vs_softc *, struct scsi_xfer *); +void vs_reset(struct vs_softc *); +void vs_resync(struct vs_softc *); +void vs_scsidone(struct vs_softc *, struct scsi_xfer *, int); static __inline__ void vs_clear_return_info(struct vs_softc *); -/* - * default minphys routine for MVME328 based controllers - */ +int +vsmatch(pdp, vcf, args) + struct device *pdp; + void *vcf, *args; +{ + struct confargs *ca = args; + + return (!badvaddr((unsigned)ca->ca_vaddr, 1)); +} + void -vs_minphys(bp) - struct buf *bp; +vsattach(parent, self, auxp) + struct device *parent, *self; + void *auxp; { + struct vs_softc *sc = (struct vs_softc *)self; + struct confargs *ca = auxp; + struct vsreg * rp; + int tmp; + + sc->sc_vsreg = rp = ca->ca_vaddr; + + sc->sc_ipl = ca->ca_ipl; + sc->sc_nvec = ca->ca_vec; + /* get the next available vector for the error interrupt func. */ + sc->sc_evec = vme_findvec(); + sc->sc_link.adapter_softc = sc; + sc->sc_link.adapter_target = 7; + sc->sc_link.adapter = &vs_scsiswitch; + sc->sc_link.device = &vs_scsidev; + sc->sc_link.openings = 1; + + sc->sc_ih_n.ih_fn = vs_nintr; + sc->sc_ih_n.ih_arg = sc; + sc->sc_ih_n.ih_wantframe = 0; + sc->sc_ih_n.ih_ipl = ca->ca_ipl; + + sc->sc_ih_e.ih_fn = vs_eintr; + sc->sc_ih_e.ih_arg = sc; + sc->sc_ih_e.ih_wantframe = 0; + sc->sc_ih_e.ih_ipl = ca->ca_ipl; + + if (vs_initialize(sc)) + return; + + vmeintr_establish(sc->sc_nvec, &sc->sc_ih_n); + vmeintr_establish(sc->sc_evec, &sc->sc_ih_e); + evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt_n); + evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt_e); + /* - * No max transfer at this level. + * attach all scsi units on us, watching for boot device + * (see dk_establish). */ - minphys(bp); + tmp = bootpart; + if (ca->ca_paddr != bootaddr) + bootpart = -1; /* invalid flag to dk_establish */ + config_found(self, &sc->sc_link, scsiprint); + bootpart = tmp; /* restore old value */ } int @@ -172,7 +244,7 @@ thaw_queue(sc, target) } void -vs_scsidone (sc, xs, stat) +vs_scsidone(sc, xs, stat) struct vs_softc *sc; struct scsi_xfer *xs; int stat; @@ -276,16 +348,12 @@ vs_scsicmd(xs) * a read, prior to starting the IO. */ if (xs->flags & SCSI_DATA_IN) { /* read */ -#if defined(mvme88k) dma_cachectl((vaddr_t)xs->data, xs->datalen, DMA_CACHE_SYNC_INVAL); -#endif iopb->iopb_OPTION |= OPT_READ; } else { /* write */ -#if defined(mvme88k) dma_cachectl((vaddr_t)xs->data, xs->datalen, DMA_CACHE_SYNC); -#endif iopb->iopb_OPTION |= OPT_WRITE; } @@ -496,7 +564,7 @@ vs_initialize(sc) CRB_CLR_DONE(CRSW); /* initialize work queues */ - for (i=1; i<8; i++) { + for (i = 1; i < 8; i++) { d16_bzero(wiopb, sizeof(M328_IOPB)); wiopb->wqcf_CMD = CNTR_INIT_WORKQ; wiopb->wqcf_OPTION = 0; @@ -633,7 +701,7 @@ vs_reset(sc) int vs_checkintr(sc, xs, status) - struct vs_softc *sc; + struct vs_softc *sc; struct scsi_xfer *xs; int *status; { @@ -727,9 +795,10 @@ vs_checkintr(sc, xs, status) /* normal interrupt routine */ int -vs_nintr(sc) - struct vs_softc *sc; +vs_nintr(vsc) + void *vsc; { + struct vs_softc *sc = (struct vs_softc *)vsc; M328_CRB *crb = (M328_CRB *)&sc->sc_vsreg->sh_CRB; M328_CMD *m328_cmd; struct scsi_xfer *xs; @@ -776,9 +845,10 @@ vs_nintr(sc) } int -vs_eintr(sc) - struct vs_softc *sc; +vs_eintr(vsc) + void *vsc; { + struct vs_softc *sc = (struct vs_softc *)vsc; M328_CEVSB *crb = (M328_CEVSB *)&sc->sc_vsreg->sh_CRB; M328_CMD *m328_cmd; struct scsi_xfer *xs; diff --git a/sys/arch/mvme88k/dev/vsdma.c b/sys/arch/mvme88k/dev/vsdma.c deleted file mode 100644 index 31fc8c7854b..00000000000 --- a/sys/arch/mvme88k/dev/vsdma.c +++ /dev/null @@ -1,165 +0,0 @@ -/* $OpenBSD: vsdma.c,v 1.10 2003/10/11 22:08:57 miod Exp $ */ -/* - * Copyright (c) 1999 Steve Murphree, Jr. - * 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. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by the University of - * California, Berkeley and its contributors. - * 4. Neither the name of the University nor the names of its contributors - * may be used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS OR CONTRIBUTORS 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. - * - * @(#)vsdma.c - */ - -/* - * MVME328 scsi adaptor driver - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/kernel.h> -#include <sys/device.h> -#include <scsi/scsi_all.h> -#include <scsi/scsiconf.h> -#include <machine/autoconf.h> - -#ifdef mvme88k -#include <machine/board.h> -#include <mvme88k/dev/vsreg.h> -#include <mvme88k/dev/vsvar.h> -#include <mvme88k/dev/vme.h> -#else -#include <mvme68k/dev/vsreg.h> -#include <mvme68k/dev/vsvar.h> -#include <mvme68k/dev/vme.h> -#endif /* mvme88k */ - -int vsmatch(struct device *, void *, void *); -void vsattach(struct device *, struct device *, void *); -int vsprint(void *auxp, char *); -int vs_initialize(struct vs_softc *); -int vs_intr(struct vs_softc *); -int vs_nintr(void *); -int vs_eintr(void *); - -struct scsi_adapter vs_scsiswitch = { - vs_scsicmd, - vs_minphys, - 0, /* no lun support */ - 0, /* no lun support */ -}; - -struct scsi_device vs_scsidev = { - NULL, /* use default error handler */ - NULL, /* do not have a start function */ - NULL, /* have no async handler */ - NULL, /* Use default done routine */ -}; - -struct cfattach vs_ca = { - sizeof(struct vs_softc), vsmatch, vsattach, -}; - -struct cfdriver vs_cd = { - NULL, "vs", DV_DULL, 0 -}; - -int -vsmatch(pdp, vcf, args) - struct device *pdp; - void *vcf, *args; -{ - struct confargs *ca = args; - if (!badvaddr((unsigned)ca->ca_vaddr, 1)) { - return (1); - } else { - return (0); - } -} - -void -vsattach(parent, self, auxp) - struct device *parent, *self; - void *auxp; -{ - struct vs_softc *sc = (struct vs_softc *)self; - struct confargs *ca = auxp; - struct vsreg * rp; - int tmp; - - sc->sc_vsreg = rp = ca->ca_vaddr; - - sc->sc_ipl = ca->ca_ipl; - sc->sc_nvec = ca->ca_vec; - /* get the next available vector for the error interrupt func. */ - sc->sc_evec = vme_findvec(); - sc->sc_link.adapter_softc = sc; - sc->sc_link.adapter_target = 7; - sc->sc_link.adapter = &vs_scsiswitch; - sc->sc_link.device = &vs_scsidev; - sc->sc_link.openings = 1; - - sc->sc_ih_n.ih_fn = vs_nintr; - sc->sc_ih_n.ih_arg = sc; - sc->sc_ih_n.ih_wantframe = 0; - sc->sc_ih_n.ih_ipl = ca->ca_ipl; - - sc->sc_ih_e.ih_fn = vs_eintr; - sc->sc_ih_e.ih_arg = sc; - sc->sc_ih_e.ih_wantframe = 0; - sc->sc_ih_e.ih_ipl = ca->ca_ipl; - - if (vs_initialize(sc)) - return; - - vmeintr_establish(sc->sc_nvec, &sc->sc_ih_n); - vmeintr_establish(sc->sc_evec, &sc->sc_ih_e); - evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt_n); - evcnt_attach(&sc->sc_dev, "intr", &sc->sc_intrcnt_e); - - /* - * attach all scsi units on us, watching for boot device - * (see dk_establish). - */ - tmp = bootpart; - if (ca->ca_paddr != bootaddr) - bootpart = -1; /* invalid flag to dk_establish */ - config_found(self, &sc->sc_link, scsiprint); - bootpart = tmp; /* restore old value */ -} - -/* - * print diag if pnp is NULL else just extra - */ -int -vsprint(auxp, pnp) - void *auxp; - char *pnp; -{ - if (pnp == NULL) - return (UNCONF); - return (QUIET); -} diff --git a/sys/arch/mvme88k/dev/vsvar.h b/sys/arch/mvme88k/dev/vsvar.h index aa2de282d66..5b597ace998 100644 --- a/sys/arch/mvme88k/dev/vsvar.h +++ b/sys/arch/mvme88k/dev/vsvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: vsvar.h,v 1.7 2003/10/05 20:27:48 miod Exp $ */ +/* $OpenBSD: vsvar.h,v 1.8 2003/12/26 10:41:43 miod Exp $ */ /* * Copyright (c) 1999 Steve Murphree, Jr. * Copyright (c) 1990 The Regents of the University of California. @@ -171,20 +171,4 @@ struct vs_softc { #define WQO_RFWQ 0x0020 /* report frozen work queue bit */ #define WQO_INIT 0x8000 /* work queue init bit */ -void vs_minphys(struct buf *bp); -int vs_scsicmd(struct scsi_xfer *); -/* - * Scatter/gather functions - */ - -M328_SG vs_alloc_scatter_gather(void); -void vs_dealloc_scatter_gather(M328_SG sg); -void vs_link_scatter_gather_element(sg_list_element_t *element, - vaddr_t phys_add, - int len); -void vs_link_scatter_gather_list(sg_list_element_t *list, - vaddr_t phys_add, - int elements); -M328_SG vs_build_memory_structure(struct scsi_xfer *xs, M328_IOPB *iopb); - #endif /* _M328VAR_H */ |