diff --git a/sys/dev/pci/ncr.c b/sys/dev/pci/ncr.c index e233469f3b87..cfe22367ab24 100644 --- a/sys/dev/pci/ncr.c +++ b/sys/dev/pci/ncr.c @@ -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 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 */ diff --git a/sys/dev/pci/ncrreg.h b/sys/dev/pci/ncrreg.h index b70be19b4342..2865ce751f52 100644 --- a/sys/dev/pci/ncrreg.h +++ b/sys/dev/pci/ncrreg.h @@ -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