]> git.proxmox.com Git - mirror_edk2.git/blame - FatPkg/EnhancedFatDxe/Fat.c
remove obsoleted .msa and .nspd files
[mirror_edk2.git] / FatPkg / EnhancedFatDxe / Fat.c
CommitLineData
b9ec9330
QH
1/*++\r
2\r
5251cb9d 3Copyright (c) 2005 - 2010, Intel Corporation. All rights reserved.<BR>\r
6163cc98 4This program and the accompanying materials are licensed and made available\r
b9ec9330
QH
5under the terms and conditions of the BSD License which accompanies this\r
6distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12\r
13Module Name:\r
14\r
15 Fat.c\r
16\r
17Abstract:\r
18\r
19 Fat File System driver routines that support EFI driver model\r
20\r
21--*/\r
22\r
23#include "Fat.h"\r
24\r
25EFI_STATUS\r
26EFIAPI\r
27FatEntryPoint (\r
28 IN EFI_HANDLE ImageHandle,\r
29 IN EFI_SYSTEM_TABLE *SystemTable\r
30 );\r
31\r
32EFI_STATUS\r
33EFIAPI\r
34FatUnload (\r
35 IN EFI_HANDLE ImageHandle\r
36 );\r
37\r
38EFI_STATUS\r
39EFIAPI\r
40FatDriverBindingSupported (\r
41 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
42 IN EFI_HANDLE Controller,\r
43 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
44 );\r
45\r
46EFI_STATUS\r
47EFIAPI\r
48FatDriverBindingStart (\r
49 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
50 IN EFI_HANDLE Controller,\r
51 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
52 );\r
53\r
54EFI_STATUS\r
55EFIAPI\r
56FatDriverBindingStop (\r
57 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
58 IN EFI_HANDLE Controller,\r
59 IN UINTN NumberOfChildren,\r
60 IN EFI_HANDLE *ChildHandleBuffer\r
61 );\r
62\r
63//\r
64// DriverBinding protocol instance\r
65//\r
66EFI_DRIVER_BINDING_PROTOCOL gFatDriverBinding = {\r
67 FatDriverBindingSupported,\r
68 FatDriverBindingStart,\r
69 FatDriverBindingStop,\r
70 0xa,\r
71 NULL,\r
72 NULL\r
73};\r
74\r
75EFI_STATUS\r
76EFIAPI\r
77FatEntryPoint (\r
78 IN EFI_HANDLE ImageHandle,\r
79 IN EFI_SYSTEM_TABLE *SystemTable\r
80 )\r
81/*++\r
82\r
83Routine Description:\r
84\r
85 Register Driver Binding protocol for this driver.\r
86\r
87Arguments:\r
88\r
89 ImageHandle - Handle for the image of this driver.\r
90 SystemTable - Pointer to the EFI System Table.\r
91\r
92Returns:\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\r
101 //\r
102 // Initialize the EFI Driver Library\r
103 //\r
104 Status = EfiLibInstallDriverBindingComponentName2 (\r
105 ImageHandle,\r
106 SystemTable,\r
107 &gFatDriverBinding,\r
108 ImageHandle,\r
109 &gFatComponentName,\r
110 &gFatComponentName2\r
111 );\r
112 ASSERT_EFI_ERROR (Status);\r
113\r
114 return Status;\r
115}\r
116\r
117EFI_STATUS\r
118EFIAPI\r
119FatUnload (\r
120 IN EFI_HANDLE ImageHandle\r
121 )\r
122/*++\r
123\r
124Routine Description:\r
125\r
126 Unload function for this image. Uninstall DriverBinding protocol.\r
127\r
128Arguments:\r
129\r
130 ImageHandle - Handle for the image of this driver.\r
131\r
132Returns:\r
133\r
134 EFI_SUCCESS - Driver unloaded successfully.\r
135 other - Driver can not unloaded.\r
136\r
137--*/\r
138{\r
139 EFI_STATUS Status;\r
140 EFI_HANDLE *DeviceHandleBuffer;\r
141 UINTN DeviceHandleCount;\r
142 UINTN Index;\r
143\r
144 Status = gBS->LocateHandleBuffer (\r
145 AllHandles,\r
146 NULL,\r
147 NULL,\r
148 &DeviceHandleCount,\r
149 &DeviceHandleBuffer\r
150 );\r
151 if (!EFI_ERROR (Status)) {\r
152 for (Index = 0; Index < DeviceHandleCount; Index++) {\r
153 Status = gBS->DisconnectController (\r
154 DeviceHandleBuffer[Index],\r
155 ImageHandle,\r
156 NULL\r
157 );\r
158 }\r
159\r
160 if (DeviceHandleBuffer != NULL) {\r
161 FreePool (DeviceHandleBuffer);\r
162 }\r
163 }\r
164\r
165 return Status;\r
166}\r
167\r
168EFI_STATUS\r
169EFIAPI\r
170FatDriverBindingSupported (\r
171 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
172 IN EFI_HANDLE ControllerHandle,\r
173 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
174 )\r
175/*++\r
176\r
177Routine Description:\r
178\r
179 Test to see if this driver can add a file system to ControllerHandle.\r
180 ControllerHandle must support both Disk IO and Block IO protocols.\r
181\r
182Arguments:\r
183\r
184 This - Protocol instance pointer.\r
185 ControllerHandle - Handle of device to test.\r
186 RemainingDevicePath - Not used.\r
187\r
188Returns:\r
189\r
190 EFI_SUCCESS - This driver supports this device.\r
191 EFI_ALREADY_STARTED - This driver is already running on this device.\r
192 other - This driver does not support this device.\r
193\r
194--*/\r
195{\r
196 EFI_STATUS Status;\r
197 EFI_DISK_IO_PROTOCOL *DiskIo;\r
198\r
199 //\r
200 // Open the IO Abstraction(s) needed to perform the supported test\r
201 //\r
202 Status = gBS->OpenProtocol (\r
203 ControllerHandle,\r
204 &gEfiDiskIoProtocolGuid,\r
205 (VOID **) &DiskIo,\r
206 This->DriverBindingHandle,\r
207 ControllerHandle,\r
208 EFI_OPEN_PROTOCOL_BY_DRIVER\r
209 );\r
210\r
211 if (EFI_ERROR (Status)) {\r
212 return Status;\r
213 }\r
214 //\r
215 // Close the I/O Abstraction(s) used to perform the supported test\r
216 //\r
217 gBS->CloseProtocol (\r
218 ControllerHandle,\r
219 &gEfiDiskIoProtocolGuid,\r
220 This->DriverBindingHandle,\r
221 ControllerHandle\r
222 );\r
223\r
224 //\r
225 // Open the IO Abstraction(s) needed to perform the supported test\r
226 //\r
227 Status = gBS->OpenProtocol (\r
228 ControllerHandle,\r
229 &gEfiBlockIoProtocolGuid,\r
230 NULL,\r
231 This->DriverBindingHandle,\r
232 ControllerHandle,\r
233 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
234 );\r
235\r
236 return Status;\r
237}\r
238\r
239EFI_STATUS\r
240EFIAPI\r
241FatDriverBindingStart (\r
242 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
243 IN EFI_HANDLE ControllerHandle,\r
244 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
245 )\r
246/*++\r
247\r
248Routine Description:\r
249\r
250 Start this driver on ControllerHandle by opening a Block IO and Disk IO\r
251 protocol, reading Device Path. Add a Simple File System protocol to\r
252 ControllerHandle if the media contains a valid file system.\r
253\r
254Arguments:\r
255\r
256 This - Protocol instance pointer.\r
257 ControllerHandle - Handle of device to bind driver to.\r
258 RemainingDevicePath - Not used.\r
259\r
260Returns:\r
261\r
262 EFI_SUCCESS - This driver is added to DeviceHandle.\r
263 EFI_ALREADY_STARTED - This driver is already running on DeviceHandle.\r
264 EFI_OUT_OF_RESOURCES - Can not allocate the memory.\r
265 other - This driver does not support this device.\r
266\r
267--*/\r
268{\r
269 EFI_STATUS Status;\r
270 EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
271 EFI_DISK_IO_PROTOCOL *DiskIo;\r
5251cb9d
QH
272 BOOLEAN LockedByMe;\r
273\r
274 LockedByMe = FALSE;\r
275 //\r
276 // Acquire the lock.\r
277 // If caller has already acquired the lock, cannot lock it again.\r
278 //\r
279 Status = FatAcquireLockOrFail ();\r
280 if (!EFI_ERROR (Status)) {\r
281 LockedByMe = TRUE;\r
282 }\r
b9ec9330
QH
283\r
284 Status = InitializeUnicodeCollationSupport (This->DriverBindingHandle);\r
285 if (EFI_ERROR (Status)) {\r
5251cb9d 286 goto Exit;\r
b9ec9330
QH
287 }\r
288 //\r
289 // Open our required BlockIo and DiskIo\r
290 //\r
291 Status = gBS->OpenProtocol (\r
292 ControllerHandle,\r
293 &gEfiBlockIoProtocolGuid,\r
294 (VOID **) &BlockIo,\r
295 This->DriverBindingHandle,\r
296 ControllerHandle,\r
297 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
298 );\r
299 if (EFI_ERROR (Status)) {\r
5251cb9d 300 goto Exit;\r
b9ec9330
QH
301 }\r
302\r
303 Status = gBS->OpenProtocol (\r
304 ControllerHandle,\r
305 &gEfiDiskIoProtocolGuid,\r
306 (VOID **) &DiskIo,\r
307 This->DriverBindingHandle,\r
308 ControllerHandle,\r
309 EFI_OPEN_PROTOCOL_BY_DRIVER\r
310 );\r
311 if (EFI_ERROR (Status)) {\r
5251cb9d 312 goto Exit;\r
b9ec9330
QH
313 }\r
314 //\r
315 // Allocate Volume structure. In FatAllocateVolume(), Resources\r
316 // are allocated with protocol installed and cached initialized\r
317 //\r
318 Status = FatAllocateVolume (ControllerHandle, DiskIo, BlockIo);\r
319\r
320 //\r
321 // When the media changes on a device it will Reinstall the BlockIo interaface.\r
322 // This will cause a call to our Stop(), and a subsequent reentrant call to our\r
323 // Start() successfully. We should leave the device open when this happen.\r
324 //\r
325 if (EFI_ERROR (Status)) {\r
326 Status = gBS->OpenProtocol (\r
327 ControllerHandle,\r
328 &gEfiSimpleFileSystemProtocolGuid,\r
329 NULL,\r
330 This->DriverBindingHandle,\r
331 ControllerHandle,\r
332 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
333 );\r
334 if (EFI_ERROR (Status)) {\r
335 gBS->CloseProtocol (\r
336 ControllerHandle,\r
337 &gEfiDiskIoProtocolGuid,\r
338 This->DriverBindingHandle,\r
339 ControllerHandle\r
340 );\r
341 }\r
342 }\r
343\r
5251cb9d
QH
344Exit:\r
345 //\r
346 // Unlock if locked by myself.\r
347 //\r
348 if (LockedByMe) {\r
349 FatReleaseLock ();\r
350 }\r
b9ec9330
QH
351 return Status;\r
352}\r
353\r
354EFI_STATUS\r
355EFIAPI\r
356FatDriverBindingStop (\r
357 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
358 IN EFI_HANDLE ControllerHandle,\r
359 IN UINTN NumberOfChildren,\r
360 IN EFI_HANDLE *ChildHandleBuffer\r
361 )\r
362/*++\r
363\r
364Routine Description:\r
365 Stop this driver on ControllerHandle.\r
366\r
367Arguments:\r
368 This - Protocol instance pointer.\r
369 ControllerHandle - Handle of device to stop driver on.\r
370 NumberOfChildren - Not used.\r
371 ChildHandleBuffer - Not used.\r
372\r
373Returns:\r
374 EFI_SUCCESS - This driver is removed DeviceHandle.\r
375 other - This driver was not removed from this device.\r
376\r
377--*/\r
378{\r
379 EFI_STATUS Status;\r
380 EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSystem;\r
381 FAT_VOLUME *Volume;\r
382\r
383 //\r
384 // Get our context back\r
385 //\r
386 Status = gBS->OpenProtocol (\r
387 ControllerHandle,\r
388 &gEfiSimpleFileSystemProtocolGuid,\r
389 (VOID **) &FileSystem,\r
390 This->DriverBindingHandle,\r
391 ControllerHandle,\r
392 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
393 );\r
394\r
395 if (!EFI_ERROR (Status)) {\r
396 Volume = VOLUME_FROM_VOL_INTERFACE (FileSystem);\r
397 Status = FatAbandonVolume (Volume);\r
398 if (EFI_ERROR (Status)) {\r
399 return Status;\r
400 }\r
401 }\r
402\r
403 Status = gBS->CloseProtocol (\r
404 ControllerHandle,\r
405 &gEfiDiskIoProtocolGuid,\r
406 This->DriverBindingHandle,\r
407 ControllerHandle\r
408 );\r
409\r
410 return Status;\r
411}\r