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

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

?? s3c4510.c

?? 針對三星的4510b芯片下網卡芯片驅動的若干修改
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
 * linux/deriver/net/s3c4510.c
 * Ethernet driver for Samsung 4510B
 * Copyright (C) 2002 Mac Wang <mac@os.nctu.edu.tw>
 * 
 * Revised by Zheng Geng email: gzheng@sohu.com 2004.4
 *  	fix the  s3c4510_rx to check if the BDMA is hang 
 *	Add set_mac_address to change mac address when up
*	fix other spinlock problems in other fuction
 */  


#include <linux/config.h>
#include <linux/module.h>

#include <linux/init.h>
#include <linux/sched.h>
#include <linux/kernel.h>       // printk()
#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 <asm/irq.h>
#include "s3c4510.h"

#undef DEBUG
#ifdef	DEBUG
#define TRACE(str, args...)	printk("S3C4510 eth: " str, ## args)
#else
#define TRACE(str, args...)
#endif


static int timeout = 100;	// tx watchdog ticks 100 = 1s
static char *version = "Samsung S3C4510 Ethernet driver version 0.1 (2002-02-20) <mac@os.nctu.edu.tw>\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 s3c4510_priv {
	struct net_device_stats stats;

	unsigned long tx_ptr;
	unsigned long gtx_ptr;
	unsigned long rx_ptr;

	// Frame Descriptor linked list for S3C4510 MAC, initialized by FD_init()
	volatile struct FrameDesc rx_fd[RX_FRAME_SIZE];
	volatile struct FrameDesc tx_fd[TX_FRAME_SIZE];

	// Frame Buffer for S3C4510 MAC
	volatile struct ethframe  rx_buf[RX_FRAME_SIZE];
	volatile struct ethframe  tx_buf[TX_FRAME_SIZE];
	
	spinlock_t lock;

	struct sk_buff *skb;
};

/* --------------------- *
 * MII support functions *
 * --------------------- */
void MIIWrite(unsigned long PhyInAddr, unsigned long PhyAddr, unsigned long PhyData)
{
	CSR_WRITE(STADATA, PhyData);
	CSR_WRITE(STACON, PhyInAddr | PhyAddr | MiiBusy | PHYREGWRITE);
	while(CSR_READ(STACON) & MiiBusy);
}

unsigned long MIIRead(unsigned long PhyInAddr, unsigned long PhyAddr)
{
	CSR_WRITE(STACON, PhyInAddr | PhyAddr | MiiBusy);
	while(CSR_READ(STACON) & MiiBusy);
	return CSR_READ(STADATA);
}

/*
 *
 */
void FD_Init(struct net_device *dev)
{
	struct s3c4510_priv *priv = (struct s3c4510_priv *) dev->priv;

	struct FrameDesc *FD_ptr;
	struct FrameDesc *FD_start_ptr;
	struct FrameDesc *FD_last_ptr = NULL;
	unsigned long FB_base;
	unsigned long i;

	// TxFDInitialize() in diag code
	// Get Frame descriptor's base address
	// +0x4000000 is for setting this area to non-cacheable area.
	CSR_WRITE(BDMATXPTR, (unsigned long) priv->tx_fd + 0x4000000);
	priv->gtx_ptr = priv->tx_ptr = CSR_READ(BDMATXPTR);

	// Get Transmit buffer base address.
	FB_base = (unsigned long) priv->tx_buf + 0x4000000;

	// Generate linked list.
	FD_start_ptr = FD_ptr = (struct FrameDesc *)priv->tx_ptr;
	FD_last_ptr = NULL;

	for(i = 0; i < TX_FRAME_SIZE; i++) {
		if(FD_last_ptr == NULL)
			FD_last_ptr = FD_ptr;
		else
			FD_last_ptr -> NextFrameDescriptor = (unsigned long)FD_ptr;

		FD_ptr->FrameDataPtr = (unsigned long)(FB_base & CPU_owner);
		FD_ptr->Reserved = 0;
		FD_ptr->StatusAndFrameLength = (unsigned long)0x0;
		FD_last_ptr = FD_ptr;
		FD_ptr++;
		FB_base += sizeof(struct ethframe);
	}

	//Make Frame descriptor to ring buffer type.
	FD_last_ptr->NextFrameDescriptor = (unsigned long)FD_start_ptr;

	// RxFDInitialize() in diag code
	// Get Frame descriptor's base address
	CSR_WRITE(BDMARXPTR, (unsigned long) priv->rx_fd + 0x4000000);
	priv->rx_ptr = CSR_READ(BDMARXPTR);

	// Get Transmit buffer base address
	FB_base = (unsigned long)priv->rx_buf + 0x4000000;

	// Generate linked list
	FD_start_ptr = FD_ptr = (struct FrameDesc *)priv->rx_ptr;
	FD_last_ptr = NULL;

	for(i = 0; i < RX_FRAME_SIZE; i++) {
		if(FD_last_ptr == NULL )
			FD_last_ptr = FD_ptr;
		else
			FD_last_ptr -> NextFrameDescriptor = (unsigned long)FD_ptr;

		FD_ptr->FrameDataPtr = (unsigned long)(FB_base | BDMA_owner);
		FD_ptr->Reserved = 0;
		FD_ptr->StatusAndFrameLength = (unsigned long)0x0;
		FD_ptr->NextFrameDescriptor = 0x0;

		FD_last_ptr = FD_ptr;
		FD_ptr++;
		FB_base += sizeof(struct ethframe);
	}   

	// Make Frame descriptor to ring buffer type.
	FD_last_ptr->NextFrameDescriptor = (unsigned long)FD_start_ptr;
}


