mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 01:15:09 +00:00
Transform pci.sys to a Plug-and-Play driver.
Simplify most of the PciCreateCompatible*String functions Fix error handling in FdoQueryBusRelations => pci.sys now manages only 1 bus. It is still using HalGetBusDataByOffset/HalGetBusData which are deprecated, but it shouldn't be too hard to remove svn path=/trunk/; revision=18449
This commit is contained in:
parent
72dd7eefe0
commit
463b91a5b9
5 changed files with 231 additions and 283 deletions
|
@ -583,16 +583,12 @@ HKLM,"SYSTEM\CurrentControlSet\Enum\Root\Ne2000\0000","ClassGUID",0x00000000,"{4
|
|||
HKLM,"SYSTEM\CurrentControlSet\Enum\Root\Ne2000\0000","Driver",0x00000000,"{4D36E972-E325-11CE-BFC1-08002BE10318}\0001"
|
||||
|
||||
; PCI driver
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Pci","ErrorControl",0x00010001,0x00000000
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Group",0x00000000,"Boot Bus Extender"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Pci","ImagePath",0x00020000,"system32\drivers\pci.sys"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Start",0x00010001,0x00000000
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Tag",0x00010001,0x00000002
|
||||
HKLM,"SYSTEM\CurrentControlSet\Services\Pci","Type",0x00010001,0x00000001
|
||||
HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","Service",0x00000000,"Pci"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","Class",0x00000000,"Computer"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","ClassGUID",0x00000000,"{4D36E966-E325-11CE-BFC1-08002BE10318}"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Enum\Root\PCI\0000","ParentIdPrefix",0x0000000,"0000"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Enum\Root\*PNP0A03\0000","HardwareID",0x00010000,"*PNP0A03"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Enum\Root\*PNP0A03\0000","DeviceDesc",0x00000000,"PCI bus"
|
||||
HKLM,"SYSTEM\CurrentControlSet\Enum\Root\*PNP0A03\0000\LogConf","BasicConfigVector",0x000A0001, \
|
||||
40,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00, \
|
||||
01,00,00,00,01,00,01,00,01,00,00,00, \
|
||||
00,06,00,00,00,00,00,00,01,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00
|
||||
|
||||
; ReactOS PCNet NIC driver
|
||||
; To use the AMD supplied driver change the driver name to pcntn5m.sys
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
/* $Id$
|
||||
*
|
||||
/*
|
||||
* PROJECT: ReactOS PCI bus driver
|
||||
* FILE: fdo.c
|
||||
* PURPOSE: PCI device object dispatch routines
|
||||
|
@ -22,7 +21,6 @@ static NTSTATUS
|
|||
FdoLocateChildDevice(
|
||||
PPCI_DEVICE *Device,
|
||||
PFDO_DEVICE_EXTENSION DeviceExtension,
|
||||
ULONG BusNumber,
|
||||
PCI_SLOT_NUMBER SlotNumber,
|
||||
PPCI_COMMON_CONFIG PciConfig)
|
||||
{
|
||||
|
@ -38,8 +36,7 @@ FdoLocateChildDevice(
|
|||
/* If both vendor ID and device ID match, it is the same device */
|
||||
if ((PciConfig->VendorID == CurrentDevice->PciConfig.VendorID) &&
|
||||
(PciConfig->DeviceID == CurrentDevice->PciConfig.DeviceID) &&
|
||||
(SlotNumber.u.AsULONG == CurrentDevice->SlotNumber.u.AsULONG) &&
|
||||
(BusNumber == CurrentDevice->BusNumber)) {
|
||||
(SlotNumber.u.AsULONG == CurrentDevice->SlotNumber.u.AsULONG)) {
|
||||
*Device = CurrentDevice;
|
||||
DPRINT("Done\n");
|
||||
return STATUS_SUCCESS;
|
||||
|
@ -63,7 +60,6 @@ FdoEnumerateDevices(
|
|||
PLIST_ENTRY CurrentEntry;
|
||||
PPCI_DEVICE Device;
|
||||
PCI_SLOT_NUMBER SlotNumber;
|
||||
ULONG BusNumber;
|
||||
ULONG DeviceNumber;
|
||||
ULONG FunctionNumber;
|
||||
ULONG Size;
|
||||
|
@ -85,89 +81,86 @@ FdoEnumerateDevices(
|
|||
DeviceExtension->DeviceListCount = 0;
|
||||
|
||||
/* Enumerate devices on the PCI bus */
|
||||
for (BusNumber = 0; BusNumber < 8; BusNumber++)
|
||||
SlotNumber.u.AsULONG = 0;
|
||||
for (DeviceNumber = 0; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
|
||||
{
|
||||
SlotNumber.u.AsULONG = 0;
|
||||
for (DeviceNumber = 0; DeviceNumber < PCI_MAX_DEVICES; DeviceNumber++)
|
||||
SlotNumber.u.bits.DeviceNumber = DeviceNumber;
|
||||
for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
|
||||
{
|
||||
SlotNumber.u.bits.DeviceNumber = DeviceNumber;
|
||||
for (FunctionNumber = 0; FunctionNumber < PCI_MAX_FUNCTION; FunctionNumber++)
|
||||
SlotNumber.u.bits.FunctionNumber = FunctionNumber;
|
||||
|
||||
DPRINT("Bus %1lu Device %2lu Func %1lu\n",
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceNumber,
|
||||
FunctionNumber);
|
||||
|
||||
RtlZeroMemory(&PciConfig,
|
||||
sizeof(PCI_COMMON_CONFIG));
|
||||
|
||||
Size = HalGetBusData(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
SlotNumber.u.AsULONG,
|
||||
&PciConfig,
|
||||
PCI_COMMON_HDR_LENGTH);
|
||||
DPRINT("Size %lu\n", Size);
|
||||
if (Size < PCI_COMMON_HDR_LENGTH)
|
||||
{
|
||||
SlotNumber.u.bits.FunctionNumber = FunctionNumber;
|
||||
|
||||
DPRINT("Bus %1lu Device %2lu Func %1lu\n",
|
||||
BusNumber,
|
||||
DeviceNumber,
|
||||
FunctionNumber);
|
||||
|
||||
RtlZeroMemory(&PciConfig,
|
||||
sizeof(PCI_COMMON_CONFIG));
|
||||
|
||||
Size = HalGetBusData(PCIConfiguration,
|
||||
BusNumber,
|
||||
SlotNumber.u.AsULONG,
|
||||
&PciConfig,
|
||||
PCI_COMMON_HDR_LENGTH);
|
||||
DPRINT("Size %lu\n", Size);
|
||||
if (Size < PCI_COMMON_HDR_LENGTH)
|
||||
{
|
||||
if (FunctionNumber == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT("Bus %1lu Device %2lu Func %1lu VenID 0x%04hx DevID 0x%04hx\n",
|
||||
BusNumber,
|
||||
DeviceNumber,
|
||||
FunctionNumber,
|
||||
PciConfig.VendorID,
|
||||
PciConfig.DeviceID);
|
||||
|
||||
Status = FdoLocateChildDevice(&Device, DeviceExtension, BusNumber, SlotNumber, &PciConfig);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
Device = (PPCI_DEVICE)ExAllocatePool(PagedPool, sizeof(PCI_DEVICE));
|
||||
if (!Device)
|
||||
{
|
||||
/* FIXME: Cleanup resources for already discovered devices */
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
RtlZeroMemory(Device,
|
||||
sizeof(PCI_DEVICE));
|
||||
|
||||
Device->BusNumber = BusNumber;
|
||||
|
||||
RtlCopyMemory(&Device->SlotNumber,
|
||||
&SlotNumber,
|
||||
sizeof(PCI_SLOT_NUMBER));
|
||||
|
||||
RtlCopyMemory(&Device->PciConfig,
|
||||
&PciConfig,
|
||||
sizeof(PCI_COMMON_CONFIG));
|
||||
|
||||
ExInterlockedInsertTailList(
|
||||
&DeviceExtension->DeviceListHead,
|
||||
&Device->ListEntry,
|
||||
&DeviceExtension->DeviceListLock);
|
||||
}
|
||||
|
||||
/* Don't remove this device */
|
||||
Device->RemovePending = FALSE;
|
||||
|
||||
DeviceExtension->DeviceListCount++;
|
||||
|
||||
/* Skip to next device if the current one is not a multifunction device */
|
||||
if ((FunctionNumber == 0) &&
|
||||
((PciConfig.HeaderType & 0x80) == 0))
|
||||
if (FunctionNumber == 0)
|
||||
{
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
DPRINT("Bus %1lu Device %2lu Func %1lu VenID 0x%04hx DevID 0x%04hx\n",
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceNumber,
|
||||
FunctionNumber,
|
||||
PciConfig.VendorID,
|
||||
PciConfig.DeviceID);
|
||||
|
||||
Status = FdoLocateChildDevice(&Device, DeviceExtension, SlotNumber, &PciConfig);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
Device = (PPCI_DEVICE)ExAllocatePool(PagedPool, sizeof(PCI_DEVICE));
|
||||
if (!Device)
|
||||
{
|
||||
/* FIXME: Cleanup resources for already discovered devices */
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
RtlZeroMemory(Device,
|
||||
sizeof(PCI_DEVICE));
|
||||
|
||||
Device->BusNumber = DeviceExtension->BusNumber;
|
||||
|
||||
RtlCopyMemory(&Device->SlotNumber,
|
||||
&SlotNumber,
|
||||
sizeof(PCI_SLOT_NUMBER));
|
||||
|
||||
RtlCopyMemory(&Device->PciConfig,
|
||||
&PciConfig,
|
||||
sizeof(PCI_COMMON_CONFIG));
|
||||
|
||||
ExInterlockedInsertTailList(
|
||||
&DeviceExtension->DeviceListHead,
|
||||
&Device->ListEntry,
|
||||
&DeviceExtension->DeviceListLock);
|
||||
}
|
||||
|
||||
/* Don't remove this device */
|
||||
Device->RemovePending = FALSE;
|
||||
|
||||
DeviceExtension->DeviceListCount++;
|
||||
|
||||
/* Skip to next device if the current one is not a multifunction device */
|
||||
if ((FunctionNumber == 0) &&
|
||||
((PciConfig.HeaderType & 0x80) == 0))
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -263,18 +256,13 @@ FdoQueryBusRelations(
|
|||
|
||||
PdoDeviceExtension->Fdo = DeviceObject;
|
||||
|
||||
PdoDeviceExtension->BusNumber = Device->BusNumber;
|
||||
|
||||
RtlCopyMemory(
|
||||
&PdoDeviceExtension->SlotNumber,
|
||||
&Device->SlotNumber,
|
||||
sizeof(PCI_SLOT_NUMBER));
|
||||
PdoDeviceExtension->PciDevice = Device;
|
||||
|
||||
/* Add Device ID string */
|
||||
if (!PciCreateDeviceIDString(&PdoDeviceExtension->DeviceID,
|
||||
Device))
|
||||
Status = PciCreateDeviceIDString(&PdoDeviceExtension->DeviceID, Device);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
|
||||
ErrorStatus = Status;
|
||||
ErrorOccurred = TRUE;
|
||||
break;
|
||||
}
|
||||
|
@ -282,46 +270,46 @@ FdoQueryBusRelations(
|
|||
DPRINT("DeviceID: %S\n", PdoDeviceExtension->DeviceID.Buffer);
|
||||
|
||||
/* Add Instance ID string */
|
||||
if (!PciCreateInstanceIDString(&PdoDeviceExtension->InstanceID,
|
||||
Device))
|
||||
Status = PciCreateInstanceIDString(&PdoDeviceExtension->InstanceID, Device);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
|
||||
ErrorStatus = Status;
|
||||
ErrorOccurred = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Add Hardware IDs string */
|
||||
if (!PciCreateHardwareIDsString(&PdoDeviceExtension->HardwareIDs,
|
||||
Device))
|
||||
Status = PciCreateHardwareIDsString(&PdoDeviceExtension->HardwareIDs, Device);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
|
||||
ErrorStatus = Status;
|
||||
ErrorOccurred = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Add Compatible IDs string */
|
||||
if (!PciCreateCompatibleIDsString(&PdoDeviceExtension->CompatibleIDs,
|
||||
Device))
|
||||
Status = PciCreateCompatibleIDsString(&PdoDeviceExtension->CompatibleIDs, Device);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
|
||||
ErrorStatus = Status;
|
||||
ErrorOccurred = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Add device description string */
|
||||
if (!PciCreateDeviceDescriptionString(&PdoDeviceExtension->DeviceDescription,
|
||||
Device))
|
||||
Status = PciCreateDeviceDescriptionString(&PdoDeviceExtension->DeviceDescription, Device);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
|
||||
ErrorStatus = Status;
|
||||
ErrorOccurred = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Add device location string */
|
||||
if (!PciCreateDeviceLocationString(&PdoDeviceExtension->DeviceLocation,
|
||||
Device))
|
||||
Status = PciCreateDeviceLocationString(&PdoDeviceExtension->DeviceLocation, Device);
|
||||
if (!NT_SUCCESS(Status))
|
||||
{
|
||||
ErrorStatus = STATUS_INSUFFICIENT_RESOURCES;
|
||||
ErrorStatus = Status;
|
||||
ErrorOccurred = TRUE;
|
||||
break;
|
||||
}
|
||||
|
@ -345,7 +333,11 @@ FdoQueryBusRelations(
|
|||
/* FIXME: Should IoAttachDeviceToDeviceStack() be undone? */
|
||||
if (PdoDeviceExtension) {
|
||||
RtlFreeUnicodeString(&PdoDeviceExtension->DeviceID);
|
||||
ExFreePool(PdoDeviceExtension);
|
||||
RtlFreeUnicodeString(&PdoDeviceExtension->InstanceID);
|
||||
RtlFreeUnicodeString(&PdoDeviceExtension->HardwareIDs);
|
||||
RtlFreeUnicodeString(&PdoDeviceExtension->CompatibleIDs);
|
||||
RtlFreeUnicodeString(&PdoDeviceExtension->DeviceDescription);
|
||||
RtlFreeUnicodeString(&PdoDeviceExtension->DeviceLocation);
|
||||
}
|
||||
|
||||
ExFreePool(Relations);
|
||||
|
@ -366,19 +358,62 @@ FdoStartDevice(
|
|||
IN PIRP Irp)
|
||||
{
|
||||
PFDO_DEVICE_EXTENSION DeviceExtension;
|
||||
PCM_RESOURCE_LIST AllocatedResources;
|
||||
PCM_PARTIAL_RESOURCE_DESCRIPTOR ResourceDescriptor;
|
||||
ULONG FoundBusNumber = FALSE;
|
||||
ULONG i;
|
||||
|
||||
DPRINT("Called\n");
|
||||
|
||||
DeviceExtension = (PFDO_DEVICE_EXTENSION)DeviceObject->DeviceExtension;
|
||||
|
||||
AllocatedResources = IoGetCurrentIrpStackLocation(Irp)->Parameters.StartDevice.AllocatedResources;
|
||||
if (!AllocatedResources)
|
||||
{
|
||||
DPRINT("PCI: No allocated resources sent to driver\n");
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
if (AllocatedResources->Count < 1)
|
||||
{
|
||||
DPRINT("PCI: Not enough allocated resources sent to driver\n");
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
if (AllocatedResources->List[0].PartialResourceList.Version != 1
|
||||
|| AllocatedResources->List[0].PartialResourceList.Revision != 1)
|
||||
return STATUS_REVISION_MISMATCH;
|
||||
|
||||
assert(DeviceExtension->State == dsStopped);
|
||||
ASSERT(DeviceExtension->State == dsStopped);
|
||||
|
||||
for (i = 0; i < AllocatedResources->List[0].PartialResourceList.Count; i++)
|
||||
{
|
||||
ResourceDescriptor = &AllocatedResources->List[0].PartialResourceList.PartialDescriptors[i];
|
||||
switch (ResourceDescriptor->Type)
|
||||
{
|
||||
case CmResourceTypeBusNumber:
|
||||
{
|
||||
if (FoundBusNumber || ResourceDescriptor->u.BusNumber.Length != 1)
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
DeviceExtension->BusNumber = ResourceDescriptor->u.BusNumber.Start;
|
||||
DPRINT("PCI: Found bus number resource: %lu\n", DeviceExtension->BusNumber);
|
||||
FoundBusNumber = TRUE;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
DPRINT1("PCI: Unknown resource descriptor type 0x%x\n", ResourceDescriptor->Type);
|
||||
}
|
||||
}
|
||||
if (!FoundBusNumber)
|
||||
{
|
||||
DPRINT("PCI: All required resources were not found in allocated resources list\n");
|
||||
return STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
InitializeListHead(&DeviceExtension->DeviceListHead);
|
||||
KeInitializeSpinLock(&DeviceExtension->DeviceListLock);
|
||||
DeviceExtension->DeviceListCount = 0;
|
||||
DeviceExtension->State = dsStarted;
|
||||
|
||||
//Irp->IoStatus.Information = 0;
|
||||
Irp->IoStatus.Information = 0;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
/* $Id$
|
||||
*
|
||||
/*
|
||||
* PROJECT: ReactOS PCI Bus driver
|
||||
* FILE: pci.c
|
||||
* PURPOSE: Driver entry
|
||||
|
@ -185,7 +184,7 @@ DriverEntry(
|
|||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateDeviceIDString(PUNICODE_STRING DeviceID,
|
||||
PPCI_DEVICE Device)
|
||||
{
|
||||
|
@ -199,75 +198,36 @@ PciCreateDeviceIDString(PUNICODE_STRING DeviceID,
|
|||
Device->PciConfig.u.type0.SubVendorID,
|
||||
Device->PciConfig.RevisionID);
|
||||
|
||||
if (!RtlCreateUnicodeString(DeviceID, Buffer))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
return RtlCreateUnicodeString(DeviceID, Buffer) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateInstanceIDString(PUNICODE_STRING InstanceID,
|
||||
PPCI_DEVICE Device)
|
||||
{
|
||||
#if 0
|
||||
WCHAR Buffer[32];
|
||||
ULONG Length;
|
||||
ULONG Index;
|
||||
|
||||
Index = swprintf(Buffer,
|
||||
L"%lX&%02lX",
|
||||
Device->BusNumber,
|
||||
(Device->SlotNumber.u.bits.DeviceNumber << 3) +
|
||||
Device->SlotNumber.u.bits.FunctionNumber);
|
||||
Index++;
|
||||
Buffer[Index] = UNICODE_NULL;
|
||||
|
||||
Length = (Index + 1) * sizeof(WCHAR);
|
||||
InstanceID->Buffer = ExAllocatePool(PagedPool, Length);
|
||||
if (InstanceID->Buffer == NULL)
|
||||
Index = 0;
|
||||
if (((PPDO_DEVICE_EXTENSION)Device->Pdo->DeviceExtension)->PciDevice->BusNumber != 0)
|
||||
{
|
||||
return FALSE;
|
||||
/* FIXME: Copy InstanceID of parent PCI bus to Buffer */
|
||||
// Index += swprintf(Buffer, ....);
|
||||
}
|
||||
|
||||
InstanceID->Length = Length - sizeof(WCHAR);
|
||||
InstanceID->MaximumLength = Length;
|
||||
RtlCopyMemory(InstanceID->Buffer, Buffer, Length);
|
||||
swprintf(&Buffer[Index], L"%02X", Device->SlotNumber.u.AsULONG & 0xff);
|
||||
|
||||
return TRUE;
|
||||
#endif
|
||||
WCHAR Buffer[256];
|
||||
|
||||
swprintf(Buffer,
|
||||
L"PCI\\VEN_%04X&DEV_%04X&SUBSYS_%08X&REV_%02X",
|
||||
Device->PciConfig.VendorID,
|
||||
Device->PciConfig.DeviceID,
|
||||
(Device->PciConfig.u.type0.SubSystemID << 16) +
|
||||
Device->PciConfig.u.type0.SubVendorID,
|
||||
Device->PciConfig.RevisionID);
|
||||
|
||||
// XBOX HACK
|
||||
if (!wcscmp(L"PCI\\VEN_10DE&DEV_01C2&SUBSYS_00000000&REV_D4", Buffer))
|
||||
{
|
||||
//DPRINT("xbox ohci controler found at bus 0x%lX, dev num %d, func num %d\n", Device->BusNumber, Device->SlotNumber.u.bits.DeviceNumber, Device->SlotNumber.u.bits.FunctionNumber);
|
||||
if (Device->SlotNumber.u.bits.DeviceNumber == 2)
|
||||
return RtlCreateUnicodeString(InstanceID, L"0000");
|
||||
else
|
||||
return RtlCreateUnicodeString(InstanceID, L"0001");
|
||||
}
|
||||
else
|
||||
return RtlCreateUnicodeString(InstanceID, L"");
|
||||
return RtlCreateUnicodeString(InstanceID, Buffer) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateHardwareIDsString(PUNICODE_STRING HardwareIDs,
|
||||
PPCI_DEVICE Device)
|
||||
{
|
||||
WCHAR Buffer[256];
|
||||
ULONG Length;
|
||||
UNICODE_STRING BufferU;
|
||||
ULONG Index;
|
||||
|
||||
Index = 0;
|
||||
|
@ -306,28 +266,20 @@ PciCreateHardwareIDsString(PUNICODE_STRING HardwareIDs,
|
|||
Index++;
|
||||
|
||||
Buffer[Index] = UNICODE_NULL;
|
||||
|
||||
BufferU.Length = BufferU.MaximumLength = Index * sizeof(WCHAR);
|
||||
BufferU.Buffer = Buffer;
|
||||
|
||||
Length = (Index + 1) * sizeof(WCHAR);
|
||||
HardwareIDs->Buffer = ExAllocatePool(PagedPool, Length);
|
||||
if (HardwareIDs->Buffer == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
HardwareIDs->Length = Length - sizeof(WCHAR);
|
||||
HardwareIDs->MaximumLength = Length;
|
||||
RtlCopyMemory(HardwareIDs->Buffer, Buffer, Length);
|
||||
|
||||
return TRUE;
|
||||
return RtlDuplicateUnicodeString(0, &BufferU, HardwareIDs);
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateCompatibleIDsString(PUNICODE_STRING CompatibleIDs,
|
||||
PPCI_DEVICE Device)
|
||||
{
|
||||
WCHAR Buffer[256];
|
||||
ULONG Length;
|
||||
UNICODE_STRING BufferU;
|
||||
ULONG Index;
|
||||
|
||||
Index = 0;
|
||||
|
@ -379,27 +331,18 @@ PciCreateCompatibleIDsString(PUNICODE_STRING CompatibleIDs,
|
|||
|
||||
Buffer[Index] = UNICODE_NULL;
|
||||
|
||||
Length = (Index + 1) * sizeof(WCHAR);
|
||||
CompatibleIDs->Buffer = ExAllocatePool(PagedPool, Length);
|
||||
if (CompatibleIDs->Buffer == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
BufferU.Length = BufferU.MaximumLength = Index * sizeof(WCHAR);
|
||||
BufferU.Buffer = Buffer;
|
||||
|
||||
CompatibleIDs->Length = Length - sizeof(WCHAR);
|
||||
CompatibleIDs->MaximumLength = Length;
|
||||
RtlCopyMemory(CompatibleIDs->Buffer, Buffer, Length);
|
||||
|
||||
return TRUE;
|
||||
return RtlDuplicateUnicodeString(0, &BufferU, CompatibleIDs);
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateDeviceDescriptionString(PUNICODE_STRING DeviceDescription,
|
||||
PPCI_DEVICE Device)
|
||||
{
|
||||
PWSTR Description;
|
||||
ULONG Length;
|
||||
|
||||
switch (Device->PciConfig.BaseClass)
|
||||
{
|
||||
|
@ -655,51 +598,23 @@ PciCreateDeviceDescriptionString(PUNICODE_STRING DeviceDescription,
|
|||
break;
|
||||
}
|
||||
|
||||
Length = (wcslen(Description) + 1) * sizeof(WCHAR);
|
||||
DeviceDescription->Buffer = ExAllocatePool(PagedPool, Length);
|
||||
if (DeviceDescription->Buffer == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DeviceDescription->Length = Length - sizeof(WCHAR);
|
||||
DeviceDescription->MaximumLength = Length;
|
||||
RtlCopyMemory(DeviceDescription->Buffer, Description, Length);
|
||||
|
||||
return TRUE;
|
||||
return RtlCreateUnicodeString(DeviceDescription, Description) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateDeviceLocationString(PUNICODE_STRING DeviceLocation,
|
||||
PPCI_DEVICE Device)
|
||||
{
|
||||
WCHAR Buffer[256];
|
||||
ULONG Length;
|
||||
ULONG Index;
|
||||
|
||||
Index = 0;
|
||||
Index += swprintf(&Buffer[Index],
|
||||
L"PCI-Bus %lu, Device %u, Function %u",
|
||||
Device->BusNumber,
|
||||
Device->SlotNumber.u.bits.DeviceNumber,
|
||||
Device->SlotNumber.u.bits.FunctionNumber);
|
||||
Index++;
|
||||
swprintf(Buffer,
|
||||
L"PCI-Bus %lu, Device %u, Function %u",
|
||||
Device->BusNumber,
|
||||
Device->SlotNumber.u.bits.DeviceNumber,
|
||||
Device->SlotNumber.u.bits.FunctionNumber);
|
||||
|
||||
Buffer[Index] = UNICODE_NULL;
|
||||
|
||||
Length = (Index + 1) * sizeof(WCHAR);
|
||||
DeviceLocation->Buffer = ExAllocatePool(PagedPool, Length);
|
||||
if (DeviceLocation->Buffer == NULL)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DeviceLocation->Length = Length - sizeof(WCHAR);
|
||||
DeviceLocation->MaximumLength = Length;
|
||||
RtlCopyMemory(DeviceLocation->Buffer, Buffer, Length);
|
||||
|
||||
return TRUE;
|
||||
return RtlCreateUnicodeString(DeviceLocation, Buffer) ? STATUS_SUCCESS : STATUS_INSUFFICIENT_RESOURCES;
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
/* $Id$ */
|
||||
|
||||
#ifndef __PCI_H
|
||||
#define __PCI_H
|
||||
|
||||
|
@ -47,7 +45,7 @@ typedef struct _COMMON_DEVICE_EXTENSION
|
|||
BOOLEAN Removed;
|
||||
// Current device power state for the device
|
||||
DEVICE_POWER_STATE DevicePowerState;
|
||||
} __attribute((packed)) COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
|
||||
} COMMON_DEVICE_EXTENSION, *PCOMMON_DEVICE_EXTENSION;
|
||||
|
||||
/* Physical Device Object device extension for a child device */
|
||||
typedef struct _PDO_DEVICE_EXTENSION
|
||||
|
@ -56,10 +54,8 @@ typedef struct _PDO_DEVICE_EXTENSION
|
|||
COMMON_DEVICE_EXTENSION Common;
|
||||
// Functional device object
|
||||
PDEVICE_OBJECT Fdo;
|
||||
// PCI bus number
|
||||
ULONG BusNumber;
|
||||
// PCI slot number
|
||||
PCI_SLOT_NUMBER SlotNumber;
|
||||
// Pointer to PCI Device informations
|
||||
PPCI_DEVICE PciDevice;
|
||||
// Device ID
|
||||
UNICODE_STRING DeviceID;
|
||||
// Instance ID
|
||||
|
@ -72,13 +68,15 @@ typedef struct _PDO_DEVICE_EXTENSION
|
|||
UNICODE_STRING DeviceDescription;
|
||||
// Textual description of device location
|
||||
UNICODE_STRING DeviceLocation;
|
||||
} __attribute((packed)) PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
||||
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
||||
|
||||
/* Functional Device Object device extension for the PCI driver device object */
|
||||
typedef struct _FDO_DEVICE_EXTENSION
|
||||
{
|
||||
// Common device data
|
||||
COMMON_DEVICE_EXTENSION Common;
|
||||
// PCI bus number serviced by this FDO
|
||||
ULONG BusNumber;
|
||||
// Current state of the driver
|
||||
PCI_DEVICE_STATE State;
|
||||
// Namespace device list
|
||||
|
@ -89,7 +87,7 @@ typedef struct _FDO_DEVICE_EXTENSION
|
|||
KSPIN_LOCK DeviceListLock;
|
||||
// Lower device object
|
||||
PDEVICE_OBJECT Ldo;
|
||||
} __attribute((packed)) FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
||||
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
||||
|
||||
|
||||
/* fdo.c */
|
||||
|
@ -106,38 +104,32 @@ FdoPowerControl(
|
|||
|
||||
/* pci.c */
|
||||
|
||||
BOOLEAN
|
||||
PciCreateUnicodeString(
|
||||
PUNICODE_STRING Destination,
|
||||
PWSTR Source,
|
||||
POOL_TYPE PoolType);
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateDeviceIDString(
|
||||
PUNICODE_STRING DeviceID,
|
||||
PPCI_DEVICE Device);
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateInstanceIDString(
|
||||
PUNICODE_STRING InstanceID,
|
||||
PPCI_DEVICE Device);
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateHardwareIDsString(
|
||||
PUNICODE_STRING HardwareIDs,
|
||||
PPCI_DEVICE Device);
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateCompatibleIDsString(
|
||||
PUNICODE_STRING HardwareIDs,
|
||||
PPCI_DEVICE Device);
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateDeviceDescriptionString(
|
||||
PUNICODE_STRING DeviceDescription,
|
||||
PPCI_DEVICE Device);
|
||||
|
||||
BOOLEAN
|
||||
NTSTATUS
|
||||
PciCreateDeviceLocationString(
|
||||
PUNICODE_STRING DeviceLocation,
|
||||
PPCI_DEVICE Device);
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
/* $Id$
|
||||
*
|
||||
/*
|
||||
* PROJECT: ReactOS PCI bus driver
|
||||
* FILE: pdo.c
|
||||
* PURPOSE: Child device object dispatch routines
|
||||
|
@ -107,11 +106,8 @@ PdoQueryId(
|
|||
break;
|
||||
|
||||
case BusQueryInstanceID:
|
||||
/* FIXME: RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING flag
|
||||
* needs to be removed once PciCreateInstanceIDString is fixed
|
||||
*/
|
||||
Status = RtlDuplicateUnicodeString(
|
||||
RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE | RTL_DUPLICATE_UNICODE_STRING_ALLOCATE_NULL_STRING,
|
||||
RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE,
|
||||
&DeviceExtension->InstanceID,
|
||||
&String);
|
||||
|
||||
|
@ -149,7 +145,7 @@ PdoQueryBusInformation(
|
|||
{
|
||||
BusInformation->BusTypeGuid = GUID_BUS_TYPE_PCI;
|
||||
BusInformation->LegacyBusType = PCIBus;
|
||||
BusInformation->BusNumber = DeviceExtension->BusNumber;
|
||||
BusInformation->BusNumber = DeviceExtension->PciDevice->BusNumber;
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
@ -176,7 +172,7 @@ PdoQueryCapabilities(
|
|||
return STATUS_UNSUCCESSFUL;
|
||||
|
||||
DeviceCapabilities->UniqueID = FALSE;
|
||||
DeviceCapabilities->Address = DeviceExtension->SlotNumber.u.AsULONG;
|
||||
DeviceCapabilities->Address = DeviceExtension->PciDevice->SlotNumber.u.AsULONG;
|
||||
DeviceCapabilities->UINumber = (ULONG)-1; /* FIXME */
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
|
@ -198,8 +194,8 @@ PdoGetRangeLength(PPDO_DEVICE_EXTENSION DeviceExtension,
|
|||
|
||||
/* Save original value */
|
||||
Size= HalGetBusDataByOffset(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceExtension->SlotNumber.u.AsULONG,
|
||||
DeviceExtension->PciDevice->BusNumber,
|
||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
||||
&OrigValue,
|
||||
Offset,
|
||||
sizeof(ULONG));
|
||||
|
@ -216,8 +212,8 @@ PdoGetRangeLength(PPDO_DEVICE_EXTENSION DeviceExtension,
|
|||
/* Set magic value */
|
||||
NewValue = (ULONG)-1;
|
||||
Size= HalSetBusDataByOffset(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceExtension->SlotNumber.u.AsULONG,
|
||||
DeviceExtension->PciDevice->BusNumber,
|
||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
||||
&NewValue,
|
||||
Offset,
|
||||
sizeof(ULONG));
|
||||
|
@ -229,8 +225,8 @@ PdoGetRangeLength(PPDO_DEVICE_EXTENSION DeviceExtension,
|
|||
|
||||
/* Get the range length */
|
||||
Size= HalGetBusDataByOffset(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceExtension->SlotNumber.u.AsULONG,
|
||||
DeviceExtension->PciDevice->BusNumber,
|
||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
||||
&NewValue,
|
||||
Offset,
|
||||
sizeof(ULONG));
|
||||
|
@ -242,8 +238,8 @@ PdoGetRangeLength(PPDO_DEVICE_EXTENSION DeviceExtension,
|
|||
|
||||
/* Restore original value */
|
||||
Size= HalSetBusDataByOffset(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceExtension->SlotNumber.u.AsULONG,
|
||||
DeviceExtension->PciDevice->BusNumber,
|
||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
||||
&OrigValue,
|
||||
Offset,
|
||||
sizeof(ULONG));
|
||||
|
@ -328,8 +324,8 @@ PdoQueryResourceRequirements(
|
|||
|
||||
/* Get PCI configuration space */
|
||||
Size= HalGetBusData(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceExtension->SlotNumber.u.AsULONG,
|
||||
DeviceExtension->PciDevice->BusNumber,
|
||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
||||
&PciConfig,
|
||||
sizeof(PCI_COMMON_CONFIG));
|
||||
DPRINT("Size %lu\n", Size);
|
||||
|
@ -377,6 +373,8 @@ PdoQueryResourceRequirements(
|
|||
if (Length != 0)
|
||||
ResCount += 2;
|
||||
}
|
||||
if (DeviceExtension->PciDevice->PciConfig.BaseClass == PCI_CLASS_BRIDGE_DEV)
|
||||
ResCount++;
|
||||
}
|
||||
else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_CARDBUS_BRIDGE_TYPE)
|
||||
{
|
||||
|
@ -412,8 +410,8 @@ PdoQueryResourceRequirements(
|
|||
|
||||
ResourceList->ListSize = ListSize;
|
||||
ResourceList->InterfaceType = PCIBus;
|
||||
ResourceList->BusNumber = DeviceExtension->BusNumber,
|
||||
ResourceList->SlotNumber = DeviceExtension->SlotNumber.u.AsULONG,
|
||||
ResourceList->BusNumber = DeviceExtension->PciDevice->BusNumber;
|
||||
ResourceList->SlotNumber = DeviceExtension->PciDevice->SlotNumber.u.AsULONG;
|
||||
ResourceList->AlternativeLists = 1;
|
||||
|
||||
ResourceList->List[0].Version = 1;
|
||||
|
@ -587,6 +585,18 @@ PdoQueryResourceRequirements(
|
|||
}
|
||||
Descriptor++;
|
||||
}
|
||||
if (DeviceExtension->PciDevice->PciConfig.BaseClass == PCI_CLASS_BRIDGE_DEV)
|
||||
{
|
||||
Descriptor->Option = 0; /* Required */
|
||||
Descriptor->Type = CmResourceTypeBusNumber;
|
||||
Descriptor->ShareDisposition = CmResourceShareShared;
|
||||
Descriptor->Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;
|
||||
|
||||
Descriptor->u.BusNumber.MinBusNumber =
|
||||
Descriptor->u.BusNumber.MaxBusNumber = DeviceExtension->PciDevice->PciConfig.u.type1.SubordinateBus;
|
||||
Descriptor->u.BusNumber.Length = 1;
|
||||
Descriptor->u.BusNumber.Reserved = 0;
|
||||
}
|
||||
}
|
||||
else if (PCI_CONFIGURATION_TYPE(&PciConfig) == 2)
|
||||
{
|
||||
|
@ -624,8 +634,8 @@ PdoQueryResources(
|
|||
|
||||
/* Get PCI configuration space */
|
||||
Size= HalGetBusData(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceExtension->SlotNumber.u.AsULONG,
|
||||
DeviceExtension->PciDevice->BusNumber,
|
||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
||||
&PciConfig,
|
||||
sizeof(PCI_COMMON_CONFIG));
|
||||
DPRINT("Size %lu\n", Size);
|
||||
|
@ -703,7 +713,7 @@ PdoQueryResources(
|
|||
|
||||
ResourceList->Count = 1;
|
||||
ResourceList->List[0].InterfaceType = PCIConfiguration;
|
||||
ResourceList->List[0].BusNumber = DeviceExtension->BusNumber;
|
||||
ResourceList->List[0].BusNumber = DeviceExtension->PciDevice->BusNumber;
|
||||
|
||||
PartialList = &ResourceList->List[0].PartialResourceList;
|
||||
PartialList->Version = 0;
|
||||
|
@ -838,8 +848,8 @@ PdoReadConfig(
|
|||
|
||||
/* Get PCI configuration space */
|
||||
Size= HalGetBusDataByOffset(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceExtension->SlotNumber.u.AsULONG,
|
||||
DeviceExtension->PciDevice->BusNumber,
|
||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
||||
IrpSp->Parameters.ReadWriteConfig.Buffer,
|
||||
IrpSp->Parameters.ReadWriteConfig.Offset,
|
||||
IrpSp->Parameters.ReadWriteConfig.Length);
|
||||
|
@ -876,8 +886,8 @@ PdoWriteConfig(
|
|||
|
||||
/* Get PCI configuration space */
|
||||
Size= HalSetBusDataByOffset(PCIConfiguration,
|
||||
DeviceExtension->BusNumber,
|
||||
DeviceExtension->SlotNumber.u.AsULONG,
|
||||
DeviceExtension->PciDevice->BusNumber,
|
||||
DeviceExtension->PciDevice->SlotNumber.u.AsULONG,
|
||||
IrpSp->Parameters.ReadWriteConfig.Buffer,
|
||||
IrpSp->Parameters.ReadWriteConfig.Offset,
|
||||
IrpSp->Parameters.ReadWriteConfig.Length);
|
||||
|
|
Loading…
Reference in a new issue