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

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

?? dm9sw.c

?? 網卡芯片DM9003在linux下的驅動程序。
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*  dm9sw.c: Version 0.2            Davicom DM9013 Local Bus/PCI NIC fast Ethernet driver for Linux.	This program is free software; you can redistribute it and/or	modify it under the terms of the GNU General Public License	as published by the Free Software Foundation; either version 2	of the License, or (at your option) any later version.	This program is distributed in the hope that it will be useful,	but WITHOUT ANY WARRANTY; without even the implied warranty of	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the	GNU General Public License for more details.  (C)Copyright 1997-2007 DAVICOM Semiconductor,Inc. All Rights Reserved.V0.2	bill	2006/12	- enable promiscuous mode (DM9013 V2 bug)	- remove early transmit (DM9013 don't have this function)	- remove cont_rx_pkt_cnt	- add dm9sw_switch_config()	- add dm9sw_switch_reset() (when reseting switch core, some registers don't be reset. Driver must reset them if NO EEPROM. )V0.1	bill	2006/08	- creat			*///#define CHECKSUM#if defined(MODVERSIONS)#include <linux/modversions.h>#endif#include <linux/config.h>#include <linux/init.h>				#include <linux/delay.h>#include <linux/module.h>#include <linux/ioport.h>#include <linux/netdevice.h>#include <linux/etherdevice.h>#include <linux/skbuff.h>#include <linux/version.h>#include <asm/dma.h>#include <linux/spinlock.h>#include <linux/crc32.h>#include "dm9sw.h"#define DM9013_ID		0x90130A46#define DM9003_ID		0x90030A46#define DM9KS_REGFF	(IMR_SRAM_autoReturn|IMR_TX_complete|IMR_RX_coming)#define DM9KS_NO_RX_INTR (IMR_SRAM_autoReturn|IMR_TX_complete)#define DM9KS_DISINTR	IMR_SRAM_autoReturn#define DM9KS_MIN_IO		0x300#define DM9KS_MAX_IO		0x370#define DM9K_IRQ		3/* timer wakeup time : 5 second */#define DMFE_TIMER_WUT  jiffies+(HZ*5)	#if defined(DM9KS_DEBUG)#define DMFE_DBUG(dbug_now, msg, vaule)\if (dmfe_debug||dbug_now) printk(KERN_ERR "dmfe: %s %x\n", msg, vaule)#else#define DMFE_DBUG(dbug_now, msg, vaule)\if (dbug_now) printk(KERN_ERR "dmfe: %s %x\n", msg, vaule)#endif#define wait_bit_clear(reg, bit)\wait_count=0;\while(1){\	if(!(ior(db,reg) & (1<<bit)))\		break;\	if(wait_count ==10000)\		printk("wait time out,reg0x%x\n",reg);\	wait_count++;\}#define wait_PHY_bit_clear(PHY_ID,reg, bit)\wait_count=0;\while(1){\	if(!(phy_read(db,reg,PHY_ID) & (1<<bit)))\		break;\	if(wait_count ==10000)\		printk("wait PHY time out,reg0x%x\n",reg);\	wait_count++;\}/* Structure declaration ------------------------------- */typedef struct board_info { 	u32 reset_counter;		/* counter: RESET */ 	u32 reset_tx_timeout;		/* RESET caused by TX Timeout */ 	u32 io_addr;			/* Register I/O base address */	u32 io_data;			/* Data I/O address */	int tx_pkt_cnt;	int port_mode;	u8 op_mode;			/* PHY operation mode */	u8 io_mode;			/* 0:word, 2:byte */	u8 device_wait_reset;		/* device state */	u8 Speed;			/* current speed */	u8 stop_transmit;	int cont_rx_pkt_cnt;	/* current number of continuos rx packets  */	struct timer_list timer;	struct net_device_stats stats;	unsigned char srom[128];	spinlock_t lock;		void (*MoveData)(struct board_info *,unsigned char *, int , int);} board_info_t;/* Global variable declaration ----------------------------- *//*static int dmfe_debug = 0;*/static struct net_device * dmfe_dev = NULL;/* For module input parameter */static int media_mode = DM9KS_AUTO;static u8  irq        = DM9K_IRQ;static u32 iobase     = DM9KS_MIN_IO;static int wait_count;/* function declaration ------------------------------------- */int dmfe_probe(struct net_device *);static int dmfe_open(struct net_device *);static int dmfe_start_xmit(struct sk_buff *, struct net_device *);static void dmfe_tx_done(unsigned long);static void dmfe_packet_receive(struct net_device *);static int dmfe_stop(struct net_device *);static struct net_device_stats * dmfe_get_stats(struct net_device *); static int dmfe_do_ioctl(struct net_device *, struct ifreq *, int);#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)static void dmfe_interrupt(int , void *, struct pt_regs *);#elsestatic irqreturn_t dmfe_interrupt(int , void *, struct pt_regs *);#endifstatic void dmfe_timer(unsigned long);static void dmfe_init_dm9000(struct net_device *);static unsigned long cal_CRC(unsigned char *, unsigned int, u8);static u8 ior(board_info_t *, int);static void iow(board_info_t *, int, u8);static u16 phy_read(board_info_t *, int, int);static void phy_write(board_info_t *, int, u16, int);static u16 read_srom_word(board_info_t *, int);static void dm9000_hash_table(struct net_device *);static void dmfe_timeout(struct net_device *);static void dmfe_reset(struct net_device *);static void move8(board_info_t *,unsigned char *, int , int );static void move16(board_info_t *,unsigned char *, int , int );static void move32(board_info_t *,unsigned char *, int , int );#if defined(CHECKSUM)static u8 check_rx_ready(u8);#endif#ifdef NAPIstatic int dmfe_poll (struct net_device *, int *);#endifstatic int vlan_port_vid(board_info_t *, int, u8);static int vlan_outpkt_tag(board_info_t *, int);static void vlan_group_map(board_info_t *,u8, u8);static void VLAN_SETUP(board_info_t *,int);static int dm9k_bw_control(board_info_t *, int, u8, u8, u8);static int qos_port_pri(board_info_t *, int, u8);static int qos_tos_enable(board_info_t *, int);static void QoS_SETUP(board_info_t *, int);inline u8 MAKE_MASK(int , int , int , int );//DECLARE_TASKLET(dmfe_tx_tasklet,dmfe_tx_done,0);/* DM9000 network baord routine ---------------------------- *//*  Search DM9000 board, allocate space and register it*/struct net_device * __init dmfe_probe1(void){	struct net_device *dev;	int err;#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	dev = init_etherdev(NULL, sizeof(struct board_info));	ether_setup(dev);		#else	dev= alloc_etherdev(sizeof(struct board_info));#endif	if(!dev)		return ERR_PTR(-ENOMEM);     	SET_MODULE_OWNER(dev);	err = dmfe_probe(dev);	if (err)		goto out;#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)	err = register_netdev(dev);	if (err)		goto out1;#endif	return dev;out1:	release_region(dev->base_addr,2);out:#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)	kfree(dev);#else	free_netdev(dev);#endif	return ERR_PTR(err);}int __init dmfe_probe(struct net_device *dev){	struct board_info *db;    /* Point a board information structure */	u32 id_val;	u16 i, dm9000_found = FALSE;	u8 MAC_addr[6]={0x00,0x11,0x22,0x33,0x44,0x55};	u8 HasEEPROM=0;	DMFE_DBUG(0, "dmfe_probe()",0);	/* Search All DM9000 serial NIC */	do {		outb(DM9KS_VID_L, iobase);		id_val = inb(iobase + 4);		outb(DM9KS_VID_H, iobase);		id_val |= inb(iobase + 4) << 8;		outb(DM9KS_PID_L, iobase);		id_val |= inb(iobase + 4) << 16;		outb(DM9KS_PID_H, iobase);		id_val |= inb(iobase + 4) << 24;		if ((id_val == DM9013_ID)||(id_val == DM9003_ID)) {						/* Request IO from system */			if(!request_region(iobase, 2, dev->name))				return -ENODEV;			printk("<DM9SW> I/O: %x, VID: %x \n",iobase, id_val);			dm9000_found = TRUE;			/* Allocated board information structure */			memset(dev->priv, 0, sizeof(struct board_info));			db = (board_info_t *)dev->priv;			dmfe_dev    = dev;			db->io_addr  = iobase;			db->io_data = iobase + 4;			/* driver system function */							dev->base_addr 		= iobase;			dev->irq 		= irq;			dev->open 		= &dmfe_open;			dev->hard_start_xmit 	= &dmfe_start_xmit;			dev->watchdog_timeo	= 5*HZ;				dev->tx_timeout		= dmfe_timeout;			dev->stop 		= &dmfe_stop;			dev->get_stats 		= &dmfe_get_stats;			dev->set_multicast_list = &dm9000_hash_table;			dev->do_ioctl 		= &dmfe_do_ioctl;#ifdef NAPI			dev->weight = 16; 			dev->poll = dmfe_poll;#endif#if defined(CHECKSUM)			dev->features |=  NETIF_F_IP_CSUM;#endif			/* Read SROM content */			for (i=0; i<64; i++)				((u16 *)db->srom)[i] = read_srom_word(db, i);			/* Detect EEPROM */			for (i=0; i<6; i++)				if(db->srom[i]) HasEEPROM=1;						/* Set Node Address */			for (i=0; i<6; i++)			{				if (HasEEPROM)					dev->dev_addr[i] = db->srom[i];				else					dev->dev_addr[i] = MAC_addr[i];			}		}//end of if()		iobase += 0x10;	}while(!dm9000_found && iobase <= DM9KS_MAX_IO);	return dm9000_found ? 0:-ENODEV;}/*  Open the interface.  The interface is opened whenever "ifconfig" actives it.*/static int dmfe_open(struct net_device *dev){	board_info_t *db = (board_info_t *)dev->priv;	DMFE_DBUG(0, "dmfe_open", 0);	if (request_irq(dev->irq,&dmfe_interrupt,SA_SHIRQ,dev->name,dev)) 		return -EAGAIN;	/* Initilize DM910X board */	dmfe_init_dm9000(dev);  	switch(db->io_mode)	{		case DM9KS_BYTE_MODE:				db->MoveData = & move8;			break;		case DM9KS_WORD_MODE:				db->MoveData = & move16;      			break;    		case DM9KS_DWORD_MODE:       				db->MoveData = & move32;			break;	} 	/* Init driver variable */	db->reset_counter 	= 0;	db->reset_tx_timeout 	= 0;	db->cont_rx_pkt_cnt	= 0;		/* set and active a timer process */	init_timer(&db->timer);	db->timer.expires 	= DMFE_TIMER_WUT * 2;	db->timer.data 		= (unsigned long)dev;	db->timer.function 	= &dmfe_timer;	add_timer(&db->timer);	//Move to DM9000 initiallization was finished. 		netif_start_queue(dev);	return 0;}/* Set PHY operationg mode*/static void set_PHY_mode(board_info_t *db){	int i;	u16 phy_reg0 = 0x1200;/* Auto-negotiation & Restart Auto-negotiation */	u16 phy_reg4 = 0x01e1;/* Default flow control disable*/	for (i=0; i<db->port_mode; i++) /* reset PHY */		phy_write(db, 0, 0x8000, i);	/* wait for PHY ready */	for (i=0; i<db->port_mode; i++)		wait_PHY_bit_clear(i, 0, 15);	if ( !(db->op_mode & DM9KS_AUTO) ) // op_mode didn't auto sense */	{ 		switch(db->op_mode) {			case DM9KS_10MHD:  phy_reg4 = 0x21;              				   phy_reg0 = 0x1000;					   break;			case DM9KS_10MFD:  phy_reg4 = 0x41; 					   phy_reg0 = 0x1100;             				   break;			case DM9KS_100MHD: phy_reg4 = 0x81; 					   phy_reg0 = 0x3000;				     	   break;			case DM9KS_100MFD: phy_reg4 = 0x101; 					   phy_reg0 = 0x3100;				   	   break;			default: 					   break;		} // end of switch		for(i=0; i<db->port_mode; i++)		{			phy_write(db, 4, phy_reg4,i);			phy_write(db, 0, phy_reg0,i);		}	} // end of if}static void dm9sw_switch_reset(board_info_t *db){	int i;	/* reset VLAN mapping table */	for (i=0xb0; i<=0xbf; i++)		vlan_group_map(db, i, MAKE_MASK(1, 1, 1, 1));	/* reset Per-Port VID*/	for(i=0; i<4; i++)		vlan_port_vid(db,i,1);	/* reset VLAN control */	iow (db, DM9KS_VLANCR, 0);	/* reset Per-Port switch control */	for(i=0; i<4; i++)	{		iow(db, DM9KS_PIndex, i);		iow(db, 0x61, 0);		iow(db, 0x66, 0);		iow(db, 0x67, 0);		iow(db, 0x6D, 0);		iow(db, 0x6F, 0);	}		}static void dm9sw_switch_config(board_info_t * db){	dm9sw_switch_reset(db);	/* switch control */#if 0	VLAN_SETUP(db,1); /* 0:port-base, 1:Tag-base */#endif#if 0	QoS_SETUP(db,0); /* 0:port, 1:Tag, 2:TOS */#endif#if 0 	/* Bandwidth control 	 dm9k_bw_control(db,port_no, bw_type, bit7-4, bit3-0) 	 bw_type(reg61H.[3]): 0:control with Ingress and Egress separately		              1:control with Ingress or Egress	 bit7-4 and bit 3-0:refer to reg66H and reg67H	 If bw_type=1, bit7-4 must be "0".	*/	dm9k_bw_control(db,1,0,0,2); 	dm9k_bw_control(db,0,0,2,0); #endif}/* 	Initilize dm9000 board*/static void dmfe_init_dm9000(struct net_device *dev){	board_info_t *db = (board_info_t *)dev->priv;	DMFE_DBUG(0, "dmfe_init_dm9000()", 0);	spin_lock_init(&db->lock);	/* switch reset */	iow(db, DM9KS_SCR, DM9KS_SCR_ResetSwitch);	wait_bit_clear(DM9KS_SCR,6);		/* software reset */	iow(db, DM9KS_NCR, NCR_Reset);	wait_bit_clear(DM9KS_NCR,0);	/* I/O mode */	db->io_mode = ior(db, DM9KS_ISR) >> 6; /* ISR bit7:6 keeps I/O mode */	/* DM9013 is 2 port mode or 3 port mode */	db->port_mode = (ior(db, DM9KS_MONITOR2)&(1<<6)) ? 2:3;	/* Set PHY */	db->op_mode = media_mode;	set_PHY_mode(db);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
99久久精品一区| 国产欧美日韩另类一区| 久久综合九色欧美综合狠狠| 国产精品久久久久久亚洲伦| 亚洲国产cao| 不卡视频一二三四| 欧美成人一区二区| 一区二区在线观看视频| 国产不卡在线播放| 亚洲精品一区二区三区精华液| 一区二区三区四区不卡在线 | 国产精品国产三级国产专播品爱网 | 成人91在线观看| 精品国产网站在线观看| 日韩在线观看一区二区| 欧美私人免费视频| 亚洲精品视频免费看| 成人黄色片在线观看| 精品国产欧美一区二区| 蜜桃免费网站一区二区三区| 欧美日韩视频在线一区二区| 亚洲伦理在线精品| 99v久久综合狠狠综合久久| 国产欧美精品一区| 国产传媒欧美日韩成人| 精品成人a区在线观看| 九色|91porny| 欧美精品一区二区三区蜜桃视频 | 国产+成+人+亚洲欧洲自线| 精品处破学生在线二十三| 蜜乳av一区二区三区| 日韩一区二区电影在线| 日本不卡的三区四区五区| 欧美日本在线播放| 日韩精品欧美精品| 日韩亚洲欧美综合| 激情综合色综合久久综合| 337p日本欧洲亚洲大胆精品| 激情成人综合网| 亚洲精品一区在线观看| 国产高清久久久久| 中文字幕亚洲欧美在线不卡| 不卡av在线免费观看| 一区二区三区在线观看网站| 欧美三级视频在线观看| 日本不卡一区二区三区高清视频| 欧美一区午夜视频在线观看| 久久国产精品72免费观看| 久久综合中文字幕| 91美女在线观看| 婷婷成人激情在线网| 精品区一区二区| 成人av资源下载| 亚洲精品国产视频| 亚洲男人的天堂一区二区| 欧美日韩一级二级三级| 美国十次了思思久久精品导航| 久久这里只有精品视频网| 高清成人免费视频| 亚洲丶国产丶欧美一区二区三区| 日韩欧美国产综合| 91蝌蚪porny| 青娱乐精品视频在线| 国产精品美女久久久久av爽李琼| 在线视频欧美区| 狠狠色狠狠色综合日日91app| 中文字幕永久在线不卡| 欧美一级免费大片| proumb性欧美在线观看| 天堂蜜桃91精品| 国产精品美女久久久久久久| 欧美一区二区视频在线观看2020| 国产精品一二三四五| 一区二区三区中文字幕电影| 精品国产成人系列| 色呦呦国产精品| 国内精品国产成人| 肉丝袜脚交视频一区二区| 国产精品欧美经典| 日韩欧美另类在线| 欧美调教femdomvk| 99riav一区二区三区| 国产在线一区观看| 三级精品在线观看| 亚洲一本大道在线| 国产精品成人免费精品自在线观看| 欧美一区二区在线不卡| 91精品91久久久中77777| 国产九色精品成人porny| 日韩精品一级二级| 亚洲久草在线视频| 国产精品美日韩| 国产亚洲一区字幕| 欧美成人艳星乳罩| 日韩欧美亚洲另类制服综合在线| 色综合久久综合| 99re视频精品| 成人精品国产福利| 国产成人激情av| 国产一本一道久久香蕉| 免费三级欧美电影| 免费国产亚洲视频| 日韩成人一区二区三区在线观看| 亚洲精品伦理在线| 亚洲视频中文字幕| 中文字幕在线免费不卡| 亚洲国产成人午夜在线一区| 欧美刺激午夜性久久久久久久| 欧美高清精品3d| 欧美日韩免费不卡视频一区二区三区| 色婷婷综合五月| 99国产一区二区三精品乱码| av一区二区三区在线| 成人黄色大片在线观看| 成人av影院在线| 成年人午夜久久久| 在线视频综合导航| 欧美体内she精视频| 欧美猛男超大videosgay| 欧美日本一区二区在线观看| 欧美高清视频一二三区| 日韩精品一区二区三区在线| 日韩亚洲电影在线| 精品电影一区二区三区| 国产免费成人在线视频| 综合电影一区二区三区| 亚洲一级不卡视频| 日韩成人伦理电影在线观看| 日韩中文字幕不卡| 国产精品一二三区| 91香蕉国产在线观看软件| 99久久久精品| 6080午夜不卡| 久久蜜桃av一区二区天堂| 国产精品美女久久久久aⅴ| 亚洲精品老司机| 美日韩黄色大片| 成人国产精品免费网站| 日本高清无吗v一区| 日韩午夜小视频| 中文在线一区二区 | 国产剧情在线观看一区二区| 豆国产96在线|亚洲| 91在线国产观看| 欧美一区二区三区人| 国产网红主播福利一区二区| 亚洲精品一二三| 九九精品视频在线看| 色综合中文字幕国产 | 国产精品一区专区| 成人激情小说乱人伦| 7777精品伊人久久久大香线蕉经典版下载 | 一区二区三区中文在线观看| 天堂成人国产精品一区| 国产精品综合视频| 欧美在线短视频| 久久久噜噜噜久久人人看| 亚洲综合成人在线视频| 国产精品一二三| 91麻豆精品国产91久久久资源速度| 国产亚洲一区二区在线观看| 亚洲免费看黄网站| 国产在线精品一区二区夜色| 91成人看片片| 国产精品理论在线观看| 久久精品国产色蜜蜜麻豆| 欧洲av在线精品| 国产精品午夜免费| 久久不见久久见中文字幕免费| 色偷偷成人一区二区三区91| 久久伊人中文字幕| 日本视频一区二区| 91福利区一区二区三区| 国产精品久久一卡二卡| 韩国精品免费视频| 6080午夜不卡| 午夜精品久久久久久久99水蜜桃 | 亚洲资源在线观看| 国产福利精品导航| 精品国产三级电影在线观看| 亚洲1区2区3区视频| 91啪亚洲精品| 国产精品久久精品日日| 国产激情偷乱视频一区二区三区| 9191成人精品久久| 亚洲大片一区二区三区| 一本大道久久a久久综合| 久久久久久久久岛国免费| 蜜桃久久精品一区二区| 日韩视频免费观看高清完整版在线观看 | 国产精品一区免费视频| 日韩女同互慰一区二区| 日韩高清不卡在线| 欧美日韩一区视频| 婷婷久久综合九色综合绿巨人| 欧美丝袜丝交足nylons| 亚洲一区二区中文在线| 欧美亚洲另类激情小说| 亚洲va欧美va国产va天堂影院| 在线视频一区二区三区|