diff options
author | Michael Brown | 2014-10-17 17:36:00 +0200 |
---|---|---|
committer | Michael Brown | 2014-10-17 17:52:31 +0200 |
commit | af17abf67f1c89ee7193185b6ba1584e4eded4bc (patch) | |
tree | 0c40a20175046e9b5214b9965ecf00f44163bf11 /src/drivers/net/efi/snp.c | |
parent | [efi] Check for presence of UNDI in NII protocol (diff) | |
download | ipxe-af17abf67f1c89ee7193185b6ba1584e4eded4bc.tar.gz ipxe-af17abf67f1c89ee7193185b6ba1584e4eded4bc.tar.xz ipxe-af17abf67f1c89ee7193185b6ba1584e4eded4bc.zip |
[efi] Include NII driver within "snp" and "snponly" build targets
End users almost certainly don't care whether the underlying interface
is SNP or NII/UNDI. Try to minimise surprise and unnecessary
documentation by including the NII driver whenever the SNP driver is
requested.
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/drivers/net/efi/snp.c')
-rw-r--r-- | src/drivers/net/efi/snp.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/drivers/net/efi/snp.c b/src/drivers/net/efi/snp.c index a20bd21a..2b5fc861 100644 --- a/src/drivers/net/efi/snp.c +++ b/src/drivers/net/efi/snp.c @@ -24,6 +24,7 @@ FILE_LICENCE ( GPL2_OR_LATER ); #include <ipxe/efi/efi_driver.h> #include <ipxe/efi/efi_snp.h> #include "snpnet.h" +#include "nii.h" /** @file * @@ -63,6 +64,38 @@ static int snp_supported ( EFI_HANDLE device ) { return 0; } +/** + * Check to see if driver supports a device + * + * @v device EFI device handle + * @ret rc Return status code + */ +static int nii_supported ( EFI_HANDLE device ) { + EFI_BOOT_SERVICES *bs = efi_systab->BootServices; + EFI_STATUS efirc; + + /* Check that this is not a device we are providing ourselves */ + if ( find_snpdev ( device ) != NULL ) { + DBGCP ( device, "NII %p %s is provided by this binary\n", + device, efi_handle_name ( device ) ); + return -ENOTTY; + } + + /* Test for presence of NII protocol */ + if ( ( efirc = bs->OpenProtocol ( device, + &efi_nii31_protocol_guid, + NULL, efi_image_handle, device, + EFI_OPEN_PROTOCOL_TEST_PROTOCOL))!=0){ + DBGCP ( device, "NII %p %s is not an NII device\n", + device, efi_handle_name ( device ) ); + return -EEFI ( efirc ); + } + DBGC ( device, "NII %p %s is an NII device\n", + device, efi_handle_name ( device ) ); + + return 0; +} + /** EFI SNP driver */ struct efi_driver snp_driver __efi_driver ( EFI_DRIVER_NORMAL ) = { .name = "SNP", @@ -70,3 +103,11 @@ struct efi_driver snp_driver __efi_driver ( EFI_DRIVER_NORMAL ) = { .start = snpnet_start, .stop = snpnet_stop, }; + +/** EFI NII driver */ +struct efi_driver nii_driver __efi_driver ( EFI_DRIVER_NORMAL ) = { + .name = "NII", + .supported = nii_supported, + .start = nii_start, + .stop = nii_stop, +}; |