Changes from the OpenBSD `ncr' driver to byte-swap the script on big-endian

systems.  Should make this go on e.g. the Apple Network Server.
This commit is contained in:
thorpej 1999-12-05 18:25:18 +00:00
parent 60416909de
commit 389c599f35
2 changed files with 80 additions and 72 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: ncr.c,v 1.87 1999/10/08 20:43:45 cgd Exp $ */
/* $NetBSD: ncr.c,v 1.88 1999/12/05 18:25:18 thorpej Exp $ */
/**************************************************************************
**
@ -337,15 +337,15 @@
bus_space_write_4 (np->sc_st, np->sc_sh, (o), (val))
#define READSCRIPT_OFF(base, off) \
(base ? *((INT32 *)((char *)base + (off))) : \
SCR_BO(base ? *((INT32 *)((char *)base + (off))) : \
bus_space_read_4 (np->ram_tag, np->ram_handle, off))
#define WRITESCRIPT_OFF(base, off, val) \
do { \
if (base) \
*((INT32 *)((char *)base + (off))) = (val); \
*((INT32 *)((char *)base + (off))) = (SCR_BO(val)); \
else \
bus_space_write_4 (np->ram_tag, np->ram_handle, off, val); \
bus_space_write_4 (np->ram_tag, np->ram_handle, off, SCR_BO(val)); \
} while (0)
#define READSCRIPT(r) \
@ -1518,7 +1518,7 @@ static int read_tekram_eeprom
#if 0
static char ident[] =
"\n$NetBSD: ncr.c,v 1.87 1999/10/08 20:43:45 cgd Exp $\n";
"\n$NetBSD: ncr.c,v 1.88 1999/12/05 18:25:18 thorpej Exp $\n";
#endif
static const u_long ncr_version = NCR_VERSION * 11
@ -4274,8 +4274,8 @@ static void ncr_attach (pcici_t config_id, int unit)
** init data structure
*/
np->ncb_dma->jump_tcb.l_cmd = SCR_JUMP;
np->ncb_dma->jump_tcb.l_paddr = NCB_SCRIPTH_PHYS (np, abort);
np->ncb_dma->jump_tcb.l_cmd = SCR_BO(SCR_JUMP);
np->ncb_dma->jump_tcb.l_paddr = SCR_BO(NCB_SCRIPTH_PHYS (np, abort));
/*
** Get SCSI addr of host adapter (set by bios?).
@ -4838,13 +4838,15 @@ static INT32 ncr_start (struct scsipi_xfer * xp)
*/
if (flags & XS_CTL_DATA_IN) {
cp->phys.header.savep = NCB_SCRIPT_PHYS (np, data_in);
cp->phys.header.goalp = cp->phys.header.savep +20 +segments*16;
bus_addr_t 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 & XS_CTL_DATA_OUT) {
cp->phys.header.savep = NCB_SCRIPT_PHYS (np, data_out);
cp->phys.header.goalp = cp->phys.header.savep +20 +segments*16;
bus_addr_t 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;
@ -4873,8 +4875,8 @@ static INT32 ncr_start (struct scsipi_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
*/
@ -4884,21 +4886,21 @@ static INT32 ncr_start (struct scsipi_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 = CCB_PHYS (cp, scsi_cmd);
cp->phys.cmd.size = xp->cmdlen;
cp->phys.cmd.addr = SCR_BO(CCB_PHYS (cp, scsi_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
*/
@ -4910,8 +4912,8 @@ static INT32 ncr_start (struct scsipi_xfer * xp)
/*
** sense data
*/
cp->phys.sense.addr = CCB_PHYS (cp, sense_data);
cp->phys.sense.size = sizeof(struct scsipi_sense_data);
cp->phys.sense.addr = SCR_BO(CCB_PHYS (cp, sense_data));
cp->phys.sense.size = SCR_BO(sizeof(struct scsipi_sense_data));
/*
** status
*/
@ -4936,7 +4938,7 @@ static INT32 ncr_start (struct scsipi_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))));
#ifdef __NetBSD__
cp->tlimit = mono_time.tv_sec + xp->timeout / 1000 + 2;
#else
@ -4950,8 +4952,8 @@ static INT32 ncr_start (struct scsipi_xfer * xp)
qidx = np->squeueput + 1;
if (qidx >= MAX_START) qidx=0;
np->ncb_dma->squeue [qidx ] = NCB_SCRIPT_PHYS (np, idle);
np->ncb_dma->squeue [np->squeueput] = CCB_PHYS (cp, phys);
np->ncb_dma->squeue [qidx ] = SCR_BO(NCB_SCRIPT_PHYS (np, idle));
np->ncb_dma->squeue [np->squeueput] = SCR_BO(CCB_PHYS (cp, phys));
np->squeueput = qidx;
if(DEBUG_FLAGS & DEBUG_QUEUE)
@ -5062,12 +5064,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
@ -5389,7 +5391,7 @@ void ncr_init (ncb_p np, char * msg, u_long code)
*/
for (i=0;i<MAX_START;i++)
np -> ncb_dma -> squeue [i] = NCB_SCRIPT_PHYS (np, idle);
np -> ncb_dma -> squeue [i] = SCR_BO(NCB_SCRIPT_PHYS (np, idle));
/*
** Start at first entry.
@ -5992,13 +5994,13 @@ static void ncr_timeout (void *arg)
** 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) {
@ -6009,7 +6011,7 @@ static void ncr_timeout (void *arg)
** 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 */
@ -6603,8 +6605,8 @@ static void ncr_int_ma (ncb_p np, u_char dstat)
if (cmd & 0x10) { /* Table indirect */
tblp = (u_int32_t *) ((char*) &cp->phys + oadr);
olen = tblp[0];
oadr = tblp[1];
olen = SCR_BO(tblp[0]);
oadr = SCR_BO(tblp[1]);
} else {
tblp = (u_int32_t *) 0;
olen = READSCRIPT_OFF(vdsp_base, vdsp_off) & 0xffffff;
@ -6646,16 +6648,16 @@ static void ncr_int_ma (ncb_p np, u_char dstat)
*/
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);
@ -7203,8 +7205,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->ncb_dma->header.savep,
(unsigned) np->ncb_dma->header.goalp);
SCR_BO((unsigned) np->ncb_dma->header.savep),
SCR_BO((unsigned) np->ncb_dma->header.goalp));
break;
/*--------------------------------------------------------------------
@ -7428,29 +7430,28 @@ 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->ncb_dma->jump_tcb.l_paddr;
tp->getscr[0] =
(np->features & FE_PFEN)? SCR_COPY(1) : SCR_COPY_F(1);
tp->getscr[1] = vtophys (&tp->sval);
tp->getscr[2] = np->paddr + offsetof (struct ncr_reg, nc_sxfer);
tp->getscr[3] =
(np->features & FE_PFEN)? SCR_COPY(1) : SCR_COPY_F(1);
tp->getscr[4] = vtophys (&tp->wval);
tp->getscr[5] = np->paddr + offsetof (struct ncr_reg, nc_scntl3);
(np->features & FE_PFEN)? SCR_BO(SCR_COPY(1)) : SCR_BO(SCR_COPY_F(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] = tp->getscr[0];
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_SCRIPTH_PHYS (np, abort);
np->ncb_dma->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_SCRIPTH_PHYS (np, abort));
np->ncb_dma->jump_tcb.l_paddr = SCR_BO(vtophys (&tp->jump_tcb));
tp->usrtags = SCSI_NCR_DFLT_TAGS;
ncr_setmaxtags (tp, tp->usrtags);
@ -7471,21 +7472,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_SCRIPTH_PHYS (np, aborttag);
lp->jump_ccb.l_cmd = SCR_BO((SCR_JUMP));
lp->jump_ccb.l_paddr = SCR_BO(NCB_SCRIPTH_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;
}
@ -7538,11 +7539,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
@ -7745,8 +7746,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++;
}
@ -7820,7 +7821,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)
*/
@ -7839,8 +7840,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
*/

View File

@ -1,4 +1,4 @@
/* $NetBSD: ncrreg.h,v 1.14 1997/09/23 02:27:46 perry Exp $ */
/* $NetBSD: ncrreg.h,v 1.15 1999/12/05 18:25:19 thorpej Exp $ */
/**************************************************************************
**
@ -293,6 +293,13 @@ struct ncr_reg {
typedef U_INT32 ncrcmd;
#if BYTE_ORDER == BIG_ENDIAN
#define SCR_BO(x) (((x) >> 24) | (((x) >> 8) & 0xff00) | \
((x) << 24) | (((x) & 0xff00) << 8))
#else
#define SCR_BO(x) (x)
#endif
/*-----------------------------------------------------------
**
** SCSI phases