2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: Parallel Port Function Driver
4 * FILE: drivers/parallel/parport/pdo.c
5 * PURPOSE: PDO functions
10 /* FUNCTIONS ****************************************************************/
14 PdoCreate(IN PDEVICE_OBJECT DeviceObject
,
17 PPDO_DEVICE_EXTENSION DeviceExtension
;
18 PIO_STACK_LOCATION Stack
;
19 NTSTATUS Status
= STATUS_SUCCESS
;
21 DPRINT("PdoCreate()\n");
23 Stack
= IoGetCurrentIrpStackLocation(Irp
);
24 DeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
26 if (Stack
->Parameters
.Create
.Options
& FILE_DIRECTORY_FILE
)
28 DPRINT1("Not a directory\n");
29 Status
= STATUS_NOT_A_DIRECTORY
;
33 DPRINT("Open LPT%lu: successful\n", DeviceExtension
->LptPort
);
34 DeviceExtension
->OpenCount
++;
37 Irp
->IoStatus
.Status
= Status
;
38 Irp
->IoStatus
.Information
= 0;
39 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
47 PdoClose(IN PDEVICE_OBJECT DeviceObject
,
50 PPDO_DEVICE_EXTENSION pDeviceExtension
;
52 DPRINT("PdoClose()\n");
54 pDeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
55 pDeviceExtension
->OpenCount
--;
57 Irp
->IoStatus
.Information
= 0;
58 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
59 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
61 return STATUS_SUCCESS
;
67 PdoCleanup(IN PDEVICE_OBJECT DeviceObject
,
70 DPRINT("PdoCleanup()\n");
72 Irp
->IoStatus
.Information
= 0;
73 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
74 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
75 return STATUS_SUCCESS
;
81 PdoRead(IN PDEVICE_OBJECT DeviceObject
,
84 DPRINT("PdoRead()\n");
86 Irp
->IoStatus
.Information
= 0;
87 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
88 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
89 return STATUS_SUCCESS
;
95 PdoWrite(IN PDEVICE_OBJECT DeviceObject
,
98 PPDO_DEVICE_EXTENSION PdoDeviceExtension
;
99 PFDO_DEVICE_EXTENSION FdoDeviceExtension
;
100 PIO_STACK_LOCATION IoStack
;
106 DPRINT("PdoWrite()\n");
108 PdoDeviceExtension
= (PPDO_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
;
109 FdoDeviceExtension
= (PFDO_DEVICE_EXTENSION
)PdoDeviceExtension
->AttachedFdo
->DeviceExtension
;
111 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
113 Buffer
= GetUserBuffer(Irp
);
114 DPRINT("Length: %lu\n", IoStack
->Parameters
.Write
.Length
);
115 DPRINT("Buffer: %p\n", Buffer
);
117 for (i
= 0; i
< IoStack
->Parameters
.Write
.Length
; i
++)
123 KeStallExecutionProcessor(10);
124 PortStatus
= READ_PORT_UCHAR(UlongToPtr(FdoDeviceExtension
->BaseAddress
+ 1));
127 while (ulCount
< 500000 && !(PortStatus
& LP_PBUSY
));
129 if (ulCount
== 500000)
131 DPRINT("Timed out\n");
133 Irp
->IoStatus
.Information
= 0;
134 Irp
->IoStatus
.Status
= STATUS_TIMEOUT
;
135 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
137 return STATUS_TIMEOUT
;
140 /* Write character */
141 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension
->BaseAddress
), Buffer
[i
]);
143 KeStallExecutionProcessor(10);
145 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension
->BaseAddress
+ 2), (LP_PSELECP
| LP_PINITP
| LP_PSTROBE
));
147 KeStallExecutionProcessor(10);
149 WRITE_PORT_UCHAR(UlongToPtr(FdoDeviceExtension
->BaseAddress
+ 2), (LP_PSELECP
| LP_PINITP
));
152 Irp
->IoStatus
.Information
= 0;
153 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
154 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
155 return STATUS_SUCCESS
;
161 PdoPnp(IN PDEVICE_OBJECT DeviceObject
,
165 DPRINT("PdoPnp()\n");
167 Status
= Irp
->IoStatus
.Status
;
168 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
175 PdoPower(IN PDEVICE_OBJECT DeviceObject
,
179 PIO_STACK_LOCATION IoStack
;
181 DPRINT("PdoPower()\n");
183 IoStack
= IoGetCurrentIrpStackLocation(Irp
);
185 switch (IoStack
->MinorFunction
)
187 case IRP_MN_SET_POWER
:
188 case IRP_MN_QUERY_POWER
:
189 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
193 Status
= Irp
->IoStatus
.Status
;
194 PoStartNextPowerIrp(Irp
);
195 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);