summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sys/dev/pci/ncr.c189
1 files changed, 99 insertions, 90 deletions
diff --git a/sys/dev/pci/ncr.c b/sys/dev/pci/ncr.c
index 157f0478f7e..fb74a3bb21e 100644
--- a/sys/dev/pci/ncr.c
+++ b/sys/dev/pci/ncr.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ncr.c,v 1.30 1997/09/07 03:36:43 millert Exp $ */
+/* $OpenBSD: ncr.c,v 1.31 1997/10/11 11:05:27 pefo Exp $ */
/* $NetBSD: ncr.c,v 1.56 1997/03/04 21:42:34 mycroft Exp $ */
/**************************************************************************
@@ -16,6 +16,9 @@
** Ported to NetBSD by
** Charles M. Hannum <mycroft@gnu.ai.mit.edu>
**
+** Modified for big endian systems by
+** Per Fogelstrom for RTMX Inc, North Carolina. <pefo@opsycon.se>
+**
**-------------------------------------------------------------------------
**
** Copyright (c) 1994 Wolfgang Stanglmeier. All rights reserved.
@@ -218,7 +221,7 @@
#include <dev/pci/ncr_reg.h>
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
-#ifndef __alpha__
+#if !defined(__alpha__) && !defined(__powerpc__)
#define DELAY(x) delay(x)
#endif
#endif /* __NetBSD__ || __OpenBSD__ */
@@ -1357,7 +1360,7 @@ static void ncr_attach (pcici_t tag, int unit);
#if 0
static char ident[] =
- "\n$OpenBSD: ncr.c,v 1.30 1997/09/07 03:36:43 millert Exp $\n";
+ "\n$OpenBSD: ncr.c,v 1.31 1997/10/11 11:05:27 pefo Exp $\n";
#endif
static const u_long ncr_version = NCR_VERSION * 11
@@ -3133,7 +3136,8 @@ static void ncr_script_copy_and_bind (struct script *script, ncb_p np)
while (src < end) {
- *dst++ = opcode = *src++;
+ opcode = *src++;
+ *dst++ = SCR_BO(opcode);
/*
** If we forget to change the length
@@ -3239,11 +3243,13 @@ static void ncr_script_copy_and_bind (struct script *script, ncb_p np)
break;
}
- *dst++ = new;
+ *dst++ = SCR_BO(new);
}
- } else
- *dst++ = *src++;
-
+ }
+ else {
+ *dst++ = SCR_BO(*src);
+ src++;
+ }
};
}
@@ -3597,8 +3603,8 @@ static void ncr_attach (pcici_t config_id, int unit)
** init data structure
*/
- np->jump_tcb.l_cmd = SCR_JUMP;
- np->jump_tcb.l_paddr = NCB_SCRIPT_PHYS (np, abort);
+ np->jump_tcb.l_cmd = SCR_BO(SCR_JUMP);
+ np->jump_tcb.l_paddr = SCR_BO(NCB_SCRIPT_PHYS (np, abort));
/*
** Get SCSI addr of host adapter (set by bios?).
@@ -3618,7 +3624,7 @@ static void ncr_attach (pcici_t config_id, int unit)
#endif /* __NetBSD__ || __OpenBSD__ */
for (reg=0; reg<256; reg+=4) {
if (reg%16==0) printf ("reg[%2x]", reg);
- printf (" %08x", (int)pci_conf_read (config_id, reg));
+ printf (" %08x", (int)pci_conf_read (pc, config_id, reg));
if (reg%16==12) printf ("\n");
}
}
@@ -4128,13 +4134,17 @@ static INT32 ncr_start (struct scsi_xfer * xp)
*/
if (flags & SCSI_DATA_IN) {
- cp->phys.header.savep = NCB_SCRIPT_PHYS (np, data_in);
- cp->phys.header.goalp = cp->phys.header.savep +20 +segments*16;
+ u_long sp;
+ sp = NCB_SCRIPT_PHYS (np, data_in);
+ cp->phys.header.savep = SCR_BO(sp);
+ cp->phys.header.goalp = SCR_BO(sp + 20 + segments * 16);
} else if (flags & SCSI_DATA_OUT) {
- cp->phys.header.savep = NCB_SCRIPT_PHYS (np, data_out);
- cp->phys.header.goalp = cp->phys.header.savep +20 +segments*16;
+ u_long sp;
+ sp = NCB_SCRIPT_PHYS (np, data_out);
+ cp->phys.header.savep = SCR_BO(sp);
+ cp->phys.header.goalp = SCR_BO(sp + 20 + segments * 16);
} else {
- cp->phys.header.savep = NCB_SCRIPT_PHYS (np, no_data);
+ cp->phys.header.savep = SCR_BO(NCB_SCRIPT_PHYS (np, no_data));
cp->phys.header.goalp = cp->phys.header.savep;
};
cp->phys.header.lastp = cp->phys.header.savep;
@@ -4154,8 +4164,8 @@ static INT32 ncr_start (struct scsi_xfer * xp)
/*
** Startqueue
*/
- cp->phys.header.launch.l_paddr = NCB_SCRIPT_PHYS (np, select);
- cp->phys.header.launch.l_cmd = SCR_JUMP;
+ cp->phys.header.launch.l_paddr = SCR_BO(NCB_SCRIPT_PHYS (np, select));
+ cp->phys.header.launch.l_cmd = SCR_BO(SCR_JUMP);
/*
** select
*/
@@ -4165,21 +4175,21 @@ static INT32 ncr_start (struct scsi_xfer * xp)
/*
** message
*/
- cp->phys.smsg.addr = CCB_PHYS (cp, scsi_smsg);
- cp->phys.smsg.size = msglen;
+ cp->phys.smsg.addr = SCR_BO(CCB_PHYS (cp, scsi_smsg));
+ cp->phys.smsg.size = SCR_BO(msglen);
- cp->phys.smsg2.addr = CCB_PHYS (cp, scsi_smsg2);
- cp->phys.smsg2.size = msglen2;
+ cp->phys.smsg2.addr = SCR_BO(CCB_PHYS (cp, scsi_smsg2));
+ cp->phys.smsg2.size = SCR_BO(msglen2);
/*
** command
*/
- cp->phys.cmd.addr = vtophys (cmd);
- cp->phys.cmd.size = xp->cmdlen;
+ cp->phys.cmd.addr = SCR_BO(vtophys (cmd));
+ cp->phys.cmd.size = SCR_BO(xp->cmdlen);
/*
** sense command
*/
- cp->phys.scmd.addr = CCB_PHYS (cp, sensecmd);
- cp->phys.scmd.size = 6;
+ cp->phys.scmd.addr = SCR_BO(CCB_PHYS (cp, sensecmd));
+ cp->phys.scmd.size = SCR_BO(6);
/*
** patch requested size into sense command
*/
@@ -4191,8 +4201,8 @@ static INT32 ncr_start (struct scsi_xfer * xp)
/*
** sense data
*/
- cp->phys.sense.addr = vtophys (&cp->xfer->sense);
- cp->phys.sense.size = sizeof(struct scsi_sense_data);
+ cp->phys.sense.addr = SCR_BO(vtophys (&cp->xfer->sense));
+ cp->phys.sense.size = SCR_BO(sizeof(struct scsi_sense_data));
/*
** status
*/
@@ -4217,7 +4227,7 @@ static INT32 ncr_start (struct scsi_xfer * xp)
** reselect pattern and activate this job.
*/
- cp->jump_ccb.l_cmd = (SCR_JUMP ^ IFFALSE (DATA (cp->tag)));
+ cp->jump_ccb.l_cmd = SCR_BO((SCR_JUMP ^ IFFALSE (DATA (cp->tag))));
cp->tlimit = mono_time.tv_sec + xp->timeout / 1000 + 2;
cp->magic = CCB_MAGIC;
@@ -4227,15 +4237,15 @@ static INT32 ncr_start (struct scsi_xfer * xp)
qidx = np->squeueput + 1;
if (qidx >= MAX_START) qidx=0;
- np->squeue [qidx ] = NCB_SCRIPT_PHYS (np, idle);
- np->squeue [np->squeueput] = CCB_PHYS (cp, phys);
+ np->squeue [qidx ] = SCR_BO(NCB_SCRIPT_PHYS (np, idle));
+ np->squeue [np->squeueput] = SCR_BO(CCB_PHYS (cp, phys));
np->squeueput = qidx;
if(DEBUG_FLAGS & DEBUG_QUEUE)
printf ("%s: queuepos=%d tryoffset=%d.\n", ncr_name (np),
np->squeueput,
- (unsigned)(np->script->startpos[0]-
- (NCB_SCRIPT_PHYS (np, tryloop))));
+ SCR_BO((unsigned)(np->script->startpos[0]))-
+ (NCB_SCRIPT_PHYS (np, tryloop)));
/*
** Script processor may be waiting for reselect.
@@ -4346,12 +4356,12 @@ void ncr_complete (ncb_p np, ccb_p cp)
/*
** No Reselect anymore.
*/
- cp->jump_ccb.l_cmd = (SCR_JUMP);
+ cp->jump_ccb.l_cmd = SCR_BO((SCR_JUMP));
/*
** No starting.
*/
- cp->phys.header.launch.l_paddr= NCB_SCRIPT_PHYS (np, idle);
+ cp->phys.header.launch.l_paddr= SCR_BO(NCB_SCRIPT_PHYS (np, idle));
/*
** timestamp
@@ -4359,7 +4369,7 @@ void ncr_complete (ncb_p np, ccb_p cp)
ncb_profile (np, cp);
if (DEBUG_FLAGS & DEBUG_TINY)
- printf ("CCB=%lx STAT=%x/%x\n", (unsigned long)cp & 0xfff,
+ printf ("CCB=%lx STAT=%x/%x\n", (unsigned long)cp,
cp->host_status,cp->scsi_status);
xp = cp->xfer;
@@ -4653,15 +4663,15 @@ void ncr_init (ncb_p np, char * msg, u_long code)
*/
for (i=0;i<MAX_START;i++)
- np -> squeue [i] = NCB_SCRIPT_PHYS (np, idle);
+ np -> squeue [i] = SCR_BO(NCB_SCRIPT_PHYS (np, idle));
/*
** Start at first entry.
*/
np->squeueput = 0;
- np->script->startpos[0] = NCB_SCRIPT_PHYS (np, tryloop);
- np->script->start0 [0] = SCR_INT ^ IFFALSE (0);
+ np->script->startpos[0] = SCR_BO(NCB_SCRIPT_PHYS (np, tryloop));
+ np->script->start0 [0] = SCR_BO(SCR_INT ^ IFFALSE (0));
/*
** Wakeup all pending jobs.
@@ -5130,13 +5140,13 @@ static void ncr_timeout (ncb_p np)
** Disable reselect.
** Remove it from startqueue.
*/
- cp->jump_ccb.l_cmd = (SCR_JUMP);
+ cp->jump_ccb.l_cmd = SCR_BO((SCR_JUMP));
if (cp->phys.header.launch.l_paddr ==
- NCB_SCRIPT_PHYS (np, select)) {
+ SCR_BO(NCB_SCRIPT_PHYS (np, select))) {
printf ("%s: timeout ccb=%p (skip)\n",
ncr_name (np), cp);
cp->phys.header.launch.l_paddr
- = NCB_SCRIPT_PHYS (np, skip);
+ = SCR_BO(NCB_SCRIPT_PHYS (np, skip));
};
switch (cp->host_status) {
@@ -5147,7 +5157,7 @@ static void ncr_timeout (ncb_p np)
** still in start queue ?
*/
if (cp->phys.header.launch.l_paddr ==
- NCB_SCRIPT_PHYS (np, skip))
+ SCR_BO(NCB_SCRIPT_PHYS (np, skip)))
continue;
/* fall through */
@@ -5564,7 +5574,7 @@ void ncr_int_sto (ncb_p np)
/* assert ((diff <= MAX_START * 20) && !(diff % 20));*/
if ((diff <= MAX_START * 20) && !(diff % 20)) {
- np->script->startpos[0] = scratcha;
+ np->script->startpos[0] = SCR_BO(scratcha);
OUTL (nc_dsp, NCB_SCRIPT_PHYS (np, start));
return;
};
@@ -5653,10 +5663,10 @@ static void ncr_int_ma (ncb_p np)
if (dsp == vtophys (&cp->patch[2])) {
vdsp = &cp->patch[0];
- nxtdsp = vdsp[3];
+ nxtdsp = SCR_BO(vdsp[3]);
} else if (dsp == vtophys (&cp->patch[6])) {
vdsp = &cp->patch[4];
- nxtdsp = vdsp[3];
+ nxtdsp = SCR_BO(vdsp[3]);
} else {
vdsp = (U_INT32 *) ((char*)np->script - np->p_script + dsp -8);
nxtdsp = dsp;
@@ -5680,20 +5690,20 @@ static void ncr_int_ma (ncb_p np)
** get old startaddress and old length.
*/
- oadr = vdsp[1];
+ oadr = SCR_BO(vdsp[1]);
if (cmd & 0x10) { /* Table indirect */
tblp = (U_INT32 *) ((char*) &cp->phys + oadr);
- olen = tblp[0];
- oadr = tblp[1];
+ olen = SCR_BO(tblp[0]);
+ oadr = SCR_BO(tblp[1]);
} else {
tblp = (U_INT32 *) 0;
- olen = vdsp[0] & 0xffffff;
+ olen = SCR_BO(vdsp[0]) & 0xffffff;
};
if (DEBUG_FLAGS & DEBUG_PHASE) {
printf ("OCMD=%x\nTBLP=%p OLEN=%x OADR=%x\n",
- (unsigned) (vdsp[0] >> 24),
+ (unsigned) (SCR_BO(vdsp[0]) >> 24),
tblp,
(unsigned) olen,
(unsigned) oadr);
@@ -5703,10 +5713,10 @@ static void ncr_int_ma (ncb_p np)
** if old phase not dataphase, leave here.
*/
- if (cmd != (vdsp[0] >> 24)) {
+ if (cmd != (SCR_BO(vdsp[0]) >> 24)) {
PRINT_ADDR(cp->xfer);
printf ("internal error: cmd=%02x != %02x=(vdsp[0] >> 24)\n",
- (unsigned)cmd, (unsigned)vdsp[0] >> 24);
+ (unsigned)cmd, (unsigned)SCR_BO(vdsp[0]) >> 24);
return;
}
@@ -5726,16 +5736,16 @@ static void ncr_int_ma (ncb_p np)
*/
newcmd = cp->patch;
- if (cp->phys.header.savep == vtophys (newcmd)) newcmd+=4;
+ if (cp->phys.header.savep == SCR_BO(vtophys (newcmd))) newcmd+=4;
/*
** fillin the commands
*/
- newcmd[0] = ((cmd & 0x0f) << 24) | rest;
- newcmd[1] = oadr + olen - rest;
- newcmd[2] = SCR_JUMP;
- newcmd[3] = nxtdsp;
+ newcmd[0] = SCR_BO(((cmd & 0x0f) << 24) | rest);
+ newcmd[1] = SCR_BO(oadr + olen - rest);
+ newcmd[2] = SCR_BO(SCR_JUMP);
+ newcmd[3] = SCR_BO(nxtdsp);
if (DEBUG_FLAGS & DEBUG_PHASE) {
PRINT_ADDR(cp->xfer);
@@ -6275,8 +6285,8 @@ void ncr_int_sir (ncb_p np)
printf ("M_DISCONNECT received, but datapointer not saved:\n"
"\tdata=%x save=%x goal=%x.\n",
(unsigned) INL (nc_temp),
- (unsigned) np->header.savep,
- (unsigned) np->header.goalp);
+ SCR_BO((unsigned) np->header.savep),
+ SCR_BO((unsigned) np->header.goalp));
break;
/*--------------------------------------------------------------------
@@ -6377,7 +6387,6 @@ static ccb_p ncr_get_ccb
lcb_p lp;
ccb_p cp = (ccb_p) 0;
int oldspl;
-
oldspl = splbio();
/*
** Lun structure available ?
@@ -6472,27 +6481,27 @@ static void ncr_alloc_ccb (ncb_p np, u_long target, u_long lun)
/*
** initialize it.
*/
- tp->jump_tcb.l_cmd = (SCR_JUMP^IFFALSE (DATA (0x80 + target)));
+ tp->jump_tcb.l_cmd = SCR_BO((SCR_JUMP^IFFALSE (DATA (0x80 + target))));
tp->jump_tcb.l_paddr = np->jump_tcb.l_paddr;
- tp->getscr[0] = SCR_COPY (1);
- tp->getscr[1] = vtophys (&tp->sval);
- tp->getscr[2] = np->paddr + offsetof (struct ncr_reg, nc_sxfer);
- tp->getscr[3] = SCR_COPY (1);
- tp->getscr[4] = vtophys (&tp->wval);
- tp->getscr[5] = np->paddr + offsetof (struct ncr_reg, nc_scntl3);
+ tp->getscr[0] = SCR_BO(SCR_COPY (1));
+ tp->getscr[1] = SCR_BO(vtophys (&tp->sval));
+ tp->getscr[2] = SCR_BO(np->paddr + offsetof (struct ncr_reg, nc_sxfer));
+ tp->getscr[3] = SCR_BO(SCR_COPY (1));
+ tp->getscr[4] = SCR_BO(vtophys (&tp->wval));
+ tp->getscr[5] = SCR_BO(np->paddr + offsetof (struct ncr_reg, nc_scntl3));
assert (( (offsetof(struct ncr_reg, nc_sxfer) ^
offsetof(struct tcb , sval )) &3) == 0);
assert (( (offsetof(struct ncr_reg, nc_scntl3) ^
offsetof(struct tcb , wval )) &3) == 0);
- tp->call_lun.l_cmd = (SCR_CALL);
- tp->call_lun.l_paddr = NCB_SCRIPT_PHYS (np, resel_lun);
+ tp->call_lun.l_cmd = SCR_BO((SCR_CALL));
+ tp->call_lun.l_paddr = SCR_BO(NCB_SCRIPT_PHYS (np, resel_lun));
- tp->jump_lcb.l_cmd = (SCR_JUMP);
- tp->jump_lcb.l_paddr = NCB_SCRIPT_PHYS (np, abort);
- np->jump_tcb.l_paddr = vtophys (&tp->jump_tcb);
+ tp->jump_lcb.l_cmd = SCR_BO((SCR_JUMP));
+ tp->jump_lcb.l_paddr = SCR_BO(NCB_SCRIPT_PHYS (np, abort));
+ np->jump_tcb.l_paddr = SCR_BO(vtophys (&tp->jump_tcb));
ncr_setmaxtags (tp, SCSI_NCR_DFLT_TAGS);
}
@@ -6512,21 +6521,21 @@ static void ncr_alloc_ccb (ncb_p np, u_long target, u_long lun)
** Initialize it
*/
bzero (lp, sizeof (*lp));
- lp->jump_lcb.l_cmd = (SCR_JUMP ^ IFFALSE (DATA (lun)));
+ lp->jump_lcb.l_cmd = SCR_BO((SCR_JUMP ^ IFFALSE (DATA (lun))));
lp->jump_lcb.l_paddr = tp->jump_lcb.l_paddr;
- lp->call_tag.l_cmd = (SCR_CALL);
- lp->call_tag.l_paddr = NCB_SCRIPT_PHYS (np, resel_tag);
+ lp->call_tag.l_cmd = SCR_BO((SCR_CALL));
+ lp->call_tag.l_paddr = SCR_BO(NCB_SCRIPT_PHYS (np, resel_tag));
- lp->jump_ccb.l_cmd = (SCR_JUMP);
- lp->jump_ccb.l_paddr = NCB_SCRIPT_PHYS (np, aborttag);
+ lp->jump_ccb.l_cmd = SCR_BO((SCR_JUMP));
+ lp->jump_ccb.l_paddr = SCR_BO(NCB_SCRIPT_PHYS (np, aborttag));
lp->actlink = 1;
/*
** Chain into LUN list
*/
- tp->jump_lcb.l_paddr = vtophys (&lp->jump_lcb);
+ tp->jump_lcb.l_paddr = SCR_BO(vtophys (&lp->jump_lcb));
tp->lp[lun] = lp;
}
@@ -6574,11 +6583,11 @@ static void ncr_alloc_ccb (ncb_p np, u_long target, u_long lun)
/*
** Chain into reselect list
*/
- cp->jump_ccb.l_cmd = SCR_JUMP;
+ cp->jump_ccb.l_cmd = SCR_BO(SCR_JUMP);
cp->jump_ccb.l_paddr = lp->jump_ccb.l_paddr;
- lp->jump_ccb.l_paddr = CCB_PHYS (cp, jump_ccb);
- cp->call_tmp.l_cmd = SCR_CALL;
- cp->call_tmp.l_paddr = NCB_SCRIPT_PHYS (np, resel_tmp);
+ lp->jump_ccb.l_paddr = SCR_BO(CCB_PHYS (cp, jump_ccb));
+ cp->call_tmp.l_cmd = SCR_BO(SCR_CALL);
+ cp->call_tmp.l_paddr = SCR_BO(NCB_SCRIPT_PHYS (np, resel_tmp));
/*
** Chain into wakeup list
@@ -6684,7 +6693,7 @@ static int ncr_scatter
bzero (&phys->data, sizeof (phys->data));
if (!datalen) return (0);
- paddr = vtophys (vaddr);
+ paddr = vtophys ((void *)vaddr);
/*
** insert extra break points at a distance of chunk.
@@ -6742,7 +6751,7 @@ static int ncr_scatter
vaddr += size;
csize -= size;
datalen -= size;
- paddr = vtophys (vaddr);
+ paddr = vtophys ((void *)vaddr);
};
if(DEBUG_FLAGS & DEBUG_SCATTER)
@@ -6752,8 +6761,8 @@ static int ncr_scatter
(unsigned) segsize,
(unsigned) datalen);
- phys->data[segment].addr = segaddr;
- phys->data[segment].size = segsize;
+ phys->data[segment].addr = SCR_BO(segaddr);
+ phys->data[segment].size = SCR_BO(segsize);
segment++;
}
@@ -6820,7 +6829,7 @@ static int ncr_snooptest (struct ncb* np)
** Set memory and register.
*/
ncr_cache = host_wr;
- OUTL (nc_temp, ncr_wr);
+ OUTL (nc_temp, SCR_BO(ncr_wr));
/*
** Start script (exchange values)
*/
@@ -6839,8 +6848,8 @@ static int ncr_snooptest (struct ncb* np)
** Read memory and register.
*/
host_rd = ncr_cache;
- ncr_rd = INL (nc_scratcha);
- ncr_bk = INL (nc_temp);
+ ncr_rd = SCR_BO(INL (nc_scratcha));
+ ncr_bk = SCR_BO(INL (nc_temp));
/*
** Reset ncr chip
*/