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

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

?? scsi.c

?? LINUX1.0源代碼,代碼條理清晰
?? C
?? 第 1 頁 / 共 4 頁
字號:
*/
	
/*
	Since we're nice guys and specified that abort() and reset()
	can be non-reentrant.  The internal_timeout flags are used for
	this.
*/


int scsi_abort (Scsi_Cmnd * SCpnt, int why)
	{
	int temp, oldto;
	struct Scsi_Host * host = SCpnt->host;
	
	while(1)	
		{
		cli();
		if (SCpnt->internal_timeout & IN_ABORT) 
			{
			sti();
			while (SCpnt->internal_timeout & IN_ABORT);
			}
		else
			{	
			SCpnt->internal_timeout |= IN_ABORT;
			oldto = update_timeout(SCpnt, ABORT_TIMEOUT);

			
			sti();
			if (!host->host_busy || !host->hostt->abort(SCpnt, why))
				temp =  0;
			else
				temp = 1;
			
			cli();
			SCpnt->internal_timeout &= ~IN_ABORT;
			update_timeout(SCpnt, oldto);
			sti();
			return temp;
			}
		}	
	}

int scsi_reset (Scsi_Cmnd * SCpnt)
	{
	int temp, oldto;
	Scsi_Cmnd * SCpnt1;
	struct Scsi_Host * host = SCpnt->host;
	
#ifdef DEBUG
	printk("Danger Will Robinson! - SCSI bus for host %d is being reset.\n",host->host_no);
#endif
	while (1) {
		cli();	
		if (SCpnt->internal_timeout & IN_RESET)
			{
			sti();
			while (SCpnt->internal_timeout & IN_RESET);
			}
		else
			{
			SCpnt->internal_timeout |= IN_RESET;
			oldto = update_timeout(SCpnt, RESET_TIMEOUT);	
					
			if (host->host_busy)
				{	
				sti();
				SCpnt1 = host->host_queue;
				while(SCpnt1) {
				  if ((SCpnt1->request.dev > 0) &&
				      !(SCpnt1->flags & IS_RESETTING) && 
				      !(SCpnt1->internal_timeout & IN_ABORT))
				    scsi_abort(SCpnt1, DID_RESET);
				  SCpnt1 = SCpnt1->next;
				};

				temp = host->hostt->reset(SCpnt);	
				}				
			else
				{
				host->host_busy++;
	
				sti();
				temp = host->hostt->reset(SCpnt);
				host->last_reset = jiffies;
				host->host_busy--;
				}
	
			cli();
			SCpnt->internal_timeout &= ~IN_RESET;
			update_timeout(SCpnt, oldto);
			sti();
			return temp;	
			}
		}
	}
			 

static void scsi_main_timeout(void)
	{
	/*
		We must not enter update_timeout with a timeout condition still pending.
	*/

	int timed_out;
	struct Scsi_Host * host;
	Scsi_Cmnd * SCpnt = NULL;

	do 	{	
		cli();

	/*
		Find all timers such that they have 0 or negative (shouldn't happen)
		time remaining on them.
	*/
			
		timed_out = 0;
		for(host = scsi_hostlist; host; host = host->next) {
		  SCpnt = host->host_queue;
		  while (SCpnt){
		    if (SCpnt->timeout > 0 && SCpnt->timeout <= time_elapsed)
		      {
			sti();
			SCpnt->timeout = 0;
			scsi_times_out(SCpnt);
			++timed_out; 
			cli();
		      }
		  SCpnt =  SCpnt->next;
		  };
		};
		update_timeout(NULL, 0);
	      } while (timed_out);	
	sti();
      }

/*
	The strategy is to cause the timer code to call scsi_times_out()
	when the soonest timeout is pending.  
	The arguments are used when we are queueing a new command, because
	we do not want to subtract the time used from this time, but when we
	set the timer, we want to take this value into account.
*/
	
