NetworkPkg: Move Network library and drivers from MdeModulePkg to NetworkPkg
[mirror_edk2.git] / NetworkPkg / VlanConfigDxe / VlanConfigDriver.c
1 /** @file\r
2   The driver binding for VLAN configuration module.\r
3 \r
4 Copyright (c) 2009 - 2018, Intel Corporation. All rights reserved.<BR>\r
5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
6 \r
7 **/\r
8 \r
9 #include "VlanConfigImpl.h"\r
10 \r
11 EFI_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
31 EFI_STATUS\r
32 EFIAPI\r
33 VlanConfigDriverEntryPoint (\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
62 EFI_STATUS\r
63 EFIAPI\r
64 VlanConfigDriverBindingSupported (\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
112 EFI_STATUS\r
113 EFIAPI\r
114 VlanConfigDriverBindingStart (\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
130                   &gEfiCallerIdGuid,\r
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
197                   &gEfiCallerIdGuid,\r
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
206 ErrorExit:\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
243 EFI_STATUS\r
244 EFIAPI\r
245 VlanConfigDriverBindingStop (\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
260                   &gEfiCallerIdGuid,\r
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
271   if (NumberOfChildren != 0) {\r
272     if (NumberOfChildren != 1 || ChildHandleBuffer[0] != PrivateData->DriverHandle) {\r
273       return EFI_DEVICE_ERROR;\r
274     }\r
275 \r
276     return UninstallVlanConfigForm (PrivateData);\r
277   }\r
278 \r
279   //\r
280   // Uninstall the private GUID\r
281   //\r
282   Status = gBS->UninstallMultipleProtocolInterfaces (\r
283                   ControllerHandle,\r
284                   &gEfiCallerIdGuid,\r
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