다음을 통해 공유


UE 중단 검색: 1-14단계

UE 중단 검색의 1~14단계는 아래에 설명되어 있습니다. 단계는 UE 중단 검색 및 복구 흐름에 표시된 다이어그램에 해당합니다.

이 예제에서는 OID_SET_POWER 사용합니다.

  1. NDIS는 시스템 전원 IRP를 받거나 NIC 활성 참조가 0으로 떨어집니다.

  2. NDIS는 WDI 드라이버에 OID_SET_POWER D3을 생성합니다.

  3. WDI는 WDI OID를 LE로 보내기 전에 작업을 포함하여 WDI 명령(M1)에 대한 타이머를 설정합니다. 명령이 작업인 경우 작업에 대한 추가 타이머도 설정됩니다. 두 타이머 모두 시간 초과할 수 있지만, 하나만 다시 설정 복구를 트리거할 수 있습니다.

  4. WDI는 WDI 명령을 LE로 보냅니다. LE에 대한 권장 사항은 OID를 완료하기 위해 펌웨어 명령이 필요한 경우 어댑터 구조에서 WDI OID를 기억하는 것입니다. 펌웨어가 WDI OID에 대한 작업을 완료하면 LE는 OID를 완료하고 어댑터 구조에서 제거합니다. WDI는 OID를 LE로 직렬화하므로 LE는 보류 중인 WDI OID를 기억하기 위해 하나의 슬롯만 필요합니다. 펌웨어 명령이 중단된 경우 LE는 펌웨어가 비활성화된 17단계에서 언제든지 OID를 반환할 수 있지만, 17단계에서 서프라이즈-제거(surprise-remove의 컨텍스트에 있을 수 있음)보다 더 늦게 반환할 수 있습니다. 다른 경우의 경우 LE는 진단 콜백 전후에 관계없이 펌웨어가 해당 작업을 완료할 때 WDI OID를 완료합니다. LE가 진단 후 WDI OID를 기억해야 하는 경우 기억하기 위해 다른 슬롯이 필요합니다. 그러나 진단 후 받은 OID의 경우 LE는 계단식 중단을 방지하기 위해 펌웨어를 만져서는 안 됩니다.

  5. LE는 펌웨어에 명령을 보냅니다.

  6. 펌웨어 명령 시간이 초과되면 펌웨어가 중단되거나 너무 오래 걸리기 때문일 수 있습니다.

    • 펌웨어가 시간 초과 후 명령을 완료하는 데 너무 오래 걸리는 경우 LE는 WDI 명령을 완료할 수 있습니다. UE는 이를 적절하게 처리합니다.
    • 펌웨어가 중단되면 WDI 명령이 곧 완료되지 않습니다. LE는 하드웨어가 다시 설정되었을 때 16단계에서 기습 제거 시 완료해야 하므로 잠재적인 경합 상태에 대한 특별한 처리 없이도 안전하게 완료할 수 있습니다.
  7. WDI 타이머가 실행되면 WDI 진단 명령이 생성됩니다. 이 WDI 명령은 WDI OID가 아닌 LE 드라이버 MiniportWdiAdapterHangDiagnose에 대한 호출입니다.

  8. LE는 하드웨어 제어 레지스터 상태를 수집하고 필요에 따라 전체 펌웨어 상태를 수집합니다.

    • IHV 드라이버는 1KB로 제한되는 하드웨어 레지스터 콘텐츠를 수집하고 함수 반환에서 반환해야 합니다. 또한 사전 프로덕션 환경에서 LE는 IHV가 사후 디버그를 철저히 수행할 수 있도록 펌웨어 컨텍스트를 파일에 덤프하려고 시도해야 합니다. 스위치를 레지스트리 키로 구현하여 하드웨어 레지스터 및 펌웨어 이미지의 컬렉션을 제어할 수 있습니다.
    • 또한 LE는 취소를 위해 현재 명령을 표시합니다. 명령 완성이 진단을 이기기 위해 경합하는 경우 LE가 이 명령에 대해 아무 것도 하지 않는 경우 허용됩니다.
    • 이 명령이 보류 중인 경우 UE는 초기화의 결과로 추가 WDI 명령을 보낼 수 있습니다. 이는 현재 실행 중인 명령 또는 클린 명령입니다. 진단 호출 후 LE는 펌웨어를 건드리지 않고 처리해야 합니다.
  9. WDI는 컨트롤 레지스터 상태를 받습니다.

  10. WDI는 중단 WDI 명령을 표시하여 나중에 LE로 표시합니다.

  11. WDI는 WDI 완료 없이 NDIS 명령을 반환(완료)합니다. WDI가 NDIS 명령을 이중 버퍼링하기 때문에 안전합니다.

  12. WDI는 NDIS를 호출하여 재설정하고 오류 코드 NDIS_ERROR_CODE_HARDWARE_FAILURE(0xc000138a)을 사용하여 NdisWriteErrorLogEntry를 호출합니다. 그러면 시스템 이벤트 로그에 LE의 모듈 이름이 포함된 이벤트가 기록됩니다. 오류 이벤트 ID는 (0xc000138a | 0xffff) – 0n5002로 자동으로 팝업됩니다. LE가 동일한 오류 코드를 사용하여 오류 로그를 작성하는 경우 데이터의 첫 번째 DWORD에는 LE로 이벤트를 쉽게 구분하기 위해 높은 비트 집합(0x80000000)이 포함되어야 합니다. WDI는 0x00000000 사용하여 첫 번째 DWORD 데이터에 대한 0x7fffffff.

  13. 호출이 반환됩니다.

  14. NDIS는 IRP를 완료합니다.

이 시점 이후에 NDIS는 버스를 호출하여 우리를 놀라게 하고 다시 열거합니다. WDI가 NDIS 명령을 완료하기 위해 WDI 명령이 반환되기를 기다릴 필요가 없도록 NDIS 명령을 이중 버퍼링한다는 점에 유의해야 합니다. 이렇게 하면 LE가 논리를 취소할 필요가 없으므로 매우 복잡합니다.

PnP 작업의 교착 상태를 방지하려면 NDIS OID_SET_POWER 완료해야 합니다. 모든 PnP 및 전원 상태 변경 이벤트가 직렬화됩니다. 즉, 전원 설정 OID가 반환되지 않으면 NDIS는 전원 IRP 설정을 반환할 수 없습니다. 즉, 다시 설정 복구가 Surprise-Remove IRP로 잠기게 됩니다.

MiniportWdiAdapterHangDiagnose

다시 설정(깜짝 제거): 15-20단계

UE 중단 검색 및 복구 흐름