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

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

?? ide3.c

?? ucos在三星s3c44b0上的ide程序
?? C
?? 第 1 頁 / 共 5 頁
字號:
 */void ide_input_data (ide_drive_t *drive, void *buffer, unsigned int wcount){	byte io_32bit;	/* first check if this controller has defined a special function	 * for handling polled ide transfers	 */	if(HWIF(drive)->ideproc) {		HWIF(drive)->ideproc(ideproc_ide_input_data,				     drive, buffer, wcount);		return;	}	io_32bit = drive->io_32bit;	if (io_32bit) {#if SUPPORT_VLB_SYNC		if (io_32bit & 2) {			unsigned long flags;			__save_flags(flags);	/* local CPU only */			__cli();		/* local CPU only */			do_vlb_sync(IDE_NSECTOR_REG);			insl(IDE_DATA_REG, buffer, wcount);			__restore_flags(flags);	/* local CPU only */		} else#endif /* SUPPORT_VLB_SYNC */			insl(IDE_DATA_REG, buffer, wcount);	} else {#if SUPPORT_SLOW_DATA_PORTS		if (drive->slow) {			unsigned short *ptr = (unsigned short *) buffer;			while (wcount--) {				*ptr++ = inw_p(IDE_DATA_REG);				*ptr++ = inw_p(IDE_DATA_REG);			}		} else#endif /* SUPPORT_SLOW_DATA_PORTS */			insw(IDE_DATA_REG, buffer, wcount<<1);	}}/* * This is used for most PIO data transfers *to* the IDE interface */void ide_output_data (ide_drive_t *drive, void *buffer, unsigned int wcount){	byte io_32bit;	if(HWIF(drive)->ideproc) {		HWIF(drive)->ideproc(ideproc_ide_output_data,				     drive, buffer, wcount);		return;	}	io_32bit = drive->io_32bit;	if (io_32bit) {#if SUPPORT_VLB_SYNC		if (io_32bit & 2) {			unsigned long flags;			__save_flags(flags);	/* local CPU only */			__cli();		/* local CPU only */			do_vlb_sync(IDE_NSECTOR_REG);			outsl(IDE_DATA_REG, buffer, wcount);			__restore_flags(flags);	/* local CPU only */		} else#endif /* SUPPORT_VLB_SYNC */			outsl(IDE_DATA_REG, buffer, wcount);	} else {#if SUPPORT_SLOW_DATA_PORTS		if (drive->slow) {			unsigned short *ptr = (unsigned short *) buffer;			while (wcount--) {				outw_p(*ptr++, IDE_DATA_REG);				outw_p(*ptr++, IDE_DATA_REG);			}		} else#endif /* SUPPORT_SLOW_DATA_PORTS */			outsw(IDE_DATA_REG, buffer, wcount<<1);	}}/* * The following routines are mainly used by the ATAPI drivers. * * These routines will round up any request for an odd number of bytes, * so if an odd bytecount is specified, be sure that there's at least one * extra byte allocated for the buffer. */void atapi_input_bytes (ide_drive_t *drive, void *buffer, unsigned int bytecount){	if(HWIF(drive)->ideproc) {		HWIF(drive)->ideproc(ideproc_atapi_input_bytes,				     drive, buffer, bytecount);		return;	}	++bytecount;#if defined(CONFIG_ATARI) || defined(CONFIG_Q40)	if (MACH_IS_ATARI || MACH_IS_Q40) {		/* Atari has a byte-swapped IDE interface */		insw_swapw(IDE_DATA_REG, buffer, bytecount / 2);		return;	}#endif /* CONFIG_ATARI */	ide_input_data (drive, buffer, bytecount / 4);	if ((bytecount & 0x03) >= 2)		insw (IDE_DATA_REG, ((byte *)buffer) + (bytecount & ~0x03), 1);}void atapi_output_bytes (ide_drive_t *drive, void *buffer, unsigned int bytecount){	if(HWIF(drive)->ideproc) {		HWIF(drive)->ideproc(ideproc_atapi_output_bytes,				     drive, buffer, bytecount);		return;	}	++bytecount;#if defined(CONFIG_ATARI) || defined(CONFIG_Q40)	if (MACH_IS_ATARI || MACH_IS_Q40) {		/* Atari has a byte-swapped IDE interface */		outsw_swapw(IDE_DATA_REG, buffer, bytecount / 2);		return;	}#endif /* CONFIG_ATARI */	ide_output_data (drive, buffer, bytecount / 4);	if ((bytecount & 0x03) >= 2)		outsw (IDE_DATA_REG, ((byte *)buffer) + (bytecount & ~0x03), 1);}/* * Needed for PCI irq sharing *///static inlineint drive_is_ready (ide_drive_t *drive){	byte stat = 0;	if (drive->waiting_for_dma)		return HWIF(drive)->dmaproc(ide_dma_test_irq, drive);#if 0	udelay(1);	/* need to guarantee 400ns since last command was issued */#endif#ifdef CONFIG_IDEPCI_SHARE_IRQ	/*	 * We do a passive status test under shared PCI interrupts on	 * cards that truly share the ATA side interrupt, but may also share	 * an interrupt with another pci card/device.  We make no assumptions	 * about possible isa-pnp and pci-pnp issues yet.	 */	if (IDE_CONTROL_REG)		stat = GET_ALTSTAT();	else#endif /* CONFIG_IDEPCI_SHARE_IRQ */	stat = GET_STAT();	/* Note: this may clear a pending IRQ!! */	if (stat & BUSY_STAT)		return 0;	/* drive busy:  definitely not interrupting */	return 1;		/* drive ready: *might* be interrupting */}/* * This is our end_request replacement function. */void ide_end_request (byte uptodate, ide_hwgroup_t *hwgroup){	struct request *rq;	unsigned long flags;	ide_drive_t *drive = hwgroup->drive;	spin_lock_irqsave(&io_request_lock, flags);	rq = hwgroup->rq;	/*	 * decide whether to reenable DMA -- 3 is a random magic for now,	 * if we DMA timeout more than 3 times, just stay in PIO	 */	if (drive->state == DMA_PIO_RETRY && drive->retry_pio <= 3) {		drive->state = 0;		hwgroup->hwif->dmaproc(ide_dma_on, drive);	}	if (!end_that_request_first(rq, uptodate, hwgroup->drive->name)) {		add_blkdev_randomness(MAJOR(rq->rq_dev));		blkdev_dequeue_request(rq);        	hwgroup->rq = NULL;		end_that_request_last(rq);	}	spin_unlock_irqrestore(&io_request_lock, flags);}/* * This should get invoked any time we exit the driver to * wait for an interrupt response from a drive.  handler() points * at the appropriate code to handle the next interrupt, and a * timer is started to prevent us from waiting forever in case * something goes wrong (see the ide_timer_expiry() handler later on). */void ide_set_handler (ide_drive_t *drive, ide_handler_t *handler,		      unsigned int timeout, ide_expiry_t *expiry){	unsigned long flags;	ide_hwgroup_t *hwgroup = HWGROUP(drive);	spin_lock_irqsave(&io_request_lock, flags);	if (hwgroup->handler != NULL) {		printk("%s: ide_set_handler: handler not null; old=%p, new=%p\n",			drive->name, hwgroup->handler, handler);	}	hwgroup->handler	= handler;	hwgroup->expiry		= expiry;	hwgroup->timer.expires	= jiffies + timeout;	add_timer(&hwgroup->timer);	spin_unlock_irqrestore(&io_request_lock, flags);}/* * current_capacity() returns the capacity (in sectors) of a drive * according to its current geometry/LBA settings. */unsigned long current_capacity (ide_drive_t *drive){	if (!drive->present)		return 0;	if (drive->driver != NULL)		return DRIVER(drive)->capacity(drive);	return 0;}extern struct block_device_operations ide_fops[];/* * ide_geninit() is called exactly *once* for each interface. */void ide_geninit (ide_hwif_t *hwif){	unsigned int unit;	struct gendisk *gd = hwif->gd;	for (unit = 0; unit < MAX_DRIVES; ++unit) {		ide_drive_t *drive = &hwif->drives[unit];		if (!drive->present)			continue;		if (drive->media!=ide_disk && drive->media!=ide_floppy)			continue;		register_disk(gd,MKDEV(hwif->major,unit<<PARTN_BITS),#ifdef CONFIG_BLK_DEV_ISAPNP			(drive->forced_geom && drive->noprobe) ? 1 :#endif /* CONFIG_BLK_DEV_ISAPNP */			1<<PARTN_BITS, ide_fops,			current_capacity(drive));	}}static ide_startstop_t do_reset1 (ide_drive_t *, int);		/* needed below *//* * atapi_reset_pollfunc() gets invoked to poll the interface for completion every 50ms * during an atapi drive reset operation. If the drive has not yet responded, * and we have not yet hit our maximum waiting time, then the timer is restarted * for another 50ms. */static ide_startstop_t atapi_reset_pollfunc (ide_drive_t *drive){	ide_hwgroup_t *hwgroup = HWGROUP(drive);	byte stat;	SELECT_DRIVE(HWIF(drive),drive);	udelay (10);	if (OK_STAT(stat=GET_STAT(), 0, BUSY_STAT)) {		printk("%s: ATAPI reset complete\n", drive->name);	} else {		if (0 < (signed long)(hwgroup->poll_timeout - jiffies)) {			ide_set_handler (drive, &atapi_reset_pollfunc, HZ/20, NULL);			return ide_started;	/* continue polling */		}		hwgroup->poll_timeout = 0;	/* end of polling */		printk("%s: ATAPI reset timed-out, status=0x%02x\n", drive->name, stat);		return do_reset1 (drive, 1);	/* do it the old fashioned way */	}	hwgroup->poll_timeout = 0;	/* done polling */	return ide_stopped;}/* * reset_pollfunc() gets invoked to poll the interface for completion every 50ms * during an ide reset operation. If the drives have not yet responded, * and we have not yet hit our maximum waiting time, then the timer is restarted * for another 50ms. */static ide_startstop_t reset_pollfunc (ide_drive_t *drive){	ide_hwgroup_t *hwgroup = HWGROUP(drive);	ide_hwif_t *hwif = HWIF(drive);	byte tmp;	if (!OK_STAT(tmp=GET_STAT(), 0, BUSY_STAT)) {		if (0 < (signed long)(hwgroup->poll_timeout - jiffies)) {			ide_set_handler (drive, &reset_pollfunc, HZ/20, NULL);			return ide_started;	/* continue polling */		}		printk("%s: reset timed-out, status=0x%02x\n", hwif->name, tmp);		drive->failures++;	} else  {		printk("%s: reset: ", hwif->name);		if ((tmp = GET_ERR()) == 1) {			printk("success\n");			drive->failures = 0;		} else {			drive->failures++;#if FANCY_STATUS_DUMPS			printk("master: ");			switch (tmp & 0x7f) {				case 1: printk("passed");					break;				case 2: printk("formatter device error");					break;				case 3: printk("sector buffer error");					break;				case 4: printk("ECC circuitry error");					break;				case 5: printk("controlling MPU error");					break;				default:printk("error (0x%02x?)", tmp);			}			if (tmp & 0x80)				printk("; slave: failed");			printk("\n");#else			printk("failed\n");#endif /* FANCY_STATUS_DUMPS */		}	}	hwgroup->poll_timeout = 0;	/* done polling */	return ide_stopped;}static void check_dma_crc (ide_drive_t *drive){	if (drive->crc_count) {		(void) HWIF(drive)->dmaproc(ide_dma_off_quietly, drive);		if ((HWIF(drive)->speedproc) != NULL)			HWIF(drive)->speedproc(drive, ide_auto_reduce_xfer(drive));		if (drive->current_speed >= XFER_SW_DMA_0)			(void) HWIF(drive)->dmaproc(ide_dma_on, drive);	} else {		(void) HWIF(drive)->dmaproc(ide_dma_off, drive);	}}static void pre_reset (ide_drive_t *drive){	if (drive->driver != NULL)		DRIVER(drive)->pre_reset(drive);	if (!drive->keep_settings) {		if (drive->using_dma) {			check_dma_crc(drive);		} else {			drive->unmask = 0;			drive->io_32bit = 0;		}		return;	}	if (drive->using_dma)		check_dma_crc(drive);}/* * do_reset1() attempts to recover a confused drive by resetting it. * Unfortunately, resetting a disk drive actually resets all devices on * the same interface, so it can really be thought of as resetting the * interface rather than resetting the drive. * * ATAPI devices have their own reset mechanism which allows them to be * individually reset without clobbering other devices on the same interface. * * Unfortunately, the IDE interface does not generate an interrupt to let * us know when the reset operation has finished, so we must poll for this. * Equally poor, though, is the fact that this may a very long time to complete, * (up to 30 seconds worstcase).  So, instead of busy-waiting here for it, * we set a timer to poll at 50ms intervals. */static ide_startstop_t do_reset1 (ide_drive_t *drive, int do_not_try_atapi){	unsigned int unit;	unsigned long flags;	ide_hwif_t *hwif = HWIF(drive);	ide_hwgroup_t *hwgroup = HWGROUP(drive);	__save_flags(flags);	/* local CPU only */	__cli();		/* local CPU only */	/* For an ATAPI device, first try an ATAPI SRST. */	if (drive->media != ide_disk && !do_not_try_atapi) {		pre_reset(drive);		SELECT_DRIVE(hwif,drive);		udelay (20);		OUT_BYTE (WIN_SRST, IDE_COMMAND_REG);		hwgroup->poll_timeout = jiffies + WAIT_WORSTCASE;		ide_set_handler (drive, &atapi_reset_pollfunc, HZ/20, NULL);		__restore_flags (flags);	/* local CPU only */		return ide_started;	}	/*	 * First, reset any device state data we were maintaining	 * for any of the drives on this interface.

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美va在线播放| 久久一二三国产| 久国产精品韩国三级视频| 国产精品久久久久久户外露出| 日韩午夜中文字幕| 91精品国产入口在线| 欧美日韩三级一区二区| 色播五月激情综合网| 99久久久国产精品免费蜜臀| 国产成人鲁色资源国产91色综 | 国产mv日韩mv欧美| 国产精品一区二区黑丝| 国产精品中文欧美| 91精品婷婷国产综合久久| 中文字幕乱码亚洲精品一区| 色网综合在线观看| 91色在线porny| 欧美中文字幕一区二区三区 | 欧美成人猛片aaaaaaa| 成人激情午夜影院| 欧洲生活片亚洲生活在线观看| 一区二区三区国产精华| 亚洲一区二区精品久久av| 欧美色手机在线观看| 激情文学综合丁香| 精品一区二区三区香蕉蜜桃| 日韩毛片精品高清免费| 麻豆精品久久精品色综合| 亚洲午夜精品17c| 视频一区二区国产| 国产一区二区在线观看免费| 99久久久无码国产精品| 欧美国产日韩a欧美在线观看| 久久9热精品视频| 91在线国产福利| 亚洲欧洲av一区二区三区久久| 日韩综合在线视频| 777亚洲妇女| 丝袜亚洲另类丝袜在线| 欧美精品自拍偷拍动漫精品| 欧美一区二区成人6969| 久久久不卡网国产精品二区| 日韩三级精品电影久久久| 亚洲精品国产成人久久av盗摄 | 韩国午夜理伦三级不卡影院| 欧美亚洲愉拍一区二区| 久久综合九色综合欧美亚洲| 久久国产尿小便嘘嘘尿| 久久色.com| 丁香桃色午夜亚洲一区二区三区| 色综合久久久久久久久久久| 亚洲色图清纯唯美| 欧美视频中文字幕| 日本不卡一区二区三区高清视频| 成人黄色免费短视频| 亚洲色图欧美在线| 欧美日韩国产综合视频在线观看| 欧美色偷偷大香| 91精品福利在线一区二区三区| 天天做天天摸天天爽国产一区 | 欧美日韩精品一区二区三区蜜桃 | 色婷婷久久久亚洲一区二区三区| 亚洲激情五月婷婷| 欧美一区二区精品久久911| 精品制服美女久久| 国产精品久久影院| 欧美乱妇23p| 国产精品一级片在线观看| 一区精品在线播放| 91精品国产一区二区三区蜜臀| 精品一区在线看| 亚洲精品中文在线| 欧美成人aa大片| 色综合欧美在线| 久久精品免费观看| 国产精品白丝在线| 日韩三级高清在线| 波多野结衣视频一区| 国产日韩欧美在线一区| 国产精品系列在线播放| 一区二区成人在线视频| 337p粉嫩大胆色噜噜噜噜亚洲| 成人高清av在线| 免费三级欧美电影| 精品久久久久av影院 | 色诱亚洲精品久久久久久| 午夜精品福利一区二区三区av| 久久久久久97三级| 国产精品你懂的在线| 国产一区二区在线观看视频| 夜夜亚洲天天久久| 国产清纯在线一区二区www| 欧美精品1区2区3区| 99国产欧美另类久久久精品| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲欧美在线高清| 久久精品夜色噜噜亚洲aⅴ| 国产麻豆精品在线观看| 午夜天堂影视香蕉久久| 亚洲欧美日韩成人高清在线一区| 91成人网在线| 播五月开心婷婷综合| 国产精品一卡二| 老色鬼精品视频在线观看播放| 亚洲专区一二三| 国产精品高清亚洲| 国产视频一区二区三区在线观看| 日韩一级免费观看| 欧美蜜桃一区二区三区| 91国在线观看| 色偷偷成人一区二区三区91| 成人国产免费视频| 国产高清视频一区| 国产成人在线视频免费播放| 韩国三级中文字幕hd久久精品| 免费成人在线视频观看| 性做久久久久久久免费看| 中文字幕人成不卡一区| 欧美va亚洲va国产综合| 欧美一级片在线| 欧美一区二区三区免费大片 | 国产在线麻豆精品观看| 久久国产精品一区二区| 日本韩国精品在线| 在线观看国产一区二区| 在线视频亚洲一区| 欧美日韩精品久久久| 在线成人av网站| 欧美成人r级一区二区三区| 精品欧美乱码久久久久久| 久久女同互慰一区二区三区| 国产亚洲一区字幕| 亚洲视频一二三| 亚洲大片免费看| 麻豆91在线播放| 大胆欧美人体老妇| 91免费国产在线观看| 欧美日韩在线播放| 欧美一区二区免费观在线| 久久新电视剧免费观看| 国产精品色哟哟网站| 一区二区三区四区激情 | 国产精品国产a级| 亚洲国产欧美另类丝袜| 免费成人美女在线观看.| 九色综合国产一区二区三区| 粉嫩高潮美女一区二区三区| 91麻豆视频网站| 日韩一区二区三区av| 久久综合狠狠综合| 亚洲欧美日韩国产成人精品影院 | 国产情人综合久久777777| 成人免费在线视频| 亚洲mv大片欧洲mv大片精品| 毛片基地黄久久久久久天堂| 国产精品一区在线| 欧美性大战久久久久久久蜜臀| 欧美大肚乱孕交hd孕妇| 欧美在线一二三四区| 精品少妇一区二区三区日产乱码 | 亚洲免费资源在线播放| 奇米影视一区二区三区| 99久免费精品视频在线观看| 欧美一区二区三区在线视频| 国产精品免费aⅴ片在线观看| 天天色天天操综合| av在线不卡电影| 欧美大片拔萝卜| 性做久久久久久久久| 成人免费视频一区| 日韩欧美美女一区二区三区| 一区二区三区在线看| 国产精品一区二区三区网站| 欧美日韩你懂得| 中文字幕人成不卡一区| 国产原创一区二区| 欧美二区在线观看| 亚洲已满18点击进入久久| 成人免费av资源| 精品粉嫩超白一线天av| 欧美激情中文字幕| 美日韩一区二区| www.成人在线| 精品国精品国产尤物美女| 亚洲成av人片在线观看无码| 99久久伊人久久99| 国产亚洲欧美色| 欧美日韩国产大片| 国产精品国产三级国产三级人妇| 久久99热99| 日韩欧美综合一区| 五月婷婷综合在线| 欧美日精品一区视频| 亚洲精品综合在线| 99热国产精品| 亚洲天天做日日做天天谢日日欢| 国产成人在线视频播放| 久久精品一区二区三区四区| 麻豆91在线观看| 亚洲精品一线二线三线无人区|