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

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

?? eeprom.c

?? linux-2.6.15.6
?? C
字號(hào):
/*	drivers/net/tulip/eeprom.c	Maintained by Jeff Garzik <jgarzik@pobox.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-user.{pdf,ps,html}	for more information on this driver, or visit the project	Web page at http://sourceforge.net/projects/tulip/*/#include <linux/pci.h>#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 }  },  {"Cobalt Microserver", 0, 0x10, 0xE0, {0x1e00, /* 0 == controller #, 1e == offset	*/					 0x0000, /* 0 == high offset, 0 == gap		*/					 0x0800, /* Default Autoselect			*/					 0x8001, /* 1 leaf, extended type, bogus len	*/					 0x0003, /* Type 3 (MII), PHY #0		*/					 0x0400, /* 0 init instr, 4 reset instr		*/					 0x0801, /* Set control mode, GP0 output	*/					 0x0000, /* Drive GP0 Low (RST is active low)	*/					 0x0800, /* control mode, GP0 input (undriven)	*/					 0x0000, /* clear control mode			*/					 0x7800, /* 100TX FDX + HDX, 10bT FDX + HDX	*/					 0x01e0, /* Advertise all above			*/					 0x5000, /* FDX all above			*/					 0x1800, /* Set fast TTM in 100bt modes		*/					 0x0000, /* PHY cannot be unplugged		*/  }},  {NULL}};static const char *block_name[] __devinitdata = {	"21140 non-MII",	"21140 MII PHY",	"21142 Serial PHY",	"21142 MII PHY",	"21143 SYM PHY",	"21143 reset method"};/** * tulip_build_fake_mediatable - Build a fake mediatable entry. * @tp: Ptr to the tulip private data. * * Some cards like the 3x5 HSC cards (J3514A) do not have a standard  * srom and can not be handled under the fixup routine.  These cards * still need a valid mediatable entry for correct csr12 setup and  * mii handling. *  * Since this is currently a parisc-linux specific function, the * #ifdef __hppa__ should completely optimize this function away for * non-parisc hardware. */static void __devinit tulip_build_fake_mediatable(struct tulip_private *tp){#ifdef CONFIG_GSC	if (tp->flags & NEEDS_FAKE_MEDIA_TABLE) {		static unsigned char leafdata[] =			{ 0x01,       /* phy number */			  0x02,       /* gpr setup sequence length */			  0x02, 0x00, /* gpr setup sequence */			  0x02,       /* phy reset sequence length */			  0x01, 0x00, /* phy reset sequence */			  0x00, 0x78, /* media capabilities */			  0x00, 0xe0, /* nway advertisment */			  0x00, 0x05, /* fdx bit map */			  0x00, 0x06  /* ttm bit map */			};		tp->mtable = (struct mediatable *)			kmalloc(sizeof(struct mediatable) + sizeof(struct medialeaf), GFP_KERNEL);		if (tp->mtable == NULL)			return; /* Horrible, impossible failure. */		tp->mtable->defaultmedia = 0x800;		tp->mtable->leafcount = 1;		tp->mtable->csr12dir = 0x3f; /* inputs on bit7 for hsc-pci, bit6 for pci-fx */		tp->mtable->has_nonmii = 0;		tp->mtable->has_reset = 0;		tp->mtable->has_mii = 1;		tp->mtable->csr15dir = tp->mtable->csr15val = 0;		tp->mtable->mleaf[0].type = 1;		tp->mtable->mleaf[0].media = 11;		tp->mtable->mleaf[0].leafdata = &leafdata[0];		tp->flags |= HAS_PHY_IRQ;		tp->csr12_shadow = -1;	}#endif }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 = netdev_priv(dev);	unsigned char *ee_data = tp->eeprom;	int i;	tp->mtable = NULL;	/* 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. */		tulip_build_fake_mediatable(tp);	} 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()	ioread32(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(struct net_device *dev, int location, int addr_len){	int i;	unsigned retval = 0;	struct tulip_private *tp = dev->priv;	void __iomem *ee_addr = tp->base_addr + CSR9;	int read_cmd = location | (EE_READ_CMD << addr_len);	iowrite32(EE_ENB & ~EE_CS, ee_addr);	iowrite32(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;		iowrite32(EE_ENB | dataval, ee_addr);		eeprom_delay();		iowrite32(EE_ENB | dataval | EE_SHIFT_CLK, ee_addr);		eeprom_delay();		retval = (retval << 1) | ((ioread32(ee_addr) & EE_DATA_READ) ? 1 : 0);	}	iowrite32(EE_ENB, ee_addr);	eeprom_delay();	for (i = 16; i > 0; i--) {		iowrite32(EE_ENB | EE_SHIFT_CLK, ee_addr);		eeprom_delay();		retval = (retval << 1) | ((ioread32(ee_addr) & EE_DATA_READ) ? 1 : 0);		iowrite32(EE_ENB, ee_addr);		eeprom_delay();	}	/* Terminate the EEPROM access. */	iowrite32(EE_ENB & ~EE_CS, ee_addr);	return (tp->flags & HAS_SWAPPED_SEEPROM) ? swab16(retval) : retval;}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩有码一区二区三区| 久久亚洲捆绑美女| 欧美色图在线观看| 亚洲欧美日韩国产中文在线| 久久国产精品区| 91精品国产手机| 日本欧美在线看| 91精品综合久久久久久| 日韩国产欧美在线观看| 制服丝袜亚洲色图| 日韩中文字幕亚洲一区二区va在线| 色88888久久久久久影院野外 | 日产国产欧美视频一区精品| 欧美三级韩国三级日本三斤| 亚洲视频在线一区二区| 在线亚洲+欧美+日本专区| 亚洲成a人片在线观看中文| 欧美乱妇20p| 国产精品资源在线| 中文字幕亚洲区| 欧美精品一二三区| 国产呦萝稀缺另类资源| 亚洲欧洲日韩女同| 欧美亚洲愉拍一区二区| 久久国产精品免费| 中文字幕免费在线观看视频一区| 色诱亚洲精品久久久久久| 香蕉成人啪国产精品视频综合网 | 91麻豆文化传媒在线观看| 亚洲自拍偷拍欧美| 精品国产污污免费网站入口| 99精品欧美一区二区三区小说| 青娱乐精品在线视频| 欧美激情综合在线| 欧美一区二区视频在线观看| 白白色亚洲国产精品| 青青草视频一区| 亚洲图片欧美激情| 国产色爱av资源综合区| 日韩免费视频一区二区| 欧美三级电影一区| 一本久道中文字幕精品亚洲嫩| 国内外成人在线| 久久精品国产网站| 日日夜夜免费精品视频| 亚洲欧美一区二区三区久本道91| 久久网这里都是精品| 欧美久久免费观看| 欧美日韩一区二区不卡| 色狠狠一区二区三区香蕉| 国产精品99久久久久久似苏梦涵 | 久久久久久久久久看片| 欧美大片日本大片免费观看| 欧美军同video69gay| 欧美人xxxx| 欧美电影精品一区二区| 欧美二区三区91| 日韩欧美第一区| 久久女同精品一区二区| 欧美激情一区二区三区全黄| 国产人妖乱国产精品人妖| 日本欧美大码aⅴ在线播放| 久久精品日韩一区二区三区| 久久久久国产成人精品亚洲午夜| 精品三级在线看| 久久精品一二三| 亚洲欧美视频一区| 亚洲一区二区三区在线看| 日本视频中文字幕一区二区三区| 日本人妖一区二区| 成人美女视频在线观看18| 99精品黄色片免费大全| 欧美日韩精品是欧美日韩精品| 日韩一卡二卡三卡四卡| 国产校园另类小说区| 亚洲成av人片一区二区三区| 美国毛片一区二区三区| 不卡大黄网站免费看| 欧美日韩成人综合| 国产精品网站在线播放| 天堂精品中文字幕在线| 97久久精品人人做人人爽50路| 制服丝袜中文字幕亚洲| 亚洲精品国产无套在线观| 久久国产免费看| 在线成人av网站| 亚洲色图.com| 不卡区在线中文字幕| 日韩一区和二区| 亚洲午夜一二三区视频| 成人avav影音| 中文字幕欧美日韩一区| 国产一区二区三区久久久| 88在线观看91蜜桃国自产| 一区二区三区四区蜜桃| jizz一区二区| 国产精品嫩草影院com| 国产一区二区三区高清播放| 91精品在线麻豆| 日韩专区欧美专区| 欧美一区二区三区白人| 日韩av电影天堂| 91精品国产综合久久精品app| 夜夜嗨av一区二区三区网页 | 国产精品人人做人人爽人人添| 久久国产日韩欧美精品| 精品国产百合女同互慰| 狠狠色综合日日| 国产欧美一区二区精品性色 | 亚洲福利视频一区| 欧美日韩和欧美的一区二区| 视频一区二区欧美| 日韩欧美123| 岛国一区二区在线观看| 欧美国产日韩a欧美在线观看| 91一区二区在线| 琪琪一区二区三区| 欧美激情一区二区在线| 色综合色综合色综合色综合色综合 | 亚洲女同一区二区| 99麻豆久久久国产精品免费| 国产喂奶挤奶一区二区三区| 国产精品 欧美精品| 一区二区三区日韩欧美| 91精品国产一区二区三区蜜臀| 裸体在线国模精品偷拍| 国产精品伦理一区二区| 麻豆中文一区二区| 日韩一区二区免费在线观看| 国产乱子伦一区二区三区国色天香| 欧美经典一区二区| 日韩欧美一区二区三区在线| 丁香婷婷综合激情五月色| 夜夜精品视频一区二区| 国产目拍亚洲精品99久久精品| 欧美日韩一区二区三区视频| 懂色一区二区三区免费观看| 日韩av一二三| 三级在线观看一区二区| 一区二区三区在线视频观看58| 久久一区二区三区四区| 91精品国产品国语在线不卡| 色偷偷成人一区二区三区91 | 国产日本亚洲高清| 欧美人妇做爰xxxⅹ性高电影| 色偷偷成人一区二区三区91| 波多野结衣欧美| 成人少妇影院yyyy| 国产91精品在线观看| 久久99精品久久久久| 久久99国产精品麻豆| 蜜桃视频在线一区| 国产一区二区三区最好精华液| 日韩电影在线一区| 国模一区二区三区白浆| 国产精品中文欧美| 成人免费视频免费观看| 色综合久久久久网| 69久久99精品久久久久婷婷| 欧美人与z0zoxxxx视频| 欧美成人激情免费网| 久久久久国色av免费看影院| 欧美国产视频在线| 亚洲特黄一级片| 天天影视网天天综合色在线播放 | 精品一区二区在线看| 国产不卡视频在线播放| 91麻豆精品在线观看| 日韩一区二区在线观看| 欧美激情一区三区| 污片在线观看一区二区| 国产成人免费视频网站高清观看视频| 成人午夜又粗又硬又大| 欧美精品久久久久久久多人混战| 久久众筹精品私拍模特| 亚洲精品成人在线| 国产精品888| 欧美精品第一页| 久久蜜桃香蕉精品一区二区三区| 久久你懂得1024| 青青国产91久久久久久| 成人午夜看片网址| 日韩无一区二区| 亚洲成av人片观看| 91免费观看在线| 亚洲国产高清在线| 久久精品99国产精品| 欧美日韩国产小视频| 中文字幕乱码久久午夜不卡| 激情伊人五月天久久综合| 日韩一级片网址| 五月婷婷久久丁香| 91福利精品第一导航| 亚洲人成网站在线| 成人在线综合网站| 国产欧美精品一区二区色综合朱莉| 五月天一区二区| 欧美一区二区视频在线观看2022 | 国产一区二区三区观看| 精品少妇一区二区|