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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? pdc4030.c

?? ep9315平臺(tái)下硬盤驅(qū)動(dòng)的源碼
?? C
?? 第 1 頁 / 共 2 頁
字號(hào):
/*  -*- linux-c -*- *  linux/drivers/ide/legacy/pdc4030.c		Version 0.90  May 27, 1999 * *  Copyright (C) 1995-2002  Linus Torvalds & authors (see below) *//* *  Principal Author/Maintainer:  Peter Denison <promise@pnd-pc.demon.co.uk> * *  This file provides support for the second port and cache of Promise *  IDE interfaces, e.g. DC4030VL, DC4030VL-1 and DC4030VL-2. * *  Thanks are due to Mark Lord for advice and patiently answering stupid *  questions, and all those mugs^H^H^H^Hbrave souls who've tested this, *  especially Andre Hedrick. * *  Version 0.01	Initial version, #include'd in ide.c rather than *                      compiled separately. *                      Reads use Promise commands, writes as before. Drives *                      on second channel are read-only. *  Version 0.02        Writes working on second channel, reads on both *                      channels. Writes fail under high load. Suspect *			transfers of >127 sectors don't work. *  Version 0.03        Brought into line with ide.c version 5.27. *                      Other minor changes. *  Version 0.04        Updated for ide.c version 5.30 *                      Changed initialization strategy *  Version 0.05	Kernel integration.  -ml *  Version 0.06	Ooops. Add hwgroup to direct call of ide_intr() -ml *  Version 0.07	Added support for DC4030 variants *			Secondary interface autodetection *  Version 0.08	Renamed to pdc4030.c *  Version 0.09	Obsolete - never released - did manual write request *			splitting before max_sectors[major][minor] available. *  Version 0.10	Updated for 2.1 series of kernels *  Version 0.11	Updated for 2.3 series of kernels *			Autodetection code added. * *  Version 0.90	Transition to BETA code. No lost/unexpected interrupts *//* * Once you've compiled it in, you'll have to also enable the interface * setup routine from the kernel command line, as in  * *	'linux ide0=dc4030' or 'linux ide1=dc4030' * * It should now work as a second controller also ('ide1=dc4030') but only * if you DON'T have BIOS V4.44, which has a bug. If you have this version * and EPROM programming facilities, you need to fix 4 bytes: * 	2496:	81	81 *	2497:	3E	3E *	2498:	22	98	* *	2499:	06	05	* *	249A:	F0	F0 *	249B:	01	01 *	... *	24A7:	81	81 *	24A8:	3E	3E *	24A9:	22	98	* *	24AA:	06	05	* *	24AB:	70	70 *	24AC:	01	01 * * As of January 1999, Promise Technology Inc. have finally supplied me with * some technical information which has shed a glimmer of light on some of the * problems I was having, especially with writes.  * * There are still potential problems with the robustness and efficiency of * this driver because I still don't understand what the card is doing with * interrupts, however, it has been stable for a while with no reports of ill * effects. */#define DEBUG_READ#define DEBUG_WRITE#define __PROMISE_4030#include <linux/module.h>#include <linux/config.h>#include <linux/types.h>#include <linux/kernel.h>#include <linux/delay.h>#include <linux/timer.h>#include <linux/mm.h>#include <linux/ioport.h>#include <linux/blkdev.h>#include <linux/hdreg.h>#include <linux/ide.h>#include <linux/init.h>#include <asm/io.h>#include <asm/irq.h>#include "pdc4030.h"static ide_startstop_t promise_rw_disk (ide_drive_t *drive, struct request *rq, unsigned long block);/* * promise_selectproc() is invoked by ide.c * in preparation for access to the specified drive. */static void promise_selectproc (ide_drive_t *drive){	unsigned int number;	number = (HWIF(drive)->channel << 1) + drive->select.b.unit;	HWIF(drive)->OUTB(number, IDE_FEATURE_REG);}/* * pdc4030_cmd handles the set of vendor specific commands that are initiated * by command F0. They all have the same success/failure notification - * 'P' (=0x50) on success, 'p' (=0x70) on failure. */int pdc4030_cmd(ide_drive_t *drive, u8 cmd){	u32 timeout;	u8 status_val;	promise_selectproc(drive);	/* redundant? */	HWIF(drive)->OUTB(0xF3, IDE_SECTOR_REG);	HWIF(drive)->OUTB(cmd, IDE_SELECT_REG);	HWIF(drive)->OUTB(PROMISE_EXTENDED_COMMAND, IDE_COMMAND_REG);	timeout = HZ * 10;	timeout += jiffies;	do {		if(time_after(jiffies, timeout)) {			return 2; /* device timed out */		}		/* Delays at least 10ms to give interface a chance */		mdelay(10);		status_val = HWIF(drive)->INB(IDE_SECTOR_REG);	} while (status_val != 0x50 && status_val != 0x70);	if(status_val == 0x50)		return 0; /* device returned success */	else		return 1; /* device returned failure */}/* * pdc4030_identify sends a vendor-specific IDENTIFY command to the drive */int pdc4030_identify(ide_drive_t *drive){	return pdc4030_cmd(drive, PROMISE_IDENTIFY);}int enable_promise_support;/* * setup_pdc4030() * Completes the setup of a Promise DC4030 controller card, once found. */int __init setup_pdc4030(ide_hwif_t *hwif){        ide_drive_t *drive;	ide_hwif_t *hwif2;	struct dc_ident ident;	int i;	ide_startstop_t startstop;		if (!hwif) return 0;	drive = &hwif->drives[0];	hwif2 = &ide_hwifs[hwif->index+1];	if (hwif->chipset == ide_pdc4030) /* we've already been found ! */		return 1;	if (hwif->INB(IDE_NSECTOR_REG) == 0xFF ||	    hwif->INB(IDE_SECTOR_REG) == 0xFF) {		return 0;	}	if (IDE_CONTROL_REG)		hwif->OUTB(0x08, IDE_CONTROL_REG);	if (pdc4030_cmd(drive,PROMISE_GET_CONFIG)) {		return 0;	}	if (ide_wait_stat(&startstop, drive,DATA_READY,BAD_W_STAT,WAIT_DRQ)) {		printk(KERN_INFO			"%s: Failed Promise read config!\n",hwif->name);		return 0;	}	hwif->ata_input_data(drive, &ident, SECTOR_WORDS);	if (ident.id[1] != 'P' || ident.id[0] != 'T') {		return 0;	}	printk(KERN_INFO "%s: Promise caching controller, ",hwif->name);	switch(ident.type) {		case 0x43:	printk("DC4030VL-2, "); break;		case 0x41:	printk("DC4030VL-1, "); break;		case 0x40:	printk("DC4030VL, "); break;		default:			printk("unknown - type 0x%02x - please report!\n"			       ,ident.type);			printk("Please e-mail the following data to "			       "promise@pnd-pc.demon.co.uk along with\n"			       "a description of your card and drives:\n");			for (i=0; i < 0x90; i++) {				printk("%02x ", ((unsigned char *)&ident)[i]);				if ((i & 0x0f) == 0x0f) printk("\n");			}			return 0;	}	printk("%dKB cache, ",(int)ident.cache_mem);	switch(ident.irq) {            case 0x00: hwif->irq = 14; break;            case 0x01: hwif->irq = 12; break;            default:   hwif->irq = 15; break;	}	printk("on IRQ %d\n",hwif->irq);	/*	 * Once found and identified, we set up the next hwif in the array	 * (hwif2 = ide_hwifs[hwif->index+1]) with the same io ports, irq	 * and other settings as the main hwif. This gives us two "mated"	 * hwifs pointing to the Promise card.	 *	 * We also have to shift the default values for the remaining	 * interfaces "up by one" to make room for the second interface on the	 * same set of values.	 */	hwif->chipset	= hwif2->chipset = ide_pdc4030;	hwif->mate	= hwif2;	hwif2->mate	= hwif;	hwif2->channel	= 1;	hwif->rqsize	= hwif2->rqsize = 127;	hwif->addressing = hwif2->addressing = 1;	hwif->selectproc = hwif2->selectproc = &promise_selectproc;	hwif->serialized = hwif2->serialized = 1;	/* DC4030 hosted drives need their own identify... */	hwif->identify = hwif2->identify = &pdc4030_identify;	/* Shift the remaining interfaces up by one */	for (i=MAX_HWIFS-1 ; i > hwif->index+1 ; i--) {		ide_hwif_t *h = &ide_hwifs[i];#ifdef DEBUG		printk(KERN_DEBUG "pdc4030: Shifting i/f %d values to i/f %d\n",i-1,i);#endif /* DEBUG */		ide_init_hwif_ports(&h->hw, (h-1)->io_ports[IDE_DATA_OFFSET], 0, NULL);		memcpy(h->io_ports, h->hw.io_ports, sizeof(h->io_ports));		h->noprobe = (h-1)->noprobe;	}	ide_init_hwif_ports(&hwif2->hw, hwif->io_ports[IDE_DATA_OFFSET], 0, NULL);	memcpy(hwif2->io_ports, hwif->hw.io_ports, sizeof(hwif2->io_ports));	hwif2->irq = hwif->irq;	hwif2->hw.irq = hwif->hw.irq = hwif->irq;	for (i=0; i<2 ; i++) {		hwif->drives[i].io_32bit = 3;		hwif2->drives[i].io_32bit = 3;		hwif->drives[i].keep_settings = 1;		hwif2->drives[i].keep_settings = 1;		if (!ident.current_tm[i].cyl)			hwif->drives[i].noprobe = 1;		if (!ident.current_tm[i+2].cyl)			hwif2->drives[i].noprobe = 1;	}		/* Now override the normal ide disk read/write */	hwif->rw_disk = promise_rw_disk;	hwif2->rw_disk = promise_rw_disk;	#ifndef HWIF_PROBE_CLASSIC_METHOD	probe_hwif_init(&ide_hwifs[hwif->index]);	probe_hwif_init(&ide_hwifs[hwif2->index]);#endif /* HWIF_PROBE_CLASSIC_METHOD */        return 1;}/* * detect_pdc4030() * Tests for the presence of a DC4030 Promise card on this interface * Returns: 1 if found, 0 if not found */int __init detect_pdc4030(ide_hwif_t *hwif){	ide_drive_t *drive = &hwif->drives[0];	if (IDE_DATA_REG == 0) { /* Skip test for non-existent interface */		return 0;	}	hwif->OUTB(0xF3, IDE_SECTOR_REG);	hwif->OUTB(0x14, IDE_SELECT_REG);	hwif->OUTB(PROMISE_EXTENDED_COMMAND, IDE_COMMAND_REG);		ide_delay_50ms();	if (hwif->INB(IDE_ERROR_REG) == 'P' &&	    hwif->INB(IDE_NSECTOR_REG) == 'T' &&	    hwif->INB(IDE_SECTOR_REG) == 'I') {		return 1;	} else {		return 0;	}}#ifndef MODULEvoid __init ide_probe_for_pdc4030(void)#elseint ide_probe_for_pdc4030(void)#endif{	unsigned int	index;	ide_hwif_t	*hwif;#ifndef MODULE	if (enable_promise_support == 0)		return;#endif	for (index = 0; index < MAX_HWIFS; index++) {		hwif = &ide_hwifs[index];		if (hwif->chipset == ide_unknown && detect_pdc4030(hwif)) {#ifndef MODULE			setup_pdc4030(hwif);#else			return setup_pdc4030(hwif);#endif		}	}#ifdef MODULE	return 0;#endif}void __init release_pdc4030(ide_hwif_t *hwif, ide_hwif_t *mate){	hwif->chipset = ide_unknown;	hwif->selectproc = NULL;	hwif->serialized = 0;	hwif->drives[0].io_32bit = 0;	hwif->drives[1].io_32bit = 0;	hwif->drives[0].keep_settings = 0;	hwif->drives[1].keep_settings = 0;	hwif->drives[0].noprobe = 0;	hwif->drives[1].noprobe = 0;	if (mate != NULL) {		mate->chipset = ide_unknown;		mate->selectproc = NULL;		mate->serialized = 0;		mate->drives[0].io_32bit = 0;		mate->drives[1].io_32bit = 0;		mate->drives[0].keep_settings = 0;		mate->drives[1].keep_settings = 0;		mate->drives[0].noprobe = 0;		mate->drives[1].noprobe = 0;	}}#ifndef MODULE/* * init_pdc4030: * * called by ide.c when parsing command line */void __init init_pdc4030(void){	enable_promise_support = 1;}#elseMODULE_AUTHOR("Peter Denison");MODULE_DESCRIPTION("Support of Promise 4030 VLB series IDE chipsets");MODULE_LICENSE("GPL");int __init pdc4030_mod_init(void){	if (enable_promise_support == 0)		enable_promise_support = 1;	if (!ide_probe_for_pdc4030())		return -ENODEV;        return 0;}module_init(pdc4030_mod_init);void __init pdc4030_mod_exit(void){	unsigned int    index;	ide_hwif_t      *hwif;	if (enable_promise_support == 0)		return; 	for (index = 0; index < MAX_HWIFS; index++) {		hwif = &ide_hwifs[index];		if (hwif->chipset == ide_pdc4030) {			ide_hwif_t *mate = &ide_hwifs[hwif->index+1];			if (mate->chipset == ide_pdc4030)				release_pdc4030(hwif, mate);			else				release_pdc4030(hwif, NULL);                }        }	enable_promise_support = 0;}module_exit(pdc4030_mod_exit);#endif/* * promise_read_intr() is the handler for disk read/multread interrupts */static ide_startstop_t promise_read_intr (ide_drive_t *drive){	int total_remaining;	unsigned int sectors_left, sectors_avail, nsect;	struct request *rq;	ata_status_t status;#ifdef CONFIG_IDE_TASKFILE_IO	unsigned long flags;	char *to;#endif /* CONFIG_IDE_TASKFILE_IO */	status.all = HWIF(drive)->INB(IDE_STATUS_REG);	if (!OK_STAT(status.all, DATA_READY, BAD_R_STAT))		return DRIVER(drive)->error(drive,			"promise_read_intr", status.all);read_again:	do {		sectors_left = HWIF(drive)->INB(IDE_NSECTOR_REG);		HWIF(drive)->INB(IDE_SECTOR_REG);	} while (HWIF(drive)->INB(IDE_NSECTOR_REG) != sectors_left);	rq = HWGROUP(drive)->rq;	sectors_avail = rq->nr_sectors - sectors_left;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品免费久久| 婷婷久久综合九色综合绿巨人| 在线精品国精品国产尤物884a| 视频一区国产视频| 中文字幕亚洲综合久久菠萝蜜| 在线不卡一区二区| 99国产精品视频免费观看| 欧美aⅴ一区二区三区视频| 又紧又大又爽精品一区二区| 精品99一区二区三区| 欧美天天综合网| av午夜精品一区二区三区| 久久不见久久见免费视频1| 亚洲午夜国产一区99re久久| 国产精品美女久久久久久| 日韩亚洲国产中文字幕欧美| 在线视频一区二区三| 99国产精品视频免费观看| 国产精品综合在线视频| 美女看a上一区| 午夜在线成人av| 一级女性全黄久久生活片免费| 中文字幕第一页久久| 国产日韩一级二级三级| 精品国产乱码久久久久久老虎| 欧美丰满一区二区免费视频| 欧美亚日韩国产aⅴ精品中极品| 99国产一区二区三精品乱码| 国产91精品一区二区麻豆网站 | 亚洲另类色综合网站| 欧美国产日韩在线观看| 久久精品亚洲乱码伦伦中文| 欧美精品一区二区三区蜜臀| 欧美大片拔萝卜| 欧美一区二区久久久| 欧美二区在线观看| 制服丝袜国产精品| 在线不卡欧美精品一区二区三区| 欧美精品v国产精品v日韩精品| 在线免费观看日本一区| 一本到高清视频免费精品| 91日韩一区二区三区| 91污在线观看| 91国偷自产一区二区使用方法| 一本一道久久a久久精品综合蜜臀| 99热精品国产| 色999日韩国产欧美一区二区| 色吊一区二区三区| 欧美男女性生活在线直播观看| 欧美日韩一卡二卡三卡| 欧美福利电影网| 精品人在线二区三区| 国产校园另类小说区| 国产精品你懂的在线欣赏| 亚洲欧美日韩一区二区三区在线观看| 国产精品电影院| 亚洲国产日韩在线一区模特| 日韩av一级电影| 黑人巨大精品欧美黑白配亚洲| 国产成人亚洲精品狼色在线| 成人福利视频在线| 91国产免费看| 制服丝袜亚洲网站| 国产欧美精品一区二区色综合朱莉| 国产精品女人毛片| 亚洲一区二区五区| 久久精品二区亚洲w码| 高清不卡一二三区| 欧美亚洲综合网| 亚洲精品在线电影| 中文字幕制服丝袜一区二区三区 | 亚洲一线二线三线视频| 日本成人中文字幕| 国产sm精品调教视频网站| av一区二区三区| 在线91免费看| 久久精品免视看| 一区二区高清在线| 国产精品一二三区| 欧美性大战久久久久久久| 欧美精品一区二区三区蜜桃 | 97国产一区二区| 欧美一区二区在线看| 欧美国产1区2区| 亚洲a一区二区| 高潮精品一区videoshd| 精品视频1区2区| 中文幕一区二区三区久久蜜桃| 亚洲一区二区中文在线| 国产盗摄精品一区二区三区在线| 精品视频一区二区不卡| 国产日韩欧美精品电影三级在线| 午夜亚洲福利老司机| caoporn国产精品| 欧美成人免费网站| 亚洲一区二区偷拍精品| 成人深夜视频在线观看| 日韩欧美的一区| 亚洲第一二三四区| www.亚洲激情.com| 久久亚洲免费视频| 日韩综合一区二区| 色婷婷av一区二区三区大白胸| 久久久精品综合| 日韩中文字幕区一区有砖一区| 99免费精品视频| 久久久国产精品不卡| 日韩精品成人一区二区在线| 色婷婷av一区| 国产精品人妖ts系列视频| 九色|91porny| 91精品国产综合久久国产大片| 一区二区三区小说| 99re这里只有精品首页| 国产日产亚洲精品系列| 蓝色福利精品导航| 欧美一级高清大全免费观看| 亚洲国产aⅴ成人精品无吗| 99国产精品国产精品毛片| 欧美国产精品中文字幕| 国产盗摄一区二区| 国产视频一区在线观看| 韩国精品久久久| 精品精品欲导航| 蜜臀久久99精品久久久画质超高清 | 欧美亚洲动漫精品| 一区二区视频在线看| aaa欧美色吧激情视频| 国产精品私人影院| 成人丝袜高跟foot| 国产精品久久夜| 99久久99久久精品国产片果冻| 国产精品女主播av| av一区二区三区| 亚洲人xxxx| 欧美日韩精品一区二区在线播放| 国产不卡在线视频| 国产欧美精品国产国产专区| 国产精品系列在线播放| 国产日韩欧美高清| 不卡影院免费观看| 亚洲伦理在线精品| 欧亚一区二区三区| 免费观看成人鲁鲁鲁鲁鲁视频| 日韩精品中文字幕在线一区| 极品瑜伽女神91| 亚洲国产高清在线观看视频| 成人app软件下载大全免费| 亚洲欧美综合在线精品| 色婷婷亚洲综合| 偷偷要91色婷婷| 久久婷婷色综合| 99综合电影在线视频| 一区二区三区日本| 这里只有精品电影| 国产一区在线观看麻豆| 欧美国产成人在线| 欧美午夜理伦三级在线观看| 视频一区中文字幕国产| 精品美女一区二区三区| 粉嫩一区二区三区在线看| 亚洲免费观看在线视频| 欧美日韩午夜在线视频| 精品亚洲成av人在线观看| 国产精品乱子久久久久| 欧美三级三级三级爽爽爽| 久久99久久99小草精品免视看| 国产欧美一区二区三区鸳鸯浴| 一本久道中文字幕精品亚洲嫩| 午夜精品123| 中文字幕高清不卡| 精品视频999| 懂色av一区二区三区免费观看 | 亚洲一区在线观看视频| 欧美r级电影在线观看| 91在线观看污| 免费成人美女在线观看.| 国产精品免费视频网站| 欧美一区二区三区白人| 国产激情一区二区三区| 亚洲国产视频在线| 国产精品免费网站在线观看| 91精品国产一区二区三区香蕉| 成人午夜激情视频| 日韩黄色免费电影| 中文字幕中文字幕中文字幕亚洲无线| 欧美精品丝袜久久久中文字幕| 风间由美一区二区三区在线观看| 视频在线在亚洲| 亚洲天堂福利av| 久久综合网色—综合色88| 欧美在线999| 国产成a人亚洲| 日本女优在线视频一区二区| 亚洲四区在线观看| 国产欧美精品国产国产专区| 日韩丝袜美女视频| 欧美视频自拍偷拍| 99精品视频中文字幕| 国产成人精品一区二|