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

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

?? eeprom.c

?? MIZI Research, Inc.發(fā)布的嵌入式Linux內(nèi)核源碼
?? C
字號(hào):
/*	drivers/net/tulip/eeprom.c	Maintained by Jeff Garzik <jgarzik@mandrakesoft.com>	Copyright 2000,2001  The Linux Kernel Team	Written/copyright 1994-2001 by Donald Becker.	This software may be used and distributed according to the terms	of the GNU General Public License, incorporated herein by reference.	Please refer to Documentation/DocBook/tulip.{pdf,ps,html}	for more information on this driver, or visit the project	Web page at http://sourceforge.net/projects/tulip/*/#include "tulip.h"#include <linux/init.h>#include <asm/unaligned.h>/* Serial EEPROM section. *//* The main routine to parse the very complicated SROM structure.   Search www.digital.com for "21X4 SROM" to get details.   This code is very complex, and will require changes to support   additional cards, so I'll be verbose about what is going on.   *//* Known cards that have old-style EEPROMs. */static struct eeprom_fixup eeprom_fixups[] __devinitdata = {  {"Asante", 0, 0, 0x94, {0x1e00, 0x0000, 0x0800, 0x0100, 0x018c,			  0x0000, 0x0000, 0xe078, 0x0001, 0x0050, 0x0018 }},  {"SMC9332DST", 0, 0, 0xC0, { 0x1e00, 0x0000, 0x0800, 0x041f,			   0x0000, 0x009E, /* 10baseT */			   0x0004, 0x009E, /* 10baseT-FD */			   0x0903, 0x006D, /* 100baseTx */			   0x0905, 0x006D, /* 100baseTx-FD */ }},  {"Cogent EM100", 0, 0, 0x92, { 0x1e00, 0x0000, 0x0800, 0x063f,				 0x0107, 0x8021, /* 100baseFx */				 0x0108, 0x8021, /* 100baseFx-FD */				 0x0100, 0x009E, /* 10baseT */				 0x0104, 0x009E, /* 10baseT-FD */				 0x0103, 0x006D, /* 100baseTx */				 0x0105, 0x006D, /* 100baseTx-FD */ }},  {"Maxtech NX-110", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x0513,				   0x1001, 0x009E, /* 10base2, CSR12 0x10*/				   0x0000, 0x009E, /* 10baseT */				   0x0004, 0x009E, /* 10baseT-FD */				   0x0303, 0x006D, /* 100baseTx, CSR12 0x03 */				   0x0305, 0x006D, /* 100baseTx-FD CSR12 0x03 */}},  {"Accton EN1207", 0, 0, 0xE8, { 0x1e00, 0x0000, 0x0800, 0x051F,				  0x1B01, 0x0000, /* 10base2,   CSR12 0x1B */				  0x0B00, 0x009E, /* 10baseT,   CSR12 0x0B */				  0x0B04, 0x009E, /* 10baseT-FD,CSR12 0x0B */				  0x1B03, 0x006D, /* 100baseTx, CSR12 0x1B */				  0x1B05, 0x006D, /* 100baseTx-FD CSR12 0x1B */   }},  {"NetWinder", 0x00, 0x10, 0x57,	/* Default media = MII	 * MII block, reset sequence (3) = 0x0821 0x0000 0x0001, capabilities 0x01e1	 */	{ 0x1e00, 0x0000, 0x000b, 0x8f01, 0x0103, 0x0300, 0x0821, 0x000, 0x0001, 0x0000, 0x01e1 }  },  {0, 0, 0, 0, {}}};static const char *block_name[] __devinitdata = {	"21140 non-MII",	"21140 MII PHY",	"21142 Serial PHY",	"21142 MII PHY",	"21143 SYM PHY",	"21143 reset method"};void __devinit tulip_parse_eeprom(struct net_device *dev){	/* The last media info list parsed, for multiport boards.  */	static struct mediatable *last_mediatable;	static unsigned char *last_ee_data;	static int controller_index;	struct tulip_private *tp = (struct tulip_private *)dev->priv;	unsigned char *ee_data = tp->eeprom;	int i;	tp->mtable = 0;	/* Detect an old-style (SA only) EEPROM layout:	   memcmp(eedata, eedata+16, 8). */	for (i = 0; i < 8; i ++)		if (ee_data[i] != ee_data[16+i])			break;	if (i >= 8) {		if (ee_data[0] == 0xff) {			if (last_mediatable) {				controller_index++;				printk(KERN_INFO "%s:  Controller %d of multiport board.\n",					   dev->name, controller_index);				tp->mtable = last_mediatable;				ee_data = last_ee_data;				goto subsequent_board;			} else				printk(KERN_INFO "%s:  Missing EEPROM, this interface may "					   "not work correctly!\n",			   dev->name);			return;		}	  /* Do a fix-up based on the vendor half of the station address prefix. */	  for (i = 0; eeprom_fixups[i].name; i++) {		if (dev->dev_addr[0] == eeprom_fixups[i].addr0			&&  dev->dev_addr[1] == eeprom_fixups[i].addr1			&&  dev->dev_addr[2] == eeprom_fixups[i].addr2) {		  if (dev->dev_addr[2] == 0xE8  &&  ee_data[0x1a] == 0x55)			  i++;			/* An Accton EN1207, not an outlaw Maxtech. */		  memcpy(ee_data + 26, eeprom_fixups[i].newtable,				 sizeof(eeprom_fixups[i].newtable));		  printk(KERN_INFO "%s: Old format EEPROM on '%s' board.  Using"				 " substitute media control info.\n",				 dev->name, eeprom_fixups[i].name);		  break;		}	  }	  if (eeprom_fixups[i].name == NULL) { /* No fixup found. */		  printk(KERN_INFO "%s: Old style EEPROM with no media selection "				 "information.\n",			   dev->name);		return;	  }	}	controller_index = 0;	if (ee_data[19] > 1) {		/* Multiport board. */		last_ee_data = ee_data;	}subsequent_board:	if (ee_data[27] == 0) {		/* No valid media table. */	} else if (tp->chip_id == DC21041) {		unsigned char *p = (void *)ee_data + ee_data[27 + controller_index*3];		int media = get_u16(p);		int count = p[2];		p += 3;		printk(KERN_INFO "%s: 21041 Media table, default media %4.4x (%s).\n",			   dev->name, media,			   media & 0x0800 ? "Autosense" : medianame[media & MEDIA_MASK]);		for (i = 0; i < count; i++) {			unsigned char media_block = *p++;			int media_code = media_block & MEDIA_MASK;			if (media_block & 0x40)				p += 6;			printk(KERN_INFO "%s:  21041 media #%d, %s.\n",				   dev->name, media_code, medianame[media_code]);		}	} else {		unsigned char *p = (void *)ee_data + ee_data[27];		unsigned char csr12dir = 0;		int count, new_advertise = 0;		struct mediatable *mtable;		u16 media = get_u16(p);		p += 2;		if (tp->flags & CSR12_IN_SROM)			csr12dir = *p++;		count = *p++;	        /* there is no phy information, don't even try to build mtable */	        if (count == 0) {			if (tulip_debug > 0)				printk(KERN_WARNING "%s: no phy info, aborting mtable build\n", dev->name);		        return;		}		mtable = (struct mediatable *)			kmalloc(sizeof(struct mediatable) + count*sizeof(struct medialeaf),					GFP_KERNEL);		if (mtable == NULL)			return;				/* Horrible, impossible failure. */		last_mediatable = tp->mtable = mtable;		mtable->defaultmedia = media;		mtable->leafcount = count;		mtable->csr12dir = csr12dir;		mtable->has_nonmii = mtable->has_mii = mtable->has_reset = 0;		mtable->csr15dir = mtable->csr15val = 0;		printk(KERN_INFO "%s:  EEPROM default media type %s.\n", dev->name,			   media & 0x0800 ? "Autosense" : medianame[media & MEDIA_MASK]);		for (i = 0; i < count; i++) {			struct medialeaf *leaf = &mtable->mleaf[i];			if ((p[0] & 0x80) == 0) { /* 21140 Compact block. */				leaf->type = 0;				leaf->media = p[0] & 0x3f;				leaf->leafdata = p;				if ((p[2] & 0x61) == 0x01)	/* Bogus, but Znyx boards do it. */					mtable->has_mii = 1;				p += 4;			} else {				leaf->type = p[1];				if (p[1] == 0x05) {					mtable->has_reset = i;					leaf->media = p[2] & 0x0f;				} else if (tp->chip_id == DM910X && p[1] == 0x80) {					/* Hack to ignore Davicom delay period block */					mtable->leafcount--;					count--;					i--;					leaf->leafdata = p + 2;					p += (p[0] & 0x3f) + 1;					continue;				} else if (p[1] & 1) {					int gpr_len, reset_len;					mtable->has_mii = 1;					leaf->media = 11;					gpr_len=p[3]*2;					reset_len=p[4+gpr_len]*2;					new_advertise |= get_u16(&p[7+gpr_len+reset_len]);				} else {					mtable->has_nonmii = 1;					leaf->media = p[2] & MEDIA_MASK;					/* Davicom's media number for 100BaseTX is strange */					if (tp->chip_id == DM910X && leaf->media == 1)						leaf->media = 3;					switch (leaf->media) {					case 0: new_advertise |= 0x0020; break;					case 4: new_advertise |= 0x0040; break;					case 3: new_advertise |= 0x0080; break;					case 5: new_advertise |= 0x0100; break;					case 6: new_advertise |= 0x0200; break;					}					if (p[1] == 2  &&  leaf->media == 0) {						if (p[2] & 0x40) {							u32 base15 = get_unaligned((u16*)&p[7]);							mtable->csr15dir =								(get_unaligned((u16*)&p[9])<<16) + base15;							mtable->csr15val =								(get_unaligned((u16*)&p[11])<<16) + base15;						} else {							mtable->csr15dir = get_unaligned((u16*)&p[3])<<16;							mtable->csr15val = get_unaligned((u16*)&p[5])<<16;						}					}				}				leaf->leafdata = p + 2;				p += (p[0] & 0x3f) + 1;			}			if (tulip_debug > 1  &&  leaf->media == 11) {				unsigned char *bp = leaf->leafdata;				printk(KERN_INFO "%s:  MII interface PHY %d, setup/reset "					   "sequences %d/%d long, capabilities %2.2x %2.2x.\n",					   dev->name, bp[0], bp[1], bp[2 + bp[1]*2],					   bp[5 + bp[2 + bp[1]*2]*2], bp[4 + bp[2 + bp[1]*2]*2]);			}			printk(KERN_INFO "%s:  Index #%d - Media %s (#%d) described "				   "by a %s (%d) block.\n",				   dev->name, i, medianame[leaf->media & 15], leaf->media,				   leaf->type < ARRAY_SIZE(block_name) ? block_name[leaf->type] : "<unknown>",				   leaf->type);		}		if (new_advertise)			tp->sym_advertise = new_advertise;	}}/* Reading a serial EEPROM is a "bit" grungy, but we work our way through:->.*//*  EEPROM_Ctrl bits. */#define EE_SHIFT_CLK	0x02	/* EEPROM shift clock. */#define EE_CS			0x01	/* EEPROM chip select. */#define EE_DATA_WRITE	0x04	/* Data from the Tulip to EEPROM. */#define EE_WRITE_0		0x01#define EE_WRITE_1		0x05#define EE_DATA_READ	0x08	/* Data from the EEPROM chip. */#define EE_ENB			(0x4800 | EE_CS)/* Delay between EEPROM clock transitions.   Even at 33Mhz current PCI implementations don't overrun the EEPROM clock.   We add a bus turn-around to insure that this remains true. */#define eeprom_delay()	inl(ee_addr)/* The EEPROM commands include the alway-set leading bit. */#define EE_READ_CMD		(6)/* Note: this routine returns extra data bits for size detection. */int __devinit tulip_read_eeprom(long ioaddr, int location, int addr_len){	int i;	unsigned retval = 0;	long ee_addr = ioaddr + CSR9;	int read_cmd = location | (EE_READ_CMD << addr_len);	outl(EE_ENB & ~EE_CS, ee_addr);	outl(EE_ENB, ee_addr);	/* Shift the read command bits out. */	for (i = 4 + addr_len; i >= 0; i--) {		short dataval = (read_cmd & (1 << i)) ? EE_DATA_WRITE : 0;		outl(EE_ENB | dataval, ee_addr);		eeprom_delay();		outl(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);		eeprom_delay();		retval = (retval << 1) | ((inl(ee_addr) & EE_DATA_READ) ? 1 : 0);	}	outl(EE_ENB, ee_addr);	eeprom_delay();	for (i = 16; i > 0; i--) {		outl(EE_ENB | EE_SHIFT_CLK, ee_addr);		eeprom_delay();		retval = (retval << 1) | ((inl(ee_addr) & EE_DATA_READ) ? 1 : 0);		outl(EE_ENB, ee_addr);		eeprom_delay();	}	/* Terminate the EEPROM access. */	outl(EE_ENB & ~EE_CS, ee_addr);	return retval;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品一区二区久久| 国产色91在线| 亚洲一区在线视频| 欧美三级日韩在线| 免费在线观看日韩欧美| 久久婷婷国产综合国色天香| 国模大尺度一区二区三区| 国产欧美日本一区二区三区| 懂色av中文一区二区三区| 亚洲欧美视频在线观看视频| 欧洲在线/亚洲| 蜜桃av一区二区| 欧美高清在线精品一区| 91香蕉视频黄| 经典一区二区三区| 亚洲同性gay激情无套| 欧美猛男gaygay网站| 精品一区二区在线视频| 国产精品伦一区| 欧美日韩免费一区二区三区视频 | 久久影院电视剧免费观看| 国产ts人妖一区二区| 亚洲最快最全在线视频| 久久视频一区二区| 欧美伦理影视网| 91丨porny丨在线| 久久99久久久久久久久久久| 亚洲人成网站色在线观看| 日韩美一区二区三区| 欧美日韩久久不卡| 91最新地址在线播放| 国产精一区二区三区| 久久99国产精品久久| 国产亚洲精品bt天堂精选| 99久久婷婷国产综合精品| 综合网在线视频| 欧美日韩综合不卡| 蜜桃视频在线一区| 欧美国产97人人爽人人喊| 日韩一区二区三区在线观看| 亚洲乱码日产精品bd| 久久久精品国产99久久精品芒果| 国产成人综合亚洲网站| 亚洲一区二区三区四区在线| 日韩一区二区在线观看视频播放| 亚洲成av人片一区二区三区| 亚洲va韩国va欧美va精品| 欧美日韩国产电影| 国产伦理精品不卡| 亚洲精品日产精品乱码不卡| 日韩精品一区二区三区视频播放 | 99国内精品久久| 成人97人人超碰人人99| 成人免费av在线| 欧美性极品少妇| 精品噜噜噜噜久久久久久久久试看| 欧美日韩成人激情| 欧美一级久久久| 欧美激情一区三区| 亚洲精品美国一| 免费观看日韩av| 国产不卡一区视频| 91一区一区三区| 精品免费视频.| 亚洲婷婷在线视频| 五月激情综合网| 成人久久久精品乱码一区二区三区| av在线一区二区三区| 欧美日韩国产另类一区| 欧美高清在线精品一区| 亚洲国产欧美另类丝袜| 国产乱子伦一区二区三区国色天香 | 亚洲已满18点击进入久久| 久久99精品久久久久久国产越南| 波多野洁衣一区| 精品1区2区在线观看| 亚洲欧美一区二区久久 | 色嗨嗨av一区二区三区| 亚洲精品在线电影| 亚洲国产精品久久人人爱| 丁香五精品蜜臀久久久久99网站| 欧美网站大全在线观看| 亚洲老妇xxxxxx| 91色乱码一区二区三区| 欧美国产日韩在线观看| 国产一区二区不卡老阿姨| 欧美va天堂va视频va在线| 奇米精品一区二区三区在线观看一 | 理论电影国产精品| 欧美日韩亚洲综合在线| 亚洲午夜三级在线| 欧美日韩亚洲综合一区| 五月激情综合网| 91麻豆精品国产91久久久| 全国精品久久少妇| 欧美mv和日韩mv的网站| 国产一区二区精品久久91| 国产色一区二区| 91美女片黄在线| 亚洲 欧美综合在线网络| 欧美一区二区三区视频免费| 蜜臀a∨国产成人精品| 精品久久久久99| 成人午夜伦理影院| 亚洲与欧洲av电影| 日韩欧美成人激情| 91香蕉视频mp4| 国产精品免费视频一区| 欧美亚洲另类激情小说| 色婷婷综合久色| 精品一区二区三区免费观看| 国产午夜亚洲精品羞羞网站| 9i在线看片成人免费| 午夜精品福利一区二区三区av| 欧美成人精品福利| 一本大道久久a久久精品综合| 性做久久久久久久免费看| 国产婷婷色一区二区三区| 欧美性一二三区| 国产成人精品亚洲777人妖| 午夜免费欧美电影| 综合久久一区二区三区| 久久久久99精品一区| 欧美亚洲禁片免费| 成人一区在线观看| 日本va欧美va精品| 亚洲一区二三区| 亚洲精品中文字幕在线观看| 欧美xxxx老人做受| 91精品国产黑色紧身裤美女| 色国产综合视频| zzijzzij亚洲日本少妇熟睡| 免费高清视频精品| 日韩电影在线观看网站| 国产精品高潮久久久久无| 久久精品在线免费观看| 日韩欧美国产高清| 精品国产一区二区精华| 日韩你懂的电影在线观看| 欧美日本免费一区二区三区| 欧美影片第一页| 欧美性三三影院| 欧美三级中文字| 欧美精品tushy高清| 欧美一区日本一区韩国一区| 欧美少妇一区二区| 99在线精品一区二区三区| 国产不卡视频在线观看| 国产成人精品亚洲日本在线桃色| 激情小说欧美图片| 国产福利91精品一区| 国产一区日韩二区欧美三区| 美国三级日本三级久久99| 久久99久久久久久久久久久| 极品美女销魂一区二区三区| 国产在线精品国自产拍免费| 国产一区二区三区电影在线观看 | 91麻豆国产福利在线观看| av亚洲精华国产精华精华 | 国产大陆亚洲精品国产| 91一区二区在线观看| 91国偷自产一区二区三区成为亚洲经典 | 国产精品99久久久| 成人网男人的天堂| 在线观看一区二区视频| 制服视频三区第一页精品| 欧美成人官网二区| 中文字幕欧美一| 婷婷开心激情综合| 懂色中文一区二区在线播放| 91麻豆国产在线观看| 91麻豆精品国产91久久久久久久久 | 免费人成精品欧美精品| 成人性生交大片免费看中文网站| 不卡视频免费播放| 欧美videossexotv100| 亚洲欧美日韩综合aⅴ视频| 日本高清成人免费播放| 欧美色网一区二区| 91女厕偷拍女厕偷拍高清| 欧美三级电影在线观看| 中国av一区二区三区| 日韩福利视频导航| 欧美综合欧美视频| 国产精品伦一区| 国产一区免费电影| 欧美一区二区视频免费观看| 亚洲男女一区二区三区| 成人免费观看视频| 久久久精品一品道一区| 日韩电影在线看| 欧美日韩国产综合久久| 亚洲欧美日韩一区| 91麻豆免费观看| 亚洲欧美乱综合| 91国偷自产一区二区开放时间| 18欧美亚洲精品| aaa亚洲精品| 一区二区三区免费| 欧美日韩一卡二卡|