help: FCC_ENET OF MPC8250?

gqbenjamin at 21cn.com gqbenjamin at 21cn.com
Sun Jul 17 14:04:29 EST 2005


Thanks for your replying.
I have resolved that problem.
I found a bug in function *fcc_enet_start_xmit*.
In linux-2.6.12 and linux-2.6.9, the bug had been 
patched by Dan Malek. 
In fcc_net.c of linux-2.6.5,  
at the end of *fcc_enet_start_xmit* :

if (bdp->cbd_sc & BD_ENET_TX_READY) {
	netif_stop_queue(dev);
	cep->tx_full = 1;
	}

This cann't be used to decide TX-BD is full.
If the rate of transmit is too high, the *skbuf*
in TX-BD probably have not chance to be free befor 
a new one had been put in. So, memory been lost.


> On Wed, 13 Jul 2005 10:42:52 +0800 (CST)
> gqbenjamin at 21cn.com wrote:
> 
> > Hi,
> > 
> > I use a device, like SMARTBITS, to test the Ethernet rate of mpc8250. The kernel is linux-2.4.20
> > with CONFIG_FCC_LXT971 and CONFIG_USE_MDIO, and do 'cat "1">/proc/sys/net/ipv4/ip_forward'.
> > 
> > If the rate of sending IP packet been set too high, for example 100 Mbps Full Duplex and each
> > packet is 1514 Bytes. Later, the kernel print '... Memory squeeze, dropping packet' on uart. Stop
> > sending IP packet and do 'cat /proc/meminfo', the *MemFree* become small.
> > 
> > Try again, the *MemFree* become smaller, just look like some allocated memory (skbuf) do not be
> > free.
> > 
> > Final, the kernel break down, because all memory have been used.
> 
> 
> It sounds to me like the problem may be that fcc_enet_rx() is consuming all the memory.  This
> function is called in interrupt context and spins round the rx buffer descriptor ring until it finds
> an empty buffer descriptor.  There is no check to stop it going round more than once and each time
> it finds a BD it does a dev_alloc_skb().
> 
> It is possible that you are receiving data at a high enough rate that fcc_enet_rx() never exits.
> 
> What is more likely is that there isn't enough time between rx interrupts for the CPU to tx all the
> queued packets.
> 
> 
> > 
> > Q. How can I do to let kernel do not break down? Is it a kernel promblem?
> > 
> 
> This is just a guess, but... it may help to move fcc_enet_rx() from the interrupt handler to a
> bottom half.  If you do this you should also ensure that it cannot process the rx buffer descriptor
> ring more than once per call.  This may give the CPU *more* chance to tx queued packets by lowering
> the rx priority a little.
> 
> I don't know if this would work but I'd be interested to find out.
> 
> Alex
----------------------------------------------
vgoÌåÑé×ÀÃæ¿ì¸Ð£¬ÏíÊÜ¿íƵÀÖȤ£¡ 
http://vgo.21cn.com 
µãÕâÀïÃâ·ÑÌåÑé·¢ËÍ4G´ó¸½¼þ 
http://mail.21cn.com/huodong/0504/mail/ 
²ÊÆÁÊÖ»ú°×ËÍÀ²!¸Ï¿ìÀ´ÄÃ! 
http://qipai.g.21cn.com 
Öǻ۴óÌôÕ½¾ÍÔڵͼ۶ᱦ 
http://super.21cn.com/ 
ÌåÑéÁíÀàÔ¼»á£¬¸ÐÊܱðÑùÀËÂþ 
http://y.21cn.com/club/ 
СÁéͨ¶ÌÐÅÖÐÐÄ£¬¶ÌÐÅ÷ÈÁ¦ÎÞ¼« 
http://pas.21cn.com/ 
È«ÄÜÁÄ2005°æÉÁÁÁµÇ³¡£¡ 
http://callme.21cn.com 






More information about the Linuxppc-embedded mailing list