Обработчик прерываний срабатывает при вызове free_irq

Моя проблема: обработчик прерываний срабатывает при вызове free_irq. Я заметил в сообщениях ядра, что обработчик вызывается, но поскольку наше устройство не запрашивало прерывание, оно сообщало, что прерывание не получено. Это ожидаемое поведение? Кто-нибудь может помочь?


person user3257306    schedule 31.01.2014    source источник
comment
Обработчик прерывания не будет вызываться, пока не будет перехвачено прерывание, для которого зарегистрирован ваш обработчик прерывания. Можете ли вы дать более подробную информацию или вы можете поделиться своим кодом. Так что наши ответы могут быть более продуктивными.   -  person Sumeet_Jain    schedule 31.01.2014
comment
Вы не указали, что ваш драйвер предназначен для устройства PCI, но я нашел полезную документацию по порядку выключения устройства в документации по драйверу PCI. См.: kernel.org/doc/html/ последний/PCI/pci.html#pci-device-shutdown   -  person ahogen    schedule 13.12.2019


Ответы (2)


Когда вы регистрируете обработчик для (возможно) общего прерывания (с IRQF_SHARED), прерывание может быть вызвано другими устройствами, над которыми ваш драйвер не имеет никакого контроля, поэтому ваш драйвер должен быть готов принять прерывание в любое время.

Чтобы облегчить отладку драйверов, ядро ​​будет (если установлено значение CONFIG_DEBUG_SHIRQ) имитировать некоторые прерывания, чтобы проверить правильность работы вашего драйвера.
[исходный код]

person CL.    schedule 31.01.2014
comment
У меня есть общие прерывания, но ни одно другое устройство не инициировало прерывание, поскольку IRQ в /proc/interrupts не увеличивается. Во-вторых, не могли бы вы помочь, как проверить, установлен CONFIG_DEBUG_SHIRQ или нет? - person user3257306; 31.01.2014
comment
Поведение вашего ядра доказывает, что CONFIG_DEBUG_SHIRQ установлен. - person CL.; 31.01.2014
comment
Есть ли способ подтвердить этот макрос? - person user3257306; 31.01.2014
comment
В моем случае /proc/config.gz не существует в Fedora 16. Я нахожу информацию о конфигурации в /boot/config-‹kernel›, выполнив команду cat /boot/config-$(uname -r) | grep CONFIG_DEBUG_SHIRQ - person user3257306; 31.01.2014

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

person user2699113    schedule 31.01.2014