Цитата(vshemm @ Oct 23 2010, 23:45)

pci_enable_msi_block используется правильно (с поправкой на то, что count может быть степенью 2).
Наиболее вероятные причины невозможности подключения более одной линии следующие:
1. Само устройство не поддерживает несколько линий прерываний. Тут нужно смотреть даташит на него на предмет настройки разных линий прерываний для разных функций. Строчка Capabilities: [50] MSI: Enable+ Count=1/32 Maskable- 64bit+ показывает аппаратные возможности девайса, и нет общего способа их менять (опять же, нужно курить мануал на устройство).
2. Т.к. MSI требует, чтобы линии прерываний выделялись непрерывно, то возможен случай, когда не найдется 32 подряд идущих свободных линий.
Большое спасибо за ответ.
Девайсом является плата Altera Stratix IV GX Dev Kit. В ней имеется аппаратный блок PCI Express, который я сам настраиваю в квартусе настройкой PCI Express Compiler - это альтеровское мегаядро. Доступными мне являются параметры Multiple Message Capable (я поставил 32, и это отразилось в строке Count=1/32) и поддержка 64-битной дресации (отразилось в строке 64bit+). Всего два настраиваемых со стороны платы параметра.
Вот второй пункт вашего ответа объясняет причину невозможности подключения более одной линии. Тогда как выход мне представляется вариант уменьшения количества прерываний с 32 до меньшего числа (например, 4 или 2). Уж 4 то подряд идущих линии прерывания наверное найдутся.
Вот только другой возникает вопрос. Если я выделю блок из 4 прерываний, как мне подключить обработчик прерываний:
request_irq( irq, interruptHandler, IRQF_SHARED, MODULE_NAME, pdev );
Какое прерывание я должен передать как irq?
или для каждой линии прерывания зарегестрировать отдельный обработчик:
request_irq( irq_1, interruptHandler_1, IRQF_SHARED, MODULE_NAME, pdev );
request_irq( irq_2, interruptHandler_2, IRQF_SHARED, MODULE_NAME, pdev );
...
request_irq( irq_N, interruptHandler_N, IRQF_SHARED, MODULE_NAME, pdev );??