Author: cgutman Date: Sat Feb 11 05:47:56 2012 New Revision: 55540
URL: http://svn.reactos.org/svn/reactos?rev=55540&view=rev Log: [PCI] - Set device command flags when starting the PCI device PDO
Modified: branches/usb-bringup-trunk/drivers/bus/pci/fdo.c branches/usb-bringup-trunk/drivers/bus/pci/pci.h branches/usb-bringup-trunk/drivers/bus/pci/pdo.c
Modified: branches/usb-bringup-trunk/drivers/bus/pci/fdo.c URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/bus/pc... ============================================================================== --- branches/usb-bringup-trunk/drivers/bus/pci/fdo.c [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/bus/pci/fdo.c [iso-8859-1] Sat Feb 11 05:47:56 2012 @@ -341,15 +341,13 @@ } }
- if (!Device->RemovePending) { - /* Reference the physical device object. The PnP manager - will dereference it again when it is no longer needed */ - ObReferenceObject(Device->Pdo); - - Relations->Objects[i] = Device->Pdo; - - i++; - } + /* Reference the physical device object. The PnP manager + will dereference it again when it is no longer needed */ + ObReferenceObject(Device->Pdo); + + Relations->Objects[i] = Device->Pdo; + + i++;
CurrentEntry = CurrentEntry->Flink; }
Modified: branches/usb-bringup-trunk/drivers/bus/pci/pci.h URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/bus/pc... ============================================================================== --- branches/usb-bringup-trunk/drivers/bus/pci/pci.h [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/bus/pci/pci.h [iso-8859-1] Sat Feb 11 05:47:56 2012 @@ -17,8 +17,12 @@ PCI_SLOT_NUMBER SlotNumber; // PCI configuration data PCI_COMMON_CONFIG PciConfig; - // Flag used during enumeration to locate removed devices - BOOLEAN RemovePending; + // Enable memory space + BOOLEAN EnableMemorySpace; + // Enable I/O space + BOOLEAN EnableIoSpace; + // Enable bus master + BOOLEAN EnableBusMaster; } PCI_DEVICE, *PPCI_DEVICE;
Modified: branches/usb-bringup-trunk/drivers/bus/pci/pdo.c URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/bus/pc... ============================================================================== --- branches/usb-bringup-trunk/drivers/bus/pci/pdo.c [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/bus/pci/pdo.c [iso-8859-1] Sat Feb 11 05:47:56 2012 @@ -766,6 +766,9 @@ Descriptor->u.Port.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Port.Length = Length; + + /* Enable IO space access */ + DeviceExtension->PciDevice->EnableIoSpace = TRUE; } else { @@ -775,6 +778,9 @@ Descriptor->u.Memory.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Memory.Length = Length; + + /* Enable memory space access */ + DeviceExtension->PciDevice->EnableMemorySpace = TRUE; }
Descriptor++; @@ -792,6 +798,9 @@ Descriptor->u.Interrupt.Vector = PciConfig.u.type0.InterruptLine; Descriptor->u.Interrupt.Affinity = 0xFFFFFFFF; } + + /* Allow bus master mode */ + DeviceExtension->PciDevice->EnableBusMaster = TRUE; } else if (PCI_CONFIGURATION_TYPE(&PciConfig) == PCI_BRIDGE_TYPE) { @@ -821,6 +830,9 @@ Descriptor->u.Port.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Port.Length = Length; + + /* Enable IO space access */ + DeviceExtension->PciDevice->EnableIoSpace = TRUE; } else { @@ -830,6 +842,9 @@ Descriptor->u.Memory.Start.QuadPart = (ULONGLONG)Base; Descriptor->u.Memory.Length = Length; + + /* Enable memory space access */ + DeviceExtension->PciDevice->EnableMemorySpace = TRUE; }
Descriptor++; @@ -1206,45 +1221,86 @@ IN PIRP Irp, PIO_STACK_LOCATION IrpSp) { - PCM_RESOURCE_LIST RawResList = IrpSp->Parameters.StartDevice.AllocatedResources; - PCM_FULL_RESOURCE_DESCRIPTOR RawFullDesc; - PCM_PARTIAL_RESOURCE_DESCRIPTOR RawPartialDesc; - ULONG i, ii; - PPDO_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; - UCHAR Irq; - - if (!RawResList) - return STATUS_SUCCESS; - - /* TODO: Assign the other resources we get to the card */ - - for (i = 0; i < RawResList->Count; i++) - { - RawFullDesc = &RawResList->List[i]; - - for (ii = 0; ii < RawFullDesc->PartialResourceList.Count; ii++) - { - RawPartialDesc = &RawFullDesc->PartialResourceList.PartialDescriptors[ii]; - - if (RawPartialDesc->Type == CmResourceTypeInterrupt) - { - DPRINT1("Assigning IRQ %x to PCI device (%x, %x)\n", - RawPartialDesc->u.Interrupt.Vector, - DeviceExtension->PciDevice->SlotNumber.u.AsULONG, - DeviceExtension->PciDevice->BusNumber); - - Irq = (UCHAR)RawPartialDesc->u.Interrupt.Vector; - HalSetBusDataByOffset(PCIConfiguration, - DeviceExtension->PciDevice->BusNumber, - DeviceExtension->PciDevice->SlotNumber.u.AsULONG, - &Irq, - 0x3c /* PCI_INTERRUPT_LINE */, - sizeof(UCHAR)); - } - } - } - - return STATUS_SUCCESS; + PCM_RESOURCE_LIST RawResList = IrpSp->Parameters.StartDevice.AllocatedResources; + PCM_FULL_RESOURCE_DESCRIPTOR RawFullDesc; + PCM_PARTIAL_RESOURCE_DESCRIPTOR RawPartialDesc; + ULONG i, ii; + PPDO_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension; + UCHAR Irq; + USHORT Command; + + if (!RawResList) + return STATUS_SUCCESS; + + /* TODO: Assign the other resources we get to the card */ + + for (i = 0; i < RawResList->Count; i++) + { + RawFullDesc = &RawResList->List[i]; + + for (ii = 0; ii < RawFullDesc->PartialResourceList.Count; ii++) + { + RawPartialDesc = &RawFullDesc->PartialResourceList.PartialDescriptors[ii]; + + if (RawPartialDesc->Type == CmResourceTypeInterrupt) + { + DPRINT1("Assigning IRQ %d to PCI device 0x%x on bus 0x%x\n", + RawPartialDesc->u.Interrupt.Vector, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + DeviceExtension->PciDevice->BusNumber); + + Irq = (UCHAR)RawPartialDesc->u.Interrupt.Vector; + HalSetBusDataByOffset(PCIConfiguration, + DeviceExtension->PciDevice->BusNumber, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + &Irq, + 0x3c /* PCI_INTERRUPT_LINE */, + sizeof(UCHAR)); + } + } + } + + DPRINT1("Enabling command flags for PCI device 0x%x on bus 0x%x: ", + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + DeviceExtension->PciDevice->BusNumber); + if (DeviceExtension->PciDevice->EnableBusMaster) + { + Command |= PCI_ENABLE_BUS_MASTER; + DbgPrint("[Bus master] "); + } + + if (DeviceExtension->PciDevice->EnableMemorySpace) + { + Command |= PCI_ENABLE_MEMORY_SPACE; + DbgPrint("[Memory space enable] "); + } + + if (DeviceExtension->PciDevice->EnableIoSpace) + { + Command |= PCI_ENABLE_IO_SPACE; + DbgPrint("[I/O space enable] "); + } + + if (Command != 0) + { + DbgPrint("\n"); + + /* OR with the previous value */ + Command |= DeviceExtension->PciDevice->PciConfig.Command; + + HalSetBusDataByOffset(PCIConfiguration, + DeviceExtension->PciDevice->BusNumber, + DeviceExtension->PciDevice->SlotNumber.u.AsULONG, + &Command, + FIELD_OFFSET(PCI_COMMON_CONFIG, Command), + sizeof(USHORT)); + } + else + { + DbgPrint("None\n"); + } + + return STATUS_SUCCESS; }
static NTSTATUS