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

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

?? dm9ks.c

?? Davicom s DM9000A driver
?? C
?? 第 1 頁 / 共 3 頁
字號:
/*

  dm9ks.c: Version 2.06 2007/01/03 
  
        A Davicom DM9000A/DM9010 ISA 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.

V2.00 Spenser - 01/10/2005
			- Modification for PXA270 MAINSTONE.
			- Modified dmfe_tx_done().
			- Add dmfe_timeout().
V2.01	10/07/2005	-Modified dmfe_timer()
			-Dected network speed 10/100M
V2.02	10/12/2005	-Use link change to chage db->Speed
			-dmfe_open() wait for Link OK  
V2.03	11/22/2005	-Power-off and Power-on PHY in dmfe_init_dm9000()
			-support IOL
V2.04	12/13/2005	-delay 1.6s between power-on and power-off in 
			 dmfe_init_dm9000()
			-set LED mode 1 in dmfe_init_dm9000()
			-add data bus driving capability in dmfe_init_dm9000()
			 (optional)
10/3/2006	-Add DM8606 read/write function by MDC and MDIO
V2.06	01/03/2007	-CONT_RX_PKT_CNT=0xFFFF
			-modify dmfe_tx_done function
			-check RX FIFO pointer
			-if using physical address, re-define I/O function
			-add db->cont_rx_pkt_cnt=0 at the front of dmfe_packet_receive()
*/

#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>

#ifdef CONFIG_ARCH_MAINSTONE
#include <asm/io.h>
#include <asm/hardware.h>
#include <asm/irq.h>
#endif

//#define DM8606

/* Board/System/Debug information/definition ---------------- */

#define DM9KS_ID		0x90000A46
#define DM9010_ID		0x90100A46
/*-------register name-----------------------*/
#define DM9KS_NCR		0x00	/* Network control Reg.*/
#define DM9KS_NSR		0x01	/* Network Status Reg.*/
#define DM9KS_TCR		0x02	/* TX control Reg.*/
#define DM9KS_RXCR		0x05	/* RX control Reg.*/
#define DM9KS_BPTR		0x08
#define DM9KS_EPCR		0x0b
#define DM9KS_EPAR		0x0c
#define DM9KS_EPDRL		0x0d
#define DM9KS_EPDRH		0x0e
#define DM9KS_GPR		0x1f	/* General purpose register */
#define DM9KS_TCR2		0x2d
#define DM9KS_SMCR		0x2f 	/* Special Mode Control Reg.*/
#define DM9KS_ETXCSR		0x30	/* Early Transmit control/status Reg.*/
#define	DM9KS_TCCR		0x31	/* Checksum cntrol Reg. */
#define DM9KS_RCSR		0x32	/* Receive Checksum status Reg.*/
#define DM9KS_MRCMDX		0xf0
#define DM9KS_MRCMD		0xf2
#define DM9KS_MDRAL		0xf4
#define DM9KS_MDRAH		0xf5
#define DM9KS_MWCMD		0xf8
#define DM9KS_TXPLL		0xfc
#define DM9KS_TXPLH		0xfd
#define DM9KS_ISR		0xfe
#define DM9KS_IMR		0xff
/*---------------------------------------------*/
#define DM9KS_REG05		0x30	/* SKIP_CRC/SKIP_LONG */ 
#define DM9KS_REGFF		0xA3	/* IMR */
#define DM9KS_DISINTR		0x80

#define DM9KS_PHY		0x40	/* PHY address 0x01 */
#define DM9KS_PKT_RDY		0x01	/* Packet ready to receive */

/* Added for PXA of MAINSTONE */
#ifdef CONFIG_ARCH_MAINSTONE
#include <asm/arch/mainstone.h>
#define DM9KS_MIN_IO		(MST_ETH_PHYS + 0x300)
#define DM9KS_MAX_IO            (MST_ETH_PHYS + 0x370)
#define DM9K_IRQ		MAINSTONE_IRQ(3)
#else
#define DM9KS_MIN_IO		0x300
#define DM9KS_MAX_IO		0x370
#define DM9KS_IRQ		3
#endif

