Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 16 Aug 2012 00:51:50 +0000 (UTC)
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r239318 - head/sys/nfs
Message-ID:  <201208160051.q7G0poqM036086@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gonzo
Date: Thu Aug 16 00:51:50 2012
New Revision: 239318
URL: http://svn.freebsd.org/changeset/base/239318

Log:
  Merge somewhat modified r230399 from projects/armv6:
  
  Add timeout to wait for network controllers to appear when netbooting.
  
  USB ethernet adapter initialization usually is delayed and
  they're not available immidiately after autoconfiguration. So we need
  to wait a bit before giving up
  
  Reviewed by:	stas@

Modified:
  head/sys/nfs/bootp_subr.c

Modified: head/sys/nfs/bootp_subr.c
==============================================================================
--- head/sys/nfs/bootp_subr.c	Wed Aug 15 22:51:01 2012	(r239317)
+++ head/sys/nfs/bootp_subr.c	Thu Aug 16 00:51:50 2012	(r239318)
@@ -82,6 +82,14 @@ __FBSDID("$FreeBSD$");
 #define BOOTP_SETTLE_DELAY 3
 #endif
 
+/* 
+ * Wait 10 seconds for interface appearance
+ * USB ethernet adapters might reqquire some time to pop up
+ */
+#ifndef	BOOTP_IFACE_WAIT_TIMEOUT
+#define	BOOTP_IFACE_WAIT_TIMEOUT	10
+#endif
+
 /*
  * What is the longest we will wait before re-sending a request?
  * Note this is also the frequency of "RPC timeout" messages.
@@ -1515,6 +1523,8 @@ bootpc_init(void)
 #endif
 	struct nfsv3_diskless *nd;
 	struct thread *td;
+	int timeout = BOOTP_IFACE_WAIT_TIMEOUT * hz;
+	int delay = hz / 10;
 
 	nd = &nfsv3_diskless;
 	td = curthread;
@@ -1567,6 +1577,7 @@ bootpc_init(void)
 		allocifctx(gctx);
 #endif
 
+retry:
 	ifctx = STAILQ_FIRST(&gctx->interfaces);
 	IFNET_RLOCK();
 	TAILQ_FOREACH(ifp, &V_ifnet, if_link) {
@@ -1613,6 +1624,11 @@ bootpc_init(void)
 
 	if (STAILQ_EMPTY(&gctx->interfaces) ||
 	    STAILQ_FIRST(&gctx->interfaces)->ifp == NULL) {
+		if (timeout > 0) {
+			pause("bootpc", delay);
+			timeout -= delay;
+			goto retry;
+		}
 #ifdef BOOTP_WIRED_TO
 		panic("%s: Could not find interface specified "
 		      "by BOOTP_WIRED_TO: "



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201208160051.q7G0poqM036086>