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

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

?? s3c4510.c

?? arm網絡驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
					priv->stats.tx_carrier_errors++;
				if(status & Under)
					priv->stats.tx_fifo_errors++;
				if(status & LateColl)
					priv->stats.tx_window_errors++;
				if(status & ExColl)
					priv->stats.collisions++;
			}
		}
	
		// Clear Framedata pointer already used
		FD_ptr->StatusAndFrameLength = 0x0;
		priv->gtx_ptr = (unsigned long) FD_ptr->NextFrameDescriptor;
	}
	
	spin_unlock(&priv->lock);
	return;
}

/*
 * Open and Close
 */
int s3c4510_open(struct net_device *dev)
{
	int i;
#if 0
	unsigned long status;
#endif
	MOD_INC_USE_COUNT;

	TRACE("open\n");

	// Disable irqs
	disable_irq(INT_BDMATX);
	disable_irq(INT_BDMARX);
	disable_irq(INT_MACTX);
	disable_irq(INT_MACRX);

	// register rx isr
	if(request_irq(INT_BDMARX, &s3c4510_rx, SA_INTERRUPT, "eth rx isr", dev)) {
		printk(KERN_ERR "s3c4510: Can't get irq %d\n", INT_BDMARX);
		return -EAGAIN;
	}

	// register tx isr
	if(request_irq(INT_MACTX, &s3c4510_tx, SA_INTERRUPT, "eth tx isr", dev)) {
		printk(KERN_ERR "s3c4510: Can't get irq %d\n", INT_MACTX);
		return -EAGAIN;
	}

	printk("Reseting PHY\n");
	MIIWrite(0x0, 0x0, 1<<15);
//	while((MIIRead(0x0, 0x0) & (1<<15)));
#if 0	
	
	printk("Perform AN again\n");
	MIIWrite(0x0, 0x0, MIIRead(0x0, 0x0) & ~(1<<12));
//	while(!(MIIRead(0x11, 0x0) & (1<<4)));

	MIIWrite(0x0, 0x0, 1<<13|1<<8);
	
	status = MIIRead(0x11, 0x0);
	if(status & 1<<15)
		printk("10M/b  ");
	else
		printk("100M/b  ");
	if(status & 1<<14)
		printk("Full duplex\n");
	else	printk("Half duplex\n");
#endif	
	// reset BDMA and MAC
	CSR_WRITE(BDMARXCON, BRxRS);
	CSR_WRITE(BDMATXCON, BTxRS);
	CSR_WRITE(MACON, Reset);
	CSR_WRITE(BDMARXLSZ, sizeof(struct ethframe));
	CSR_WRITE(MACON, gMACCON);

	FD_Init(dev);

	for(i = 0; i < (int)dev->addr_len-2; i++)
		CAM_Reg(0) = (CAM_Reg(0) << 8) | dev->dev_addr[i];
	for(i = (int)dev->addr_len-2; i < (int)dev->addr_len; i++)
		CAM_Reg(1) = (CAM_Reg(1) << 8) | dev->dev_addr[i];
	CAM_Reg(1) = (CAM_Reg(1) << 16);

	CSR_WRITE(CAMEN, 0x0001);
	CSR_WRITE(CAMCON, gCAMCON);

	enable_irq(INT_BDMARX);
	enable_irq(INT_MACTX);

	// ReadyMACTx();
	CSR_WRITE(BDMATXCON, gBDMATXCON);
	CSR_WRITE(MACTXCON, gMACTXCON);
	// ReadyMACRx();
	CSR_WRITE(BDMARXCON, gBDMARXCON);
	CSR_WRITE(MACRXCON, gMACRXCON);

	// Start the transmit queue
	netif_start_queue(dev);
	
	return 0;
}

int s3c4510_stop(struct net_device *dev)
{
	TRACE("stop\n");
	CSR_WRITE(BDMATXCON, 0);
	CSR_WRITE(BDMARXCON, 0);
	CSR_WRITE(MACTXCON, 0);
	CSR_WRITE(MACRXCON, 0);

	free_irq(INT_BDMARX, dev);
	free_irq(INT_MACTX, dev);

	netif_stop_queue(dev);
	MOD_DEC_USE_COUNT;
	
	return 0;
}

