2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: PCI IDE bus driver extension
4 * FILE: drivers/storage/pciidex/miniport.c
5 * PURPOSE: Miniport functions
6 * PROGRAMMERS: Hervé Poussineau (hpoussin@reactos.org)
14 static DRIVER_DISPATCH PciIdeXForwardOrIgnore
;
16 PciIdeXForwardOrIgnore(
17 IN PDEVICE_OBJECT DeviceObject
,
20 if (((PCOMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->IsFDO
)
21 return ForwardIrpAndForget(DeviceObject
, Irp
);
24 ULONG MajorFunction
= IoGetCurrentIrpStackLocation(Irp
)->MajorFunction
;
27 if (MajorFunction
== IRP_MJ_CREATE
||
28 MajorFunction
== IRP_MJ_CLEANUP
||
29 MajorFunction
== IRP_MJ_CLOSE
)
31 Status
= STATUS_SUCCESS
;
35 DPRINT1("PDO stub for major function 0x%lx\n", MajorFunction
);
36 Status
= STATUS_NOT_SUPPORTED
;
38 Irp
->IoStatus
.Information
= 0;
39 Irp
->IoStatus
.Status
= Status
;
40 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
45 static DRIVER_DISPATCH PciIdeXPnpDispatch
;
48 IN PDEVICE_OBJECT DeviceObject
,
51 if (((PCOMMON_DEVICE_EXTENSION
)DeviceObject
->DeviceExtension
)->IsFDO
)
52 return PciIdeXFdoPnpDispatch(DeviceObject
, Irp
);
54 return PciIdeXPdoPnpDispatch(DeviceObject
, Irp
);
59 IN PDRIVER_OBJECT DriverObject
,
60 IN PUNICODE_STRING RegistryPath
,
61 IN PCONTROLLER_PROPERTIES HwGetControllerProperties
,
62 IN ULONG ExtensionSize
)
65 PPCIIDEX_DRIVER_EXTENSION DriverExtension
;
68 DPRINT("PciIdeXInitialize(%p '%wZ' %p 0x%lx)\n",
69 DriverObject
, RegistryPath
, HwGetControllerProperties
, ExtensionSize
);
71 Status
= IoAllocateDriverObjectExtension(
74 sizeof(PCIIDEX_DRIVER_EXTENSION
),
75 (PVOID
*)&DriverExtension
);
76 if (!NT_SUCCESS(Status
))
78 RtlZeroMemory(DriverExtension
, sizeof(PCIIDEX_DRIVER_EXTENSION
));
79 DriverExtension
->MiniControllerExtensionSize
= ExtensionSize
;
80 DriverExtension
->HwGetControllerProperties
= HwGetControllerProperties
;
82 DriverObject
->DriverExtension
->AddDevice
= PciIdeXAddDevice
;
84 for (i
= 0; i
<= IRP_MJ_MAXIMUM_FUNCTION
; i
++)
85 DriverObject
->MajorFunction
[i
] = PciIdeXForwardOrIgnore
;
86 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = PciIdeXPnpDispatch
;
88 return STATUS_SUCCESS
;
91 /* May be called at IRQL <= DISPATCH_LEVEL */
94 IN PVOID DeviceExtension
,
96 IN ULONG ConfigDataOffset
,
97 IN ULONG BufferLength
)
99 PFDO_DEVICE_EXTENSION FdoDeviceExtension
;
101 NTSTATUS Status
= STATUS_UNSUCCESSFUL
;
103 DPRINT("PciIdeXGetBusData(%p %p 0x%lx 0x%lx)\n",
104 DeviceExtension
, Buffer
, ConfigDataOffset
, BufferLength
);
106 FdoDeviceExtension
= CONTAINING_RECORD(DeviceExtension
, FDO_DEVICE_EXTENSION
, MiniControllerExtension
);
107 if (FdoDeviceExtension
->BusInterface
)
109 BytesRead
= (*FdoDeviceExtension
->BusInterface
->GetBusData
)(
110 FdoDeviceExtension
->BusInterface
->Context
,
111 PCI_WHICHSPACE_CONFIG
,
115 if (BytesRead
== BufferLength
)
116 Status
= STATUS_SUCCESS
;
122 /* May be called at IRQL <= DISPATCH_LEVEL */
125 IN PVOID DeviceExtension
,
128 IN ULONG ConfigDataOffset
,
129 IN ULONG BufferLength
)
131 PFDO_DEVICE_EXTENSION FdoDeviceExtension
;
132 PUCHAR CurrentBuffer
= NULL
;
133 ULONG i
, BytesWritten
;
136 DPRINT("PciIdeXSetBusData(%p %p %p 0x%lx 0x%lx)\n",
137 DeviceExtension
, Buffer
, DataMask
, ConfigDataOffset
, BufferLength
);
139 CurrentBuffer
= ExAllocatePool(NonPagedPool
, BufferLength
);
142 Status
= STATUS_INSUFFICIENT_RESOURCES
;
146 Status
= PciIdeXGetBusData(DeviceExtension
, Buffer
, ConfigDataOffset
, BufferLength
);
147 if (!NT_SUCCESS(Status
))
150 for (i
= 0; i
< BufferLength
; i
++)
151 CurrentBuffer
[i
] = (CurrentBuffer
[i
] & ~((PUCHAR
)DataMask
)[i
]) | (((PUCHAR
)DataMask
)[i
] & ((PUCHAR
)Buffer
)[i
]);
153 FdoDeviceExtension
= CONTAINING_RECORD(DeviceExtension
, FDO_DEVICE_EXTENSION
, MiniControllerExtension
);
154 if (!FdoDeviceExtension
->BusInterface
)
156 Status
= STATUS_UNSUCCESSFUL
;
160 BytesWritten
= (*FdoDeviceExtension
->BusInterface
->SetBusData
)(
161 FdoDeviceExtension
->BusInterface
->Context
,
162 PCI_WHICHSPACE_CONFIG
,
166 if (BytesWritten
== BufferLength
)
167 Status
= STATUS_SUCCESS
;
169 Status
= STATUS_UNSUCCESSFUL
;
172 ExFreePool(CurrentBuffer
);