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