📄 scsi.c
字号:
}/* * SCOP_BSSRCH request */scop_bssrch(intr, sc, slave, ie, count, param) register int intr; register struct scsi *sc; register int slave; register int ie; register int count; register caddr_t param;{ scinit(sc, slave, DEV_BSIZE); sc->sc_cpoint = (u_char *)param; sc->sc_ctrnscnt = count; /* sc_cdb */ sc->sc_opcode = SCOP_BSSRCH; sc->sc_ladhi = *(short *)param; sc->sc_ladlo = *(short *)(param + 2); sc_go(intr, (struct scsi *)sc, ie);}/* * SCOP_WSSRCH request */scop_wssrch(intr, sc, slave, ie, count, param) register int intr; register struct scsi *sc; register int slave; register int ie; register int count; register caddr_t param;{ scinit(sc, slave, DEV_BSIZE); sc->sc_cpoint = (u_char *)param; sc->sc_ctrnscnt = count; /* sc_cdb */ sc->sc_opcode = SCOP_WSSRCH; sc->sc_ladhi = *(short *)param; sc->sc_ladlo = *(short *)(param + 2); sc_go(intr, (struct scsi *)sc, ie);}/* * * SCOP_EESENSE request * Enable/Disable Eject Request Sense * Write Once only supported. * */scop_eesense(intr, sc, slave, ie, sw) register int intr; register struct scsi *sc; register int slave; register int ie; register int sw;{ scinit(sc, slave, DEV_BSIZE); /* sc_cdb */ sc->sc_opcode = SCOP_EESENSE; sc->sc_switch = sw; sc_go(intr, (struct scsi *)sc, ie);}/* * SCOP_EJECT */scop_eject(intr, sc, slave, ie) register int intr; register struct scsi *sc; register int slave; register int ie;{ scinit(sc, slave, DEV_BSIZE); /* sc_cdb */ sc->sc_opcode = SCOP_EJECT; sc_go(intr, (struct scsi *)sc, ie);}/* * SCOP_RBLIM request */scop_rblim(intr, sc, slave, ie, count, param) register int intr; register struct scsi *sc; register int slave; register int ie; register int count; register caddr_t param;{ scinit(sc, slave, DEV_BSIZE); sc->sc_cpoint = (u_char *)param; sc->sc_ctrnscnt = count & 0xff; /* sc_cdb */ sc->sc_opcode = SCOP_RBLIM; sc_go(intr, (struct scsi *)sc, ie);}/* * SCOP_MSENSE request */scop_msense(intr, sc, slave, ie, count, param) register int intr; register struct scsi *sc; register int slave; register int ie; register int count; register caddr_t param;{ scinit(sc, slave, DEV_BSIZE); sc->sc_cpoint = (u_char *)param; sc->sc_ctrnscnt = count & 0xff; /* sc_cdb */ sc->sc_opcode = SCOP_MSENSE; sc->sc_lad = count >> 8; sc->sc_count = count & 0xff; sc_go(intr, (struct scsi *)sc, ie);}/* * SCOP_MSELECT request */scop_mselect(intr, sc, slave, ie, count, param) register int intr; register struct scsi *sc; register int slave; register int ie; register int count; register caddr_t param;{ u_char psave[20]; bcopy((caddr_t)sc->sc_param, (caddr_t)psave, 20); scinit(sc, slave, DEV_BSIZE); bcopy((caddr_t)psave, (caddr_t)sc->sc_param, 20); sc->sc_cpoint = (u_char *)param; sc->sc_ctrnscnt = count & 0xff; /* sc_cdb */ sc->sc_opcode = SCOP_MSELECT; sc->sc_lad = count >> 8; sc->sc_count = count & 0xff; sc_go(intr, (struct scsi *)sc, ie);}#ifdef SRD_MSELECT/* * SCOP_MSELECT request */scop_msense_OTHER_HD(intr, sc, slave, ie, count, param) register int intr; register struct scsi *sc; register int slave; register int ie; register int count; register caddr_t param;{ scinit(sc, slave, DEV_BSIZE); sc->sc_cpoint = (u_char *)param; sc->sc_ctrnscnt = count; /* sc_cdb */ sc->sc_opcode = SCOP_MSENSE; sc->sc_count = count; sc->sc_lad = 0x3f00; sc_go(intr, (struct scsi *)sc, ie);}/* * SCOP_MSELECT request */scop_mselect_OTHER_HD(intr, sc, slave, ie, count, param) register int intr; register struct scsi *sc; register int slave; register int ie; register int count; register caddr_t param;{ u_char psave[20]; bcopy((caddr_t)sc->sc_param, (caddr_t)psave, 20); scinit(sc, slave, DEV_BSIZE); bcopy((caddr_t)psave, (caddr_t)sc->sc_param, 20); sc->sc_cpoint = (u_char *)param; sc->sc_ctrnscnt = count; /* sc_cdb */ sc->sc_opcode = SCOP_MSELECT; sc->sc_count = count; sc->sc_lad = 0; sc_go(intr, (struct scsi *)sc, ie);}#endif SRD_MSELECTscop_erase(intr, sc, slave, ie) register int intr; register struct scsi *sc; register int slave; register int ie;{ scinit(sc, slave, DEV_BSIZE); /* sc_cdb */ sc->sc_opcode = SCOP_ERASE; sc->sc_tucode = 1; sc_go(intr, (struct scsi *)sc, ie);}/* * One sector programmed I/O */scop_rdwr(intr, sc, slave, ie, flag, addr, lba, sectsize) int intr; register struct scsi *sc; int slave; int ie; int flag; caddr_t addr; int lba; int sectsize;{ scinit(sc, slave, sectsize); sc->sc_cpoint = (u_char *)addr; sc->sc_ctrnscnt = sectsize; /* sc_cdb */ sc->sc_opcode = (flag & B_READ) ? SCOP_READ : SCOP_WRITE; sc->sc_lad = lba; sc->sc_count = 1; sc_go(intr, sc, ie);}/* * Medium allow/prevent removable */scop_medrmv(intr, sc, slave, ie, sw) register int intr; register struct scsi *sc; register int slave; register int ie; register int sw;{ scinit(sc, slave, DEV_BSIZE); /* sc_cdb */ sc->sc_opcode = SCOP_MEDRMV; sc->sc_count = sw; sc_go(intr, (struct scsi *)sc, ie);}/* * initialize struct scsi */scinit(sc, slave, sectsize) register struct scsi *sc; int slave; int sectsize;{ bzero((caddr_t)sc, sizeof(struct scsi)); sc->sc_identify = MSG_IDENT|Scsi_Disconnect|(slave & IDT_DRMASK); sc->sc_bytesec = sectsize; sc->sc_lun = slave;}/* * ABORT MESSAGE */scms_abort(intr, sc, slave, ie) register int intr; register struct scsi *sc; register int slave; register int ie;{ bzero((caddr_t)sc, sizeof(struct scsi)); sc->sc_identify = MSG_ABORT; /* sc_cdb */ sc->sc_opcode = SCOP_TST; sc->sc_lun = slave; sc_go(intr, (struct scsi *)sc, ie);}sc_go(intr, sc, ie) int intr; struct scsi *sc; int ie;{ register struct sc_data *scdp; scdp = &sc_data[intr]; if (sc->sc_cpoint) scdp->scd_vaddr = (char *)sc->sc_cpoint; else scdp->scd_vaddr = (char *)sc->sc_param; scdp->scd_procp = curproc; scdp->scd_scaddr = (char *)sc; scdp->scd_count = sc->sc_ctrnscnt; sc->sc_cpoint = (u_char *)ipc_phys(scdp->scd_vaddr); _sc_go(intr, sc, ie); if((ie & SCSI_INTEN) == 0) {#ifdef mips /* if (DATAIN_PHASE_FINISHED) */ MachFlushDCache(scdp->scd_scaddr, sizeof (struct scsi)); if (MACH_IS_USPACE(scdp->scd_vaddr)) panic("sc_go: user address is not supported"); else if (MACH_IS_CACHED(scdp->scd_vaddr)) MachFlushDCache(scdp->scd_vaddr, scdp->scd_count); else if (MACH_IS_MAPPED(scdp->scd_vaddr))#ifdef notyet /* KU:XXX */ clean_k2dcache(scdp->scd_vaddr, scdp->scd_count);#else MachFlushCache(); /* Flush all caches */#endif#endif /* mips */ }}#ifdef CPU_SINGLE_sc_go(intr, sc, ie) int intr; struct scsi *sc; int ie;{ register int i, s; if((ie & SCSI_INTEN) == 0) { scsend(intr, ie|SCSI_NOTWAIT, sc); while (sc_busy(intr)) { splx(splscon()); /* splsc -1 */#ifdef mc68030 dcia();#endif } } else { scsend(intr, ie, (caddr_t)sc); }}#endif /* CPU_SINGLE */screset(chan) int chan;{ int i, s; s = splsc(); printf("SCSI: screset() called "); scop_init(chan / 8); splx(s); for (s = 0; s < 10; s++) { DELAY(100000 * 10); } printf("\n"); iop/**/reset();}scsisetup(bp, map, nmap) struct buf *bp; struct sc_map *map; int nmap;{ return (iop/**/setup(bp, map, nmap));}/* * transrate skey / ecode into message display ON/OFF value * 1 : display message * 0 : silence */isdispmsg(code, list, count) register int code; register struct msg_list *list; int count;{ register int msglvl = 0; while (list->ml_code >= 0) { if (code == list->ml_code) { msglvl = list->ml_msglvl; break; } list++; } return (count >= msglvl);}#ifdef NO_SHRINK_RSENSE_MSG/* * transrate skey / ecode into message */char *getmsg(code, list, defmsg) int code; struct msg_list *list; char *defmsg;{ while (list->ml_code >= 0) { if (code == list->ml_code) return (list->ml_msgstr); list++; } return (defmsg);}#endif /* NO_SHRINK_RSENSE_MSG */check_chan_busy(intr, sc, slave) register int intr; register struct scsi *sc; register int slave;{ register struct sc_extnd *sce = (struct sc_extnd *)sc->sc_param; int i = 0; if (sc->sc_istatus == INST_EP) { switch (sc->sc_tstatus) { case TGST_CC: scop_rsense(intr, sc, slave, SCSI_INTDIS, 18, 0); if (rsense_msg_disp || isdispmsg(sce->sce_skey, skeylist, 0)) {#ifdef NO_SHRINK_RSENSE_MSG if (sce->sce_advalid) { printf("SCSI%d(block %d): %s (sense key = 0x%x)\n", intr, (sce->sce_infob1 << 24) + (sce->sce_infob2 << 16) + (sce->sce_infob3 << 8) + (sce->sce_infob4), getmsg(sce->sce_skey, skeylist, "(reserved)"), sce->sce_skey); } else { printf("SCSI%d(unknown block): %s (sense key = 0x%x)\n", intr, getmsg(sce->sce_skey, skeylist, "(reserved)"), sce->sce_skey); }#else /* NO_SHRINK_RSENSE_MSG */ if (sce->sce_advalid) { printf("SCSI%d(sn %d): skey=0x%x)\n", intr, (sce->sce_infob1 << 24) + (sce->sce_infob2 << 16) + (sce->sce_infob3 << 8) + (sce->sce_infob4), sce->sce_skey); } else { printf("SCSI%d: skey=0x%x)\n", intr, sce->sce_skey); }#endif /* NO_SHRINK_RSENSE_MSG */ printf("sense data = "); for (i = 0; i < 18; i++) printf("%x ", sc->sc_param[i]); printf("\n"); } break; case TGST_GOOD: break; default: printf("SCSI%d: bad target status 0x%x\n", intr, sc->sc_tstatus); break; } } else { printf("SCSI%d: bad initiator status 0x%x\n", intr, sc->sc_istatus); } while (i++ < 100000) { scop_tst(intr, sc, slave, SCSI_INTDIS); if (sc->sc_tstatus != TGST_BUSY) break; } if (i > 100000) printf("SCSI%d: still busy after rasblk.\n", intr);}/***/struct scsi_berr_bug_table { int model; int serial_l; int serial_h; int value; /* 1:BUG, 0:NOBUG */};/***/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -