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

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

?? ide-cd.c

?? ep9315平臺下硬盤驅動的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
{	struct packet_command pc;	struct request *rq = HWGROUP(drive)->rq;	int nsect, sector, nframes, frame, nskip;	/* Number of sectors to transfer. */	nsect = rq->nr_sectors;	/* Starting sector. */	sector = rq->sector;	/* If the requested sector doesn't start on a cdrom block boundary,	   we must adjust the start of the transfer so that it does,	   and remember to skip the first few sectors.	   If the CURRENT_NR_SECTORS field is larger than the size	   of the buffer, it will mean that we're to skip a number	   of sectors equal to the amount by which CURRENT_NR_SECTORS	   is larger than the buffer size. */	nskip = (sector % SECTORS_PER_FRAME);	if (nskip > 0) {		/* Sanity check... */		if (rq->current_nr_sectors != (rq->bh->b_size >> SECTOR_BITS) &&			(rq->sector % CD_FRAMESIZE != 0)) {			printk ("%s: cdrom_start_read_continuation: buffer botch (%lu)\n",				drive->name, rq->current_nr_sectors);			cdrom_end_request(drive, 0);			return ide_stopped;		}		sector -= nskip;		nsect += nskip;		rq->current_nr_sectors += nskip;	}	/* Convert from sectors to cdrom blocks, rounding up the transfer	   length if needed. */	nframes = (nsect + SECTORS_PER_FRAME-1) / SECTORS_PER_FRAME;	frame = sector / SECTORS_PER_FRAME;	/* Largest number of frames was can transfer at once is 64k-1. For	   some drives we need to limit this even more. */	nframes = MIN (nframes, (CDROM_CONFIG_FLAGS (drive)->limit_nframes) ?		(65534 / CD_FRAMESIZE) : 65535);	/* Set up the command */	memset (&pc.c, 0, sizeof (pc.c));	pc.c[0] = GPCMD_READ_10;	pc.c[7] = (nframes >> 8);	pc.c[8] = (nframes & 0xff);	put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);	pc.timeout = WAIT_CMD;	/* Send the command to the drive and return. */	return cdrom_transfer_packet_command(drive, &pc, &cdrom_read_intr);}#define IDECD_SEEK_THRESHOLD	(1000)			/* 1000 blocks */#define IDECD_SEEK_TIMER	(5 * WAIT_MIN_SLEEP)	/* 100 ms */#define IDECD_SEEK_TIMEOUT     WAIT_CMD			/* 10 sec */static ide_startstop_t cdrom_seek_intr (ide_drive_t *drive){	struct cdrom_info *info = drive->driver_data;	int stat;	static int retry = 10;	ide_startstop_t startstop;	if (cdrom_decode_status (&startstop, drive, 0, &stat))		return startstop;	CDROM_CONFIG_FLAGS(drive)->seeking = 1;	if (retry && time_after(jiffies, info->start_seek + IDECD_SEEK_TIMER)) {		if (--retry == 0) {			/*			 * this condition is far too common, to bother			 * users about it			 */#if 0			printk("%s: disabled DSC seek overlap\n", drive->name);#endif			drive->dsc_overlap = 0;		}	}	return ide_stopped;}static ide_startstop_t cdrom_start_seek_continuation (ide_drive_t *drive){	struct packet_command pc;	struct request *rq = HWGROUP(drive)->rq;	int sector, frame, nskip;	sector = rq->sector;	nskip = (sector % SECTORS_PER_FRAME);	if (nskip > 0)		sector -= nskip;	frame = sector / SECTORS_PER_FRAME;	memset (&pc.c, 0, sizeof (pc.c));	pc.c[0] = GPCMD_SEEK;	put_unaligned(cpu_to_be32(frame), (unsigned int *) &pc.c[2]);	pc.timeout = WAIT_CMD;	return cdrom_transfer_packet_command(drive, &pc, &cdrom_seek_intr);}static ide_startstop_t cdrom_start_seek (ide_drive_t *drive, unsigned int block){	struct cdrom_info *info = drive->driver_data;	info->dma = 0;	info->cmd = 0;	info->start_seek = jiffies;	return cdrom_start_packet_command(drive, 0, cdrom_start_seek_continuation);}static inline int cdrom_merge_requests(struct request *rq, struct request *nxt){	int ret = 1;	/*	 * partitions not really working, but better check anyway...	 */	if (rq->cmd == nxt->cmd && rq->rq_dev == nxt->rq_dev) {		rq->nr_sectors += nxt->nr_sectors;		rq->hard_nr_sectors += nxt->nr_sectors;		rq->bhtail->b_reqnext = nxt->bh;		rq->bhtail = nxt->bhtail;		list_del(&nxt->queue);		blkdev_release_request(nxt);		ret = 0;	}	return ret;}/* * the current request will always be the first one on the list */static void cdrom_attempt_remerge(ide_drive_t *drive, struct request *rq){	struct list_head *entry;	struct request *nxt;	unsigned long flags;	spin_lock_irqsave(&io_request_lock, flags);	while (1) {		entry = rq->queue.next;		if (entry == &drive->queue.queue_head)			break;		nxt = blkdev_entry_to_request(entry);		if (rq->sector + rq->nr_sectors != nxt->sector)			break;		else if (rq->nr_sectors + nxt->nr_sectors > SECTORS_MAX)			break;		if (cdrom_merge_requests(rq, nxt))			break;	}	spin_unlock_irqrestore(&io_request_lock, flags);}/* 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;	u8 lowcyl = 0, highcyl = 0;	/* Check for errors. */	if (cdrom_decode_status(&startstop, drive, 0, &stat))		return startstop;	/* Read the interrupt reason and the transfer length. */	ireason = HWIF(drive)->INB(IDE_IREASON_REG);	lowcyl  = HWIF(drive)->INB(IDE_BCOUNTL_REG);	highcyl = HWIF(drive)->INB(IDE_BCOUNTH_REG);	len = lowcyl + (256 * highcyl);	/* 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(drive, 1);		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(drive, 1);		}		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. */		HWIF(drive)->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;			HWIF(drive)->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. */		HWIF(drive)->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;			HWIF(drive)->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;		}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲动漫制服丝袜| 不卡电影免费在线播放一区| 亚洲色图清纯唯美| 久久久精品影视| 久久久久久久久久久久久女国产乱| 日韩欧美一级二级三级| 欧美成人三级电影在线| 精品国产一区二区三区av性色| 日韩一卡二卡三卡| 精品国产一区二区三区四区四| 91精品国产综合久久久久久 | 久久婷婷色综合| 精品处破学生在线二十三| 精品99一区二区三区| 精品成人在线观看| 久久精品视频一区| 中文字幕一区二区在线播放| 亚洲精品成a人| 亚洲成a人v欧美综合天堂| 午夜电影一区二区| 亚洲伊人色欲综合网| 亚洲成人久久影院| 麻豆一区二区三区| 成人激情小说网站| 欧美日韩精品高清| 久久综合九色综合欧美就去吻 | 国产欧美日韩亚州综合| 国产精品精品国产色婷婷| 伊人一区二区三区| 美女视频黄 久久| 国产激情一区二区三区四区 | 亚洲成人激情综合网| 蜜桃在线一区二区三区| 国产成人免费网站| 91丨porny丨户外露出| 欧美一区二区三区人| 欧美成人一区二区三区片免费 | 久久久精品国产免大香伊 | 欧美性色aⅴ视频一区日韩精品| 欧美精品自拍偷拍| 欧美激情一区二区三区四区| 亚洲国产视频一区二区| 91福利资源站| 欧美va亚洲va在线观看蝴蝶网| 亚洲欧洲精品一区二区三区 | 老色鬼精品视频在线观看播放| 1000部国产精品成人观看| 国产精品久久久久久妇女6080| 亚洲男人的天堂在线观看| 日韩国产精品久久| 91丨九色丨蝌蚪丨老版| 欧美精品一区二区三区视频| 一区二区三区**美女毛片| 韩国av一区二区三区| 欧洲精品视频在线观看| 久久久久久久久一| 琪琪久久久久日韩精品| 色综合久久九月婷婷色综合| 久久伊人蜜桃av一区二区| 亚洲成人1区2区| 成人av小说网| 国产精品白丝av| 天堂蜜桃一区二区三区| 色综合网站在线| 美女性感视频久久| 欧洲精品一区二区三区在线观看| 国产日产精品1区| 精久久久久久久久久久| 欧美日韩卡一卡二| 亚洲一二三区视频在线观看| 成人激情动漫在线观看| 国产亚洲va综合人人澡精品 | 视频一区二区中文字幕| 欧美色爱综合网| 亚洲一区二区三区视频在线播放 | 青青草国产精品97视觉盛宴| 成人app在线| 欧美日韩激情一区二区三区| 亚洲免费观看高清完整版在线观看 | 日日摸夜夜添夜夜添亚洲女人| 色老综合老女人久久久| 国产精品久久久久久久久免费丝袜 | 中文字幕在线视频一区| 国产福利一区二区三区在线视频| 日韩免费在线观看| 激情图片小说一区| 国产拍欧美日韩视频二区| 东方aⅴ免费观看久久av| 国产欧美综合色| 91在线视频免费观看| 亚洲图片激情小说| 欧美国产欧美综合| 成人激情免费视频| 亚洲欧美日韩久久精品| 在线一区二区三区| 爽爽淫人综合网网站| 欧美一区二区啪啪| 国产一区二区三区免费| 国产精品欧美精品| 91在线小视频| 天堂成人国产精品一区| 欧美v国产在线一区二区三区| 国产综合一区二区| 亚洲天堂成人网| 欧美高清激情brazzers| 国产美女久久久久| 成人免费在线视频观看| 欧美撒尿777hd撒尿| 久久精品噜噜噜成人av农村| 久久精品亚洲麻豆av一区二区 | 亚洲sss视频在线视频| 日韩一区二区三区视频| 国产精品影音先锋| 一区二区三区中文在线观看| 欧美一级理论性理论a| 国产成a人无v码亚洲福利| 亚洲一区中文日韩| 精品入口麻豆88视频| 97se亚洲国产综合自在线不卡 | 欧美tk—视频vk| 97久久精品人人做人人爽50路| 午夜精品成人在线视频| 国产精品乱码一区二三区小蝌蚪| 欧美日韩视频一区二区| 色一情一乱一乱一91av| 国产精品一区二区不卡| 婷婷中文字幕一区三区| 亚洲视频香蕉人妖| 国产亚洲欧美日韩日本| 91精品国产综合久久久久久久久久| www.欧美.com| 久久99精品国产麻豆不卡| 亚洲一区二区综合| 国产精品久久久久久久久久免费看 | 亚洲国产另类av| 国产精品欧美经典| 国产午夜亚洲精品午夜鲁丝片 | 日本不卡一区二区| 欧美最猛性xxxxx直播| 一片黄亚洲嫩模| 蜜芽一区二区三区| 亚洲欧美色图小说| 国产日本欧洲亚洲| 精品区一区二区| 正在播放亚洲一区| 欧美日韩国产高清一区二区| 成人av在线网| 成人小视频在线| 国产高清精品网站| 精品影视av免费| 久色婷婷小香蕉久久| 日产国产高清一区二区三区| 亚洲国产日产av| **欧美大码日韩| 国产精品久久久久影院亚瑟| 中文字幕av一区二区三区免费看| 日韩欧美在线观看一区二区三区| 欧美日韩一区成人| 欧美精品在线观看一区二区| 久久久青草青青国产亚洲免观| 成人性生交大片免费| 亚洲精品久久嫩草网站秘色| 国产精品麻豆视频| 中文字幕国产精品一区二区| 中文字幕一区二区三| 亚洲欧洲一区二区三区| 国产精品1024久久| 久久久精品黄色| 日韩电影一区二区三区四区| 亚洲va欧美va天堂v国产综合| 亚洲va国产va欧美va观看| 亚洲电影第三页| 欧美日韩高清影院| 日韩三级.com| 亚洲国产高清在线观看视频| 91高清视频在线| 精品国产污污免费网站入口| 亚洲六月丁香色婷婷综合久久| 国产一区二区日韩精品| 在线成人av影院| 国产精品久久久久久久久免费相片| 欧美在线观看一区二区| 麻豆精品蜜桃视频网站| 91免费看片在线观看| 久久久噜噜噜久久中文字幕色伊伊| 亚洲在线成人精品| 99久久国产免费看| 国产精品毛片大码女人| 国产精品一卡二| 精品理论电影在线观看| 日韩高清电影一区| 欧美系列亚洲系列| 亚洲综合久久av| 91黄色在线观看| 亚洲免费观看高清完整版在线观看 | 欧美tk—视频vk| 久久se精品一区二区| 717成人午夜免费福利电影| 亚洲成人综合网站| 欧美日韩国产免费|