telnet远程连接,基本的shell指令执行没有问题。但是在执行ps或者top这种查看资源的比较多的时候,发现个问题。debug串口会不停的在打印
eth0:TX underrun, resetting buffers
打印这句话的函数,在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");
于是,按照补丁要求,对代码进行了修改,测试。
因为,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