ATMEL91,Linux2.6.39:eth0:TX underrun, resetting buffers

telnet远程连接,基本的shell指令执行没有问题。但是在执行ps或者top这种查看资源的比较多的时候,发现个问题。debug串口会不停的在打印

eth0:TX underrun, resetting buffers

这句话的打印,基本的意思就是Tx的buffer不够用了。

打印这句话的函数,在macb.c的macb_tx函数里

static void macb_tx(struct macb *bp)
{
	unsigned int tail;
	unsigned int head;
	u32 status;

	status = macb_readl(bp, TSR);
	macb_writel(bp, TSR, status);

	dev_dbg(&bp->pdev->dev, "macb_tx status = %02lx\n",
		(unsigned long)status);

	if (status & (MACB_BIT(UND) | MACB_BIT(TSR_RLE))) {
		int i;
		printk(KERN_ERR "%s: TX %s, resetting buffers\n",
			bp->dev->name, status & MACB_BIT(UND) ?
			"underrun" : "retry limit exceeded");


放狗搜了下,发现在应用atmel91的9260和9263片子有类似的问题,AT91原厂也给出了相应的补丁,打上即可。但是不适用9G25。我用的片子是at91sam9G25,9X5 family的一员。


于是,按照补丁要求,对代码进行了修改,测试。

因为,9G25的片内SRAM是32kB,于是设置了TX_RING_SIZE为21,大概计算了下,不会超出范围。

但是调试的时候发现,网络不通。ping 的时候只能发一个包,后边的包都丢失了。

以为是计算错了,直接赋值改为20,还是不行。郁闷了。


后来,发现这个数值应该为2的幂次方。从代码中可窥见一斑。

#define DEF_TX_RING_PENDING	(TX_RING_SIZE - 1)/here!!!!
//! #define TX_RING_BYTES		(sizeof(struct dma_desc) * TX_RING_SIZE)

#define TX_RING_GAP(bp)						\
	(TX_RING_SIZE - (bp)->tx_pending)
#define TX_BUFFS_AVAIL(bp)					\
	(((bp)->tx_tail <= (bp)->tx_head) ?			\
	 (bp)->tx_tail + (bp)->tx_pending - (bp)->tx_head :	\
	 (bp)->tx_tail - (bp)->tx_head - TX_RING_GAP(bp))
#define NEXT_TX(n)		(((n) + 1) & (TX_RING_SIZE - 1))//here!!!!!!!!!

#define NEXT_RX(n)		(((n) + 1) & (RX_RING_SIZE - 1))//and here!!!!!


改成16测试OK,没有问题。

1.另外注意,首先在menuconfig里配置一下

Ethernet (10 or 100Mbit) --->
           <*> Atmel MACB support

           [ * ] Atmel MACB TX buffers in internal SRAM


然后自己做了一个2.6.39的patch, 附上地址,供有需要的童鞋们下载!!!! http://download.csdn.net/detail/linglongqiongge/9080271














  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值