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

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

?? scsi.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 4 頁
字號:
				
	memcpy ((void *) SCpnt->cmnd , (void *) cmnd, 12);
	/* Zero the sense buffer.  Some host adapters automatically request
	   sense on error.  0 is not a valid sense code.  */
	memset ((void *) SCpnt->sense_buffer, 0, sizeof SCpnt->sense_buffer);
	SCpnt->request_buffer = buffer;
	SCpnt->request_bufflen = bufflen;
	SCpnt->old_use_sg = SCpnt->use_sg;

	/* Start the timer ticking.  */

	SCpnt->internal_timeout = 0;
	internal_cmnd (SCpnt);

#ifdef DEBUG
	printk ("Leaving scsi_do_cmd()\n");
#endif
        }



/*
	The scsi_done() function disables the timeout timer for the scsi host, 
	marks the host as not busy, and calls the user specified completion 
	function for that host's current command.
*/

static void reset (Scsi_Cmnd * SCpnt)
{
#ifdef DEBUG
	printk("scsi: reset(%d)\n", SCpnt->host->host_no);
#endif
	
	SCpnt->flags |= (WAS_RESET | IS_RESETTING);
	scsi_reset(SCpnt);
	
#ifdef DEBUG
	printk("performing request sense\n");
#endif
	
	if(SCpnt->flags & NEEDS_JUMPSTART) {
	  SCpnt->flags &= ~NEEDS_JUMPSTART;
	  scsi_request_sense (SCpnt);
	};
}
	
	

static int check_sense (Scsi_Cmnd * SCpnt)
	{
  /* If there is no sense information, request it.  If we have already
     requested it, there is no point in asking again - the firmware must be
     confused. */
  if (((SCpnt->sense_buffer[0] & 0x70) >> 4) != 7) {
    if(!(SCpnt->flags & ASKED_FOR_SENSE))
      return SUGGEST_SENSE;
    else
      return SUGGEST_RETRY;
      }
  
  SCpnt->flags &= ~ASKED_FOR_SENSE;

#ifdef DEBUG_INIT
	printk("scsi%d : ", SCpnt->host->host_no);
	print_sense("", SCpnt);
	printk("\n");
#endif
	        if (SCpnt->sense_buffer[2] &0xe0)
		  return SUGGEST_ABORT;

		switch (SCpnt->sense_buffer[2] & 0xf)
		{
		case NO_SENSE:
			return 0;
		case RECOVERED_ERROR:
			if (scsi_devices[SCpnt->index].type == TYPE_TAPE)
			  return SUGGEST_IS_OK;
			else
			  return 0;

		case ABORTED_COMMAND:
			return SUGGEST_RETRY;	
		case NOT_READY:
		case UNIT_ATTENTION:
			return SUGGEST_ABORT;

		/* these three are not supported */	
		case COPY_ABORTED:
		case VOLUME_OVERFLOW:
		case MISCOMPARE:
	
		case MEDIUM_ERROR:
			return SUGGEST_REMAP;
		case BLANK_CHECK:
		case DATA_PROTECT:
		case HARDWARE_ERROR:
		case ILLEGAL_REQUEST:
		default:
			return SUGGEST_ABORT;
		}
	      }

/* This function is the mid-level interrupt routine, which decides how
 *  to handle error conditions.  Each invocation of this function must
 *  do one and *only* one of the following:
 *
 *  (1) Call last_cmnd[host].done.  This is done for fatal errors and
 *      normal completion, and indicates that the handling for this
 *      request is complete.
 *  (2) Call internal_cmnd to requeue the command.  This will result in
 *      scsi_done being called again when the retry is complete.
 *  (3) Call scsi_request_sense.  This asks the host adapter/drive for
 *      more information about the error condition.  When the information
 *      is available, scsi_done will be called again.
 *  (4) Call reset().  This is sort of a last resort, and the idea is that
 *      this may kick things loose and get the drive working again.  reset()
 *      automatically calls scsi_request_sense, and thus scsi_done will be
 *      called again once the reset is complete.
 *
 *      If none of the above actions are taken, the drive in question
 * will hang. If more than one of the above actions are taken by
 * scsi_done, then unpredictable behavior will result.
 */