/*
 * rx
 */
void s3c4510_rx(int irq, void *dev_id, struct pt_regs *regs)
{
//	int i;
	int len;
	unsigned char *data;
	struct sk_buff *skb;
	struct FrameDesc *FD_ptr;
	unsigned long CFD_ptr;
	unsigned long RxStat;
	unsigned long BDMAStat;
	struct net_device *dev = (struct net_device *) dev_id;
	struct s3c4510_priv *priv = (struct s3c4510_priv *) dev->priv;
	TRACE("rx\n");

	spin_lock(&priv->lock);

	// 1. Get current frame descriptor and status
	CFD_ptr = CSR_READ(BDMARXPTR);
	BDMAStat = CSR_READ(BDMASTAT);

	// 2. Clear BDMA status register bit by write 1
	CSR_WRITE(BDMASTAT, BDMAStat | S_BRxRDF);

	do {
		// 3. Check Null List Interrupt
		/*
		if(CSR_READ(BDMASTAT) & BRxNL) {
			CSR_WRITE(BDMASTAT, );
		}
		*/

		// 4. Get Rx Frame Descriptor
		FD_ptr = (struct FrameDesc *) priv->rx_ptr;
		RxStat = (FD_ptr->StatusAndFrameLength >> 16) & 0xffff;
		
		// 5. If Rx frame is good, then process received frame
		if(RxStat & Good){
			len = (FD_ptr->StatusAndFrameLength & 0xffff) - 4;
			data = (unsigned char *) FD_ptr->FrameDataPtr + 2;

			// 6. Get received frame to memory buffer
			skb = dev_alloc_skb(len+2);
			if(!skb) {
				printk("S3C4510 eth: low on mem - packet dropped\n");
				priv->stats.rx_dropped++;
				spin_unlock(&priv->lock);
				return;
			}
//			memcpy(skb_put(skb, len), data, len);
/*
			printk("len: %d\n", len);
			for(i = 0; i < len; i++)
			{
				printk("%3x", data[i]);
				if((i+1)%16==0)
					printk("\n");
			}
			printk("\n");
*/
			skb->dev = dev;
			skb_reserve(skb, 2);
			skb_put(skb, len);
			eth_copy_and_sum(skb, data, len, 0);
			skb->protocol = eth_type_trans(skb, dev);
			priv->stats.rx_packets++;
			priv->stats.rx_bytes += len;
			netif_rx(skb);
		}
		else {
			// 7. If Rx frame has error, then process err frame
			priv->stats.rx_errors++;
			if(RxStat & LongErr)
				priv->stats.rx_length_errors++;
			if(RxStat & OvMax)
				priv->stats.rx_over_errors++;
			if(RxStat & CRCErr)
				priv->stats.rx_crc_errors++;
			if(RxStat & AlignErr)
				priv->stats.rx_frame_errors++;
			if(RxStat & Overflow)
				priv->stats.rx_fifo_errors++;
			
		}
		// 8. Change ownership to BDMA for next use
		FD_ptr -> FrameDataPtr |= BDMA_owner;

		// Save Current Status and Frame Length field, and clear
		FD_ptr -> StatusAndFrameLength = 0x0;

		// 9. Get Next Frame Descriptor pointer to process
		priv->rx_ptr = (unsigned long)(FD_ptr -> NextFrameDescriptor);
	}while(CFD_ptr != priv->rx_ptr);

	// 10. Check Notowner status
	if(CSR_READ(BDMASTAT) & S_BRxNO) {
		CSR_WRITE(BDMASTAT, S_BRxNO);
	}

	//check if the BDMA is hang 
	if (! (CSR_READ(BDMARXCON) & BRxEn))
                CSR_WRITE(BDMARXCON, gBDMARXCON);
	
	spin_unlock(&priv->lock);
}

