summaryrefslogtreecommitdiff
path: root/sys/dev/tc
diff options
context:
space:
mode:
authorNiklas Hallqvist <niklas@cvs.openbsd.org>1996-12-08 01:03:08 +0000
committerNiklas Hallqvist <niklas@cvs.openbsd.org>1996-12-08 01:03:08 +0000
commit5afaaf539fd3d30c6dc1d6b4533ba69d1354a049 (patch)
tree9993a239719ae3090450eae097f8a02f07f2fdde /sys/dev/tc
parenta92da5c62c369c891657c866ae655e835e619b1b (diff)
Merge to NetBSD 961107, i.e. mostly new bus.h
Diffstat (limited to 'sys/dev/tc')
-rw-r--r--sys/dev/tc/asc.c476
-rw-r--r--sys/dev/tc/devlist2h.awk4
-rw-r--r--sys/dev/tc/if_fta.c14
-rw-r--r--sys/dev/tc/if_le_dec.c2
-rw-r--r--sys/dev/tc/tc.c6
-rw-r--r--sys/dev/tc/tcdevs20
-rw-r--r--sys/dev/tc/tcdevs.h34
-rw-r--r--sys/dev/tc/tcdevs_data.h40
-rw-r--r--sys/dev/tc/tcvar.h14
9 files changed, 211 insertions, 399 deletions
diff --git a/sys/dev/tc/asc.c b/sys/dev/tc/asc.c
index 16086da694a..d43a317b199 100644
--- a/sys/dev/tc/asc.c
+++ b/sys/dev/tc/asc.c
@@ -1,4 +1,4 @@
-/* $NetBSD: asc.c,v 1.19.2.4 1996/07/17 20:04:38 jtc Exp $ */
+/* $NetBSD: asc.c,v 1.31 1996/10/13 01:38:35 christos Exp $ */
/*-
* Copyright (c) 1992, 1993
@@ -128,6 +128,7 @@
#include <sys/buf.h>
#include <sys/conf.h>
#include <sys/errno.h>
+#include <sys/kernel.h>
#include <sys/device.h>
#include <sys/reboot.h>
@@ -148,12 +149,10 @@
#include <pmax/pmax/asic.h>
#include <pmax/pmax/kmin.h>
-#include <pmax/pmax/pmaxtype.h>
/*#define readback(a) { register int foo; wbflush(); foo = (a); }*/
#define readback(a) { register int foo; foo = (a); }
-extern int pmax_boardtype;
/*
* In 4ns ticks.
@@ -194,10 +193,8 @@ int asc_to_scsi_period[] = {
};
/*
- * Internal forward declarations.
+ * Debugging log of SCSI operations.
*/
-static void asc_reset();
-static void asc_startcmd();
#ifdef DEBUG
int asc_debug = 1;
@@ -217,6 +214,14 @@ struct asc_log {
void asc_DumpLog __P((char *str));
#endif
+
+/*
+ * Script, scsi state, and device softc structure declarations.
+ * script pointers occur in both scsi state and the softc,
+ * so they are defined first.
+ */
+
+
/*
* Scripts are entries in a state machine table.
* A script has four parts: a pre-condition, an action, a command to the chip,
@@ -230,32 +235,49 @@ void asc_DumpLog __P((char *str));
* script proceeds if the action routine returns TRUE.
* See asc_intr() for how and where this is all done.
*/
+struct asc_softc;
typedef struct script {
int condition; /* expected state at interrupt time */
- int (*action)(); /* extra operations */
+
+ int (*action) /* extra operations */
+ __P((register struct asc_softc *asc, register int status,
+ register int ss, register int ir));
int command; /* command to the chip */
struct script *next; /* index into asc_scripts for next state */
} script_t;
+
+/*
+ * script definitions
+ */
+
/* Matching on the condition value */
#define SCRIPT_MATCH(ir, csr) ((ir) | (((csr) & 0x67) << 8))
+/*
+ * A typedef for a script function, to use in forward declarations.
+ */
+typedef int
+script_fn_t __P((register struct asc_softc *asc, register int status,
+ register int ss, register int ir));
+
+
/* forward decls of script actions */
-static int script_nop(); /* when nothing needed */
-static int asc_end(); /* all come to an end */
-static int asc_get_status(); /* get status from target */
-static int asc_dma_in(); /* start reading data from target */
-static int asc_last_dma_in(); /* cleanup after all data is read */
-static int asc_resume_in(); /* resume data in after a message */
-static int asc_resume_dma_in(); /* resume DMA after a disconnect */
-static int asc_dma_out(); /* send data to target via dma */
-static int asc_last_dma_out(); /* cleanup after all data is written */
-static int asc_resume_out(); /* resume data out after a message */
-static int asc_resume_dma_out(); /* resume DMA after a disconnect */
-static int asc_sendsync(); /* negotiate sync xfer */
-static int asc_replysync(); /* negotiate sync xfer */
-static int asc_msg_in(); /* process a message byte */
-static int asc_disconnect(); /* process an expected disconnect */
+static script_fn_t script_nop; /* when nothing needed */
+static script_fn_t asc_end; /* all come to an end */
+static script_fn_t asc_get_status; /* get status from target */
+static script_fn_t asc_dma_in; /* start reading data from target */
+static script_fn_t asc_last_dma_in; /* cleanup after all data is read */
+static script_fn_t asc_resume_in; /* resume data in after a message */
+static script_fn_t asc_resume_dma_in; /* resume DMA after a disconnect */
+static script_fn_t asc_dma_out; /* send data to target via dma */
+static script_fn_t asc_last_dma_out; /* cleanup after all data is written */
+static script_fn_t asc_resume_out; /* resume data out after a message */
+static script_fn_t asc_resume_dma_out; /* resume DMA after a disconnect */
+static script_fn_t asc_sendsync; /* negotiate sync xfer */
+static script_fn_t asc_replysync; /* negotiate sync xfer */
+static script_fn_t asc_msg_in; /* process a message byte */
+static script_fn_t asc_disconnect; /* process an expected disconnect */
/* Define the index into asc_scripts for various state transitions */
#define SCRIPT_DATA_IN 0
@@ -379,93 +401,15 @@ script_t asc_scripts[] = {
&asc_scripts[SCRIPT_GET_STATUS]},
};
-/*
- * State kept for each active SCSI device.
- */
-typedef struct scsi_state {
- script_t *script; /* saved script while processing error */
- int statusByte; /* status byte returned during STATUS_PHASE */
- int error; /* errno to pass back to device driver */
- u_char *dmaBufAddr; /* DMA buffer address */
- u_int dmaBufSize; /* DMA buffer size */
- int dmalen; /* amount to transfer in this chunk */
- int dmaresid; /* amount not transfered if chunk suspended */
- int buflen; /* total remaining amount of data to transfer */
- char *buf; /* current pointer within scsicmd->buf */
- int flags; /* see below */
- int msglen; /* number of message bytes to read */
- int msgcnt; /* number of message bytes received */
- u_char sync_period; /* DMA synchronous period */
- u_char sync_offset; /* DMA synchronous xfer offset or 0 if async */
- u_char msg_out; /* next MSG_OUT byte to send */
- u_char msg_in[16]; /* buffer for multibyte messages */
-} State;
-
-/* state flags */
-#define DISCONN 0x001 /* true if currently disconnected from bus */
-#define DMA_IN_PROGRESS 0x002 /* true if data DMA started */
-#define DMA_IN 0x004 /* true if reading from SCSI device */
-#define DMA_OUT 0x010 /* true if writing to SCSI device */
-#define DID_SYNC 0x020 /* true if synchronous offset was negotiated */
-#define TRY_SYNC 0x040 /* true if try neg. synchronous offset */
-#define PARITY_ERR 0x080 /* true if parity error seen */
-#define CHECK_SENSE 0x100 /* true if doing sense command */
-
-/*
- * State kept for each active SCSI host interface (53C94).
- */
-struct asc_softc {
- struct device sc_dev; /* us as a device */
- asc_regmap_t *regs; /* chip address */
- volatile int *dmar; /* DMA address register address */
- u_char *buff; /* RAM buffer address (uncached) */
- int sc_id; /* SCSI ID of this interface */
- int myidmask; /* ~(1 << myid) */
- int state; /* current SCSI connection state */
- int target; /* target SCSI ID if busy */
- script_t *script; /* next expected interrupt & action */
- ScsiCmd *cmd[ASC_NCMD]; /* active command indexed by SCSI ID */
- State st[ASC_NCMD]; /* state info for each active command */
- void (*dma_start)(); /* Start dma routine */
- void (*dma_end)(); /* End dma routine */
- u_char *dma_next;
- int dma_xfer; /* Dma len still to go */
- int min_period; /* Min transfer period clk/byte */
- int max_period; /* Max transfer period clk/byte */
- int ccf; /* CCF, whatever that really is? */
- int timeout_250; /* 250ms timeout */
- int tb_ticks; /* 4ns. ticks/tb channel ticks */
-#ifdef USE_NEW_SCSI
- struct scsi_link sc_link; /* scsi link struct */
-#endif
-};
-
-#define ASC_STATE_IDLE 0 /* idle state */
-#define ASC_STATE_BUSY 1 /* selecting or currently connected */
-#define ASC_STATE_TARGET 2 /* currently selected as target */
-#define ASC_STATE_RESEL 3 /* currently waiting for reselect */
-typedef struct asc_softc *asc_softc_t;
+#include <dev/tc/ascvar.h>
/*
- * Dma operations.
- */
-#define ASCDMA_READ 1
-#define ASCDMA_WRITE 2
-static void tb_dma_start(), tb_dma_end(), asic_dma_start(), asic_dma_end();
-extern u_long asc_iomem;
-
-
-/*
- * Autoconfiguration data for config.
+ * Internal forward declarations.
*/
-int ascmatch __P((struct device * parent, void *cfdata, void *aux));
-void ascattach __P((struct device *parent, struct device *self, void *aux));
-int ascprint(void*, const char*);
-
-struct cfattach asc_ca = {
- sizeof(struct asc_softc), ascmatch, ascattach
-};
+static void asc_reset __P((asc_softc_t asc, asc_regmap_t *regs));
+static void asc_startcmd __P((asc_softc_t asc, int target));
+static void asc_timeout __P((void *arg));
extern struct cfdriver asc_cd;
struct cfdriver asc_cd = {
@@ -493,112 +437,51 @@ struct scsi_device asc_dev = {
/*
* Definition of the controller for the old auto-configuration program.
*/
-void asc_start();
+void asc_start __P((register ScsiCmd *scsicmd));
int asc_intr __P ((void *asc));
struct pmax_driver ascdriver = {
"asc", NULL, asc_start, 0, asc_intr,
};
+void asc_minphys __P((struct buf *bp));
-extern struct cfdriver ioasic_cd; /* XXX */
/*
- * Match driver based on name
+ * bus-parent shared attach function
*/
-int
-ascmatch(parent, match, aux)
- struct device *parent;
- void *match;
- void *aux;
-{
- struct ioasicdev_attach_args *d = aux;
- struct tc_attach_args *t = aux;
- void *ascaddr;
-
- /*if (parent->dv_cfdata->cf_driver == &ioasic_cd) */
- if (strncmp(d->iada_modname, "asc", TC_ROM_LLEN) &&
- strncmp(d->iada_modname, "PMAZ-AA ", TC_ROM_LLEN))
- return (0);
-
- if (parent->dv_cfdata->cf_driver == &ioasic_cd)
- ascaddr = (void*)d->iada_addr;
- else
- ascaddr = (void*)t->ta_addr;
-
- if (badaddr(ascaddr + ASC_OFFSET_53C94, 4))
- return (0);
-
- return (1);
-}
-
void
-ascattach(parent, self, aux)
- struct device *parent;
- struct device *self;
- void *aux;
+ascattach(asc, dmabufsize, bus_speed)
+ register asc_softc_t asc;
+ int dmabufsize;
{
- register struct ioasicdev_attach_args *d = aux;
- register struct tc_attach_args *t = aux;
- register asc_softc_t asc = (asc_softc_t) self;
register asc_regmap_t *regs;
int id, s, i;
- int bufsiz;
- void *ascaddr;
int unit;
- if (asc->sc_dev.dv_parent->dv_cfdata->cf_driver == &ioasic_cd) {
- ascaddr = (void*)MACH_PHYS_TO_UNCACHED(d->iada_addr);
- } else {
- ascaddr = (void*)MACH_PHYS_TO_UNCACHED(t->ta_addr);
- }
unit = asc->sc_dev.dv_unit;
/*
- * Initialize hw descriptor, cache some pointers
- */
- asc->regs = (asc_regmap_t *)(ascaddr + ASC_OFFSET_53C94);
-
- /*
* Set up machine dependencies.
- * (1) how to do dma
- * (2) timing based on turbochannel frequency
+ * (1) timing based on turbochannel frequency
*/
- if (asc->sc_dev.dv_parent->dv_cfdata->cf_driver == &ioasic_cd) {
- asc->buff = (u_char *)MACH_PHYS_TO_UNCACHED(asc_iomem);
- bufsiz = 8192;
- *((volatile int *)IOASIC_REG_SCSI_DMAPTR(ioasic_base)) = -1;
- *((volatile int *)IOASIC_REG_SCSI_DMANPTR(ioasic_base)) = -1;
- *((volatile int *)IOASIC_REG_SCSI_SCR(ioasic_base)) = 0;
- asc->dma_start = asic_dma_start;
- asc->dma_end = asic_dma_end;
- } else
- {
- /*
- * Fall through for turbochannel option.
- */
- asc->dmar = (volatile int *)(ascaddr + ASC_OFFSET_DMAR);
- asc->buff = (u_char *)(ascaddr + ASC_OFFSET_RAM);
- bufsiz = PER_TGT_DMA_SIZE;
- asc->dma_start = tb_dma_start;
- asc->dma_end = tb_dma_end;
- };
+ /* dma setup done in parent-specific attach code */
+
/*
* Now for timing. The 3max has a 25Mhz tb whereas the 3min and
* maxine are 12.5Mhz.
*/
- switch (pmax_boardtype) {
- case DS_3MAX:
- case DS_3MAXPLUS:
+ switch (bus_speed) {
+ case ASC_SPEED_25_MHZ:
asc->min_period = ASC_MIN_PERIOD25;
asc->max_period = ASC_MAX_PERIOD25;
asc->ccf = ASC_CCF(25);
asc->timeout_250 = ASC_TIMEOUT_250(25, asc->ccf);
asc->tb_ticks = 10;
break;
- case DS_3MIN:
- case DS_MAXINE:
+
+ case ASC_SPEED_12_5_MHZ:
default:
asc->min_period = ASC_MIN_PERIOD12;
asc->max_period = ASC_MAX_PERIOD12;
@@ -650,21 +533,13 @@ ascattach(parent, self, aux)
* We may want to try ping ponging buffers later.
*/
for (i = 0; i < ASC_NCMD; i++) {
- asc->st[i].dmaBufAddr = asc->buff + bufsiz * i;
- asc->st[i].dmaBufSize = bufsiz;
+ asc->st[i].dmaBufAddr = asc->buff + dmabufsize * i;
+ asc->st[i].dmaBufSize = dmabufsize;
}
/* Hack for old-sytle SCSI-device probe */
(void) pmax_add_scsi(&ascdriver, unit);
- /* tie pseudo-slot to device */
- if (asc->sc_dev.dv_parent->dv_cfdata->cf_driver == &ioasic_cd)
- ioasic_intr_establish(parent, d->iada_cookie, TC_IPL_BIO,
- asc_intr, asc);
- else
- tc_intr_establish(parent, t->ta_cookie, TC_IPL_BIO,
- asc_intr, asc);
-
printf(": target %d\n", id);
@@ -672,6 +547,7 @@ ascattach(parent, self, aux)
/*
* fill in the prototype scsi_link.
*/
+ asc->sc_link.channel = SCSI_CHANNEL_ONLY_ONE;
asc->sc_link.adapter_softc = asc;
asc->sc_link.adapter_target = asc->sc_id;
asc->sc_link.adapter = &asc_switch;
@@ -681,22 +557,12 @@ ascattach(parent, self, aux)
/*
* Now try to attach all the sub-devices.
*/
- config_found(self, &asc->sc_link, ascprint);
+ config_found(self, &asc->sc_link, scsiprint);
#endif /* USE_NEW_SCSI */
}
/*
- * Does anyone actually use this, and what for ?
- */
-int
-ascprint(aux, name)
- void *aux;
- const char *name;
-{
- return -1;
-}
-/*
* Per Fogelstrom's SCSI Driver breaks down request transfer size.
*/
void
@@ -734,6 +600,12 @@ asc_start(scsicmd)
splx(s);
}
asc->cmd[sdp->sd_drive] = scsicmd;
+ /*
+ * Kludge: use a 60 second timeout if data is being transfered,
+ * otherwise use a 30 minute timeout.
+ */
+ timeout(asc_timeout, scsicmd, hz * (scsicmd->buflen == 0 ?
+ 1800 : 60));
asc_startcmd(asc, sdp->sd_drive);
splx(s);
}
@@ -775,17 +647,17 @@ asc_reset(asc, regs)
* Reset chip and wait till done
*/
regs->asc_cmd = ASC_CMD_RESET;
- wbflush(); DELAY(25);
+ tc_syncbus(); DELAY(25);
/* spec says this is needed after reset */
regs->asc_cmd = ASC_CMD_NOP;
- wbflush(); DELAY(25);
+ tc_syncbus(); DELAY(25);
/*
* Set up various chip parameters
*/
regs->asc_ccf = asc->ccf;
- wbflush(); DELAY(25);
+ tc_syncbus(); DELAY(25);
regs->asc_sel_timo = asc->timeout_250;
/* restore our ID */
regs->asc_cnfg1 = asc->sc_id | ASC_CNFG1_P_CHECK;
@@ -796,7 +668,7 @@ asc_reset(asc, regs)
ASC_TC_PUT(regs, 0);
regs->asc_syn_p = asc->min_period;
regs->asc_syn_o = 0; /* async for now */
- wbflush();
+ tc_mb();
}
/*
@@ -838,8 +710,8 @@ asc_startcmd(asc, target)
#ifdef DEBUG
if (asc_debug > 1) {
printf("asc_startcmd: %s target %d cmd %x len %d\n",
- scsicmd->sd->sd_driver->d_name, target,
- scsicmd->cmd[0], scsicmd->buflen);
+ scsicmd->sd->sd_driver->d_name, target,
+ scsicmd->cmd[0], scsicmd->buflen);
}
#endif
@@ -905,7 +777,7 @@ asc_startcmd(asc, target)
/* preload the FIFO with the message to be sent */
regs->asc_fifo = SCSI_DIS_REC_IDENTIFY;
- wbflush();
+ tc_mb();
/* initialize the DMA */
(*asc->dma_start)(asc, state, state->dmaBufAddr, ASCDMA_WRITE);
@@ -1061,7 +933,7 @@ again:
ASC_TC_GET(regs, len);
fifo = regs->asc_flags & ASC_FLAGS_FIFO_CNT;
printf("asc_intr: ignoring strange interrupt");
- printf(" tc %d fifo residue\n", len, fifo);
+ printf(" tc %d fifo residue %d\n", len, fifo);
goto done;
}
/* FALLTHROUGH */
@@ -1123,7 +995,7 @@ again:
printf("asc_intr: dmalen %d len %d fifo %d\n",
state->dmalen, len, fifo); /* XXX */
regs->asc_cmd = ASC_CMD_FLUSH;
- wbflush();
+ tc_mb();
readback(regs->asc_cmd);
DELAY(2);
}
@@ -1352,7 +1224,7 @@ again:
*/
done:
- wbflush();
+ tc_mb();
/* watch out for HW race conditions and setup & hold time violations */
ir = regs->asc_status;
while (ir != (status = regs->asc_status))
@@ -1368,7 +1240,7 @@ abort:
#if 0
panic("asc_intr");
#else
- boot(4); /* XXX */
+ boot(4, NULL); /* XXX */
#endif
}
@@ -1451,6 +1323,7 @@ asc_end(asc, status, ss, ir)
scsicmd = asc->cmd[target];
asc->cmd[target] = (ScsiCmd *)0;
state = &asc->st[target];
+ untimeout(asc_timeout, scsicmd);
#ifdef DEBUG
if (asc_debug > 1) {
@@ -1544,13 +1417,36 @@ asc_dma_in(asc, status, ss, ir)
state->buflen -= len;
}
-#ifdef DEBUG
if (!(state->flags & DMA_IN_PROGRESS) &&
(regs->asc_flags & ASC_FLAGS_FIFO_CNT) != 0) {
- printf("asc_dma_in: FIFO count %x flags %x\n",
- regs->asc_flags, state->flags);
+ volatile int async_fifo_junk = 0;
+
+ /*
+ * If the target is asynchronous, the FIFO contains
+ * a byte of garbage. (see the Mach mk84 53c94 driver,
+ * where this occurs on tk-50s and exabytes.)
+ * It also occurs on asynch disks like SCSI-1 disks.
+ * Recover by reading the byte of junk from the fifo if,
+ * and only if, the target is async. If the target is
+ * synch, there is no junk, and reading the fifo
+ * deadlocks our SCSI state machine.
+ */
+ if (state->sync_offset == 0)
+ async_fifo_junk = regs->asc_fifo;
+#ifdef DEBUG
+ printf("%s: asc_dma_in: FIFO count %x flags %x sync_offset %d",
+ asc->sc_dev.dv_xname, regs->asc_flags,
+ state->flags, state->sync_offset);
+ if (state->sync_offset != 0)
+ printf("\n");
+ else
+ printf(" unexpected fifo data %x\n", async_fifo_junk);
+#ifdef DIAGNOSTIC
+ asc_DumpLog("asc_dma_in");
+#endif /* DIAGNOSTIC */
+#endif /* DEBUG */
+
}
-#endif
/* setup to start reading the next chunk */
len = state->buflen;
#ifdef DEBUG
@@ -1884,13 +1780,13 @@ asc_sendsync(asc, status, ss, ir)
/* send the extended synchronous negotiation message */
regs->asc_fifo = SCSI_EXTENDED_MSG;
- wbflush();
+ tc_mb();
regs->asc_fifo = 3;
- wbflush();
+ tc_mb();
regs->asc_fifo = SCSI_SYNCHRONOUS_XFER;
- wbflush();
+ tc_mb();
regs->asc_fifo = SCSI_MIN_PERIOD;
- wbflush();
+ tc_mb();
regs->asc_fifo = ASC_MAX_OFFSET;
/* state to resume after we see the sync reply message */
state->script = asc->script + 2;
@@ -1915,13 +1811,13 @@ asc_replysync(asc, status, ss, ir)
#endif
/* send synchronous transfer in response to a request */
regs->asc_fifo = SCSI_EXTENDED_MSG;
- wbflush();
+ tc_mb();
regs->asc_fifo = 3;
- wbflush();
+ tc_mb();
regs->asc_fifo = SCSI_SYNCHRONOUS_XFER;
- wbflush();
+ tc_mb();
regs->asc_fifo = asc_to_scsi_period[state->sync_period] * asc->tb_ticks;
- wbflush();
+ tc_mb();
regs->asc_fifo = state->sync_offset;
regs->asc_cmd = ASC_CMD_XFER_INFO;
readback(regs->asc_cmd);
@@ -2146,131 +2042,25 @@ asc_disconnect(asc, status, ss, ir)
return (1);
}
-/*
- * DMA handling routines. For a turbochannel device, just set the dmar.
- * For the I/O ASIC, handle the actual DMA interface.
- */
-static void
-tb_dma_start(asc, state, cp, flag)
- asc_softc_t asc;
- State *state;
- caddr_t cp;
- int flag;
-{
-
- if (flag == ASCDMA_WRITE)
- *asc->dmar = ASC_DMAR_WRITE | ASC_DMA_ADDR(cp);
- else
- *asc->dmar = ASC_DMA_ADDR(cp);
-}
-
-static void
-tb_dma_end(asc, state, flag)
- asc_softc_t asc;
- State *state;
- int flag;
-{
-
-}
-static void
-asic_dma_start(asc, state, cp, flag)
- asc_softc_t asc;
- State *state;
- caddr_t cp;
- int flag;
+void
+asc_timeout(arg)
+ void *arg;
{
- register volatile u_int *ssr = (volatile u_int *)
- IOASIC_REG_CSR(ioasic_base);
- u_int phys, nphys;
-
- /* stop DMA engine first */
- *ssr &= ~IOASIC_CSR_DMAEN_SCSI;
- *((volatile int *)IOASIC_REG_SCSI_SCR(ioasic_base)) = 0;
-
- phys = MACH_CACHED_TO_PHYS(cp);
- cp = (caddr_t)mips_trunc_page(cp + NBPG);
- nphys = MACH_CACHED_TO_PHYS(cp);
-
- asc->dma_next = cp;
- asc->dma_xfer = state->dmalen - (nphys - phys);
-
- *(volatile int *)IOASIC_REG_SCSI_DMAPTR(ioasic_base) =
- IOASIC_DMA_ADDR(phys);
- *(volatile int *)IOASIC_REG_SCSI_DMANPTR(ioasic_base) =
- IOASIC_DMA_ADDR(nphys);
- if (flag == ASCDMA_READ)
- *ssr |= IOASIC_CSR_SCSI_DIR | IOASIC_CSR_DMAEN_SCSI;
- else
- *ssr = (*ssr & ~IOASIC_CSR_SCSI_DIR) | IOASIC_CSR_DMAEN_SCSI;
- wbflush();
-}
+ int s = splbio();
+ ScsiCmd *scsicmd = (ScsiCmd *) arg;
-static void
-asic_dma_end(asc, state, flag)
- asc_softc_t asc;
- State *state;
- int flag;
-{
- register volatile u_int *ssr = (volatile u_int *)
- IOASIC_REG_CSR(ioasic_base);
- register volatile u_int *dmap = (volatile u_int *)
- IOASIC_REG_SCSI_DMAPTR(ioasic_base);
- register u_short *to;
- register int w;
- int nb;
-
- *ssr &= ~IOASIC_CSR_DMAEN_SCSI;
- to = (u_short *)MACH_PHYS_TO_CACHED(*dmap >> 3);
- *dmap = -1;
- *((volatile int *)IOASIC_REG_SCSI_DMANPTR(ioasic_base)) = -1;
- wbflush();
-
- if (flag == ASCDMA_READ) {
- MachFlushDCache(MACH_PHYS_TO_CACHED(
- MACH_UNCACHED_TO_PHYS(state->dmaBufAddr)), state->dmalen);
- if ( (nb = *((int *)IOASIC_REG_SCSI_SCR(ioasic_base))) != 0) {
- /* pick up last upto6 bytes, sigh. */
-
- /* Last byte really xferred is.. */
- w = *(int *)IOASIC_REG_SCSI_SDR0(ioasic_base);
- *to++ = w;
- if (--nb > 0) {
- w >>= 16;
- *to++ = w;
- }
- if (--nb > 0) {
- w = *(int *)IOASIC_REG_SCSI_SDR1(ioasic_base);
- *to++ = w;
- }
- }
- }
+ printf("asc_timeout: cmd %p drive %d\n", scsicmd, scsicmd->sd->sd_drive);
+#ifdef DEBUG
+ asc_DumpLog("asc_timeout");
+#endif
+#if 0
+ panic("asc_timeout");
+#else
+ boot(4, NULL); /* XXX */
+#endif
}
-#ifdef notdef
-/*
- * Called by asic_intr() for scsi dma pointer update interrupts.
- */
-void
-asc_dma_intr()
-{
- asc_softc_t asc = &asc_cd.cd_devs[0]; /*XXX*/
- u_int next_phys;
-
- asc->dma_xfer -= NBPG;
- if (asc->dma_xfer <= -NBPG) {
- volatile u_int *ssr = (volatile u_int *)
- IOASIC_REG_CSR(ioasic_base);
- *ssr &= ~IOASIC_CSR_DMAEN_SCSI;
- } else {
- asc->dma_next += NBPG;
- next_phys = MACH_CACHED_TO_PHYS(asc->dma_next);
- }
- *(volatile int *)IOASIC_REG_SCSI_DMANPTR(ioasic_base) =
- IOASIC_DMA_ADDR(next_phys);
- wbflush();
-}
-#endif /*notdef*/
#ifdef DEBUG
void
diff --git a/sys/dev/tc/devlist2h.awk b/sys/dev/tc/devlist2h.awk
index c0b69a79943..9164d87ac26 100644
--- a/sys/dev/tc/devlist2h.awk
+++ b/sys/dev/tc/devlist2h.awk
@@ -1,6 +1,6 @@
#! /usr/bin/awk -f
-# $OpenBSD: devlist2h.awk,v 1.2 1996/06/10 07:34:58 deraadt Exp $
-# $NetBSD: devlist2h.awk,v 1.2.4.1 1996/06/05 18:34:36 cgd Exp $
+# $OpenBSD: devlist2h.awk,v 1.3 1996/12/08 01:03:03 niklas Exp $
+# $NetBSD: devlist2h.awk,v 1.3 1996/06/05 18:32:19 cgd Exp $
#
# Copyright (c) 1995, 1996 Christopher G. Demetriou
# All rights reserved.
diff --git a/sys/dev/tc/if_fta.c b/sys/dev/tc/if_fta.c
index 74686143530..d0307372127 100644
--- a/sys/dev/tc/if_fta.c
+++ b/sys/dev/tc/if_fta.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_fta.c,v 1.4 1996/05/20 15:53:09 thorpej Exp $ */
+/* $NetBSD: if_fta.c,v 1.7 1996/10/22 21:37:26 cgd Exp $ */
/*-
* Copyright (c) 1996 Matt Thomas <matt@3am-software.com>
@@ -86,18 +86,22 @@ pdq_tc_attach(
pdq_softc_t * const sc = (pdq_softc_t *) self;
struct tc_attach_args * const ta = (struct tc_attach_args *) aux;
- sc->sc_bc = ta->ta_bc;
+ /*
+ * NOTE: sc_bc is an alias for sc_csrtag and sc_membase is an
+ * alias for sc_csrhandle. sc_iobase is not used in this front-end.
+ */
+ sc->sc_csrtag = ta->ta_memt;
bcopy(sc->sc_dev.dv_xname, sc->sc_if.if_xname, IFNAMSIZ);
sc->sc_if.if_flags = 0;
sc->sc_if.if_softc = sc;
- if (bus_mem_map(sc->sc_bc, ta->ta_addr + PDQ_TC_CSR_OFFSET,
- PDQ_TC_CSR_SPACE, 0, &sc->sc_membase)) {
+ if (bus_space_map(sc->sc_csrtag, ta->ta_addr + PDQ_TC_CSR_OFFSET,
+ PDQ_TC_CSR_SPACE, 0, &sc->sc_csrhandle)) {
printf("\n%s: can't map card memory!\n", sc->sc_dev.dv_xname);
return;
}
- sc->sc_pdq = pdq_initialize(sc->sc_bc, sc->sc_membase,
+ sc->sc_pdq = pdq_initialize(sc->sc_csrtag, sc->sc_csrhandle,
sc->sc_if.if_xname, 0,
(void *) sc, PDQ_DEFTA);
if (sc->sc_pdq == NULL) {
diff --git a/sys/dev/tc/if_le_dec.c b/sys/dev/tc/if_le_dec.c
index 5e2093849f9..50094f17fdb 100644
--- a/sys/dev/tc/if_le_dec.c
+++ b/sys/dev/tc/if_le_dec.c
@@ -1,4 +1,4 @@
-/* $NetBSD: if_le_dec.c,v 1.1 1996/05/07 02:24:55 thorpej Exp $ */
+/* $NetBSD: if_le_dec.c,v 1.3 1996/10/13 01:38:38 christos Exp $ */
/*-
* Copyright (c) 1995 Charles M. Hannum. All rights reserved.
diff --git a/sys/dev/tc/tc.c b/sys/dev/tc/tc.c
index dc1d61f37eb..0caaeab2c2e 100644
--- a/sys/dev/tc/tc.c
+++ b/sys/dev/tc/tc.c
@@ -1,5 +1,5 @@
-/* $OpenBSD: tc.c,v 1.8 1996/11/23 21:47:10 kstailey Exp $ */
-/* $NetBSD: tc.c,v 1.16 1996/05/17 23:39:19 cgd Exp $ */
+/* $OpenBSD: tc.c,v 1.9 1996/12/08 01:03:05 niklas Exp $ */
+/* $NetBSD: tc.c,v 1.20 1996/10/22 21:37:29 cgd Exp $ */
/*
* Copyright (c) 1994, 1995 Carnegie-Mellon University.
@@ -132,7 +132,7 @@ tcattach(parent, self, aux)
*/
strncpy(ta.ta_modname, builtin->tcb_modname, TC_ROM_LLEN);
#ifdef __alpha__ /* XXX */
- ta.ta_bc = tba->tba_bc;
+ ta.ta_memt = tba->tba_memt;
#endif
ta.ta_modname[TC_ROM_LLEN] = '\0';
ta.ta_slot = builtin->tcb_slot;
diff --git a/sys/dev/tc/tcdevs b/sys/dev/tc/tcdevs
index bd7b087c711..3882417d4f6 100644
--- a/sys/dev/tc/tcdevs
+++ b/sys/dev/tc/tcdevs
@@ -1,5 +1,5 @@
-$OpenBSD: tcdevs,v 1.2 1996/05/26 00:27:54 deraadt Exp $
-/* $NetBSD: tcdevs,v 1.3 1996/03/05 23:15:59 cgd Exp $ */
+$OpenBSD: tcdevs,v 1.3 1996/12/08 01:03:05 niklas Exp $
+/* $NetBSD: tcdevs,v 1.6 1996/08/26 23:39:34 cgd Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou
@@ -32,22 +32,24 @@ $OpenBSD: tcdevs,v 1.2 1996/05/26 00:27:54 deraadt Exp $
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+device DGLTA-FA otto DGLTA ATM
+device FORE_ATM fa Fore TCA-100 ATM
device KZTSA-AA tza TZA FWD SCSI
+device OTTO otto DEC SRC \"OTTO\" ATM
device PMAD-AA le LANCE Ethernet
-device PMAF-AA fza DEFZA FDDI Controller
-device PMAF-F fta DEFTA FDDI Controller
+device PMAF-AA fza DEFZA FDDI
+device PMAF-F fta DEFTA FDDI
device PMAG-AA mfb Monochrome Frame Buffer
device PMAG-BA cfb Color Frame Buffer
-device PMAG-CA ga 2D Graphic Board
-device PMAG-DA gq 3D Graphic Board (LM)
-device PMAG-FA gq 3D Graphic Board (HE)
+device PMAG-CA ga 2D Graphics
+device PMAG-DA gq 3D Graphics (LM)
# the following entry may be incorrect
device PMAG-DV xcfb Maxine Color Frame Buffer
+device PMAG-FA gq 3D Graphics (HE)
device PMAGB-BA sfb Smart Frame Buffer
device PMAGD sfbp Smart Frame Buffer Plus, unknown bpp
device PMAGD-AA sfbp Smart Frame Buffer Plus, 8bpp
device PMAGD-BA sfbp Smart Frame Buffer Plus, 32bpp
device PMAZ-AA asc 53c94 SCSI
-device T3PKT tt DECWRL Turbochannel T3
device T1D4PKT ds DECWRL Turbochannel T1
-device FORE_ATM fa Fore TCA-100 ATM
+device T3PKT tt DECWRL Turbochannel T3
diff --git a/sys/dev/tc/tcdevs.h b/sys/dev/tc/tcdevs.h
index c0a1fe831a3..6ff7b15427b 100644
--- a/sys/dev/tc/tcdevs.h
+++ b/sys/dev/tc/tcdevs.h
@@ -2,9 +2,9 @@
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
*
* generated from:
- * OpenBSD
+ * OpenBSD: tcdevs,v 1.2 1996/05/26 00:27:54 deraadt Exp
*/
-/* $NetBSD: tcdevs,v 1.3 1996/03/05 23:15:59 cgd Exp $ */
+/* $NetBSD: tcdevs,v 1.6 1996/08/26 23:39:34 cgd Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou
@@ -37,17 +37,26 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#define TC_DEVICE_DGLTA_FA "otto"
+#define TC_DESCRIPTION_DGLTA_FA "DGLTA ATM"
+
+#define TC_DEVICE_FORE_ATM "fa"
+#define TC_DESCRIPTION_FORE_ATM "Fore TCA-100 ATM"
+
#define TC_DEVICE_KZTSA_AA "tza"
#define TC_DESCRIPTION_KZTSA_AA "TZA FWD SCSI"
+#define TC_DEVICE_OTTO "otto"
+#define TC_DESCRIPTION_OTTO "DEC SRC \"OTTO\" ATM"
+
#define TC_DEVICE_PMAD_AA "le"
#define TC_DESCRIPTION_PMAD_AA "LANCE Ethernet"
#define TC_DEVICE_PMAF_AA "fza"
-#define TC_DESCRIPTION_PMAF_AA "DEFZA FDDI Controller"
+#define TC_DESCRIPTION_PMAF_AA "DEFZA FDDI"
#define TC_DEVICE_PMAF_F "fta"
-#define TC_DESCRIPTION_PMAF_F "DEFTA FDDI Controller"
+#define TC_DESCRIPTION_PMAF_F "DEFTA FDDI"
#define TC_DEVICE_PMAG_AA "mfb"
#define TC_DESCRIPTION_PMAG_AA "Monochrome Frame Buffer"
@@ -56,17 +65,17 @@
#define TC_DESCRIPTION_PMAG_BA "Color Frame Buffer"
#define TC_DEVICE_PMAG_CA "ga"
-#define TC_DESCRIPTION_PMAG_CA "2D Graphic Board"
+#define TC_DESCRIPTION_PMAG_CA "2D Graphics"
#define TC_DEVICE_PMAG_DA "gq"
-#define TC_DESCRIPTION_PMAG_DA "3D Graphic Board (LM)"
-
-#define TC_DEVICE_PMAG_FA "gq"
-#define TC_DESCRIPTION_PMAG_FA "3D Graphic Board (HE)"
+#define TC_DESCRIPTION_PMAG_DA "3D Graphics (LM)"
#define TC_DEVICE_PMAG_DV "xcfb"
#define TC_DESCRIPTION_PMAG_DV "Maxine Color Frame Buffer"
+#define TC_DEVICE_PMAG_FA "gq"
+#define TC_DESCRIPTION_PMAG_FA "3D Graphics (HE)"
+
#define TC_DEVICE_PMAGB_BA "sfb"
#define TC_DESCRIPTION_PMAGB_BA "Smart Frame Buffer"
@@ -82,11 +91,8 @@
#define TC_DEVICE_PMAZ_AA "asc"
#define TC_DESCRIPTION_PMAZ_AA "53c94 SCSI"
-#define TC_DEVICE_T3PKT "tt"
-#define TC_DESCRIPTION_T3PKT "DECWRL Turbochannel T3"
-
#define TC_DEVICE_T1D4PKT "ds"
#define TC_DESCRIPTION_T1D4PKT "DECWRL Turbochannel T1"
-#define TC_DEVICE_FORE_ATM "fa"
-#define TC_DESCRIPTION_FORE_ATM "Fore TCA-100 ATM"
+#define TC_DEVICE_T3PKT "tt"
+#define TC_DESCRIPTION_T3PKT "DECWRL Turbochannel T3"
diff --git a/sys/dev/tc/tcdevs_data.h b/sys/dev/tc/tcdevs_data.h
index 1da4880df85..13f9a6df0ce 100644
--- a/sys/dev/tc/tcdevs_data.h
+++ b/sys/dev/tc/tcdevs_data.h
@@ -2,9 +2,9 @@
* THIS FILE AUTOMATICALLY GENERATED. DO NOT EDIT.
*
* generated from:
- * OpenBSD
+ * OpenBSD: tcdevs,v 1.2 1996/05/26 00:27:54 deraadt Exp
*/
-/* $NetBSD: tcdevs,v 1.3 1996/03/05 23:15:59 cgd Exp $ */
+/* $NetBSD: tcdevs,v 1.6 1996/08/26 23:39:34 cgd Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou
@@ -39,11 +39,26 @@
struct tc_knowndev tc_knowndevs[] = {
{
+ "DGLTA-FA",
+ TC_DEVICE_DGLTA_FA,
+ TC_DESCRIPTION_DGLTA_FA,
+ },
+ {
+ "FORE_ATM",
+ TC_DEVICE_FORE_ATM,
+ TC_DESCRIPTION_FORE_ATM,
+ },
+ {
"KZTSA-AA",
TC_DEVICE_KZTSA_AA,
TC_DESCRIPTION_KZTSA_AA,
},
{
+ "OTTO ",
+ TC_DEVICE_OTTO,
+ TC_DESCRIPTION_OTTO,
+ },
+ {
"PMAD-AA ",
TC_DEVICE_PMAD_AA,
TC_DESCRIPTION_PMAD_AA,
@@ -79,16 +94,16 @@ struct tc_knowndev tc_knowndevs[] = {
TC_DESCRIPTION_PMAG_DA,
},
{
- "PMAG-FA ",
- TC_DEVICE_PMAG_FA,
- TC_DESCRIPTION_PMAG_FA,
- },
- {
"PMAG-DV ",
TC_DEVICE_PMAG_DV,
TC_DESCRIPTION_PMAG_DV,
},
{
+ "PMAG-FA ",
+ TC_DEVICE_PMAG_FA,
+ TC_DESCRIPTION_PMAG_FA,
+ },
+ {
"PMAGB-BA",
TC_DEVICE_PMAGB_BA,
TC_DESCRIPTION_PMAGB_BA,
@@ -114,19 +129,14 @@ struct tc_knowndev tc_knowndevs[] = {
TC_DESCRIPTION_PMAZ_AA,
},
{
- "T3PKT ",
- TC_DEVICE_T3PKT,
- TC_DESCRIPTION_T3PKT,
- },
- {
"T1D4PKT ",
TC_DEVICE_T1D4PKT,
TC_DESCRIPTION_T1D4PKT,
},
{
- "FORE_ATM",
- TC_DEVICE_FORE_ATM,
- TC_DESCRIPTION_FORE_ATM,
+ "T3PKT ",
+ TC_DEVICE_T3PKT,
+ TC_DESCRIPTION_T3PKT,
},
{ NULL, NULL, NULL, }
};
diff --git a/sys/dev/tc/tcvar.h b/sys/dev/tc/tcvar.h
index 487e25b3c1b..3be4d7677c8 100644
--- a/sys/dev/tc/tcvar.h
+++ b/sys/dev/tc/tcvar.h
@@ -1,5 +1,5 @@
-/* $OpenBSD: tcvar.h,v 1.5 1996/11/12 20:31:02 niklas Exp $ */
-/* $NetBSD: tcvar.h,v 1.5 1996/05/17 23:38:16 cgd Exp $ */
+/* $OpenBSD: tcvar.h,v 1.6 1996/12/08 01:03:07 niklas Exp $ */
+/* $NetBSD: tcvar.h,v 1.7 1996/10/22 21:37:31 cgd Exp $ */
/*
* Copyright (c) 1995 Carnegie-Mellon University.
@@ -35,8 +35,8 @@
* Definitions for TurboChannel autoconfiguration.
*/
-#ifdef __alpha__ /* XXX pmax does not yet have machine/bus.old.h */
-#include <machine/bus.old.h>
+#ifdef __alpha__ /* XXX pmax does not yet have machine/bus.h */
+#include <machine/bus.h>
#endif
#include <dev/tc/tcreg.h>
@@ -60,7 +60,7 @@ ERROR: COMPILING FOR UNSUPPORTED MACHINE, OR MORE THAN ONE.
* by the pmax port, and not the new definitions provided by the
* alpha port.
*/
-#ifdef __alpha_
+#ifdef __alpha__
/*
* On the alpha, map the new definitions to the old.
*/
@@ -93,7 +93,7 @@ typedef enum {
struct tcbus_attach_args {
char *tba_busname; /* XXX should be common */
#ifdef __alpha__ /* XXX */
- bus_chipset_tag_t tba_bc; /* XXX should be common */
+ bus_space_tag_t tba_memt;
#endif
/* Bus information */
@@ -115,7 +115,7 @@ struct tcbus_attach_args {
*/
struct tc_attach_args {
#ifdef __alpha__ /* XXX */
- bus_chipset_tag_t ta_bc;
+ bus_space_tag_t ta_memt;
#endif
char ta_modname[TC_ROM_LLEN+1];