]> git.proxmox.com Git - mirror_edk2.git/blob - MdeModulePkg/Universal/Network/VlanConfigDxe/VlanConfigDriver.c
Fix following problems about VLAN driver:
[mirror_edk2.git] / MdeModulePkg / Universal / Network / VlanConfigDxe / VlanConfigDriver.c
1 /** @file
2 The driver binding for VLAN configuration module.
3
4 Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions
7 of the BSD License which accompanies this distribution. The full
8 text of the license may be found at<BR>
9 http://opensource.org/licenses/bsd-license.php
10
11 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
12 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
13
14 **/
15
16 #include "VlanConfigImpl.h"
17
18 EFI_DRIVER_BINDING_PROTOCOL gVlanConfigDriverBinding = {
19 VlanConfigDriverBindingSupported,
20 VlanConfigDriverBindingStart,
21 VlanConfigDriverBindingStop,
22 0xa,
23 NULL,
24 NULL
25 };
26
27 /**
28 The entry point for IP4 config driver which install the driver
29 binding and component name protocol on its image.
30
31 @param[in] ImageHandle The image handle of the driver.
32 @param[in] SystemTable The system table.
33
34 @retval EFI_SUCCES All the related protocols are installed on the driver.
35 @retval Others Failed to install protocols.
36
37 **/
38 EFI_STATUS
39 EFIAPI
40 VlanConfigDriverEntryPoint (
41 IN EFI_HANDLE ImageHandle,
42 IN EFI_SYSTEM_TABLE *SystemTable
43 )
44 {
45 return EfiLibInstallDriverBindingComponentName2 (
46 ImageHandle,
47 SystemTable,
48 &gVlanConfigDriverBinding,
49 ImageHandle,
50 &gVlanConfigComponentName,
51 &gVlanConfigComponentName2
52 );
53 }
54
55
56 /**
57 Test to see if this driver supports ControllerHandle.
58
59 @param[in] This Protocol instance pointer.
60 @param[in] ControllerHandle Handle of device to test
61 @param[in] RemainingDevicePath Optional parameter use to pick a specific child
62 device to start.
63
64 @retval EFI_SUCCES This driver supports this device
65 @retval EFI_ALREADY_STARTED This driver is already running on this device
66 @retval other This driver does not support this device
67
68 **/
69 EFI_STATUS
70 EFIAPI
71 VlanConfigDriverBindingSupported (
72 IN EFI_DRIVER_BINDING_PROTOCOL *This,
73 IN EFI_HANDLE ControllerHandle,
74 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
75 )
76 {
77 EFI_STATUS Status;
78 EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
79
80 Status = gBS->OpenProtocol (
81 ControllerHandle,
82 &gEfiVlanConfigProtocolGuid,
83 (VOID **) &VlanConfig,
84 This->DriverBindingHandle,
85 ControllerHandle,
86 EFI_OPEN_PROTOCOL_BY_DRIVER
87 );
88 if (EFI_ERROR (Status)) {
89 return Status;
90 }
91
92 //
93 // Close the VlanConfig protocol opened for supported test
94 //
95 gBS->CloseProtocol (
96 ControllerHandle,
97 &gEfiVlanConfigProtocolGuid,
98 This->DriverBindingHandle,
99 ControllerHandle
100 );
101
102 return Status;
103 }
104
105
106 /**
107 Start this driver on ControllerHandle.
108
109 @param[in] This Protocol instance pointer.
110 @param[in] ControllerHandle Handle of device to bind driver to
111 @param[in] RemainingDevicePath Optional parameter use to pick a specific child
112 device to start.
113
114 @retval EFI_SUCCES This driver is added to ControllerHandle
115 @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle
116 @retval other This driver does not support this device
117
118 **/
119 EFI_STATUS
120 EFIAPI
121 VlanConfigDriverBindingStart (
122 IN EFI_DRIVER_BINDING_PROTOCOL *This,
123 IN EFI_HANDLE ControllerHandle,
124 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
125 )
126 {
127 EFI_STATUS Status;
128 EFI_VLAN_CONFIG_PROTOCOL *VlanConfig;
129 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
130 VLAN_CONFIG_PRIVATE_DATA *PrivateData;
131
132 //
133 // Check for multiple start
134 //
135 Status = gBS->OpenProtocol (
136 ControllerHandle,
137 &gEfiCallerIdGuid,
138 (VOID **) &PrivateData,
139 This->DriverBindingHandle,
140 ControllerHandle,
141 EFI_OPEN_PROTOCOL_GET_PROTOCOL
142 );
143 if (!EFI_ERROR (Status)) {
144 return EFI_ALREADY_STARTED;
145 }
146
147 //
148 // Open VlanConfig protocol by driver
149 //
150 Status = gBS->OpenProtocol (
151 ControllerHandle,
152 &gEfiVlanConfigProtocolGuid,
153 (VOID **) &VlanConfig,
154 This->DriverBindingHandle,
155 ControllerHandle,
156 EFI_OPEN_PROTOCOL_BY_DRIVER
157 );
158 if (EFI_ERROR (Status)) {
159 return Status;
160 }
161
162 //
163 // Get parent device path
164 //
165 Status = gBS->OpenProtocol (
166 ControllerHandle,
167 &gEfiDevicePathProtocolGuid,
168 (VOID **) &DevicePath,
169 This->DriverBindingHandle,
170 ControllerHandle,
171 EFI_OPEN_PROTOCOL_GET_PROTOCOL
172 );
173 if (EFI_ERROR (Status)) {
174 goto ErrorExit;
175 }
176
177 //
178 // Create a private data for this network device
179 //
180 PrivateData = AllocateCopyPool (sizeof (VLAN_CONFIG_PRIVATE_DATA), &mVlanConfigPrivateDateTemplate);
181 if (PrivateData == NULL) {
182 Status = EFI_OUT_OF_RESOURCES;
183 goto ErrorExit;
184 }
185
186 PrivateData->ImageHandle = This->DriverBindingHandle;
187 PrivateData->ControllerHandle = ControllerHandle;
188 PrivateData->VlanConfig = VlanConfig;
189 PrivateData->ParentDevicePath = DevicePath;
190
191 //
192 // Install VLAN configuration form
193 //
194 Status = InstallVlanConfigForm (PrivateData);
195 if (EFI_ERROR (Status)) {
196 goto ErrorExit;
197 }
198
199 //
200 // Install private GUID
201 //
202 Status = gBS->InstallMultipleProtocolInterfaces (
203 &ControllerHandle,
204 &gEfiCallerIdGuid,
205 PrivateData,
206 NULL
207 );
208 if (EFI_ERROR (Status)) {
209 goto ErrorExit;
210 }
211 return Status;
212
213 ErrorExit:
214 gBS->CloseProtocol (
215 ControllerHandle,
216 &gEfiVlanConfigProtocolGuid,
217 This->DriverBindingHandle,
218 ControllerHandle
219 );
220
221 gBS->CloseProtocol (
222 ControllerHandle,
223 &gEfiDevicePathProtocolGuid,
224 This->DriverBindingHandle,
225 ControllerHandle
226 );
227
228 if (PrivateData != NULL) {
229 UninstallVlanConfigForm (PrivateData);
230 FreePool (PrivateData);
231 }
232
233 return Status;
234 }
235
236
237 /**
238 Stop this driver on ControllerHandle.
239
240 @param[in] This Protocol instance pointer.
241 @param[in] ControllerHandle Handle of device to stop driver on
242 @param[in] NumberOfChildren Number of Handles in ChildHandleBuffer. If number
243 of children is zero stop the entire bus driver.
244 @param[in] ChildHandleBuffer List of Child Handles to Stop.
245
246 @retval EFI_SUCCES This driver is removed ControllerHandle
247 @retval other This driver was not removed from this device
248
249 **/
250 EFI_STATUS
251 EFIAPI
252 VlanConfigDriverBindingStop (
253 IN EFI_DRIVER_BINDING_PROTOCOL *This,
254 IN EFI_HANDLE ControllerHandle,
255 IN UINTN NumberOfChildren,
256 IN EFI_HANDLE *ChildHandleBuffer
257 )
258 {
259 EFI_STATUS Status;
260 VLAN_CONFIG_PRIVATE_DATA *PrivateData;
261
262 //
263 // Retrieve the PrivateData from ControllerHandle
264 //
265 Status = gBS->OpenProtocol (
266 ControllerHandle,
267 &gEfiCallerIdGuid,
268 (VOID **) &PrivateData,
269 This->DriverBindingHandle,
270 ControllerHandle,
271 EFI_OPEN_PROTOCOL_GET_PROTOCOL
272 );
273 if (EFI_ERROR (Status)) {
274 return Status;
275 }
276 ASSERT (PrivateData->Signature == VLAN_CONFIG_PRIVATE_DATA_SIGNATURE);
277
278 if (NumberOfChildren != 0) {
279 if (NumberOfChildren != 1 || ChildHandleBuffer[0] != PrivateData->DriverHandle) {
280 return EFI_DEVICE_ERROR;
281 }
282
283 return UninstallVlanConfigForm (PrivateData);
284 }
285
286 //
287 // Uninstall the private GUID
288 //
289 Status = gBS->UninstallMultipleProtocolInterfaces (
290 ControllerHandle,
291 &gEfiCallerIdGuid,
292 PrivateData,
293 NULL
294 );
295 if (EFI_ERROR (Status)) {
296 return Status;
297 }
298
299 Status = gBS->CloseProtocol (
300 ControllerHandle,
301 &gEfiVlanConfigProtocolGuid,
302 This->DriverBindingHandle,
303 ControllerHandle
304 );
305 return Status;
306 }