int s3c4510_start_xmit(struct sk_buff *skb, struct net_device *dev)
{
//	int i;
	int len;
	char *data;
	struct s3c4510_priv *priv = (struct s3c4510_priv *) dev->priv;

	struct FrameDesc	*FD_ptr;	// frame descriptor pointer
	volatile unsigned long	*FB_ptr;	// frame data pointer
	unsigned char		*FB_data;	// frame data
	unsigned long ulFlags;
	
	spin_lock_irqsave(&priv->lock, ulFlags);
	TRACE("start_xmit\n");
/*
	printk("sk_buff->len: %d\n", skb->len);
	printk("sk_buff->data_len: %d\n", skb->data_len);
	for(i = 0; i < skb->len; i++) {
		printk("%4x", skb->data[i]);
		if((i+1)%16 ==0)
			printk("\n");
	}
	printk("\n");
*/
	len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
	data = skb->data;
	dev->trans_start = jiffies;
	
	// 1. Get Tx frame descriptor & data pointer
	FD_ptr = (struct FrameDesc *) priv->tx_ptr;
	FB_ptr = (unsigned long *) &FD_ptr->FrameDataPtr;
	FB_data = (unsigned char *) FD_ptr->FrameDataPtr;

	// 2. Check BDMA ownership
	if(*FB_ptr & BDMA_owner) {
		printk("no tx buffer\n");
//		check it later
//		netif_stop_queue(dev);
		spin_unlock_irqrestore(&priv->lock, ulFlags);
		return 1;
	}
	
	// 3. Prepare Tx Frame data to Frame buffer
	memcpy(FB_data, data, len);
	
	// 4. Set Tx Frame flag & Length Field
	FD_ptr->Reserved = (Padding | CRCMode | FrameDataPtrInc | LittleEndian | WA00 | MACTxIntEn);
	FD_ptr->StatusAndFrameLength = (len & 0xFFFF);
	
	// 5. Change ownership to BDMA
	FD_ptr->FrameDataPtr |= BDMA_owner;

	// 6. Enable MAC and BDMA Tx control register
	CSR_WRITE(BDMATXCON, gBDMATXCON);
	CSR_WRITE(MACTXCON, gMACTXCON);

	// 7. Change the Tx frame descriptor for next use
	priv->tx_ptr = (unsigned long)(FD_ptr->NextFrameDescriptor);

	spin_unlock_irqrestore(&priv->lock, ulFlags);

	dev_kfree_skb(skb);
	
	return 0;
}

struct net_device_stats *s3c4510_get_stats(struct net_device *dev)
{
	struct s3c4510_priv *priv = (struct s3c4510_priv *) dev->priv;
	TRACE("get_stats\n");
	return &priv->stats;
}

/*
*	change mac address when up
*/
static int	s3c4510_set_mac_address(struct net_device *dev, void *addr)
{
	struct sockaddr *p=(struct sockaddr *)addr;
	int i=0;
	s3c4510_stop(dev);
	memcpy(dev->dev_addr, p->sa_data,dev->addr_len);

	//Set CAM register
	for(i = 0; i < (int)dev->addr_len-2; i++)
		CAM_Reg(0) = (CAM_Reg(0) << 8) | dev->dev_addr[i];
	for(i = (int)dev->addr_len-2; i < (int)dev->addr_len; i++)
		CAM_Reg(1) = (CAM_Reg(1) << 8) | dev->dev_addr[i];
	CAM_Reg(1) = (CAM_Reg(1) << 16);

	CSR_WRITE(CAMEN, 0x0001);
	CSR_WRITE(CAMCON, gCAMCON);
	
	s3c4510_open(dev);
	return 0;
}

/*
 * The init function, invoked by register_netdev()
 */
