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

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

?? eeprom.c

?? linux-2.4.29操作系統的源碼
?? C
字號:
/*	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.{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"};/** * 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 __hppa__	unsigned char *ee_data = tp->eeprom;	if (ee_data[0] == 0x3c && ee_data[1] == 0x10 && 		(ee_data[2] == 0x63 || ee_data[2] == 0x61) && ee_data[3] == 0x10) {		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 = (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. */		tulip_build_fake_mediatable(tp);	} 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;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一本色道综合亚洲| 一本色道a无线码一区v| 国产精品狼人久久影院观看方式| 91丝袜美女网| 免费在线观看不卡| 在线电影一区二区三区| 亚洲成av人片| 日韩一区在线免费观看| 久久久久久久久久美女| 3d动漫精品啪啪1区2区免费 | 首页欧美精品中文字幕| 中文字幕欧美激情| 久久综合色8888| 91国产免费观看| jiyouzz国产精品久久| 蜜臀av性久久久久蜜臀av麻豆| 亚洲欧美国产高清| 欧美电影在哪看比较好| 在线观看视频一区| 97se亚洲国产综合自在线观| 激情欧美一区二区| 三级影片在线观看欧美日韩一区二区 | 欧美精品aⅴ在线视频| 欧洲一区二区av| av在线不卡免费看| 夫妻av一区二区| 一区二区三区 在线观看视频| 中文字幕中文字幕在线一区| 国产精品网站在线播放| 91精品国产综合久久久蜜臀图片| 欧美综合天天夜夜久久| 99国产精品久| 国产 欧美在线| a级精品国产片在线观看| 高清在线成人网| 日韩精彩视频在线观看| 日韩国产精品久久| 午夜精品一区在线观看| 亚洲国产视频网站| 午夜影院久久久| 日韩精品五月天| 蜜桃视频在线一区| 国产在线不卡视频| 国产成人在线视频播放| 成人动漫一区二区三区| 91麻豆国产自产在线观看| 欧美在线不卡视频| 日韩一级免费一区| 欧美日韩亚洲高清一区二区| 精品一区二区在线看| 欧美日韩综合色| 亚洲成a人片在线不卡一二三区| 欧美伦理视频网站| 国产美女久久久久| 综合久久国产九一剧情麻豆| 在线观看欧美黄色| 精品一区二区三区香蕉蜜桃 | 亚洲免费观看高清完整版在线观看 | 白白色 亚洲乱淫| 亚洲成人av一区| 久久综合久久久久88| 99在线精品观看| 蜜臀av在线播放一区二区三区| 国产视频911| 欧美日韩一区久久| 国产精品一区二区三区四区| 亚洲国产美国国产综合一区二区 | 欧美日韩在线精品一区二区三区激情| 免费观看成人鲁鲁鲁鲁鲁视频| 欧美国产97人人爽人人喊| 欧美日韩国产中文| 成人免费视频caoporn| 日韩电影网1区2区| 亚洲少妇最新在线视频| 日韩一区二区电影网| 色综合 综合色| 国产美女一区二区| 亚洲成人一二三| 国产精品美女久久久久高潮| 欧美一卡二卡在线| 色欧美片视频在线观看在线视频| 国产在线看一区| 亚洲成人777| 国产精品电影院| 精品乱人伦一区二区三区| 在线看不卡av| k8久久久一区二区三区| 精品中文字幕一区二区| 亚洲成av人片www| 成人免费一区二区三区在线观看| 日韩一区和二区| 欧美曰成人黄网| 成人精品小蝌蚪| 国产麻豆成人传媒免费观看| 亚洲第一福利一区| 亚洲色欲色欲www在线观看| 久久久综合视频| 日韩欧美国产小视频| 精品视频一区三区九区| 9i在线看片成人免费| 国产成人在线观看| 久久se这里有精品| 日韩电影在线看| 亚洲aⅴ怡春院| 伊人一区二区三区| 国产精品美日韩| 亚洲一区二区美女| 国产精品亚洲第一区在线暖暖韩国| 一本一本久久a久久精品综合麻豆| 久久奇米777| 久久精品国产亚洲a| 制服丝袜亚洲播放| 亚洲成av人片观看| 色爱区综合激月婷婷| 国产人伦精品一区二区| 天堂成人国产精品一区| 在线观看免费亚洲| 亚洲女厕所小便bbb| 99久久婷婷国产综合精品电影| 日韩精品影音先锋| 国产尤物一区二区| 亚洲精品一区二区三区蜜桃下载| 午夜视频一区在线观看| 在线视频欧美精品| 精品伊人久久久久7777人| 欧美日韩大陆一区二区| 成人不卡免费av| 国产清纯美女被跳蛋高潮一区二区久久w| 国产精品白丝在线| 99精品视频中文字幕| 自拍偷拍亚洲激情| 欧美精品久久天天躁| 色天天综合色天天久久| 在线观看区一区二| 久久久久久免费| 久久婷婷国产综合精品青草| 精品伦理精品一区| 久久久久综合网| 久久精品亚洲一区二区三区浴池 | 欧美日韩国产综合视频在线观看 | 久久伊99综合婷婷久久伊| 精品91自产拍在线观看一区| 精品国产一区二区三区久久影院 | 精品一区二区三区在线观看| 国产一区二区网址| 国产成人午夜片在线观看高清观看| 国产一区二区毛片| 成人精品国产福利| 99久久国产综合精品麻豆| 日本二三区不卡| 欧美日免费三级在线| 日韩视频一区二区三区在线播放| 日韩欧美成人一区| 国产欧美一二三区| 亚洲丝袜制服诱惑| 亚洲国产日韩精品| 美女看a上一区| 国产精品一品二品| 成人av网址在线观看| 在线免费观看日本欧美| 91精品国产综合久久小美女| 久久综合久色欧美综合狠狠| 国产日韩精品一区二区三区 | 精久久久久久久久久久| 国产成人综合在线| 日本韩国一区二区| 3atv一区二区三区| 国产日韩欧美一区二区三区综合 | 欧美激情一区二区三区四区 | 亚洲一区视频在线观看视频| 日韩电影免费在线| 国产麻豆视频精品| 91欧美一区二区| 欧美精品高清视频| 国产欧美一区视频| 亚洲一区二区三区四区在线观看 | 精品国产网站在线观看| 国产拍欧美日韩视频二区| 亚洲最新在线观看| 国内久久精品视频| 一道本成人在线| 欧美www视频| 亚洲欧美国产77777| 卡一卡二国产精品| 色哟哟一区二区三区| 日韩欧美aaaaaa| 亚洲视频免费观看| 日本不卡一二三区黄网| 成人丝袜18视频在线观看| 欧美日韩国产免费| 欧美韩日一区二区三区四区| 丝袜a∨在线一区二区三区不卡| 国产成人精品免费在线| 欧美伦理电影网| 国产精品白丝在线| 久久精品国内一区二区三区| 91麻豆视频网站| 久久夜色精品国产噜噜av| 一级日本不卡的影视| 国产伦精一区二区三区|