2 The driver binding for VLAN configuration module.
4 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>
5 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include "VlanConfigImpl.h"
11 EFI_DRIVER_BINDING_PROTOCOL gVlanConfigDriverBinding
= {
12 VlanConfigDriverBindingSupported
,
13 VlanConfigDriverBindingStart
,
14 VlanConfigDriverBindingStop
,
21 The entry point for IP4 config driver which install the driver
22 binding and component name protocol on its image.
24 @param[in] ImageHandle The image handle of the driver.
25 @param[in] SystemTable The system table.
27 @retval EFI_SUCCESS All the related protocols are installed on the driver.
28 @retval Others Failed to install protocols.
33 VlanConfigDriverEntryPoint (
34 IN EFI_HANDLE ImageHandle
,
35 IN EFI_SYSTEM_TABLE
*SystemTable
38 return EfiLibInstallDriverBindingComponentName2 (
41 &gVlanConfigDriverBinding
,
43 &gVlanConfigComponentName
,
44 &gVlanConfigComponentName2
49 Test to see if this driver supports ControllerHandle.
51 @param[in] This Protocol instance pointer.
52 @param[in] ControllerHandle Handle of device to test
53 @param[in] RemainingDevicePath Optional parameter use to pick a specific child
56 @retval EFI_SUCCESS This driver supports this device
57 @retval EFI_ALREADY_STARTED This driver is already running on this device
58 @retval other This driver does not support this device
63 VlanConfigDriverBindingSupported (
64 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
65 IN EFI_HANDLE ControllerHandle
,
66 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
70 EFI_VLAN_CONFIG_PROTOCOL
*VlanConfig
;
72 Status
= gBS
->OpenProtocol (
74 &gEfiVlanConfigProtocolGuid
,
76 This
->DriverBindingHandle
,
78 EFI_OPEN_PROTOCOL_BY_DRIVER
80 if (EFI_ERROR (Status
)) {
85 // Close the VlanConfig protocol opened for supported test
89 &gEfiVlanConfigProtocolGuid
,
90 This
->DriverBindingHandle
,
98 Start this driver on ControllerHandle.
100 @param[in] This Protocol instance pointer.
101 @param[in] ControllerHandle Handle of device to bind driver to
102 @param[in] RemainingDevicePath Optional parameter use to pick a specific child
105 @retval EFI_SUCCESS This driver is added to ControllerHandle
106 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
107 @retval other This driver does not support this device
112 VlanConfigDriverBindingStart (
113 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
114 IN EFI_HANDLE ControllerHandle
,
115 IN EFI_DEVICE_PATH_PROTOCOL
*RemainingDevicePath OPTIONAL
119 EFI_VLAN_CONFIG_PROTOCOL
*VlanConfig
;
120 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
121 VLAN_CONFIG_PRIVATE_DATA
*PrivateData
;
124 // Check for multiple start
126 Status
= gBS
->OpenProtocol (
129 (VOID
**)&PrivateData
,
130 This
->DriverBindingHandle
,
132 EFI_OPEN_PROTOCOL_GET_PROTOCOL
134 if (!EFI_ERROR (Status
)) {
135 return EFI_ALREADY_STARTED
;
139 // Open VlanConfig protocol by driver
141 Status
= gBS
->OpenProtocol (
143 &gEfiVlanConfigProtocolGuid
,
144 (VOID
**)&VlanConfig
,
145 This
->DriverBindingHandle
,
147 EFI_OPEN_PROTOCOL_BY_DRIVER
149 if (EFI_ERROR (Status
)) {
154 // Get parent device path
156 Status
= gBS
->OpenProtocol (
158 &gEfiDevicePathProtocolGuid
,
159 (VOID
**)&DevicePath
,
160 This
->DriverBindingHandle
,
162 EFI_OPEN_PROTOCOL_GET_PROTOCOL
164 if (EFI_ERROR (Status
)) {
169 // Create a private data for this network device
171 PrivateData
= AllocateCopyPool (sizeof (VLAN_CONFIG_PRIVATE_DATA
), &mVlanConfigPrivateDateTemplate
);
172 if (PrivateData
== NULL
) {
173 Status
= EFI_OUT_OF_RESOURCES
;
177 PrivateData
->ImageHandle
= This
->DriverBindingHandle
;
178 PrivateData
->ControllerHandle
= ControllerHandle
;
179 PrivateData
->VlanConfig
= VlanConfig
;
180 PrivateData
->ParentDevicePath
= DevicePath
;
183 // Install VLAN configuration form
185 Status
= InstallVlanConfigForm (PrivateData
);
186 if (EFI_ERROR (Status
)) {
191 // Install private GUID
193 Status
= gBS
->InstallMultipleProtocolInterfaces (
199 if (EFI_ERROR (Status
)) {
208 &gEfiVlanConfigProtocolGuid
,
209 This
->DriverBindingHandle
,
215 &gEfiDevicePathProtocolGuid
,
216 This
->DriverBindingHandle
,
220 if (PrivateData
!= NULL
) {
221 UninstallVlanConfigForm (PrivateData
);
222 FreePool (PrivateData
);
229 Stop this driver on ControllerHandle.
231 @param[in] This Protocol instance pointer.
232 @param[in] ControllerHandle Handle of device to stop driver on
233 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number
234 of children is zero stop the entire bus driver.
235 @param[in] ChildHandleBuffer List of Child Handles to Stop.
237 @retval EFI_SUCCESS This driver is removed ControllerHandle
238 @retval other This driver was not removed from this device
243 VlanConfigDriverBindingStop (
244 IN EFI_DRIVER_BINDING_PROTOCOL
*This
,
245 IN EFI_HANDLE ControllerHandle
,
246 IN UINTN NumberOfChildren
,
247 IN EFI_HANDLE
*ChildHandleBuffer
251 VLAN_CONFIG_PRIVATE_DATA
*PrivateData
;
254 // Retrieve the PrivateData from ControllerHandle
256 Status
= gBS
->OpenProtocol (
259 (VOID
**)&PrivateData
,
260 This
->DriverBindingHandle
,
262 EFI_OPEN_PROTOCOL_GET_PROTOCOL
264 if (EFI_ERROR (Status
)) {
268 ASSERT (PrivateData
->Signature
== VLAN_CONFIG_PRIVATE_DATA_SIGNATURE
);
270 if (NumberOfChildren
!= 0) {
271 if ((NumberOfChildren
!= 1) || (ChildHandleBuffer
[0] != PrivateData
->DriverHandle
)) {
272 return EFI_DEVICE_ERROR
;
275 return UninstallVlanConfigForm (PrivateData
);
279 // Uninstall the private GUID
281 Status
= gBS
->UninstallMultipleProtocolInterfaces (
287 if (EFI_ERROR (Status
)) {
291 Status
= gBS
->CloseProtocol (
293 &gEfiVlanConfigProtocolGuid
,
294 This
->DriverBindingHandle
,