summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
authorragge <ragge@NetBSD.org>1999-06-06 19:16:18 +0000
committerragge <ragge@NetBSD.org>1999-06-06 19:16:18 +0000
commit508b5c5cee42abb91f02e33533dd74f64e7ae88a (patch)
treeed1aad6d1db5110db36a494f5992fa1f145788bb /sys/dev
parenta2692d780bc75b81e9b302395ecae97263fea7fe (diff)
Bus'ify the mscp code also.
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/mscp/files.mscp10
-rw-r--r--sys/dev/mscp/mscp.c117
-rw-r--r--sys/dev/mscp/mscp_disk.c12
-rw-r--r--sys/dev/mscp/mscp_subr.c186
-rw-r--r--sys/dev/mscp/mscp_tape.c12
-rw-r--r--sys/dev/mscp/mscpvar.h64
6 files changed, 183 insertions, 218 deletions
diff --git a/sys/dev/mscp/files.mscp b/sys/dev/mscp/files.mscp
index 59296d257ce..61a1a4cdff4 100644
--- a/sys/dev/mscp/files.mscp
+++ b/sys/dev/mscp/files.mscp
@@ -1,11 +1,11 @@
-# $NetBSD: files.mscp,v 1.6 1999/05/29 19:10:52 ragge Exp $
+# $NetBSD: files.mscp,v 1.7 1999/06/06 19:16:18 ragge Exp $
#
# File and device description for MSCP devices.
#
define mscp {}
-file arch/vax/mscp/mscp.c mscp
-file arch/vax/mscp/mscp_subr.c mscp
+file dev/mscp/mscp.c mscp
+file dev/mscp/mscp_subr.c mscp
device mscpbus {drive = -1}
attach mscpbus at mscp
@@ -15,9 +15,9 @@ attach rx at mscpbus
device ra: disk
attach ra at mscpbus
-file arch/vax/mscp/mscp_disk.c ra | rx needs-flag
+file dev/mscp/mscp_disk.c ra | rx needs-flag
device mt: tape
attach mt at mscpbus
-file arch/vax/mscp/mscp_tape.c mt needs-flag
+file dev/mscp/mscp_tape.c mt needs-flag
diff --git a/sys/dev/mscp/mscp.c b/sys/dev/mscp/mscp.c
index 43103cb167c..abeee3168ce 100644
--- a/sys/dev/mscp/mscp.c
+++ b/sys/dev/mscp/mscp.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mscp.c,v 1.10 1999/05/29 19:11:02 ragge Exp $ */
+/* $NetBSD: mscp.c,v 1.11 1999/06/06 19:16:18 ragge Exp $ */
/*
* Copyright (c) 1996 Ludd, University of Lule}, Sweden.
@@ -50,15 +50,13 @@
#include <sys/proc.h>
#include <sys/systm.h>
-#include <vax/mscp/mscp.h>
-#include <vax/mscp/mscpvar.h>
+#include <machine/bus.h>
-#define PCMD PSWP /* priority for command packet waits */
+#include <dev/mscp/mscp.h>
+#include <dev/mscp/mscpreg.h>
+#include <dev/mscp/mscpvar.h>
-/*
- * During transfers, mapping info is saved in the buffer's b_resid.
- */
-#define b_info b_resid
+#define PCMD PSWP /* priority for command packet waits */
/*
* Get a command packet. Second argument is true iff we are
@@ -73,7 +71,7 @@ mscp_getcp(mi, canwait)
#define mri (&mi->mi_cmd)
register struct mscp *mp;
register int i;
- int s = splbio();
+ int s = splimp();
again:
/*
@@ -136,10 +134,11 @@ mscp_dorsp(mi)
struct device *drive;
struct mscp_device *me = mi->mi_me;
struct mscp_ctlr *mc = mi->mi_mc;
- register struct buf *bp;
- register struct mscp *mp;
- register int nextrsp;
- int st, error, info;
+ struct buf *bp;
+ struct mscp *mp;
+ struct mscp_xi *mxi;
+ int nextrsp;
+ int st, error;
extern int cold;
extern struct mscp slavereply;
@@ -310,22 +309,25 @@ loop:
*/
rwend:
#ifdef DIAGNOSTIC
- if (mp->mscp_cmdref == 0) {
+ if (mp->mscp_cmdref >= NCMD) {
/*
* No buffer means there is a bug somewhere!
*/
- printf("%s: io done, but no buffer?\n",
+ printf("%s: io done, but bad xfer number?\n",
drive->dv_xname);
mscp_hexdump(mp);
break;
}
#endif
- bp = (struct buf *) mp->mscp_cmdref;
if (mp->mscp_cmdref == -1) {
(*me->me_cmddone)(drive, mp);
break;
}
+ mxi = &mi->mi_xi[mp->mscp_cmdref];
+ if (mxi->mxi_inuse == 0)
+ panic("mxi not inuse");
+ bp = mxi->mxi_bp;
/*
* Mark any error-due-to-bad-LBN (via `goto rwend').
* WHAT STATUS WILL THESE HAVE? IT SURE WOULD BE NICE
@@ -342,11 +344,6 @@ rwend:
}
/*
- * Unlink the transfer from the wait queue.
- */
- _remque(&bp->b_actf);
-
- /*
* If the transfer has something to do with bad
* block forwarding, let the driver handle the
* rest.
@@ -381,12 +378,14 @@ rwend:
* done. If the I/O wait queue is now empty, release
* the shared BDP, if any.
*/
- info = bp->b_info; /* we are about to clobber it */
bp->b_resid = bp->b_bcount - mp->mscp_seq.seq_bytecount;
+ bus_dmamap_unload(mi->mi_dmat, mxi->mxi_dmam);
- (*mc->mc_ctlrdone)(mi->mi_dev.dv_parent, info);
+ (*mc->mc_ctlrdone)(mi->mi_dev.dv_parent);
(*me->me_iodone)(drive, bp);
out:
+ mxi->mxi_inuse = 0;
+ mi->mi_mxiuse |= (1 << mp->mscp_cmdref);
break;
case M_OP_REPLACE | M_OP_END:
@@ -422,12 +421,7 @@ unknown:
*/
#ifdef notyet /* XXX */
if (ui->ui_flags & UNIT_REQUEUE) {
- bp = &md->md_utab[ui->ui_unit];
- if (bp->b_active) panic("mscp_dorsp requeue");
- MSCP_APPEND(bp, mi->mi_XXXtab, b_hash.le_next);
-/* Was: MSCP_APPEND(bp, mi->mi_XXXtab, b_forw); */
- bp->b_active = 1;
- ui->ui_flags &= ~UNIT_REQUEUE;
+ ...
}
#endif
done:
@@ -449,69 +443,6 @@ void
mscp_requeue(mi)
struct mscp_softc *mi;
{
-#if 0
- register struct mscp_device *me = mi->mi_me;
- register struct buf *bp, *dp;
- register int unit;
- struct buf *nextbp;
-#endif
-
-panic("mscp_requeue");
- /*
- * Clear the controller chain. Mark everything un-busy; we
- * will soon fix any that are in fact busy.
- */
-#ifdef notyet /* XXX */
- mi->mi_XXXtab->b_actf = NULL;
- mi->mi_XXXtab->b_active = 0;
- for (unit = 0, dp = md->md_utab; unit < md->md_nunits; unit++, dp++) {
- ui = md->md_dinfo[unit];
- if (ui == NULL || !ui->ui_alive || ui->ui_ctlr != mi->mi_ctlr)
- continue; /* not ours */
- dp->b_hash.le_next = NULL;
- dp->b_active = 0;
- }
- /*
- * Scan the wait queue, linking buffers onto drive queues.
- * Note that these must be put at the front of the drive queue,
- * lest we reorder I/O operations.
- */
- for (bp = *mi->mi_XXXwtab.b_actb; bp != &mi->mi_XXXwtab; bp = nextbp) {
- nextbp = *bp->b_actb;
- dp = &md->md_utab[minor(bp->b_dev) >> md->md_unitshift];
- bp->b_actf = dp->b_actf;
- if (dp->b_actf == NULL)
- dp->b_actb = (void *)bp;
- dp->b_actf = bp;
- }
- mi->mi_XXXwtab.b_actf = *mi->mi_XXXwtab.b_actb = &mi->mi_XXXwtab;
-
- /*
- * Scan for drives waiting for on line or status responses,
- * and for drives with pending transfers. Put these on the
- * controller queue, and mark the controller busy.
- */
- for (unit = 0, dp = md->md_utab; unit < md->md_nunits; unit++, dp++) {
- ui = md->md_dinfo[unit];
- if (ui == NULL || !ui->ui_alive || ui->ui_ctlr != mi->mi_ctlr)
- continue;
- ui->ui_flags &= ~(UNIT_HAVESTATUS | UNIT_ONLINE);
- if ((ui->ui_flags & UNIT_REQUEUE) == 0 && dp->b_actf == NULL)
- continue;
- ui->ui_flags &= ~UNIT_REQUEUE;
- MSCP_APPEND(dp, mi->mi_XXXtab, b_hash.le_next);
-
- dp->b_active = 1;
- mi->mi_XXXtab->b_active = 1;
- }
-
-#endif
-#ifdef AVOID_EMULEX_BUG
- /*
- * ... and clear the index-to-buffer table.
- */
- for (unit = 0; unit < AEB_MAX_BP; unit++)
- mi->mi_bp[unit] = 0;
-#endif
+ panic("mscp_requeue");
}
diff --git a/sys/dev/mscp/mscp_disk.c b/sys/dev/mscp/mscp_disk.c
index e1a2ea8db07..875633a3489 100644
--- a/sys/dev/mscp/mscp_disk.c
+++ b/sys/dev/mscp/mscp_disk.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mscp_disk.c,v 1.20 1999/05/29 19:11:41 ragge Exp $ */
+/* $NetBSD: mscp_disk.c,v 1.21 1999/06/06 19:16:18 ragge Exp $ */
/*
* Copyright (c) 1996 Ludd, University of Lule}, Sweden.
* Copyright (c) 1988 Regents of the University of California.
@@ -63,11 +63,13 @@
#include <ufs/ufs/dinode.h>
#include <ufs/ffs/fs.h>
+#include <machine/bus.h>
#include <machine/cpu.h>
#include <machine/rpb.h>
-#include <vax/mscp/mscp.h>
-#include <vax/mscp/mscpvar.h>
+#include <dev/mscp/mscp.h>
+#include <dev/mscp/mscpreg.h>
+#include <dev/mscp/mscpvar.h>
#include "locators.h"
#include "ioconf.h"
@@ -285,7 +287,7 @@ raclose(dev, flags, fmt, p)
*/
#if notyet
if (ra->ra_openpart == 0) {
- s = splbio();
+ s = splimp();
while (udautab[unit].b_actf)
sleep((caddr_t)&udautab[unit], PZERO - 1);
splx(s);
@@ -579,7 +581,7 @@ rx_putonline(rx)
*mp->mscp_addr |= MSCP_OWN | MSCP_INT;
/* Poll away */
- i = *mi->mi_ip;
+ i = bus_space_read_2(mi->mi_iot, mi->mi_iph, 0);
if (tsleep(&rx->ra_dev.dv_unit, PRIBIO, "rxonline", 100*100))
rx->ra_state = DK_CLOSED;
diff --git a/sys/dev/mscp/mscp_subr.c b/sys/dev/mscp/mscp_subr.c
index c7ea6db3dfd..b1734897085 100644
--- a/sys/dev/mscp/mscp_subr.c
+++ b/sys/dev/mscp/mscp_subr.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mscp_subr.c,v 1.11 1999/05/29 19:11:52 ragge Exp $ */
+/* $NetBSD: mscp_subr.c,v 1.12 1999/06/06 19:16:18 ragge Exp $ */
/*
* Copyright (c) 1996 Ludd, University of Lule}, Sweden.
* Copyright (c) 1988 Regents of the University of California.
@@ -48,11 +48,12 @@
#include <sys/systm.h>
#include <sys/proc.h>
+#include <machine/bus.h>
#include <machine/sid.h>
-#include <vax/mscp/mscp.h>
-#include <vax/mscp/mscpreg.h>
-#include <vax/mscp/mscpvar.h>
+#include <dev/mscp/mscp.h>
+#include <dev/mscp/mscpreg.h>
+#include <dev/mscp/mscpvar.h>
#include "ra.h"
#include "mt.h"
@@ -70,6 +71,11 @@ struct cfattach mscpbus_ca = {
sizeof(struct mscp_softc), mscp_match, mscp_attach
};
+#define READ_SA (bus_space_read_2(mi->mi_iot, mi->mi_sah, 0))
+#define READ_IP (bus_space_read_2(mi->mi_iot, mi->mi_iph, 0))
+#define WRITE_IP(x) bus_space_write_2(mi->mi_iot, mi->mi_iph, 0, (x))
+#define WRITE_SW(x) bus_space_write_2(mi->mi_iot, mi->mi_swh, 0, (x))
+
struct mscp slavereply;
/*
@@ -86,9 +92,9 @@ mscp_waitstep(mi, mask, result)
{
int status = 1;
- if ((*mi->mi_sa & mask) != result) {
+ if ((READ_SA & mask) != result) {
volatile int count = 0;
- while ((*mi->mi_sa & mask) != result) {
+ while ((READ_SA & mask) != result) {
DELAY(10000);
count += 1;
if (count > DELAYTEN)
@@ -133,11 +139,13 @@ mscp_attach(parent, self, aux)
mi->mi_mc = ma->ma_mc;
mi->mi_me = NULL;
mi->mi_type = ma->ma_type;
- mi->mi_uuda = ma->ma_uuda;
mi->mi_uda = ma->ma_uda;
- mi->mi_ip = ma->ma_ip;
- mi->mi_sa = ma->ma_sa;
- mi->mi_sw = ma->ma_sw;
+ mi->mi_dmat = ma->ma_dmat;
+ mi->mi_dmam = ma->ma_dmam;
+ mi->mi_iot = ma->ma_iot;
+ mi->mi_iph = ma->ma_iph;
+ mi->mi_sah = ma->ma_sah;
+ mi->mi_swh = ma->ma_swh;
mi->mi_ivec = ma->ma_ivec;
mi->mi_adapnr = ma->ma_adapnr;
mi->mi_ctlrnr = ma->ma_ctlrnr;
@@ -152,14 +160,22 @@ mscp_attach(parent, self, aux)
mi->mi_rsp.mri_size = NRSP;
mi->mi_rsp.mri_desc = mi->mi_uda->mp_ca.ca_rspdsc;
mi->mi_rsp.mri_ring = mi->mi_uda->mp_rsp;
- mi->mi_actf = (void *)&mi->mi_actf; /* Circular wait queue */
- mi->mi_actb = (void *)&mi->mi_actf;
+ SIMPLEQ_INIT(&mi->mi_resq);
if (mscp_init(mi)) {
printf("%s: can't init, controller hung\n",
mi->mi_dev.dv_xname);
return;
}
+ for (i = 0; i < NCMD; i++) {
+ mi->mi_mxiuse |= (1 << i);
+ if (bus_dmamap_create(mi->mi_dmat, (64*1024), 1, (64*1024),
+ 0, BUS_DMA_NOWAIT, &mi->mi_xi[i].mxi_dmam)) {
+ printf("Couldn't alloc dmamap %d\n", i);
+ return;
+ }
+ }
+
#if NRA
if (ma->ma_type & MSCPBUS_DISK) {
@@ -189,7 +205,7 @@ findunit:
*mp->mscp_addr |= MSCP_OWN | MSCP_INT;
slavereply.mscp_opcode = 0;
- i = *mi->mi_ip; /* Kick off polling */
+ i = bus_space_read_2(mi->mi_iot, mi->mi_iph, 0);
mp = &slavereply;
timeout = 1000;
while (timeout-- > 0) {
@@ -295,19 +311,19 @@ mscp_init(mi)
mi->mi_flags |= MSC_IGNOREINTR;
if ((mi->mi_type & MSCPBUS_KDB) == 0)
- *mi->mi_ip = 0; /* Kick off */
+ WRITE_IP(0); /* Kick off */;
status = mscp_waitstep(mi, MP_STEP1, MP_STEP1);/* Wait to it wakes up */
if (status == 0)
return 1; /* Init failed */
- if (*mi->mi_sa & MP_ERR) {
+ if (READ_SA & MP_ERR) {
(*mi->mi_mc->mc_saerror)(mi->mi_dev.dv_parent, 0);
return 1;
}
/* step1 */
- *mi->mi_sw = MP_ERR | (NCMDL2 << 11) | (NRSPL2 << 8) |
- MP_IE | (mi->mi_ivec >> 2);
+ WRITE_SW(MP_ERR | (NCMDL2 << 11) | (NRSPL2 << 8) |
+ MP_IE | (mi->mi_ivec >> 2));
status = mscp_waitstep(mi, STEP1MASK, STEP1GOOD);
if (status == 0) {
(*mi->mi_mc->mc_saerror)(mi->mi_dev.dv_parent, 0);
@@ -315,8 +331,9 @@ mscp_init(mi)
}
/* step2 */
- *mi->mi_sw = (int)&mi->mi_uuda->mp_ca.ca_rspdsc[0] |
- (vax_cputype == VAX_780 || vax_cputype == VAX_8600 ? MP_PI : 0);
+ WRITE_SW(((mi->mi_dmam->dm_segs[0].ds_addr & 0xffff) +
+ offsetof(struct mscp_pack, mp_ca.ca_rspdsc[0])) |
+ (vax_cputype == VAX_780 || vax_cputype == VAX_8600 ? MP_PI : 0));
status = mscp_waitstep(mi, STEP2MASK, STEP2GOOD(mi->mi_ivec >> 2));
if (status == 0) {
(*mi->mi_mc->mc_saerror)(mi->mi_dev.dv_parent, 0);
@@ -324,22 +341,23 @@ mscp_init(mi)
}
/* step3 */
- *mi->mi_sw = ((int)&mi->mi_uuda->mp_ca.ca_rspdsc[0]) >> 16;
+
+ WRITE_SW((mi->mi_dmam->dm_segs[0].ds_addr >> 16));
status = mscp_waitstep(mi, STEP3MASK, STEP3GOOD);
if (status == 0) {
(*mi->mi_mc->mc_saerror)(mi->mi_dev.dv_parent, 0);
return 1;
}
- i = *mi->mi_sa & 0377;
+ i = READ_SA & 0377;
printf(": version %d model %d\n", i & 15, i >> 4);
#define BURST 4 /* XXX */
if (mi->mi_type & MSCPBUS_UDA) {
- *mi->mi_sw = MP_GO | (BURST - 1) << 2;
+ WRITE_SW(MP_GO | (BURST - 1) << 2);
printf("%s: DMA burst size set to %d\n",
mi->mi_dev.dv_xname, BURST);
}
- *mi->mi_sw = MP_GO;
+ WRITE_SW(MP_GO);
mscp_initds(mi);
mi->mi_flags &= ~MSC_IGNOREINTR;
@@ -359,13 +377,13 @@ mscp_init(mi)
mp->mscp_sccc.sccc_errlgfl = 0;
mp->mscp_sccc.sccc_ctlrflags = M_CF_ATTN | M_CF_MISC | M_CF_THIS;
*mp->mscp_addr |= MSCP_OWN | MSCP_INT;
- i = *mi->mi_ip;
+ i = READ_IP;
count = 0;
while (count < DELAYTEN) {
if (((volatile int)mi->mi_flags & MSC_READY) != 0)
break;
- if ((j = *mi->mi_sa) & MP_ERR)
+ if ((j = READ_SA) & MP_ERR)
goto out;
DELAY(10000);
count += 1;
@@ -386,20 +404,21 @@ void
mscp_initds(mi)
struct mscp_softc *mi;
{
- struct mscp_pack *uud = mi->mi_uuda;
struct mscp_pack *ud = mi->mi_uda;
struct mscp *mp;
int i;
for (i = 0, mp = ud->mp_rsp; i < NRSP; i++, mp++) {
ud->mp_ca.ca_rspdsc[i] = MSCP_OWN | MSCP_INT |
- (long)&uud->mp_rsp[i].mscp_cmdref;
+ (mi->mi_dmam->dm_segs[0].ds_addr +
+ offsetof(struct mscp_pack, mp_rsp[i].mscp_cmdref));
mp->mscp_addr = &ud->mp_ca.ca_rspdsc[i];
mp->mscp_msglen = MSCP_MSGLEN;
}
for (i = 0, mp = ud->mp_cmd; i < NCMD; i++, mp++) {
ud->mp_ca.ca_cmddsc[i] = MSCP_INT |
- (long)&uud->mp_cmd[i].mscp_cmdref;
+ (mi->mi_dmam->dm_segs[0].ds_addr +
+ offsetof(struct mscp_pack, mp_cmd[i].mscp_cmdref));
mp->mscp_addr = &ud->mp_ca.ca_cmddsc[i];
mp->mscp_msglen = MSCP_MSGLEN;
if (mi->mi_type & MSCPBUS_TAPE)
@@ -407,6 +426,8 @@ mscp_initds(mi)
}
}
+static void mscp_kickaway(struct mscp_softc *);
+
void
mscp_intr(mi)
struct mscp_softc *mi;
@@ -428,18 +449,10 @@ mscp_intr(mi)
}
/*
- * If there are any not-yet-handled requeset, try them now.
- * XXX - We handles them (erroneous) in last-in first-handled order.
- * Must we fix this???
+ * If there are any not-yet-handled request, try them now.
*/
- while (mi->mi_w) {
- struct buf *bp = mi->mi_w;
-
- mi->mi_w = (void *)bp->b_actb;
- mscp_strategy(bp, (struct device *)mi);
- if (mi->mi_w == bp)
- break;
- }
+ if (SIMPLEQ_FIRST(&mi->mi_resq))
+ mscp_kickaway(mi);
}
int
@@ -463,7 +476,6 @@ mscp_print(aux, name)
/*
* common strategy routine for all types of MSCP devices.
- * bp is the current buf, dp is the drive queue.
*/
void
mscp_strategy(bp, usc)
@@ -471,42 +483,70 @@ mscp_strategy(bp, usc)
struct device *usc;
{
struct mscp_softc *mi = (void *)usc;
+ int s = splimp();
+
+/* SIMPLEQ_INSERT_TAIL(&mi->mi_resq, bp, xxx) */
+ bp->b_actf = NULL;
+ *mi->mi_resq.sqh_last = bp;
+ mi->mi_resq.sqh_last = &bp->b_actf;
+ mscp_kickaway(mi);
+ splx(s);
+}
+
+
+void
+mscp_kickaway(mi)
+ struct mscp_softc *mi;
+{
+ struct buf *bp;
struct mscp *mp;
- int s = spl6();
+ int next;
- /*
- * Ok; we are ready to try to start a xfer. Get a MSCP packet
- * and try to start...
- */
- if ((mp = mscp_getcp(mi, MSCP_DONTWAIT)) == NULL) {
- if (mi->mi_credits > MSCP_MINCREDITS)
- printf("%s: command ring too small\n",
- mi->mi_dev.dv_parent->dv_xname);
+ while ((bp = SIMPLEQ_FIRST(&mi->mi_resq))) {
/*
- * By some (strange) reason we didn't get a MSCP packet.
- * Put it on queue and wait for free packets.
+ * Ok; we are ready to try to start a xfer. Get a MSCP packet
+ * and try to start...
*/
- (void *)bp->b_actb = mi->mi_w;
- mi->mi_w = bp;
- splx(s);
- return;
+ if ((mp = mscp_getcp(mi, MSCP_DONTWAIT)) == NULL) {
+ if (mi->mi_credits > MSCP_MINCREDITS)
+ printf("%s: command ring too small\n",
+ mi->mi_dev.dv_parent->dv_xname);
+ /*
+ * By some (strange) reason we didn't get a MSCP packet.
+ * Just return and wait for free packets.
+ */
+ return;
+ }
+
+ if ((next = (ffs(mi->mi_mxiuse) - 1)) < 0)
+ panic("no mxi buffers");
+ mi->mi_mxiuse &= ~(1 << next);
+ if (mi->mi_xi[next].mxi_inuse)
+ panic("mxi inuse");
+ /*
+ * Set up the MSCP packet and ask the ctlr to start.
+ */
+ mp->mscp_opcode =
+ (bp->b_flags & B_READ) ? M_OP_READ : M_OP_WRITE;
+ mp->mscp_cmdref = next;
+ mi->mi_xi[next].mxi_bp = bp;
+ mi->mi_xi[next].mxi_mp = mp;
+ mi->mi_xi[next].mxi_inuse = 1;
+ bp->b_resid = next;
+ (*mi->mi_me->me_fillin)(bp, mp);
+ (*mi->mi_mc->mc_go)(mi->mi_dev.dv_parent, &mi->mi_xi[next]);
+ if ((mi->mi_resq.sqh_first = bp->b_actf) == NULL)
+ mi->mi_resq.sqh_last = &mi->mi_resq.sqh_first;
+#if 0
+ mi->mi_w = bp->b_actf;
+#endif
}
-
- /*
- * Set up the MSCP packet and ask the ctlr to start.
- */
- mp->mscp_opcode = (bp->b_flags & B_READ) ? M_OP_READ : M_OP_WRITE;
- (*mi->mi_me->me_fillin)(bp, mp);
- (void *)bp->b_actb = mp; /* b_actb is unused, save mscp packet here */
- (*mi->mi_mc->mc_go)(mi->mi_dev.dv_parent, bp);
- splx(s);
}
void
-mscp_dgo(mi, buffer, info, bp)
+mscp_dgo(mi, mxi)
struct mscp_softc *mi;
- long buffer, info;
- struct buf *bp;
+ struct mscp_xi *mxi;
{
volatile int i;
struct mscp *mp;
@@ -514,17 +554,11 @@ mscp_dgo(mi, buffer, info, bp)
/*
* Fill in the MSCP packet and move the buffer to the I/O wait queue.
*/
- mp = (void *)bp->b_actb;
-
- mp->mscp_seq.seq_buffer = buffer;
+ mp = mxi->mxi_mp;
+ mp->mscp_seq.seq_buffer = mxi->mxi_dmam->dm_segs[0].ds_addr;
- _insque(&bp->b_actf, &mi->mi_actf);
-
- bp->b_resid = info;
- mp->mscp_cmdref = (long) bp;
*mp->mscp_addr |= MSCP_OWN | MSCP_INT;
-
- i = *mi->mi_ip;
+ i = READ_IP;
}
#ifdef DIAGNOSTIC
diff --git a/sys/dev/mscp/mscp_tape.c b/sys/dev/mscp/mscp_tape.c
index dd5a207f042..8c94b4d30bd 100644
--- a/sys/dev/mscp/mscp_tape.c
+++ b/sys/dev/mscp/mscp_tape.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mscp_tape.c,v 1.13 1999/05/29 19:12:42 ragge Exp $ */
+/* $NetBSD: mscp_tape.c,v 1.14 1999/06/06 19:16:18 ragge Exp $ */
/*
* Copyright (c) 1996 Ludd, University of Lule}, Sweden.
* All rights reserved.
@@ -51,10 +51,12 @@
#include <sys/systm.h>
#include <sys/proc.h>
+#include <machine/bus.h>
#include <machine/cpu.h>
-#include <vax/mscp/mscp.h>
-#include <vax/mscp/mscpvar.h>
+#include <dev/mscp/mscp.h>
+#include <dev/mscp/mscpreg.h>
+#include <dev/mscp/mscpvar.h>
#include "locators.h"
@@ -176,7 +178,7 @@ mt_putonline(mt)
*mp->mscp_addr |= MSCP_OWN | MSCP_INT;
/* Poll away */
- i = *mi->mi_ip;
+ i = bus_space_read_2(mi->mi_iot, mi->mi_iph, 0);
if (tsleep(&mt->mt_state, PRIBIO, "mtonline", 240 * hz))
return MSCP_FAILED;
@@ -542,7 +544,7 @@ mtcmd(mt, cmd, count, complete)
break;
}
- i = *mi->mi_ip;
+ i = bus_space_read_2(mi->mi_iot, mi->mi_iph, 0);
tsleep(&mt->mt_inuse, PRIBIO, "mtioctl", 0);
return mt->mt_ioctlerr;
}
diff --git a/sys/dev/mscp/mscpvar.h b/sys/dev/mscp/mscpvar.h
index 3cd3998ef8a..1ec0de046c0 100644
--- a/sys/dev/mscp/mscpvar.h
+++ b/sys/dev/mscp/mscpvar.h
@@ -1,4 +1,4 @@
-/* $NetBSD: mscpvar.h,v 1.6 1999/05/29 19:13:04 ragge Exp $ */
+/* $NetBSD: mscpvar.h,v 1.7 1999/06/06 19:16:18 ragge Exp $ */
/*
* Copyright (c) 1996 Ludd, University of Lule}, Sweden.
* Copyright (c) 1988 Regents of the University of California.
@@ -69,11 +69,21 @@ struct mscp_ri {
struct mscp *mri_ring; /* base address of packets */
};
+/*
+ * Transfer info, one per command packet.
+ */
+struct mscp_xi {
+ bus_dmamap_t mxi_dmam; /* Allocated DMA map for this entry */
+ struct buf * mxi_bp; /* Buffer used in this command */
+ struct mscp * mxi_mp; /* Packet used in this command */
+ int mxi_inuse;
+};
+
struct mscp_ctlr {
void (*mc_ctlrdone) /* controller operation complete */
- __P((struct device *, int));
- int (*mc_go) /* device-specific start routine */
- __P((struct device *, struct buf *));
+ __P((struct device *));
+ void (*mc_go) /* device-specific start routine */
+ __P((struct device *, struct mscp_xi *));
void (*mc_saerror) /* ctlr error handling */
__P((struct device *, int));
};
@@ -108,11 +118,13 @@ struct mscp_attach_args {
struct mscp_ctlr *ma_mc; /* Pointer to ctlr's mscp_ctlr */
int ma_type; /* disk/tape bus type */
struct mscp_pack *ma_uda; /* comm area virtual */
- struct mscp_pack *ma_uuda; /* comm area on bus */
struct mscp_softc **ma_softc; /* backpointer to bus softc */
- short *ma_ip; /* initialisation and polling */
- short *ma_sa; /* status & address (read part) */
- short *ma_sw; /* status & address (write part) */
+ bus_dmamap_t ma_dmam; /* This comm area dma info */
+ bus_dma_tag_t ma_dmat;
+ bus_space_tag_t ma_iot;
+ bus_space_handle_t ma_iph; /* initialisation and polling */
+ bus_space_handle_t ma_sah; /* status & address (read part) */
+ bus_space_handle_t ma_swh; /* status & address (write part) */
short ma_ivec; /* Interrupt vector to use */
char ma_ctlrnr; /* Phys ctlr nr */
char ma_adapnr; /* Phys adapter nr */
@@ -157,11 +169,13 @@ struct mscp_softc {
struct device mi_dev; /* Autoconf stuff */
struct mscp_ri mi_cmd; /* MSCP command ring info */
struct mscp_ri mi_rsp; /* MSCP response ring info */
+ bus_dma_tag_t mi_dmat;
+ bus_dmamap_t mi_dmam;
+ struct mscp_xi mi_xi[NCMD];
+ int mi_mxiuse; /* Bitfield of inuse mxi packets */
short mi_credits; /* transfer credits */
char mi_wantcmd; /* waiting for command packet */
char mi_wantcredits; /* waiting for transfer credits */
- struct buf *mi_actf; /* Pointer to buffers in */
- struct buf *mi_actb; /* circular wait queue */
struct mscp_ctlr *mi_mc; /* Pointer to parent's mscp_ctlr */
struct mscp_device *mi_me; /* Pointer to child's mscp_device */
struct device **mi_dp; /* array of backpointers */
@@ -170,14 +184,14 @@ struct mscp_softc {
char mi_adapnr; /* Phys adapter nr */
int mi_flags;
struct mscp_pack *mi_uda; /* virtual address */
- struct mscp_pack *mi_uuda; /* (device-specific) address */
int mi_type;
short mi_ivec; /* Interrupt vector to use */
short mi_ierr; /* Init err counter */
- volatile short *mi_ip; /* initialisation and polling */
- volatile short *mi_sa; /* status & address (read part) */
- volatile short *mi_sw; /* status & address (write part) */
- struct buf *mi_w; /* While waiting for packets */
+ bus_space_tag_t mi_iot;
+ bus_space_handle_t mi_iph; /* initialisation and polling */
+ bus_space_handle_t mi_sah; /* status & address (read part) */
+ bus_space_handle_t mi_swh; /* status & address (write part) */
+ SIMPLEQ_HEAD(, buf) mi_resq; /* While waiting for packets */
};
/* mi_flags */
@@ -220,24 +234,6 @@ struct mscp_softc {
} \
}
-/*
- * The following macro appends a buffer to a drive queue or a drive to
- * a controller queue, given the name of the forward link. Use as
- * `APPEND(dp, &um->um_tab, b_forw)' or `APPEND(bp, dp, av_forw)',
- * where `bp' is a transfer request, `dp' is a drive queue, and `um_tab'
- * is a controller queue. (That is, the forward link for controller
- * queues is `b_forw'; for drive queues, it is `av_forw'.)
- */
-
-#define MSCP_APPEND(bp, queue, link) { \
- (bp)->link = NULL; \
- if ((queue)->link == NULL) \
- (queue)->link = (bp); \
- else \
- *(queue)->b_actb = (bp); \
- (queue)->b_actb = &(bp)->link; \
-}
-
/* Prototypes */
struct mscp *mscp_getcp __P((struct mscp_softc *, int));
void mscp_printevent __P((struct mscp *));
@@ -250,5 +246,5 @@ void mscp_hexdump __P((struct mscp *));
void mscp_strategy __P((struct buf *, struct device *));
void mscp_printtype __P((int, int));
int mscp_waitstep __P((struct mscp_softc *, int, int));
-void mscp_dgo __P((struct mscp_softc *, long, long, struct buf *));
+void mscp_dgo __P((struct mscp_softc *, struct mscp_xi *));
void mscp_intr __P((struct mscp_softc *));