static void scsi_done (Scsi_Cmnd * SCpnt)
	{
	int status=0;
	int exit=0;
	int checked;
	int oldto;
	struct Scsi_Host * host = SCpnt->host;
	int result = SCpnt->result;
	oldto = update_timeout(SCpnt, 0);

#define FINISHED 0
#define MAYREDO  1
#define REDO	 3
#define PENDING  4

#ifdef DEBUG
	printk("In scsi_done(host = %d, result = %06x)\n", host->host_no, result);
#endif
	switch (host_byte(result))	
	{
	case DID_OK:
		if (SCpnt->flags & IS_RESETTING)
			{
			SCpnt->flags &= ~IS_RESETTING;
			status = REDO;
			break;
			}

		if (status_byte(result) && (SCpnt->flags & WAS_SENSE))
			/* Failed to obtain sense information */
			{
			SCpnt->flags &= ~WAS_SENSE;
			SCpnt->internal_timeout &= ~SENSE_TIMEOUT;

			if (!(SCpnt->flags & WAS_RESET))
				{
				printk("scsi%d : target %d lun %d request sense failed, performing reset.\n", 
					SCpnt->host->host_no, SCpnt->target, SCpnt->lun);
				reset(SCpnt);
				return;
				}
			else
				{
				exit = (DRIVER_HARD | SUGGEST_ABORT);
				status = FINISHED;
				}
			}
		else switch(msg_byte(result))
			{
			case COMMAND_COMPLETE:
			switch (status_byte(result))
			{
			case GOOD:
				if (SCpnt->flags & WAS_SENSE)
					{
#ifdef DEBUG
	printk ("In scsi_done, GOOD status, COMMAND COMPLETE, parsing sense information.\n");
#endif

					SCpnt->flags &= ~WAS_SENSE;
					SCpnt->internal_timeout &= ~SENSE_TIMEOUT;
	
					switch (checked = check_sense(SCpnt))
					{
					case SUGGEST_SENSE:
					case 0: 
#ifdef DEBUG
	printk("NO SENSE.  status = REDO\n");
#endif

						update_timeout(SCpnt, oldto);
						status = REDO;
						break;
      					case SUGGEST_IS_OK:
						break;
					case SUGGEST_REMAP:			
					case SUGGEST_RETRY: 
#ifdef DEBUG
	printk("SENSE SUGGEST REMAP or SUGGEST RETRY - status = MAYREDO\n");
#endif

						status = MAYREDO;
						exit = DRIVER_SENSE | SUGGEST_RETRY;
						break;
					case SUGGEST_ABORT:
#ifdef DEBUG
	printk("SENSE SUGGEST ABORT - status = FINISHED");
#endif

						status = FINISHED;
						exit =  DRIVER_SENSE | SUGGEST_ABORT;
						break;
					default:
						printk ("Internal error %s %d \n", __FILE__, 
							__LINE__);
					}			   
					}	
				else
					{
#ifdef DEBUG
	printk("COMMAND COMPLETE message returned, status = FINISHED. \n");
#endif

					exit =  DRIVER_OK;
					status = FINISHED;
					}
				break;	

			case CHECK_CONDITION:
				switch (check_sense(SCpnt))
				  {
				  case 0: 
				    update_timeout(SCpnt, oldto);
				    status = REDO;
				    break;
				  case SUGGEST_REMAP:			
				  case SUGGEST_RETRY:
				    status = MAYREDO;
				    exit = DRIVER_SENSE | SUGGEST_RETRY;
				    break;
				  case SUGGEST_ABORT:
				    status = FINISHED;
				    exit =  DRIVER_SENSE | SUGGEST_ABORT;
				    break;
				  case SUGGEST_SENSE:
				scsi_request_sense (SCpnt);
				status = PENDING;
				break;       	
				  }
				break;       	
			
			case CONDITION_GOOD:
			case INTERMEDIATE_GOOD:
			case INTERMEDIATE_C_GOOD:
				break;
				
			case BUSY:
				update_timeout(SCpnt, oldto);
				status = REDO;
				break;

			case RESERVATION_CONFLICT:
				printk("scsi%d : RESERVATION CONFLICT performing reset.\n", 
					SCpnt->host->host_no);
				reset(SCpnt);
				return;
#if 0
				exit = DRIVER_SOFT | SUGGEST_ABORT;
				status = MAYREDO;
				break;
#endif
			default:
				printk ("Internal error %s %d \n"
					"status byte = %d \n", __FILE__, 
					__LINE__, status_byte(result));
				
			}
			break;
			default:
				panic("scsi: unsupported message byte %d recieved\n", msg_byte(result)); 
			}
			break;
	case DID_TIME_OUT:	
#ifdef DEBUG
	printk("Host returned DID_TIME_OUT - ");
#endif

		if (SCpnt->flags & WAS_TIMEDOUT)	
			{
#ifdef DEBUG
	printk("Aborting\n");
#endif	
			exit = (DRIVER_TIMEOUT | SUGGEST_ABORT);
			}		
		else 
			{
#ifdef DEBUG
			printk ("Retrying.\n");
#endif
			SCpnt->flags  |= WAS_TIMEDOUT;
			status = REDO;
			}
		break;
	case DID_BUS_BUSY:
	case DID_PARITY:
		status = REDO;
		break;
	case DID_NO_CONNECT:
#ifdef DEBUG
		printk("Couldn't connect.\n");
#endif
		exit  = (DRIVER_HARD | SUGGEST_ABORT);
		break;
	case DID_ERROR:	
		status = MAYREDO;
		exit = (DRIVER_HARD | SUGGEST_ABORT);
		break;
	case DID_BAD_TARGET:
	case DID_ABORT:
		exit = (DRIVER_INVALID | SUGGEST_ABORT);
		break;	
        case DID_RESET:
                if(msg_byte(result) == GOOD &&
                      status_byte(result) == CHECK_CONDITION) {
			switch (check_sense(SCpnt)) {
			case 0: 
			    update_timeout(SCpnt, oldto);
			    status = REDO;
			    break;
			case SUGGEST_REMAP:			
			case SUGGEST_RETRY:
			    status = MAYREDO;
			    exit = DRIVER_SENSE | SUGGEST_RETRY;
			    break;
			case SUGGEST_ABORT:
			    status = FINISHED;
			    exit =  DRIVER_SENSE | SUGGEST_ABORT;
			    break;
			case SUGGEST_SENSE:
                              scsi_request_sense (SCpnt);
                              status = PENDING;
                              break;
			}
		} else {
                status=REDO;
                exit = SUGGEST_RETRY;
		}
                break;
	default : 		
		exit = (DRIVER_ERROR | SUGGEST_DIE);
	}

	switch (status) 
		{
		case FINISHED:
		case PENDING:
			break;
		case MAYREDO:

#ifdef DEBUG
	printk("In MAYREDO, allowing %d retries, have %d\n",
	       SCpnt->allowed, SCpnt->retries);
#endif

			if ((++SCpnt->retries) < SCpnt->allowed)
			{
			if ((SCpnt->retries >= (SCpnt->allowed >> 1))
			    && !(SCpnt->flags & WAS_RESET))
			        {
					printk("scsi%d : reseting for second half of retries.\n",
						SCpnt->host->host_no);
					reset(SCpnt);
					break;
			        }

			}
			else
				{
				status = FINISHED;
				break;
				}
			/* fall through to REDO */

		case REDO:
			if (SCpnt->flags & WAS_SENSE)			
				scsi_request_sense(SCpnt); 	
			else	
			  {
			    memcpy ((void *) SCpnt->cmnd,
				    (void*) SCpnt->data_cmnd, 
				    sizeof(SCpnt->data_cmnd));
			    SCpnt->request_buffer = SCpnt->buffer;
			    SCpnt->request_bufflen = SCpnt->bufflen;
			    SCpnt->use_sg = SCpnt->old_use_sg;
			    internal_cmnd (SCpnt);
			  };
			break;	
		default: 
			INTERNAL_ERROR;
		}

	if (status == FINISHED) 
		{
		#ifdef DEBUG
			printk("Calling done function - at address %08x\n", SCpnt->done);
		#endif
		host->host_busy--; /* Indicate that we are free */
		wake_up(&host->host_wait);
		SCpnt->result = result | ((exit & 0xff) << 24);
		SCpnt->use_sg = SCpnt->old_use_sg;
		SCpnt->done (SCpnt);
		}


#undef FINISHED
#undef REDO
#undef MAYREDO
#undef PENDING
	}

