Error!!! IRQ handler type mismatch for IRQ 5 [<c040571a>] dump_trace+0x69/0x1af [<c0405878>] show_trace_log_lvl+0x18/0x2c [<c0405e18>] show_trace+0xf/0x11 [<c0405e47>] dump_stack+0x15/0x17 [<c0442207>] setup_irq+0x175/0x188 [<c0442296>] request_irq+0x7c/0x98 [<ee228171>] hybridp2p_open+0x2e/0x3d [sndtp_driver] [<c05aea48>] dev_open+0x2b/0x62 [<c05ad2c2>] dev_change_flags+0x47/0xe4 [<c05e947c>] devinet_ioctl+0x250/0x551 Это я получаю. Девайс-то работает ведь... Или проблемы могут быть?
osrootd Ты там сам с собой чтоль разговариваешь? Откуда лог? Что за девайс? Куда и как ты его подключаешь? Опиши подробно проблему, это - не ТНТ, телепатов тут нет...
ЛОГ из /log/messages Пытаюсь подключить сетевую карту и настроить ее multicast (peer-to-peer) Ну, как водится, пишу: request_irq(dev->irq, &hybridp2p_interrupt, 0, PCI_CARD_OPEN, dev); IRQ выставляю 5. И вот тут получаю отборный мат. Тем временем вырубается вторая интеловская сетевуха и все пакеты идут в мою. Код (Text): MODULE_DESCRIPTION("Hybride P2P Ethernet network adapter"); MODULE_AUTHOR("ya"); MODULE_LICENSE("$LICENSE$"); #define PROTOCOL_ID 0x1d5f2 int receive_packet (struct sk_buff *skb, struct net_device *dev,struct packet_type *pt); static const char * PCI_CARD_OPEN = "netcard"; static struct packet_type proto = { __constant_htons(PROTOCOL_ID), NULL, receive_packet, (void *) 1, NULL }; //device actions void process_packet(struct net_device *dev){ printk ("Процесс передачи подтвержден.\n"); } static void hybridp2p_interrupt(int irq, void *did, struct pt_regs * regs){ printk ("*** IRQ %d interrupted\n", irq); struct net_device *dev = did; struct net_local * local; int io_addr, status; io_addr=dev->base_addr; local = (struct net_local *)dev->priv; printk ("IOADDR (hybrid) = %d", io_addr); // Обработка.... } int hybridp2p_open (struct net_device *dev) { request_irq(dev->irq, &hybridp2p_interrupt, 0, PCI_CARD_OPEN, dev); - Вот тут мат, но все работает.
...вот это смущает "IRQ handler type mismatch for IRQ 5"... IRQ == 5 свободно раньше было? Просто по умолчанию там звуковая карта висит...
вообще говоря IRQ для PCI устройств выставляется автоматически при регистрации устройства через pci_register_driver()
osrootd IRQ нужно. В виндоусе работает APIC и ему доступно 24 прерывания. Для PCI отводиться IRQ16-19. Причем определяется положением устройства на материнке. Встроенные устройства могут использовать любое IRQ. Плюс часть устройства могут переопределять IRQ.
rei3er А что тогда означает? osrootd У тебя в флагах ноль нужно IRQF_SHARED. Если почитать тут http://www.parisc-linux.org/~grundler/Documentation/pci.txt-02 То pci_enable_device должен выдать номер IRQ. PS. Может у линуксойдов есть что-то вроде MSDN? Где описанно как программировать ядро и нетолько.
индекс в массиве irq_desc http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/include/linux/irq.h#L181 каждый struct irq_desc есть платформо-независимое представление аппаратного прерывания (аналог объекта INTERRUPT в NT) по-умолчанию при инициализации irq_desc[0] - irq_desc[15] соответствуют legacy прерываниям IRQ0 - IRQ15 http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/arch/x86/kernel/i8259_64.c#L432 в процессе инициализации I/O APIC осуществляется переопределение struct irq_chip в struct irq_desc такого структурированного хранилища данных как MSDN, нет информации много, но ее приходится искать