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

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

?? rtl8019.c

?? Rtl8019網卡驅動(S3C44B0X)(8,16位模式)
?? C
字號:
/*
 * port to 16bit/8bit remote dma mode lq@cdgwbn.com.cn  * linux/deriver/net/Rtl8019as.c * Ethernet driver for Samsung 44B0 * Copyright (C) 2003 antiscle <hzh12@163.net> * Copyright (C) 2003 microlite <lu_weixi@163.com> */#include <linux/config.h>#include <linux/module.h>#include <linux/init.h>#include <linux/sched.h>#include <linux/kernel.h>#include <linux/slab.h>		// kmalloc()#include <linux/errno.h>	// error codes#include <linux/types.h>	// size_t#include <linux/interrupt.h>	// mark_bh#include <linux/in.h>#include <linux/netdevice.h>    // net_device#include <linux/etherdevice.h>#include <linux/ip.h>#include <linux/tcp.h>#include <linux/skbuff.h>#include <linux/types.h>#include <asm/irq.h>#include "Rtl8019.h"#undef DEBUG#ifdef	DEBUG#define TRACE(str, args...)	printk(str, ## args)#else#define TRACE(str, args...)#endiftypedef unsigned char U8;#define	outportb(port, data)	*((volatile u8 *)(port)) = (u8)(data)#define	inportb(port)			*((volatile u8 *)(port))#define	outportw(port, data)	*((volatile u16 *)(port)) = (u16)(data)#define	inportw(port)		*((volatile u16 *)(port))#define	ETH_FRAME_LEN	1514#define	RPSTART	0x4c#define	RPSTOP	0x80#define	SPSTART	0x40static int timeout = 100;	// tx watchdog ticks 100 = 1sstatic char *version = "Samsung S3C44B0 Rtl8019as driver version 1.0\n";/* * This structure is private to each device. It is used to pass * packets in and out, so there is place for a packet */struct nic_8019_priv {	struct net_device_stats stats;		spinlock_t lock;	struct sk_buff *skb;};/*****************************************************************************/static u8 rBNRY;static u8 SrcMacID[ETH_ALEN] = {0x00,0x80,0x48,0x12,0x34,0x56};static void SetRegPage( u8 PageIdx){	 u8 temp;		temp = inportb(BaseAddr);		temp = (temp&0x3b)|(PageIdx<<6);							outportb(BaseAddr, temp);}/*static void SetMacID(){	int i;		SetRegPage(1);	for(i=0; i<6; i++)		outportb(PAR0+i*2, SrcMacID[i]);}*//* * rx */static void nic_8019_rx(int irq, void *dev_id, struct pt_regs *regs){	u8 RxPageBeg, RxPageEnd;	u8 RxNextPage;	u8 RxStatus;#ifdef RTL8019_OP_16	 	u16 *data,temp;	u16 i, RxLength,RxLen;#else	u8 *data;	int i, RxLength, RxLen;#endif		struct sk_buff *skb;		struct net_device *dev = (struct net_device *) dev_id;	struct nic_8019_priv *priv = (struct nic_8019_priv *) dev->priv;	TRACE("TX/RX Interupt!\n");	spin_lock(&priv->lock);	SetRegPage(0);	outportb(BNRY, rBNRY);		//???	RxStatus = inportb(ISR);	if(RxStatus&2)	{	  outportb(ISR, 0x2);		//clr TX interupt	  priv->stats.tx_packets++;		  TRACE("transmit one packet complete!\n");	}	if(RxStatus&1)	{	  TRACE("Receivex packet....\n");			  outportb(ISR, 0x1);	         //clr Rx interupt		  SetRegPage(1);	  RxPageEnd = inportb(CURR);	  SetRegPage(0);		  RxPageBeg = rBNRY+1;	  if(RxPageBeg>=RPSTOP)	    RxPageBeg = RPSTART;			  outportb(BaseAddr, 0x22);	// stop	remote dma	  	  //outport(RSAR0, RxPageBeg<<8);	  //outport(RBCR0, 256);			  outportb(RSAR0, 0);	  outportb(RSAR1, RxPageBeg);	  outportb(RBCR0, 4);	  outportb(RBCR1, 0);		  outportb(BaseAddr, 0xa);
