I have a customized board (CPU: iMX6Q, Fec+ar8031). I made a UDP test with iperf command:
* A PC (I7+1G Ethernet) acting as server: iperf -s -u -i 1
* The board Ethernet (linux, fec+ar8031) acting as client: iperf -c 192.168.4.4 -u -i 1 -b 20M -l 64 -t 10000
* During the test, every few seconds I execute 'mii-tool -r eth0' on PC, or just unplug and immediately plug-in cable.
Statistics printed on server side every one second(-i 1), that include band width, packet numbers, and packet lost percentage. Each time after the command 'mii-tool -r eth0' or 'unplug and plug-in cable' executed (I call it reset), the Ethernet will link-down and then link-up,the following auto-negotiation always results in "1000M/Full" on both sides. But the packet lost statistics(num and percentage), are variable between resets.
Please check the attached picture, its a screen shot of server PC.
* The packet lost percentage is 7.x% at the beginning.
* After a reset, it changed to 1.x% ~ 2.x%.
* After another reset, it changed to 0%.
The questions are:
* The bandwidth(20Mbps) is not critical, so the packet lost percentage should always be 0%.
* The packet lost percentage should not change between resets, it should be 0% whatever resets raised.
* I made the test with different kernels (Linux kernel of iMX6):
> 3.0.35 works perfect, no packet lost after reset, percentage always be 0% after every reset (tried > 50 times).
> 3.10.17, percentage variable between resets.
> 3.14.52, percentage variable between resets.
> 4.1.15_2.0.0_ga, percentage variable between resets.
> 4.1.33_7ulp_beta, percentage variable between resets.
This issue is discovered by customer with a network analyzer, I repeated it with iperf command.
I have no idea now. Porting kernel to 3.0.35 is not acceptable for our customer.
Anyone there can give me some advice? Thanks!