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/p…
==============================================================================
--- 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/p…
==============================================================================
--- 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/p…
==============================================================================
--- 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