-/*++\r
+/**@file\r
\r
Copyright (c) 2006 - 2007, Intel Corporation\r
All rights reserved. This program and the accompanying materials\r
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
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
//\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
return Status;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoDriverBindingSupported (\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiDevicePathProtocolGuid,\r
- &ParentDevicePath,\r
+ (VOID **) &ParentDevicePath,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiWinNtIoProtocolGuid,\r
- &WinNtIo,\r
+ (VOID **) &WinNtIo,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
return Status;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoDriverBindingStart (\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiDevicePathProtocolGuid,\r
- &ParentDevicePath,\r
+ (VOID **) &ParentDevicePath,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
Status = gBS->OpenProtocol (\r
Handle,\r
&gEfiWinNtIoProtocolGuid,\r
- &WinNtIo,\r
+ (VOID **) &WinNtIo,\r
This->DriverBindingHandle,\r
Handle,\r
EFI_OPEN_PROTOCOL_BY_DRIVER\r
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
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
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
return Status;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoDriverBindingStop (\r
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
// Serial IO Protocol member functions\r
//\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoReset (\r
);\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoSetAttributes (\r
// 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
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
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
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
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoSetControl (\r
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
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoGetControl (\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoWrite (\r
return EFI_SUCCESS;\r
}\r
\r
-STATIC\r
EFI_STATUS\r
EFIAPI\r
WinNtSerialIoRead (\r