[ros-diffs] [cgutman] 55540: [PCI] - Set device command flags when starting the PCI device PDO

cgutman at svn.reactos.org cgutman at svn.reactos.org
Sat Feb 11 05:47:56 UTC 2012


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/pci/fdo.c?rev=55540&r1=55539&r2=55540&view=diff
==============================================================================
--- 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/pci/pci.h?rev=55540&r1=55539&r2=55540&view=diff
==============================================================================
--- 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/pci/pdo.c?rev=55540&r1=55539&r2=55540&view=diff
==============================================================================
--- 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




More information about the Ros-diffs mailing list