Currently the timeout waiting for an ARP reply is hard set to 5 seconds. 
On i.MX31ADS due to a hardware "strangeness" up to four first IP packets 
to the boards get lost, which typically are ARP replies. By configuring 
the timeout to a lower value we significantly improve the first network 
transfer time on this board. The timeout is specified in milliseconds, 
later internally it is converted to deciseconds, because it has to be 
converted to hardware ticks, and CFG_HZ ranges from 900 to 27000000 on 
different boards.

Signed-off-by: Guennadi Liakhovetski <[EMAIL PROTECTED]>

---

diff --git a/README b/README
index a9663a3..9249064 100644
--- a/README
+++ b/README
@@ -1547,6 +1547,10 @@ The following options need to be configured:
                before giving up the operation. If not defined, a
                default value of 5 is used.
 
+               CONFIG_ARP_TIMEOUT
+
+               Timeout waiting for an ARP reply in milliseconds.
+
 - Command Interpreter:
                CONFIG_AUTO_COMPLETE
 
diff --git a/net/net.c b/net/net.c
index 44feee2..2128bd4 100644
--- a/net/net.c
+++ b/net/net.c
@@ -94,11 +94,22 @@
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define ARP_TIMEOUT            5UL             /* Seconds before trying ARP 
again */
+#ifndef        CONFIG_ARP_TIMEOUT
+# define ARP_TIMEOUT           50UL    /* Deciseconds before trying ARP again 
*/
+#elif (CONFIG_ARP_TIMEOUT < 100)
+# error "Due to possible overflow CONFIG_ARP_TIMEOUT must be greater than 
100ms"
+#else
+# if (CONFIG_ARP_TIMEOUT % 100)
+#  warning "Supported ARP_TIMEOUT precision is 100ms"
+# endif
+# define ARP_TIMEOUT           (CONFIG_ARP_TIMEOUT / 100)
+#endif
+
+
 #ifndef        CONFIG_NET_RETRY_COUNT
-# define ARP_TIMEOUT_COUNT     5               /* # of timeouts before giving 
up  */
+# define ARP_TIMEOUT_COUNT     5       /* # of timeouts before giving up  */
 #else
-# define ARP_TIMEOUT_COUNT  (CONFIG_NET_RETRY_COUNT)
+# define ARP_TIMEOUT_COUNT     CONFIG_NET_RETRY_COUNT
 #endif
 
 #if 0
@@ -129,7 +140,7 @@ uchar               NetOurEther[6];         /* Our ethernet 
address                 */
 uchar          NetServerEther[6] =     /* Boot server enet address             
*/
                        { 0, 0, 0, 0, 0, 0 };
 IPaddr_t       NetOurIP;               /* Our IP addr (0 = unknown)            
*/
-IPaddr_t       NetServerIP;            /* Our IP addr (0 = unknown)            
*/
+IPaddr_t       NetServerIP;            /* Server IP addr (0 = unknown)         
*/
 volatile uchar *NetRxPkt;              /* Current receive packet               
*/
 int            NetRxPktLen;            /* Current rx packet length             
*/
 unsigned       NetIPID;                /* IP packet ID                         
*/
@@ -253,7 +264,7 @@ void ArpTimeoutCheck(void)
        t = get_timer(0);
 
        /* check for arp timeout */
-       if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT * CFG_HZ) {
+       if ((t - NetArpWaitTimerStart) > ARP_TIMEOUT * CFG_HZ / 10) {
                NetArpWaitTry++;
 
                if (NetArpWaitTry >= ARP_TIMEOUT_COUNT) {
@@ -494,7 +505,7 @@ restart:
                 *      Check the ethernet for a new packet.  The ethernet
                 *      receive routine will process it.
                 */
-                       eth_rx();
+               eth_rx();
 
                /*
                 *      Abort if ctrl-c was pressed.

-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://ad.doubleclick.net/clk;164216239;13503038;w?http://sf.net/marketplace
_______________________________________________
U-Boot-Users mailing list
U-Boot-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/u-boot-users

Reply via email to