#ifdef RTL8019_OP_16	  temp       = inportw(RWPORT);	  RxNextPage = temp>>8;	  RxStatus   = temp&0xff;	  RxLength   = inportw(RWPORT);
#else
	  RxStatus   = inportb(RWPORT);
	  RxNextPage = inportb(RWPORT);	
	  RxLength   = inportb(RWPORT);
	  RxLength  |= inportb(RWPORT)<<8;
#endif			  TRACE("\nRxBeg = %x, RxEnd = %x,  nextpage = %x,  size = %i\n", RxPageBeg, RxPageEnd, RxNextPage, RxLength);			  if (RxLength == 0)	  {	  	  TRACE("RxLength == 0 \n");	      return;		  }		  RxLength -= 4;	  if(RxLength>ETH_FRAME_LEN)	    {	      if(RxPageEnd==RPSTART)			rBNRY = RPSTOP-1;	      else			rBNRY = RxPageEnd-1;							      outportb(BNRY, rBNRY);	      TRACE("RxLength more long than %x\n", ETH_FRAME_LEN);	      return;			    }#ifdef RTL8019_OP_16	  skb = dev_alloc_skb(RxLength+2);#else	skb = dev_alloc_skb(RxLength);#endif			  if(!skb) 	    {	      TRACE("Rtl8019as eth: low on mem - packet dropped\n");	      priv->stats.rx_dropped++;	      return;	    }			  skb->dev = dev;			  skb_reserve(skb, 2);	  skb_put(skb, RxLength);#ifdef RTL8019_OP_16	  	  data = ( u16 *)skb->data;#else		data = (u8 *)skb->data;#endif	  //		eth_copy_and_sum(skb, data, len, 0);	  outportb(RSAR0, 4);	  outportb(RSAR1, RxPageBeg);	  outportb(RBCR0, RxLength);	  outportb(RBCR1, RxLength>>8);		  outportb(BaseAddr, 0xa);#ifdef RTL8019_OP_16	  i = 2;	  data -= 2;
	  RxLen=(RxLength+1)/2;	
#else 
	  i = 4;
	  data -= 4;
	  RxLen=RxLength;
#endif		for(; RxLen--;)		{
#ifdef RTL8019_OP_16			if(!(i&0x7f))
#else
			if(!(i&0xff))
#endif			{				outportb(BNRY, RxPageBeg);							  	RxPageBeg++;		  		if(RxPageBeg>=RPSTOP)		    		RxPageBeg = RPSTART;								}
#ifdef RTL8019_OP_16	    	data[i++] = inportw(RWPORT);					TRACE("%2X,%2X,", data[i-1]&0xff,data[i-1]>>8);
#else
			data[i++] = inportb(RWPORT);		
			TRACE("%2X,", data[i-1]);
