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

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

?? ide-cd.c

?? linux和2410結合開發 用他可以生成2410所需的zImage文件
?? C
?? 第 1 頁 / 共 5 頁
字號:
/* Fix up a possibly partially-processed request so that we can   start it over entirely, or even put it back on the request queue. */static void restore_request (struct request *rq){	if (rq->buffer != rq->bh->b_data) {		int n = (rq->buffer - rq->bh->b_data) / SECTOR_SIZE;		rq->buffer = rq->bh->b_data;		rq->nr_sectors += n;		rq->sector -= n;	}	rq->current_nr_sectors = rq->bh->b_size >> SECTOR_BITS;	rq->hard_nr_sectors = rq->nr_sectors;	rq->hard_sector = rq->sector;}/* * Start a read request from the CD-ROM. */static ide_startstop_t cdrom_start_read (ide_drive_t *drive, unsigned int block){	struct cdrom_info *info = drive->driver_data;	struct request *rq = HWGROUP(drive)->rq;	int minor = MINOR (rq->rq_dev);	/* If the request is relative to a partition, fix it up to refer to the	   absolute address.  */	if (minor & PARTN_MASK) {		rq->sector = block;		minor &= ~PARTN_MASK;		rq->rq_dev = MKDEV(MAJOR(rq->rq_dev), minor);	}	/* We may be retrying this request after an error.  Fix up	   any weirdness which might be present in the request packet. */	restore_request(rq);	/* Satisfy whatever we can of this request from our cached sector. */	if (cdrom_read_from_buffer(drive))		return ide_stopped;	cdrom_attempt_remerge(drive, rq);	/* Clear the local sector buffer. */	info->nsectors_buffered = 0;	/* use dma, if possible. */	if (drive->using_dma && (rq->sector % SECTORS_PER_FRAME == 0) &&				(rq->nr_sectors % SECTORS_PER_FRAME == 0))		info->dma = 1;	else		info->dma = 0;	info->cmd = READ;	/* Start sending the read request to the drive. */	return cdrom_start_packet_command(drive, 32768, cdrom_start_read_continuation);}/**************************************************************************** * Execute all other packet commands. *//* Forward declarations. */static int cdrom_lockdoor(ide_drive_t *drive, int lockflag,			  struct request_sense *sense);/* Interrupt routine for packet command completion. */static ide_startstop_t cdrom_pc_intr (ide_drive_t *drive){	int ireason, len, stat, thislen;	struct request *rq = HWGROUP(drive)->rq;	struct packet_command *pc = (struct packet_command *)rq->buffer;	ide_startstop_t startstop;	/* Check for errors. */	if (cdrom_decode_status (&startstop, drive, 0, &stat))		return startstop;	/* Read the interrupt reason and the transfer length. */	ireason = IN_BYTE (IDE_NSECTOR_REG);	len = IN_BYTE (IDE_LCYL_REG) + 256 * IN_BYTE (IDE_HCYL_REG);	/* If DRQ is clear, the command has completed.	   Complain if we still have data left to transfer. */	if ((stat & DRQ_STAT) == 0) {		/* Some of the trailing request sense fields are optional, and		   some drives don't send them.  Sigh. */		if (pc->c[0] == GPCMD_REQUEST_SENSE &&		    pc->buflen > 0 &&		    pc->buflen <= 5) {			while (pc->buflen > 0) {				*pc->buffer++ = 0;				--pc->buflen;			}		}		if (pc->buflen == 0)			cdrom_end_request (1, drive);		else {			/* Comment this out, because this always happens 			   right after a reset occurs, and it is annoying to 			   always print expected stuff.  */			/*			printk ("%s: cdrom_pc_intr: data underrun %d\n",				drive->name, pc->buflen);			*/			pc->stat = 1;			cdrom_end_request (1, drive);		}		return ide_stopped;	}	/* Figure out how much data to transfer. */	thislen = pc->buflen;	if (thislen > len) thislen = len;	/* The drive wants to be written to. */	if ((ireason & 3) == 0) {		/* Transfer the data. */		atapi_output_bytes (drive, pc->buffer, thislen);		/* If we haven't moved enough data to satisfy the drive,		   add some padding. */		while (len > thislen) {			int dum = 0;			atapi_output_bytes (drive, &dum, sizeof (dum));			len -= sizeof (dum);		}		/* Keep count of how much data we've moved. */		pc->buffer += thislen;		pc->buflen -= thislen;	}	/* Same drill for reading. */	else if ((ireason & 3) == 2) {		/* Transfer the data. */		atapi_input_bytes (drive, pc->buffer, thislen);		/* If we haven't moved enough data to satisfy the drive,		   add some padding. */		while (len > thislen) {			int dum = 0;			atapi_input_bytes (drive, &dum, sizeof (dum));			len -= sizeof (dum);		}		/* Keep count of how much data we've moved. */		pc->buffer += thislen;		pc->buflen -= thislen;	} else {		printk ("%s: cdrom_pc_intr: The drive "			"appears confused (ireason = 0x%2x)\n",			drive->name, ireason);		pc->stat = 1;	}	/* Now we wait for another interrupt. */	ide_set_handler (drive, &cdrom_pc_intr, WAIT_CMD, cdrom_timer_expiry);	return ide_started;}static ide_startstop_t cdrom_do_pc_continuation (ide_drive_t *drive){	struct request *rq = HWGROUP(drive)->rq;	struct packet_command *pc = (struct packet_command *)rq->buffer;	if (!pc->timeout)		pc->timeout = WAIT_CMD;	/* Send the command to the drive and return. */	return cdrom_transfer_packet_command(drive, pc, &cdrom_pc_intr);}static ide_startstop_t cdrom_do_packet_command (ide_drive_t *drive){	int len;	struct request *rq = HWGROUP(drive)->rq;	struct packet_command *pc = (struct packet_command *)rq->buffer;	struct cdrom_info *info = drive->driver_data;	info->dma = 0;	info->cmd = 0;	pc->stat = 0;	len = pc->buflen;	/* Start sending the command to the drive. */	return cdrom_start_packet_command (drive, len, cdrom_do_pc_continuation);}/* Sleep for TIME jiffies.   Not to be called from an interrupt handler. */staticvoid cdrom_sleep (int time){	int sleep = time;	do {		set_current_state(TASK_INTERRUPTIBLE);		sleep = schedule_timeout(sleep);	} while (sleep);}staticint cdrom_queue_packet_command(ide_drive_t *drive, struct packet_command *pc){	struct request_sense sense;	struct request req;	int retries = 10;	if (pc->sense == NULL)		pc->sense = &sense;	/* Start of retry loop. */	do {		ide_init_drive_cmd (&req);		req.cmd = PACKET_COMMAND;		req.buffer = (char *)pc;		ide_do_drive_cmd (drive, &req, ide_wait);		/* FIXME: we should probably abort/retry or something 		 * in case of failure */		if (pc->stat != 0) {			/* The request failed.  Retry if it was due to a unit			   attention status			   (usually means media was changed). */			struct request_sense *reqbuf = pc->sense;			if (reqbuf->sense_key == UNIT_ATTENTION)				cdrom_saw_media_change (drive);			else if (reqbuf->sense_key == NOT_READY &&				 reqbuf->asc == 4 && reqbuf->ascq != 4) {				/* The drive is in the process of loading				   a disk.  Retry, but wait a little to give				   the drive time to complete the load. */				cdrom_sleep(2 * HZ);			} else {				/* Otherwise, don't retry. */				retries = 0;			}			--retries;		}		/* End of retry loop. */	} while (pc->stat != 0 && retries >= 0);	/* Return an error if the command failed. */	return pc->stat ? -EIO : 0;}/* * Write handling */static inline int cdrom_write_check_ireason(ide_drive_t *drive, int len, int ireason){	/* Two notes about IDE interrupt reason here - 0 means that	 * the drive wants to receive data from us, 2 means that	 * the drive is expecting data from us.	 */	ireason &= 3;	if (ireason == 2) {		/* Whoops... The drive wants to send data. */		printk("%s: cdrom_write_intr: wrong transfer direction!\n",			drive->name);		/* Throw some data at the drive so it doesn't hang		   and quit this request. */		while (len > 0) {			int dum = 0;			atapi_output_bytes(drive, &dum, sizeof(dum));			len -= sizeof(dum);		}	} else {		/* Drive wants a command packet, or invalid ireason... */		printk("%s: cdrom_write_intr: bad interrupt reason %d\n",			drive->name, ireason);	}	cdrom_end_request(0, drive);	return 1;}static ide_startstop_t cdrom_write_intr(ide_drive_t *drive){	int stat, ireason, len, sectors_to_transfer, uptodate;	struct cdrom_info *info = drive->driver_data;	int i, dma_error = 0, dma = info->dma;	ide_startstop_t startstop;	struct request *rq = HWGROUP(drive)->rq;	/* Check for errors. */	if (dma) {		info->dma = 0;		if ((dma_error = HWIF(drive)->dmaproc(ide_dma_end, drive))) {			printk("ide-cd: write dma error\n");			HWIF(drive)->dmaproc(ide_dma_off, drive);		}	}	if (cdrom_decode_status(&startstop, drive, 0, &stat)) {		printk("ide-cd: write_intr decode_status bad\n");		return startstop;	} 	/*	 * using dma, transfer is complete now	 */	if (dma) {		if (dma_error)			return ide_error(drive, "dma error", stat);		rq = HWGROUP(drive)->rq;		for (i = rq->nr_sectors; i > 0;) {			i -= rq->current_nr_sectors;			ide_end_request(1, HWGROUP(drive));		}		return ide_stopped;	}	/* Read the interrupt reason and the transfer length. */	ireason = IN_BYTE(IDE_NSECTOR_REG);	len = IN_BYTE(IDE_LCYL_REG) + 256 * IN_BYTE(IDE_HCYL_REG);	/* If DRQ is clear, the command has completed. */	if ((stat & DRQ_STAT) == 0) {		/* If we're not done writing, complain.		 * Otherwise, complete the command normally.		 */		uptodate = 1;		if (rq->current_nr_sectors > 0) {			printk("%s: write_intr: data underrun (%ld blocks)\n",			drive->name, rq->current_nr_sectors);			uptodate = 0;		}		cdrom_end_request(uptodate, drive);		return ide_stopped;	}	/* Check that the drive is expecting to do the same thing we are. */	if (ireason & 3)		if (cdrom_write_check_ireason(drive, len, ireason))			return ide_stopped;	sectors_to_transfer = len / SECTOR_SIZE;	/*	 * now loop and write out the data	 */	while (sectors_to_transfer > 0) {		int this_transfer;		if (!rq->current_nr_sectors) {			printk("ide-cd: write_intr: oops\n");			break;		}		/*		 * Figure out how many sectors we can transfer		 */		this_transfer = MIN(sectors_to_transfer,rq->current_nr_sectors);		while (this_transfer > 0) {			atapi_output_bytes(drive, rq->buffer, SECTOR_SIZE);			rq->buffer += SECTOR_SIZE;			--rq->nr_sectors;			--rq->current_nr_sectors;			++rq->sector;			--this_transfer;			--sectors_to_transfer;		}		/*		 * current buffer complete, move on		 */		if (rq->current_nr_sectors == 0 && rq->nr_sectors)			cdrom_end_request (1, drive);	}	/* re-arm handler */	ide_set_handler(drive, &cdrom_write_intr, 5 * WAIT_CMD, NULL);	return ide_started;}static ide_startstop_t cdrom_start_write_cont(ide_drive_t *drive){	struct packet_command pc;	/* packet_command_t pc; */	struct request *rq = HWGROUP(drive)->rq;	unsigned nframes, frame;	nframes = rq->nr_sectors >> 2;	frame = rq->sector >> 2;	memset(&pc.c, 0, sizeof(pc.c));	/*	 * we might as well use WRITE_12, but none of the device I have	 * support the streaming feature anyway, so who cares.	 */	pc.c[0] = GPCMD_WRITE_10;#if 0	/* the immediate bit */	pc.c[1] = 1 << 3;#endif	pc.c[7] = (nframes >> 8) & 0xff;	pc.c[8] = nframes & 0xff;	put_unaligned(cpu_to_be32(frame), (unsigned int *)&pc.c[2]);	pc.timeout = 2 * WAIT_CMD;	return cdrom_transfer_packet_command(drive, &pc, cdrom_write_intr);}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产呦萝稀缺另类资源| 亚洲永久精品国产| 国产综合久久久久久鬼色 | 中文字幕日韩精品一区| 欧美日韩国产欧美日美国产精品| 在线视频综合导航| 亚洲国产综合人成综合网站| 亚洲欧洲日韩综合一区二区| 欧美激情一二三区| 91免费在线视频观看| 国产精品久久久久久亚洲毛片| 久久久久久黄色| 国产亚洲欧洲一区高清在线观看| 中文字幕精品在线不卡| 1区2区3区国产精品| 日本色综合中文字幕| 成人免费视频网站在线观看| 欧美日韩1区2区| 亚洲欧洲国产专区| 国产一区二区三区免费| 欧美日本一区二区| 亚洲九九爱视频| 亚洲一区二区影院| 日韩vs国产vs欧美| 色婷婷av一区二区三区软件| 精品裸体舞一区二区三区| 国产精品国产三级国产普通话99| 亚洲一区二区视频在线观看| 菠萝蜜视频在线观看一区| 国产欧美日韩久久| av在线不卡免费看| 国产精品一区二区在线观看网站| 99精品一区二区| 国产精品美女久久福利网站 | 五月婷婷综合网| 欧美视频一区二| 青青草国产精品亚洲专区无| 精品剧情v国产在线观看在线| 欧美韩国一区二区| 亚洲h动漫在线| 日韩欧美中文字幕公布| 蜜臀久久久久久久| 精品区一区二区| av不卡在线播放| 亚洲国产一区在线观看| 2020日本不卡一区二区视频| 中文字幕亚洲精品在线观看 | 欧美在线综合视频| 一区二区免费视频| 7878成人国产在线观看| 精品制服美女久久| 国产精品嫩草影院com| 日韩一区二区影院| 婷婷丁香激情综合| 欧美片网站yy| 国产91在线观看丝袜| 国产人成亚洲第一网站在线播放| 成人综合婷婷国产精品久久蜜臀| 国产精品人人做人人爽人人添| 色老汉av一区二区三区| 国产在线一区二区综合免费视频| 国产精品欧美久久久久无广告 | 久久一区二区视频| 国产在线精品一区二区三区不卡| 欧美性一二三区| 99视频超级精品| 一区二区三区波多野结衣在线观看| 91精品婷婷国产综合久久性色| 日本精品裸体写真集在线观看| 成a人片亚洲日本久久| 丁香啪啪综合成人亚洲小说| 成人av在线资源| av高清不卡在线| 石原莉奈在线亚洲二区| 亚洲一区精品在线| 日本中文字幕一区二区视频| 日韩不卡免费视频| 国产麻豆一精品一av一免费| 成人网页在线观看| 欧美性受极品xxxx喷水| 91麻豆精品国产91久久久更新时间| 欧美日韩国产小视频| 欧美日韩一区三区四区| 欧美一区二区三区免费观看视频| 粉嫩一区二区三区性色av| 亚洲综合在线观看视频| 一二三区精品福利视频| 综合久久一区二区三区| 亚洲丝袜美腿综合| 亚洲欧美激情在线| 亚洲精选一二三| 成人中文字幕电影| 久久久久久久久免费| 日韩二区三区在线观看| 色综合久久久久综合体桃花网| 国产精品中文字幕欧美| 国产成人在线观看| 9i在线看片成人免费| 91丨九色丨蝌蚪富婆spa| 色一情一伦一子一伦一区| 欧美综合一区二区三区| 欧美一区二视频| 国产婷婷一区二区| 亚洲综合另类小说| 国产一区二区三区四区在线观看 | 欧美精品vⅰdeose4hd| 欧美蜜桃一区二区三区| 久久美女艺术照精彩视频福利播放| 国产精品国产三级国产aⅴ无密码| 婷婷丁香激情综合| zzijzzij亚洲日本少妇熟睡| 精品人在线二区三区| 亚洲国产美国国产综合一区二区| 黑人精品欧美一区二区蜜桃| 在线国产电影不卡| 国产精品电影一区二区三区| 国产黑丝在线一区二区三区| 91精品国产全国免费观看 | 不卡影院免费观看| 亚洲精品在线电影| 欧美a一区二区| 日韩一区二区三区av| 亚洲亚洲人成综合网络| 中文字幕一区二区三区不卡在线 | 99久久国产免费看| 亚洲图片欧美色图| 2022国产精品视频| 色婷婷久久久亚洲一区二区三区 | 韩国三级在线一区| 久久青草国产手机看片福利盒子| 六月丁香婷婷久久| 国产欧美一区二区精品忘忧草| 国产高清不卡一区| 国产欧美1区2区3区| 欧美视频中文一区二区三区在线观看 | 久久99精品国产麻豆婷婷| 国产欧美一区二区三区网站| 91免费观看国产| 日韩专区欧美专区| 成人免费一区二区三区在线观看| 色婷婷亚洲综合| 国产在线精品不卡| 亚洲成人精品在线观看| 国产欧美日韩在线| 日韩免费视频一区| 91黄视频在线观看| 成人av在线一区二区三区| 免费高清不卡av| 欧美一二三四区在线| 欧美女孩性生活视频| 在线观看视频91| 欧美日本一区二区在线观看| 日本福利一区二区| 91国在线观看| 91精品国产高清一区二区三区| 欧美综合欧美视频| 91精品国产综合久久国产大片| 欧美日韩小视频| 日韩一区二区三区免费看| 日韩免费一区二区| 国产欧美日韩精品在线| 亚洲黄色片在线观看| 天天综合日日夜夜精品| 免费成人av在线播放| 成人三级在线视频| 欧美日韩欧美一区二区| 欧美精品一区二区三区视频| 国产精品成人网| 亚洲成人av免费| 国产不卡视频在线观看| 色哟哟欧美精品| 精品少妇一区二区三区在线视频| 中文字幕不卡三区| 日本麻豆一区二区三区视频| 丁香婷婷深情五月亚洲| 7777精品伊人久久久大香线蕉最新版| 欧美视频一区在线观看| 在线看国产一区| 精品免费视频.| 亚洲免费观看在线视频| 精品亚洲国内自在自线福利| 不卡的av网站| 91精品久久久久久久91蜜桃| 久久色中文字幕| |精品福利一区二区三区| 亚洲午夜精品一区二区三区他趣| 偷拍一区二区三区| 国产成人免费av在线| 欧美日韩一区二区三区高清 | 美女视频一区二区三区| 国产成人自拍网| 欧美视频日韩视频| 中文字幕国产一区| 婷婷开心激情综合| 91啪在线观看| 久久久久久久电影| 一区二区三区日韩| a亚洲天堂av| 91精品欧美综合在线观看最新| 91久久免费观看|