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

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

?? eeprom.c

?? microwindows移植到S3C44B0的源碼
?? C
字號:
/*	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
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区在线| 精品日韩在线观看| 亚洲精品精品亚洲| 欧美视频一区二区三区四区 | 精品国产一区二区亚洲人成毛片 | 国产精品美女久久久久久| 成人精品一区二区三区四区| 中文字幕在线免费不卡| 欧美三级午夜理伦三级中视频| 亚洲午夜久久久久| 欧美一区二区播放| 国产成a人无v码亚洲福利| 中文字幕一区二区三区视频| 欧洲精品一区二区| 精品一区二区综合| 国产精品久久久久一区二区三区 | 99r国产精品| 亚洲国产精品久久久久秋霞影院 | 欧美影院一区二区| 美女网站在线免费欧美精品| 国产三级精品在线| 欧美在线免费播放| 国产精品亚洲а∨天堂免在线| **欧美大码日韩| 91精品国产综合久久香蕉麻豆| 国产精品一区二区黑丝| 一区二区三区在线观看网站| 日韩久久久久久| 色屁屁一区二区| 久久er精品视频| 亚洲欧美日韩国产一区二区三区| 日韩一区二区三区四区| 成人短视频下载| 久久精品国产一区二区三| 亚洲天天做日日做天天谢日日欢| 91精品国产丝袜白色高跟鞋| 成人激情视频网站| 乱一区二区av| 亚洲成av人在线观看| 久久蜜臀精品av| 欧美精品一二三| 99久久婷婷国产综合精品电影| 秋霞国产午夜精品免费视频| 国产精品污污网站在线观看| 日韩免费高清视频| 欧美三级视频在线播放| 99免费精品视频| 国产精品一区二区久激情瑜伽 | 成人综合激情网| 免费欧美在线视频| 亚洲成人在线网站| 中文字幕一区二区三区乱码在线 | 一区视频在线播放| 国产视频在线观看一区二区三区| 制服丝袜激情欧洲亚洲| 欧洲人成人精品| 一本一本大道香蕉久在线精品| 国产一区二区三区在线观看免费 | 亚洲人成精品久久久久久| 久久综合久久综合久久综合| 91麻豆精品国产| 欧美三级电影在线观看| 欧洲精品一区二区| 色综合久久久网| 99在线热播精品免费| 国产成人无遮挡在线视频| 国产综合久久久久久鬼色| 韩国在线一区二区| 激情六月婷婷久久| 国产乱码精品一区二区三区忘忧草| 视频在线观看国产精品| 日日骚欧美日韩| 日本在线不卡视频一二三区| 午夜电影一区二区三区| 午夜成人免费电影| 五月天网站亚洲| 美女在线观看视频一区二区| 美女精品一区二区| 激情五月婷婷综合网| 国产精品一区二区x88av| 丁香啪啪综合成人亚洲小说| 国产99精品视频| 不卡一区二区三区四区| 色成人在线视频| 欧美区视频在线观看| 欧美电影影音先锋| 日韩欧美中文字幕制服| 欧美精品一区二区久久婷婷 | 日韩一区二区电影网| 日韩一区二区三区免费观看| 精品99久久久久久| 欧美国产亚洲另类动漫| 亚洲欧美日韩国产一区二区三区| 亚洲一二三四区| 免费观看在线综合| 国产盗摄一区二区三区| 91性感美女视频| 欧美丰满高潮xxxx喷水动漫| 久久久久久久久蜜桃| 中文字幕中文字幕中文字幕亚洲无线| 亚洲视频图片小说| 午夜激情久久久| 欧日韩精品视频| 欧美精品一卡两卡| 久久精品亚洲一区二区三区浴池| 日韩伦理av电影| 日韩高清在线观看| 国产99一区视频免费| 欧美日韩色综合| 久久蜜桃一区二区| 亚洲曰韩产成在线| 国产精品一二三区在线| 91麻豆免费看片| 日韩视频国产视频| 亚洲色图19p| 久99久精品视频免费观看| 99国产精品国产精品毛片| 日韩一区二区免费在线电影| 亚洲人成7777| 国产在线看一区| 欧美精品久久天天躁| 久久精品欧美日韩精品| 午夜精品久久久| 99天天综合性| 久久久精品免费免费| 日韩精品亚洲专区| 99久久精品免费看国产| 日韩一区二区精品葵司在线| 亚洲美女视频在线| 国产精品69久久久久水密桃| 欧美日韩亚洲综合在线| 国产精品电影院| 国产综合久久久久久久久久久久 | 99久久er热在这里只有精品15| 欧美一级欧美三级在线观看| 亚洲激情成人在线| 国产**成人网毛片九色| 欧美一二三区在线观看| 一区二区三区色| 成人动漫中文字幕| 国产午夜精品一区二区三区视频 | 日韩视频免费观看高清完整版| 一区二区三区四区不卡在线 | 国产一区二区福利视频| 欧美高清视频一二三区| 一区二区三区产品免费精品久久75| 国产成人aaa| 国产亚洲欧美一区在线观看| 精品一区二区久久久| 欧美久久久久免费| 亚洲午夜精品一区二区三区他趣| 成人av网址在线| 中文字幕欧美区| 国产精品一区在线观看你懂的| 日韩一级成人av| 日韩精品成人一区二区三区| 欧美日韩国产片| 亚洲一区二区影院| 在线观看国产日韩| 亚洲小说春色综合另类电影| av综合在线播放| 成人欧美一区二区三区小说| 岛国一区二区三区| 欧美激情一区二区三区全黄| 国产激情精品久久久第一区二区| 久久久精品人体av艺术| 国产高清精品网站| 亚洲国产精品激情在线观看| 懂色av一区二区夜夜嗨| 国产精品国产三级国产aⅴ入口| 成人午夜私人影院| 国产精品国产a| 色999日韩国产欧美一区二区| 亚洲老司机在线| 国产精品免费看片| 91在线视频播放| 亚洲综合久久久久| 在线播放日韩导航| 免费在线观看日韩欧美| 日韩一区二区免费在线电影| 国产一区在线看| 欧美国产欧美亚州国产日韩mv天天看完整| 国产a视频精品免费观看| 国产精品高清亚洲| 欧美性三三影院| 美女视频网站黄色亚洲| 久久久午夜精品理论片中文字幕| 国产凹凸在线观看一区二区| 亚洲免费电影在线| 欧美男人的天堂一二区| 久久精品国产第一区二区三区| 国产欧美视频一区二区三区| 91在线观看成人| 蜜臀国产一区二区三区在线播放| 久久先锋影音av鲁色资源网| 91视频免费播放| 蜜桃91丨九色丨蝌蚪91桃色| 欧美韩国日本一区| 欧美人狂配大交3d怪物一区| 国产一区二区三区蝌蚪|