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

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

?? ide-cd.c

?? ep9315平臺下硬盤驅動的源碼
?? C
?? 第 1 頁 / 共 5 頁
字號:
		/* 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;			HWIF(drive)->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(drive, 0);	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;	u8 lowcyl = 0, highcyl = 0;	ide_startstop_t startstop;	struct request *rq = HWGROUP(drive)->rq;	/* Check for errors. */	if (dma) {		info->dma = 0;		if ((dma_error = HWIF(drive)->ide_dma_end(drive))) {			printk("ide-cd: write dma error\n");			HWIF(drive)->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 DRIVER(drive)->error(drive, "dma error", stat);		rq = HWGROUP(drive)->rq;		for (i = rq->nr_sectors; i > 0;) {			i -= rq->current_nr_sectors;			ide_cdrom_end_request(drive, 1);		}		return ide_stopped;	}	/* 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. */	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(drive, uptodate);		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) {			HWIF(drive)->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(drive, 1);	}	/* 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);}static ide_startstop_t cdrom_start_write(ide_drive_t *drive, struct request *rq){	struct cdrom_info *info = drive->driver_data;	/*	 * writes *must* be 2kB frame aligned	 */	if ((rq->nr_sectors & 3) || (rq->sector & 3)) {		cdrom_end_request(drive, 0);		return ide_stopped;	}	/*	 * for dvd-ram and such media, it's a really big deal to get	 * big writes all the time. so scour the queue and attempt to	 * remerge requests, often the plugging will not have had time	 * to do this properly	 */	cdrom_attempt_remerge(drive, rq);	info->nsectors_buffered = 0;        /* use dma, if possible. we don't need to check more, since we	 * know that the transfer is always (at least!) 2KB aligned */	info->dma = drive->using_dma ? 1 : 0;	info->cmd = WRITE;	/* Start sending the read request to the drive. */	return cdrom_start_packet_command(drive, 32768, cdrom_start_write_cont);}/**************************************************************************** * cdrom driver request routine. */static ide_startstop_tide_do_rw_cdrom (ide_drive_t *drive, struct request *rq, unsigned long block){	ide_startstop_t action;	struct cdrom_info *info = drive->driver_data;	switch (rq->cmd) {		case WRITE:		case READ: {			if (CDROM_CONFIG_FLAGS(drive)->seeking) {				int stat = HWIF(drive)->INB(IDE_STATUS_REG);				if ((stat & SEEK_STAT) != SEEK_STAT) {					if (time_before(jiffies, info->start_seek + IDECD_SEEK_TIMEOUT)) {						ide_stall_queue(drive, IDECD_SEEK_TIMER);						return ide_stopped;					}					printk ("%s: DSC timeout\n", drive->name);				}				CDROM_CONFIG_FLAGS(drive)->seeking = 0;			}			if (IDE_LARGE_SEEK(info->last_block, block, IDECD_SEEK_THRESHOLD) && drive->dsc_overlap)				action = cdrom_start_seek(drive, block);			else {				if (rq_data_dir(rq) == READ)					action = cdrom_start_read(drive, block);				else					action = cdrom_start_write(drive, rq);			}			info->last_block = block;			return action;		}		case PACKET_COMMAND:		case REQUEST_SENSE_COMMAND: {			return cdrom_do_packet_command(drive);		}		case RESET_DRIVE_COMMAND: {			cdrom_end_request(drive, 1);			return ide_do_reset(drive);		}		default: {			printk("ide-cd: bad cmd %d\n", rq->cmd);			cdrom_end_request(drive, 0);			return ide_stopped;		}	}}/**************************************************************************** * Ioctl handling. * * Routines which queue packet commands take as a final argument a pointer * to a request_sense struct.  If execution of the command results * in an error with a CHECK CONDITION status, this structure will be filled * with the results of the subsequent request sense command.  The pointer * can also be NULL, in which case no sense information is returned. */#if ! STANDARD_ATAPIstatic inlineint bin2bcd (int x){	return (x%10) | ((x/10) << 4);}static inlineint bcd2bin (int x){	return (x >> 4) * 10 + (x & 0x0f);}staticvoid msf_from_bcd (struct atapi_msf *msf){	msf->minute = bcd2bin (msf->minute);	msf->second = bcd2bin (msf->second);	msf->frame  = bcd2bin (msf->frame);}#endif /* not STANDARD_ATAPI */static inlinevoid lba_to_msf (int lba, byte *m, byte *s, byte *f){	lba += CD_MSF_OFFSET;	lba &= 0xffffff;  /* negative lbas use only 24 bits */	*m = lba / (CD_SECS * CD_FRAMES);	lba %= (CD_SECS * CD_FRAMES);	*s = lba / CD_FRAMES;	*f = lba % CD_FRAMES;}static inlineint msf_to_lba (byte m, byte s, byte f){	return (((m * CD_SECS) + s) * CD_FRAMES + f) - CD_MSF_OFFSET;}static int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense){	struct packet_command pc;	struct cdrom_info *info = drive->driver_data;	struct cdrom_device_info *cdi = &info->devinfo;	memset(&pc, 0, sizeof(pc));	pc.sense = sense;	pc.c[0] = GPCMD_TEST_UNIT_READY;#if ! STANDARD_ATAPI        /* the Sanyo 3 CD changer uses byte 7 of TEST_UNIT_READY to            switch CDs instead of supporting the LOAD_UNLOAD opcode   */        pc.c[7] = cdi->sanyo_slot % 3;#endif /* not STANDARD_ATAPI */	return cdrom_queue_packet_command(drive, &pc);}/* Lock the door if LOCKFLAG is nonzero; unlock it otherwise. */static intcdrom_lockdoor(ide_drive_t *drive, int lockflag, struct request_sense *sense){	struct request_sense my_sense;	struct packet_command pc;	int stat;	if (sense == NULL)		sense = &my_sense;	/* If the drive cannot lock the door, just pretend. */	if (CDROM_CONFIG_FLAGS(drive)->no_doorlock) {		stat = 0;	} else {		memset(&pc, 0, sizeof(pc));		pc.sense = sense;		pc.c[0] = GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL;		pc.c[4] = lockflag ? 1 : 0;		stat = cdrom_queue_packet_command(drive, &pc);	}	/* If we got an illegal field error, the drive	   probably cannot lock the door. */	if (stat != 0 &&	    sense->sense_key == ILLEGAL_REQUEST &&	    (sense->asc == 0x24 || sense->asc == 0x20)) {		printk ("%s: door locking not supported\n",			drive->name);		CDROM_CONFIG_FLAGS(drive)->no_doorlock = 1;		stat = 0;	}		/* no medium, that's alright. */	if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a)		stat = 0;	if (stat == 0)		CDROM_STATE_FLAGS(drive)->door_locked = lockflag;	return stat;}/* Eject the disk if EJECTFLAG is 0.   If EJECTFLAG is 1, try to reload the disk. */static int cdrom_eject(ide_drive_t *drive, int ejectflag,		       struct request_sense *sense){	struct packet_command pc;	if (CDROM_CONFIG_FLAGS(drive)->no_eject && !ejectflag)		return -EDRIVE_CANT_DO_THIS;		/* reload fails on some drives, if the tray is locked */	if (CDROM_STATE_FLAGS(drive)->door_locked && ejectflag)		return 0;	memset(&pc, 0, sizeof (pc));	pc.sense = sense;	pc.c[0] = GPCMD_START_STOP_UNIT;	pc.c[4] = 0x02 + (ejectflag != 0);	return cdrom_queue_packet_command(drive, &pc);}static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity,			       struct request_sense *sense){	struct {		__u32 lba;		__u32 blocklen;	} capbuf;	int stat;	str

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美亚洲自拍偷拍| 欧美亚洲综合久久| 99国产精品久| 国模套图日韩精品一区二区| 亚洲一二三四久久| 欧美一区二区三区在线视频| 91免费国产在线| 成人高清免费观看| 99re在线精品| 久久伊99综合婷婷久久伊| 日韩女优视频免费观看| 日韩精品一区在线| 亚洲一级二级三级在线免费观看| 国产精品中文字幕日韩精品| 经典一区二区三区| 国产盗摄视频一区二区三区| 国产盗摄女厕一区二区三区 | 国产成人免费xxxxxxxx| 欧美欧美午夜aⅴ在线观看| 在线电影院国产精品| 正在播放亚洲一区| 久久综合色婷婷| 久久精品久久99精品久久| 国产激情视频一区二区三区欧美| 日韩一区二区三区观看| 久久九九影视网| 中文字幕精品—区二区四季| 亚洲男女毛片无遮挡| 亚洲成人免费电影| 激情图片小说一区| 欧美电视剧在线观看完整版| 日本最新不卡在线| 国产精品一二三在| 日韩精品在线一区二区| 美女mm1313爽爽久久久蜜臀| 成人激情av网| 中文字幕 久热精品 视频在线 | www国产成人| 国产伦精一区二区三区| 欧美自拍偷拍一区| 欧美本精品男人aⅴ天堂| 亚洲人妖av一区二区| 日韩在线一区二区| 99久久综合国产精品| 欧美一区二区观看视频| 天堂午夜影视日韩欧美一区二区| 777奇米成人网| 麻豆91精品视频| 2017欧美狠狠色| 粉嫩嫩av羞羞动漫久久久| 8x8x8国产精品| 国产精品资源在线观看| 国产精品激情偷乱一区二区∴| 奇米色777欧美一区二区| 91在线云播放| 亚洲综合另类小说| 日韩女优电影在线观看| yourporn久久国产精品| 亚洲美女在线一区| 欧美一区二区美女| 成人午夜视频网站| 国产日本欧美一区二区| 国产在线不卡一卡二卡三卡四卡| 国产精品无码永久免费888| 国产乱妇无码大片在线观看| 国产精品国产三级国产a| 欧美视频在线观看一区二区| 国内成人精品2018免费看| 亚洲欧洲成人精品av97| av在线不卡网| 老司机午夜精品| 亚洲日本电影在线| 精品国偷自产国产一区| 国产精品资源在线看| 夜夜精品浪潮av一区二区三区| 91日韩一区二区三区| 久久精品国产**网站演员| 亚洲欧洲日产国码二区| 日韩欧美国产综合| 色婷婷狠狠综合| 日韩一区中文字幕| 精品成人在线观看| 欧美亚洲国产bt| 成人a级免费电影| 精品午夜久久福利影院| 亚洲国产综合91精品麻豆| 国产精品视频一区二区三区不卡| 69av一区二区三区| 91精品国产乱| 在线亚洲高清视频| 成人app在线| 国产成人免费视频一区| 国产制服丝袜一区| 蜜桃精品视频在线| 日韩二区三区四区| 亚洲电影在线播放| 一区二区三区在线视频免费观看 | 欧美一级午夜免费电影| 日本韩国精品在线| 亚洲一卡二卡三卡四卡五卡| 国产精品久久看| 亚洲精品在线免费播放| 欧美一区午夜精品| 欧美色中文字幕| 欧美色电影在线| 国产精品资源在线| 精品亚洲porn| 国精产品一区一区三区mba视频 | 亚洲.国产.中文慕字在线| 亚洲精品国产一区二区精华液| 3d动漫精品啪啪| 欧美日韩精品欧美日韩精品一| 91久久奴性调教| 91成人免费在线视频| 在线看国产一区| 欧美日韩国产区一| 51午夜精品国产| 欧美sm极限捆绑bd| 欧美大胆人体bbbb| 26uuu国产日韩综合| 久久久青草青青国产亚洲免观| 在线免费一区三区| 在线欧美一区二区| 91精品国产麻豆国产自产在线| 5858s免费视频成人| 日韩欧美国产精品一区| 精品福利在线导航| 日本一区二区成人| 亚洲欧美日韩国产手机在线| 亚洲韩国一区二区三区| 日本不卡一区二区| 国产精品小仙女| 91老师国产黑色丝袜在线| 欧美三级午夜理伦三级中视频| 在线电影欧美成精品| 日韩欧美的一区二区| 国产亚洲欧美一区在线观看| 亚洲色图欧美在线| 日韩精品午夜视频| 国产精品综合久久| 不卡高清视频专区| 欧美日韩中字一区| 久久综合九色综合97婷婷| ...xxx性欧美| 久久精品国内一区二区三区| 99视频超级精品| 日韩免费一区二区三区在线播放| 国产亚洲精久久久久久| 亚洲一区国产视频| 国产在线精品一区二区夜色| 91美女视频网站| 日韩欧美一级精品久久| 亚洲欧洲国产专区| 美日韩黄色大片| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 久久久久久综合| 亚洲黄色片在线观看| 久国产精品韩国三级视频| 91偷拍与自偷拍精品| 日韩亚洲欧美一区| 亚洲精品亚洲人成人网在线播放| 蜜臀久久99精品久久久画质超高清| 成人深夜福利app| 日韩一区二区高清| 亚洲精品你懂的| 国产成人8x视频一区二区| 欧美一区二区三区婷婷月色| 亚洲丝袜自拍清纯另类| 国产麻豆精品95视频| 欧美日韩视频一区二区| 亚洲欧洲99久久| 国产伦精品一区二区三区免费迷| 欧美日韩国产免费一区二区| 中文字幕在线不卡| 国产伦精品一区二区三区视频青涩| 欧美高清一级片在线| 亚洲综合另类小说| 99精品热视频| 欧美国产日产图区| 国产精品亚洲一区二区三区妖精| 91精品国产综合久久精品| 亚洲黄色av一区| 一本色道久久综合亚洲aⅴ蜜桃| 国产女主播一区| 国产精品一二三| 精品精品国产高清一毛片一天堂| 日韩专区一卡二卡| 在线成人高清不卡| 激情六月婷婷综合| 精品国产污网站| 蜜桃av一区二区三区| 在线播放日韩导航| 日韩在线卡一卡二| 欧美一区二区三区在| 久久精品国产**网站演员| 日韩欧美国产精品一区| 狠狠色丁香婷综合久久| 精品国产网站在线观看| 国产一区二区三区久久久| 久久亚洲精品小早川怜子|