int s3c4510_init(struct net_device *dev)
{
	int i;
	TRACE("init\n");
	ether_setup(dev);	// Assign some of the fields

	// set net_device methods
	dev->open = s3c4510_open;
	dev->stop = s3c4510_stop;
//	dev->ioctl = s3c4510_ioctl;
	dev->get_stats = s3c4510_get_stats;
//	dev->tx_timeout = s3c4510_tx_timeout;
	dev->hard_start_xmit = s3c4510_start_xmit;
	dev->set_mac_address=s3c4510_set_mac_address;
	
	// set net_device data members
	dev->watchdog_timeo = timeout;
	dev->irq = 17;
	dev->dma = 0;

	// set MAC address manually
	dev->dev_addr[0] = 0x00;
	dev->dev_addr[1] = 0x40;
	dev->dev_addr[2] = 0x95;
	dev->dev_addr[3] = 0x36;
	dev->dev_addr[4] = 0x35;
	dev->dev_addr[5] = 0x34;

	printk(KERN_INFO "%s: ", dev->name);
	for(i = 0; i < 6; i++)
		printk("%2.2x%c", dev->dev_addr[i], (i==5) ? ' ' : ':');
	printk("\n");

	SET_MODULE_OWNER(dev);

	dev->priv = kmalloc(sizeof(struct s3c4510_priv), GFP_KERNEL);
	if(dev->priv == NULL)
		return -ENOMEM;
	memset(dev->priv, 0, sizeof(struct s3c4510_priv));
	spin_lock_init(&((struct s3c4510_priv *) dev->priv)->lock);
	return 0;
}

struct net_device s3c4510_netdevs = {
	init: s3c4510_init,
};

/*
 * Finally, the module stuff
 */
int __init s3c4510_init_module(void)
{
	int result;
	TRACE("init_module\n");

	//Print version information
	printk(KERN_INFO "%s", version);

	//register_netdev will call s3c4510_init()
	if((result = register_netdev(&s3c4510_netdevs)))
		printk("S3C4510 eth: Error %i registering device \"%s\"\n", result, s3c4510_netdevs.name);
	return result ? 0 : -ENODEV;
}

void __exit s3c4510_cleanup(void)
{
	TRACE("cleanup\n");
	kfree(s3c4510_netdevs.priv);
	unregister_netdev(&s3c4510_netdevs);
	return;
}

module_init(s3c4510_init_module);
module_exit(s3c4510_cleanup);

