Регистрация прерывания с помощью irq из функции pci_irq_vector (9) приводит к «Нет обработчика irq для этой функции»? - PullRequest
0 голосов
/ 12 сентября 2018

Я пишу драйвер устройства, который обслуживает прерывания от устройства.Устройство имеет только один вектор прерываний 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.Что означает это число в любом случае?

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

Как мне продолжить отладку этого?Что-нибудь из моего описания выделяется как подозрительное?Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Итак, проблема оказалась в порядке вещей.Чтобы вручную создать прерывание, я прочитал конфигурационное пространство для адреса и данных прерывания, прежде чем назначать прерывания.Хотя в ретроспективе это очевидно, выделение векторов irq для устройства записывает соответствующие данные в пространство конфигурации.Следовательно, использование ранее существующего значения в поле данных сообщения будет указывать на несуществующий вектор irq.

0 голосов
/ 12 сентября 2018

Показывает ли этот конкретный irq при вводе cat / proc / interrupts?Может быть, вы можете получить правильный номер IRQ оттуда, а также другую информацию, например, где он подключен и какой драйвер связан с этой строкой прерывания!

...