]> git.proxmox.com Git - mirror_edk2.git/blobdiff - Nt32Pkg/WinNtSerialIoDxe/WinNtSerialIo.c
Use #ifdef but not #if for compiler macros.
[mirror_edk2.git] / Nt32Pkg / WinNtSerialIoDxe / WinNtSerialIo.c
index 44bbf5765cd8f6aa5182a81bfb3c9848456b535e..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,7 +43,7 @@ Abstract:
   If Handle(1) contains a gEfiWinNtSerialPortGuid protocol then the driver is\r
   loaded on the device.\r
 \r
---*/\r
+**/\r
 \r
 #include "WinNtSerialIo.h"\r
 \r
@@ -56,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
@@ -78,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
@@ -93,7 +97,6 @@ InitializeWinNtSerialIo(
   return Status;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoDriverBindingSupported (\r
@@ -129,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
@@ -152,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
@@ -224,7 +227,6 @@ Error:
   return Status;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoDriverBindingStart (\r
@@ -269,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
@@ -284,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
@@ -325,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
@@ -394,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
@@ -483,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
@@ -521,7 +532,6 @@ Error:
   return Status;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoDriverBindingStop (\r
@@ -587,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
@@ -649,7 +659,6 @@ Returns:
 // Serial IO Protocol member functions\r
 //\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoReset (\r
@@ -696,7 +705,6 @@ Returns:
                 );\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoSetAttributes (\r
@@ -739,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
@@ -746,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
@@ -777,6 +784,56 @@ Returns:
   if (StopBits == DefaultStopBits) {\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
@@ -786,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
@@ -912,7 +970,6 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoSetControl (\r
@@ -943,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
@@ -999,7 +1065,6 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoGetControl (\r
@@ -1114,7 +1179,6 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoWrite (\r
@@ -1218,7 +1282,6 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 EFIAPI\r
 WinNtSerialIoRead (\r