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

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

?? seagate.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.0源碼
?? C
?? 第 1 頁 / 共 3 頁
字號:
	return 0;      }int seagate_st0x_command (Scsi_Cmnd * SCpnt) {	return internal_command (SCpnt->target, SCpnt->lun, SCpnt->cmnd, SCpnt->request_buffer,				 SCpnt->request_bufflen, 				 (int) NO_RECONNECT);}	static int internal_command(unsigned char target, unsigned char lun, const void *cmnd,			 void *buff, int bufflen, int reselect) {	int len = 0;	unsigned char *data = NULL;		struct scatterlist *buffer = NULL;	int nobuffs = 0;	int clock;				int temp;#ifdef SLOW_HANDSHAKE	int borken;	/* Does the current target require Very Slow I/O ? */#endif#if (DEBUG & PHASE_DATAIN) || (DEBUG & PHASE_DATOUT) 	int transfered = 0;#endif#if (((DEBUG & PHASE_ETC) == PHASE_ETC) || (DEBUG & PRINT_COMMAND) || \	(DEBUG & PHASE_EXIT))		int i;#endif#if ((DEBUG & PHASE_ETC) == PHASE_ETC)	int phase=0, newphase;#endif	int done = 0;	unsigned char status = 0;		unsigned char message = 0;	register unsigned char status_read;	unsigned transfersize = 0, underflow = 0;	incommand = 0;	st0x_aborted = 0;#ifdef SLOW_HANDSHAKE	borken = (int) scsi_devices[SCint->index].borken;#endif#if (DEBUG & PRINT_COMMAND)	printk ("scsi%d : target = %d, command = ", hostno, target);	print_command((unsigned char *) cmnd);	printk("\n");#endif#if (DEBUG & PHASE_RESELECT)	switch (reselect) {	case RECONNECT_NOW :		printk("scsi%d : reconnecting\n", hostno);		break;#ifdef LINKED	case LINKED_RIGHT : 		printk("scsi%d : connected, can reconnect\n", hostno);		break;	case LINKED_WRONG :		printk("scsi%d : connected to wrong target, can reconnect\n",			hostno);		break;		#endif	case CAN_RECONNECT :		printk("scsi%d : allowed to reconnect\n", hostno);		break;	default :		printk("scsi%d : not allowed to reconnect\n", hostno);	}#endif		if (target == (controller_type == SEAGATE ? 7 : 6))		return DID_BAD_TARGET;/* *	We work it differently depending on if this is is "the first time," *	or a reconnect.  If this is a reselct phase, then SEL will  *	be asserted, and we must skip selection / arbitration phases. */	switch (reselect) {	case RECONNECT_NOW:#if (DEBUG & PHASE_RESELECT)		printk("scsi%d : phase RESELECT \n", hostno);#endif/* *	At this point, we should find the logical or of our ID and the original *	target's ID on the BUS, with BSY, SEL, and I/O signals asserted. * *	After ARBITRATION phase is completed, only SEL, BSY, and the  *	target ID are asserted.  A valid initator ID is not on the bus *	until IO is asserted, so we must wait for that. */				for (clock = jiffies + 10, temp = 0; (jiffies < clock) &&		     !(STATUS & STAT_IO););				if (jiffies >= clock)			{#if (DEBUG & PHASE_RESELECT)			printk("scsi%d : RESELECT timed out while waiting for IO .\n",				hostno);#endif			return (DID_BAD_INTR << 16);			}/*  * 	After I/O is asserted by the target, we can read our ID and its *	ID off of the BUS. */ 		if (!((temp = DATA) & (controller_type == SEAGATE ? 0x80 : 0x40)))			{#if (DEBUG & PHASE_RESELECT)			printk("scsi%d : detected reconnect request to different target.\n" 			       "\tData bus = %d\n", hostno, temp);#endif			return (DID_BAD_INTR << 16);			}		if (!(temp & (1 << current_target)))			{			printk("scsi%d : Unexpected reselect interrupt.  Data bus = %d\n",				hostno, temp);			return (DID_BAD_INTR << 16);			}		buffer=current_buffer;	                cmnd=current_cmnd;      /* WDE add */                data=current_data;      /* WDE add */                len=current_bufflen;    /* WDE add */		nobuffs=current_nobuffs;/* * 	We have determined that we have been selected.  At this point,  *	we must respond to the reselection by asserting BSY ourselves */#if 1		CONTROL = (BASE_CMD | CMD_DRVR_ENABLE | CMD_BSY);#else		CONTROL = (BASE_CMD | CMD_BSY);#endif/* *	The target will drop SEL, and raise BSY, at which time we must drop *	BSY. */		for (clock = jiffies + 10; (jiffies < clock) &&  (STATUS & STAT_SEL););		if (jiffies >= clock)			{ 			CONTROL = (BASE_CMD | CMD_INTR);#if (DEBUG & PHASE_RESELECT)			printk("scsi%d : RESELECT timed out while waiting for SEL.\n",				hostno);#endif			return (DID_BAD_INTR << 16);				 			}		CONTROL = BASE_CMD;/* *	At this point, we have connected with the target and can get  *	on with our lives. */	 		break;	case CAN_RECONNECT:#ifdef LINKED/* * This is a bletcherous hack, just as bad as the Unix #! interpreter stuff. * If it turns out we are using the wrong I_T_L nexus, the easiest way to deal * with it is to go into our INFORMATION TRANSFER PHASE code, send a ABORT  * message on MESSAGE OUT phase, and then loop back to here. */  connect_loop :#endif#if (DEBUG & PHASE_BUS_FREE)		printk ("scsi%d : phase = BUS FREE \n", hostno);#endif/* *	BUS FREE PHASE * * 	On entry, we make sure that the BUS is in a BUS FREE *	phase, by insuring that both BSY and SEL are low for *	at least one bus settle delay.  Several reads help *	eliminate wire glitch. */		clock = jiffies + ST0X_BUS_FREE_DELAY;	#if !defined (ARBITRATE) 		while (((STATUS |  STATUS | STATUS) & 		         (STAT_BSY | STAT_SEL)) && 			 (!st0x_aborted) && (jiffies < clock));		if (jiffies > clock)			return retcode(DID_BUS_BUSY);		else if (st0x_aborted)			return retcode(st0x_aborted);#endif#if (DEBUG & PHASE_SELECTION)		printk("scsi%d : phase = SELECTION\n", hostno);#endif		clock = jiffies + ST0X_SELECTION_DELAY;/* * Arbitration/selection procedure :  * 1.  Disable drivers * 2.  Write HOST adapter address bit * 3.  Set start arbitration. * 4.  We get either ARBITRATION COMPLETE or SELECT at this *     point. * 5.  OR our ID and targets on bus. * 6.  Enable SCSI drivers and asserted SEL and ATTN */		#if defined(ARBITRATE)		cli();	CONTROL = 0;	DATA = (controller_type == SEAGATE) ? 0x80 : 0x40;	CONTROL = CMD_START_ARB; 	sti();	while (!((status_read = STATUS) & (STAT_ARB_CMPL | STAT_SEL)) &&		(jiffies < clock) && !st0x_aborted);	if (!(status_read & STAT_ARB_CMPL)) {#if (DEBUG & PHASE_SELECTION)		if (status_read & STAT_SEL) 			printk("scsi%d : arbitration lost\n", hostno);		else			printk("scsi%d : arbitration timeout.\n", hostno);#endif		CONTROL = BASE_CMD;		return retcode(DID_NO_CONNECT);	};#if (DEBUG & PHASE_SELECTION)	printk("scsi%d : arbitration complete\n", hostno);#endif#endif/* *	When the SCSI device decides that we're gawking at it, it will  *	respond by asserting BUSY on the bus. * * 	Note : the Seagate ST-01/02 product manual says that we should  * 	twiddle the DATA register before the control register.  However, *	this does not work reliably so we do it the other way arround. * *	Probably could be a problem with arbitration too, we really should *	try this with a SCSI protocol or logic analyzer to see what is  *	going on. */	cli();	DATA = (unsigned char) ((1 << target) | (controller_type == SEAGATE ? 0x80 : 0x40));	CONTROL = BASE_CMD | CMD_DRVR_ENABLE | CMD_SEL | 		(reselect ? CMD_ATTN : 0);	sti();		while (!((status_read = STATUS) & STAT_BSY) && 			(jiffies < clock) && !st0x_aborted)#if 0 && (DEBUG & PHASE_SELECTION)		{		temp = clock - jiffies;		if (!(jiffies % 5))			printk("seagate_st0x_timeout : %d            \r",temp);			}		printk("Done.                                             \n");		printk("scsi%d : status = %02x, seagate_st0x_timeout = %d, aborted = %02x \n", 			hostno, status_read, temp, st0x_aborted);#else		;#endif			if ((jiffies >= clock)  && !(status_read & STAT_BSY))			{#if (DEBUG & PHASE_SELECTION)			printk ("scsi%d : NO CONNECT with target %d, status = %x \n", 				hostno, target, STATUS);#endif			return retcode(DID_NO_CONNECT);			}/* *	If we have been aborted, and we have a command in progress, IE the  *	target still has BSY asserted, then we will reset the bus, and  * 	notify the midlevel driver to expect sense. */		if (st0x_aborted) {			CONTROL = BASE_CMD;			if (STATUS & STAT_BSY) {				printk("scsi%d : BST asserted after we've been aborted.\n",					hostno);				seagate_st0x_reset(NULL);				return retcode(DID_RESET);			}			return retcode(st0x_aborted);		}	/* Establish current pointers.  Take into account scatter / gather */        if ((nobuffs = SCint->use_sg)) {#if (DEBUG & DEBUG_SG)	{	int i;	printk("scsi%d : scatter gather requested, using %d buffers.\n",		hostno, nobuffs);	for (i = 0; i < nobuffs; ++i)		printk("scsi%d : buffer %d address = %08x length = %d\n",			hostno, i, buffer[i].address, buffer[i].length);	}#endif		                buffer = (struct scatterlist *) SCint->buffer;                len = buffer->length;                data = (unsigned char *) buffer->address;        } else {#if (DEBUG & DEBUG_SG)	printk("scsi%d : scatter gather not requested.\n", hostno);#endif                buffer = NULL;                len = SCint->request_bufflen;                data = (unsigned char *) SCint->request_buffer;        }#if (DEBUG & (PHASE_DATAIN | PHASE_DATAOUT))	printk("scsi%d : len = %d\n", hostno, len);#endif		break;#ifdef LINKED	case LINKED_RIGHT:	    	break;	case LINKED_WRONG:		break;#endif	}/* * 	There are several conditions under which we wish to send a message :  *	1.  When we are allowing disconnect / reconnect, and need to establish *	    the I_T_L nexus via an IDENTIFY with the DiscPriv bit set. * *	2.  When we are doing linked commands, are have the wrong I_T_L nexus *	    established and want to send an ABORT message. */		CONTROL = BASE_CMD | CMD_DRVR_ENABLE | 		(((reselect == CAN_RECONNECT)#ifdef LINKED 		|| (reselect == LINKED_WRONG)#endif 		)  ? CMD_ATTN : 0) ;	/* * 	INFORMATION TRANSFER PHASE * *	The nasty looking read / write inline assembler loops we use for  *	DATAIN and DATAOUT phases are approximately 4-5 times as fast as  *	the 'C' versions - since we're moving 1024 bytes of data, this *	really adds up. */#if ((DEBUG & PHASE_ETC) == PHASE_ETC)	printk("scsi%d : phase = INFORMATION TRANSFER\n", hostno);#endif  	incommand = 1;	transfersize = SCint->transfersize;	underflow = SCint->underflow;/* * 	Now, we poll the device for status information, *	and handle any requests it makes.  Note that since we are unsure of  *	how much data will be flowing across the system, etc and cannot  *	make reasonable timeouts, that we will instead have the midlevel * 	driver handle any timeouts that occur in this phase. */	while (((status_read = STATUS) & STAT_BSY) && !st0x_aborted && !done) 		{#ifdef PARITY		if (status_read & STAT_PARITY)			{			printk("scsi%d : got parity error\n", hostno);			st0x_aborted = DID_PARITY;			}	#endif		if (status_read & STAT_REQ)			{#if ((DEBUG & PHASE_ETC) == PHASE_ETC)			if ((newphase = (status_read & REQ_MASK)) != phase)				{				phase = newphase;				switch (phase)				{				case REQ_DATAOUT: 					printk("scsi%d : phase = DATA OUT\n",						hostno); 					break;				case REQ_DATAIN : 					printk("scsi%d : phase = DATA IN\n",						hostno); 					break;				case REQ_CMDOUT : 					printk("scsi%d : phase = COMMAND OUT\n",						hostno); 					break;				case REQ_STATIN :					 printk("scsi%d : phase = STATUS IN\n",						hostno); 					break;				case REQ_MSGOUT :					printk("scsi%d : phase = MESSAGE OUT\n",						hostno); 					break;				case REQ_MSGIN :					printk("scsi%d : phase = MESSAGE IN\n",						hostno);					break;				default : 					printk("scsi%d : phase = UNKNOWN\n",						hostno); 					st0x_aborted = DID_ERROR; 				}					}#endif		switch (status_read & REQ_MASK)		{					case REQ_DATAOUT : /* * If we are in fast mode, then we simply splat the data out * in word-sized chunks as fast as we can. */#ifdef FAST if (!len) {#if 0         printk("scsi%d: underflow to target %d lun %d \n",                 hostno, target, lun);        st0x_aborted = DID_ERROR;        fast = 0;#endif        break;}if (fast && transfersize && !(len % transfersize) && (len >= transfersize)#ifdef FAST32	&& !(transfersize % 4)#endif	) {#if (DEBUG & DEBUG_FAST)         printk("scsi%d : FAST transfer, underflow = %d, transfersize = %d\n"               "         len = %d, data = %08x\n", hostno, SCint->underflow,                SCint->transfersize, len, data);#endif        __asm__("	cld;"#ifdef FAST32"	shr $2, %%ecx;1:	lodsl;	movl %%eax, (%%edi);"#else"1:	lodsb;        movb %%al, (%%edi);"#endif"	loop 1b;" : :        /* input */        "D" (st0x_dr), "S" (data), "c" (SCint->transfersize) :        /* clobbered */        "eax", "ecx", "esi" );	len -= transfersize;	data += transfersize;#if (DEBUG & DEBUG_FAST)	printk("scsi%d : FAST transfer complete len = %d data = %08x\n", 		hostno, len, data);#endif} else #endif{/* * 	We loop as long as we are in a data out phase, there is data to send,  *	and BSY is still active. */		__asm__ (/*	Local variables : 	len = ecx	data = esi	st0x_cr_sr = ebx	st0x_dr =  edi	Test for any data here at all.*/	"\torl %%ecx, %%ecx	jz 2f	cld	movl _st0x_cr_sr, %%ebx	movl _st0x_dr, %%edi	1:	movb (%%ebx), %%al\n"/*	Test for BSY*/	"\ttest $1, %%al	jz 2f\n"/*	Test for data out phase - STATUS & REQ_MASK should be REQ_DATAOUT, which is 0.*/	"\ttest $0xe, %%al	jnz 2f	\n"/*	Test for REQ*/		"\ttest $0x10, %%al	jz 1b	lodsb	movb %%al, (%%edi) 	loop 1b2: 									":/* output */"=S" (data), "=c" (len) :/* input */"0" (data), "1" (len) :/* clobbered */"eax", "ebx", "edi"); }                        if (!len && nobuffs) {                                --nobuffs;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品亚洲午夜一区二区三区 | 本田岬高潮一区二区三区| 91精品国产高清一区二区三区蜜臀| 一区二区三区在线免费| 欧美性大战xxxxx久久久| 亚洲风情在线资源站| 欧美三级视频在线| 蜜桃av噜噜一区二区三区小说| 日韩一区二区免费在线观看| 久久精品噜噜噜成人88aⅴ| 久久久久久9999| 色综合天天视频在线观看| 亚洲一区av在线| 精品国一区二区三区| 成人夜色视频网站在线观看| 亚洲午夜免费福利视频| 91精品国产高清一区二区三区| 国产专区综合网| 中文字幕一区二区三| 欧美亚州韩日在线看免费版国语版| 亚州成人在线电影| 久久婷婷一区二区三区| 99国产精品99久久久久久| 亚洲成人福利片| 久久免费国产精品 | 一本大道综合伊人精品热热| 偷拍一区二区三区四区| 久久青草欧美一区二区三区| 色88888久久久久久影院按摩| 青青草原综合久久大伊人精品| 国产精品午夜免费| 欧美一区二区三区播放老司机| 不卡视频一二三| 激情小说亚洲一区| 亚洲免费资源在线播放| 久久中文字幕电影| 欧美日韩激情在线| 丁香激情综合五月| 日本伊人色综合网| 亚洲精品中文在线观看| 久久综合色婷婷| 欧美丝袜第三区| www.亚洲免费av| 国产又粗又猛又爽又黄91精品| 亚洲精品高清在线| 中文字幕第一页久久| 日韩视频一区二区| 欧美中文字幕一区二区三区| 国产成人自拍网| 丝瓜av网站精品一区二区| 18欧美亚洲精品| 久久久久国色av免费看影院| 91精品国产欧美一区二区18| 91国产成人在线| av不卡免费电影| 国产毛片精品视频| 美女一区二区三区在线观看| 亚洲国产欧美在线| 综合久久久久综合| 国产精品久线观看视频| 久久亚洲捆绑美女| 欧美一级二级在线观看| 欧美视频在线一区二区三区| 91精品1区2区| 91丨九色丨黑人外教| av中文字幕一区| a4yy欧美一区二区三区| 不卡的av网站| 91丨九色porny丨蝌蚪| 不卡一区二区中文字幕| 成人激情黄色小说| 成人av电影在线网| 成人激情电影免费在线观看| 成人一级片在线观看| 成人免费va视频| 成人午夜免费视频| 成年人午夜久久久| 97超碰欧美中文字幕| 99精品视频一区| 色噜噜偷拍精品综合在线| 欧美性极品少妇| 欧美挠脚心视频网站| 91麻豆精品国产自产在线 | 日韩经典一区二区| 免费在线一区观看| 国产在线精品国自产拍免费| 国产一区不卡视频| 不卡的电视剧免费网站有什么| 菠萝蜜视频在线观看一区| 91免费观看在线| 精品污污网站免费看| 欧美岛国在线观看| 26uuu亚洲综合色| 国产精品污www在线观看| 亚洲欧洲色图综合| 亚洲高清免费观看 | 久久久无码精品亚洲日韩按摩| 国产清纯美女被跳蛋高潮一区二区久久w| 久久亚洲精品国产精品紫薇| 国产精品伦一区| 亚洲成人av一区二区| 蜜臀av性久久久久蜜臀aⅴ流畅 | 精品日产卡一卡二卡麻豆| 精品99999| 亚洲美女精品一区| 视频精品一区二区| 国产成人午夜精品5599| 99久久99久久精品免费看蜜桃 | 蜜臀av性久久久久蜜臀aⅴ| 国产一区二区三区高清播放| 91网站在线播放| 日韩欧美一级二级| 中文字幕日韩一区| 日韩综合小视频| 成人免费视频视频在线观看免费| 一本色道久久综合狠狠躁的推荐| 日韩一级片在线观看| 久久久久久久久久久99999| 夜夜精品视频一区二区| 国产一区啦啦啦在线观看| 色综合久久六月婷婷中文字幕| 日韩一区二区三区四区| 亚洲桃色在线一区| 精品亚洲国产成人av制服丝袜| 99久久久免费精品国产一区二区| 91精品一区二区三区久久久久久 | 91小视频免费看| 欧美一区二区三区在线电影| 中文字幕制服丝袜成人av| 日韩电影在线一区二区三区| 不卡的av电影| 久久久综合精品| 日本成人在线网站| 色综合天天综合网国产成人综合天| 3d成人h动漫网站入口| 亚洲人成影院在线观看| 国产精品一区二区免费不卡 | 色狠狠一区二区三区香蕉| 欧美成人一级视频| 日韩精品视频网站| 欧美在线一二三| 中文字幕中文字幕在线一区| 国产在线精品一区二区不卡了 | 国产精品夜夜嗨| 欧美一卡2卡3卡4卡| 亚洲国产综合色| 99天天综合性| 国产精品乱码一区二区三区软件| 免费成人结看片| 欧美精品一二三| 一区二区激情视频| 97久久超碰国产精品| 国产精品久久毛片| 粉嫩嫩av羞羞动漫久久久| 久久久久久影视| 国产一区二区免费视频| 日韩欧美aaaaaa| 免费看黄色91| 日韩情涩欧美日韩视频| 强制捆绑调教一区二区| 在线不卡中文字幕播放| 偷窥少妇高潮呻吟av久久免费| 精品1区2区3区| 亚洲国产精品自拍| 欧美日韩日日夜夜| 天天av天天翘天天综合网| 欧美日韩一级大片网址| 丝袜a∨在线一区二区三区不卡| 欧美男女性生活在线直播观看| 亚洲无人区一区| 7777女厕盗摄久久久| 免费成人你懂的| 久久久久久久久久久久久久久99 | 精品捆绑美女sm三区| 看电影不卡的网站| 久久奇米777| 成人免费黄色大片| 亚洲欧美日韩在线播放| 欧美在线999| 日韩中文欧美在线| 精品国产成人系列| 成人午夜激情视频| 一区二区三区在线免费视频| 欧美日韩二区三区| 久久不见久久见免费视频7| 久久久www免费人成精品| 成人在线视频首页| 一区二区成人在线| 777久久久精品| 国产美女娇喘av呻吟久久| 国产精品国模大尺度视频| 91官网在线观看| 蜜桃视频第一区免费观看| 国产肉丝袜一区二区| 一本一道波多野结衣一区二区 | 亚洲欧美日韩国产中文在线| 欧美亚洲尤物久久| 韩国精品久久久| 一区二区三区日韩欧美| 日韩精品一区二|