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

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

?? s3c4510.c

?? arm網絡驅動程序
?? 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一区二区三区免费野_久草精品视频
欧美年轻男男videosbes| 成人h动漫精品一区二区| 欧美日韩日本视频| 午夜精品久久久久久久久久| 日韩亚洲欧美一区二区三区| 精品一区二区三区久久久| 久久久一区二区三区捆绑**| 国产91精品一区二区麻豆亚洲| 国产精品久久久久久久裸模 | 美女脱光内衣内裤视频久久网站| 欧美一区二区在线不卡| 国产一区二区三区在线观看免费 | 天天影视网天天综合色在线播放| 欧美一级理论片| 国v精品久久久网| 亚洲自拍偷拍图区| 精品国产一区二区三区忘忧草| 国产精华液一区二区三区| 一区二区三区四区视频精品免费 | 日韩成人一级片| 久久久久久97三级| 欧美影院午夜播放| 精品一区二区三区免费| 一区二区三区精品在线| 欧美大黄免费观看| 91蜜桃在线观看| 麻豆国产欧美一区二区三区| 综合久久久久久久| 日韩视频一区二区在线观看| 成人av资源下载| 日本不卡不码高清免费观看| 中文字幕在线不卡一区| 日韩午夜av一区| 91黄色免费版| 国产不卡视频一区二区三区| 午夜精品视频一区| 亚洲色图第一区| 国产亚洲一区二区在线观看| 精品视频一区 二区 三区| 国产成人自拍网| 奇米色一区二区| 一区二区三区在线不卡| 久久久精品免费免费| 欧美日韩久久久一区| 不卡大黄网站免费看| 麻豆极品一区二区三区| 亚洲妇女屁股眼交7| 成人欧美一区二区三区视频网页 | 久久精品一二三| 欧美精品在线观看一区二区| 色综合夜色一区| 成人在线综合网| 韩国三级中文字幕hd久久精品| 亚洲成av人片观看| 综合婷婷亚洲小说| 国产精品女同一区二区三区| 欧美精品一区二区三区一线天视频| 欧美视频中文字幕| 欧美在线一区二区| 99热精品一区二区| 成人黄动漫网站免费app| 国产美女一区二区三区| 久久97超碰色| 蜜臀av一区二区在线观看| 午夜亚洲国产au精品一区二区| 一区二区三区欧美亚洲| 日韩一区中文字幕| 亚洲欧美日韩国产手机在线| 中文字幕视频一区| 亚洲欧洲日韩av| 亚洲欧洲精品成人久久奇米网| 中文欧美字幕免费| 国产精品欧美精品| 亚洲三级在线播放| 一区二区三区高清不卡| 一区二区三区在线视频观看| 亚洲一区二区三区四区五区中文| 一区二区三区在线观看动漫| 一区二区三区欧美久久| 亚洲精品视频在线观看免费| 亚洲伊人色欲综合网| 午夜精品成人在线视频| 日韩在线一区二区三区| 奇米亚洲午夜久久精品| 国产一区亚洲一区| 成人小视频在线| 一本一本久久a久久精品综合麻豆| 色综合久久久久久久久| 欧美视频一区二区三区四区| 在线播放91灌醉迷j高跟美女 | 成人在线视频首页| 欧美日韩在线亚洲一区蜜芽| 极品销魂美女一区二区三区| 久久97超碰国产精品超碰| 美腿丝袜在线亚洲一区| 韩国精品在线观看| 成人一区二区三区视频在线观看| 成人午夜电影久久影院| 欧美在线999| 日韩限制级电影在线观看| 久久久久国产精品人| 亚洲精品视频在线| 青青草97国产精品免费观看无弹窗版| 精品一区二区在线免费观看| 成人免费视频视频在线观看免费| 国产成人免费视| 欧美中文一区二区三区| 亚洲精品在线观| 国产精品福利一区| 日韩av一区二区在线影视| 天天综合天天综合色| 午夜精品久久久久久久久| 黄一区二区三区| 成人app网站| 91精品国产色综合久久不卡蜜臀 | 91精品国产全国免费观看 | 国产拍揄自揄精品视频麻豆| 一区二区三区中文在线观看| 久久精品av麻豆的观看方式| www.欧美日韩国产在线| 欧美一区二区三区在线观看| 国产精品天干天干在线综合| 丝袜亚洲精品中文字幕一区| 成人黄色免费短视频| 日韩一区二区麻豆国产| 国产精品女主播在线观看| 视频在线观看一区| 粉嫩av一区二区三区粉嫩| 欧美一区二区三区在线观看视频| 中文字幕一区二区三区蜜月| 久久精品国产亚洲一区二区三区| 91网站在线播放| 国产亚洲女人久久久久毛片| 午夜激情一区二区三区| 成人免费看的视频| 精品精品欲导航| 亚洲伊人伊色伊影伊综合网| 播五月开心婷婷综合| 精品国产乱码久久久久久影片| 亚洲成人在线观看视频| www.欧美亚洲| 欧美国产激情二区三区 | 婷婷成人综合网| 在线视频国内一区二区| 欧美国产欧美综合| 国产高清精品久久久久| 精品久久久网站| 久久精品理论片| 欧美日本在线观看| 亚洲一区二区三区四区在线观看| av一区二区三区在线| 欧美高清在线视频| 国产精品资源网| 2017欧美狠狠色| 久久se这里有精品| 欧美tickling挠脚心丨vk| 天天av天天翘天天综合网色鬼国产| 日本韩国视频一区二区| 亚洲欧美另类在线| 91蜜桃免费观看视频| 亚洲欧洲精品一区二区三区| 91丨porny丨国产入口| 亚洲婷婷综合色高清在线| 成人免费高清在线| 国产精品美女一区二区三区| 波多野结衣欧美| 自拍av一区二区三区| 色综合视频一区二区三区高清| 国产精品国产三级国产| 白白色 亚洲乱淫| 亚洲精品乱码久久久久久| 欧美午夜精品久久久久久孕妇| 亚洲一区二区视频| 欧美日韩一区在线| 日本在线不卡一区| 精品久久久久久久久久久久包黑料 | 7777精品久久久大香线蕉| 香蕉影视欧美成人| 91.com在线观看| 美女视频黄久久| 国产午夜亚洲精品理论片色戒 | 国产亚洲精品免费| 成人午夜电影网站| 一区二区在线观看不卡| 欧美区一区二区三区| 久久成人免费日本黄色| 欧美激情一区二区在线| 在线欧美小视频| 日本sm残虐另类| 波多野洁衣一区| 亚洲风情在线资源站| 欧美性一二三区| 亚洲成在人线在线播放| 日韩区在线观看| 成人国产精品免费观看动漫| 麻豆免费精品视频| 国产欧美一区二区在线| 色又黄又爽网站www久久| 天天免费综合色| 国产日产亚洲精品系列|