Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[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>
  • 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.