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