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

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

?? cmd640.c

?? ep9315平臺(tái)下硬盤驅(qū)動(dòng)的源碼
?? C
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
/* *  linux/drivers/ide/pci/cmd640.c		Version 1.02  Sep 01, 1996 * *  Copyright (C) 1995-1996  Linus Torvalds & authors (see below) *//* *  Original authors:	abramov@cecmow.enet.dec.com (Igor Abramov) *  			mlord@pobox.com (Mark Lord) * *  See linux/MAINTAINERS for address of current maintainer. * *  This file provides support for the advanced features and bugs *  of IDE interfaces using the CMD Technologies 0640 IDE interface chip. * *  These chips are basically fucked by design, and getting this driver *  to work on every motherboard design that uses this screwed chip seems *  bloody well impossible.  However, we're still trying. * *  Version 0.97 worked for everybody. * *  User feedback is essential.  Many thanks to the beta test team: * *  A.Hartgers@stud.tue.nl, JZDQC@CUNYVM.CUNY.edu, abramov@cecmow.enet.dec.com, *  bardj@utopia.ppp.sn.no, bart@gaga.tue.nl, bbol001@cs.auckland.ac.nz, *  chrisc@dbass.demon.co.uk, dalecki@namu26.Num.Math.Uni-Goettingen.de, *  derekn@vw.ece.cmu.edu, florian@btp2x3.phy.uni-bayreuth.de, *  flynn@dei.unipd.it, gadio@netvision.net.il, godzilla@futuris.net, *  j@pobox.com, jkemp1@mises.uni-paderborn.de, jtoppe@hiwaay.net, *  kerouac@ssnet.com, meskes@informatik.rwth-aachen.de, hzoli@cs.elte.hu, *  peter@udgaard.isgtec.com, phil@tazenda.demon.co.uk, roadcapw@cfw.com, *  s0033las@sun10.vsz.bme.hu, schaffer@tam.cornell.edu, sjd@slip.net, *  steve@ei.org, ulrpeg@bigcomm.gun.de, ism@tardis.ed.ac.uk, mack@cray.com *  liug@mama.indstate.edu, and others. * *  Version 0.01	Initial version, hacked out of ide.c, *			and #include'd rather than compiled separately. *			This will get cleaned up in a subsequent release. * *  Version 0.02	Fixes for vlb initialization code, enable prefetch *			for versions 'B' and 'C' of chip by default, *			some code cleanup. * *  Version 0.03	Added reset of secondary interface, *			and black list for devices which are not compatible *			with prefetch mode. Separate function for setting *			prefetch is added, possibly it will be called some *			day from ioctl processing code. * *  Version 0.04	Now configs/compiles separate from ide.c * *  Version 0.05	Major rewrite of interface timing code. *			Added new function cmd640_set_mode to set PIO mode *			from ioctl call. New drives added to black list. * *  Version 0.06	More code cleanup. Prefetch is enabled only for *			detected hard drives, not included in prefetch *			black list. * *  Version 0.07	Changed to more conservative drive tuning policy. *			Unknown drives, which report PIO < 4 are set to *			(reported_PIO - 1) if it is supported, or to PIO0. *			List of known drives extended by info provided by *			CMD at their ftp site. * *  Version 0.08	Added autotune/noautotune support. * *  Version 0.09	Try to be smarter about 2nd port enabling. *  Version 0.10	Be nice and don't reset 2nd port. *  Version 0.11	Try to handle more weird situations. * *  Version 0.12	Lots of bug fixes from Laszlo Peter *			irq unmasking disabled for reliability. *			try to be even smarter about the second port. *			tidy up source code formatting. *  Version 0.13	permit irq unmasking again. *  Version 0.90	massive code cleanup, some bugs fixed. *			defaults all drives to PIO mode0, prefetch off. *			autotune is OFF by default, with compile time flag. *			prefetch can be turned OFF/ON using "hdparm -p8/-p9" *			 (requires hdparm-3.1 or newer) *  Version 0.91	first release to linux-kernel list. *  Version 0.92	move initial reg dump to separate callable function *			change "readahead" to "prefetch" to avoid confusion *  Version 0.95	respect original BIOS timings unless autotuning. *			tons of code cleanup and rearrangement. *			added CONFIG_BLK_DEV_CMD640_ENHANCED option *			prevent use of unmask when prefetch is on *  Version 0.96	prevent use of io_32bit when prefetch is off *  Version 0.97	fix VLB secondary interface for sjd@slip.net *			other minor tune-ups:  0.96 was very good. *  Version 0.98	ignore PCI version when disabled by BIOS *  Version 0.99	display setup/active/recovery clocks with PIO mode *  Version 1.00	Mmm.. cannot depend on PCMD_ENA in all systems *  Version 1.01	slow/fast devsel can be selected with "hdparm -p6/-p7" *			 ("fast" is necessary for 32bit I/O in some systems) *  Version 1.02	fix bug that resulted in slow "setup times" *			 (patch courtesy of Zoltan Hidvegi) */#undef REALLY_SLOW_IO		/* most systems can safely undef this */#define CMD640_PREFETCH_MASKS 1#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 "ide_modes.h"/* * This flag is set in ide.c by the parameter:  ide0=cmd640_vlb */int cmd640_vlb = 0;/* * CMD640 specific registers definition. */#define VID		0x00#define DID		0x02#define PCMD		0x04#define   PCMD_ENA	0x01#define PSTTS		0x06#define REVID		0x08#define PROGIF		0x09#define SUBCL		0x0a#define BASCL		0x0b#define BaseA0		0x10#define BaseA1		0x14#define BaseA2		0x18#define BaseA3		0x1c#define INTLINE		0x3c#define INPINE		0x3d#define	CFR		0x50#define   CFR_DEVREV		0x03#define   CFR_IDE01INTR		0x04#define	  CFR_DEVID		0x18#define	  CFR_AT_VESA_078h	0x20#define	  CFR_DSA1		0x40#define	  CFR_DSA0		0x80#define CNTRL		0x51#define	  CNTRL_DIS_RA0		0x40#define   CNTRL_DIS_RA1		0x80#define	  CNTRL_ENA_2ND		0x08#define	CMDTIM		0x52#define	ARTTIM0		0x53#define	DRWTIM0		0x54#define ARTTIM1 	0x55#define DRWTIM1		0x56#define ARTTIM23	0x57#define   ARTTIM23_DIS_RA2	0x04#define   ARTTIM23_DIS_RA3	0x08#define DRWTIM23	0x58#define BRST		0x59/* * Registers and masks for easy access by drive index: */static u8 prefetch_regs[4]  = {CNTRL, CNTRL, ARTTIM23, ARTTIM23};static u8 prefetch_masks[4] = {CNTRL_DIS_RA0, CNTRL_DIS_RA1, ARTTIM23_DIS_RA2, ARTTIM23_DIS_RA3};#ifdef CONFIG_BLK_DEV_CMD640_ENHANCEDstatic u8 arttim_regs[4] = {ARTTIM0, ARTTIM1, ARTTIM23, ARTTIM23};static u8 drwtim_regs[4] = {DRWTIM0, DRWTIM1, DRWTIM23, DRWTIM23};/* * Current cmd640 timing values for each drive. * The defaults for each are the slowest possible timings. */static u8 setup_counts[4]    = {4, 4, 4, 4};     /* Address setup count (in clocks) */static u8 active_counts[4]   = {16, 16, 16, 16}; /* Active count   (encoded) */static u8 recovery_counts[4] = {16, 16, 16, 16}; /* Recovery count (encoded) */#endif /* CONFIG_BLK_DEV_CMD640_ENHANCED *//* * These are initialized to point at the devices we control */static ide_hwif_t  *cmd_hwif0, *cmd_hwif1;static ide_drive_t *cmd_drives[4];/* * Interface to access cmd640x registers */static unsigned int cmd640_key;static void (*__put_cmd640_reg)(u16 reg, u8 val);static u8 (*__get_cmd640_reg)(u16 reg);/* * This is read from the CFR reg, and is used in several places. */static unsigned int cmd640_chip_version;/* * The CMD640x chip does not support DWORD config write cycles, but some * of the BIOSes use them to implement the config services. * Therefore, we must use direct IO instead. *//* PCI method 1 access */static void put_cmd640_reg_pci1 (u16 reg, u8 val){	outb_p((reg & 0xfc) | cmd640_key, 0xcf8);	outb_p(val, (reg & 3) | 0xcfc);}static u8 get_cmd640_reg_pci1 (u16 reg){	outb_p((reg & 0xfc) | cmd640_key, 0xcf8);	return inb_p((reg & 3) | 0xcfc);}/* PCI method 2 access (from CMD datasheet) */static void put_cmd640_reg_pci2 (u16 reg, u8 val){	outb_p(0x10, 0xcf8);	outb_p(val, cmd640_key + reg);	outb_p(0, 0xcf8);}static u8 get_cmd640_reg_pci2 (u16 reg){	u8 b;	outb_p(0x10, 0xcf8);	b = inb_p(cmd640_key + reg);	outb_p(0, 0xcf8);	return b;}/* VLB access */static void put_cmd640_reg_vlb (u16 reg, u8 val){	outb_p(reg, cmd640_key);	outb_p(val, cmd640_key + 4);}static u8 get_cmd640_reg_vlb (u16 reg){	outb_p(reg, cmd640_key);	return inb_p(cmd640_key + 4);}static u8 get_cmd640_reg(u16 reg){	u8 b;	unsigned long flags;	spin_lock_irqsave(&ide_lock, flags);	b = __get_cmd640_reg(reg);	spin_unlock_irqrestore(&ide_lock, flags);	return b;}static void put_cmd640_reg(u16 reg, u8 val){	unsigned long flags;	spin_lock_irqsave(&ide_lock, flags);	__put_cmd640_reg(reg,val);	spin_unlock_irqrestore(&ide_lock, flags);}static int __init match_pci_cmd640_device (void){	const u8 ven_dev[4] = {0x95, 0x10, 0x40, 0x06};	unsigned int i;	for (i = 0; i < 4; i++) {		if (get_cmd640_reg(i) != ven_dev[i])			return 0;	}#ifdef STUPIDLY_TRUST_BROKEN_PCMD_ENA_BIT	if ((get_cmd640_reg(PCMD) & PCMD_ENA) == 0) {		printk("ide: cmd640 on PCI disabled by BIOS\n");		return 0;	}#endif /* STUPIDLY_TRUST_BROKEN_PCMD_ENA_BIT */	return 1; /* success */}/* * Probe for CMD640x -- pci method 1 */static int __init probe_for_cmd640_pci1 (void){	__get_cmd640_reg = get_cmd640_reg_pci1;	__put_cmd640_reg = put_cmd640_reg_pci1;	for (cmd640_key = 0x80000000;	     cmd640_key <= 0x8000f800;	     cmd640_key += 0x800) {		if (match_pci_cmd640_device())			return 1; /* success */	}	return 0;}/* * Probe for CMD640x -- pci method 2 */static int __init probe_for_cmd640_pci2 (void){	__get_cmd640_reg = get_cmd640_reg_pci2;	__put_cmd640_reg = put_cmd640_reg_pci2;	for (cmd640_key = 0xc000; cmd640_key <= 0xcf00; cmd640_key += 0x100) {		if (match_pci_cmd640_device())			return 1; /* success */	}	return 0;}/* * Probe for CMD640x -- vlb */static int __init probe_for_cmd640_vlb (void){	u8 b;	__get_cmd640_reg = get_cmd640_reg_vlb;	__put_cmd640_reg = put_cmd640_reg_vlb;	cmd640_key = 0x178;	b = get_cmd640_reg(CFR);	if (b == 0xff || b == 0x00 || (b & CFR_AT_VESA_078h)) {		cmd640_key = 0x78;		b = get_cmd640_reg(CFR);		if (b == 0xff || b == 0x00 || !(b & CFR_AT_VESA_078h))			return 0;	}	return 1; /* success */}/* *  Returns 1 if an IDE interface/drive exists at 0x170, *  Returns 0 otherwise. */static int __init secondary_port_responding (void){	unsigned long flags;	spin_lock_irqsave(&ide_lock, flags);	outb_p(0x0a, 0x170 + IDE_SELECT_OFFSET);	/* select drive0 */	udelay(100);	if ((inb_p(0x170 + IDE_SELECT_OFFSET) & 0x1f) != 0x0a) {		outb_p(0x1a, 0x170 + IDE_SELECT_OFFSET); /* select drive1 */		udelay(100);		if ((inb_p(0x170 + IDE_SELECT_OFFSET) & 0x1f) != 0x1a) {			spin_unlock_irqrestore(&ide_lock, flags);			return 0; /* nothing responded */		}	}	spin_unlock_irqrestore(&ide_lock, flags);	return 1; /* success */}#ifdef CMD640_DUMP_REGS/* * Dump out all cmd640 registers.  May be called from ide.c */static void cmd640_dump_regs (void){	unsigned int reg = cmd640_vlb ? 0x50 : 0x00;	/* Dump current state of chip registers */	printk("ide: cmd640 internal register dump:");	for (; reg <= 0x59; reg++) {		if (!(reg & 0x0f))			printk("\n%04x:", reg);		printk(" %02x", get_cmd640_reg(reg));	}	printk("\n");}#endif/* * Check whether prefetch is on for a drive, * and initialize the unmask flags for safe operation. */static void __init check_prefetch (unsigned int index){	ide_drive_t *drive = cmd_drives[index];	u8 b = get_cmd640_reg(prefetch_regs[index]);	if (b & prefetch_masks[index]) {	/* is prefetch off? */		drive->no_unmask = 0;		drive->no_io_32bit = 1;		drive->io_32bit = 0;	} else {#if CMD640_PREFETCH_MASKS		drive->no_unmask = 1;		drive->unmask = 0;#endif		drive->no_io_32bit = 0;	}}/* * Figure out which devices we control */static void __init setup_device_ptrs (void){	unsigned int i;	cmd_hwif0 = &ide_hwifs[0]; /* default, if not found below */	cmd_hwif1 = &ide_hwifs[1]; /* default, if not found below */	for (i = 0; i < MAX_HWIFS; i++) {		ide_hwif_t *hwif = &ide_hwifs[i];		if (hwif->chipset == ide_unknown || hwif->chipset == ide_generic) {			if (hwif->io_ports[IDE_DATA_OFFSET] == 0x1f0)				cmd_hwif0 = hwif;			else if (hwif->io_ports[IDE_DATA_OFFSET] == 0x170)				cmd_hwif1 = hwif;		}	}	cmd_drives[0] = &cmd_hwif0->drives[0];	cmd_drives[1] = &cmd_hwif0->drives[1];	cmd_drives[2] = &cmd_hwif1->drives[0];	cmd_drives[3] = &cmd_hwif1->drives[1];}#ifdef CONFIG_BLK_DEV_CMD640_ENHANCED/* * Sets prefetch mode for a drive.

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲日穴在线视频| 激情综合五月天| 狠狠色丁香久久婷婷综合_中| 欧美在线三级电影| 亚洲视频在线观看三级| 日韩欧美国产wwwww| 蜜臂av日日欢夜夜爽一区| 欧美日韩小视频| 亚洲超碰精品一区二区| 色哦色哦哦色天天综合| 亚洲欧美日韩国产手机在线| 91麻豆福利精品推荐| 一区二区三区四区视频精品免费| 91欧美激情一区二区三区成人| 精品在线亚洲视频| 婷婷综合五月天| 精品国产百合女同互慰| 国产精品一区二区黑丝| 日本一区二区在线不卡| 成人激情动漫在线观看| 夜夜嗨av一区二区三区中文字幕| 国产欧美一区二区三区在线老狼| 91精品国产高清一区二区三区| 老司机午夜精品| 日韩一区欧美小说| 91精品黄色片免费大全| 国产一区二区不卡老阿姨| 亚洲欧洲www| 亚洲国产精品激情在线观看| 在线免费不卡视频| 一本大道综合伊人精品热热| 丰满放荡岳乱妇91ww| 亚洲一区二区五区| 久久婷婷国产综合精品青草| av一区二区三区四区| 日韩高清电影一区| 中文天堂在线一区| 欧美一区二区三区色| 欧美二区在线观看| 91麻豆文化传媒在线观看| 成av人片一区二区| 暴力调教一区二区三区| 成人av午夜电影| 91丝袜美女网| 日本精品视频一区二区| 国产精品77777竹菊影视小说| 国内外成人在线| 国产成人高清视频| 蜜桃视频一区二区三区在线观看| 性感美女极品91精品| 日韩有码一区二区三区| 一区二区三区国产精华| 亚洲一级二级在线| 天堂成人国产精品一区| 日本不卡的三区四区五区| 日韩伦理电影网| 亚洲午夜久久久久久久久久久| 久久精品一区二区三区不卡| 欧美欧美欧美欧美| 色综合天天综合狠狠| 国产精品一区免费视频| 粗大黑人巨茎大战欧美成人| 精品一区精品二区高清| 国产成人在线视频网站| 91亚洲精品一区二区乱码| 在线观看欧美精品| 日韩三区在线观看| 欧美高清你懂得| 久久中文字幕电影| 亚洲三级在线观看| 秋霞影院一区二区| 国产二区国产一区在线观看| 91在线精品一区二区| 成人三级伦理片| 欧美综合久久久| 欧美不卡激情三级在线观看| 欧美精品 国产精品| 国产喂奶挤奶一区二区三区| 亚洲欧洲在线观看av| 亚洲成人在线观看视频| 国产在线观看免费一区| 色偷偷久久一区二区三区| 日韩一级黄色片| 亚洲色图一区二区| 蜜臀av一区二区在线观看| 成人av集中营| 欧美大片在线观看一区二区| 国产精品日韩精品欧美在线| 五月婷婷综合激情| 高清国产午夜精品久久久久久| 在线亚洲一区观看| 国产午夜精品久久久久久久 | 国产精品国产三级国产有无不卡 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 男女男精品视频网| 播五月开心婷婷综合| 日韩一区二区电影网| 亚洲天堂精品视频| 极品美女销魂一区二区三区免费| 91麻豆6部合集magnet| 2022国产精品视频| 日韩黄色小视频| 色成人在线视频| 国产日韩av一区二区| 蜜桃视频一区二区三区在线观看| 色呦呦网站一区| 国产农村妇女精品| 免费高清不卡av| 欧美日韩成人在线一区| 亚洲欧美日韩在线| 国产精品888| 精品电影一区二区| 三级在线观看一区二区| 在线亚洲人成电影网站色www| 久久久久久久久伊人| 亚洲天堂福利av| 成人中文字幕电影| 久久影音资源网| 另类小说色综合网站| 91精品国产福利在线观看| 亚洲va中文字幕| 色综合天天综合网天天看片| 国产精品成人免费精品自在线观看| 国内不卡的二区三区中文字幕| 91 com成人网| 天堂av在线一区| 欧美电影在线免费观看| 一级做a爱片久久| 色94色欧美sute亚洲线路二| 中文字幕一区二区三区av| 成人高清免费观看| 欧美国产激情一区二区三区蜜月| 国产一区在线观看视频| 欧美成人国产一区二区| 麻豆精品精品国产自在97香蕉| 欧美一级理论片| 日本网站在线观看一区二区三区 | 国产精品888| 国产午夜精品一区二区三区视频| 国产真实乱子伦精品视频| 2023国产一二三区日本精品2022| 国产在线精品一区二区三区不卡 | 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 中文字幕在线观看不卡视频| 91同城在线观看| 亚洲黄色免费网站| 国产精品一区二区你懂的| 久久一日本道色综合| 国产成人自拍网| 亚洲欧洲日本在线| 日本二三区不卡| 婷婷久久综合九色综合伊人色| 欧美日韩久久一区| 蜜臀精品一区二区三区在线观看| 欧美一区二区高清| 久久国产精品99久久人人澡| 久久先锋影音av鲁色资源网| 成人免费电影视频| 亚洲精品日韩一| 欧美男男青年gay1069videost| 强制捆绑调教一区二区| 久久久99久久| 色婷婷av久久久久久久| 蜜桃久久久久久| 国产精品网站在线播放| 欧美综合亚洲图片综合区| 日本不卡一区二区三区| 337p日本欧洲亚洲大胆色噜噜| 国产精品18久久久| 亚洲激情第一区| 日韩一区二区在线观看视频播放 | 欧美日韩国产a| 精品一区免费av| 椎名由奈av一区二区三区| 欧美另类z0zxhd电影| 国产精品资源在线| 亚洲精品国产一区二区精华液| 欧美一级欧美三级在线观看| 国产高清在线观看免费不卡| 亚洲久本草在线中文字幕| 日韩美一区二区三区| 成人激情校园春色| 男女男精品视频网| 国产精品国产精品国产专区不片| 精品视频一区二区不卡| 国产成人亚洲综合a∨婷婷| 亚洲成人动漫一区| 国产欧美一区二区精品忘忧草 | 一区二区三区在线影院| 精品美女一区二区三区| 色综合视频一区二区三区高清| 蜜臀av一级做a爰片久久| 亚洲精品美国一| 国产欧美一区二区精品性色| 3d动漫精品啪啪一区二区竹菊| 成人av在线资源| 激情综合一区二区三区| 亚洲国产成人av好男人在线观看| 国产亚洲欧美激情| 欧美va亚洲va香蕉在线|