Author: cgutman Date: Sat Feb 11 05:15:25 2012 New Revision: 55539
URL: http://svn.reactos.org/svn/reactos?rev=55539&view=rev Log: [PCIX] - Ignore invalid extended capabilities pointer - Don't hang on unimplemented IRPs that we actually use
Modified: branches/usb-bringup-trunk/drivers/bus/pcix/enum.c branches/usb-bringup-trunk/drivers/bus/pcix/fdo.c branches/usb-bringup-trunk/drivers/bus/pcix/pdo.c
Modified: branches/usb-bringup-trunk/drivers/bus/pcix/enum.c URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/bus/pc... ============================================================================== --- branches/usb-bringup-trunk/drivers/bus/pcix/enum.c [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/bus/pcix/enum.c [iso-8859-1] Sat Feb 11 05:15:25 2012 @@ -1196,71 +1196,79 @@ CapPtr = PciData->u.type0.CapabilitiesPtr; }
- /* Make sure the pointer is spec-aligned and located, and save it */ - DPRINT1("Device has capabilities at: %lx\n", CapPtr); - ASSERT(((CapPtr & 0x3) == 0) && (CapPtr >= PCI_COMMON_HDR_LENGTH)); - PdoExtension->CapabilitiesPtr = CapPtr; - - /* Check for PCI-to-PCI Bridges and AGP bridges */ - if ((PdoExtension->BaseClass == PCI_CLASS_BRIDGE_DEV) && - ((PdoExtension->SubClass == PCI_SUBCLASS_BR_HOST) || - (PdoExtension->SubClass == PCI_SUBCLASS_BR_PCI_TO_PCI))) - { - /* Query either the raw AGP capabilitity, or the Target AGP one */ - TargetAgpCapabilityId = (PdoExtension->SubClass == - PCI_SUBCLASS_BR_PCI_TO_PCI) ? - PCI_CAPABILITY_ID_AGP_TARGET : - PCI_CAPABILITY_ID_AGP; - if (PciReadDeviceCapability(PdoExtension, - PdoExtension->CapabilitiesPtr, - TargetAgpCapabilityId, - &AgpCapability, - sizeof(PCI_CAPABILITIES_HEADER))) - { - /* AGP target ID was found, store it */ - DPRINT1("AGP ID: %lx\n", TargetAgpCapabilityId); - PdoExtension->TargetAgpCapabilityId = TargetAgpCapabilityId; - } - } - - /* Check for devices that are known not to have proper power management */ - if (!(PdoExtension->HackFlags & PCI_HACK_NO_PM_CAPS)) - { - /* Query if this device supports power management */ - if (!PciReadDeviceCapability(PdoExtension, - PdoExtension->CapabilitiesPtr, - PCI_CAPABILITY_ID_POWER_MANAGEMENT, - &PowerCapabilities.Header, - sizeof(PCI_PM_CAPABILITY))) - { - /* No power management, so act as if it had the hackflag set */ - DPRINT1("No PM caps, disabling PM\n"); - PdoExtension->HackFlags |= PCI_HACK_NO_PM_CAPS; - } - else - { - /* Otherwise, pick the highest wake level that is supported */ - WakeLevel = PowerDeviceUnspecified; - if (PowerCapabilities.PMC.Capabilities.Support.PMED0) - WakeLevel = PowerDeviceD0; - if (PowerCapabilities.PMC.Capabilities.Support.PMED1) - WakeLevel = PowerDeviceD1; - if (PowerCapabilities.PMC.Capabilities.Support.PMED2) - WakeLevel = PowerDeviceD2; - if (PowerCapabilities.PMC.Capabilities.Support.PMED3Hot) - WakeLevel = PowerDeviceD3; - if (PowerCapabilities.PMC.Capabilities.Support.PMED3Cold) - WakeLevel = PowerDeviceD3; - PdoExtension->PowerState.DeviceWakeLevel = WakeLevel; - - /* Convert the PCI power state to the NT power state */ - PdoExtension->PowerState.CurrentDeviceState = + /* Skip garbage capabilities pointer */ + if (((CapPtr & 0x3) != 0) || (CapPtr < PCI_COMMON_HDR_LENGTH)) + { + /* Report no extended capabilities */ + PdoExtension->CapabilitiesPtr = 0; + PdoExtension->HackFlags |= PCI_HACK_NO_PM_CAPS; + } + else + { + DPRINT1("Device has capabilities at: %lx\n", CapPtr); + PdoExtension->CapabilitiesPtr = CapPtr; + + /* Check for PCI-to-PCI Bridges and AGP bridges */ + if ((PdoExtension->BaseClass == PCI_CLASS_BRIDGE_DEV) && + ((PdoExtension->SubClass == PCI_SUBCLASS_BR_HOST) || + (PdoExtension->SubClass == PCI_SUBCLASS_BR_PCI_TO_PCI))) + { + /* Query either the raw AGP capabilitity, or the Target AGP one */ + TargetAgpCapabilityId = (PdoExtension->SubClass == + PCI_SUBCLASS_BR_PCI_TO_PCI) ? + PCI_CAPABILITY_ID_AGP_TARGET : + PCI_CAPABILITY_ID_AGP; + if (PciReadDeviceCapability(PdoExtension, + PdoExtension->CapabilitiesPtr, + TargetAgpCapabilityId, + &AgpCapability, + sizeof(PCI_CAPABILITIES_HEADER))) + { + /* AGP target ID was found, store it */ + DPRINT1("AGP ID: %lx\n", TargetAgpCapabilityId); + PdoExtension->TargetAgpCapabilityId = TargetAgpCapabilityId; + } + } + + /* Check for devices that are known not to have proper power management */ + if (!(PdoExtension->HackFlags & PCI_HACK_NO_PM_CAPS)) + { + /* Query if this device supports power management */ + if (!PciReadDeviceCapability(PdoExtension, + PdoExtension->CapabilitiesPtr, + PCI_CAPABILITY_ID_POWER_MANAGEMENT, + &PowerCapabilities.Header, + sizeof(PCI_PM_CAPABILITY))) + { + /* No power management, so act as if it had the hackflag set */ + DPRINT1("No PM caps, disabling PM\n"); + PdoExtension->HackFlags |= PCI_HACK_NO_PM_CAPS; + } + else + { + /* Otherwise, pick the highest wake level that is supported */ + WakeLevel = PowerDeviceUnspecified; + if (PowerCapabilities.PMC.Capabilities.Support.PMED0) + WakeLevel = PowerDeviceD0; + if (PowerCapabilities.PMC.Capabilities.Support.PMED1) + WakeLevel = PowerDeviceD1; + if (PowerCapabilities.PMC.Capabilities.Support.PMED2) + WakeLevel = PowerDeviceD2; + if (PowerCapabilities.PMC.Capabilities.Support.PMED3Hot) + WakeLevel = PowerDeviceD3; + if (PowerCapabilities.PMC.Capabilities.Support.PMED3Cold) + WakeLevel = PowerDeviceD3; + PdoExtension->PowerState.DeviceWakeLevel = WakeLevel; + + /* Convert the PCI power state to the NT power state */ + PdoExtension->PowerState.CurrentDeviceState = PowerCapabilities.PMCSR.ControlStatus.PowerState + 1;
- /* Save all the power capabilities */ - PdoExtension->PowerCapabilities = PowerCapabilities.PMC.Capabilities; - DPRINT1("PM Caps Found! Wake Level: %d Power State: %d\n", - WakeLevel, PdoExtension->PowerState.CurrentDeviceState); + /* Save all the power capabilities */ + PdoExtension->PowerCapabilities = PowerCapabilities.PMC.Capabilities; + DPRINT1("PM Caps Found! Wake Level: %d Power State: %d\n", + WakeLevel, PdoExtension->PowerState.CurrentDeviceState); + } } } }
Modified: branches/usb-bringup-trunk/drivers/bus/pcix/fdo.c URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/bus/pc... ============================================================================== --- branches/usb-bringup-trunk/drivers/bus/pcix/fdo.c [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/bus/pcix/fdo.c [iso-8859-1] Sat Feb 11 05:15:25 2012 @@ -127,7 +127,6 @@ IN PPCI_FDO_EXTENSION DeviceExtension) { UNIMPLEMENTED; - while (TRUE); return STATUS_NOT_SUPPORTED; }
Modified: branches/usb-bringup-trunk/drivers/bus/pcix/pdo.c URL: http://svn.reactos.org/svn/reactos/branches/usb-bringup-trunk/drivers/bus/pc... ============================================================================== --- branches/usb-bringup-trunk/drivers/bus/pcix/pdo.c [iso-8859-1] (original) +++ branches/usb-bringup-trunk/drivers/bus/pcix/pdo.c [iso-8859-1] Sat Feb 11 05:15:25 2012 @@ -91,7 +91,6 @@ IN PPCI_PDO_EXTENSION DeviceExtension) { UNIMPLEMENTED; - while (TRUE); return STATUS_NOT_SUPPORTED; }
@@ -210,7 +209,6 @@ IN PPCI_PDO_EXTENSION DeviceExtension) { UNIMPLEMENTED; - while (TRUE); return STATUS_NOT_SUPPORTED; }
@@ -429,7 +427,6 @@ IN PPCI_PDO_EXTENSION DeviceExtension) { UNIMPLEMENTED; - while (TRUE); return STATUS_NOT_SUPPORTED; }