static int update_timeout(Scsi_Cmnd * SCset, int timeout)
	{
	unsigned int least, used;
	unsigned int oldto;
	struct Scsi_Host * host;
	Scsi_Cmnd * SCpnt = NULL;

	cli();

/* 
	Figure out how much time has passed since the last time the timeouts 
   	were updated 
*/
	used = (time_start) ? (jiffies - time_start) : 0;

/*
	Find out what is due to timeout soonest, and adjust all timeouts for
	the amount of time that has passed since the last time we called 
	update_timeout. 
*/
	
	oldto = 0;

	if(SCset){
	  oldto = SCset->timeout - used;
	  SCset->timeout = timeout + used;
	};

	least = 0xffffffff;

	for(host = scsi_hostlist; host; host = host->next) {
	  SCpnt = host->host_queue;
	  while (SCpnt){
	    if (SCpnt->timeout > 0 && (SCpnt->timeout -= used) < least)
	      least = SCpnt->timeout;
	    SCpnt =  SCpnt->next;
	  };
	};

/*
	If something is due to timeout again, then we will set the next timeout 
	interrupt to occur.  Otherwise, timeouts are disabled.
*/
	
	if (least != 0xffffffff)
		{
		time_start = jiffies;	
		timer_table[SCSI_TIMER].expires = (time_elapsed = least) + jiffies;	
		timer_active |= 1 << SCSI_TIMER;
		}
	else
		{
		timer_table[SCSI_TIMER].expires = time_start = time_elapsed = 0;
		timer_active &= ~(1 << SCSI_TIMER);
		}	
	sti();
	return oldto;
	}		


static unsigned short * dma_malloc_freelist = NULL;
static unsigned int dma_sectors = 0;
unsigned int dma_free_sectors = 0;
unsigned int need_isa_buffer = 0;
static unsigned char * dma_malloc_buffer = NULL;

void *scsi_malloc(unsigned int len)
{
  unsigned int nbits, mask;
  int i, j;
  if((len & 0x1ff) || len > 4096)
    panic("Inappropriate buffer size requested");
  
  cli();
  nbits = len >> 9;
  mask = (1 << nbits) - 1;
  
  for(i=0;i < (dma_sectors >> 4); i++)
    for(j=0; j<17-nbits; j++){
      if ((dma_malloc_freelist[i] & (mask << j)) == 0){
	dma_malloc_freelist[i] |= (mask << j);
	sti();
	dma_free_sectors -= nbits;
#ifdef DEBUG
	printk("SMalloc: %d %x ",len, dma_malloc_buffer + (i << 13) + (j << 9));
#endif
	return (void *) ((unsigned long) dma_malloc_buffer + (i << 13) + (j << 9));
      };
    };
  sti();
  return NULL;  /* Nope.  No more */
}

int scsi_free(void *obj, unsigned int len)
{
  int offset;
  int page, sector, nbits, mask;

#ifdef DEBUG
  printk("Sfree %x %d\n",obj, len);
#endif

  offset = ((int) obj) - ((int) dma_malloc_buffer);

  if (offset < 0) panic("Bad offset");
  page = offset >> 13;
  sector = offset >> 9;
  if(sector >= dma_sectors) panic ("Bad page");

  sector = (offset >> 9) & 15;
  nbits = len >> 9;
  mask = (1 << nbits) - 1;

  if ((mask << sector) > 0xffff) panic ("Bad memory alignment");

  cli();
  if(dma_malloc_freelist[page] & (mask << sector) != (mask<<sector))
    panic("Trying to free unused memory");

  dma_free_sectors += nbits;
  dma_malloc_freelist[page] &= ~(mask << sector);
  sti();
  return 0;
}

/*
	scsi_dev_init() is our initialization routine, which inturn calls host 
	initialization, bus scanning, and sd/st initialization routines.  It 
	should be called from main().
*/