MODULE_DESCRIPTION("Samsung 4510B ethernet driver");
MODULE_AUTHOR("Mac Wang <mac@os.nctu.edu.tw>");
MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩中文一区| 国产一区二区三区在线观看精品| 欧美成人精品1314www| 欧美午夜电影在线播放| 91福利国产精品| 欧美性色aⅴ视频一区日韩精品| 成人av资源站| 成人三级在线视频| 91色porny| 欧美色网一区二区| 91精品国产入口| 久久婷婷一区二区三区| 久久精品水蜜桃av综合天堂| 久久久精品天堂| 亚洲日本青草视频在线怡红院| 亚洲欧洲www| 亚洲电影一级片| 久久不见久久见中文字幕免费| 精品在线免费视频| 成人高清在线视频| 欧美性生活久久| 精品国产亚洲一区二区三区在线观看 | 精品三级在线观看| 久久久久久久av麻豆果冻| 国产精品麻豆网站| 亚洲国产精品久久人人爱 | 久久这里只有精品6| 中日韩av电影| 亚洲电影一级黄| 国产一二精品视频| 欧美性三三影院| 久久久噜噜噜久久中文字幕色伊伊| 日本一区二区成人在线| 亚洲午夜三级在线| 国模娜娜一区二区三区| 国产精品888| 9191精品国产综合久久久久久 | 国产一区欧美一区| 色婷婷国产精品| 亚洲精品一区二区三区在线观看| 欧美国产日本视频| 免费成人在线观看| 99久久婷婷国产综合精品| 欧美一区二区三区视频免费播放| 国产精品欧美一区二区三区| 日韩精品电影在线| 不卡av电影在线播放| 日韩精品资源二区在线| 尤物在线观看一区| 成人小视频在线| 日韩一区二区电影网| 亚洲一区自拍偷拍| 成人国产电影网| 国产亚洲精品bt天堂精选| 午夜精品福利一区二区蜜股av | 午夜电影网亚洲视频| 成人av网站免费| 久久综合色婷婷| 日韩一区精品视频| 色综合色综合色综合 | 色婷婷激情综合| 国产精品萝li| 成人天堂资源www在线| 欧美videos中文字幕| 日本午夜一区二区| 欧美日韩免费一区二区三区 | 成人在线视频首页| 久久综合999| 国产自产2019最新不卡| 精品入口麻豆88视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 欧美午夜电影网| 亚洲成人免费观看| 在线观看视频91| 亚洲va欧美va人人爽| 在线成人高清不卡| 免费日韩伦理电影| 欧美大片在线观看一区二区| 久久成人免费日本黄色| 欧美哺乳videos| 国产精品18久久久| 欧美国产一区在线| 91色porny| 视频在线在亚洲| 91精品国产91久久久久久最新毛片| 五月激情丁香一区二区三区| 欧美精品aⅴ在线视频| 日本在线不卡一区| www国产精品av| 波多野结衣在线aⅴ中文字幕不卡| 国产精品人妖ts系列视频| 91猫先生在线| 日韩高清不卡一区| 国产视频一区二区在线观看| youjizz国产精品| 亚洲国产成人av网| 欧美一级欧美三级在线观看| 国产专区综合网| 一区二区三区小说| 日韩一区二区中文字幕| 成人黄色软件下载| 亚洲一区视频在线| 精品久久久久av影院| 9色porny自拍视频一区二区| 亚洲无线码一区二区三区| 日韩三级中文字幕| 91在线国产福利| 久久成人久久爱| 亚洲一区二区视频在线观看| 日韩精品一区二区在线观看| 成人av高清在线| 免费一级片91| 亚洲精品成a人| 精品福利在线导航| 在线视频欧美区| 国产经典欧美精品| 日韩av中文字幕一区二区| 国产精品国产馆在线真实露脸 | 国产在线精品国自产拍免费| 亚洲视频1区2区| 久久只精品国产| 欧美久久久一区| 91在线免费播放| 丁香亚洲综合激情啪啪综合| 亚洲一区二区在线免费看| 欧美成人精品二区三区99精品| 色婷婷一区二区| 丁香网亚洲国际| 久久精品99国产国产精| 一区二区免费视频| 日韩美女啊v在线免费观看| 欧美刺激午夜性久久久久久久| 日本高清免费不卡视频| 高清不卡在线观看av| 九九在线精品视频| 日韩激情一区二区| 亚洲理论在线观看| 欧美激情综合网| 国产视频一区二区在线| 欧美大黄免费观看| 欧美一区二区三区色| 欧美伦理影视网| 在线观看免费成人| 欧洲一区在线观看| 色综合久久久久久久久| 成人91在线观看| 成人免费视频视频在线观看免费 | 国产精品系列在线| 2024国产精品视频| 国产亚洲一本大道中文在线| 日韩精品中文字幕一区二区三区| 欧美一区二区免费观在线| 欧美高清dvd| 欧美成va人片在线观看| 精品三级av在线| 国产色91在线| 中文字幕欧美激情一区| 国产精品麻豆网站| 亚洲欧美电影院| 亚洲高清免费观看| 日韩精品一级二级| 精品在线播放免费| 国产一区二区三区黄视频| 国产成人精品在线看| 成人黄色a**站在线观看| 色菇凉天天综合网| 欧美日韩一二三区| 精品美女一区二区| 国产欧美一区二区精品秋霞影院 | 日韩一区二区三区在线| 久久众筹精品私拍模特| 亚洲欧美自拍偷拍| 日本sm残虐另类| 国内精品写真在线观看| 国产精品羞羞答答xxdd| 99久久亚洲一区二区三区青草 | 成人妖精视频yjsp地址| 在线亚洲免费视频| 26uuu国产日韩综合| 亚洲三级视频在线观看| 午夜精品123| 国产不卡视频一区| 欧美色图免费看| 久久免费偷拍视频| 亚洲一区二区三区四区中文字幕| 天天色图综合网| 成人一级视频在线观看| 欧美色网站导航| 国产日韩欧美制服另类| 亚洲国产视频直播| 国产超碰在线一区| 欧美另类一区二区三区| 国产精品网站在线| 日本亚洲欧美天堂免费| 一本一道久久a久久精品 | 91精品一区二区三区久久久久久| 国产亚洲精品福利| 秋霞电影网一区二区| 92精品国产成人观看免费| 久久免费午夜影院|