亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? sc.c

?? 操作系統SunOS 4.1.3版本的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
sc_select(sc)register struct scsitwo *sc;{	register struct scsi_cmd *sp = sc->sc_que;	register int i;	u_short icr_mode;	DPRINTF2 ("select %d.%d\n", Tgt(sp), Lun(sp));	/*	 * make sure scsi bus is not continuously busy	 */	for (i = SC_WAIT_COUNT; i > 0; i--) {		if ((sc->sc_reg->icr & ICR_BUSY) == 0)			break;		DELAY(10);	}	if (i == 0) {		sc_printf(sc, "scsi bus continuously busy: ICR=0x%b\n",			sc->sc_reg->icr, scbits);		sp->cmd_pkt.pkt_reason = CMD_INCOMPLETE;		screset(sc, 1); /* XXX? */		return (FALSE);	}	/*	 * Got the bus...	 */	sp->cmd_pkt.pkt_state |= STATE_GOT_BUS;	/*	 * select target and wait for response	 */	sc->sc_reg->icr = 0; /* Make sure SECONDBYTE flag is clear */	/*	 * Since we aren't an arbitrating initiator, we only	 * put in the target address and *not* our own as well.	 */	sc->sc_reg->data = 1 << Tgt(sp);	sc->sc_reg->icr = ICR_SELECT;	/*	 * See if target responds to selection	 */	if (sc_wait((u_short *)&sc->sc_reg->icr, SC_SHORT_WAIT, ICR_BUSY)) {		DPRINTF2 ("%d.%d didn't select\n", Tgt(sp), Lun(sp));		sc->sc_reg->data = 0;		sc->sc_reg->icr = 0;		sp->cmd_pkt.pkt_reason = CMD_INCOMPLETE;		return (FALSE);	}	/*	 * Got the target...	 */	sp->cmd_pkt.pkt_state |= STATE_GOT_TARGET;	icr_mode = 0;	if ((sp->cmd_pkt.pkt_flags & FLAG_NOINTR) == 0) {		icr_mode |= ICR_INTERRUPT_ENABLE;	}	/*	 * If a data transfer is expected, set it up here...	 */	if (sp->cmd_dmacount && (sp->cmd_flags&CFLAG_DMAVALID)) {		SET_DMA_ADDR (sc->sc_reg, ((int)sp->cmd_data));		sc->sc_reg->dma_count = ~sp->cmd_dmacount;		if (((int)sp->cmd_data)&0x1) {			DPRINTF ("odd byte DMA address\n");		} else {			icr_mode |= ICR_WORD_MODE;		}		icr_mode |= ICR_DMA_ENABLE;	}	/*	 * set the interrupt register	 */	sc->sc_reg->icr = icr_mode;	return (TRUE);}/* * * finish routine * */static voidsc_finish(sc)register struct scsitwo *sc;{	register struct scsi_cmd *sp = sc->sc_que;	char dkn, wasintr;	sc->sc_reg->icr = 0;	/* clear any pending interrupts */	sc->sc_busy = 0;	if ((dkn = sp->cmd_pkt.pkt_pmon) >= 0) {		dk_busy &= ~(1<<dkn);	}	DPRINTF1 ("finishing command %d\n", sc->sc_cmdid);	sc->sc_cmdid++;	sc->sc_que = Nextcmd(sp);	if (sp->cmd_pkt.pkt_state & STATE_XFERRED_DATA) {		/*		 * Since we cannot disconnect, we cannot have had more		 * than one data segment		 */		if (sp->cmd_subseg.d_next != (struct dataseg *) 0) {			panic("sc_finish: more than one segment with data");			/* NOTREACHED */		}		sp->cmd_pkt.pkt_resid =			sp->cmd_dmacount - sp->cmd_subseg.d_count;	}	wasintr = (sp->cmd_pkt.pkt_flags & FLAG_NOINTR)? 0: 1;	(*sp->cmd_pkt.pkt_comp)(sp);	if (wasintr && sc->sc_que && sc->sc_busy == 0) {		sc_ustart(sc);	}}/* * Interrupt service section */static intsc_dopoll(sc, id)register struct scsitwo *sc;register id;{	register i;	struct scsi_cmd *sp = sc->sc_que;	for (i = 0; i < 300000 && id == sc->sc_cmdid; i++) {		if (INTPENDING(sc->sc_reg)) {			scintr(sc);			i = 0;		} else {			DELAY(500);		}	}	if (i >= 300000) {		sc_printf(sc, "polled command timeout\n");		sp->cmd_pkt.pkt_reason = CMD_TIMEOUT;		screset(sc, 0);		sc_finish(sc);	}}/* * Handle a polling (autovectored) SCSI bus interrupt. */static intscpoll(){	register struct scsitwo *sc;	register int serviced = 0;	for (sc = &sc_softc[0]; sc < &sc_softc[NSC]; sc++) {		if (sc->sc_reg && INTPENDING(sc->sc_reg)) {			serviced += scintr(sc);		}	}	return (serviced);}/* * Handle a scsi bus interrupt. */intscintr(sc)register struct scsitwo *sc;{	register struct scsi_cmd *sp = sc->sc_que;	if (sp == 0 || !sc->sc_reg || !(INTPENDING(sc->sc_reg))) {		sc_printf(sc, "spurious interrupt\n");		return (0);	}	DPRINTF2 ("scintr: ICR=0x%b\n", sc->sc_reg->icr, scbits);	/*	 * End of Data phase? Check for bus error first...	 */	if (sc->sc_reg->icr & ICR_BUS_ERROR) {		sc_printf(sc, "Dma BUS Error on address 0x%x\n", sp->cmd_data);		sc_abort_cmd(sc);		return (1);	} else if (sp->cmd_dmacount && (sp->cmd_flags & CFLAG_DMAVALID)) {		int resid, reqamt, xfer_amt;		resid = (u_short) (~sc->sc_reg->dma_count);		reqamt = sp->cmd_dmacount;		if (sc->sc_reg->icr & ICR_ODD_LENGTH) {			if (sp->cmd_flags & CFLAG_DMASEND) {				resid++;			} else if (reqamt) {				sc_flush(sc, (u_long)				    (sp->cmd_data + reqamt - resid));				resid--;			}		}		if (xfer_amt = reqamt - resid) {			DPRINTF1 ("xferred %d\n", xfer_amt);			sp->cmd_data += xfer_amt;			sp->cmd_subseg.d_count += xfer_amt;			sp->cmd_pkt.pkt_state |= STATE_XFERRED_DATA;		}	}	/*	 * Now, get status and/or message...	 */	while (sc->sc_reg->icr & (ICR_BUSY|ICR_REQUEST)) {		register u_short pbits;		while (((pbits = sc->sc_reg->icr) & ICR_REQUEST) == 0) {			if ((pbits & ICR_BUSY) == 0) {				sc_printf(sc, "Target %d dropped BUSY\n",				    Tgt(sp));				sc_abort_cmd(sc);				return (1);			}		}		switch (pbits & ICR_BITS) {		case ICR_STATUS:			*sp->cmd_scbp = sc->sc_reg->cmd_stat;			sp->cmd_pkt.pkt_state |= STATE_GOT_STATUS;			break;		case ICR_MESSAGE_IN:		{			static char *bad =				"Bad Message '0x%x' from Target %d, Lun %d\n";			switch (sc->sc_msgin = sc->sc_reg->cmd_stat) {			case MSG_COMMAND_COMPLETE:			case MSG_LINK_CMPLT:			case MSG_LINK_CMPLT_FLAG:				sp->cmd_pkt.pkt_reason = CMD_CMPLT;				sc_finish(sc);				break;			default:				sc_printf(sc, bad, sc->sc_msgin,					Tgt(sp), Lun(sp));				sc_abort_cmd(sc);				break;			}			return (1);			break;		}		default:			sc_printf(sc, "Bad phase: ICR=0x%b\n", pbits, scbits);			sc_abort_cmd(sc);			return (1);			break;		}	}	return (1);}/* * Flush the last byte of an odd length transfer */static voidsc_flush(sc, offset)register struct scsitwo *sc;register u_long offset;{	register u_int pv;	u_char *mapaddr;	if (MBI_MR(offset) < dvmasize) {		DVMA[offset] = sc->sc_reg->data;		return;	}#ifdef	sun3x	pv = btop (VME24D16_BASE + (offset & VME24D16_MASK));#else	sun3x	pv = PGT_VME_D16 | VME24_BASE | btop(offset & VME24_MASK);#endif	sun3x	mapaddr = (u_char *) ((u_long) kmxtob(sc_kment) |	    (u_long) MBI_OFFSET(offset));	segkmem_mapin(&kseg, (addr_t) (((int)mapaddr) & PAGEMASK),	    (u_int) mmu_ptob(1), PROT_READ | PROT_WRITE, pv, 0);	*mapaddr = sc->sc_reg->data;	segkmem_mapout(&kseg,	    (addr_t) (((int)mapaddr) & PAGEMASK), (u_int) mmu_ptob(1));	segkmem_mapout(&kseg, (addr_t) mapaddr, (u_int) mmu_btop(1));}/* * Miscellaneous functions */static voidsc_abort_cmd(sc)struct scsitwo *sc;{	sc->sc_que->cmd_pkt.pkt_reason = CMD_RESET;	screset(sc, 1);	sc_finish(sc);}/* * Wait for a condition to be (de)asserted on the scsi bus. * Returns 0, if successful, else -1; */static intsc_wait(icrp, wait_count, cond)	register u_short *icrp;	register int wait_count;{	register int i;	register u_short icr;	for (i = 0; i < wait_count; i++) {		icr = *icrp;		if ((icr & cond) == cond) {			return (0);		} else if (icr & ICR_BUS_ERROR) {			break;		} else			DELAY(10);	}	return (-1);}/* * Put data byte onto the scsi bus if phase match. * Returns:	1  if successful (phase matched) *		0  if incorrect phase, but REQ is present *		-1 if no REQ present */staticsc_putbyte(sc, bits, data)register struct scsitwo *sc;register u_short bits;register u_char data;{	register u_short icr;	if (sc_wait((u_short *)&sc->sc_reg->icr, SC_WAIT_COUNT, ICR_REQUEST)) {		DPRINTF ("sc_putbyte: no REQ\n");		return (-1);	}	icr = sc->sc_reg->icr;	if ((icr & ICR_BITS) != bits) {		DPRINTF2 ("sc_putbyte: ICR=0x%b\n", icr, scbits);		return (0);	}	sc->sc_reg->cmd_stat = data;	return (1);}/* * Reset SCSI control logic and bus. */static voidscreset(sc, msg_enable)struct scsitwo *sc;int msg_enable;{	if (msg_enable) {		sc_printf(sc, "Resetting SCSI bus\n");	}	sc->sc_reg->icr = ICR_RESET;	DELAY(50);	sc->sc_reg->icr = 0;	/* give reset scsi devices time to recover (> 2 Sec) */	DELAY(SC_RESET_DELAY);}/*ARGSUSED*/static voidsc_watch(arg)caddr_t arg;{	register s;	register struct scsitwo *sc;	register struct scsi_cmd *sp;	for (sc = &sc_softc[0]; sc < &sc_softc[NSC]; sc++) {		if (sc->sc_reg) {			s = splr(sc->sc_tran.tran_spl);			sp = sc->sc_que;			if (sp && (sp->cmd_flags & CFLAG_WATCH)) {				if (sp->cmd_timeout == 0) {					/*					 * A pending interrupt					 * defers the sentence					 * of death.					 */					if (INTPENDING(sc->sc_reg)) {						sp->cmd_timeout++;						(void) splx(s);						continue;					}					sc_printf(sc, "command timeout\n");					sp->cmd_pkt.pkt_reason = CMD_TIMEOUT;					sc_reset(sc, 0);					sc_finish(sc);					(void) splx(s);					continue;				} else {					sp->cmd_timeout -= 1;				}			}			(void) splx(s);		}	}	timeout(sc_watch, (caddr_t) 0, hz);}/*VARARGS*/static voidsc_printf(sc, fmt, a, b, c, d, e, f, g, h)struct scsitwo *sc;char *fmt;int a, b, c, d, e, f, g, h;{	printf("%s%d: ", CNAME, CNUM);	printf(fmt, a, b, c, d, e, f, g, h);}#endif	(NSC > 0)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美电影一区二区| 一区二区在线观看不卡| 久久国产视频网| 日韩精品电影一区亚洲| 亚洲欧美日韩系列| 亚洲精品视频一区| 一区二区三区毛片| 日韩成人一区二区三区在线观看| 亚洲一区二区在线观看视频| 天堂va蜜桃一区二区三区漫画版| 亚洲午夜视频在线| 精品制服美女丁香| 懂色av中文一区二区三区 | 精品剧情在线观看| 日韩欧美一二三四区| 精品国产免费久久| 亚洲色图一区二区三区| 麻豆国产欧美日韩综合精品二区| 国产在线国偷精品产拍免费yy | 亚洲精品乱码久久久久| 亚洲福利一区二区| 成人综合在线视频| 久久精品视频一区二区三区| 国产精品乱码一区二三区小蝌蚪| 成人不卡免费av| 91麻豆精品国产自产在线| 欧美va亚洲va在线观看蝴蝶网| 国产成人av网站| 欧美精品亚洲二区| 亚洲欧美日韩在线不卡| 波波电影院一区二区三区| 国产一区二区三区在线观看免费视频 | 一区av在线播放| 国产+成+人+亚洲欧洲自线| 欧美精品久久一区| 午夜亚洲国产au精品一区二区| 国产精品久久久久久久岛一牛影视| 蜜臀av性久久久久蜜臀aⅴ四虎| 91在线视频在线| 亚洲精品高清在线观看| 成人97人人超碰人人99| 精品国产一区二区精华| 婷婷国产在线综合| 日韩午夜电影在线观看| 老司机精品视频导航| 91麻豆精品国产91久久久更新时间| 亚洲福利国产精品| 欧美丰满少妇xxxbbb| 蜜桃视频一区二区三区| 精品动漫一区二区三区在线观看| 国产精品一区二区黑丝| 中文字幕欧美区| 7777精品久久久大香线蕉| 日韩精品国产欧美| 亚洲伦在线观看| 粉嫩aⅴ一区二区三区四区| 久久久精品黄色| 欧美四级电影在线观看| 久久精品国产亚洲高清剧情介绍| 国产欧美精品一区二区色综合| 色呦呦网站一区| 国产在线播精品第三| 色av综合在线| 懂色av一区二区三区蜜臀| 水野朝阳av一区二区三区| 成人免费观看av| 欧美一区中文字幕| 成人免费黄色在线| 国产精品资源站在线| 青青草视频一区| 天天综合色天天| 日韩中文字幕av电影| 亚洲人妖av一区二区| 国产日韩精品视频一区| 6080午夜不卡| 5566中文字幕一区二区电影| 91亚洲永久精品| 99热在这里有精品免费| 成人性视频网站| 欧美伊人精品成人久久综合97| 色噜噜狠狠成人中文综合| 欧美三级电影精品| 91精品综合久久久久久| 欧美福利视频一区| 久久综合成人精品亚洲另类欧美| 欧美一区2区视频在线观看| 91精品国产欧美一区二区成人| 欧美绝品在线观看成人午夜影视| 91精品国产一区二区三区蜜臀 | 视频一区二区国产| 久久99精品久久久久久国产越南| 国内精品不卡在线| 99九九99九九九视频精品| 欧美视频完全免费看| 欧美一级黄色大片| 国产成人无遮挡在线视频| 亚洲第一在线综合网站| 久久成人免费电影| 成人99免费视频| 久久色在线观看| 亚洲精品你懂的| 成人美女视频在线观看| 日韩情涩欧美日韩视频| 日韩欧美激情在线| 欧美精品在线观看一区二区| 中文在线一区二区 | 91麻豆精品国产无毒不卡在线观看 | 韩国成人福利片在线播放| 色综合久久久久| 欧美最新大片在线看| 久久九九久精品国产免费直播| 91亚洲精品一区二区乱码| 精品国产三级电影在线观看| 日韩不卡在线观看日韩不卡视频| 国产精品天美传媒| 成人激情综合网站| 国产精品毛片a∨一区二区三区| 国产一区二区三区在线观看免费视频| 不卡高清视频专区| 中文字幕一区日韩精品欧美| 欧美乱熟臀69xxxxxx| 亚洲欧洲精品一区二区三区不卡| 丰满少妇久久久久久久| 欧美激情一区不卡| 成人黄动漫网站免费app| 日韩一卡二卡三卡| 亚洲国产精品尤物yw在线观看| 制服丝袜中文字幕一区| 欧美一区二区三区视频免费| 国产精品1区2区3区| 国产精品高潮呻吟| 欧美日韩你懂得| 99在线精品免费| 久久丁香综合五月国产三级网站| 欧美www视频| 日本乱人伦aⅴ精品| 国产欧美日韩在线视频| 欧美视频日韩视频在线观看| 九九**精品视频免费播放| 亚洲欧美一区二区在线观看| 在线不卡一区二区| 91麻豆成人久久精品二区三区| 美国三级日本三级久久99| 欧美一区二区三区喷汁尤物| 国产精品亲子伦对白| 久久一二三国产| 日韩一区二区中文字幕| 色综合欧美在线| 亚洲成在人线免费| 国产亚洲一区二区三区四区| 日本高清不卡aⅴ免费网站| 国产99久久久国产精品潘金网站| 奇米四色…亚洲| 欧美日韩激情一区二区| 在线欧美小视频| 欧美日韩日本视频| 欧美日韩久久一区| 欧美一区二区三区公司| 欧美一区二区在线观看| 精品国产免费久久| 日本一区二区三区高清不卡| 国产成人三级在线观看| 成人一区二区三区视频| 91女厕偷拍女厕偷拍高清| 欧美三级日韩三级| 精品久久五月天| 国产精品三级视频| 亚洲婷婷综合色高清在线| 亚洲成人激情自拍| 国产成人亚洲精品狼色在线| 99re视频精品| 欧美草草影院在线视频| 成人免费视频视频在线观看免费 | 亚洲丝袜美腿综合| 亚洲一卡二卡三卡四卡无卡久久| 日韩在线一区二区三区| 国产电影一区二区三区| 亚洲三级电影全部在线观看高清| 亚洲高清在线精品| 丁香六月综合激情| 日韩丝袜美女视频| 国产精品免费人成网站| 精品一区免费av| 69堂成人精品免费视频| 亚洲国产毛片aaaaa无费看| 欧美一区二区久久久| 国产精品久久久久四虎| 欧美精品一区二区精品网| 亚洲国产美女搞黄色| 欧美亚洲动漫另类| 一区二区欧美国产| 在线观看日韩毛片| 亚洲午夜激情av| 欧美日韩一卡二卡| 91麻豆精品国产无毒不卡在线观看| 国产精品麻豆99久久久久久| 国产成人午夜视频| 亚洲一区二三区| 欧美日韩国产一区二区三区地区| 亚洲高清视频中文字幕|