diff --git a/src/windows/wdfserial/QCMAIN.h b/src/windows/wdfserial/QCMAIN.h index c1c7337..7dafa03 100644 --- a/src/windows/wdfserial/QCMAIN.h +++ b/src/windows/wdfserial/QCMAIN.h @@ -261,6 +261,7 @@ typedef struct _DEVICE_CONTEXT BOOLEAN InServiceSelectiveSuspension; ULONG SelectiveSuspendIdleTime; BOOLEAN SelectiveSuspendInMiliSeconds; + WDF_POWER_POLICY_S0_IDLE_CAPABILITIES AssignedIdleCaps; WMILIB_CONTEXT WmiLibInfo; // to query system power management tab CHAR DevSerialNumber[256]; // to hold USB_STRING_DESCRIPTOR of the serial number diff --git a/src/windows/wdfserial/QCPNP.c b/src/windows/wdfserial/QCPNP.c index 99fa4a4..ab0da7b 100644 --- a/src/windows/wdfserial/QCPNP.c +++ b/src/windows/wdfserial/QCPNP.c @@ -2107,6 +2107,7 @@ NTSTATUS QCPNP_EnableSelectiveSuspend { idleSettings.IdleTimeout *= 1000; } + idleSettings.Enabled = WdfTrue; // explicitly enable SS (overrides any user/registry disable) status = WdfDeviceAssignS0IdleSettings(Device, &idleSettings); if (status == STATUS_POWER_STATE_INVALID) { @@ -2129,6 +2130,8 @@ NTSTATUS QCPNP_EnableSelectiveSuspend ); } + pDevContext->AssignedIdleCaps = idleSettings.IdleCaps; + return status; } @@ -2159,8 +2162,14 @@ NTSTATUS QCPNP_DisableSelectiveSuspend ("<%ws> QCPNP_DisableSelectiveSuspend\n", pDevContext->PortName) ); - WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(&idleSettings, IdleCannotWakeFromS0); + WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT( + &idleSettings, + (pDevContext->AssignedIdleCaps != IdleCapsInvalid) + ? pDevContext->AssignedIdleCaps + : IdleCannotWakeFromS0 + ); idleSettings.Enabled = WdfFalse; + idleSettings.UserControlOfIdleSettings = IdleAllowUserControl; return WdfDeviceAssignS0IdleSettings(Device, &idleSettings); }