⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scsi.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
}/* * 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 + -