unsigned long scsi_dev_init (unsigned long memory_start,unsigned long memory_end)
	{
	int i;
	struct Scsi_Host * host;
	Scsi_Cmnd * SCpnt;
#ifdef FOO_ON_YOU
	return;
#endif	
	timer_table[SCSI_TIMER].fn = scsi_main_timeout;
	timer_table[SCSI_TIMER].expires = 0;

	/* initialize all hosts */
	memory_start = scsi_init(memory_start, memory_end); 
				
	scsi_devices = (Scsi_Device *) memory_start;
        scan_scsis();           /* scan for scsi devices */
	memory_start += NR_SCSI_DEVICES * sizeof(Scsi_Device);

	memory_start = sd_init1(memory_start, memory_end);
        memory_start = st_init1(memory_start, memory_end);
	memory_start = sr_init1(memory_start, memory_end);
	memory_start = sg_init1(memory_start, memory_end);

	last_cmnd = (Scsi_Cmnd *) memory_start;

	SCpnt = last_cmnd;

	for (i=0; i< NR_SCSI_DEVICES; i++) {
	  int j;
	  switch (scsi_devices[i].type)
	    {
	    case TYPE_TAPE :
	      st_attach(&scsi_devices[i]);
	      break;
	    case TYPE_ROM:
	      sr_attach(&scsi_devices[i]);
	      break;
	    case TYPE_DISK:
	    case TYPE_MOD:
	      sd_attach(&scsi_devices[i]);
	    default:
	      break;
	    };
	  sg_attach(&scsi_devices[i]);
	  if(scsi_devices[i].type != -1){
	    for(j=0;j<scsi_devices[i].host->hostt->cmd_per_lun;j++){
	      SCpnt->host = scsi_devices[i].host;
	      SCpnt->target = scsi_devices[i].id;
	      SCpnt->lun = scsi_devices[i].lun;
	      SCpnt->index = i;
	      SCpnt->request.dev = -1; /* Mark not busy */
	      SCpnt->use_sg = 0;
	      SCpnt->old_use_sg = 0;
              SCpnt->underflow = 0;
              SCpnt->transfersize = 0;
	      SCpnt->host_scribble = NULL;
	      host = scsi_devices[i].host;
	      if(host->host_queue)
		host->host_queue->prev = SCpnt;
	      SCpnt->next = host->host_queue;
	      SCpnt->prev = NULL;
	      host->host_queue = SCpnt;
	      SCpnt++;
	    };
	  };
	};

	memory_start = (int) SCpnt;

	if (NR_SD > 0 || NR_SR > 0 || NR_ST > 0)
	  dma_sectors = 16;  /* Base value we use */

	for (i = 0; i < NR_SCSI_DEVICES; ++i) {
	  struct Scsi_Host * host;
	  host = scsi_devices[i].host;
	  
	  if(scsi_devices[i].type != TYPE_TAPE)
	    dma_sectors += ((host->sg_tablesize * 
			     sizeof(struct scatterlist) + 511) >> 9) * 
			       host->hostt->cmd_per_lun;
	  
	  if(host->unchecked_isa_dma &&
	     memory_end > ISA_DMA_THRESHOLD &&
	     scsi_devices[i].type != TYPE_TAPE) {
	    dma_sectors += (PAGE_SIZE >> 9) * host->sg_tablesize *
	      host->hostt->cmd_per_lun;
	    need_isa_buffer++;
	  };
	};

	dma_sectors = (dma_sectors + 15) & 0xfff0;
	dma_free_sectors = dma_sectors;  /* This must be a multiple of 16 */

	memory_start = (memory_start + 3) & 0xfffffffc;
	dma_malloc_freelist = (unsigned short *) memory_start;
	memory_start += dma_sectors >> 3;
	memset(dma_malloc_freelist, 0, dma_sectors >> 3);

	if(memory_start & 1) memory_start++; /* Some host adapters require
						buffers to be word aligned */
	dma_malloc_buffer = (unsigned char *) memory_start;
	memory_start += dma_sectors << 9;

	memory_start = sd_init(memory_start, memory_end); /* init scsi disks */
        memory_start = st_init(memory_start, memory_end); /* init scsi tapes */
	memory_start = sr_init(memory_start, memory_end); /* init scsi CDROMs */
	memory_start = sg_init(memory_start, memory_end); /* init scsi generic */
	
	return memory_start;
	}