#define DM9KS_VID_L		0x28
#define DM9KS_VID_H		0x29
#define DM9KS_PID_L		0x2A
#define DM9KS_PID_H		0x2B

#define DM9KS_RX_INTR		0x01
#define DM9KS_TX_INTR		0x02
#define DM9KS_LINK_INTR		0x20

#define DM9KS_DWORD_MODE	1
#define DM9KS_BYTE_MODE		2
#define DM9KS_WORD_MODE		0

#define TRUE			1
#define FALSE			0
/* Number of continuous Rx packets */
#define CONT_RX_PKT_CNT		0xFFFF

#define DMFE_TIMER_WUT  jiffies+(HZ*5)	/* timer wakeup time : 5 second */

#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

#ifndef CONFIG_ARCH_MAINSTONE
#pragma pack(push, 1)
#endif

typedef struct _RX_DESC
{
	u8 rxbyte;
	u8 status;
	u16 length;
}RX_DESC;

typedef union{
	u8 buf[4];
	RX_DESC desc;
} rx_t;
#ifndef CONFIG_ARCH_MAINSTONE
#pragma pack(pop)
#endif

enum DM9KS_PHY_mode {
	DM9KS_10MHD   = 0, 
	DM9KS_100MHD  = 1, 
	DM9KS_10MFD   = 4,
	DM9KS_100MFD  = 5, 
	DM9KS_AUTO    = 8, 
};

/* Structure/enum 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;

	u8 op_mode;			/* PHY operation mode */
	u8 io_mode;			/* 0:word, 2:byte */
	u8 device_wait_reset;		/* device state */
	u8 Speed;			/* current speed */

	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;

} board_info_t;
/* Global variable declaration ----------------------------- */
/*static int dmfe_debug = 0;*/
static struct net_device * dmfe_dev = NULL;

/* For module input parameter */
static int mode       = DM9KS_AUTO;
static int media_mode = DM9KS_AUTO;
static u8  irq        = DM9KS_IRQ;
static u32 iobase     = DM9KS_MIN_IO;

#if 0  // use physical address; Not virtual address
#ifdef outb
	#undef outb
#endif
#ifdef outw
	#undef outw
#endif
#ifdef outl
	#undef outl
#endif
#ifdef inb
	#undef inb
#endif
#ifdef inw
	#undef inw
#endif
#ifdef inl
	#undef inl
#endif
void outb(u8 reg, u32 ioaddr)
{
	(*(volatile u8 *)(ioaddr)) = reg;
}
void outw(u16 reg, u32 ioaddr)
{
	(*(volatile u16 *)(ioaddr)) = reg;
}
void outl(u32 reg, u32 ioaddr)
{
	(*(volatile u32 *)(ioaddr)) = reg;
}
u8 inb(u32 ioaddr)
{
	return (*(volatile u8 *)(ioaddr));
}
u16 inw(u32 ioaddr)
{
	return (*(volatile u16 *)(ioaddr));
}
u32 inl(u32 ioaddr)
{
	return (*(volatile u32 *)(ioaddr));
}
#endif

/* function declaration ------------------------------------- */
int dmfe_probe1(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 *);
#else
static irqreturn_t dmfe_interrupt(int , void *, struct pt_regs *);
#endif
static void dmfe_timer(unsigned long);
static void dmfe_init_dm9000(struct net_device *);
static unsigned long cal_CRC(unsigned char *, unsigned int, u8);
u8 ior(board_info_t *, int);
void iow(board_info_t *, int, u8);
static u16 phy_read(board_info_t *, int);
static void phy_write(board_info_t *, int, u16);
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 *);

#if defined(CHECKSUM)
static u8 check_rx_ready(u8);
#endif

#ifdef DM8606
#include "dm8606.h"
#endif

