Я пишу драйвер устройства, который обслуживает прерывания от устройства.Устройство имеет только один вектор прерываний MSI, поэтому я опрашиваю IRQ с помощью pci_irq_vector (dev, 0), получаю IRQ и регистрирую прерывание.Это показано в следующем фрагменте кода (эквивалентно тому, что у меня есть минус обработка ошибок):
retval = pci_alloc_irq_vectors(dev, 1, 1, PCI_IRQ_MSI);
irq = pci_irq_vector(dev, 0);
retval = request_irq(irq, irq_fnc, 0, "name", dev);
Все это успешно завершается и без предупреждения (по крайней мере, с помощью dmesg).Тем не менее, когда приходит прерывание, я получаю сообщение об ошибке.
kernel:do_IRQ: 0.xxx No irq handler for this vector (irq -1)
xxx представляется произвольным числом, которое изменяется каждый раз при загрузке драйвера, но не соответствует номеру irq.Вместо этого он совпадает с двумя последними шестнадцатеричными цифрами данных сообщения, отправленных с прерыванием MSI, как считанные из структуры возможностей MSI.Попытка запросить IRQ этого числа возвращает EINVAL, что, я думаю, означает, что оно не связано ни с каким устройством PCI.Что означает это число в любом случае?
Что-то, что может быть важно отметить, на самом деле я вручную запускаю это прерывание со стороны хоста из-за ограничений устройства.Я читаю адрес прерывания и данные из структуры возможностей, а затем инструктирую устройство записать данные по этому адресу.
Как мне продолжить отладку этого?Что-нибудь из моего описания выделяется как подозрительное?Любая помощь будет оценена.