USB 선택적 일시 중단
참고 항목
이 문서는 디바이스 드라이버 개발자를 위한 것입니다. USB 디바이스에 어려움이 있는 경우 Windows에서 USB-C 문제 해결을 참조 하세요.
USB 선택적 일시 중단 기능을 사용하면 허브 드라이버가 허브의 다른 포트 작업에 영향을 주지 않고 개별 포트를 일시 중단할 수 있습니다. USB 장치의 선택적 일시 중단은 배터리 전원을 절약하는 데 도움이 되므로 휴대용 컴퓨터에서 특히 유용합니다. 지문 판독기 및 기타 종류의 생체 인식 스캐너와 같은 많은 디바이스는 간헐적으로만 전원이 필요합니다. 디바이스를 사용하지 않을 때 이러한 디바이스를 일시 중단하면 전체 전력 소비가 줄어듭니다. 더 중요한 것은 선택적으로 일시 중단되지 않은 디바이스는 USB 호스트 컨트롤러가 시스템 메모리에 있는 전송 일정을 사용하지 않도록 설정하는 것을 방지할 수 있다는 것입니다. 호스트 컨트롤러가 스케줄러로 DMA(직접 메모리 액세스)를 전송하면 시스템 프로세서가 C3와 같은 더 깊은 절전 모드로 들어가지 못하게 할 수 있습니다.
USB 디바이스를 선택적으로 일시 중단하기 위한 두 가지 메커니즘은 유휴 요청 IRP(IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) 및 전원 IRP(IRP_MN_SET_POWER) 설정입니다. 사용하는 메커니즘은 운영 체제 및 디바이스 유형(복합 또는 비 복합)에 따라 달라집니다.
선택적 일시 중단 메커니즘 선택
클라이언트 드라이버는 대기 절전 모드 해제 IRP(IRP_MN_WAIT_WAKE)를 사용하여 원격 절전 모드 해제에 대한 인터페이스를 사용하도록 설정하는 복합 디바이스의 인터페이스에 대해 유휴 요청 IRP(IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION) 메커니즘을 사용하여 디바이스를 선택적으로 일시 중단해야 합니다.
원격 절식에 대한 자세한 내용은 다음을 참조하세요.
Windows 운영 체제 버전은 비 복합 디바이스의 드라이버가 선택적 일시 중단을 사용하도록 설정하는 방법을 결정합니다.
- Windows XP: Windows XP에서 모든 클라이언트 드라이버는 유휴 요청 IRP(IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION)를 사용하여 디바이스 전원을 켭니다. 클라이언트 드라이버는 WDM 전원 IRP를 사용하여 디바이스를 선택적으로 일시 중단해서는 안됩니다. 이렇게 하면 다른 디바이스가 선택적으로 일시 중단되지 않습니다.
- Windows Vista 이상 버전의 Windows: 드라이버 작성기는 Windows Vista 및 이후 버전의 Windows에서 디바이스 전원을 공급하기 위해 더 많은 선택을 할 수 있습니다. Windows Vista는 Windows 유휴 요청 IRP 메커니즘을 지원하지만 드라이버는 이 메커니즘을 사용할 필요가 없습니다.
다음 표에서는 유휴 요청 IRP를 사용해야 하는 시나리오와 WDM 전원 IRP를 사용하여 USB 디바이스를 일시 중단할 수 있는 시나리오를 보여 줍니다.
Windows 버전 | 절전 모드 해제를 위해 무장한 복합 디바이스의 함수 | 절전 모드 해제를 위해 무장하지 않은 복합 디바이스의 함수 | 단일 인터페이스 USB 디바이스 |
---|---|---|---|
Windows 7 | 유휴 요청 IRP 사용 | WDM 전원 IRP 사용 | WDM 전원 IRP 사용 |
Windows Server 2008 | 유휴 요청 IRP 사용 | WDM 전원 IRP 사용 | WDM 전원 IRP 사용 |
Windows Vista | 유휴 요청 IRP 사용 | WDM 전원 IRP 사용 | WDM 전원 IRP 사용 |
Windows Server 2003 | 유휴 요청 IRP 사용 | 유휴 요청 IRP 사용 | 유휴 요청 IRP 사용 |
Windows XP | 유휴 요청 IRP 사용 | 유휴 요청 IRP 사용 | 유휴 요청 IRP 사용 |
이 섹션에서는 Windows 선택적 일시 중단 메커니즘에 대해 설명합니다.
USB 유휴 요청 IRP 보내기
디바이스가 유휴 상태가 되면 클라이언트 드라이버는 유휴 요청 IRP(IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION)를 전송하여 버스 드라이버에 알릴 수 있습니다. 버스 드라이버가 디바이스를 저전력 상태로 두는 것이 안전하다고 판단한 후 클라이언트 디바이스 드라이버가 유휴 요청 IRP를 사용하여 스택을 전달한 콜백 루틴을 호출합니다.
콜백 루틴에서 클라이언트 드라이버는 보류 중인 모든 I/O 작업을 취소하고 모든 USB I/O IRP가 완료되기를 기다려야 합니다. 그런 다음 IRP_MN_SET_POWER 요청을 실행하여 WDM 디바이스 전원 상태를 D2로 변경할 수 있습니다. 콜백 루틴은 반환하기 전에 D2 요청이 완료되기를 기다려야 합니다. 유휴 알림 콜백 루틴에 대한 자세한 내용은 "USB 유휴 알림 콜백 루틴"을 참조하세요.
버스 드라이버는 유휴 알림 콜백 루틴을 호출한 후 유휴 요청 IRP를 완료하지 않습니다. 대신 버스 드라이버는 다음 조건 중 하나가 충족될 때까지 보류 중인 유휴 요청 IRP를 보유합니다.
- IRP_MN_SUPRISE_REMOVAL 또는 IRP_MN_REMOVE_DEVICE IRP가 수신됩니다. 이러한 IRP 중 하나가 수신되면 유휴 요청 IRP가 STATUS_CANCELLED 완료됩니다.
- 버스 드라이버는 디바이스를 작동 전원 상태(D0)로 전환하라는 요청을 받습니다. 이 요청 버스 드라이버를 받으면 보류 중인 유휴 요청 IRP가 STATUS_SUCCESS 완료됩니다.
유휴 요청 IRP 사용에는 다음과 같은 제한 사항이 적용됩니다.
- 유휴 요청 IRP를 보낼 때 드라이버는 디바이스 전원 상태 D0 에 있어야 합니다.
- 드라이버는 디바이스 스택당 하나의 유휴 요청 IRP만 보내야 합니다.
다음 WDM 예제 코드는 디바이스 드라이버가 USB 유휴 요청 IRP를 보내는 데 걸리는 단계를 보여 줍니다. 오류 검사는 다음 코드 예제에서 생략되었습니다.
IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION IRP 할당 및 초기화
irp = IoAllocateIrp (DeviceContext->TopOfStackDeviceObject->StackSize, FALSE); nextStack = IoGetNextIrpStackLocation (irp); nextStack->MajorFunction = IRP_MJ_INTERNAL_DEVICE_CONTROL; nextStack->Parameters.DeviceIoControl.IoControlCode = IOCTL_INTERNAL_USB_SUBMIT_IDLE_NOTIFICATION; nextStack->Parameters.DeviceIoControl.InputBufferLength = sizeof(struct _USB_IDLE_CALLBACK_INFO);
유휴 요청 정보 구조(USB_IDLE_CALLBACK_INFO)를 할당하고 초기화합니다.
idleCallbackInfo = ExAllocatePool (NonPagedPool, sizeof(struct _USB_IDLE_CALLBACK_INFO)); idleCallbackInfo->IdleCallback = IdleNotificationCallback; // Put a pointer to the device extension in member IdleContext idleCallbackInfo->IdleContext = (PVOID) DeviceExtension; nextStack->Parameters.DeviceIoControl.Type3InputBuffer = idleCallbackInfo;
완료 루틴을 설정합니다.
클라이언트 드라이버는 완료 루틴을 유휴 요청 IRP와 연결해야 합니다. 유휴 알림 완료 루틴 및 예제 코드에 대한 자세한 내용은 "USB 유휴 요청 IRP 완료 루틴"을 참조하세요.
IoSetCompletionRoutine (irp, IdleNotificationRequestComplete, DeviceContext, TRUE, TRUE, TRUE);
디바이스 확장에 유휴 요청을 저장합니다.
deviceExtension->PendingIdleIrp = irp;
부모 드라이버에 유휴 요청을 보냅니다.
ntStatus = IoCallDriver (DeviceContext->TopOfStackDeviceObject, irp);
USB 유휴 요청 취소
특정 상황에서 디바이스 드라이버는 버스 드라이버에 제출된 유휴 요청 IRP를 취소해야 할 수 있습니다. 디바이스가 제거되거나, 유휴 상태에서 유휴 요청을 보낸 후 활성화되거나, 전체 시스템이 낮은 시스템 전원 상태로 전환되는 경우에 발생할 수 있습니다.
클라이언트 드라이버는 IoCancelIrp를 호출하여 유휴 IRP를 취소합니다. 다음 표에서는 유휴 IRP를 취소하는 세 가지 시나리오를 설명하고 드라이버가 수행해야 하는 작업을 지정합니다.
시나리오 | 유휴 요청 취소 메커니즘 |
---|---|
클라이언트 드라이버가 유휴 IRP를 취소했으며 USB 드라이버 스택이 "USB 유휴 알림 콜백 루틴"이라고 하지 않았습니다. | USB 드라이버 스택은 유휴 IRP를 완료합니다. 디바이스가 D0을 떠난 적이 없으므로 드라이버는 디바이스 상태를 변경하지 않습니다. |
클라이언트 드라이버가 유휴 IRP를 취소하고 USB 드라이버 스택이 USB 유휴 알림 콜백 루틴을 호출했으며 아직 반환되지 않았습니다. | 클라이언트 드라이버가 IRP에서 취소를 호출한 경우에도 USB 유휴 알림 콜백 루틴이 호출될 수 있습니다. 이 경우 클라이언트 드라이버의 콜백 루틴은 디바이스를 동기적으로 더 낮은 전원 상태로 전송하여 디바이스의 전원을 닫아야 합니다. 디바이스가 낮은 전원 상태인 경우 클라이언트 드라이버는 D0 요청을 보낼 수 있습니다. 또는 드라이버가 USB 드라이버 스택이 유휴 IRP를 완료할 때까지 기다린 다음 D0 IRP를 보낼 수 있습니다. 전원 IRP를 할당할 메모리 부족으로 인해 콜백 루틴이 디바이스를 저전력 상태로 전환할 수 없는 경우 유휴 IRP를 취소하고 즉시 종료해야 합니다. 유휴 IRP는 콜백 루틴이 반환될 때까지 완료되지 않습니다. 따라서 콜백 루틴은 취소된 유휴 IRP가 완료될 때까지 기다리는 것을 차단해서는 안 됩니다. |
디바이스가 이미 저전력 상태입니다. | 디바이스가 이미 저전력 상태인 경우 클라이언트 드라이버는 D0 IRP를 보낼 수 있습니다. USB 드라이버 스택은 STATUS_SUCCESS 사용하여 유휴 요청 IRP를 완료합니다. 또는 드라이버가 유휴 IRP를 취소하고 USB 드라이버 스택이 유휴 IRP를 완료할 때까지 기다린 다음 D0 IRP를 보낼 수 있습니다. |
USB 유휴 요청 IRP 완료 루틴
대부분의 경우 버스 드라이버는 드라이버의 유휴 요청 IRP 완료 루틴을 호출할 수 있습니다. 이 경우 클라이언트 드라이버는 버스 드라이버가 IRP를 완료한 이유를 감지해야 합니다. 반환된 상태 코드는 이 정보를 제공할 수 있습니다. 상태 코드가 STATUS_POWER_STATE_INVALID 않은 경우 디바이스가 D0에 아직 없는 경우 드라이버는 디바이스를 D0에 배치해야 합니다. 디바이스가 여전히 유휴 상태이면 드라이버는 다른 유휴 요청 IRP를 제출할 수 있습니다.
참고 항목
유휴 요청 IRP 완료 루틴은 D0 전원 요청이 완료될 때까지 기다리는 것을 차단해서는 안 됩니다. 허브 드라이버에서 전원 IRP의 컨텍스트에서 완료 루틴을 호출할 수 있으며 완료 루틴에서 다른 전원 IRP를 차단하면 교착 상태가 발생할 수 있습니다.
다음 목록은 유휴 요청에 대한 완료 루틴이 몇 가지 일반적인 상태 코드를 해석하는 방법을 나타냅니다.
상태 코드 | 설명 |
---|---|
STATUS_SUCCESS | 디바이스가 더 이상 일시 중단되지 않음을 나타냅니다. 그러나 드라이버는 디바이스의 전원이 켜졌는지 확인하고 D0에 아직 없는 경우 D0에 넣어야 합니다. |
STATUS_CANCELLED | 버스 드라이버는 다음과 같은 상황에서 STATUS_CANCELLED 유휴 요청 IRP를 완료합니다.
|
STATUS_POWER_STATE_INVALID | 디바이스 드라이버가 해당 디바이스에 대해 D3 전원 상태를 요청했음을 나타냅니다. 이 경우 버스 드라이버는 보류 중인 모든 유휴 IRP를 STATUS_POWER_STATE_INVALID 완료합니다. |
STATUS_DEVICE_BUSY | 버스 드라이버가 디바이스에 대해 보류 중인 유휴 요청 IRP를 이미 보유하고 있음을 나타냅니다. 지정된 디바이스에 대해 한 번에 하나의 유휴 IRP만 보류할 수 있습니다. 여러 유휴 요청 IRP를 제출하는 것은 전원 정책 소유자의 오류이며 드라이버 작성기에서 해결해야 합니다. |
다음 코드 예제에서는 유휴 요청 완료 루틴에 대한 샘플 구현을 보여줍니다.
/*Routine Description:
Completion routine for idle notification IRP
Arguments:
DeviceObject - pointer to device object
Irp - I/O request packet
DeviceExtension - pointer to device extension
Return Value:
NT status value
--*/
NTSTATUS
IdleNotificationRequestComplete(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp,
IN PDEVICE_EXTENSION DeviceExtension
)
{
NTSTATUS ntStatus;
POWER_STATE powerState;
PUSB_IDLE_CALLBACK_INFO idleCallbackInfo;
ntStatus = Irp->IoStatus.Status;
if(!NT_SUCCESS(ntStatus) && ntStatus != STATUS_NOT_SUPPORTED)
{
//Idle IRP completes with error.
switch(ntStatus)
{
case STATUS_INVALID_DEVICE_REQUEST:
//Invalid request.
break;
case STATUS_CANCELLED:
//1. The device driver canceled the IRP.
//2. A system power state change is required.
break;
case STATUS_POWER_STATE_INVALID:
// Device driver requested a D3 power state for its device
// Release the allocated resources.
goto IdleNotificationRequestComplete_Exit;
case STATUS_DEVICE_BUSY:
//The bus driver already holds an idle IRP pending for the device.
break;
default:
break;
}
// If IRP completes with error, issue a SetD0
//Increment the I/O count because
//a new IRP is dispatched for the driver.
//This call is not shown.
powerState.DeviceState = PowerDeviceD0;
// Issue a new IRP
PoRequestPowerIrp (
DeviceExtension->PhysicalDeviceObject,
IRP_MN_SET_POWER,
powerState,
(PREQUEST_POWER_COMPLETE) PoIrpCompletionFunc,
DeviceExtension,
NULL);
}
IdleNotificationRequestComplete_Exit:
idleCallbackInfo = DeviceExtension->IdleCallbackInfo;
DeviceExtension->IdleCallbackInfo = NULL;
DeviceExtension->PendingIdleIrp = NULL;
InterlockedExchange(&DeviceExtension->IdleReqPend, 0);
if(idleCallbackInfo)
{
ExFreePool(idleCallbackInfo);
}
DeviceExtension->IdleState = IdleComplete;
// Because the IRP was created using IoAllocateIrp,
// the IRP needs to be released by calling IoFreeIrp.
// Also return STATUS_MORE_PROCESSING_REQUIRED so that
// the kernel does not reference this.
IoFreeIrp(Irp);
KeSetEvent(&DeviceExtension->IdleIrpCompleteEvent, IO_NO_INCREMENT, FALSE);
return STATUS_MORE_PROCESSING_REQUIRED;
}
USB 유휴 알림 콜백 루틴
버스 드라이버(허브 드라이버의 인스턴스 또는 일반 부모 드라이버)는 디바이스의 자식을 일시 중단하는 것이 안전한 시기를 결정합니다. 이 경우 각 자식의 클라이언트 드라이버에서 제공하는 유휴 알림 콜백 루틴을 호출합니다.
USB_IDLE_CALLBACK 함수 프로토타입은 다음과 같습니다.
typedef VOID (*USB_IDLE_CALLBACK)(__in PVOID Context);
디바이스 드라이버는 유휴 알림 콜백 루틴에서 다음 작업을 수행해야 합니다.
- 디바이스가 원격 절전 모드 해제를 위해 무장해야 하는 경우 디바이스에 대한 IRP_MN_WAIT_WAKE IRP를 요청합니다.
- 모든 I/O를 취소하고 디바이스가 더 낮은 전원 상태로 이동하도록 준비합니다.
- PowerState 매개 변수가 열거자 값 PowerDeviceD2(wdm.h; ntddk.h에 정의됨)로 설정된 PoRequestPowerIrp를 호출하여 디바이스를 WDM 절전 모드로 설정합니다. Windows XP에서 드라이버는 디바이스가 원격 절전 모드 해제를 위해 무장하지 않더라도 PowerDeviceD3에 디바이스를 배치해서는 안됩니다.
Windows XP에서 드라이버는 유휴 알림 콜백 루틴을 사용하여 디바이스를 선택적으로 일시 중단해야 합니다. Windows XP에서 실행되는 드라이버가 유휴 알림 콜백 루틴을 사용하지 않고 디바이스를 더 낮은 전원 상태로 직접 배치하는 경우 USB 디바이스 트리의 다른 디바이스가 일시 중단되지 않을 수 있습니다.
허브 드라이버와 USB Usbccgp.sys(일반 부모 드라이버) 모두 IRQL = PASSIVE_LEVEL 유휴 알림 콜백 루틴을 호출합니다. 이렇게 하면 전원 상태 변경 요청이 완료되기를 기다리는 동안 콜백 루틴을 차단할 수 있습니다.
콜백 루틴은 시스템이 S0에 있고 디바이스가 D0에 있는 동안에만 호출됩니다.
유휴 요청 알림 콜백 루틴에는 다음과 같은 제한 사항이 적용됩니다.
- 디바이스 드라이버는 유휴 알림 콜백 루틴에서 D0에서 D2로 디바이스 전원 상태 전환을 시작할 수 있지만 다른 전원 상태 전환은 허용되지 않습니다. 특히 드라이버는 콜백 루틴을 실행하는 동안 디바이스를 D0 으로 변경하려고 시도해서는 안됩니다.
- 디바이스 드라이버는 유휴 알림 콜백 루틴 내에서 둘 이상의 전원 IRP를 요청해서는 안됩니다.
유휴 알림 콜백 루틴에서 절전 모드 해제를 위한 디바이스 무장
유휴 알림 콜백 루틴은 디바이스에 보류 중인 IRP_MN_WAIT_WAKE 요청이 있는지 여부를 결정해야 합니다. 보류 중인 IRP_MN_WAIT_WAKE 요청이 없는 경우 콜백 루틴은 디바이스를 일시 중단하기 전에 IRP_MN_WAIT_WAKE 요청을 제출해야 합니다. 대기 절전 모드 해제 메커니즘에 대한 자세한 내용은 WakeUp 기능이 있는 지원 디바이스를 참조 하세요.
USB 전역 일시 중단
USB 2.0 사양은 프레임 시작 패킷을 포함하여 버스의 모든 USB 트래픽을 중지하여 USB 호스트 컨트롤러 뒤에 있는 전체 버스의 일시 중단으로 전역 일시 중단을 정의합니다. 아직 일시 중단되지 않은 다운스트림 디바이스는 업스트림 포트에서 유휴 상태를 검색하고 자체에서 일시 중단 상태를 입력합니다. Windows는 이러한 방식으로 전역 일시 중단을 구현하지 않습니다. Windows는 항상 버스의 모든 USB 트래픽을 중단하기 전에 USB 호스트 컨트롤러 뒤에 있는 각 USB 디바이스를 선택적으로 일시 중단합니다.
Windows 7의 전역 일시 중단 조건
Windows 7은 Windows Vista보다 USB 허브를 선택적으로 일시 중단하는 것에 대해 더 공격적입니다. Windows 7 USB 허브 드라이버는 연결된 모든 디바이스가 D1, D2 또는 D3 디바이스 전원 상태인 모든 허브를 선택적으로 일시 중단합니다. 모든 USB 허브가 선택적으로 일시 중단되면 전체 버스가 전역 일시 중단됩니다. Windows 7 USB 드라이버 스택은 디바이스가 D1, D2 또는 D3의 WDM 디바이스 상태에 있을 때마다 디바이스를 유휴 상태로 처리합니다.
Windows Vista의 전역 일시 중단 조건
글로벌 일시 중단을 수행하기 위한 요구 사항은 Windows XP보다 Windows Vista에서 더 유연합니다.
특히 USB 스택은 디바이스가 D1, D2 또는 D3의 WDM 디바이스 상태에 있을 때마다 Windows Vista에서 디바이스를 유휴 상태로 처리합니다.
다음 다이어그램은 Windows Vista에서 발생할 수 있는 시나리오를 보여 줍니다.
이 다이어그램은 "Windows XP의 전역 일시 중단 조건" 섹션에 표시된 것과 유사한 상황을 보여 줍니다. 그러나 이 경우 디바이스 3은 유휴 디바이스로 한정됩니다. 모든 디바이스가 유휴 상태이므로 버스 드라이버는 보류 중인 유휴 요청 IRP와 연결된 유휴 알림 콜백 루틴을 호출할 수 있습니다. 각 드라이버는 디바이스를 일시 중단하고 버스 드라이버는 안전한 즉시 USB 호스트 컨트롤러를 일시 중단합니다.
Windows Vista에서 모든 비 허브 USB 디바이스는 전역 일시 중단이 시작되기 전에 D1, D2 또는 D3에 있어야 하며, 이때 루트 허브를 포함한 모든 USB 허브가 일시 중단됩니다. 즉, 선택적 일시 중단을 지원하지 않는 USB 클라이언트 드라이버는 버스가 전역 일시 중단에 들어가지 못하게 합니다.
Windows XP의 전역 일시 중단 조건
Windows XP에서 전원 절약을 최대화하려면 모든 디바이스 드라이버가 유휴 요청 IRP를 사용하여 디바이스를 일시 중단하는 것이 중요합니다. 한 드라이버가 유휴 요청 IRP 대신 IRP_MN_SET_POWER 요청으로 디바이스를 일시 중단하는 경우 다른 디바이스가 일시 중단되지 않도록 할 수 있습니다.
다음 다이어그램은 Windows XP에서 발생할 수 있는 시나리오를 보여 줍니다.
이 그림에서 디바이스 3은 전원 상태 D3에 있으며 유휴 요청 IRP가 보류 중이 아닙니다. 디바이스 3은 부모에 보류 중인 유휴 요청 IRP가 없기 때문에 Windows XP에서 전역 일시 중단을 위해 유휴 디바이스로 인정되지 않습니다. 이렇게 하면 버스 드라이버가 트리에 있는 다른 디바이스의 드라이버와 연결된 유휴 요청 콜백 루틴을 호출하지 못하게 됩니다.
선택적 일시 중단 사용
Microsoft Windows XP 업그레이드 버전에 대해 선택적 일시 중단을 사용할 수 없습니다. Windows XP, Windows Vista 및 이후 버전의 Windows를 새로 설치할 수 있습니다.
지정된 루트 허브 및 해당 자식 디바이스에 대한 선택적 일시 중단 지원을 사용하도록 설정하려면 장치 관리자 USB 루트 허브의 전원 관리 탭에서 확인란을 선택합니다.
또는 USB 포트 드라이버의 소프트웨어 키 아래에 HcDisableSelectiveSuspend 값을 설정하여 선택적 일시 중단을 사용하거나 사용하지 않도록 설정할 수 있습니다. 값 1은 선택적 일시 중단을 사용하지 않도록 설정합니다. 값이 0이면 선택적 일시 중단이 가능합니다.
예를 들어 Usbport.inf의 다음 줄은 Hydra OHCI 컨트롤러에 대한 선택적 일시 중단을 사용하지 않도록 설정합니다.
[OHCI_NOSS.AddReg.NT]
HKR,,"HcDisableSelectiveSuspend",0x00010001,1
클라이언트 드라이버는 유휴 요청을 보내기 전에 선택적 일시 중단이 사용되는지 여부를 확인하려고 하면 안 됩니다. 디바이스가 유휴 상태일 때마다 유휴 요청을 제출해야 합니다. 유휴 요청이 실패하면 클라이언트 드라이버는 유휴 타이머를 다시 설정하여 다시 시도해야 합니다.