From d9a2f416d6ac6058cd7845033ae4dc32ef1c0746 Mon Sep 17 00:00:00 2001
From: Aras Vaichas <arasv@magtech.com.au>
Date: Wed, 26 Mar 2008 09:43:57 +1100
Subject: [PATCH] DHCP request fix for Windows Server 2003

Added option CONFIG_BOOTP_DHCP_REQUEST_DELAY. This provides an optional
delay before sending "DHCP Request" in net/bootp.c. Required to overcome
interoperability problems with Windows Server 200x DHCP server when U-Boot
client responds too fast for server to handle.

Signed-off-by: Aras Vaichas <arasv@magtech.com.au>
Signed-off-by: Ben Warren <biggerbadderben@gmail.com>
---
 README      | 14 ++++++++++++++
 net/bootp.c |  5 ++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/README b/README
index 5cbe7c1e80d..592d1d88420 100644
--- a/README
+++ b/README
@@ -1151,6 +1151,20 @@ The following options need to be configured:
 		of the "hostname" environment variable is passed as
 		option 12 to the DHCP server.
 
+		CONFIG_BOOTP_DHCP_REQUEST_DELAY
+
+		A 32bit value in microseconds for a delay between
+		receiving a "DHCP Offer" and sending the "DHCP Request".
+		This fixes a problem with certain DHCP servers that don't
+		respond 100% of the time to a "DHCP request". E.g. On an
+		AT91RM9200 processor running at 180MHz, this delay needed
+		to be *at least* 15,000 usec before a Windows Server 2003
+		DHCP server would reply 100% of the time. I recommend at
+		least 50,000 usec to be safe. The alternative is to hope
+		that one of the retries will be successful but note that
+		the DHCP timeout and retry process takes a longer than
+		this delay.
+
  - CDP Options:
 		CONFIG_CDP_DEVICE_ID
 
diff --git a/net/bootp.c b/net/bootp.c
index 89e30d2c703..0eeef578424 100644
--- a/net/bootp.c
+++ b/net/bootp.c
@@ -879,7 +879,10 @@ static void DhcpSendRequestPkt(Bootp_t *bp_offer)
 	iplen = BOOTP_HDR_SIZE - sizeof(bp->bp_vend) + extlen;
 	NetSetIP(iphdr, 0xFFFFFFFFL, PORT_BOOTPS, PORT_BOOTPC, iplen);
 
-	debug ("Transmitting DHCPREQUEST packet: len = %d\n", pktlen);
+        debug ("Transmitting DHCPREQUEST packet: len = %d\n", pktlen);
+#ifdef CONFIG_BOOTP_DHCP_REQUEST_DELAY
+	udelay(CONFIG_BOOTP_DHCP_REQUEST_DELAY);
+#endif	/* CONFIG_BOOTP_DHCP_REQUEST_DELAY */
 	NetSendPacket(NetTxPacket, pktlen);
 }
 
-- 
GitLab