/*
 * tx
 */
void s3c4510_tx(int irq, void *dev_id, struct pt_regs *regs)
{
	struct FrameDesc *FD_ptr;
	unsigned long CFD_ptr;
	unsigned long *FB_ptr;
	unsigned long status;
	struct net_device *dev = (struct net_device *) dev_id;
	struct s3c4510_priv *priv = (struct s3c4510_priv *) dev->priv;
	TRACE("tx\n");

	spin_lock(&priv->lock);

	CFD_ptr = CSR_READ(BDMATXPTR);
	while(priv->gtx_ptr != CFD_ptr)
	{
		FD_ptr = (struct FrameDesc *) priv->gtx_ptr;
		FB_ptr = (unsigned long *) &FD_ptr->FrameDataPtr;

		if(!(*FB_ptr & BDMA_owner))
		{
			status = (FD_ptr->StatusAndFrameLength >> 16) & 0xffff;
			if(status & Comp) {
				priv->stats.tx_packets++;
			}
			else {
				priv->stats.tx_errors++;
				if(status & TxPar)
					priv->stats.tx_aborted_errors++;
				if(status & NCarr)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产成人av电影在线| 一本色道久久综合精品竹菊| 成人黄色国产精品网站大全在线免费观看 | av在线这里只有精品| 欧美视频一区在线| 琪琪久久久久日韩精品| 成人一区二区三区视频在线观看| 欧美日本精品一区二区三区| 欧美国产精品一区二区| 日本不卡123| 欧美日韩精品高清| 亚洲天天做日日做天天谢日日欢| 美国av一区二区| 欧美日韩国产一级| 亚洲一二三四在线| 99久久精品情趣| 国产日韩在线不卡| 国内成+人亚洲+欧美+综合在线| 欧美性感一类影片在线播放| 中文字幕在线免费不卡| 国产一区二区视频在线| 欧美一级免费大片| 偷拍与自拍一区| 欧美精品一级二级| 天天综合网 天天综合色| 99精品1区2区| 亚洲男人的天堂在线aⅴ视频| 成人永久免费视频| 国产人久久人人人人爽| 国产美女一区二区| 久久综合给合久久狠狠狠97色69| 免播放器亚洲一区| 欧美大片顶级少妇| 久久97超碰色| 久久久精品综合| 丁香婷婷综合激情五月色| 久久久亚洲综合| 成人免费看视频| 国产精品久久久久一区二区三区共| 国产东北露脸精品视频| 中文在线免费一区三区高中清不卡| 国产在线视频精品一区| 国产日韩在线不卡| 91小视频免费观看| 一区二区三区四区在线免费观看 | 色又黄又爽网站www久久| 综合久久久久久| 91黄视频在线观看| 天堂成人国产精品一区| 日韩亚洲欧美高清| 国产成人在线观看免费网站| 中文字幕第一区综合| 91丨国产丨九色丨pron| 午夜精品免费在线观看| 日韩欧美卡一卡二| 一区二区在线电影| 久久久久久97三级| caoporm超碰国产精品| 欧美aaa在线| 日韩一区二区麻豆国产| 青青草一区二区三区| 精品欧美乱码久久久久久1区2区| 国产aⅴ综合色| 亚洲日本欧美天堂| 日韩一二三区视频| 成人av在线资源| 午夜精品爽啪视频| 国产欧美一区二区精品婷婷| 91最新地址在线播放| 轻轻草成人在线| 国产精品人妖ts系列视频| 91福利精品视频| 激情综合一区二区三区| 中文字幕免费不卡在线| 欧美三级日本三级少妇99| 精久久久久久久久久久| 亚洲免费观看高清完整版在线观看 | 日韩一本二本av| 91丨porny丨户外露出| 日韩精品免费专区| 中文字幕亚洲一区二区av在线 | 国产精品一区二区在线观看网站| 国产精品女主播av| 日韩视频免费直播| 99久久久免费精品国产一区二区| 日韩成人一区二区| 亚洲精品视频在线观看免费| 久久综合久久99| 欧美日韩免费一区二区三区视频| 国产精品18久久久久| 五月天欧美精品| √…a在线天堂一区| 2019国产精品| 欧美一级欧美三级在线观看| 久久综合狠狠综合| 欧美老肥妇做.爰bbww视频| www.性欧美| 国产精品正在播放| 久久精品国产免费看久久精品| 日韩一区中文字幕| 欧美极品少妇xxxxⅹ高跟鞋| 欧美一区二区三区的| 欧美三区在线观看| 99精品视频一区二区三区| 国产在线播精品第三| 日本一不卡视频| 性欧美大战久久久久久久久| 国产精品国产三级国产a| 久久久久国产精品厨房| 欧美va亚洲va| 精品日韩欧美一区二区| 欧美一级欧美一级在线播放| 欧美精品在线一区二区| 欧美日韩在线不卡| 欧美日韩一区 二区 三区 久久精品| 97se亚洲国产综合自在线不卡| 国产主播一区二区三区| 韩国av一区二区三区| 麻豆精品新av中文字幕| 蜜桃视频在线一区| 九九九精品视频| 久久国产日韩欧美精品| 精品一区二区国语对白| 六月婷婷色综合| 国产真实乱子伦精品视频| 极品少妇xxxx偷拍精品少妇| 精品一区免费av| 国产精品18久久久久久久久久久久 | 成人午夜激情片| 成人免费视频一区| 一本在线高清不卡dvd| 日本韩国一区二区三区| 欧美在线免费观看视频| 欧美高清视频一二三区 | 99久精品国产| 欧洲精品一区二区三区在线观看| 在线欧美小视频| 日韩一区二区影院| 久久日韩精品一区二区五区| 中文在线一区二区 | 色综合久久久久网| 欧美蜜桃一区二区三区| 欧美tk丨vk视频| 国产精品久久久一本精品| 亚洲一区二区高清| 毛片av中文字幕一区二区| 国产成人免费视频网站| 欧美性猛片aaaaaaa做受| 日韩欧美亚洲一区二区| 欧美国产综合色视频| 亚洲夂夂婷婷色拍ww47| 免费在线观看一区| 成人黄色777网| 欧美男人的天堂一二区| 国产三级欧美三级日产三级99| 亚洲精品成人精品456| 日本一不卡视频| 94色蜜桃网一区二区三区| 5858s免费视频成人| 欧美国产综合色视频| 无吗不卡中文字幕| 国产成人亚洲精品青草天美| 欧美少妇一区二区| 国产日韩欧美综合在线| 亚洲第一搞黄网站| 成人的网站免费观看| 91精品久久久久久久91蜜桃| 国产精品全国免费观看高清| 视频一区二区欧美| 色综合视频在线观看| www成人在线观看| 午夜精品久久久久久久久| 成人高清免费观看| 欧美电影免费观看高清完整版在 | 欧美一卡二卡三卡| 一区二区三区中文在线| 国产精品一二三区在线| 制服丝袜亚洲播放| 亚洲精品亚洲人成人网| 国产精品12区| 日韩欧美中文字幕一区| 亚洲国产精品人人做人人爽| 成人黄色777网| 久久久久99精品国产片| 蜜臀精品一区二区三区在线观看| 在线观看欧美日本| 综合在线观看色| 国产sm精品调教视频网站| 欧美一区二区三区在线观看视频| 一区二区在线免费观看| 99精品欧美一区二区蜜桃免费 | 在线不卡a资源高清| 亚洲人吸女人奶水| 9久草视频在线视频精品| 国产欧美日韩在线| 国产美女在线观看一区| 久久免费国产精品 | 亚洲成a人片在线不卡一二三区| 色综合久久88色综合天天| 亚洲日本一区二区|