summaryrefslogtreecommitdiffstats
path: root/src/interface/efi/efi_pci.c
diff options
context:
space:
mode:
authorMichael Brown2011-03-29 22:35:06 +0200
committerMichael Brown2011-03-29 23:08:05 +0200
commitfc7239bdc8384d02a190723ef4e030d6ef2620a9 (patch)
tree83a0360ea913f062f7053d4853b228f789519552 /src/interface/efi/efi_pci.c
parent[forcedeth] Remove software unicast MAC address filter (diff)
downloadipxe-fc7239bdc8384d02a190723ef4e030d6ef2620a9.tar.gz
ipxe-fc7239bdc8384d02a190723ef4e030d6ef2620a9.tar.xz
ipxe-fc7239bdc8384d02a190723ef4e030d6ef2620a9.zip
[efi] Ensure that all drivers are shut down before the OS boots
Reported-by: Itay Gazit <itayg@mellanox.co.il> Suggested-by: Michael R Turner <mikeyt@us.ibm.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/interface/efi/efi_pci.c')
-rw-r--r--src/interface/efi/efi_pci.c24
1 files changed, 22 insertions, 2 deletions
diff --git a/src/interface/efi/efi_pci.c b/src/interface/efi/efi_pci.c
index 3b393fcb..fa71e7d8 100644
--- a/src/interface/efi/efi_pci.c
+++ b/src/interface/efi/efi_pci.c
@@ -489,7 +489,7 @@ static struct efi_driver efipci_driver =
* Install EFI PCI driver
*
*/
-static void efipci_driver_init ( void ) {
+static void efipci_driver_startup ( void ) {
struct efi_driver *efidrv = &efipci_driver;
EFI_STATUS efirc;
@@ -503,7 +503,27 @@ static void efipci_driver_init ( void ) {
DBGC ( efidrv, "EFIPCI driver installed\n" );
}
+/**
+ * Shut down EFI PCI driver
+ *
+ * @v booting System is shutting down for OS boot
+ */
+static void efipci_driver_shutdown ( int booting __unused ) {
+ struct efi_driver *efidrv = &efipci_driver;
+ struct efi_pci_device *efipci;
+ struct efi_pci_device *tmp;
+
+ /* Shut down any remaining devices */
+ list_for_each_entry_safe ( efipci, tmp, &efi_pci_devices, list ) {
+ DBGC ( efipci, "EFIPCI " PCI_FMT " still active at shutdown; "
+ "forcing close\n", PCI_ARGS ( &efipci->pci ) );
+ pci_remove ( &efipci->pci );
+ efipci_destroy ( efidrv, efipci );
+ }
+}
+
/** EFI PCI startup function */
struct startup_fn startup_pci __startup_fn ( STARTUP_NORMAL ) = {
- .startup = efipci_driver_init,
+ .startup = efipci_driver_startup,
+ .shutdown = efipci_driver_shutdown,
};