]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/WinNtSerialIoDxe/WinNtSerialIo.c
sync comments, fix function header, rename variable name to follow coding style.
[mirror_edk2.git] / Nt32Pkg / WinNtSerialIoDxe / WinNtSerialIo.c
index 85001404e03f57cf8c7cdddb2663c00b09ab603b..e12f14dc29af78bf4a0f443e51a38042a136821d 100644 (file)
@@ -1,4 +1,4 @@
-/*++\r
+/**@file\r
 \r
 Copyright (c) 2006 - 2007, Intel Corporation\r
 All rights reserved. This program and the accompanying materials\r
@@ -43,32 +43,7 @@ Abstract:
   If Handle(1) contains a gEfiWinNtSerialPortGuid protocol then the driver is\r
   loaded on the device.\r
 \r
---*/\r
-\r
-//\r
-// The package level header files this module uses\r
-//\r
-#include <Uefi.h>\r
-#include <WinNtDxe.h>\r
-//\r
-// The protocols, PPI and GUID defintions for this module\r
-//\r
-#include <Protocol/WinNtIo.h>\r
-#include <Protocol/ComponentName.h>\r
-#include <Protocol/SerialIo.h>\r
-#include <Protocol/DriverBinding.h>\r
-#include <Protocol/DevicePath.h>\r
-//\r
-// The Library classes this module consumes\r
-//\r
-#include <Library/DebugLib.h>\r
-#include <Library/BaseLib.h>\r
-#include <Library/UefiDriverEntryPoint.h>\r
-#include <Library/UefiLib.h>\r
-#include <Library/BaseMemoryLib.h>\r
-#include <Library/UefiBootServicesTableLib.h>\r
-#include <Library/DevicePathLib.h>\r
-#include <Library/MemoryAllocationLib.h>\r
+**/\r
 \r
 #include "WinNtSerialIo.h"\r
 \r
@@ -81,6 +56,11 @@ EFI_DRIVER_BINDING_PROTOCOL gWinNtSerialIoDriverBinding = {
   NULL\r
 };\r
 \r
