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

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

?? sr.c

?? <Linux1.0核心游記>電子書+書后源碼+Linux1.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一区二区三区免费野_久草精品视频
懂色av一区二区三区免费观看 | 精品一区二区三区在线播放视频| 91视视频在线观看入口直接观看www | 欧美国产精品久久| 韩国视频一区二区| 久久综合九色综合欧美98| 韩国中文字幕2020精品| 国产日韩综合av| 国产.欧美.日韩| 中文字幕佐山爱一区二区免费| av一区二区三区在线| 一区二区三区免费在线观看| 一本久久a久久精品亚洲| 一区二区三区在线视频观看| 欧美视频第二页| 美腿丝袜亚洲色图| 久久亚洲春色中文字幕久久久| 国产成人在线网站| 日韩理论片中文av| 欧美吞精做爰啪啪高潮| 欧美aa在线视频| 国产校园另类小说区| 91尤物视频在线观看| 亚洲成人在线观看视频| 日韩欧美一级二级三级久久久| 国产精品一区2区| 一区二区在线观看视频| 日韩欧美中文字幕公布| 成人18视频在线播放| 亚洲国产精品久久不卡毛片| 精品电影一区二区| 97精品久久久久中文字幕| 亚洲国产精品影院| 久久久国际精品| 欧美日韩在线播| 国产一区二区不卡| 亚洲午夜电影网| 国产欧美日韩在线看| 欧美日韩精品电影| 成人性生交大片免费看视频在线| 亚洲成人av在线电影| 国产农村妇女精品| 欧美一区日本一区韩国一区| 粉嫩蜜臀av国产精品网站| 天天综合天天做天天综合| ...xxx性欧美| 久久色在线观看| 3d成人h动漫网站入口| 99免费精品视频| 狠狠色综合日日| 亚洲电影一级黄| 国产精品久久久久久久浪潮网站 | 欧美精品一区男女天堂| 全国精品久久少妇| 国产精品系列在线| 欧美精品少妇一区二区三区| 国产精品77777| 日本伊人色综合网| 亚洲视频在线观看一区| 日韩视频一区二区三区在线播放 | 五月天一区二区三区| 久久久国产精品麻豆| 在线日韩国产精品| 国产电影精品久久禁18| 午夜激情一区二区| 亚洲天堂精品在线观看| 精品美女在线播放| 欧美日韩精品一区二区三区| 波多野结衣中文字幕一区二区三区| 视频一区在线播放| 日韩理论片一区二区| 国产欧美日韩久久| 欧美成人乱码一区二区三区| 欧美日韩中文一区| 99在线精品一区二区三区| 狠狠色丁香久久婷婷综合丁香| 亚洲黄色录像片| 国产精品美女视频| 337p粉嫩大胆噜噜噜噜噜91av| 欧美亚洲一区二区在线| 蜜桃av一区二区在线观看| 亚洲自拍与偷拍| 国产精品美女久久久久久| 精品sm捆绑视频| 欧美精品亚洲二区| 欧美日韩精品一区二区三区蜜桃 | 欧美成人三级在线| 制服丝袜日韩国产| 成人中文字幕在线| 岛国精品在线播放| 国产.欧美.日韩| 成人性色生活片免费看爆迷你毛片| 国内精品国产成人| 国产真实乱对白精彩久久| 日韩电影免费在线观看网站| 亚洲成av人在线观看| 亚洲一区二区四区蜜桃| 亚洲精品国产无天堂网2021 | 天堂影院一区二区| 亚洲专区一二三| 亚洲一区二区三区中文字幕在线| 亚洲人成在线播放网站岛国 | 欧美mv日韩mv| 91精品婷婷国产综合久久性色 | 亚洲综合图片区| 一区二区三区在线高清| 一区二区三区视频在线观看| 亚洲综合免费观看高清完整版| 亚洲欧美日韩国产手机在线| 亚洲视频一二三区| 亚洲激情图片小说视频| 亚洲大片一区二区三区| 免费观看一级欧美片| 日本女优在线视频一区二区| 青青草原综合久久大伊人精品 | 精品视频一区二区三区免费| 91九色02白丝porn| 精品视频1区2区| 欧美一卡二卡三卡| 亚洲精品一区二区在线观看| 2024国产精品| 亚洲色图另类专区| 免费视频最近日韩| 粉嫩aⅴ一区二区三区四区| 91社区在线播放| 欧美日韩一区二区三区在线| 欧美一区二区三区四区在线观看| 精品国一区二区三区| 国产精品美女久久久久久久网站| 一区二区三区小说| 免费国产亚洲视频| 不卡免费追剧大全电视剧网站| av资源网一区| 在线观看欧美黄色| 久久婷婷综合激情| 一区二区三区在线免费观看| 理论片日本一区| 97超碰欧美中文字幕| 日韩三区在线观看| 欧美国产综合色视频| 蜜桃一区二区三区在线观看| 成人性生交大片免费看在线播放 | 国产成人免费视频精品含羞草妖精 | 色综合久久综合网97色综合| 欧美人与禽zozo性伦| 欧美国产日韩在线观看| 天天综合色天天| 成人久久久精品乱码一区二区三区 | 国产午夜亚洲精品理论片色戒| 1区2区3区国产精品| 蜜桃视频第一区免费观看| 99热在这里有精品免费| 欧美mv日韩mv| 亚洲成人动漫av| 99精品1区2区| 国产欧美日韩在线视频| 美国三级日本三级久久99| 在线观看国产一区二区| 亚洲国产精品成人久久综合一区| 亚洲一区中文日韩| 成人久久18免费网站麻豆| 日韩午夜激情视频| 午夜一区二区三区视频| 97se亚洲国产综合自在线| 精品久久五月天| 五月婷婷综合网| 99视频一区二区三区| 久久久久久久一区| 久久精品国产99| 欧美日韩小视频| 亚洲精品视频在线观看网站| 美女在线观看视频一区二区| 91精品国产综合久久久久| 一区二区三区在线观看欧美| 成人免费视频app| 亚洲国产精品精华液2区45| 精品亚洲国内自在自线福利| 欧美丰满少妇xxxbbb| 亚洲免费av在线| 色综合天天性综合| 中文字幕中文在线不卡住| 国产精品一二三区在线| 91精品欧美一区二区三区综合在| ㊣最新国产の精品bt伙计久久| 美美哒免费高清在线观看视频一区二区 | 国内精品国产成人| 精品少妇一区二区三区日产乱码 | 午夜a成v人精品| 欧美视频第二页| 亚洲chinese男男1069| 在线观看免费亚洲| 亚洲综合区在线| 91久久香蕉国产日韩欧美9色| 亚洲一级二级在线| 欧美在线观看你懂的| 一区二区三区国产精品| 在线观看国产一区二区| 午夜精彩视频在线观看不卡| 欧美日韩性生活| 美女网站在线免费欧美精品|