eol-style native
Modified: trunk/reactos/drivers/dd/serial/cleanup.c
Modified: trunk/reactos/drivers/dd/serial/close.c
Modified: trunk/reactos/drivers/dd/serial/create.c
Modified: trunk/reactos/drivers/dd/serial/devctrl.c
Modified: trunk/reactos/drivers/dd/serial/info.c
Modified: trunk/reactos/drivers/dd/serial/misc.c
Modified: trunk/reactos/drivers/dd/serial/pnp.c
Modified: trunk/reactos/drivers/dd/serial/power.c
Modified: trunk/reactos/drivers/dd/serial/rw.c
Modified: trunk/reactos/drivers/dd/serial/serial.h
_____
Modified: trunk/reactos/drivers/dd/serial/cleanup.c
--- trunk/reactos/drivers/dd/serial/cleanup.c 2005-03-14 23:44:13 UTC
(rev 14085)
+++ trunk/reactos/drivers/dd/serial/cleanup.c 2005-03-15 00:23:19 UTC
(rev 14086)
@@ -1,22 +1,22 @@
-/* $Id:
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/dd/serial/cleanup.c
- * PURPOSE: Serial IRP_MJ_CLEANUP operations
- *
- * PROGRAMMERS: HervÚ Poussineau (poussine(a)freesurf.fr)
- */
-
-#define NDEBUG
-#include "serial.h"
-
-NTSTATUS STDCALL
-SerialCleanup(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- DPRINT("Serial: IRP_MJ_CLEANUP\n");
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
-}
+/* $Id:
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: drivers/dd/serial/cleanup.c
+ * PURPOSE: Serial IRP_MJ_CLEANUP operations
+ *
+ * PROGRAMMERS: HervÚ Poussineau (poussine(a)freesurf.fr)
+ */
+
+#define NDEBUG
+#include "serial.h"
+
+NTSTATUS STDCALL
+SerialCleanup(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ DPRINT("Serial: IRP_MJ_CLEANUP\n");
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
Property changes on: trunk/reactos/drivers/dd/serial/cleanup.c
___________________________________________________________________
Name: svn:eol-style
+ native
_____
Modified: trunk/reactos/drivers/dd/serial/close.c
--- trunk/reactos/drivers/dd/serial/close.c 2005-03-14 23:44:13 UTC
(rev 14085)
+++ trunk/reactos/drivers/dd/serial/close.c 2005-03-15 00:23:19 UTC
(rev 14086)
@@ -1,22 +1,22 @@
-/* $Id:
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/dd/serial/close.c
- * PURPOSE: Serial IRP_MJ_CLOSE operations
- *
- * PROGRAMMERS: HervÚ Poussineau (poussine(a)freesurf.fr)
- */
-
-#define NDEBUG
-#include "serial.h"
-
-NTSTATUS STDCALL
-SerialClose(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- DPRINT("Serial: IRP_MJ_CLOSE\n");
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
-}
+/* $Id:
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: drivers/dd/serial/close.c
+ * PURPOSE: Serial IRP_MJ_CLOSE operations
+ *
+ * PROGRAMMERS: HervÚ Poussineau (poussine(a)freesurf.fr)
+ */
+
+#define NDEBUG
+#include "serial.h"
+
+NTSTATUS STDCALL
+SerialClose(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ DPRINT("Serial: IRP_MJ_CLOSE\n");
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return STATUS_SUCCESS;
+}
Property changes on: trunk/reactos/drivers/dd/serial/close.c
___________________________________________________________________
Name: svn:eol-style
+ native
_____
Modified: trunk/reactos/drivers/dd/serial/create.c
--- trunk/reactos/drivers/dd/serial/create.c 2005-03-14 23:44:13 UTC
(rev 14085)
+++ trunk/reactos/drivers/dd/serial/create.c 2005-03-15 00:23:19 UTC
(rev 14086)
@@ -1,52 +1,52 @@
-/* $Id:
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/dd/serial/create.c
- * PURPOSE: Serial IRP_MJ_CREATE operations
- *
- * PROGRAMMERS: HervÚ Poussineau (poussine(a)freesurf.fr)
- */
-
-#define NDEBUG
-#include "serial.h"
-
-NTSTATUS STDCALL
-SerialCreate(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION Stack;
- PFILE_OBJECT FileObject;
- PSERIAL_DEVICE_EXTENSION DeviceExtension;
- NTSTATUS Status;
-
- DPRINT("Serial: IRP_MJ_CREATE\n");
- Stack = IoGetCurrentIrpStackLocation(Irp);
- FileObject = Stack->FileObject;
- DeviceExtension =
(PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
-
- if (Stack->Parameters.Create.Options & FILE_DIRECTORY_FILE)
- {
- CHECKPOINT;
- Status = STATUS_NOT_A_DIRECTORY;
- goto ByeBye;
- }
-
- if (FileObject->FileName.Length != 0 ||
- FileObject->RelatedFileObject != NULL)
- {
- CHECKPOINT;
- Status = STATUS_ACCESS_DENIED;
- goto ByeBye;
- }
-
- DPRINT("Serial: open COM%lu: successfull\n",
DeviceExtension->ComPort);
- Status = STATUS_SUCCESS;
-
-ByeBye:
- Irp->IoStatus.Status = Status;
- Irp->IoStatus.Information = 0;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return Status;
-}
+/* $Id:
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: drivers/dd/serial/create.c
+ * PURPOSE: Serial IRP_MJ_CREATE operations
+ *
+ * PROGRAMMERS: HervÚ Poussineau (poussine(a)freesurf.fr)
+ */
+
+#define NDEBUG
+#include "serial.h"
+
+NTSTATUS STDCALL
+SerialCreate(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION Stack;
+ PFILE_OBJECT FileObject;
+ PSERIAL_DEVICE_EXTENSION DeviceExtension;
+ NTSTATUS Status;
+
+ DPRINT("Serial: IRP_MJ_CREATE\n");
+ Stack = IoGetCurrentIrpStackLocation(Irp);
+ FileObject = Stack->FileObject;
+ DeviceExtension =
(PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+
+ if (Stack->Parameters.Create.Options & FILE_DIRECTORY_FILE)
+ {
+ CHECKPOINT;
+ Status = STATUS_NOT_A_DIRECTORY;
+ goto ByeBye;
+ }
+
+ if (FileObject->FileName.Length != 0 ||
+ FileObject->RelatedFileObject != NULL)
+ {
+ CHECKPOINT;
+ Status = STATUS_ACCESS_DENIED;
+ goto ByeBye;
+ }
+
+ DPRINT("Serial: open COM%lu: successfull\n",
DeviceExtension->ComPort);
+ Status = STATUS_SUCCESS;
+
+ByeBye:
+ Irp->IoStatus.Status = Status;
+ Irp->IoStatus.Information = 0;
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+ return Status;
+}
Property changes on: trunk/reactos/drivers/dd/serial/create.c
___________________________________________________________________
Name: cleanup.c
+ close.c
Name: svn:eol-style
+ native
_____
Modified: trunk/reactos/drivers/dd/serial/devctrl.c
--- trunk/reactos/drivers/dd/serial/devctrl.c 2005-03-14 23:44:13 UTC
(rev 14085)
+++ trunk/reactos/drivers/dd/serial/devctrl.c 2005-03-15 00:23:19 UTC
(rev 14086)
@@ -1,551 +1,551 @@
-/* $Id:
- *
- * COPYRIGHT: See COPYING in the top level directory
- * PROJECT: ReactOS kernel
- * FILE: drivers/dd/serial/devctrl.c
- * PURPOSE: Serial IRP_MJ_DEVICE_CONTROL operations
- *
- * PROGRAMMERS: HervÚ Poussineau (poussine(a)freesurf.fr)
- */
-/* FIXME: call IoAcquireRemoveLock/IoReleaseRemoveLock around each I/O
operation */
-
-#define NDEBUG
-#include "serial.h"
-
-NTSTATUS STDCALL
-SerialSetBaudRate(
- IN PSERIAL_DEVICE_EXTENSION DeviceExtension,
- IN ULONG NewBaudRate)
-{
- USHORT divisor;
- PUCHAR ComPortBase = (PUCHAR)DeviceExtension->BaseAddress;
- NTSTATUS Status = STATUS_SUCCESS;
-
- if (NewBaudRate & SERIAL_BAUD_USER)
- {
- divisor = (USHORT)(BAUD_CLOCK / (CLOCKS_PER_BIT *
(NewBaudRate & ~SERIAL_BAUD_USER)));
- }
- else
- {
- switch (NewBaudRate)
- {
- case SERIAL_BAUD_075: divisor = 0x600; break;
- case SERIAL_BAUD_110: divisor = 0x400; break;
- case SERIAL_BAUD_134_5: divisor = 0x360; break;
- case SERIAL_BAUD_150: divisor = 0x300; break;
- case SERIAL_BAUD_300: divisor = 0x180; break;
- case SERIAL_BAUD_600: divisor = 0xc0; break;
- case SERIAL_BAUD_1200: divisor = 0x60; break;
- case SERIAL_BAUD_1800: divisor = 0x40; break;
- case SERIAL_BAUD_2400: divisor = 0x30; break;
- case SERIAL_BAUD_4800: divisor = 0x18; break;
- case SERIAL_BAUD_7200: divisor = 0x10; break;
- case SERIAL_BAUD_9600: divisor = 0xc; break;
- case SERIAL_BAUD_14400: divisor = 0x8; break;
- case SERIAL_BAUD_38400: divisor = 0x3; break;
- case SERIAL_BAUD_57600: divisor = 0x2; break;
- case SERIAL_BAUD_115200: divisor = 0x1; break;
- case SERIAL_BAUD_56K: divisor = 0x2; break;
- case SERIAL_BAUD_128K: divisor = 0x1; break;
- default: Status = STATUS_INVALID_PARAMETER;
- }
- }
-
- if (NT_SUCCESS(Status))
- {
- Status =
IoAcquireRemoveLock(&DeviceExtension->RemoveLock,
(PVOID)DeviceExtension->ComPort);
- if (NT_SUCCESS(Status))
- {
- UCHAR Lcr;
- DPRINT("Serial: SerialSetBaudRate(COM%lu, %lu
Bauds)\n", DeviceExtension->ComPort, BAUD_CLOCK / (CLOCKS_PER_BIT *
divisor));
- /* FIXME: update DeviceExtension->LowerDevice
when modifying LCR? */
- /* Set Bit 7 of LCR to expose baud registers */
- Lcr = READ_PORT_UCHAR(SER_LCR(ComPortBase));
- Lcr |= SR_LCR_DLAB;
- WRITE_PORT_UCHAR(SER_LCR(ComPortBase), Lcr);
- /* Write the baud rate */
- WRITE_PORT_UCHAR(SER_DLL(ComPortBase), divisor &
0xff);
- WRITE_PORT_UCHAR(SER_DLM(ComPortBase), divisor
> 8);
- /* Switch back to normal registers
*/
- Lcr ^= SR_LCR_DLAB;
- WRITE_PORT_UCHAR(SER_LCR(ComPortBase), Lcr);
-
-
IoReleaseRemoveLock(&DeviceExtension->RemoveLock,
(PVOID)DeviceExtension->ComPort);
- }
- }
-
- if (NT_SUCCESS(Status))
- DeviceExtension->BaudRate = NewBaudRate;
- return Status;
-}
-
-NTSTATUS STDCALL
-SerialSetLineControl(
- IN PSERIAL_DEVICE_EXTENSION DeviceExtension,
- IN PSERIAL_LINE_CONTROL NewSettings)
-{
- UCHAR Lcr = 0;
- NTSTATUS Status;
-
- DPRINT("Serial: SerialSetLineControl(COM%lu, Settings { %lu %lu
%lu })\n",
- DeviceExtension->ComPort, NewSettings->StopBits,
NewSettings->Parity, NewSettings->WordLength);
-
- /* Verify parameters */
- switch (NewSettings->WordLength)
- {
- case 5: Lcr |= SR_LCR_CS5; break;
- case 6: Lcr |= SR_LCR_CS6; break;
- case 7: Lcr |= SR_LCR_CS7; break;
- case 8: Lcr |= SR_LCR_CS8; break;
- default: return STATUS_INVALID_PARAMETER;
- }
-
- if (NewSettings->WordLength < 5 || NewSettings->WordLength > 8)
- return STATUS_INVALID_PARAMETER;
-
- switch (NewSettings->Parity)
- {
- case NO_PARITY: Lcr |= SR_LCR_PNO; break;
- case ODD_PARITY: Lcr |= SR_LCR_POD; break;
- case EVEN_PARITY: Lcr |= SR_LCR_PEV; break;
- case MARK_PARITY: Lcr |= SR_LCR_PMK; break;
- case SPACE_PARITY: Lcr |= SR_LCR_PSP; break;
- default: return STATUS_INVALID_PARAMETER;
- }
-
- switch (NewSettings->StopBits)
- {
- case STOP_BIT_1:
- Lcr |= SR_LCR_ST1;
- break;
- case STOP_BITS_1_5:
- if (NewSettings->WordLength != 5)
- return STATUS_INVALID_PARAMETER;
- Lcr |= SR_LCR_ST2;
- break;
- case STOP_BITS_2:
- if (NewSettings->WordLength < 6 ||
NewSettings->WordLength > 8)
- return STATUS_INVALID_PARAMETER;
- Lcr |= SR_LCR_ST2;
- break;
- default:
- return STATUS_INVALID_PARAMETER;
- }
-
- /* Update current parameters */
- Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock,
(PVOID)DeviceExtension->ComPort);
- if (!NT_SUCCESS(Status))
- return Status;
- WRITE_PORT_UCHAR(SER_LCR((PUCHAR)DeviceExtension->BaseAddress),
Lcr);
- IoReleaseRemoveLock(&DeviceExtension->RemoveLock,
(PVOID)DeviceExtension->ComPort);
-
- if (NT_SUCCESS(Status))
- DeviceExtension->SerialLineControl = *NewSettings;
-
- return Status;
-}
-
-NTSTATUS STDCALL
-SerialDeviceControl(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp)
-{
- PIO_STACK_LOCATION Stack;
- PSERIAL_DEVICE_EXTENSION DeviceExtension;
- ULONG LengthIn, LengthOut;
- ULONG Information = 0;
- PUCHAR Buffer;
- PUCHAR ComPortBase;
- NTSTATUS Status;
-
- DPRINT("Serial: IRP_MJ_DEVICE_CONTROL dispatch\n");
-
- /* FIXME: pend operation if possible */
-
- Stack = IoGetCurrentIrpStackLocation(Irp);
- LengthIn = Stack->Parameters.DeviceIoControl.InputBufferLength;
- LengthOut =
Stack->Parameters.DeviceIoControl.OutputBufferLength;
- Buffer = Irp->AssociatedIrp.SystemBuffer;
- DeviceExtension =
(PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
- ComPortBase = (PUCHAR)DeviceExtension->BaseAddress;
-
- /* FIXME: need to probe buffers */
- /* FIXME: see
http://www.osronline.com/ddkx/serial/serref_61bm.htm */
- switch (Stack->Parameters.DeviceIoControl.IoControlCode)
- {
- case IOCTL_SERIAL_CLEAR_STATS:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_CLEAR_STATS not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_CLR_DTR:
- {
- DPRINT("Serial: IOCTL_SERIAL_CLR_DTR\n");
- /* FIXME: If the handshake flow control of the
device is configured to
- * automatically use DTR, return
STATUS_INVALID_PARAMETER */
- DeviceExtension->MCR &= ~SR_MCR_DTR;
- WRITE_PORT_UCHAR(SER_MCR(ComPortBase),
DeviceExtension->MCR);
- Status = STATUS_SUCCESS;
- break;
- }
- case IOCTL_SERIAL_CLR_RTS:
- {
- DPRINT("Serial: IOCTL_SERIAL_CLR_RTS\n");
- /* FIXME: If the handshake flow control of the
device is configured to
- * automatically use RTS, return
STATUS_INVALID_PARAMETER */
- DeviceExtension->MCR &= ~SR_MCR_RTS;
- WRITE_PORT_UCHAR(SER_MCR(ComPortBase),
DeviceExtension->MCR);
- Status = STATUS_SUCCESS;
- break;
- }
- case IOCTL_SERIAL_CONFIG_SIZE:
- {
- /* Obsolete on Microsoft Windows 2000+ */
- PULONG pConfigSize;
- DPRINT("Serial: IOCTL_SERIAL_CONFIG_SIZE\n");
- if (LengthOut != sizeof(ULONG) || Buffer ==
NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- pConfigSize = (PULONG)Buffer;
- *pConfigSize = 0;
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_GET_BAUD_RATE:
- {
- DPRINT("Serial: IOCTL_SERIAL_GET_BAUD_RATE\n");
- if (LengthOut < sizeof(SERIAL_BAUD_RATE))
- Status = STATUS_BUFFER_TOO_SMALL;
- else if (Buffer == NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- ((PSERIAL_BAUD_RATE)Buffer)->BaudRate =
DeviceExtension->BaudRate;
- Information = sizeof(SERIAL_BAUD_RATE);
- Status = STATUS_SUCCESS;
- }
- }
- case IOCTL_SERIAL_GET_CHARS:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_GET_CHARS not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_GET_COMMSTATUS:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_GET_COMMSTATUS not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_GET_DTRRTS:
- {
- PULONG pDtrRts;
- DPRINT("Serial: IOCTL_SERIAL_GET_DTRRTS\n");
- if (LengthOut != sizeof(ULONG) || Buffer ==
NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- pDtrRts = (PULONG)Buffer;
- *pDtrRts = 0;
- if (DeviceExtension->MCR & SR_MCR_DTR)
- *pDtrRts |= SERIAL_DTR_STATE;
- if (DeviceExtension->MCR & SR_MCR_RTS)
- *pDtrRts |= SERIAL_RTS_STATE;
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_GET_HANDFLOW:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_GET_HANDFLOW not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_GET_LINE_CONTROL:
- {
- DPRINT("Serial:
IOCTL_SERIAL_GET_LINE_CONTROL\n");
- if (LengthOut < sizeof(SERIAL_LINE_CONTROL))
- Status = STATUS_BUFFER_TOO_SMALL;
- else if (Buffer == NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- *((PSERIAL_LINE_CONTROL)Buffer) =
DeviceExtension->SerialLineControl;
- Information =
sizeof(SERIAL_LINE_CONTROL);
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_GET_MODEM_CONTROL:
- {
- PULONG pMCR;
- DPRINT("Serial:
IOCTL_SERIAL_GET_MODEM_CONTROL\n");
- if (LengthOut != sizeof(ULONG) || Buffer ==
NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- pMCR = (PULONG)Buffer;
- *pMCR = DeviceExtension->MCR;
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_GET_MODEMSTATUS:
- {
- PULONG pMSR;
- DPRINT("Serial:
IOCTL_SERIAL_GET_MODEMSTATUS\n");
- if (LengthOut != sizeof(ULONG) || Buffer ==
NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- pMSR = (PULONG)Buffer;
- *pMSR = DeviceExtension->MSR;
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_GET_PROPERTIES:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_GET_PROPERTIES not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_GET_STATS:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_GET_STATS not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_GET_TIMEOUTS:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_GET_TIMEOUTS not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_GET_WAIT_MASK:
- {
- PULONG pWaitMask;
- DPRINT("Serial: IOCTL_SERIAL_GET_WAIT_MASK\n");
- if (LengthOut != sizeof(ULONG) || Buffer ==
NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- pWaitMask = (PULONG)Buffer;
- *pWaitMask = DeviceExtension->WaitMask;
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_IMMEDIATE_CHAR:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_IMMEDIATE_CHAR not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_LSRMST_INSERT:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_LSRMST_INSERT not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_PURGE:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_PURGE not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_RESET_DEVICE:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_RESET_DEVICE not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_SET_BAUD_RATE:
- {
- PULONG pNewBaudRate;
- DPRINT("Serial: IOCTL_SERIAL_SET_BAUD_RATE\n");
- if (LengthIn != sizeof(ULONG) || Buffer == NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- pNewBaudRate = (PULONG)Buffer;
- Status =
SerialSetBaudRate(DeviceExtension, *pNewBaudRate);
- }
- break;
- }
- case IOCTL_SERIAL_SET_BREAK_OFF:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_SET_BREAK_OFF not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_SET_BREAK_ON:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_SET_BREAK_ON not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_SET_CHARS:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_SET_CHARS not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_SET_DTR:
- {
- /* FIXME: If the handshake flow control of the
device is configured to
- * automatically use DTR, return
STATUS_INVALID_PARAMETER */
- DPRINT("Serial: IOCTL_SERIAL_SET_DTR\n");
- if (!(DeviceExtension->MCR & SR_MCR_DTR))
- {
- DeviceExtension->MCR |= SR_MCR_DTR;
- WRITE_PORT_UCHAR(SER_MCR(ComPortBase),
DeviceExtension->MCR);
- }
- Status = STATUS_SUCCESS;
- break;
- }
- case IOCTL_SERIAL_SET_FIFO_CONTROL:
- {
- DPRINT("Serial:
IOCTL_SERIAL_SET_FIFO_CONTROL\n");
- if (LengthIn != sizeof(ULONG) || Buffer == NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- WRITE_PORT_UCHAR(SER_FCR(ComPortBase),
(UCHAR)((*(PULONG)Buffer) & 0xff));
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_SET_HANDFLOW:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_SET_HANDFLOW not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_SET_LINE_CONTROL:
- {
- DPRINT("Serial:
IOCTL_SERIAL_SET_LINE_CONTROL\n");
- if (LengthIn < sizeof(SERIAL_LINE_CONTROL))
- Status = STATUS_BUFFER_TOO_SMALL;
- else if (Buffer == NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- Status =
SerialSetLineControl(DeviceExtension, (PSERIAL_LINE_CONTROL)Buffer);
- break;
- }
- case IOCTL_SERIAL_SET_MODEM_CONTROL:
- {
- PULONG pMCR;
- DPRINT("Serial:
IOCTL_SERIAL_SET_MODEM_CONTROL\n");
- if (LengthIn != sizeof(ULONG) || Buffer == NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- pMCR = (PULONG)Buffer;
- DeviceExtension->MCR = (UCHAR)(*pMCR &
0xff);
- WRITE_PORT_UCHAR(SER_MCR(ComPortBase),
DeviceExtension->MCR);
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_SET_QUEUE_SIZE:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_SET_QUEUE_SIZE not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_SET_RTS:
- {
- /* FIXME: If the handshake flow control of the
device is configured to
- * automatically use DTR, return
STATUS_INVALID_PARAMETER */
- DPRINT("Serial: IOCTL_SERIAL_SET_RTS\n");
- if (!(DeviceExtension->MCR & SR_MCR_RTS))
- {
- DeviceExtension->MCR |= SR_MCR_RTS;
- WRITE_PORT_UCHAR(SER_MCR(ComPortBase),
DeviceExtension->MCR);
- }
- Status = STATUS_SUCCESS;
- break;
- }
- case IOCTL_SERIAL_SET_TIMEOUTS:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_SET_TIMEOUTS not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_SET_WAIT_MASK:
- {
- PULONG pWaitMask;
- DPRINT("Serial: IOCTL_SERIAL_SET_WAIT_MASK\n");
- if (LengthIn != sizeof(ULONG) || Buffer == NULL)
- Status = STATUS_INVALID_PARAMETER;
- else
- {
- pWaitMask = (PULONG)Buffer;
- DeviceExtension->WaitMask = *pWaitMask;
- Status = STATUS_SUCCESS;
- }
- break;
- }
- case IOCTL_SERIAL_SET_XOFF:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_SET_XOFF not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_SET_XON:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_SET_XON not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_WAIT_ON_MASK:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_WAIT_ON_MASK not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- case IOCTL_SERIAL_XOFF_COUNTER:
- {
- /* FIXME */
- DPRINT1("Serial: IOCTL_SERIAL_XOFF_COUNTER not
implemented.\n");
- Status = STATUS_NOT_IMPLEMENTED;
- break;
- }
- default:
- {
- /* Pass Irp to lower driver */
- DPRINT("Serial: Unknown IOCTL code 0x%x\n",
Stack->Parameters.DeviceIoControl.IoControlCode);
- IoSkipCurrentIrpStackLocation(Irp);
- return
IoCallDriver(DeviceExtension->LowerDevice, Irp);
- }
- }
-
- Irp->IoStatus.Information = Information;
- Irp->IoStatus.Status = Status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
- return Status;
-}
+/* $Id:
+ *
+ * COPYRIGHT: See COPYING in the top level directory
+ * PROJECT: ReactOS kernel
+ * FILE: drivers/dd/serial/devctrl.c
+ * PURPOSE: Serial IRP_MJ_DEVICE_CONTROL operations
+ *
+ * PROGRAMMERS: HervÚ Poussineau (poussine(a)freesurf.fr)
+ */
+/* FIXME: call IoAcquireRemoveLock/IoReleaseRemoveLock around each I/O
operation */
+
+#define NDEBUG
+#include "serial.h"
+
+NTSTATUS STDCALL
+SerialSetBaudRate(
+ IN PSERIAL_DEVICE_EXTENSION DeviceExtension,
+ IN ULONG NewBaudRate)
+{
+ USHORT divisor;
+ PUCHAR ComPortBase = (PUCHAR)DeviceExtension->BaseAddress;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ if (NewBaudRate & SERIAL_BAUD_USER)
+ {
+ divisor = (USHORT)(BAUD_CLOCK / (CLOCKS_PER_BIT *
(NewBaudRate & ~SERIAL_BAUD_USER)));
+ }
+ else
+ {
+ switch (NewBaudRate)
+ {
+ case SERIAL_BAUD_075: divisor = 0x600; break;
+ case SERIAL_BAUD_110: divisor = 0x400; break;
+ case SERIAL_BAUD_134_5: divisor = 0x360; break;
+ case SERIAL_BAUD_150: divisor = 0x300; break;
+ case SERIAL_BAUD_300: divisor = 0x180; break;
+ case SERIAL_BAUD_600: divisor = 0xc0; break;
+ case SERIAL_BAUD_1200: divisor = 0x60; break;
+ case SERIAL_BAUD_1800: divisor = 0x40; break;
+ case SERIAL_BAUD_2400: divisor = 0x30; break;
+ case SERIAL_BAUD_4800: divisor = 0x18; break;
+ case SERIAL_BAUD_7200: divisor = 0x10; break;
+ case SERIAL_BAUD_9600: divisor = 0xc; break;
+ case SERIAL_BAUD_14400: divisor = 0x8; break;
+ case SERIAL_BAUD_38400: divisor = 0x3; break;
+ case SERIAL_BAUD_57600: divisor = 0x2; break;
+ case SERIAL_BAUD_115200: divisor = 0x1; break;
+ case SERIAL_BAUD_56K: divisor = 0x2; break;
+ case SERIAL_BAUD_128K: divisor = 0x1; break;
+ default: Status = STATUS_INVALID_PARAMETER;
+ }
+ }
+
+ if (NT_SUCCESS(Status))
+ {
+ Status =
IoAcquireRemoveLock(&DeviceExtension->RemoveLock,
(PVOID)DeviceExtension->ComPort);
+ if (NT_SUCCESS(Status))
+ {
+ UCHAR Lcr;
+ DPRINT("Serial: SerialSetBaudRate(COM%lu, %lu
Bauds)\n", DeviceExtension->ComPort, BAUD_CLOCK / (CLOCKS_PER_BIT *
divisor));
+ /* FIXME: update DeviceExtension->LowerDevice
when modifying LCR? */
+ /* Set Bit 7 of LCR to expose baud registers */
+ Lcr = READ_PORT_UCHAR(SER_LCR(ComPortBase));
+ Lcr |= SR_LCR_DLAB;
+ WRITE_PORT_UCHAR(SER_LCR(ComPortBase), Lcr);
+ /* Write the baud rate */
+ WRITE_PORT_UCHAR(SER_DLL(ComPortBase), divisor &
0xff);
+ WRITE_PORT_UCHAR(SER_DLM(ComPortBase), divisor
> 8);
+ /* Switch back to normal registers
*/
+ Lcr ^= SR_LCR_DLAB;
+ WRITE_PORT_UCHAR(SER_LCR(ComPortBase), Lcr);
+
+
IoReleaseRemoveLock(&DeviceExtension->RemoveLock,
(PVOID)DeviceExtension->ComPort);
+ }
+ }
+
+ if (NT_SUCCESS(Status))
+ DeviceExtension->BaudRate = NewBaudRate;
+ return Status;
+}
+
+NTSTATUS STDCALL
+SerialSetLineControl(
+ IN PSERIAL_DEVICE_EXTENSION DeviceExtension,
+ IN PSERIAL_LINE_CONTROL NewSettings)
+{
+ UCHAR Lcr = 0;
+ NTSTATUS Status;
+
+ DPRINT("Serial: SerialSetLineControl(COM%lu, Settings { %lu %lu
%lu })\n",
+ DeviceExtension->ComPort, NewSettings->StopBits,
NewSettings->Parity, NewSettings->WordLength);
+
+ /* Verify parameters */
+ switch (NewSettings->WordLength)
+ {
+ case 5: Lcr |= SR_LCR_CS5; break;
+ case 6: Lcr |= SR_LCR_CS6; break;
+ case 7: Lcr |= SR_LCR_CS7; break;
+ case 8: Lcr |= SR_LCR_CS8; break;
+ default: return STATUS_INVALID_PARAMETER;
+ }
+
+ if (NewSettings->WordLength < 5 || NewSettings->WordLength > 8)
+ return STATUS_INVALID_PARAMETER;
+
+ switch (NewSettings->Parity)
+ {
+ case NO_PARITY: Lcr |= SR_LCR_PNO; break;
+ case ODD_PARITY: Lcr |= SR_LCR_POD; break;
+ case EVEN_PARITY: Lcr |= SR_LCR_PEV; break;
+ case MARK_PARITY: Lcr |= SR_LCR_PMK; break;
+ case SPACE_PARITY: Lcr |= SR_LCR_PSP; break;
+ default: return STATUS_INVALID_PARAMETER;
+ }
+
+ switch (NewSettings->StopBits)
+ {
+ case STOP_BIT_1:
+ Lcr |= SR_LCR_ST1;
+ break;
+ case STOP_BITS_1_5:
+ if (NewSettings->WordLength != 5)
+ return STATUS_INVALID_PARAMETER;
+ Lcr |= SR_LCR_ST2;
+ break;
+ case STOP_BITS_2:
+ if (NewSettings->WordLength < 6 ||
NewSettings->WordLength > 8)
+ return STATUS_INVALID_PARAMETER;
+ Lcr |= SR_LCR_ST2;
+ break;
+ default:
+ return STATUS_INVALID_PARAMETER;
+ }
+
+ /* Update current parameters */
+ Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock,
(PVOID)DeviceExtension->ComPort);
+ if (!NT_SUCCESS(Status))
+ return Status;
+ WRITE_PORT_UCHAR(SER_LCR((PUCHAR)DeviceExtension->BaseAddress),
Lcr);
+ IoReleaseRemoveLock(&DeviceExtension->RemoveLock,
(PVOID)DeviceExtension->ComPort);
+
+ if (NT_SUCCESS(Status))
+ DeviceExtension->SerialLineControl = *NewSettings;
+
+ return Status;
+}
+
+NTSTATUS STDCALL
+SerialDeviceControl(
+ IN PDEVICE_OBJECT DeviceObject,
+ IN PIRP Irp)
+{
+ PIO_STACK_LOCATION Stack;
+ PSERIAL_DEVICE_EXTENSION DeviceExtension;
+ ULONG LengthIn, LengthOut;
+ ULONG Information = 0;
+ PUCHAR Buffer;
+ PUCHAR ComPortBase;
+ NTSTATUS Status;
+
+ DPRINT("Serial: IRP_MJ_DEVICE_CONTROL dispatch\n");
+
+ /* FIXME: pend operation if possible */
+
+ Stack = IoGetCurrentIrpStackLocation(Irp);
+ LengthIn = Stack->Parameters.DeviceIoControl.InputBufferLength;
+ LengthOut =
Stack->Parameters.DeviceIoControl.OutputBufferLength;
+ Buffer = Irp->AssociatedIrp.SystemBuffer;
+ DeviceExtension =
(PSERIAL_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
+ ComPortBase = (PUCHAR)DeviceExtension->BaseAddress;
+
+ /* FIXME: need to probe buffers */
+ /* FIXME: see
http://www.osronline.com/ddkx/serial/serref_61bm.htm */
+ switch (Stack->Parameters.DeviceIoControl.IoControlCode)
+ {
+ case IOCTL_SERIAL_CLEAR_STATS:
+ {
+ /* FIXME */
+ DPRINT1("Serial: IOCTL_SERIAL_CLEAR_STATS not
implemented.\n");
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
+ }
+ case IOCTL_SERIAL_CLR_DTR:
+ {
+ DPRINT("Serial: IOCTL_SERIAL_CLR_DTR\n");
+ /* FIXME: If the handshake flow control of the
device is configured to
+ * automatically use DTR, return
STATUS_INVALID_PARAMETER */
+ DeviceExtension->MCR &= ~SR_MCR_DTR;
+ WRITE_PORT_UCHAR(SER_MCR(ComPortBase),
DeviceExtension->MCR);
+ Status = STATUS_SUCCESS;
+ break;
+ }
+ case IOCTL_SERIAL_CLR_RTS:
+ {
+ DPRINT("Serial: IOCTL_SERIAL_CLR_RTS\n");
+ /* FIXME: If the handshake flow control of the
device is configured to
+ * automatically use RTS, return
STATUS_INVALID_PARAMETER */
+ DeviceExtension->MCR &= ~SR_MCR_RTS;
+ WRITE_PORT_UCHAR(SER_MCR(ComPortBase),
DeviceExtension->MCR);
+ Status = STATUS_SUCCESS;
+ break;
+ }
+ case IOCTL_SERIAL_CONFIG_SIZE:
+ {
+ /* Obsolete on Microsoft Windows 2000+ */
+ PULONG pConfigSize;
+ DPRINT("Serial: IOCTL_SERIAL_CONFIG_SIZE\n");
+ if (LengthOut != sizeof(ULONG) || Buffer ==
NULL)
+ Status = STATUS_INVALID_PARAMETER;
+ else
+ {
+ pConfigSize = (PULONG)Buffer;
+ *pConfigSize = 0;
+ Status = STATUS_SUCCESS;
+ }
+ break;
+ }
+ case IOCTL_SERIAL_GET_BAUD_RATE:
+ {
+ DPRINT("Serial: IOCTL_SERIAL_GET_BAUD_RATE\n");
+ if (LengthOut < sizeof(SERIAL_BAUD_RATE))
+ Status = STATUS_BUFFER_TOO_SMALL;
+ else if (Buffer == NULL)
[truncated at 1000 lines; 2116 more skipped]