LINUX.ORG.RU

Проблема с модулем ядра


0

0

Доброго дня.

Есть модуль ядра для устройства PCI. Разрабатывался модуль под Ubuntu 8.04 и перкрасно в нем работает. Сейчас необходимо перенести этот модуль под CentOS 5.2.

Вот здесь начались странности. При установке модуль регистрирует обработчик прерывания (скажет прерывание 11), при возникновении прерывания происходит ошибка (irq 169: nobody cared (try booting with the "irqpoll" options). При переустановке модуля без перезагрузки он регистрирует уже другой обработчик прерывания (169). После этого устройство не работает.

Если установить модуль, потом его удалить и установить снова, то он регистрирует обработчик 169 и работает корректно.

В чем может быть проблема?


Ubuntu и CentOS конечно не виноваты.

Думаю у вас получается так, что значение irq для request_irq() берется до вызова pci_enable_device().

До pci_enable_device() значение dev->irq является "сырым", т.е. может не годиться для request_irq(). При вызове pci_enable_device() ядро по-необходимости "транслирует" номер irq с учетом логики APIC. Это обычно видно в syslog и по изменению значения dev->irq (в mustdie есть IMHO логично есть "raw" и "translated" ресурсы).

Такая трансляция производится один раз для каждой линии irq (исходный номер), с учетом возможностей APIC и APCI-таблиц (где фактически есть информация о "разводке" линий irq на плате). Поэтому если для одного из девайсов на этой линии уже вызывался pci_enable_device() то ваш код работает, если нет и система с APIC - то не работает. В ubuntu видимо включено больше драйверов чем в центе, поэтому там номер irq уже оттранслированный.

ly
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.