#endif
		}		TRACE("\n");		outportb(BNRY, RxPageBeg);			rBNRY = RxPageBeg;				skb->protocol = eth_type_trans(skb, dev);		TRACE("\nprotocol=%x\n", skb->protocol);		priv->stats.rx_packets++;		priv->stats.rx_bytes +=RxLength;		netif_rx(skb);	}	else	  {	    outportb(ISR, 0xfe);		  }		spin_unlock(&priv->lock);}/* * Open and Close */static int nic_8019_open(struct net_device *dev){	int i;	MOD_INC_USE_COUNT;	TRACE("open\n");	// Disable irqs	disable_irq(dev->irq);	// register rx isr	if(request_irq(dev->irq, &nic_8019_rx, SA_INTERRUPT, "eth rx isr", dev)) {	  printk(KERN_ERR "Rtl8019: Can't get irq %d\n", dev->irq);	  return -EAGAIN;	}	// wake up Rtl8019as	SetRegPage(3);		outportb(CR9346, 0xcf);	//set eem1-0, 11 ,enable write config register	outportb(CONFIG3, 0x50);//clear pwrdn, sleep mode, set led0 as led_col, led1 as led_crs		outportb(CR9346, 0x3f); //disable write config register	// initialize	outportb(RstAddr, 0x5a);	i = 20000;	while(i--);	SetRegPage(0);	inportb(ISR);					outportb(BaseAddr, 0x21);   /* set page 0 and stop */	outportb(Pstart, RPSTART);  /* set Pstart 0x4c */	outportb(Pstop, RPSTOP);    /* set Pstop 0x80 */	outportb(BNRY, RPSTART);    /* BNRY-> the last page has been read */		outportb(TPSR, SPSTART);    /* SPSTART page start register, 0x40 */	outportb(RCR, 0xcc);	    /* set RCR 0xcc */		outportb(TCR, 0xe0);	    /* set TCR 0xe0 */#if	RTL8019_OP_16	outportb(DCR, 0xc9);	    /* set DCR 0xc9, 16bit DMA */	#else	outportb(DCR, 0xc8);	    /* 8bit DMA */#endif	outportb(IMR, 0x03);	    /* set IMR 0x03, enable tx rx int */	outportb(ISR, 0xff);	    /* clear ISR */	SetRegPage(1);	for(i=0; i<6; i++)#if	RTL8019_OP_16	  outportb(BaseAddr+(1+i)*2, dev->dev_addr[i]);	// set mac id#else	  outportb(BaseAddr+1+i, dev->dev_addr[i]);	// set mac id#endif	outportb(CURR, RPSTART+1);		outportb(MAR0, 0x00);	outportb(MAR1, 0x41);	outportb(MAR2, 0x00);	outportb(MAR3, 0x80);	outportb(MAR4, 0x00);	outportb(MAR5, 0x00);	outportb(MAR6, 0x00);	outportb(MAR7, 0x00);	outportb(BaseAddr, 0x22);		/* set page 0 and start */		rBNRY = RPSTART;	enable_irq(dev->irq);			// Start the transmit queue	netif_start_queue(dev);		return 0;}static int nic_8019_stop(struct net_device *dev){	TRACE("stop\n");	SetRegPage(3);		outportb(CR9346, 0xcf);		// set eem1-0, 11 ,enable write config register	outportb(CONFIG3, 0x66);	// enter pwrdn, sleep mode, set led0 as led_col, led1 as led_crs		outportb(CR9346, 0x3f); 	// disable write config register	free_irq(dev->irq, dev);		netif_stop_queue(dev);	MOD_DEC_USE_COUNT;		return 0;}static int nic_8019_start_xmit(struct sk_buff *skb, struct net_device *dev){	int i;#ifdef RTL8019_OP_16	u16 len,TxLen;	u16 *data;#else	int len, TxLen;
	u8 *data;#endif		struct nic_8019_priv *priv = (struct nic_8019_priv *) dev->priv;	TRACE("start_xmit\n");	len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;	TRACE("\nTx Length = %i,%x,%x\n", len, skb->data[12], skb->data[13]);#ifdef RTL8019_OP_16	data =(u16*) skb->data;#else	data = (u8*)skb->data;#endif				outportb(BaseAddr,0x22);  //switch to page 0 and stop remote dma//	if(inportb(BaseAddr)&4)//		return 1;	// last remote dma not complete,return 1 echo busy(error),retransmit next
#ifdef bug_fix_for_write
//read page 42,0,42,0 before write if you have problem
#endif
	outportb(RSAR0, 0);	outportb(RSAR1, SPSTART);	outportb(RBCR0, len&0xff);		outportb(RBCR1, len>>8);				outportb(BaseAddr, 0x12);	//begin remote write	dev->trans_start = jiffies;	
#ifdef RTL8019_OP_16
	TxLen=(len+1)/2;
#else
	TxLen=len;
#endif
	for(i=0; i<TxLen; i++)    	{				
#ifdef RTL8019_OP_16				outportw(RWPORT, data[i]);		// copy data to nic ram		TRACE("%2X,%2X,",data[i]&0xff,data[i]>>8);
#else
		outportb(RWPORT, data[i]);		// copy data to nic ram
		TRACE("%2X,",skb->data[i]);
#endif
	}					TRACE("\n");	while(inportb(BaseAddr)&4);			// wait for last tx operation end		outportb(TPSR,  SPSTART);       // transmit begin page 0x40	outportb(TBCR0, len&0xff);		outportb(TBCR1, len>>8);					outportb(BaseAddr, 0x1e);	// begin to send packet		dev_kfree_skb(skb);	return 0;}static struct net_device_stats *nic_8019_get_stats(struct net_device *dev){	struct nic_8019_priv *priv = (struct nic_8019_priv *) dev->priv;	TRACE("get_stats\n");	return &priv->stats;}/******************************************************************************/static int nic_8019_init(struct net_device *dev){	int i;	TRACE("init\n");	ether_setup(dev);	// Assign some of the fields	// set net_device methods	dev->open = nic_8019_open;	dev->stop = nic_8019_stop;	dev->get_stats = nic_8019_get_stats;	dev->hard_start_xmit = nic_8019_start_xmit;	// set net_device data members	dev->watchdog_timeo = timeout;	dev->irq = INT_EINT1; //INT_EXTINT1;	dev->dma = 0;	// set MAC address manually	printk(KERN_INFO "%s: ", dev->name);	for(i=0; i<6; i++)	{		dev->dev_addr[i] = SrcMacID[i];				printk("%2.2x%c", dev->dev_addr[i], (i==5) ? ' ' : ':');	}	printk("\n");	SET_MODULE_OWNER(dev);	dev->priv = kmalloc(sizeof(struct nic_8019_priv), GFP_KERNEL);	if(dev->priv == NULL)		return -ENOMEM;	memset(dev->priv, 0, sizeof(struct nic_8019_priv));	spin_lock_init(&((struct nic_8019_priv *) dev->priv)->lock);	return 0;}static struct net_device nic_8019_netdevs = {	init: nic_8019_init,};/* * Finally, the module stuff */int __init nic_8019_init_module(void){	int result;	TRACE("init_module\n");	//Print version information	printk(KERN_INFO "%s", version);	//register_netdev will call nic_8019_init()	if((result = register_netdev(&nic_8019_netdevs)))	  printk("Rtl8019as eth: Error %i registering device \"%s\"\n", result, nic_8019_netdevs.name);	return result ? 0 : -ENODEV;}void __exit nic_8019_cleanup(void){	TRACE("cleanup\n");	kfree(nic_8019_netdevs.priv);	unregister_netdev(&nic_8019_netdevs);	return;}module_init(nic_8019_init_module);module_exit(nic_8019_cleanup);MODULE_DESCRIPTION("Rtl8019as ethernet driver");MODULE_AUTHOR("microlite <lu_weixi@163.com>");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线亚洲一区二区| 日韩免费视频一区二区| 91免费视频观看| 欧美在线一二三四区| 538在线一区二区精品国产| 久久精品网站免费观看| 国产精品国产三级国产aⅴ无密码 国产精品国产三级国产aⅴ原创 | 欧美一级日韩免费不卡| 国产精品免费免费| 久久国产婷婷国产香蕉| 日本道精品一区二区三区| 国产亚洲欧美中文| 久久er99精品| 欧美大胆人体bbbb| 图片区日韩欧美亚洲| 色呦呦国产精品| 综合久久久久久| 国产成人福利片| 精品日产卡一卡二卡麻豆| 日产国产高清一区二区三区| 日本道在线观看一区二区| 中文字幕在线不卡一区| 国产成人福利片| 久久久久久久久久久99999| 日本不卡一区二区| 欧美精品九九99久久| 亚洲午夜国产一区99re久久| 99久久婷婷国产综合精品电影| 国产欧美一区二区在线观看| 国产精品综合在线视频| 久久免费电影网| 国产精品18久久久久久久久| 久久九九全国免费| 国产黑丝在线一区二区三区| 久久夜色精品一区| 国产成人精品亚洲午夜麻豆| 国产午夜久久久久| 成人18精品视频| 亚洲蜜臀av乱码久久精品蜜桃| 91免费在线播放| 亚洲黄色小说网站| 精品视频1区2区| 毛片av一区二区| 久久人人超碰精品| 成人av在线看| 亚洲一区二区三区中文字幕在线| 在线影视一区二区三区| 午夜精品在线看| 欧美成人bangbros| 成人伦理片在线| 亚洲成人动漫在线免费观看| 欧美精品久久一区二区三区| 国内精品久久久久影院一蜜桃| 欧美韩日一区二区三区四区| 91麻豆文化传媒在线观看| 日韩欧美不卡一区| 丁香网亚洲国际| 亚洲六月丁香色婷婷综合久久| 欧美性受极品xxxx喷水| 九九精品一区二区| 自拍偷在线精品自拍偷无码专区 | 91超碰这里只有精品国产| 亚洲精品免费在线播放| 欧美三级欧美一级| 日本特黄久久久高潮| 日韩丝袜情趣美女图片| 国产精品系列在线播放| 国产精品人人做人人爽人人添| 99re亚洲国产精品| 一区二区激情小说| 日韩小视频在线观看专区| 国产乱人伦偷精品视频不卡| 国产精品传媒入口麻豆| 欧美二区三区91| 99久免费精品视频在线观看| 一区二区免费看| 亚洲国产精品成人综合| 欧美美女喷水视频| 成人av手机在线观看| 老司机精品视频在线| 亚洲欧美激情小说另类| 日韩欧美一区电影| 欧美日韩一区二区三区在线看 | 日日嗨av一区二区三区四区| 久久久亚洲综合| 在线播放国产精品二区一二区四区| 国产盗摄一区二区| 麻豆极品一区二区三区| 亚洲在线中文字幕| 亚洲色图在线视频| 国产欧美精品国产国产专区| 91精品国产乱| 欧美日韩一级视频| 色域天天综合网| av爱爱亚洲一区| 国产麻豆视频一区二区| 免费高清视频精品| 日本亚洲电影天堂| 日产欧产美韩系列久久99| 亚洲已满18点击进入久久| 亚洲免费av观看| 亚洲九九爱视频| 国产精品污污网站在线观看| 久久嫩草精品久久久精品| 欧美xfplay| 精品国产免费久久| 26uuu精品一区二区在线观看| 欧美精品精品一区| 日韩一级精品视频在线观看| 欧美日韩一区二区三区不卡| 日本高清不卡在线观看| 91蜜桃婷婷狠狠久久综合9色| 成人激情视频网站| 成人福利在线看| 色综合中文字幕国产| 成人性生交大合| 成人av免费在线| 91在线观看视频| 色噜噜狠狠成人中文综合| 91极品美女在线| 欧洲色大大久久| 欧美精品在线观看一区二区| 欧美性大战久久| 91精品国产丝袜白色高跟鞋| 欧美电影免费观看高清完整版在| 欧美va亚洲va香蕉在线| 久久综合九色综合久久久精品综合| 精品国产91乱码一区二区三区| 久久综合色8888| **网站欧美大片在线观看| 亚洲精品精品亚洲| 日日摸夜夜添夜夜添国产精品| 看片网站欧美日韩| 国产999精品久久久久久绿帽| 91视频91自| 欧美一级高清大全免费观看| 亚洲精品一区二区三区精华液| 国产日产精品1区| 一级中文字幕一区二区| 日韩精品成人一区二区在线| 国产精品一区二区久久不卡| 91视频精品在这里| 日韩欧美色电影| 亚洲欧美偷拍卡通变态| 日日摸夜夜添夜夜添亚洲女人| 国产主播一区二区| 欧美午夜精品久久久久久超碰 | 国产成人av一区二区三区在线 | 久久青草欧美一区二区三区| 亚洲婷婷综合久久一本伊一区| 日日夜夜一区二区| 国产99久久久久久免费看农村| 欧美专区亚洲专区| 欧美高清一级片在线观看| 亚洲成精国产精品女| 国产91丝袜在线播放九色| 欧美日韩亚洲综合在线 | 久久国产剧场电影| 91丝袜国产在线播放| 欧美videossexotv100| 亚洲视频每日更新| 国产精品一区二区你懂的| 在线观看一区不卡| 久久久亚洲午夜电影| 亚洲一卡二卡三卡四卡无卡久久| 韩国在线一区二区| 欧美精品高清视频| 亚洲精品国产一区二区精华液 | 亚洲免费在线观看| 久久激情五月激情| 欧美日韩一区二区在线视频| 亚洲欧美中日韩| 国产精品正在播放| 欧美一级一级性生活免费录像| 亚洲精品伦理在线| av影院午夜一区| 国产欧美日韩三区| 久久99国产精品免费| 欧美日韩色综合| 亚洲精品视频一区二区| 豆国产96在线|亚洲| 久久这里只有精品6| 精品综合久久久久久8888| 91精品国产综合久久久蜜臀粉嫩| 亚洲综合色网站| 在线日韩av片| 亚洲精品日韩综合观看成人91| 91香蕉视频mp4| 一区在线观看免费| av色综合久久天堂av综合| 国产日韩欧美综合在线| 国产成人免费视频| 欧美国产日韩亚洲一区| 高清在线观看日韩| 中文字幕国产一区二区| 国产aⅴ精品一区二区三区色成熟| 国产日韩欧美精品电影三级在线| 国内精品久久久久影院薰衣草| 久久一区二区视频| 高清国产一区二区三区|