summaryrefslogtreecommitdiffstats
path: root/src/usr
diff options
context:
space:
mode:
authorAlex Williamson2014-02-26 00:00:23 +0100
committerMichael Brown2014-03-03 16:11:03 +0100
commit123bae9d939235a62e67d0cbfc66f3277bd81844 (patch)
treed07e8ee0805663352ec818a29f9e2facc3ac6898 /src/usr
parent[romprefix] Allow ROM banner timeout to be configured independently (diff)
downloadipxe-123bae9d939235a62e67d0cbfc66f3277bd81844.tar.gz
ipxe-123bae9d939235a62e67d0cbfc66f3277bd81844.tar.xz
ipxe-123bae9d939235a62e67d0cbfc66f3277bd81844.zip
[autoboot] Enable infrastructure to specify an autoboot device location
iPXE will currently attempt to boot from every network device for which it has a driver. Where a system has more than one network device supported by iPXE, this renders BIOS IPL lists ineffective. Allow an autoboot device location to be specified. If such a location is specified, then only devices matching that location will be used as part of the automatic boot sequence. If no such location is specified, then all devices will be used. Note that this does not affect the "autoboot" command, which will continue to use all devices. Signed-off-by: Alex Williamson <alex.williamson@redhat.com> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/usr')
-rw-r--r--src/usr/autoboot.c43
1 files changed, 26 insertions, 17 deletions
diff --git a/src/usr/autoboot.c b/src/usr/autoboot.c
index 3a5fb046..c9012f21 100644
--- a/src/usr/autoboot.c
+++ b/src/usr/autoboot.c
@@ -49,6 +49,9 @@ FILE_LICENCE ( GPL2_OR_LATER );
*
*/
+/** Device location of preferred autoboot device */
+struct device_description autoboot_device;
+
/* Disambiguate the various error causes */
#define ENOENT_BOOT __einfo_error ( EINFO_ENOENT_BOOT )
#define EINFO_ENOENT_BOOT \
@@ -74,15 +77,6 @@ __weak int pxe_menu_boot ( struct net_device *netdev __unused ) {
}
/**
- * Identify the boot network device
- *
- * @ret netdev Boot network device
- */
-static struct net_device * find_boot_netdev ( void ) {
- return NULL;
-}
-
-/**
* Parse next-server and filename into a URI
*
* @v next_server Next-server address
@@ -428,21 +422,36 @@ int netboot ( struct net_device *netdev ) {
}
/**
+ * Test if network device matches the autoboot device location
+ *
+ * @v netdev Network device
+ * @ret is_autoboot Network device matches the autoboot device location
+ */
+static int is_autoboot_device ( struct net_device *netdev ) {
+
+ return ( ( netdev->dev->desc.bus_type == autoboot_device.bus_type ) &&
+ ( netdev->dev->desc.location == autoboot_device.location ) );
+}
+
+/**
* Boot the system
*/
-int autoboot ( void ) {
- struct net_device *boot_netdev;
+static int autoboot ( void ) {
struct net_device *netdev;
int rc = -ENODEV;
- /* If we have an identifable boot device, try that first */
- if ( ( boot_netdev = find_boot_netdev() ) )
- rc = netboot ( boot_netdev );
-
- /* If that fails, try booting from any of the other devices */
+ /* Try booting from each network device. If we have a
+ * specified autoboot device location, then use only devices
+ * matching that location.
+ */
for_each_netdev ( netdev ) {
- if ( netdev == boot_netdev )
+
+ /* Skip any non-matching devices, if applicable */
+ if ( autoboot_device.bus_type &&
+ ( ! is_autoboot_device ( netdev ) ) )
continue;
+
+ /* Attempt booting from this device */
rc = netboot ( netdev );
}