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

来源:互联网 发布:mac战网无法打开 编辑:程序博客网 时间:2024/05/16 02:26

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














0 0
原创粉丝点击