Implement InterfacePciDevicePresent(Ex) of PCI_DEVICE_PRESENT_INTERFACE
Modified: trunk/reactos/drivers/bus/pci/fdo.c
Modified: trunk/reactos/drivers/bus/pci/pci.c
Modified: trunk/reactos/drivers/bus/pci/pci.h
Modified: trunk/reactos/drivers/bus/pci/pdo.c
_____
Modified: trunk/reactos/drivers/bus/pci/fdo.c
--- trunk/reactos/drivers/bus/pci/fdo.c 2005-11-19 09:05:37 UTC (rev
19339)
+++ trunk/reactos/drivers/bus/pci/fdo.c 2005-11-19 09:08:08 UTC (rev
19340)
@@ -125,7 +125,7 @@
Status = FdoLocateChildDevice(&Device, DeviceExtension,
SlotNumber, &PciConfig);
if (!NT_SUCCESS(Status))
{
- Device = (PPCI_DEVICE)ExAllocatePool(PagedPool,
sizeof(PCI_DEVICE));
+ Device = (PPCI_DEVICE)ExAllocatePool(NonPagedPool,
sizeof(PCI_DEVICE));
if (!Device)
{
/* FIXME: Cleanup resources for already discovered devices */
@@ -413,6 +413,11 @@
DeviceExtension->DeviceListCount = 0;
DeviceExtension->State = dsStarted;
+ ExInterlockedInsertTailList(
+ &DriverExtension->BusListHead,
+ &DeviceExtension->ListEntry,
+ &DriverExtension->BusListLock);
+
Irp->IoStatus.Information = 0;
return STATUS_SUCCESS;
_____
Modified: trunk/reactos/drivers/bus/pci/pci.c
--- trunk/reactos/drivers/bus/pci/pci.c 2005-11-19 09:05:37 UTC (rev
19339)
+++ trunk/reactos/drivers/bus/pci/pci.c 2005-11-19 09:08:08 UTC (rev
19340)
@@ -29,6 +29,7 @@
/*** PUBLIC
******************************************************************/
+PPCI_DRIVER_EXTENSION DriverExtension = NULL;
/*** PRIVATE
*****************************************************************/
@@ -173,6 +174,8 @@
IN PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath)
{
+ NTSTATUS Status;
+
DPRINT("Peripheral Component Interconnect Bus Driver\n");
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] =
PciDispatchDeviceControl;
@@ -180,6 +183,18 @@
DriverObject->MajorFunction[IRP_MJ_POWER] = PciPowerControl;
DriverObject->DriverExtension->AddDevice = PciAddDevice;
+ Status = IoAllocateDriverObjectExtension(
+ DriverObject,
+ DriverObject,
+ sizeof(PCI_DRIVER_EXTENSION),
+ (PVOID*)&DriverExtension);
+ if (!NT_SUCCESS(Status))
+ return Status;
+ RtlZeroMemory(DriverExtension, sizeof(PCI_DRIVER_EXTENSION));
+
+ InitializeListHead(&DriverExtension->BusListHead);
+ KeInitializeSpinLock(&DriverExtension->BusListLock);
+
return STATUS_SUCCESS;
}
_____
Modified: trunk/reactos/drivers/bus/pci/pci.h
--- trunk/reactos/drivers/bus/pci/pci.h 2005-11-19 09:05:37 UTC (rev
19339)
+++ trunk/reactos/drivers/bus/pci/pci.h 2005-11-19 09:08:08 UTC (rev
19340)
@@ -2,13 +2,6 @@
#define __PCI_H
-typedef enum {
- pbtUnknown = 0,
- pbtType1,
- pbtType2,
-} PCI_BUS_TYPE;
-
-
typedef struct _PCI_DEVICE
{
// Entry on device list
@@ -77,6 +70,8 @@
{
// Common device data
COMMON_DEVICE_EXTENSION Common;
+ // Entry on device list
+ LIST_ENTRY ListEntry;
// PCI bus number serviced by this FDO
ULONG BusNumber;
// Current state of the driver
@@ -92,6 +87,21 @@
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
+/* Driver extension associated with PCI driver */
+typedef struct _PCI_DRIVER_EXTENSION
+{
+ //
+ LIST_ENTRY BusListHead;
+ // Lock for namespace bus list
+ KSPIN_LOCK BusListLock;
+} PCI_DRIVER_EXTENSION, *PPCI_DRIVER_EXTENSION;
+
+
+/* We need a global variable to get the driver extension,
+ * because at least InterfacePciDevicePresent has no
+ * other way to get it... */
+extern PPCI_DRIVER_EXTENSION DriverExtension;
+
/* fdo.c */
NTSTATUS
_____
Modified: trunk/reactos/drivers/bus/pci/pdo.c
--- trunk/reactos/drivers/bus/pci/pdo.c 2005-11-19 09:05:37 UTC (rev
19339)
+++ trunk/reactos/drivers/bus/pci/pdo.c 2005-11-19 09:08:08 UTC (rev
19340)
@@ -954,41 +954,154 @@
return Size;
}
+
static BOOLEAN NTAPI
InterfacePciDevicePresent(
- IN USHORT VendorID,
- IN USHORT DeviceID,
- IN UCHAR RevisionID,
- IN USHORT SubVendorID,
- IN USHORT SubSystemID,
- IN ULONG Flags
-)
+ IN USHORT VendorID,
+ IN USHORT DeviceID,
+ IN UCHAR RevisionID,
+ IN USHORT SubVendorID,
+ IN USHORT SubSystemID,
+ IN ULONG Flags)
{
- DPRINT1("Checking for PCI %04X:%04X not implemented\n",
- VendorID, DeviceID);
+ PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+ PPCI_DEVICE PciDevice;
+ PLIST_ENTRY CurrentBus, CurrentEntry;
+ KIRQL OldIrql;
+ BOOLEAN Found = FALSE;
- return FALSE;
+ KeAcquireSpinLock(&DriverExtension->BusListLock, &OldIrql);
+ CurrentBus = DriverExtension->BusListHead.Flink;
+ while (!Found && CurrentBus != &DriverExtension->BusListHead)
+ {
+ FdoDeviceExtension = CONTAINING_RECORD(CurrentBus,
FDO_DEVICE_EXTENSION, ListEntry);
+
+ KeAcquireSpinLockAtDpcLevel(&FdoDeviceExtension->DeviceListLock);
+ CurrentEntry = FdoDeviceExtension->DeviceListHead.Flink;
+ while (!Found && CurrentEntry !=
&FdoDeviceExtension->DeviceListHead)
+ {
+ PciDevice = CONTAINING_RECORD(CurrentEntry, PCI_DEVICE,
ListEntry);
+ if (PciDevice->PciConfig.VendorID == VendorID &&
+ PciDevice->PciConfig.DeviceID == DeviceID)
+ {
+ if (!(Flags & PCI_USE_SUBSYSTEM_IDS) || (
+ PciDevice->PciConfig.u.type0.SubVendorID == SubVendorID &&
+ PciDevice->PciConfig.u.type0.SubSystemID == SubSystemID))
+ {
+ if (!(Flags & PCI_USE_REVISION) ||
+ PciDevice->PciConfig.RevisionID == RevisionID)
+ {
+ DPRINT("Found the PCI device\n");
+ Found = TRUE;
+ }
+ }
+ }
+
+ CurrentEntry = CurrentEntry->Flink;
+ }
+
+ KeReleaseSpinLockFromDpcLevel(&FdoDeviceExtension->DeviceListLock);
+ CurrentBus = CurrentBus->Flink;
+ }
+ KeReleaseSpinLock(&DriverExtension->BusListLock, OldIrql);
+
+ return Found;
}
+
+static BOOLEAN
+CheckPciDevice(
+ IN PPCI_COMMON_CONFIG PciConfig,
+ IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters)
+{
+ if ((Parameters->Flags & PCI_USE_VENDEV_IDS) && (
+ PciConfig->VendorID != Parameters->VendorID ||
+ PciConfig->DeviceID != Parameters->DeviceID))
+ {
+ return FALSE;
+ }
+ if ((Parameters->Flags && PCI_USE_CLASS_SUBCLASS) && (
+ PciConfig->u.type0.SubVendorID != Parameters->SubVendorID ||
+ PciConfig->u.type0.SubSystemID != Parameters->SubSystemID))
+ {
+ return FALSE;
+ }
+ if ((Parameters->Flags & PCI_USE_PROGIF) &&
+ PciConfig->ProgIf != Parameters->ProgIf)
+ {
+ return FALSE;
+ }
+ if ((Parameters->Flags & PCI_USE_SUBSYSTEM_IDS) && (
+ PciConfig->Command != Parameters->SubVendorID ||
+ PciConfig->Status != Parameters->SubSystemID))
+ {
+ return FALSE;
+ }
+ if ((Parameters->Flags & PCI_USE_REVISION) &&
+ PciConfig->RevisionID != Parameters->RevisionID)
+ {
+ return FALSE;
+ }
+ return TRUE;
+}
+
+
static BOOLEAN NTAPI
InterfacePciDevicePresentEx(
IN PVOID Context,
IN PPCI_DEVICE_PRESENCE_PARAMETERS Parameters)
{
PPDO_DEVICE_EXTENSION DeviceExtension;
+ PFDO_DEVICE_EXTENSION MyFdoDeviceExtension;
+ PFDO_DEVICE_EXTENSION FdoDeviceExtension;
+ PPCI_DEVICE PciDevice;
+ PLIST_ENTRY CurrentBus, CurrentEntry;
+ KIRQL OldIrql;
+ BOOLEAN Found = FALSE;
- DPRINT1("InterfacePciDevicePresentEx(%p %p) called\n",
+ DPRINT("InterfacePciDevicePresentEx(%p %p) called\n",
Context, Parameters);
if (!Parameters || Parameters->Size !=
sizeof(PCI_DEVICE_PRESENCE_PARAMETERS))
return FALSE;
DeviceExtension =
(PPDO_DEVICE_EXTENSION)((PDEVICE_OBJECT)Context)->DeviceExtension;
+ MyFdoDeviceExtension =
(PFDO_DEVICE_EXTENSION)DeviceExtension->Fdo->DeviceExtension;
- DPRINT1("Checking for PCI %04X:%04X not implemented\n",
- Parameters->VendorID, Parameters->DeviceID);
+ if (Parameters->Flags & PCI_USE_LOCAL_DEVICE)
+ {
+ return CheckPciDevice(&DeviceExtension->PciDevice->PciConfig,
Parameters);
+ }
- return FALSE;
+ KeAcquireSpinLock(&DriverExtension->BusListLock, &OldIrql);
+ CurrentBus = DriverExtension->BusListHead.Flink;
+ while (!Found && CurrentBus != &DriverExtension->BusListHead)
+ {
+ FdoDeviceExtension = CONTAINING_RECORD(CurrentBus,
FDO_DEVICE_EXTENSION, ListEntry);
+ if (!(Parameters->Flags & PCI_USE_LOCAL_BUS) || FdoDeviceExtension
== MyFdoDeviceExtension)
+ {
+ KeAcquireSpinLockAtDpcLevel(&FdoDeviceExtension->DeviceListLock);
+ CurrentEntry = FdoDeviceExtension->DeviceListHead.Flink;
+ while (!Found && CurrentEntry !=
&FdoDeviceExtension->DeviceListHead)
+ {
+ PciDevice = CONTAINING_RECORD(CurrentEntry, PCI_DEVICE,
ListEntry);
+
+ if (CheckPciDevice(&PciDevice->PciConfig, Parameters))
+ {
+ DPRINT("Found the PCI device\n");
+ Found = TRUE;
+ }
+
+ CurrentEntry = CurrentEntry->Flink;
+ }
+
+
KeReleaseSpinLockFromDpcLevel(&FdoDeviceExtension->DeviceListLock);
+ }
+ CurrentBus = CurrentBus->Flink;
+ }
+ KeReleaseSpinLock(&DriverExtension->BusListLock, OldIrql);
+
+ return Found;
}
@@ -1034,15 +1147,15 @@
Status = STATUS_BUFFER_TOO_SMALL;
else
{
- PPCI_DEVICE_PRESENT_INTERFACE BusInterface;
- BusInterface =
(PPCI_DEVICE_PRESENT_INTERFACE)IrpSp->Parameters.QueryInterface.Interfac
e;
- BusInterface->Size = sizeof(PCI_DEVICE_PRESENT_INTERFACE);
- BusInterface->Version = 1;
- BusInterface->Context = DeviceObject;
- BusInterface->InterfaceReference = InterfaceReference;
- BusInterface->InterfaceDereference = InterfaceDereference;
- BusInterface->IsDevicePresent = InterfacePciDevicePresent;
- BusInterface->IsDevicePresentEx = InterfacePciDevicePresentEx;
+ PPCI_DEVICE_PRESENT_INTERFACE PciDevicePresentInterface;
+ PciDevicePresentInterface =
(PPCI_DEVICE_PRESENT_INTERFACE)IrpSp->Parameters.QueryInterface.Interfac
e;
+ PciDevicePresentInterface->Size =
sizeof(PCI_DEVICE_PRESENT_INTERFACE);
+ PciDevicePresentInterface->Version = 1;
+ PciDevicePresentInterface->Context = DeviceObject;
+ PciDevicePresentInterface->InterfaceReference =
InterfaceReference;
+ PciDevicePresentInterface->InterfaceDereference =
InterfaceDereference;
+ PciDevicePresentInterface->IsDevicePresent =
InterfacePciDevicePresent;
+ PciDevicePresentInterface->IsDevicePresentEx =
InterfacePciDevicePresentEx;
Status = STATUS_SUCCESS;
}
}