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

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

?? mesh.c

?? 講述linux的初始化過程
?? C
?? 第 1 頁 / 共 4 頁
字號:
	return NOTIFY_DONE;}intmesh_command(Scsi_Cmnd *cmd){	printk(KERN_WARNING "whoops... mesh_command called\n");	return -1;}static voidmesh_init(struct mesh_state *ms){	volatile struct mesh_regs *mr = ms->mesh;	volatile struct dbdma_regs *md = ms->dma;	udelay(100);	out_le32(&md->control, (RUN|PAUSE|FLUSH|WAKE) << 16);	/* stop dma */	out_8(&mr->exception, 0xff);	/* clear all exception bits */	out_8(&mr->error, 0xff);	/* clear all error bits */	out_8(&mr->sequence, SEQ_RESETMESH);	udelay(10);	out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);	out_8(&mr->source_id, ms->host->this_id);	out_8(&mr->sel_timeout, 25);	/* 250ms */	out_8(&mr->sync_params, ASYNC_PARAMS);	out_8(&mr->bus_status1, BS1_RST);	/* assert RST */	udelay(30);			/* leave it on for >= 25us */	out_8(&mr->bus_status1, 0);	/* negate RST */	out_8(&mr->sequence, SEQ_FLUSHFIFO);	udelay(1);	out_8(&mr->sync_params, ASYNC_PARAMS);	out_8(&mr->sequence, SEQ_ENBRESEL);	out_8(&mr->interrupt, 0xff);	/* clear all interrupt bits */}/* * Start the next command for a MESH. * Should be called with interrupts disabled. */static voidmesh_start(struct mesh_state *ms){	Scsi_Cmnd *cmd, *prev, *next;	if (ms->phase != idle || ms->current_req != NULL) {		printk(KERN_ERR "inappropriate mesh_start (phase=%d, ms=%p)",		       ms->phase, ms);		return;	}	while (ms->phase == idle) {		prev = NULL;		for (cmd = ms->request_q; ; cmd = (Scsi_Cmnd *) cmd->host_scribble) {			if (cmd == NULL)				return;			if (ms->tgts[cmd->target].current_req == NULL)				break;			prev = cmd;		}		next = (Scsi_Cmnd *) cmd->host_scribble;		if (prev == NULL)			ms->request_q = next;		else			prev->host_scribble = (void *) next;		if (next == NULL)			ms->request_qtail = prev;		mesh_start_cmd(ms, cmd);	}}static voidmesh_start_cmd(struct mesh_state *ms, Scsi_Cmnd *cmd){	volatile struct mesh_regs *mr = ms->mesh;	int t;	ms->current_req = cmd;	ms->tgts[cmd->target].data_goes_out = data_goes_out(cmd);	ms->tgts[cmd->target].current_req = cmd;#if 1	if (DEBUG_TARGET(cmd)) {		int i;		printk(KERN_DEBUG "mesh_start: %p ser=%lu tgt=%d cmd=",		       cmd, cmd->serial_number, cmd->target);		for (i = 0; i < cmd->cmd_len; ++i)			printk(" %x", cmd->cmnd[i]);		printk(" use_sg=%d buffer=%p bufflen=%u\n",		       cmd->use_sg, cmd->request_buffer, cmd->request_bufflen);	}#endif	ms->phase = arbitrating;	ms->msgphase = msg_none;	ms->data_ptr = 0;	ms->dma_started = 0;	ms->n_msgout = 0;	ms->last_n_msgout = 0;	ms->expect_reply = 0;	ms->conn_tgt = cmd->target;	ms->tgts[cmd->target].saved_ptr = 0;	ms->stat = DID_OK;	ms->aborting = 0;#ifdef MESH_DBG	ms->tgts[cmd->target].n_log = 0;	dlog(ms, "start cmd=%x", (int) cmd);#endif	/* Off we go */	dlog(ms, "about to arb, intr/exc/err/fc=%.8x",	     MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count));	out_8(&mr->interrupt, INT_CMDDONE);	out_8(&mr->sequence, SEQ_ENBRESEL);	udelay(1);	if (mr->bus_status1 & (BS1_BSY | BS1_SEL)) {		/*		 * Some other device has the bus or is arbitrating for it -		 * probably a target which is about to reselect us.		 */		dlog(ms, "busy b4 arb, intr/exc/err/fc=%.8x",		     MKWORD(mr->interrupt, mr->exception,			    mr->error, mr->fifo_count));		for (t = 100; t > 0; --t) {			if ((mr->bus_status1 & (BS1_BSY | BS1_SEL)) == 0)				break;			if (in_8(&mr->interrupt) != 0) {				dlog(ms, "intr b4 arb, intr/exc/err/fc=%.8x",				     MKWORD(mr->interrupt, mr->exception,					    mr->error, mr->fifo_count));				mesh_interrupt(0, (void *)ms, 0);				if (ms->phase != arbitrating)					return;			}			udelay(1);		}		if (mr->bus_status1 & (BS1_BSY | BS1_SEL)) {			/* XXX should try again in a little while */			ms->stat = DID_BUS_BUSY;			ms->phase = idle;			mesh_done(ms, 0);			return;		}	}	/*	 * Apparently the mesh has a bug where it will assert both its	 * own bit and the target's bit on the bus during arbitration.	 */	out_8(&mr->dest_id, mr->source_id);	/*	 * There appears to be a race with reselection sometimes,	 * where a target reselects us just as we issue the	 * arbitrate command.  It seems that then the arbitrate	 * command just hangs waiting for the bus to be free	 * without giving us a reselection exception.	 * The only way I have found to get it to respond correctly	 * is this: disable reselection before issuing the arbitrate	 * command, then after issuing it, if it looks like a target	 * is trying to reselect us, reset the mesh and then enable	 * reselection.	 */	out_8(&mr->sequence, SEQ_DISRESEL);	if (in_8(&mr->interrupt) != 0) {		dlog(ms, "intr after disresel, intr/exc/err/fc=%.8x",		     MKWORD(mr->interrupt, mr->exception,			    mr->error, mr->fifo_count));		mesh_interrupt(0, (void *)ms, 0);		if (ms->phase != arbitrating)			return;		dlog(ms, "after intr after disresel, intr/exc/err/fc=%.8x",		     MKWORD(mr->interrupt, mr->exception,			    mr->error, mr->fifo_count));	}	out_8(&mr->sequence, SEQ_ARBITRATE);	for (t = 230; t > 0; --t) {		if (in_8(&mr->interrupt) != 0)			break;		udelay(1);	}	dlog(ms, "after arb, intr/exc/err/fc=%.8x",	     MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count));	if (mr->interrupt == 0 && (mr->bus_status1 & BS1_SEL)	    && (mr->bus_status0 & BS0_IO)) {		/* looks like a reselection - try resetting the mesh */		dlog(ms, "resel? after arb, intr/exc/err/fc=%.8x",		     MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count));		out_8(&mr->sequence, SEQ_RESETMESH);		udelay(10);		out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);		out_8(&mr->intr_mask, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);		out_8(&mr->sequence, SEQ_ENBRESEL);		for (t = 10; t > 0 && mr->interrupt == 0; --t)			udelay(1);		dlog(ms, "tried reset after arb, intr/exc/err/fc=%.8x",		     MKWORD(mr->interrupt, mr->exception, mr->error, mr->fifo_count));#ifndef MESH_MULTIPLE_HOSTS		if (mr->interrupt == 0 && (mr->bus_status1 & BS1_SEL)		    && (mr->bus_status0 & BS0_IO)) {			printk(KERN_ERR "mesh: controller not responding"			       " to reselection!\n");			/*			 * If this is a target reselecting us, and the			 * mesh isn't responding, the higher levels of			 * the scsi code will eventually time out and			 * reset the bus.			 */		}#endif	}}#ifndef MESH_NEW_STYLE_EHstatic voidfinish_cmds(void *data){	struct mesh_state *ms = data;	Scsi_Cmnd *cmd;	unsigned long flags;	for (;;) {		spin_lock_irqsave(&io_request_lock, flags);		cmd = ms->completed_q;		if (cmd == NULL) {			spin_unlock_irqrestore(&io_request_lock, flags);			break;		}		ms->completed_q = (Scsi_Cmnd *) cmd->host_scribble;		(*cmd->scsi_done)(cmd);		spin_unlock_irqrestore(&io_request_lock, flags);	}}#endif /* MESH_NEW_STYLE_EH */static inline voidadd_sdtr_msg(struct mesh_state *ms){	int i = ms->n_msgout;	ms->msgout[i] = EXTENDED_MESSAGE;	ms->msgout[i+1] = 3;	ms->msgout[i+2] = EXTENDED_SDTR;	ms->msgout[i+3] = mesh_sync_period/4;	ms->msgout[i+4] = (ALLOW_SYNC(ms->conn_tgt)? mesh_sync_offset: 0);	ms->n_msgout = i + 5;}static voidset_sdtr(struct mesh_state *ms, int period, int offset){	struct mesh_target *tp = &ms->tgts[ms->conn_tgt];	volatile struct mesh_regs *mr = ms->mesh;	int v, tr;	tp->sdtr_state = sdtr_done;	if (offset == 0) {		/* asynchronous */		if (SYNC_OFF(tp->sync_params))			printk(KERN_INFO "mesh: target %d now asynchronous\n",			       ms->conn_tgt);		tp->sync_params = ASYNC_PARAMS;		out_8(&mr->sync_params, ASYNC_PARAMS);		return;	}	/*	 * We need to compute ceil(clk_freq * period / 500e6) - 2	 * without incurring overflow.	 */	v = (ms->clk_freq / 5000) * period;	if (v <= 250000) {		/* special case: sync_period == 5 * clk_period */		v = 0;		/* units of tr are 100kB/s */		tr = (ms->clk_freq + 250000) / 500000;	} else {		/* sync_period == (v + 2) * 2 * clk_period */		v = (v + 99999) / 100000 - 2;		if (v > 15)			v = 15;	/* oops */		tr = ((ms->clk_freq / (v + 2)) + 199999) / 200000;	}	if (offset > 15)		offset = 15;	/* can't happen */	tp->sync_params = SYNC_PARAMS(offset, v);	out_8(&mr->sync_params, tp->sync_params);	printk(KERN_INFO "mesh: target %d synchronous at %d.%d MB/s\n",	       ms->conn_tgt, tr/10, tr%10);}static voidstart_phase(struct mesh_state *ms){	int i, seq, nb;	volatile struct mesh_regs *mr = ms->mesh;	volatile struct dbdma_regs *md = ms->dma;	Scsi_Cmnd *cmd = ms->current_req;	struct mesh_target *tp = &ms->tgts[ms->conn_tgt];	dlog(ms, "start_phase nmo/exc/fc/seq = %.8x",	     MKWORD(ms->n_msgout, mr->exception, mr->fifo_count, mr->sequence));	out_8(&mr->interrupt, INT_ERROR | INT_EXCEPTION | INT_CMDDONE);	seq = use_active_neg + (ms->n_msgout? SEQ_ATN: 0);	switch (ms->msgphase) {	case msg_none:		break;	case msg_in:		out_8(&mr->count_hi, 0);		out_8(&mr->count_lo, 1);		out_8(&mr->sequence, SEQ_MSGIN + seq);		ms->n_msgin = 0;		return;	case msg_out:		/*		 * To make sure ATN drops before we assert ACK for		 * the last byte of the message, we have to do the		 * last byte specially.		 */		if (ms->n_msgout <= 0) {			printk(KERN_ERR "mesh: msg_out but n_msgout=%d\n",			       ms->n_msgout);			mesh_dump_regs(ms);			ms->msgphase = msg_none;			break;		}		if (ALLOW_DEBUG(ms->conn_tgt)) {			printk(KERN_DEBUG "mesh: sending %d msg bytes:",			       ms->n_msgout);			for (i = 0; i < ms->n_msgout; ++i)				printk(" %x", ms->msgout[i]);			printk("\n");		}		dlog(ms, "msgout msg=%.8x", MKWORD(ms->n_msgout, ms->msgout[0],						ms->msgout[1], ms->msgout[2]));		out_8(&mr->count_hi, 0);		out_8(&mr->sequence, SEQ_FLUSHFIFO);		udelay(1);		/*		 * If ATN is not already asserted, we assert it, then		 * issue a SEQ_MSGOUT to get the mesh to drop ACK.		 */		if ((mr->bus_status0 & BS0_ATN) == 0) {			dlog(ms, "bus0 was %.2x explictly asserting ATN", mr->bus_status0);			out_8(&mr->bus_status0, BS0_ATN); /* explicit ATN */			udelay(1);			out_8(&mr->count_lo, 1);			out_8(&mr->sequence, SEQ_MSGOUT + seq);			out_8(&mr->bus_status0, 0); /* release explicit ATN */			dlog(ms,"hace: after explicit ATN bus0=%.2x",mr->bus_status0);		}		if (ms->n_msgout == 1) {			/*			 * We can't issue the SEQ_MSGOUT without ATN			 * until the target has asserted REQ.  The logic			 * in cmd_complete handles both situations:			 * REQ already asserted or not.			 */			cmd_complete(ms);		} else {			out_8(&mr->count_lo, ms->n_msgout - 1);			out_8(&mr->sequence, SEQ_MSGOUT + seq);			for (i = 0; i < ms->n_msgout - 1; ++i)				out_8(&mr->fifo, ms->msgout[i]);		}		return;	default:		printk(KERN_ERR "mesh bug: start_phase msgphase=%d\n",		       ms->msgphase);	}	switch (ms->phase) {	case selecting:		out_8(&mr->dest_id, ms->conn_tgt);		out_8(&mr->sequence, SEQ_SELECT + SEQ_ATN);		break;	case commanding:		out_8(&mr->sync_params, tp->sync_params);		out_8(&mr->count_hi, 0);		if (cmd) {			out_8(&mr->count_lo, cmd->cmd_len);			out_8(&mr->sequence, SEQ_COMMAND + seq);			for (i = 0; i < cmd->cmd_len; ++i)				out_8(&mr->fifo, cmd->cmnd[i]);		} else {			out_8(&mr->count_lo, 6);			out_8(&mr->sequence, SEQ_COMMAND + seq);			for (i = 0; i < 6; ++i)				out_8(&mr->fifo, 0);		}		break;	case dataing:		/* transfer data, if any */		if (!ms->dma_started) {			set_dma_cmds(ms, cmd);			out_le32(&md->cmdptr, virt_to_phys(ms->dma_cmds));			out_le32(&md->control, (RUN << 16) | RUN);			ms->dma_started = 1;		}		nb = ms->dma_count;		if (nb > 0xfff0)			nb = 0xfff0;		ms->dma_count -= nb;		ms->data_ptr += nb;		out_8(&mr->count_lo, nb);		out_8(&mr->count_hi, nb >> 8);		out_8(&mr->sequence, (tp->data_goes_out?				SEQ_DATAOUT: SEQ_DATAIN) + SEQ_DMA_MODE + seq);		break;	case statusing:		out_8(&mr->count_hi, 0);		out_8(&mr->count_lo, 1);		out_8(&mr->sequence, SEQ_STATUS + seq);		break;	case busfreeing:	case disconnecting:		out_8(&mr->sequence, SEQ_ENBRESEL);		udelay(1);		dlog(ms, "enbresel intr/exc/err/fc=%.8x",		     MKWORD(mr->interrupt, mr->exception, mr->error,			    mr->fifo_count));		out_8(&mr->sequence, SEQ_BUSFREE);		break;	default:		printk(KERN_ERR "mesh: start_phase called with phase=%d\n",		       ms->phase);		dumpslog(ms);	}}static inline voidget_msgin(struct mesh_state *ms){	volatile struct mesh_regs *mr = ms->mesh;	int i, n;	n = mr->fifo_count;	if (n != 0) {		i = ms->n_msgin;		ms->n_msgin = i + n;		for (; n > 0; --n)			ms->msgin[i++] = in_8(&mr->fifo);	}}static inline intmsgin_length(struct mesh_state *ms){	int b, n;	n = 1;	if (ms->n_msgin > 0) {		b = ms->msgin[0];		if (b == 1) {			/* extended message */			n = ms->n_msgin < 2? 2: ms->msgin[1] + 2;		} else if (0x20 <= b && b <= 0x2f) {			/* 2-byte message */			n = 2;		}	}	return n;}static voidcmd_complete(struct mesh_state *ms){	volatile struct mesh_regs *mr = ms->mesh;	Scsi_Cmnd *cmd = ms->current_req;	struct mesh_target *tp = &ms->tgts[ms->conn_tgt];	int seq, n, t;	dlog(ms, "cmd_complete fc=%x", mr->fifo_count);	seq = use_active_neg + (ms->n_msgout? SEQ_ATN: 0);	switch (ms->msgphase) {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一二三区精品视频| 久久九九久精品国产免费直播| 亚洲一二三四久久| 51精品视频一区二区三区| 日韩电影在线观看一区| 国产欧美日韩卡一| 欧美日韩大陆在线| 成人激情动漫在线观看| 五月综合激情日本mⅴ| 久久理论电影网| 欧美午夜在线一二页| av一区二区三区四区| 日产国产欧美视频一区精品| 亚洲天堂中文字幕| 欧美日韩午夜精品| 91啪在线观看| 国产不卡视频在线观看| 国产精品久久久久国产精品日日| 欧美精品免费视频| 精品视频999| 波多野洁衣一区| 国产高清在线观看免费不卡| 亚洲三级在线播放| 日本一区二区电影| 亚洲精品一区二区精华| 欧洲色大大久久| 91传媒视频在线播放| 91视频在线观看| 成人精品在线视频观看| 岛国精品在线观看| 国产美女精品在线| 日本欧美大码aⅴ在线播放| 亚洲国产一区二区三区 | 国产成人免费视频一区| 国产一区二区免费在线| 国产自产视频一区二区三区| 日韩**一区毛片| 久久精品国产99国产| 久久国产欧美日韩精品| 精品制服美女丁香| 日韩av电影一区| 精品一区二区久久久| 国产白丝精品91爽爽久久| 9i看片成人免费高清| 欧美视频在线一区| 久久久久高清精品| 亚洲三级在线看| 成人免费在线播放视频| 亚洲国产成人91porn| 麻豆成人av在线| 欧美系列在线观看| 国产精品美女久久久久久| 亚洲丶国产丶欧美一区二区三区| 亚洲伊人色欲综合网| 午夜精品久久久久久久99水蜜桃 | 亚洲图片一区二区| 亚洲成人一二三| 国产精品一品视频| eeuss鲁片一区二区三区在线观看| 成人性生交大片免费看中文| 99久久综合99久久综合网站| 在线观看av不卡| 欧美xxxxxxxx| 精品三级在线看| 国产精品久久国产精麻豆99网站| 亚洲免费av在线| 亚洲h动漫在线| 亚洲精品一二三| 91丝袜呻吟高潮美腿白嫩在线观看| 99久久久国产精品| 日韩欧美中文字幕一区| 国产亚洲精品aa| 日韩专区在线视频| 国产成人亚洲精品青草天美| 欧洲亚洲精品在线| 国产日韩欧美一区二区三区综合| 亚洲精品国产a| 国产91精品精华液一区二区三区| 一本大道久久a久久精二百| 精品美女被调教视频大全网站| 综合婷婷亚洲小说| 高清不卡在线观看| 欧美成人一区二区三区在线观看| 一区二区高清视频在线观看| 日韩激情一区二区| 日本高清免费不卡视频| 国产精品无人区| 国内精品伊人久久久久影院对白| 欧美人成免费网站| 国产三级精品视频| 蜜桃av一区二区| 91精品在线免费观看| 国产精品美日韩| 亚洲美女免费视频| 国产成a人亚洲| 7777精品久久久大香线蕉| 欧美精品tushy高清| 欧美日韩小视频| 久久伊99综合婷婷久久伊| 亚洲一区日韩精品中文字幕| jizz一区二区| 26uuu国产日韩综合| 久久综合综合久久综合| 欧美日韩国产免费一区二区 | 国产福利电影一区二区三区| 日韩免费福利电影在线观看| 日本视频在线一区| 欧美v国产在线一区二区三区| 日本欧美一区二区三区乱码| 6080日韩午夜伦伦午夜伦| 日本大胆欧美人术艺术动态| 欧美日韩成人一区| 丝袜国产日韩另类美女| 久久久亚洲午夜电影| 国产制服丝袜一区| 26uuu色噜噜精品一区二区| 老色鬼精品视频在线观看播放| 精品美女被调教视频大全网站| 福利一区在线观看| 一区二区三区在线影院| 日韩欧美国产综合一区| 国产美女视频91| 午夜一区二区三区视频| 精品国产91乱码一区二区三区| 91原创在线视频| 蜜臀av一区二区| 欧美日韩一区 二区 三区 久久精品| 午夜精品久久久久影视| 国产视频亚洲色图| 欧美老女人在线| 国产大陆亚洲精品国产| 亚洲国产日韩精品| 日韩一本二本av| 97久久精品人人做人人爽| 一区二区欧美视频| 亚洲欧洲成人精品av97| 精品国产欧美一区二区| 91视视频在线观看入口直接观看www| 久久久777精品电影网影网 | 91小视频免费看| 亚洲成av人片一区二区三区| 日本电影欧美片| 国产精品自拍毛片| 久久99国产精品免费网站| 一区二区成人在线观看| 欧美激情一区不卡| 成人午夜激情片| 精品一区二区三区影院在线午夜| 日韩精彩视频在线观看| 性欧美疯狂xxxxbbbb| 亚洲自拍偷拍网站| 亚洲一区二区综合| 日一区二区三区| 免费高清视频精品| 亚洲精品免费在线播放| 天天操天天综合网| 日本三级亚洲精品| 国产精品国产三级国产a| 国产精品国产馆在线真实露脸| 国产欧美一二三区| 亚洲欧洲成人自拍| 亚洲国产中文字幕| 五月天亚洲婷婷| 国产一区不卡视频| 91激情在线视频| 欧美丰满高潮xxxx喷水动漫| av毛片久久久久**hd| 99精品视频免费在线观看| 在线亚洲欧美专区二区| 日韩一区二区三区视频在线 | 亚洲欧洲三级电影| 三级一区在线视频先锋| 国产一区二区三区观看| 国产.精品.日韩.另类.中文.在线.播放 | 精品一区二区日韩| 色综合欧美在线| 日韩亚洲欧美在线| 日韩欧美第一区| 国产精品传媒入口麻豆| 日韩专区一卡二卡| 91丨porny丨在线| 久久人人爽人人爽| 午夜精品一区二区三区三上悠亚| 成人三级在线视频| 94-欧美-setu| 丁香啪啪综合成人亚洲小说| 欧美伦理影视网| 中文字幕在线一区免费| 韩国成人福利片在线播放| 欧美视频一区二区三区在线观看 | 欧美在线不卡一区| 久久久亚洲精品石原莉奈| 午夜久久久影院| 欧美撒尿777hd撒尿| 一区二区在线观看av| 色狠狠综合天天综合综合| 中文字幕国产一区| 国产大片一区二区| 欧美xxxxx牲另类人与| 中文字幕av一区 二区|