Has anyone found a solution to the i.MX6 Ethernet overrun problem?
If I run iperf between two i.MX6 boards (200mbps UDP), on the receiving i.MX6 I see up to 500 overruns in one second.
It's pretty simple to reproduce:
* Board 1: "iperf -s"
* Board 2: "iperf -c 10.0.0.2 -r -u -b 200M -t 10"
The receiving side can get hundreds of dropped packets in one second (typically when iperf starts ramping up). This is visible in the ifconfig overrun stats, or you can use Boundary's "devregs" program to view the low level overrun count in the ENET hardware ("sudo devregs ENET_IEEE_R_MACERR").
I've tried both rev 1.0 and 1.2 silicon - the 1.2 silicon looks to be better but still can get, say, 500 overruns in one second. I have also tried using the stock Freescale 4.0.0 kernel and the Boundary 4.0.0 kernel which has some useful patches (the stock kernel passes overruns up to the network stack as truncated packets rather than dropping them).
Even when using a protocol with retransmissions like TCP, when you're getting this level of packet loss the TCP connections can stall for several seconds at a time if fast retransmission fails due to continued overruns.
I've tried fiddling with FIFO levels, raising the NIC priority of the ENET block etc but so far it looks like this problem is insurmountable on i.MX6, and we're perhaps forced to add a PCIe Ethernet adapter in order to get reliable networking. It would be great to hear if people have found ways round this using the internal ENET, however.