+++ /dev/null
-/*++\r
-\r
-Copyright (c) 2004 - 2005, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
-\r
-Module Name:\r
-\r
- DriverDiagnostics.c\r
-\r
-Abstract:\r
-\r
---*/\r
-\r
-#include "UnixBlockIo.h"\r
-\r
-//\r
-// EFI Driver Diagnostics Functions\r
-//\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoDriverDiagnosticsRunDiagnostics (\r
- IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE ChildHandle OPTIONAL,\r
- IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType,\r
- IN CHAR8 *Language,\r
- OUT EFI_GUID **ErrorType,\r
- OUT UINTN *BufferSize,\r
- OUT CHAR16 **Buffer\r
- );\r
-\r
-//\r
-// EFI Driver Diagnostics Protocol\r
-//\r
-EFI_DRIVER_DIAGNOSTICS_PROTOCOL gUnixBlockIoDriverDiagnostics = {\r
- UnixBlockIoDriverDiagnosticsRunDiagnostics,\r
- LANGUAGESUPPORTED\r
-};\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-UnixBlockIoDriverDiagnosticsRunDiagnostics (\r
- IN EFI_DRIVER_DIAGNOSTICS_PROTOCOL *This,\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE ChildHandle OPTIONAL,\r
- IN EFI_DRIVER_DIAGNOSTIC_TYPE DiagnosticType,\r
- IN CHAR8 *Language,\r
- OUT EFI_GUID **ErrorType,\r
- OUT UINTN *BufferSize,\r
- OUT CHAR16 **Buffer\r
- )\r
-/*++\r
-\r
- Routine Description:\r
- Runs diagnostics on a controller.\r
-\r
- Arguments:\r
- This - A pointer to the EFI_DRIVER_DIAGNOSTICS_PROTOCOL instance.\r
- ControllerHandle - The handle of the controller to run diagnostics on.\r
- ChildHandle - The handle of the child controller to run diagnostics on \r
- This is an optional parameter that may be NULL. It will \r
- be NULL for device drivers. It will also be NULL for a \r
- bus drivers that wish to run diagnostics on the bus \r
- controller. It will not be NULL for a bus driver that \r
- wishes to run diagnostics on one of its child controllers.\r
- DiagnosticType - Indicates type of diagnostics to perform on the controller \r
- specified by ControllerHandle and ChildHandle. See \r
- "Related Definitions" for the list of supported types.\r
- Language - A pointer to a three character ISO 639-2 language \r
- identifier. This is the language in which the optional \r
- error message should be returned in Buffer, and it must \r
- match one of the languages specified in SupportedLanguages.\r
- The number of languages supported by a driver is up to \r
- the driver writer. \r
- ErrorType - A GUID that defines the format of the data returned in \r
- Buffer. \r
- BufferSize - The size, in bytes, of the data returned in Buffer. \r
- Buffer - A buffer that contains a Null-terminated Unicode string \r
- plus some additional data whose format is defined by \r
- ErrorType. Buffer is allocated by this function with \r
- AllocatePool(), and it is the caller's responsibility \r
- to free it with a call to FreePool(). \r
-\r
- Returns:\r
- EFI_SUCCESS - The controller specified by ControllerHandle and \r
- ChildHandle passed the diagnostic.\r
- EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.\r
- EFI_INVALID_PARAMETER - ChildHandle is not NULL and it is not a valid \r
- EFI_HANDLE.\r
- EFI_INVALID_PARAMETER - Language is NULL.\r
- EFI_INVALID_PARAMETER - ErrorType is NULL.\r
- EFI_INVALID_PARAMETER - BufferType is NULL.\r
- EFI_INVALID_PARAMETER - Buffer is NULL.\r
- EFI_UNSUPPORTED - The driver specified by This does not support \r
- running diagnostics for the controller specified \r
- by ControllerHandle and ChildHandle.\r
- EFI_UNSUPPORTED - The driver specified by This does not support the \r
- type of diagnostic specified by DiagnosticType.\r
- EFI_UNSUPPORTED - The driver specified by This does not support the \r
- language specified by Language.\r
- EFI_OUT_OF_RESOURCES - There are not enough resources available to complete\r
- the diagnostics.\r
- EFI_OUT_OF_RESOURCES - There are not enough resources available to return\r
- the status information in ErrorType, BufferSize, \r
- and Buffer.\r
- EFI_DEVICE_ERROR - The controller specified by ControllerHandle and \r
- ChildHandle did not pass the diagnostic.\r
-\r
---*/\r
-{\r
- EFI_STATUS Status;\r
- EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
- CHAR8 *SupportedLanguage;\r
-\r
- if (Language == NULL ||\r
- ErrorType == NULL ||\r
- Buffer == NULL ||\r
- ControllerHandle == NULL ||\r
- BufferSize == NULL) {\r
-\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- SupportedLanguage = This->SupportedLanguages;\r
-\r
- Status = EFI_UNSUPPORTED;\r
- while (*SupportedLanguage != 0) {\r
- if (AsciiStrnCmp (Language, SupportedLanguage, 3)) {\r
- Status = EFI_SUCCESS;\r
- break;\r
- }\r
-\r
- SupportedLanguage += 3;\r
- }\r
-\r
- if (EFI_ERROR (Status)) {\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- *ErrorType = NULL;\r
- *BufferSize = 0;\r
- if (DiagnosticType != EfiDriverDiagnosticTypeStandard) {\r
- *ErrorType = &gEfiBlockIoProtocolGuid;\r
- *BufferSize = 0x60;\r
- gBS->AllocatePool (EfiBootServicesData, (UINTN) (*BufferSize),\r
- (void *)Buffer);\r
- CopyMem (*Buffer, L"Unix Block I/O Driver Diagnostics Failed\n", *BufferSize);\r
- return EFI_DEVICE_ERROR;\r
- }\r
-\r
- //\r
- // Validate controller handle\r
- //\r
- Status = gBS->OpenProtocol (\r
- ControllerHandle,\r
- &gEfiUnixIoProtocolGuid,\r
- (void *)&BlockIo,\r
- gUnixBlockIoDriverBinding.DriverBindingHandle,\r
- ControllerHandle,\r
- EFI_OPEN_PROTOCOL_BY_DRIVER\r
- );\r
-\r
- if (!EFI_ERROR (Status)) {\r
- gBS->CloseProtocol (\r
- ControllerHandle,\r
- &gEfiUnixIoProtocolGuid,\r
- gUnixBlockIoDriverBinding.DriverBindingHandle,\r
- ControllerHandle\r
- );\r
-\r
- return EFI_UNSUPPORTED;\r
- }\r
-\r
- if (Status == EFI_UNSUPPORTED) {\r
- return Status;\r
- } else if (Status != EFI_ALREADY_STARTED) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- return EFI_SUCCESS;\r
-}\r