summaryrefslogtreecommitdiffstats
path: root/src/interface/efi/efi_snp.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/interface/efi/efi_snp.c')
-rw-r--r--src/interface/efi/efi_snp.c65
1 files changed, 40 insertions, 25 deletions
diff --git a/src/interface/efi/efi_snp.c b/src/interface/efi/efi_snp.c
index 9e7b8dcd..fd3aad4c 100644
--- a/src/interface/efi/efi_snp.c
+++ b/src/interface/efi/efi_snp.c
@@ -27,10 +27,8 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/netdevice.h>
#include <ipxe/iobuf.h>
#include <ipxe/in.h>
-#include <ipxe/pci.h>
#include <ipxe/version.h>
#include <ipxe/efi/efi.h>
-#include <ipxe/efi/efi_pci.h>
#include <ipxe/efi/efi_driver.h>
#include <ipxe/efi/efi_strings.h>
#include <ipxe/efi/efi_snp.h>
@@ -348,7 +346,7 @@ efi_snp_station_address ( EFI_SIMPLE_NETWORK_PROTOCOL *snp, BOOLEAN reset,
/* MAC address changes take effect only on netdev_open() */
if ( netdev_is_open ( snpdev->netdev ) ) {
DBGC ( snpdev, "SNPDEV %p MAC address changed while net "
- "devive open\n", snpdev );
+ "device open\n", snpdev );
}
return 0;
@@ -922,7 +920,7 @@ static struct efi_snp_device * efi_snp_demux ( struct net_device *netdev ) {
*/
static int efi_snp_probe ( struct net_device *netdev ) {
EFI_BOOT_SERVICES *bs = efi_systab->BootServices;
- struct efi_pci_device *efipci;
+ struct efi_device *efidev;
struct efi_snp_device *snpdev;
EFI_DEVICE_PATH_PROTOCOL *path_end;
MAC_ADDR_DEVICE_PATH *macpath;
@@ -930,18 +928,18 @@ static int efi_snp_probe ( struct net_device *netdev ) {
EFI_STATUS efirc;
int rc;
- /* Find EFI PCI device */
- efipci = efipci_find ( netdev->dev );
- if ( ! efipci ) {
- DBG ( "SNP skipping non-PCI device %s\n", netdev->name );
+ /* Find parent EFI device */
+ efidev = efidev_parent ( netdev->dev );
+ if ( ! efidev ) {
+ DBG ( "SNP skipping non-EFI device %s\n", netdev->name );
rc = 0;
- goto err_no_pci;
+ goto err_no_efidev;
}
/* Calculate device path prefix length */
- path_end = efi_devpath_end ( efipci->path );
+ path_end = efi_devpath_end ( efidev->path );
path_prefix_len = ( ( ( void * ) path_end ) -
- ( ( void * ) efipci->path ) );
+ ( ( void * ) efidev->path ) );
/* Allocate the SNP device */
snpdev = zalloc ( sizeof ( *snpdev ) + path_prefix_len +
@@ -951,7 +949,7 @@ static int efi_snp_probe ( struct net_device *netdev ) {
goto err_alloc_snp;
}
snpdev->netdev = netdev_get ( netdev );
- snpdev->efipci = efipci;
+ snpdev->efidev = efidev;
/* Sanity check */
if ( netdev->ll_protocol->ll_addr_len > sizeof ( EFI_MAC_ADDRESS ) ) {
@@ -1009,7 +1007,7 @@ static int efi_snp_probe ( struct net_device *netdev ) {
"%s", netdev->name );
/* Populate the device path */
- memcpy ( &snpdev->path, efipci->path, path_prefix_len );
+ memcpy ( &snpdev->path, efidev->path, path_prefix_len );
macpath = ( ( ( void * ) &snpdev->path ) + path_prefix_len );
path_end = ( ( void * ) ( macpath + 1 ) );
memset ( macpath, 0, sizeof ( *macpath ) );
@@ -1040,12 +1038,12 @@ static int efi_snp_probe ( struct net_device *netdev ) {
goto err_install_protocol_interface;
}
- /* Add as child of PCI device */
- if ( ( rc = efipci_child_add ( efipci, snpdev->handle ) ) != 0 ) {
- DBGC ( snpdev, "SNPDEV %p could not become child of " PCI_FMT
- ": %s\n", snpdev, PCI_ARGS ( &efipci->pci ),
- strerror ( rc ) );
- goto err_efipci_child_add;
+ /* Add as child of EFI parent device */
+ if ( ( rc = efidev_child_add ( efidev, snpdev->handle ) ) != 0 ) {
+ DBGC ( snpdev, "SNPDEV %p could not become child of %p %s: "
+ "%s\n", snpdev, efidev->device,
+ efi_devpath_text ( efidev->path ), strerror ( rc ) );
+ goto err_efidev_child_add;
}
/* Install HII */
@@ -1058,14 +1056,15 @@ static int efi_snp_probe ( struct net_device *netdev ) {
/* Add to list of SNP devices */
list_add ( &snpdev->list, &efi_snp_devices );
- DBGC ( snpdev, "SNPDEV %p installed for %s as device %p\n",
- snpdev, netdev->name, snpdev->handle );
+ DBGC ( snpdev, "SNPDEV %p installed for %s as device %p %s\n",
+ snpdev, netdev->name, snpdev->handle,
+ efi_devpath_text ( &snpdev->path ) );
return 0;
efi_snp_hii_uninstall ( snpdev );
err_hii_install:
- efipci_child_del ( efipci, snpdev->handle );
- err_efipci_child_add:
+ efidev_child_del ( efidev, snpdev->handle );
+ err_efidev_child_add:
bs->UninstallMultipleProtocolInterfaces (
snpdev->handle,
&efi_simple_network_protocol_guid, &snpdev->snp,
@@ -1082,7 +1081,7 @@ static int efi_snp_probe ( struct net_device *netdev ) {
netdev_put ( netdev );
free ( snpdev );
err_alloc_snp:
- err_no_pci:
+ err_no_efidev:
return rc;
}
@@ -1129,7 +1128,7 @@ static void efi_snp_remove ( struct net_device *netdev ) {
/* Uninstall the SNP */
efi_snp_hii_uninstall ( snpdev );
- efipci_child_del ( snpdev->efipci, snpdev->handle );
+ efidev_child_del ( snpdev->efidev, snpdev->handle );
list_del ( &snpdev->list );
bs->UninstallMultipleProtocolInterfaces (
snpdev->handle,
@@ -1154,6 +1153,22 @@ struct net_driver efi_snp_driver __net_driver = {
};
/**
+ * Find SNP device by EFI device handle
+ *
+ * @v handle EFI device handle
+ * @ret snpdev SNP device, or NULL
+ */
+struct efi_snp_device * find_snpdev ( EFI_HANDLE handle ) {
+ struct efi_snp_device *snpdev;
+
+ list_for_each_entry ( snpdev, &efi_snp_devices, list ) {
+ if ( snpdev->handle == handle )
+ return snpdev;
+ }
+ return NULL;
+}
+
+/**
* Get most recently opened SNP device
*
* @ret snpdev Most recently opened SNP device, or NULL