From 779ae3579848a36319d67a6ba012b4b9aa88aa6b Mon Sep 17 00:00:00 2001 From: xdu2 Date: Wed, 30 Dec 2009 13:47:55 +0000 Subject: Add VLAN support. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@9649 6f19259b-4bc3-4df7-8a09-765794883524 --- .../Network/VlanConfigDxe/VlanConfigDriver.c | 305 +++++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c (limited to 'MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c') diff --git a/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c new file mode 100644 index 0000000000..f0c3ebbc26 --- /dev/null +++ b/MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c @@ -0,0 +1,305 @@ +/** @file + The driver binding for VLAN configuration module. + +Copyright (c) 2009, Intel Corporation.
+All rights reserved. This program and the accompanying materials +are licensed and made available under the terms and conditions +of the BSD License which accompanies this distribution. The full +text of the license may be found at
+http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +#include "VlanConfigImpl.h" + +EFI_GUID gVlanConfigPrivateGuid = VLAN_CONFIG_PRIVATE_GUID; + +EFI_DRIVER_BINDING_PROTOCOL gVlanConfigDriverBinding = { + VlanConfigDriverBindingSupported, + VlanConfigDriverBindingStart, + VlanConfigDriverBindingStop, + 0xa, + NULL, + NULL +}; + +/** + The entry point for IP4 config driver which install the driver + binding and component name protocol on its image. + + @param[in] ImageHandle The image handle of the driver. + @param[in] SystemTable The system table. + + @retval EFI_SUCCES All the related protocols are installed on the driver. + @retval Others Failed to install protocols. + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + return EfiLibInstallDriverBindingComponentName2 ( + ImageHandle, + SystemTable, + &gVlanConfigDriverBinding, + ImageHandle, + &gVlanConfigComponentName, + &gVlanConfigComponentName2 + ); +} + + +/** + Test to see if this driver supports ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to test + @param[in] RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCES This driver supports this device + @retval EFI_ALREADY_STARTED This driver is already running on this device + @retval other This driver does not support this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingSupported ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ) +{ + EFI_STATUS Status; + EFI_VLAN_CONFIG_PROTOCOL *VlanConfig; + + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + (VOID **) &VlanConfig, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Close the VlanConfig protocol opened for supported test + // + gBS->CloseProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + return Status; +} + + +/** + Start this driver on ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to bind driver to + @param[in] RemainingDevicePath Optional parameter use to pick a specific child + device to start. + + @retval EFI_SUCCES This driver is added to ControllerHandle + @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle + @retval other This driver does not support this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingStart ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL + ) +{ + EFI_STATUS Status; + EFI_VLAN_CONFIG_PROTOCOL *VlanConfig; + EFI_DEVICE_PATH_PROTOCOL *DevicePath; + VLAN_CONFIG_PRIVATE_DATA *PrivateData; + + // + // Check for multiple start + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gVlanConfigPrivateGuid, + (VOID **) &PrivateData, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (!EFI_ERROR (Status)) { + return EFI_ALREADY_STARTED; + } + + // + // Open VlanConfig protocol by driver + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + (VOID **) &VlanConfig, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_BY_DRIVER + ); + if (EFI_ERROR (Status)) { + return Status; + } + + // + // Get parent device path + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + (VOID **) &DevicePath, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + goto ErrorExit; + } + + // + // Create a private data for this network device + // + PrivateData = AllocateCopyPool (sizeof (VLAN_CONFIG_PRIVATE_DATA), &mVlanConfigPrivateDateTemplate); + if (PrivateData == NULL) { + Status = EFI_OUT_OF_RESOURCES; + goto ErrorExit; + } + + PrivateData->ImageHandle = This->DriverBindingHandle; + PrivateData->ControllerHandle = ControllerHandle; + PrivateData->VlanConfig = VlanConfig; + PrivateData->ParentDevicePath = DevicePath; + + // + // Install VLAN configuration form + // + Status = InstallVlanConfigForm (PrivateData); + if (EFI_ERROR (Status)) { + goto ErrorExit; + } + + // + // Install private GUID + // + Status = gBS->InstallMultipleProtocolInterfaces ( + &ControllerHandle, + &gVlanConfigPrivateGuid, + PrivateData, + NULL + ); + if (EFI_ERROR (Status)) { + goto ErrorExit; + } + return Status; + +ErrorExit: + gBS->CloseProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + gBS->CloseProtocol ( + ControllerHandle, + &gEfiDevicePathProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + + if (PrivateData != NULL) { + UninstallVlanConfigForm (PrivateData); + FreePool (PrivateData); + } + + return Status; +} + + +/** + Stop this driver on ControllerHandle. + + @param[in] This Protocol instance pointer. + @param[in] ControllerHandle Handle of device to stop driver on + @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number + of children is zero stop the entire bus driver. + @param[in] ChildHandleBuffer List of Child Handles to Stop. + + @retval EFI_SUCCES This driver is removed ControllerHandle + @retval other This driver was not removed from this device + +**/ +EFI_STATUS +EFIAPI +VlanConfigDriverBindingStop ( + IN EFI_DRIVER_BINDING_PROTOCOL *This, + IN EFI_HANDLE ControllerHandle, + IN UINTN NumberOfChildren, + IN EFI_HANDLE *ChildHandleBuffer + ) +{ + EFI_STATUS Status; + VLAN_CONFIG_PRIVATE_DATA *PrivateData; + + // + // Retrieve the PrivateData from ControllerHandle + // + Status = gBS->OpenProtocol ( + ControllerHandle, + &gVlanConfigPrivateGuid, + (VOID **) &PrivateData, + This->DriverBindingHandle, + ControllerHandle, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + if (EFI_ERROR (Status)) { + return Status; + } + ASSERT (PrivateData->Signature == VLAN_CONFIG_PRIVATE_DATA_SIGNATURE); + + // + // Uninstall VLAN configuration Form + // + UninstallVlanConfigForm (PrivateData); + + // + // Uninstall the private GUID + // + Status = gBS->UninstallMultipleProtocolInterfaces ( + ControllerHandle, + &gVlanConfigPrivateGuid, + PrivateData, + NULL + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Status = gBS->CloseProtocol ( + ControllerHandle, + &gEfiVlanConfigProtocolGuid, + This->DriverBindingHandle, + ControllerHandle + ); + return Status; +} -- cgit v1.2.3