Skip to content

Commit

Permalink
[efi] Include NII driver within "snp" and "snponly" build targets
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
mcb30 committed Oct 17, 2014
1 parent feb3a0f commit af17abf
Show file tree
Hide file tree
Showing 4 changed files with 195 additions and 106 deletions.
47 changes: 4 additions & 43 deletions src/drivers/net/efi/nii.c
Expand Up @@ -28,10 +28,11 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/umalloc.h>
#include <ipxe/efi/efi.h>
#include <ipxe/efi/efi_driver.h>
#include <ipxe/efi/efi_snp.h>
#include <ipxe/efi/efi_pci.h>
#include <ipxe/efi/efi_utils.h>
#include <ipxe/efi/Protocol/NetworkInterfaceIdentifier.h>
#include <ipxe/efi/IndustryStandard/Acpi10.h>
#include "nii.h"

/** @file
*
Expand Down Expand Up @@ -955,45 +956,13 @@ static struct net_device_operations nii_operations = {
.poll = nii_poll,
};

/**
* 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;
}

/**
* Attach driver to device
*
* @v efidev EFI device
* @ret rc Return status code
*/
static int nii_start ( struct efi_device *efidev ) {
int nii_start ( struct efi_device *efidev ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
EFI_HANDLE device = efidev->device;
struct net_device *netdev;
Expand Down Expand Up @@ -1106,7 +1075,7 @@ static int nii_start ( struct efi_device *efidev ) {
*
* @v efidev EFI device
*/
static void nii_stop ( struct efi_device *efidev ) {
void nii_stop ( struct efi_device *efidev ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
struct net_device *netdev = efidev_get_drvdata ( efidev );
struct nii_nic *nii = netdev->priv;
Expand All @@ -1130,11 +1099,3 @@ static void nii_stop ( struct efi_device *efidev ) {
netdev_nullify ( netdev );
netdev_put ( netdev );
}

/** EFI NII driver */
struct efi_driver nii_driver __efi_driver ( EFI_DRIVER_NORMAL ) = {
.name = "NII",
.supported = nii_supported,
.start = nii_start,
.stop = nii_stop,
};
17 changes: 17 additions & 0 deletions src/drivers/net/efi/nii.h
@@ -0,0 +1,17 @@
#ifndef _NII_H
#define _NII_H

/** @file
*
* NII driver
*
*/

FILE_LICENCE ( GPL2_OR_LATER );

struct efi_device;

extern int nii_start ( struct efi_device *efidev );
extern void nii_stop ( struct efi_device *efidev );

#endif /* _NII_H */
41 changes: 41 additions & 0 deletions src/drivers/net/efi/snp.c
Expand Up @@ -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
*
Expand Down Expand Up @@ -63,10 +64,50 @@ 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",
.supported = snp_supported,
.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,
};

0 comments on commit af17abf

Please sign in to comment.