summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/autoboot.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c
index c7492ea7c..738c3ceaa 100644
--- a/src/usr/autoboot.c
+++ b/src/usr/autoboot.c
@@ -215,6 +215,22 @@ int boot_root_path ( const char *root_path ) {
}
/**
+ * Close all open net devices
+ *
+ * Called before a fresh boot attempt in order to free up memory. We
+ * don't just close the device immediately after the boot fails,
+ * because there may still be TCP connections in the process of
+ * closing.
+ */
+static void close_all_netdevs ( void ) {
+ struct net_device *netdev;
+
+ for_each_netdev ( netdev ) {
+ ifclose ( netdev );
+ }
+}
+
+/**
* Boot from a network device
*
* @v netdev Network device
@@ -232,6 +248,9 @@ int netboot ( struct net_device *netdev ) {
unsigned int pxe_discovery_control;
int rc;
+ /* Close all other network devices */
+ close_all_netdevs();
+
/* Open device and display device status */
if ( ( rc = ifopen ( netdev ) ) != 0 )
return rc;
@@ -275,22 +294,6 @@ int netboot ( struct net_device *netdev ) {
}
/**
- * Close all open net devices
- *
- * Called before a fresh boot attempt in order to free up memory. We
- * don't just close the device immediately after the boot fails,
- * because there may still be TCP connections in the process of
- * closing.
- */
-static void close_all_netdevs ( void ) {
- struct net_device *netdev;
-
- for_each_netdev ( netdev ) {
- ifclose ( netdev );
- }
-}
-
-/**
* Boot the system
*/
int autoboot ( void ) {
@@ -299,7 +302,6 @@ int autoboot ( void ) {
int rc = -ENODEV;
/* If we have an identifable boot device, try that first */
- close_all_netdevs();
if ( ( boot_netdev = find_boot_netdev() ) )
rc = netboot ( boot_netdev );
@@ -307,7 +309,6 @@ int autoboot ( void ) {
for_each_netdev ( netdev ) {
if ( netdev == boot_netdev )
continue;
- close_all_netdevs();
rc = netboot ( netdev );
}