+//\r
+// List of supported baud rate\r
+//\r
+UINT64 mBaudRateCurrentSupport[] = {50, 75, 110, 134, 150, 300, 600, 1200, 1800, 2000, 2400, 3600, 4800, 7200, 9600, 19200, 38400, 57600, 115200, SERIAL_PORT_MAX_BAUD_RATE + 1};\r
+\r
 /**\r
   The user Entry Point for module WinNtSerialIo. The user code starts with this function.\r
 \r
@@ -103,14 +83,13 @@ InitializeWinNtSerialIo(
   //\r
   // Install driver model protocol(s).\r
   //\r
-  Status = EfiLibInstallAllDriverProtocols (\r
+  Status = EfiLibInstallDriverBindingComponentName2 (\r
              ImageHandle,\r
              SystemTable,\r
              &gWinNtSerialIoDriverBinding,\r
              ImageHandle,\r
              &gWinNtSerialIoComponentName,\r
-             NULL,\r
-             NULL\r
+             &gWinNtSerialIoComponentName2\r
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
@@ -118,7 +97,6 @@ InitializeWinNtSerialIo(
   return Status;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoDriverBindingSupported (\r
@@ -154,7 +132,7 @@ Returns:
   Status = gBS->OpenProtocol (\r
                   Handle,\r
                   &gEfiDevicePathProtocolGuid,\r
-                  &ParentDevicePath,\r
+                  (VOID **) &ParentDevicePath,\r
                   This->DriverBindingHandle,\r
                   Handle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -177,7 +155,7 @@ Returns:
   Status = gBS->OpenProtocol (\r
                   Handle,\r
                   &gEfiWinNtIoProtocolGuid,\r
-                  &WinNtIo,\r
+                  (VOID **) &WinNtIo,\r
                   This->DriverBindingHandle,\r
                   Handle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -249,7 +227,6 @@ Error:
   return Status;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoDriverBindingStart (\r
@@ -294,7 +271,7 @@ Returns:
   Status = gBS->OpenProtocol (\r
                   Handle,\r
                   &gEfiDevicePathProtocolGuid,\r
-                  &ParentDevicePath,\r
+                  (VOID **) &ParentDevicePath,\r
                   This->DriverBindingHandle,\r
                   Handle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -309,7 +286,7 @@ Returns:
   Status = gBS->OpenProtocol (\r
                   Handle,\r
                   &gEfiWinNtIoProtocolGuid,\r
-                  &WinNtIo,\r
+                  (VOID **) &WinNtIo,\r
                   This->DriverBindingHandle,\r
                   Handle,\r
                   EFI_OPEN_PROTOCOL_BY_DRIVER\r
@@ -350,7 +327,7 @@ Returns:
         Status = gBS->OpenProtocol (\r
                         OpenInfoBuffer[Index].ControllerHandle,\r
                         &gEfiSerialIoProtocolGuid,\r
-                        &SerialIo,\r
+                        (VOID **) &SerialIo,\r
                         This->DriverBindingHandle,\r
                         Handle,\r
                         EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -419,12 +396,21 @@ Returns:
   Private->Fifo.Last              = 0;\r
   Private->Fifo.Surplus           = SERIAL_MAX_BUFFER_SIZE;\r
 \r
-  AddUnicodeString (\r
+  AddUnicodeString2 (\r
     "eng",\r
     gWinNtSerialIoComponentName.SupportedLanguages,\r
     &Private->ControllerNameTable,\r
-    WinNtIo->EnvString\r
+    WinNtIo->EnvString,\r
+    TRUE\r
     );\r
+  AddUnicodeString2 (\r
+    "en",\r
+    gWinNtSerialIoComponentName2.SupportedLanguages,\r
+    &Private->ControllerNameTable,\r
+    WinNtIo->EnvString,\r
+    FALSE\r
+    );\r
+\r
 \r
   Private->SerialIo.Revision      = SERIAL_IO_INTERFACE_REVISION;\r
   Private->SerialIo.Reset         = WinNtSerialIoReset;\r
@@ -508,7 +494,7 @@ Returns:
   Status = gBS->OpenProtocol (\r
                   Handle,\r
                   &gEfiWinNtIoProtocolGuid,\r
-                  &WinNtIo,\r
+                  (VOID **) &WinNtIo,\r
                   This->DriverBindingHandle,\r
                   Private->Handle,\r
                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
@@ -546,7 +532,6 @@ Error:
   return Status;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoDriverBindingStop (\r
@@ -612,7 +597,7 @@ Returns:
     Status = gBS->OpenProtocol (\r
                     ChildHandleBuffer[Index],\r
                     &gEfiSerialIoProtocolGuid,\r
-                    &SerialIo,\r
+                    (VOID **) &SerialIo,\r
                     This->DriverBindingHandle,\r
                     Handle,\r
                     EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
@@ -674,7 +659,6 @@ Returns:
 // Serial IO Protocol member functions\r
 //\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoReset (\r
@@ -721,7 +705,6 @@ Returns:
                 );\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoSetAttributes (\r
@@ -764,6 +747,7 @@ Returns:
 // TODO:    EFI_SUCCESS - add return value to function comment\r
 {\r
   EFI_STATUS                    Status;\r
+  UINTN                         Index;  \r
   WIN_NT_SERIAL_IO_PRIVATE_DATA *Private;\r
   COMMTIMEOUTS                  PortTimeOuts;\r
   DWORD                         ConvertedTime;\r
@@ -771,8 +755,6 @@ Returns:
   EFI_DEVICE_PATH_PROTOCOL      *NewDevicePath;\r
   EFI_TPL                       Tpl;\r
 \r
-  Tpl     = gBS->RaiseTPL (TPL_NOTIFY);\r
-\r
   Private = WIN_NT_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   //\r
@@ -780,7 +762,7 @@ Returns:
   //   we must set the default values if a null argument is passed in.\r
   //\r
   if (BaudRate == 0) {\r
-    BaudRate = SERIAL_BAUD_DEFAULT;\r
+    BaudRate = FixedPcdGet64 (PcdUartDefaultBaudRate);\r
   }\r
 \r
   if (ReceiveFifoDepth == 0) {\r
@@ -792,16 +774,66 @@ Returns:
   }\r
 \r
   if (Parity == DefaultParity) {\r
-    Parity = NoParity;\r
+    Parity = FixedPcdGet8 (PcdUartDefaultParity);\r
   }\r
 \r
   if (DataBits == 0) {\r
-    DataBits = SERIAL_DATABITS_DEFAULT;\r
+    DataBits = FixedPcdGet8 (PcdUartDefaultDataBits);\r
   }\r
 \r
   if (StopBits == DefaultStopBits) {\r
-    StopBits = OneStopBit;\r
+    StopBits = (EFI_STOP_BITS_TYPE) FixedPcdGet8 (PcdUartDefaultStopBits);\r
+  }\r
+\r
+  //\r
+  // Make sure all parameters are valid\r
+  //\r
+  if ((BaudRate > SERIAL_PORT_MAX_BAUD_RATE) || (BaudRate < SERIAL_PORT_MIN_BAUD_RATE)) {\r
+    return EFI_INVALID_PARAMETER;\r
   }\r
+\r
+  //\r
+  //The lower baud rate supported by the serial device will be selected without exceeding the unsupported BaudRate parameter\r
+  // \r
+  \r
+  for (Index = 1; Index < (sizeof (mBaudRateCurrentSupport) / sizeof (mBaudRateCurrentSupport[0])); Index++) {\r
+    if (BaudRate < mBaudRateCurrentSupport[Index]) {\r
+      BaudRate = mBaudRateCurrentSupport[Index-1];\r
+      break;\r
+      }\r
+  }\r
+       \r
+  if ((ReceiveFifoDepth < 1) || (ReceiveFifoDepth > SERIAL_PORT_MAX_RECEIVE_FIFO_DEPTH)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((Timeout < SERIAL_PORT_MIN_TIMEOUT) || (Timeout > SERIAL_PORT_MAX_TIMEOUT)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((Parity < NoParity) || (Parity > SpaceParity)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  if ((StopBits < OneStopBit) || (StopBits > TwoStopBits)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+\r
+  //\r
+  // Now we only support DataBits=7,8.\r
+  //\r
+  if ((DataBits < 7) || (DataBits > 8)) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }\r
+  \r
+  //\r
+  // Now we only support DataBits=7,8.\r
+  // for DataBits = 6,7,8, StopBits can not set OneFiveStopBits.\r
+  //\r
+  if (StopBits == OneFiveStopBits) {\r
+    return EFI_INVALID_PARAMETER;\r
+  }  \r
+  \r
   //\r
   // See if the new attributes already match the current attributes\r
   //\r
@@ -811,10 +843,11 @@ Returns:
       Private->UartDevicePath.StopBits       == StopBits         &&\r
       Private->SerialIoMode.ReceiveFifoDepth == ReceiveFifoDepth &&\r
       Private->SerialIoMode.Timeout          == Timeout             ) {\r
-    gBS->RestoreTPL(Tpl);\r
     return EFI_SUCCESS;\r
   }\r
 \r
+  Tpl     = gBS->RaiseTPL (TPL_NOTIFY);\r
+\r
   //\r
   //  Get current values from NT\r
   //\r
@@ -937,7 +970,6 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoSetControl (\r
@@ -968,6 +1000,15 @@ Returns:
   DCB                           Dcb;\r
   EFI_TPL                       Tpl;\r
 \r
+  //\r
+  // first determine the parameter is invalid\r
+  //\r
+  if (Control & (~(EFI_SERIAL_REQUEST_TO_SEND | EFI_SERIAL_DATA_TERMINAL_READY |\r
+                   EFI_SERIAL_HARDWARE_LOOPBACK_ENABLE | EFI_SERIAL_SOFTWARE_LOOPBACK_ENABLE | \r
+                   EFI_SERIAL_HARDWARE_FLOW_CONTROL_ENABLE))) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
   Tpl     = gBS->RaiseTPL (TPL_NOTIFY);\r
 \r
   Private = WIN_NT_SERIAL_IO_PRIVATE_DATA_FROM_THIS (This);\r
@@ -1024,7 +1065,6 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoGetControl (\r
@@ -1139,7 +1179,6 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoWrite (\r
@@ -1243,7 +1282,6 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoRead (\r