Не получает все прерывания в драйвере KMDF - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь портировать существующий драйвер устройства Linux на Windows. В основном это работает, но есть странная проблема - иногда устройство не прерывает работу или прерывание теряется. Прерывания теряются только тогда, когда я не активно отлаживаю.

Я попытался включить автоматическую сериализацию в конфигурации прерываний, но это не помогло решить мою проблему.

В настоящее время у меня нет параметров, я подозреваю, что произошла неправильная синхронизация или что мне нужно использовать другой метод ожидания.

Мой ISR выглядит так:

  pDE  = xGetDeviceContext(WdfInterruptGetDevice(Interrupt));
  intrv = READ_REG_32(pDE, OFFSET_INTERRUPT_REG);
  pDE->interruptMask = READ_REG_32(pDE, OFFSET_INTERRUPT_MASK_REG);

  intrv &= pDE->interruptMask;
  if(intrv == 0){
      return FALSE;
  }
  pDE->interruptStatus |= intrv; //trying to save values in case different interrupts come too fast for dpc
  WdfInterruptQueueDpcForIsr( pDE->m_Interrupt);

DPC:

 pDE  = xGetDeviceContext(WdfInterruptGetDevice(Interrupt));
 WdfInterruptAcquireLock(Interrupt);
 nMainIntStatus = pDE->interruptStatus;
 pDE->interruptStatus = 0;
 WdfInterruptReleaseLock(Interrupt);

 if(nManIntStatus & interrupt_mask_event_1){
   KeSetEvent(&pDE->interrupt_event_1, IO_SOUND_INCREMENT, FALSE);
 }
 //and so on...
//In my code I'm waiting on pDE->interrupt_event_1:
 status = KeWaitForSingleObject(&pDE->interrupt_event_1, Executive, KernelMode, TRUE, &timeout);
...