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

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

?? sc.c

?? 操作系統SunOS 4.1.3版本的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include "sc.h"#if	NSC > 0#ifndef lintstatic	char sccsid[] = "@(#)sc.c 1.1 92/07/30 SMI";#endif/* * Copyright (C) 1989, Sun Microsystems, Inc. *//* * * TO DO:	1. reimplment PARITY support *		2. handle linked commands * */#include <scsi/scsi.h>#include <scsi/adapters/screg.h>#include <sys/mman.h>#include <machine/pte.h>#include <machine/cpu.h>#include <vm/seg.h>/* * Definitions *//*#define	SC_PARITY	/* Compile in (cough) Parity support *//*#define	SC_LINKED	/* Compile in linked command support *//*#define	SCDEBUG		/* Compile in debug code */#ifdef	SC_PARITY---- BLETCH ----- PARITY NOT SUPPORTED YET#endif#ifdef	SCDEBUG#define	DEBUGGING	(scdebug || (scsi_options & SCSI_DEBUG_HA))#define	DPRINTF(str)		if (DEBUGGING) sc_printf(sc, str)#define	DPRINTF1(str, x)	if (DEBUGGING) sc_printf(sc, str, x)#define	DPRINTF2(str, x, y)	if (DEBUGGING) sc_printf(sc, str, x, y)#define	DPRINTF3(str, x, y, z)	if (DEBUGGING) sc_printf(sc, str, x, y, z)#else#define	DPRINTF#define	DPRINTF1#define	DPRINTF2#define	DPRINTF3#endif#define	TRUE		1#define	FALSE		0#define	UNDEFINED	-1#define	Tgt(sp)		((sp)->cmd_pkt.pkt_address.a_target)#define	Lun(sp)		((sp)->cmd_pkt.pkt_address.a_lun)#define	Nextcmd(sp)	((struct scsi_cmd *)((sp)->cmd_pkt.pkt_ha_private))#define	CNAME	scdriver.mdr_cname#define	CNUM	sc-sc_softc#define	INTPENDING(reg) ((reg)->icr & (ICR_INTERRUPT_REQUEST | ICR_BUS_ERROR))/* * SCSI Architecture Interface functions */static int sc_start(), sc_abort(), sc_reset(), sc_getcap(), sc_setcap();/* * Local && h/w related functions */static void screset(), sc_watch(), sc_ustart(), sc_finish(), sc_abort_cmd();static void sc_printf(), sc_flush();/* * Local static data */static struct scsitwo sc_softc[NSC];static char *scbits =	"\20\20Per\17Berr\16Odd\15IRQ\14REQ\13MSG\12CD\11IO\03Wrd\02Dma\01Ena";static long sc_kment;static int sc_mapins;#ifdef	SCDEBUGstatic int scdebug;#endif	SCDEBUG/* * External references */extern struct seg kseg;/* * Config dependencies */static int scprobe(), scslave(), scattach(), scpoll();int scintr();struct	mb_driver scdriver = {	scprobe, scslave, scattach, 0, 0, scpoll,	sizeof (struct screg), "scsibus", 0, "sc", 0, MDR_BIODMA,};static intscprobe(reg, ctlr)caddr_t reg;int ctlr;{	static char scwstart = 0;	register struct scsitwo *sc;	register struct screg *btmp = (struct screg *) reg;	/* probe for different scsi host adaptor interfaces */	if (peek((short *)&btmp->dma_count) == -1) {		return (0);	}	/* validate ctlr by write/read/cmp with a data pattern */	btmp->dma_count = 0x6789;	if (btmp->dma_count != 0x6789) {		return (0);	}	if (ctlr >= NSC) {		printf("%s%d: illegal controller number", CNAME, ctlr);		return (0);	}	sc_kment = rmalloc(kernelmap, mmu_btopr(MMU_PAGESIZE));	if (sc_kment == 0)		return (0);	sc = &sc_softc[ctlr];	sc->sc_reg = btmp;	sc->sc_tran.tran_start 		= sc_start;	sc->sc_tran.tran_abort		= sc_abort;	sc->sc_tran.tran_reset		= sc_reset;	sc->sc_tran.tran_getcap		= sc_getcap;	sc->sc_tran.tran_setcap		= sc_setcap;	sc->sc_tran.tran_pktalloc 	= scsi_std_pktalloc;	sc->sc_tran.tran_dmaget		= scsi_std_dmaget;	sc->sc_tran.tran_pktfree	= scsi_std_pktfree;	sc->sc_tran.tran_dmafree	= scsi_std_dmafree;	screset(sc, 0);	if (!scwstart) {		scwstart++;		timeout (sc_watch, (caddr_t) 0, hz);	}	return (sizeof (struct screg));}/*ARGSUSED1*/static intscslave(md, reg)struct mb_device *md;caddr_t reg;{	struct scsitwo *sc = &sc_softc[md->md_unit];	md->md_slave = HOST_ID << 3;#ifndef	SC_LINKED	/*	 * Disable linked commands for the moment...	 */	if (scsi_options & SCSI_OPTIONS_LINK) {		scsi_options ^= SCSI_OPTIONS_LINK;		sc_printf(sc, "disabling linked command support\n");	}#endif	return (1);}static intscattach(md)struct mb_device *md;{	int i;	static int sc_spl = 0;	struct scsitwo *sc = &sc_softc[md->md_unit];	/*	 * Calculate max spl value so far seen	 */	sc_spl = MAX(sc_spl, pritospl(md->md_intpri));	/*	 * Make sure that everyone, including us, is locking at	 * the same priority.	 */	for (i = 0; i <= md->md_unit; i++) {		sc_softc[i].sc_tran.tran_spl = sc_spl;	}	/*	 * Initialize interrupt register	 */	if (md->md_mc->mc_intr) {		/* set up for vectored interrupts */		sc->sc_reg->intvec = md->md_mc->mc_intr->v_vec;		*(md->md_mc->mc_intr->v_vptr) = (int) sc;	} else {		/* use auto-vectoring */		sc->sc_reg->intvec = AUTOBASE + md->md_mc->mc_intpri;	}	/*	 * Now make ourselves known to the rest of the SCSI world	 */	scsi_config(&sc->sc_tran, md);}/* * *	Begin of external interface routines * */static intsc_start(sp)register struct scsi_cmd *sp;{	auto int s;	register struct scsitwo *sc;	register struct scsi_cmd *xp;	sc = (struct scsitwo *) sp->cmd_pkt.pkt_address.a_cookie;	s = splr(sc->sc_tran.tran_spl);	if (xp = sc->sc_que) {		for (;;) {			if (Tgt(xp) == Tgt(sp) && Lun(xp) == Lun(sp)) {				/* Queueing error */				(void) splx(s);				return (FALSE);			}			if (Nextcmd(xp) == 0)				break;			else				xp = Nextcmd(xp);		}		Nextcmd(xp) = sp;	} else {		sc->sc_que = sp;	}	Nextcmd(sp) = 0;	/*	 * reinitialize some fields that need it...	 */	sp->cmd_pkt.pkt_resid = 0;	sp->cmd_pkt.pkt_reason = sp->cmd_pkt.pkt_state =		sp->cmd_pkt.pkt_statistics = 0;	sp->cmd_cdbp = (caddr_t) sp->cmd_pkt.pkt_cdbp;	sp->cmd_scbp = sp->cmd_pkt.pkt_scbp; *sp->cmd_scbp = 0;	if (sp->cmd_timeout = sp->cmd_pkt.pkt_time)		sp->cmd_flags |= CFLAG_WATCH;	else		sp->cmd_flags &= ~CFLAG_WATCH;	sp->cmd_data = sp->cmd_saved_data = sp->cmd_mapping;	sp->cmd_cursubseg = &sp->cmd_subseg;	sp->cmd_subseg.d_base = sp->cmd_mapping;	sp->cmd_subseg.d_count = 0;	sp->cmd_subseg.d_next = (struct dataseg *) 0;	sp->cmd_flags &= ~(CFLAG_NEEDSEG|CFLAG_CMDDISC);	/*	 * Okay- if this command is a polling command,	 * and we're not the head of the queue, we have to	 * wait for the commands ahead of us to finish.	 */	if (sp->cmd_pkt.pkt_flags & FLAG_NOINTR) {		int id;		while (sc->sc_que != sp) {			DPRINTF ("polled command waiting\n");			sc_dopoll(sc, sc->sc_cmdid);		}		id = sc->sc_cmdid;		DPRINTF1 ("starting polling cmd #%d\n", id);		sc_ustart(sc);		DPRINTF ("waiting polled cmd completion\n");		sc_dopoll(sc, id);		DPRINTF1 ("polled cmd #%d complete\n", id);		if (sc->sc_que)			sc_ustart(sc);	} else if (sc->sc_que == sp) {		sc_ustart(sc);	}	(void) splx(s);	return (TRUE);}/*ARGSUSED*/static intsc_abort(ap, pkt)struct scsi_address *ap;struct scsi_pkt *pkt;{	if (pkt != (struct scsi_pkt *) 0)		return (FALSE);	else		return (FALSE);}static intsc_reset(ap, level)struct scsi_address *ap;int level;{	struct scsitwo *sc = (struct scsitwo *) ap->a_cookie;	struct scsi_cmd *sp = sc->sc_que;	screset(sc, 0);	if (sp) {		/*		 * If we're resetting everything, remove		 * the current wait queue from reconsideration		 * after we reset and blow away the current		 * command.		 */		if (level == RESET_ALL) {			sp = Nextcmd(sc->sc_que);			Nextcmd(sc->sc_que) = 0;		}		sp->cmd_pkt.pkt_reason = CMD_RESET;		sc_finish(sc);		/*		 * walk down the unrooted wait queue, 'finishing' off		 * all the commands therein...		 */		if (level == RESET_ALL) {			while (sp) {				struct scsi_cmd *xp;				xp = Nextcmd(sp);				sp->cmd_pkt.pkt_reason = CMD_RESET;				(*sp->cmd_pkt.pkt_comp)(sp);				sp = xp;			}		}		return (TRUE);	} else {		return (FALSE);	}}/*ARGSUSED*/static intsc_getcap(ap, cap)struct scsi_address *ap;char *cap;{	if (cap == (char *) 0)		return (UNDEFINED);	else if (strncmp("dma_max", cap, 7) == 0)		return (1<<16);	else if (strncmp("msg_out", cap, 7) == 0)		return (0);	else if (strncmp("disconnect", cap, 10) == 0)		return (0);	else if (strncmp("synchronous", cap, 11) == 0)		return (0);	else if (strncmp("parity", cap, 6) == 0)		return (0);	else if (strncmp("initiator-id", cap, 12) == 0)		return (HOST_ID);	else		return (UNDEFINED);}/*ARGSUSED*/static intsc_setcap(ap, cap, value)struct scsi_address *ap;char *cap;int value;{	/*	 * Cannot set any values yet	 */	return (UNDEFINED);}/* * * Internal start routine * */static voidsc_ustart(sc)register struct scsitwo *sc;{	register i;	register struct scsi_cmd *sp = sc->sc_que;	char dkn;	int r;	if (!sp)		return;	else if ((dkn = sp->cmd_pkt.pkt_pmon) >= 0) {		dk_busy |= (1<<dkn);		dk_xfer[dkn]++;		if ((sp->cmd_flags & CFLAG_DMASEND) == 0)			dk_read[dkn]++;		dk_wds[dkn] += sp->cmd_dmacount >> 6;	}	/*	 * sc_select will wait for the scsi bus to be free, attempt	 * to select the target, will set up the dma engine for any	 * possible dma transfer, and will set the icr bits for having	 * interrupts enabled if this is an interrupting command.	 *	 */	sc->sc_busy = 1;	if (sc_select(sc) == FALSE) {		sc_finish(sc);		return;	}	/*	 * At this point, we should either ge into STATUS phase or into	 * COMMAND phase.	 */#ifdef	SCDEBUG	if (DEBUGGING) {		sc_printf(sc, "%d.%d cmd=", Tgt(sp), Lun(sp));		for (i = 0; i < sp->cmd_cdblen; i++) {			printf(" 0x%x", sp->cmd_cdbp[i]);		}		printf("\n");	}#endif	SCDEBUG	for (r = i = 0; i < sp->cmd_cdblen; i++) {		if ((r = sc_putbyte(sc, ICR_COMMAND, sp->cmd_cdbp[i])) <= 0) {			break;		}	}	if (r < 0) {		sc_printf(sc, "couldn't send command\n");		sc_abort_cmd(sc);	} else if (i > 0) {		sp->cmd_pkt.pkt_state |= STATE_SENT_CMD;		sp->cmd_cdbp = (caddr_t) (((u_long)sp->cmd_cdbp) + i);	}	/*	 * We will either let interrupts drive us the rest of the	 * way, or call a polling routine to do that for us	 */}static int

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久噜噜亚洲综合| 国产精品一二三| 亚洲免费观看在线观看| 2024国产精品| 久久久久久毛片| 国产亚洲综合在线| 亚洲国产成人在线| 中文字幕制服丝袜一区二区三区| 国产精品天美传媒沈樵| 1024成人网色www| 亚洲一区二区在线视频| 亚洲专区一二三| 五月天欧美精品| 日韩二区三区四区| 久久se精品一区二区| 国产精品一区免费视频| 成人免费看的视频| 在线观看成人小视频| 欧美丰满高潮xxxx喷水动漫| 日韩视频国产视频| 国产精品每日更新| 亚洲v精品v日韩v欧美v专区| 免费在线成人网| 国产精品一区二区免费不卡 | 国产精品久久久久久久久免费桃花| 国产视频911| 一区二区三区美女视频| 亚洲成人免费看| 国产一本一道久久香蕉| 91天堂素人约啪| 日韩美女主播在线视频一区二区三区| 国产欧美精品一区二区色综合 | 高清成人在线观看| 91国偷自产一区二区三区成为亚洲经典| 欧美日韩国产一级二级| 久久久久久久久久久黄色| 亚洲欧洲一区二区在线播放| 肉丝袜脚交视频一区二区| 亚洲精品一区在线观看| 亚洲精品国产a| 国产在线国偷精品免费看| 欧美这里有精品| 欧美激情中文不卡| 欧美丰满高潮xxxx喷水动漫| 国产精品午夜电影| 麻豆一区二区99久久久久| 色呦呦网站一区| 2021中文字幕一区亚洲| 性做久久久久久免费观看欧美| 极品少妇xxxx精品少妇偷拍| 在线观看成人免费视频| 国产精品色呦呦| 麻豆精品视频在线| 欧美日韩精品一区二区三区蜜桃| 欧美激情一区不卡| 激情五月婷婷综合| 4438x成人网最大色成网站| 亚洲精品视频在线观看免费| 国产成人小视频| 精品国产精品一区二区夜夜嗨| 亚洲高清在线视频| 一区二区三区欧美在线观看| 国产成人一区在线| 久久尤物电影视频在线观看| 日本aⅴ免费视频一区二区三区| 在线观看91精品国产入口| 亚洲欧美另类在线| av中文一区二区三区| 欧美激情在线免费观看| 国产精品亚洲一区二区三区妖精| 日韩欧美国产精品一区| 免费人成在线不卡| 日韩欧美国产电影| 蜜臀av一级做a爰片久久| 一区二区久久久久久| 色婷婷综合久久久中文字幕| 国产精品久久久久久久久免费丝袜 | 欧美日韩国产123区| 亚洲资源中文字幕| 欧美日韩一区三区| 五月婷婷综合激情| 欧美一级生活片| 欧美一级一区二区| 蜜桃视频在线观看一区| 日韩免费视频一区二区| 国产在线一区二区| 国产欧美一区二区三区鸳鸯浴 | 韩国欧美国产1区| 久久男人中文字幕资源站| 国产精品一区二区果冻传媒| 中文av一区特黄| 欧美在线观看视频一区二区三区 | 免费在线看成人av| 久久久精品免费网站| 国产精品1024| 一区二区三区丝袜| 欧美日韩国产bt| 国产sm精品调教视频网站| 国产精品久久久久毛片软件| 色婷婷精品久久二区二区蜜臀av| 午夜婷婷国产麻豆精品| 精品国产1区二区| 国产精品热久久久久夜色精品三区| 国产不卡视频一区| 亚洲成人综合网站| 欧美精品一区二区三区四区| 成人性色生活片免费看爆迷你毛片| 亚洲精品视频在线| 久久香蕉国产线看观看99| 99麻豆久久久国产精品免费优播| 午夜精品福利一区二区三区蜜桃| xfplay精品久久| 欧美自拍丝袜亚洲| 国产精品资源在线| 日韩不卡在线观看日韩不卡视频| 国产美女在线精品| 亚洲高清不卡在线| 中文字幕二三区不卡| 欧美日韩精品三区| 北条麻妃一区二区三区| 天堂va蜜桃一区二区三区漫画版| 久久久国产精品午夜一区ai换脸| 欧美日韩亚洲综合一区| 99免费精品在线| 国产乱码精品一区二区三区av | 91视频观看免费| 另类小说色综合网站| 亚洲免费观看高清完整版在线| 欧美电视剧免费全集观看| 色综合久久精品| av中文字幕一区| 粉嫩久久99精品久久久久久夜| 奇米在线7777在线精品| 亚洲第一在线综合网站| 亚洲欧美日本在线| 国产精品丝袜91| 久久久久国产精品麻豆| 日韩一区二区免费在线观看| 欧美怡红院视频| 色香蕉成人二区免费| 成人a区在线观看| 国产精品一区二区久久不卡| 国产在线一区观看| 国产一区二区导航在线播放| 老司机精品视频在线| 日韩av在线播放中文字幕| 国产一区二区在线看| 日本中文字幕一区二区有限公司| 亚洲最新视频在线观看| 一区二区三区在线视频免费| 最新热久久免费视频| www精品美女久久久tv| 欧美色综合网站| 青青草成人在线观看| 欧美大黄免费观看| 欧美成人精品福利| 91精品国产欧美一区二区成人| 欧美精品粉嫩高潮一区二区| 欧美日韩电影在线播放| 欧美乱熟臀69xxxxxx| 欧美麻豆精品久久久久久| 欧美日韩电影一区| 9191成人精品久久| 精品日韩成人av| 国产午夜精品福利| 亚洲欧美一区二区视频| 亚洲精品视频在线观看免费| 亚洲成av人片一区二区三区| 污片在线观看一区二区| 久久99精品国产麻豆不卡| 久久国产夜色精品鲁鲁99| 久久精品久久久精品美女| 欧美成人精品高清在线播放| 2017欧美狠狠色| 国产精品久久精品日日| 亚洲综合色在线| 美女诱惑一区二区| 成人深夜在线观看| 欧美视频三区在线播放| 欧美一区二区视频在线观看2020| 久久综合久久综合久久综合| 国产精品灌醉下药二区| 欧美日本在线播放| 久久亚洲二区三区| 一区二区三区在线观看欧美| 美女网站在线免费欧美精品| 国产精品一区二区久激情瑜伽 | 日韩黄色免费电影| 国产成人午夜精品影院观看视频 | 欧美一区二区在线观看| 久久精品一区四区| 亚洲成人高清在线| 成人午夜视频免费看| 欧美精品色综合| 国产精品福利一区二区| 欧美一级日韩免费不卡| 中日韩免费视频中文字幕| 午夜精品福利视频网站| 久久人人爽爽爽人久久久| 一区二区高清免费观看影视大全|