Upgrade driver binding version from 0xa to 0x10
[efi/fat/.git] / EnhancedFat / Dxe / Fat.c
1 /*++\r
2 \r
3 Copyright (c) 2006, Intel Corporation\r
4 All rights reserved. This program and the accompanying materials\r
5 are licensed and made available under the terms and conditions of the Software \r
6 License Agreement which accompanies this distribution.\r
7 \r
8 \r
9 Module Name:\r
10 \r
11   Fat.c\r
12   \r
13 Abstract:\r
14 \r
15   Fat File System driver routines that support EFI driver model\r
16   \r
17 --*/\r
18 \r
19 #include "Fat.h"\r
20 \r
21 EFI_STATUS\r
22 EFIAPI\r
23 FatEntryPoint (\r
24   IN EFI_HANDLE         ImageHandle,\r
25   IN EFI_SYSTEM_TABLE   *SystemTable\r
26   );\r
27 \r
28 EFI_STATUS\r
29 EFIAPI\r
30 FatUnload (\r
31   IN EFI_HANDLE         ImageHandle\r
32   );\r
33 \r
34 EFI_STATUS\r
35 EFIAPI\r
36 FatDriverBindingSupported (\r
37   IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
38   IN EFI_HANDLE                   Controller,\r
39   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
40   );\r
41 \r
42 EFI_STATUS\r
43 EFIAPI\r
44 FatDriverBindingStart (\r
45   IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
46   IN EFI_HANDLE                   Controller,\r
47   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
48   );\r
49 \r
50 EFI_STATUS\r
51 EFIAPI\r
52 FatDriverBindingStop (\r
53   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,\r
54   IN  EFI_HANDLE                   Controller,\r
55   IN  UINTN                        NumberOfChildren,\r
56   IN  EFI_HANDLE                   *ChildHandleBuffer\r
57   );\r
58 \r
59 //\r
60 // DriverBinding protocol instance\r
61 //\r
62 EFI_DRIVER_BINDING_PROTOCOL gFatDriverBinding = {\r
63   FatDriverBindingSupported,\r
64   FatDriverBindingStart,\r
65   FatDriverBindingStop,\r
66   0x10,\r
67   NULL,\r
68   NULL\r
69 };\r
70 \r
71 #ifndef EDK_RELEASE_VERSION\r
72 \r
73 EFI_DRIVER_ENTRY_POINT (FatEntryPoint)\r
74 \r
75 EFI_STATUS\r
76 EFIAPI\r
77 FatEntryPoint (\r
78   IN EFI_HANDLE         ImageHandle,\r
79   IN EFI_SYSTEM_TABLE   *SystemTable\r
80   )\r
81 /*++\r
82 \r
83 Routine Description:\r
84 \r
85   Register Driver Binding protocol for this driver.\r
86   \r
87 Arguments:\r
88  \r
89   ImageHandle           - Handle for the image of this driver.\r
90   SystemTable           - Pointer to the EFI System Table.\r
91 \r
92 Returns: \r
93  \r
94   EFI_SUCCESS           - Driver loaded.\r
95   other                 - Driver not loaded.\r
96 \r
97 --*/\r
98 {\r
99   EFI_STATUS                Status;\r
100   EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
101 \r
102   //\r
103   // Initialize the EFI Driver Library\r
104   //\r
105   Status = EfiLibInstallAllDriverProtocols (\r
106              ImageHandle,\r
107              SystemTable,\r
108              &gFatDriverBinding,\r
109              ImageHandle,\r
110              &gFatComponentName,\r
111              NULL,\r
112              NULL\r
113              );\r
114   if (EFI_ERROR (Status)) {\r
115     return Status;\r
116   }\r
117   //\r
118   // Fill in the Unload() function\r
119   //\r
120   Status = gBS->OpenProtocol (\r
121                   ImageHandle,\r
122                   &gEfiLoadedImageProtocolGuid,\r
123                   (VOID **) &LoadedImage,\r
124                   ImageHandle,\r
125                   ImageHandle,\r
126                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
127                   );\r
128 \r
129   if (!EFI_ERROR (Status)) {\r
130     LoadedImage->Unload = FatUnload;\r
131   }\r
132 \r
133   return Status;\r
134 }\r
135 \r
136 #endif\r
137 \r
138 \r
139 EFI_STATUS\r
140 EFIAPI\r
141 FatUnload (\r
142   IN EFI_HANDLE  ImageHandle\r
143   )\r
144 /*++\r
145 \r
146 Routine Description:\r
147 \r
148   Unload function for this image. Uninstall DriverBinding protocol.\r
149   \r
150 Arguments:\r
151  \r
152   ImageHandle           - Handle for the image of this driver.\r
153 \r
154 Returns: \r
155  \r
156   EFI_SUCCESS           - Driver unloaded successfully.\r
157   other                 - Driver can not unloaded.\r
158   \r
159 --*/\r
160 {\r
161   EFI_STATUS  Status;\r
162   EFI_HANDLE  *DeviceHandleBuffer;\r
163   UINTN       DeviceHandleCount;\r
164   UINTN       Index;\r
165 \r
166   Status = gBS->LocateHandleBuffer (\r
167                   AllHandles,\r
168                   NULL,\r
169                   NULL,\r
170                   &DeviceHandleCount,\r
171                   &DeviceHandleBuffer\r
172                   );\r
173   if (!EFI_ERROR (Status)) {\r
174     for (Index = 0; Index < DeviceHandleCount; Index++) {\r
175       Status = gBS->DisconnectController (\r
176                       DeviceHandleBuffer[Index],\r
177                       ImageHandle,\r
178                       NULL\r
179                       );\r
180     }\r
181 \r
182     if (DeviceHandleBuffer != NULL) {\r
183       gBS->FreePool (DeviceHandleBuffer);\r
184     }\r
185   }\r
186 \r
187   Status = gBS->UninstallMultipleProtocolInterfaces (\r
188                   ImageHandle,\r
189                   &gEfiDriverBindingProtocolGuid,\r
190                   &gFatDriverBinding,\r
191                   &gEfiComponentNameProtocolGuid,\r
192                   &gFatComponentName,\r
193                   NULL\r
194                   );\r
195 \r
196   return Status;\r
197 }\r
198 \r
199 EFI_STATUS\r
200 EFIAPI\r
201 FatDriverBindingSupported (\r
202   IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
203   IN EFI_HANDLE                   ControllerHandle,\r
204   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
205   )\r
206 /*++\r
207 \r
208 Routine Description:\r
209 \r
210   Test to see if this driver can add a file system to ControllerHandle.\r
211   ControllerHandle must support both Disk IO and Block IO protocols.\r
212 \r
213 Arguments:\r
214 \r
215   This                  - Protocol instance pointer.\r
216   ControllerHandle      - Handle of device to test.\r
217   RemainingDevicePath   - Not used.\r
218 \r
219 Returns:\r
220 \r
221   EFI_SUCCESS           - This driver supports this device.\r
222   EFI_ALREADY_STARTED   - This driver is already running on this device.\r
223   other                 - This driver does not support this device.\r
224 \r
225 --*/\r
226 {\r
227   EFI_STATUS            Status;\r
228   EFI_DISK_IO_PROTOCOL  *DiskIo;\r
229 \r
230   //\r
231   // Open the IO Abstraction(s) needed to perform the supported test\r
232   //\r
233   Status = gBS->OpenProtocol (\r
234                   ControllerHandle,\r
235                   &gEfiDiskIoProtocolGuid,\r
236                   (VOID **) &DiskIo,\r
237                   This->DriverBindingHandle,\r
238                   ControllerHandle,\r
239                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
240                   );\r
241 \r
242   if (EFI_ERROR (Status)) {\r
243     return Status;\r
244   }\r
245   //\r
246   // Close the I/O Abstraction(s) used to perform the supported test\r
247   //\r
248   gBS->CloseProtocol (\r
249          ControllerHandle,\r
250          &gEfiDiskIoProtocolGuid,\r
251          This->DriverBindingHandle,\r
252          ControllerHandle\r
253          );\r
254 \r
255   //\r
256   // Open the IO Abstraction(s) needed to perform the supported test\r
257   //\r
258   Status = gBS->OpenProtocol (\r
259                   ControllerHandle,\r
260                   &gEfiBlockIoProtocolGuid,\r
261                   NULL,\r
262                   This->DriverBindingHandle,\r
263                   ControllerHandle,\r
264                   EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
265                   );\r
266 \r
267   return Status;\r
268 }\r
269 \r
270 EFI_STATUS\r
271 EFIAPI\r
272 FatDriverBindingStart (\r
273   IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
274   IN EFI_HANDLE                   ControllerHandle,\r
275   IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath\r
276   )\r
277 /*++\r
278 \r
279 Routine Description:      \r
280 \r
281   Start this driver on ControllerHandle by opening a Block IO and Disk IO \r
282   protocol, reading Device Path. Add a Simple File System protocol to\r
283   ControllerHandle if the media contains a valid file system.\r
284 \r
285 Arguments:\r
286 \r
287   This                  - Protocol instance pointer.\r
288   ControllerHandle      - Handle of device to bind driver to.\r
289   RemainingDevicePath   - Not used.\r
290 \r
291 Returns:\r
292 \r
293   EFI_SUCCESS           - This driver is added to DeviceHandle.\r
294   EFI_ALREADY_STARTED   - This driver is already running on DeviceHandle.\r
295   EFI_OUT_OF_RESOURCES  - Can not allocate the memory.\r
296   other                 - This driver does not support this device.\r
297 \r
298 --*/\r
299 {\r
300   EFI_STATUS            Status;\r
301   EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
302   EFI_DISK_IO_PROTOCOL  *DiskIo;\r
303   LC_ISO_639_2          *LangCode;\r
304   LC_ISO_639_2          LangCodeBuffer[MAX_LANG_CODE_SIZE];\r
305   UINTN                 Size;\r
306 \r
307   //\r
308   // Initialize unicode support\r
309   //\r
310   Size      = sizeof (LangCodeBuffer);\r
311   LangCode  = LangCodeBuffer;\r
312   //\r
313   // Find current LangCode from Lang NV Variable\r
314   //\r
315   Status = gRT->GetVariable (\r
316                   L"Lang",\r
317                   &gEfiGlobalVariableGuid,\r
318                   NULL,\r
319                   &Size,\r
320                   LangCode\r
321                   );\r
322 \r
323   ASSERT (Status != EFI_BUFFER_TOO_SMALL);\r
324   //\r
325   // If cannot get language code from Lang Variable,\r
326   // set language code to the default language English.\r
327   //\r
328   if (EFI_ERROR (Status)) {\r
329     LangCode = "eng";\r
330     DEBUG ((EFI_D_ERROR, "Failed to get language code, so use the default!\n"));\r
331   }\r
332 \r
333   Status = FatInitUnicodeCollationSupport (\r
334              This,\r
335              LangCode,\r
336              &gUnicodeCollationInterface\r
337              );\r
338   if (EFI_ERROR (Status)) {\r
339     return Status;\r
340   }\r
341   //\r
342   // Make sure gUnicodeCollationInterface is properly installed\r
343   //\r
344   ASSERT (gUnicodeCollationInterface != NULL);\r
345   //\r
346   // Open our required BlockIo and DiskIo\r
347   //\r
348   Status = gBS->OpenProtocol (\r
349                   ControllerHandle,\r
350                   &gEfiBlockIoProtocolGuid,\r
351                   (VOID **) &BlockIo,\r
352                   This->DriverBindingHandle,\r
353                   ControllerHandle,\r
354                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
355                   );\r
356   if (EFI_ERROR (Status)) {\r
357     return Status;\r
358   }\r
359 \r
360   Status = gBS->OpenProtocol (\r
361                   ControllerHandle,\r
362                   &gEfiDiskIoProtocolGuid,\r
363                   (VOID **) &DiskIo,\r
364                   This->DriverBindingHandle,\r
365                   ControllerHandle,\r
366                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
367                   );\r
368 \r
369   if (EFI_ERROR (Status)) {\r
370     return Status;\r
371   }\r
372   //\r
373   // Allocate Volume structure. In FatAllocateVolume(), Resources\r
374   // are allocated with protocol installed and cached initialized\r
375   //\r
376   Status = FatAllocateVolume (ControllerHandle, DiskIo, BlockIo);\r
377 \r
378   if (EFI_ERROR (Status)) {\r
379     Status = gBS->OpenProtocol (\r
380                     ControllerHandle,\r
381                     &gEfiSimpleFileSystemProtocolGuid,\r
382                     NULL,\r
383                     This->DriverBindingHandle,\r
384                     ControllerHandle,\r
385                     EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
386                     );\r
387     if (EFI_ERROR (Status)) {\r
388       gBS->CloseProtocol (\r
389              ControllerHandle,\r
390              &gEfiDiskIoProtocolGuid,\r
391              This->DriverBindingHandle,\r
392              ControllerHandle\r
393              );\r
394     }\r
395   }\r
396 \r
397   return Status;\r
398 }\r
399 \r
400 EFI_STATUS\r
401 EFIAPI\r
402 FatDriverBindingStop (\r
403   IN  EFI_DRIVER_BINDING_PROTOCOL   *This,\r
404   IN  EFI_HANDLE                    ControllerHandle,\r
405   IN  UINTN                         NumberOfChildren,\r
406   IN  EFI_HANDLE                    *ChildHandleBuffer\r
407   )\r
408 /*++\r
409 \r
410 Routine Description:\r
411   Stop this driver on ControllerHandle. \r
412 \r
413 Arguments:\r
414   This                  - Protocol instance pointer.\r
415   ControllerHandle      - Handle of device to stop driver on.\r
416   NumberOfChildren      - Not used.\r
417   ChildHandleBuffer     - Not used.\r
418 \r
419 Returns:\r
420   EFI_SUCCESS           - This driver is removed DeviceHandle.\r
421   other                 - This driver was not removed from this device.\r
422 \r
423 --*/\r
424 {\r
425   EFI_STATUS                      Status;\r
426   EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;\r
427   FAT_VOLUME                      *Volume;\r
428 \r
429   //\r
430   // Get our context back\r
431   //\r
432   Status = gBS->OpenProtocol (\r
433                   ControllerHandle,\r
434                   &gEfiSimpleFileSystemProtocolGuid,\r
435                   (VOID **) &FileSystem,\r
436                   This->DriverBindingHandle,\r
437                   ControllerHandle,\r
438                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
439                   );\r
440 \r
441   if (!EFI_ERROR (Status)) {\r
442     Volume = VOLUME_FROM_VOL_INTERFACE (FileSystem);\r
443     Status = FatAbandonVolume (Volume);\r
444     if (EFI_ERROR (Status)) {\r
445       return Status;\r
446     }\r
447   }\r
448 \r
449   Status = gBS->CloseProtocol (\r
450                   ControllerHandle,\r
451                   &gEfiDiskIoProtocolGuid,\r
452                   This->DriverBindingHandle,\r
453                   ControllerHandle\r
454                   );\r
455 \r
456   return Status;\r
457 }\r