/*
	The scsi_abort function interfaces with the abort() function of the host
	we are aborting, and causes the current command to not complete.  The 
	caller should deal with any error messages or status returned on the 
	next call.
	
	This will not be called rentrantly for a given host.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产三级国产三级人妇| 一区二区在线观看免费 | 国产精品一区二区三区网站| 黄页网站大全一区二区| 成人亚洲一区二区一| 欧美在线制服丝袜| 精品日韩欧美在线| 久久久久国产免费免费| 亚洲欧美日韩国产中文在线| 午夜精品久久久久久久| 国产在线精品免费| 在线观看www91| 精品99999| 亚洲国产成人91porn| 麻豆91在线看| 在线观看日韩毛片| 国产三级精品三级在线专区| 亚洲成av人片在www色猫咪| 国产福利一区二区| 欧美一区二区三区人| 中文字幕精品一区二区三区精品| 亚洲国产一二三| 蜜桃一区二区三区在线| av亚洲精华国产精华精华| 日韩精品最新网址| 亚洲国产精品久久艾草纯爱| 懂色av一区二区三区免费看| 91精品国产综合久久精品麻豆| 日韩免费观看高清完整版| 亚洲视频综合在线| 成人激情av网| 欧美大片在线观看一区| 亚洲国产中文字幕| 99久久免费视频.com| 欧美精品一区二区三区高清aⅴ| 亚洲欧美日韩国产另类专区| 国产电影精品久久禁18| 日韩一级高清毛片| 日本最新不卡在线| 91久久精品国产91性色tv| 国产女人水真多18毛片18精品视频| 三级一区在线视频先锋| 精品视频全国免费看| 亚洲另类在线一区| 91丨九色丨蝌蚪丨老版| 国产三区在线成人av| 久久国产精品露脸对白| 日韩欧美一卡二卡| 亚洲午夜三级在线| 在线观看免费视频综合| 一区二区三区免费看视频| 91网站最新网址| 亚洲视频在线一区| 91国产精品成人| 亚洲欧美激情小说另类| 在线视频你懂得一区| 日韩美女视频一区| 色综合久久久久综合99| 综合av第一页| 色噜噜夜夜夜综合网| 亚洲一区在线观看视频| 欧美视频一区二区在线观看| 亚洲国产美国国产综合一区二区| 欧美日韩在线不卡| 日韩电影在线观看一区| 日韩精品一区二区三区视频在线观看 | 国产精品视频免费看| 精品一区二区三区免费毛片爱| 欧美精品久久久久久久多人混战| 丝袜美腿高跟呻吟高潮一区| 日韩一区二区精品在线观看| 激情偷乱视频一区二区三区| 精品国产污污免费网站入口 | 国产69精品久久99不卡| 一区精品在线播放| 欧美三级中文字幕| 美女一区二区在线观看| 久久综合久久鬼色中文字| 国产美女av一区二区三区| 国产精品伦理一区二区| 欧美性色综合网| 午夜视频久久久久久| 久久免费视频色| 色婷婷久久99综合精品jk白丝| 综合久久国产九一剧情麻豆| 欧美乱妇15p| 国产乱人伦精品一区二区在线观看| 久久伊99综合婷婷久久伊| 色域天天综合网| 亚洲超碰精品一区二区| 久久久99久久精品欧美| 欧亚一区二区三区| 久久激情五月婷婷| 一区二区在线观看视频| 欧美精品一区二区三区高清aⅴ| 精品一区二区在线看| 亚洲久本草在线中文字幕| 在线播放中文字幕一区| 成人午夜激情在线| 美女网站视频久久| 一区二区在线看| 在线成人av网站| 99久精品国产| 国产剧情一区二区| 日韩黄色小视频| 亚洲人一二三区| 91精品国产高清一区二区三区| 成人精品免费看| 久久99精品久久只有精品| 亚洲综合色婷婷| 国产欧美日韩三区| 欧美日韩一区在线| www.欧美亚洲| 国产老肥熟一区二区三区| 午夜精品在线看| 亚洲天堂久久久久久久| 久久久精品黄色| 欧美刺激午夜性久久久久久久| 欧美日韩一区二区三区在线| 波多野结衣一区二区三区 | 国产视频亚洲色图| 国产日韩高清在线| 国产精品久久夜| 亚洲精品中文在线影院| 一区二区三区四区五区视频在线观看 | 婷婷综合久久一区二区三区| 午夜免费久久看| 久久精品国内一区二区三区| 国模娜娜一区二区三区| 国产成人午夜精品5599| 99热99精品| 欧美丝袜丝交足nylons图片| 欧美精品99久久久**| 日韩一级黄色大片| 国产日韩欧美不卡在线| 日韩美女视频一区| 亚洲123区在线观看| 精品一区二区三区在线观看国产| 国产激情视频一区二区在线观看| 成人国产精品免费| 在线欧美小视频| 日韩精品一区二区三区三区免费 | 欧美一区二区成人| 久久久久国产一区二区三区四区 | 亚洲国产高清aⅴ视频| 亚洲欧美激情小说另类| 奇米在线7777在线精品| 成人黄色片在线观看| 欧美三级蜜桃2在线观看| 精品国产一区二区三区久久久蜜月 | 成人av在线资源| 91福利资源站| www亚洲一区| 亚洲精品日产精品乱码不卡| 免费欧美日韩国产三级电影| 懂色av一区二区夜夜嗨| 欧美日韩国产综合视频在线观看| 精品国产91久久久久久久妲己| 国产精品久久久久久久岛一牛影视 | 欧美日韩精品一区二区在线播放| 日韩欧美亚洲国产精品字幕久久久| 国产日韩高清在线| 日韩国产在线观看一区| 成人国产电影网| 精品国产电影一区二区| 亚洲综合色在线| 成人黄色综合网站| 欧美电影免费观看高清完整版在线 | 色婷婷久久综合| 国产女主播一区| 九九在线精品视频| 欧美日韩精品一区二区天天拍小说| 国产蜜臀97一区二区三区 | 99久久精品免费看国产| 日韩欧美国产一区在线观看| 中文字幕综合网| 国产91精品一区二区麻豆网站 | 97久久精品人人爽人人爽蜜臀| 欧美不卡一区二区三区| 亚洲国产精品欧美一二99| 成人短视频下载| 久久久久久麻豆| 狠狠色综合播放一区二区| 欧美精品久久99久久在免费线 | 中文字幕亚洲综合久久菠萝蜜| 国产在线精品国自产拍免费| 欧美一级国产精品| 亚洲观看高清完整版在线观看| 99久久久国产精品免费蜜臀| 国产日韩欧美麻豆| 国产乱人伦偷精品视频不卡| 日韩一区二区中文字幕| 亚洲国产日韩在线一区模特| 91在线播放网址| 亚洲欧美在线另类| 盗摄精品av一区二区三区| 久久综合狠狠综合久久激情| 国产在线精品国自产拍免费| 精品粉嫩超白一线天av| 久久99久久精品欧美|