//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_probe(void)
{
	struct net_device *dev;
	int err;
	
	DMFE_DBUG(0, "dmfe_probe()",0);

#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_probe1(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_probe1(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,0x60,0x6E,0x33,0x44,0x55};
	u8 HasEEPROM=0;
	DMFE_DBUG(0, "dmfe_probe1()",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 == DM9KS_ID || id_val == DM9010_ID) {
			
			/* Request IO from system */
			if(!request_region(iobase, 2, dev->name))
				return -ENODEV;

			printk("<DM9KS> 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;

#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) /* use EEPROM */
					dev->dev_addr[i] = db->srom[i];
				else	/* No EEPROM */
					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;
	u8 reg_nsr;
	int i;
	DMFE_DBUG(0, "dmfe_open", 0);

	if (request_irq(dev->irq,&dmfe_interrupt,SA_SHIRQ,dev->name,dev)) 
		return -EAGAIN;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲福利一区二区| 亚洲午夜在线电影| 欧美日韩免费视频| 国产毛片精品视频| 亚洲最新视频在线播放| 久久久精品中文字幕麻豆发布| 在线一区二区视频| 风间由美一区二区三区在线观看| 婷婷综合久久一区二区三区| 国产精品国产自产拍高清av| 日韩免费看的电影| 欧美日韩一区成人| 91视频免费观看| 国产91丝袜在线观看| 免费成人深夜小野草| 亚洲国产精品久久久久秋霞影院| 亚洲国产精品高清| 久久这里都是精品| 日韩欧美一级特黄在线播放| 欧美午夜精品久久久久久孕妇| 播五月开心婷婷综合| 精品中文字幕一区二区| 日韩精品一级二级| 亚洲一区av在线| 依依成人精品视频| 亚洲欧洲精品成人久久奇米网| 欧美xxxxxxxxx| 欧美一区二区久久| 欧美一区二区三区成人| 欧美三级在线看| 欧美在线一二三| 在线免费视频一区二区| 成人国产精品视频| 成人午夜看片网址| 国产·精品毛片| 成人午夜精品一区二区三区| 国产.欧美.日韩| 成人免费毛片高清视频| a亚洲天堂av| fc2成人免费人成在线观看播放 | 免费黄网站欧美| 亚洲一区二区三区影院| 亚洲在线视频网站| 亚洲一区免费观看| 亚洲一区二区成人在线观看| 亚洲色图欧美激情| 在线播放视频一区| 欧洲精品中文字幕| proumb性欧美在线观看| 久久国产剧场电影| 亚洲综合免费观看高清在线观看| 精品免费日韩av| 337p亚洲精品色噜噜噜| 白白色亚洲国产精品| 亚洲综合色丁香婷婷六月图片| 中日韩免费视频中文字幕| 欧美一级xxx| 中文字幕综合网| 亚洲激情男女视频| 亚洲一区二区三区四区在线免费观看| 国产女人18毛片水真多成人如厕| 国产午夜精品一区二区三区视频 | 久久精品亚洲精品国产欧美| 久久精品国产精品亚洲红杏| 日韩成人精品在线观看| 黑人精品欧美一区二区蜜桃 | 狠狠色狠狠色综合系列| 亚洲视频在线一区| 午夜精品影院在线观看| 另类成人小视频在线| 国产成人综合视频| 色狠狠一区二区三区香蕉| 3d成人动漫网站| 久久久国产精品麻豆| 亚洲精选在线视频| 日本不卡123| 成人午夜在线播放| 91精品国产91久久综合桃花 | 一本一道久久a久久精品综合蜜臀| 欧美三级日本三级少妇99| ww久久中文字幕| 亚洲成年人网站在线观看| 午夜不卡av免费| 不卡av在线网| 日韩精品中文字幕在线不卡尤物| 日韩午夜在线播放| 亚洲精品在线三区| 亚洲成人福利片| 亚洲女性喷水在线观看一区| 极品美女销魂一区二区三区| 成人精品电影在线观看| 91麻豆精品在线观看| 欧美日韩黄色一区二区| 国产日韩三级在线| 免费人成黄页网站在线一区二区| 高清视频一区二区| 国产精品国产精品国产专区不蜜 | 欧美日韩国产小视频在线观看| 日韩一区二区免费在线观看| 国产精品国产精品国产专区不蜜| 日本午夜一本久久久综合| 91一区二区三区在线观看| 精品国产乱子伦一区| 日韩毛片精品高清免费| 国产美女一区二区| 69成人精品免费视频| 亚洲黄色免费电影| 国产成人免费视频精品含羞草妖精| 8v天堂国产在线一区二区| 亚洲欧洲成人av每日更新| 韩国女主播成人在线| 911国产精品| 亚洲欧美激情视频在线观看一区二区三区| 狠狠色狠狠色综合系列| 欧美一区二区三区成人| 亚洲午夜在线观看视频在线| 99精品国产99久久久久久白柏| 精品福利一区二区三区免费视频| 亚洲成人精品在线观看| 一本色道久久综合亚洲91| 国产精品美日韩| 国产一区二区三区四| 日韩欧美精品三级| 日韩成人dvd| 欧美疯狂做受xxxx富婆| 午夜国产精品一区| 欧美网站一区二区| 亚洲高清免费观看高清完整版在线观看 | 欧美疯狂性受xxxxx喷水图片| 亚洲三级在线观看| 成人av在线播放网站| 亚洲国产高清在线观看视频| 国产剧情一区在线| 国产亚洲成av人在线观看导航 | 成人白浆超碰人人人人| 日本一区二区三区在线不卡| 久久国产精品无码网站| 精品电影一区二区| 国内精品国产成人| 2021久久国产精品不只是精品| 麻豆一区二区在线| 精品日本一线二线三线不卡| 精品一区二区免费视频| 337p日本欧洲亚洲大胆色噜噜| 国产制服丝袜一区| 国产性色一区二区| av爱爱亚洲一区| 亚洲精品国产一区二区精华液| 色综合久久中文字幕| 亚洲一区视频在线| 555www色欧美视频| 91免费看`日韩一区二区| 亚洲欧美电影一区二区| 色老汉一区二区三区| 亚洲高清免费在线| 欧美变态tickle挠乳网站| 国产精品综合一区二区三区| 国产精品国产馆在线真实露脸 | 日韩欧美色电影| 国产精品一区二区三区四区| 中文字幕一区二区三区在线不卡| 日本韩国精品在线| 日韩中文字幕91| 久久久久久亚洲综合影院红桃| 不卡欧美aaaaa| 亚洲成人免费观看| 久久精品一区二区三区四区| 色综合中文字幕国产 | 欧美人牲a欧美精品| 日韩理论片网站| 亚洲女厕所小便bbb| 国产精品久久久久婷婷二区次| 久久久噜噜噜久久人人看| 精品国产乱子伦一区| 精品日本一线二线三线不卡| 精品乱人伦小说| 久久五月婷婷丁香社区| 久久免费看少妇高潮| 中文字幕精品一区二区精品绿巨人 | 色乱码一区二区三区88| 亚洲国产sm捆绑调教视频| 日韩欧美第一区| 97精品国产97久久久久久久久久久久| 亚洲v中文字幕| 国产欧美日韩中文久久| 51午夜精品国产| 成人黄色av网站在线| 秋霞电影一区二区| 亚洲视频一二三区| 欧美岛国在线观看| 91国偷自产一区二区使用方法| 在线看国产日韩| 国产人成一区二区三区影院| 亚洲h精品动漫在线观看| 欧美性感一区二区三区| 亚洲欧洲av在线| 成人18精品视频| 亚欧色一区w666天堂| 欧美aaaaa成人免费观看视频| 99久久精品国产精品久久|