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

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

?? sr.c

?? linux 1.0 源代碼
?? C
?? 第 1 頁 / 共 2 頁
字號:
		tries = 2;		goto repeat;		}	if (scsi_CDs[dev].device->changed)	        {/*  * quietly refuse to do anything to a changed disc until the changed bit has been reset */		/* printk("CD-ROM has been changed.  Prohibiting further I/O.\n");	*/		end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);		tries = 2;		goto repeat;		}		switch (SCpnt->request.cmd)		{		case WRITE: 					end_scsi_request(SCpnt, 0, SCpnt->request.nr_sectors);			goto repeat;			break;		case READ : 		        cmd[0] = READ_6;			break;		default : 			panic ("Unknown sr command %d\n", SCpnt->request.cmd);		}		cmd[1] = (SCpnt->lun << 5) & 0xe0;/*           Now do the grungy work of figuring out which sectors we need, and	   where in memory we are going to put them.	   The variables we need are:	   this_count= number of 512 byte sectors being read 	   block     = starting cdrom sector to read.	   realcount = # of cdrom sectors to read	   The major difference between a scsi disk and a scsi cdromis that we will always use scatter-gather if we can, because we canwork around the fact that the buffer cache has a block size of 1024,and we have 2048 byte sectors.  This code should work for buffers thatare any multiple of 512 bytes long.  */	SCpnt->use_sg = 0;	if (SCpnt->host->sg_tablesize > 0 &&	    (!need_isa_buffer ||	    dma_free_sectors >= 10)) {	  struct buffer_head * bh;	  struct scatterlist * sgpnt;	  int count, this_count_max;	  bh = SCpnt->request.bh;	  this_count = 0;	  count = 0;	  this_count_max = (scsi_CDs[dev].ten ? 0xffff : 0xff) << 4;	  /* Calculate how many links we can use.  First see if we need	   a padding record at the start */	  this_count = SCpnt->request.sector % 4;	  if(this_count) count++;	  while(bh && count < SCpnt->host->sg_tablesize) {	    if ((this_count + (bh->b_size >> 9)) > this_count_max) break;	    this_count += (bh->b_size >> 9);	    count++;	    bh = bh->b_reqnext;	  };	  /* Fix up in case of an odd record at the end */	  end_rec = 0;	  if(this_count % 4) {	    if (count < SCpnt->host->sg_tablesize) {	      count++;	      end_rec = (4 - (this_count % 4)) << 9;	      this_count += 4 - (this_count % 4);	    } else {	      count--;	      this_count -= (this_count % 4);	    };	  };	  SCpnt->use_sg = count;  /* Number of chains */	  count = 512;/* scsi_malloc can only allocate in chunks of 512 bytes*/	  while( count < (SCpnt->use_sg * sizeof(struct scatterlist))) 	    count = count << 1;	  SCpnt->sglist_len = count;	  sgpnt = (struct scatterlist * ) scsi_malloc(count);	  if (!sgpnt) {	    printk("Warning - running *really* short on DMA buffers\n");	    SCpnt->use_sg = 0;  /* No memory left - bail out */	  } else {	    buffer = (unsigned char *) sgpnt;	    count = 0;	    bh = SCpnt->request.bh;	    if(SCpnt->request.sector % 4) {	      sgpnt[count].length = (SCpnt->request.sector % 4) << 9;	      sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length);	      if(!sgpnt[count].address) panic("SCSI DMA pool exhausted.");	      sgpnt[count].alt_address = sgpnt[count].address; /* Flag to delete								  if needed */	      count++;	    };	    for(bh = SCpnt->request.bh; count < SCpnt->use_sg; 		count++, bh = bh->b_reqnext) {	      if (bh) { /* Need a placeholder at the end of the record? */		sgpnt[count].address = bh->b_data;		sgpnt[count].length = bh->b_size;		sgpnt[count].alt_address = NULL;	      } else {		sgpnt[count].address = (char *) scsi_malloc(end_rec);		if(!sgpnt[count].address) panic("SCSI DMA pool exhausted.");		sgpnt[count].length = end_rec;		sgpnt[count].alt_address = sgpnt[count].address;		if (count+1 != SCpnt->use_sg) panic("Bad sr request list");		break;	      };	      if (((int) sgpnt[count].address) + sgpnt[count].length > 		  ISA_DMA_THRESHOLD & (SCpnt->host->unchecked_isa_dma)) {		sgpnt[count].alt_address = sgpnt[count].address;		/* We try and avoid exhausting the DMA pool, since it is easier		   to control usage here.  In other places we might have a more		   pressing need, and we would be screwed if we ran out */		if(dma_free_sectors < (sgpnt[count].length >> 9) + 5) {		  sgpnt[count].address = NULL;		} else {		  sgpnt[count].address = (char *) scsi_malloc(sgpnt[count].length);		};/* If we start running low on DMA buffers, we abort the scatter-gather   operation, and free all of the memory we have allocated.  We want to   ensure that all scsi operations are able to do at least a non-scatter/gather   operation */		if(sgpnt[count].address == NULL){ /* Out of dma memory */		  printk("Warning: Running low on SCSI DMA buffers");		  /* Try switching back to a non scatter-gather operation. */		  while(--count >= 0){		    if(sgpnt[count].alt_address) 		      scsi_free(sgpnt[count].address, sgpnt[count].length);		  };		  SCpnt->use_sg = 0;		  scsi_free(buffer, SCpnt->sglist_len);		  break;		}; /* if address == NULL */	      };  /* if need DMA fixup */	    };  /* for loop to fill list */#ifdef DEBUG	    printk("SG: %d %d %d %d %d *** ",SCpnt->use_sg, SCpnt->request.sector,		   this_count, 		   SCpnt->request.current_nr_sectors,		   SCpnt->request.nr_sectors);	    for(count=0; count<SCpnt->use_sg; count++)	      printk("SGlist: %d %x %x %x\n", count,		     sgpnt[count].address, 		     sgpnt[count].alt_address, 		     sgpnt[count].length);#endif	  };  /* Able to allocate scatter-gather list */	};		if (SCpnt->use_sg == 0){	  /* We cannot use scatter-gather.  Do this the old fashion way */	  if (!SCpnt->request.bh)  		    this_count = SCpnt->request.nr_sectors;	  else	    this_count = (SCpnt->request.bh->b_size >> 9);	  	  start = block % 4;	  if (start)	    {				  	      this_count = ((this_count > 4 - start) ? 			    (4 - start) : (this_count));	      buffer = (unsigned char *) scsi_malloc(2048);	    } 	  else if (this_count < 4)	    {	      buffer = (unsigned char *) scsi_malloc(2048);	    }	  else	    {	      this_count -= this_count % 4;	      buffer = (unsigned char *) SCpnt->request.buffer;	      if (((int) buffer) + (this_count << 9) > ISA_DMA_THRESHOLD & 		  (SCpnt->host->unchecked_isa_dma))		buffer = (unsigned char *) scsi_malloc(this_count << 9);	    }	};	if (scsi_CDs[dev].sector_size == 2048)	  block = block >> 2; /* These are the sectors that the cdrom uses */	else	  block = block & 0xfffffffc;	realcount = (this_count + 3) / 4;	if (scsi_CDs[dev].sector_size == 512) realcount = realcount << 2;	if (((realcount > 0xff) || (block > 0x1fffff)) && scsi_CDs[dev].ten) 		{		if (realcount > 0xffff)		        {			realcount = 0xffff;			this_count = realcount * (scsi_CDs[dev].sector_size >> 9);			}		cmd[0] += READ_10 - READ_6 ;		cmd[2] = (unsigned char) (block >> 24) & 0xff;		cmd[3] = (unsigned char) (block >> 16) & 0xff;		cmd[4] = (unsigned char) (block >> 8) & 0xff;		cmd[5] = (unsigned char) block & 0xff;		cmd[6] = cmd[9] = 0;		cmd[7] = (unsigned char) (realcount >> 8) & 0xff;		cmd[8] = (unsigned char) realcount & 0xff;		}	else		{		if (realcount > 0xff)		        {			realcount = 0xff;			this_count = realcount * (scsi_CDs[dev].sector_size >> 9);		        }			cmd[1] |= (unsigned char) ((block >> 16) & 0x1f);		cmd[2] = (unsigned char) ((block >> 8) & 0xff);		cmd[3] = (unsigned char) block & 0xff;		cmd[4] = (unsigned char) realcount;		cmd[5] = 0;		}   #ifdef DEBUG{ 	int i;	printk("ReadCD: %d %d %d %d\n",block, realcount, buffer, this_count);	printk("Use sg: %d\n", SCpnt->use_sg);	printk("Dumping command: ");	for(i=0; i<12; i++) printk("%2.2x ", cmd[i]);	printk("\n");};#endif	SCpnt->this_count = this_count;	scsi_do_cmd (SCpnt, (void *) cmd, buffer, 		     realcount * scsi_CDs[dev].sector_size, 		     rw_intr, SR_TIMEOUT, MAX_RETRIES);}unsigned long sr_init1(unsigned long mem_start, unsigned long mem_end){  scsi_CDs = (Scsi_CD *) mem_start;  mem_start += MAX_SR * sizeof(Scsi_CD);  return mem_start;};void sr_attach(Scsi_Device * SDp){  scsi_CDs[NR_SR++].device = SDp;  if(NR_SR > MAX_SR) panic ("scsi_devices corrupt (sr)");};static void sr_init_done (Scsi_Cmnd * SCpnt){  struct request * req;  struct task_struct * p;    req = &SCpnt->request;  req->dev = 0xfffe; /* Busy, but indicate request done */    if ((p = req->waiting) != NULL) {    req->waiting = NULL;    p->state = TASK_RUNNING;    if (p->counter > current->counter)      need_resched = 1;  }}static void get_sectorsize(int i){  unsigned char cmd[10];  unsigned char buffer[513];  int the_result, retries;  Scsi_Cmnd * SCpnt;    SCpnt = allocate_device(NULL, scsi_CDs[i].device->index, 1);  retries = 3;  do {    cmd[0] = READ_CAPACITY;    cmd[1] = (scsi_CDs[i].device->lun << 5) & 0xe0;    memset ((void *) &cmd[2], 0, 8);    SCpnt->request.dev = 0xffff;  /* Mark as really busy */        memset(buffer, 0, 8);    scsi_do_cmd (SCpnt,		 (void *) cmd, (void *) buffer,		 512, sr_init_done,  SR_TIMEOUT,		 MAX_RETRIES);        if (current == task[0])      while(SCpnt->request.dev != 0xfffe);    else      if (SCpnt->request.dev != 0xfffe){	SCpnt->request.waiting = current;	current->state = TASK_UNINTERRUPTIBLE;	while (SCpnt->request.dev != 0xfffe) schedule();      };        the_result = SCpnt->result;    retries--;      } while(the_result && retries);    SCpnt->request.dev = -1;  /* Mark as not busy */    wake_up(&scsi_devices[SCpnt->index].device_wait);   if (the_result) {    scsi_CDs[i].capacity = 0x1fffff;    scsi_CDs[i].sector_size = 2048;  /* A guess, just in case */    scsi_CDs[i].needs_sector_size = 1;  } else {    scsi_CDs[i].capacity = (buffer[0] << 24) |      (buffer[1] << 16) | (buffer[2] << 8) | buffer[3];    scsi_CDs[i].sector_size = (buffer[4] << 24) |      (buffer[5] << 16) | (buffer[6] << 8) | buffer[7];    if(scsi_CDs[i].sector_size == 0) scsi_CDs[i].sector_size = 2048;    if(scsi_CDs[i].sector_size != 2048 &&        scsi_CDs[i].sector_size != 512) {      printk ("scd%d : unsupported sector size %d.\n",	      i, scsi_CDs[i].sector_size);      scsi_CDs[i].capacity = 0;      scsi_CDs[i].needs_sector_size = 1;    };    if(scsi_CDs[i].sector_size == 2048)      scsi_CDs[i].capacity *= 4;    scsi_CDs[i].needs_sector_size = 0;  };}unsigned long sr_init(unsigned long memory_start, unsigned long memory_end){	int i;	if (register_blkdev(MAJOR_NR,"sr",&sr_fops)) {		printk("Unable to get major %d for SCSI-CD\n",MAJOR_NR);		return memory_start;	}	if(MAX_SR == 0) return memory_start;	sr_sizes = (int *) memory_start;	memory_start += MAX_SR * sizeof(int);	memset(sr_sizes, 0, MAX_SR * sizeof(int));	sr_blocksizes = (int *) memory_start;	memory_start += MAX_SR * sizeof(int);	for(i=0;i<MAX_SR;i++) sr_blocksizes[i] = 2048;	blksize_size[MAJOR_NR] = sr_blocksizes;	for (i = 0; i < NR_SR; ++i)		{		  get_sectorsize(i);		  printk("Scd sectorsize = %d bytes\n", scsi_CDs[i].sector_size);		  scsi_CDs[i].use = 1;		  scsi_CDs[i].ten = 1;		  scsi_CDs[i].remap = 1;		  sr_sizes[i] = scsi_CDs[i].capacity;		}	blk_dev[MAJOR_NR].request_fn = DEVICE_REQUEST;	blk_size[MAJOR_NR] = sr_sizes;		/* If our host adapter is capable of scatter-gather, then we increase	   the read-ahead to 16 blocks (32 sectors).  If not, we use	   a two block (4 sector) read ahead. */	if(scsi_CDs[0].device->host->sg_tablesize)	  read_ahead[MAJOR_NR] = 32;  /* 32 sector read-ahead.  Always removable. */	else	  read_ahead[MAJOR_NR] = 4;  /* 4 sector read-ahead */	return memory_start;}	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日免费三级在线| 亚洲一区二区三区自拍| 亚洲精品乱码久久久久久黑人 | 亚洲视频综合在线| 热久久免费视频| 91亚洲精华国产精华精华液| 日韩免费观看高清完整版 | 看片网站欧美日韩| 色婷婷综合久久久| 国产亚洲一区字幕| 国产自产2019最新不卡| 欧美精品日日鲁夜夜添| 亚洲精品久久久蜜桃| 懂色av噜噜一区二区三区av | 色呦呦国产精品| 国产精品久久久久久久久搜平片| 久久国产精品99精品国产| 欧美日韩亚洲另类| 亚洲一区在线观看免费| 色婷婷久久一区二区三区麻豆| 国产精品久久久久久久久久免费看| 国产一区二区三区免费看| 日韩欧美综合一区| 日韩av高清在线观看| 91精品福利在线一区二区三区| 亚洲图片欧美色图| 国产亚洲va综合人人澡精品| 三级精品在线观看| 制服丝袜亚洲播放| 日韩激情在线观看| 日韩一区二区三区视频在线观看| 午夜精品在线看| 欧美日韩黄色影视| 日本视频在线一区| 欧美成人精品高清在线播放| 美女视频一区在线观看| 精品处破学生在线二十三| 狠狠色丁香九九婷婷综合五月| 精品美女被调教视频大全网站| 国产一区二区三区免费看| 国产日韩欧美在线一区| 99久久精品国产一区二区三区| 亚洲欧美国产三级| 欧美日韩国产高清一区二区三区| 日韩在线a电影| 日韩精品在线一区二区| 成人综合在线观看| 亚洲欧美色图小说| 精品视频一区三区九区| 秋霞电影网一区二区| 精品盗摄一区二区三区| 99v久久综合狠狠综合久久| 亚洲宅男天堂在线观看无病毒| 欧美一区二区观看视频| 国产不卡免费视频| 亚洲激情第一区| 欧美一卡在线观看| 成人三级伦理片| 亚洲成人免费在线观看| 久久综合av免费| 色婷婷亚洲婷婷| 久久se这里有精品| 亚洲你懂的在线视频| 91精品国产欧美一区二区成人| 国内外成人在线视频| 亚洲乱码国产乱码精品精98午夜 | 午夜精品福利一区二区蜜股av | 亚洲欧美国产三级| 日韩久久免费av| 99精品视频在线免费观看| 日本美女视频一区二区| 国产精品短视频| 91精品国产麻豆国产自产在线| 国产99久久久精品| 日韩和欧美的一区| 亚洲天堂久久久久久久| 日韩欧美三级在线| 欧美无人高清视频在线观看| 国产成人综合亚洲网站| 三级亚洲高清视频| 亚洲综合在线电影| 国产日韩亚洲欧美综合| 91精品国产免费| 欧美午夜在线一二页| 成人高清视频免费观看| 久久成人久久鬼色| 偷拍与自拍一区| 亚洲综合色区另类av| 中文字幕在线播放不卡一区| 日韩欧美国产一区在线观看| 在线观看一区二区视频| av亚洲精华国产精华| 中文字幕色av一区二区三区| 日韩欧美一区二区久久婷婷| 在线观看免费亚洲| 91免费观看视频| 国产福利精品一区二区| 蜜臀av性久久久久蜜臀av麻豆| 亚洲国产一二三| 亚洲欧美一区二区三区国产精品| 国产精品久久久久久久久搜平片| 久久久国际精品| 久久久99精品免费观看| 日韩精品一区国产麻豆| 在线综合+亚洲+欧美中文字幕| 精品视频在线视频| 欧美系列日韩一区| 欧美日韩成人在线一区| 欧美日韩精品三区| 欧美精品一卡两卡| 欧美日韩国产美| 欧美一级日韩不卡播放免费| 欧美人狂配大交3d怪物一区| 在线成人午夜影院| 91精品国产综合久久精品麻豆 | 欧美日韩国产影片| 欧美日韩亚洲综合一区| 777午夜精品免费视频| 欧美三级电影网| 日韩欧美中文字幕制服| 欧美videossexotv100| 精品嫩草影院久久| 国产调教视频一区| 亚洲男人电影天堂| 亚洲一区中文日韩| 免费不卡在线观看| 国产精品一区二区免费不卡 | 欧美一区二区三区思思人| 日韩一级二级三级| 久久午夜电影网| 国产精品日韩成人| 亚洲综合色噜噜狠狠| 免费成人av在线| 国产凹凸在线观看一区二区| 99久久久久免费精品国产| 在线欧美日韩精品| 日韩精品一区在线观看| 国产精品视频一二三| 一区二区三区成人| 美女视频黄久久| 91影视在线播放| 欧美一区二区三区四区在线观看| 欧美精品一区二区三区久久久| 国产精品久久99| 日本美女一区二区三区视频| 成人涩涩免费视频| 91精品国产高清一区二区三区蜜臀| 久久综合九色欧美综合狠狠| 亚洲老妇xxxxxx| 精品一区中文字幕| 色综合久久久久网| 久久久久久夜精品精品免费| 樱花草国产18久久久久| 久久精品理论片| 色菇凉天天综合网| 欧美电视剧在线看免费| 亚洲精品网站在线观看| 激情综合五月婷婷| 欧美综合在线视频| 亚洲国产高清在线| 久久99热狠狠色一区二区| 一本色道久久综合精品竹菊| 精品日韩欧美在线| 亚洲国产精品久久一线不卡| 丰满放荡岳乱妇91ww| 欧美一区二区三区思思人| 亚洲精品国产精品乱码不99| 国产精品一区二区久久精品爱涩| 8x8x8国产精品| 亚洲精品视频一区二区| 成人一区二区三区在线观看| 欧美一级黄色大片| 天天综合色天天综合色h| 97久久精品人人澡人人爽| 久久精品亚洲精品国产欧美| 日韩二区在线观看| 欧美专区日韩专区| 亚洲女同女同女同女同女同69| 韩国在线一区二区| 精品久久久久久无| 日本成人中文字幕在线视频| 欧美日韩精品欧美日韩精品一 | 7777精品伊人久久久大香线蕉经典版下载 | 在线亚洲免费视频| 自拍av一区二区三区| 福利一区二区在线观看| 久久久不卡网国产精品一区| 看电视剧不卡顿的网站| 日韩一二在线观看| 青青青伊人色综合久久| 6080日韩午夜伦伦午夜伦| 亚洲成人福利片| 欧美在线观看一二区| 亚洲一区电影777| 色婷婷综合久色| 一区二区三区国产精品| 91久久精品一区二区三| 一区二区三区不卡视频| 色噜噜狠狠色综合欧洲selulu| 一区二区三区在线免费播放 |