static void print_inquiry(unsigned char *data)
{
        int i;

	printk("  Vendor: ");
	for (i = 8; i < 16; i++)
	        {
	        if (data[i] >= 0x20 && i < data[4] + 5)
		        printk("%c", data[i]);
	        else
		        printk(" ");
	        }

	printk("  Model: ");
	for (i = 16; i < 32; i++)
	        {
	        if (data[i] >= 0x20 && i < data[4] + 5)
		        printk("%c", data[i]);
	        else
		        printk(" ");
	        }

	printk("  Rev: ");
	for (i = 32; i < 36; i++)
	        {
	        if (data[i] >= 0x20 && i < data[4] + 5)
		        printk("%c", data[i]);
	        else
		        printk(" ");
	        }

	printk("\n");

	i = data[0] & 0x1f;

	printk("  Type:   %s ",
	       i < MAX_SCSI_DEVICE_CODE ? scsi_device_types[i] : "Unknown          " );
	printk("                 ANSI SCSI revision: %02x", data[2] & 0x07);
	if ((data[2] & 0x07) == 1 && (data[3] & 0x0f) == 1)
	  printk(" CCS\n");
	else
	  printk("\n");
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美大片免费久久精品三p| 欧日韩精品视频| 日韩和欧美一区二区三区| 国产欧美一区二区精品久导航| 欧美一区二区三区公司| 欧美日韩国产综合一区二区三区| 欧美私人免费视频| 欧美色视频在线观看| 欧美视频在线不卡| 欧美放荡的少妇| 欧美一二三在线| 欧美一级二级三级蜜桃| 欧美电影免费观看高清完整版在| 337p亚洲精品色噜噜| 日韩欧美一级片| 久久伊人中文字幕| |精品福利一区二区三区| 亚洲激情在线播放| 香蕉加勒比综合久久| 青青草原综合久久大伊人精品 | 欧美日韩久久一区| 在线播放亚洲一区| 久久久久国产精品厨房| 国产精品久久福利| 亚洲mv在线观看| 国产一区二区在线视频| 91在线观看美女| 欧美日本视频在线| 国产日韩欧美a| 亚洲乱码国产乱码精品精98午夜 | 欧美丰满高潮xxxx喷水动漫| 91精品国产一区二区三区蜜臀| 久久亚洲精精品中文字幕早川悠里| 精品美女一区二区三区| 最近日韩中文字幕| 麻豆国产精品一区二区三区 | 亚洲欧美日韩成人高清在线一区| 亚洲成在人线免费| 国产精品综合网| 在线亚洲免费视频| 久久五月婷婷丁香社区| 一区二区欧美在线观看| 国产在线乱码一区二区三区| 色噜噜狠狠成人中文综合| 日韩一区二区在线播放| 亚洲欧美日韩人成在线播放| 久久精品99国产精品| 91欧美一区二区| 久久久精品一品道一区| 天堂一区二区在线免费观看| 91小视频在线观看| 久久久亚洲综合| 免费国产亚洲视频| 欧美综合一区二区| 中文字幕一区二区视频| 蜜臀91精品一区二区三区| 色综合久久88色综合天天| 久久精品在这里| 日本aⅴ精品一区二区三区| 色婷婷久久综合| 国产精品久久久久aaaa樱花| 精品一二三四区| 在线播放国产精品二区一二区四区| 1区2区3区国产精品| 国产.欧美.日韩| 国产视频亚洲色图| 韩国精品久久久| 精品不卡在线视频| 捆绑变态av一区二区三区| 7777精品伊人久久久大香线蕉最新版 | 日本韩国欧美三级| 国产精品精品国产色婷婷| 国产自产高清不卡| 精品日本一线二线三线不卡| 麻豆一区二区三| 日韩一区二区视频| 狠狠色丁香婷婷综合| 欧美mv和日韩mv的网站| 精品一区二区三区欧美| 精品国产91九色蝌蚪| 精品在线一区二区三区| 精品国产一区二区国模嫣然| 精品一区二区三区不卡 | av激情成人网| 亚洲色图另类专区| 精品视频色一区| 天天综合天天综合色| 欧美一卡二卡在线观看| 国产在线一区观看| 国产精品麻豆一区二区| 色综合久久久久| 亚洲第一久久影院| 欧美一区二区精品久久911| 蜜桃久久精品一区二区| 欧美精品一区二区三区在线播放 | 中文字幕在线观看一区| 色婷婷国产精品久久包臀| 亚洲国产cao| 精品福利一区二区三区免费视频| 韩国在线一区二区| 亚洲婷婷在线视频| 欧美高清视频一二三区 | 91成人在线观看喷潮| 午夜精品福利一区二区三区av| 日韩精品一区二区三区中文不卡 | 精品国产乱码久久久久久蜜臀| 国产一区二区三区观看| 亚洲视频1区2区| 91精品国产综合久久国产大片| 国产精品羞羞答答xxdd| 亚洲一区在线看| 精品国产区一区| 色婷婷综合激情| 久久福利视频一区二区| 亚洲免费大片在线观看| 日韩精品一区二区三区四区 | 日韩欧美亚洲国产另类| 风间由美性色一区二区三区| 一区二区久久久久| 久久综合狠狠综合| 欧美日韩一区二区三区不卡 | 亚洲欧美视频在线观看视频| 欧美一区二区三区系列电影| 99精品一区二区三区| 久草在线在线精品观看| 曰韩精品一区二区| 欧美韩国一区二区| 欧美精品 日韩| 色婷婷国产精品综合在线观看| 激情图片小说一区| 亚洲图片欧美色图| 中文字幕日韩精品一区| 欧美电影免费观看高清完整版在 | 91精品久久久久久久91蜜桃| 福利一区二区在线观看| 日韩精品一二区| 亚洲激情图片一区| 中文字幕不卡在线播放| 在线电影国产精品| 日本黄色一区二区| 99国产精品国产精品毛片| 国产麻豆日韩欧美久久| 久久国产精品无码网站| 亚洲福利视频导航| 亚洲精品你懂的| 综合分类小说区另类春色亚洲小说欧美 | 99久久精品免费看国产| 国产一区二区三区电影在线观看| 偷拍与自拍一区| 五月天久久比比资源色| 亚洲精品成人精品456| 一区二区三区资源| 樱桃视频在线观看一区| 一区二区成人在线| 亚洲免费观看高清完整 | 91精品视频网| 欧美一区二区三区精品| 欧美日韩dvd在线观看| 欧美日韩国产大片| 欧美日韩另类国产亚洲欧美一级| 在线观看www91| 欧美日韩国产系列| 91精品午夜视频| 欧美videos大乳护士334| 日韩免费视频一区二区| 欧美mv和日韩mv的网站| 久久久久国产免费免费| 国产精品国产三级国产普通话三级 | 国产精品一区二区在线观看不卡 | 777奇米成人网| 欧美一区二区观看视频| 精品少妇一区二区三区日产乱码 | 亚洲精品成人在线| 亚洲国产精品久久久久婷婷884| 亚洲成a人片在线观看中文| 奇米精品一区二区三区四区 | 中文字幕av一区二区三区| 国产精品麻豆一区二区| 一区二区三区四区激情| 日韩vs国产vs欧美| 经典一区二区三区| 不卡电影免费在线播放一区| 在线免费亚洲电影| 欧美一区二区二区| 国产精品色呦呦| 调教+趴+乳夹+国产+精品| 国产精品影视在线| 欧美日韩国产片| 日本一区二区三区四区在线视频 | 国产福利91精品一区二区三区| fc2成人免费人成在线观看播放| 91女厕偷拍女厕偷拍高清| 欧美一卡二卡在线| 亚洲品质自拍视频网站| 久久成人免费网| 在线视频国内一区二区| 久久久久免费观看| 亚洲午夜视频在线| 国产一区二区伦理| 欧美精品久久久久久久久老牛影院|