Перейти к содержанию
    

Добрый день.

У меня тоже возникли проблемы с прерываниями PCIe.

Плата - кит от альтеры на C4. Операционка WinXP x32.

MSI-X и MSI не использую.

Проявляется проблема в том, что при загрузке винды происходит вызов OnInterrupt, который я прикручиваю в вызове IoConnectInterrupt.

Плата точно не генерит это прерывание, т.к. все сигналы запросов зажаты в 0.

В обработчике (OnInterrupt) я просто пишу в плату определенное число и вторым компом по SignalTap наблюдаю. Такой вот дебаг.

Так вот, если обработчик вернет TRUE, то процентов на 95 комп перегрузится.

Если вернет FALSE, то обработчик будет вновь и вновь вызываться. Это даст винде загрузиться, но потом она все равно зависнет или перегрузится.

 

С другой стороны, если включить комп с выключенной платой, а потом ее включить (подать питание) и найти поиском в диспетчере устройств, то она будет работать корректно. Если в ней раскоментарить генерацию прерываний, то они будут нормально генериться и обрабатываться драйвером.

 

Если обработчик вообще не прикручивать с помощью IoConnectInterrupt, то все будет хорошо.

 

Драйвер изначально был сделан для PCI устройства. Там такой проблемы не было.

 

Может стоит пользоваться IoConnectInterruptEx? Но я пока не планирую MSI...

Подкиньте, пожалуйста, идеи.

Изменено пользователем otv116

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

у PCIe нет отдельной сигнальной цепи-прерывания в разъеме, как в PCI.

и по факту все прерывания, формируемые со стороны платы передаются как MSI.

Другое дело, что вы можете их в операционке получить через legacy/compatibility layers как будто это и не MSI вовсе.

Вот только работать оно будет ровно так, как вы описали - т.е. глючить.

 

разбиратся с MSI придётся всё равно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не пугайтесь раньше времени, все что Вы описали происходит вполне закономерно.

MSI или Legacy - совершенно не важно в Вашем случае.

 

В обработчике прерывания на первом месте должна стоять проверка - а запущено ли приложение?

Если приложение под данный драйвер запущено не было, то обработчик должен вернуть FALSE.

На втором месте в обработчике должна стоять проверка -моя ли плата дала данное прерывание?

Читаем признак (бит установленный в 1) из нашей платы. Если плата не давала прерывание - возвращаем FALSE.

В общем, обработчик может вернуть TRUE только если приложение запущено (ОС загружена, естественно) и плата давала прерывание.

 

Лет 8 назад мое попадались платы с каким-то дурным чипсетом NEC, на которых моей PCI-плате давали прерывание общее с кем-то из девайсов, и

ISR() в моем драйвере вызывался намного чаще, чем моя плата выставляла прерывания на шину. Проблему решили как написано выше.

 

Дерзайте, все будет работать.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо.

 

soldat_shveyk,

 

я делал эксперимент с возвращением постоянно FALSE. При загрузке винды этот как раз и соответствует тому что вы пишете -приложения нет, прерывание не мое. Но винда постоянно вызывает обработчик, пока не зависнет.

 

krux,

 

буду пробовать MSI.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пробуйте MSI.

Отпишитесь потом в этой ветке, если не затруднит, - помогло или нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Перешел я на использование IOConnectInterruptEx, FULLY_SPECIFIED (в XP можно только эту версию использовать).

В описании на альтеровскую корку написано, что по включению используются legacy (lane-based) и для использования MSI надо ручками менять биты в одном из конфиг регов. До этого я не дошел, так что фактически продолжаю использовать legacy.

IOConnectInterruptEx ничего нового не дал. Все осталось как есть. Есть пару подробностей относительно срабатывания OnInterrupt при старте винды. Ранее я писал, что если я верну TRUE, то винда перегрузится. Это не совсем точно.

В обработчике прерывания я лезу в плату и проверяю бит, что это мое прерывание. Так вот перезагрузку вызывает именно обращение к моей плате. Если в обработчике я просто буду делать DebugPrint и возвращать TRUE, то винда загрузится. Но обработчик прерывания будет постоянно вызываться и вызываться, точно так же, как и в случае, когда обработчик всегда возвращал FALSE.

Я предполагаю, что перезагрузка происходит потому, что ServiceContext, передаваемый обработчику вовсе не содержит адреса на мой DeviceExtension, поля которого я использую при обращении к плате. Надо будет выкинуть в дебаг его значение.

Выглядит, как будто это прерывание никак обрабатывается (не сбрасывается источник) и мне его постоянно присылают.

Похожее наблюдается, если в девайсе установить прерывание и не чистить - хоть OnInterruptEx будет возвращать TRUE, обработчик прерывания будет постоянно вызываться, пока в девайсе оно не снимется.

Я даже подумал, что может корка глючит. После загрузки винды дернул сигнал запроса прерывания вверх-вниз, но это ничего не поменяло.

Вот такие новости.

Изменено пользователем otv116

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Идея про неправильный ServiceContext себя не подтвердила. Он приходит правильный. Я в ПЛИС завел счетчик, который инкрементирую каждый раз при вызове OnInterrupt. Смотрю за ним с другого компа через SignalTap. Так вот, в определенный момент OnInterrupt начинает непрерывно вызываться. Мой восьмибитный счетчик наматывает пару кругов, после чего комп виснет.

Как будто есть еще какой то источник прерывания кроме моего контроллера в ПЛИС, и его то и надо очистить.

Не исключаю, что в драйвере что-то кардинально не так. Уже подумываю откатиться назад на уровень примера toaster и заново потихоньку наращивать функционал.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Решил поглядеть, что будет на Win8 x64.

При загрузке винды тоже есть вызов OnInterrupt, не вызванный моей платой. Но он только один и после того, как я на него верну TRUE, больше не повторяется. Винда нормально грузится и после этого прерывания корректно работают.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы отмести возможные глюки моей платы, воткнул в комп с winXP преходник PCIe -> USB3. Поставил для него мой драйвер (в железо не лазит, а только DbgPrint в функции OnInterrupt). Картина та же - сразу после утановки все тихо, а после перезагрузки винды непрерывные вызовы OnInterrupt.

Т.е. вроде как моя железяка ни при чем. Поставил переходнику родные дрова - все нормально работает. Значит и на мамку можно не грешить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Разобрался я в чем дело.

soldat_shveyk первым же своим ответом в сообщении 33 все верно описал.

После перезагрузки винды начинали прилетать прерывания от сетевухи, на которые надо отвечать FALSE.

Сбило меня с толку то, что если я все время отвечал FALSE, то винда все равно перегружалась через какое-то время. Оказалось, что это совсем не связано с моим драйвером. На видюхе сдох вентилятор, она перегревалась и все падало. После его ремонта поведение винды стало предсказуемым - примерно раз в секунду валится чужое прерывание и никому особо жить не мешает. Свое прерывание я определяю прочитав один из регистор моей платы.

А вот если я все время возвращаю TRUE, то в случае прерывания от сетевухи она продолжает его генерить, отчего винда и перегружается.

В общем, теперь все хорошо.

Спасибо всем.

Следующий шаг - DMA. Так что, до новых встреч :)

Но уже, видимо, не в этой теме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...