Я собираюсь через функцию зонда следующего драйвераПочему прерывания отключены глобально перед подключением ISR?
/drivers/net/ethernet/smsc/smsc911x.c
Внутри функции зонда он был прокомментирован, что
/* Ensure interrupts are globally disabled before connecting ISR */
smsc911x_disable_irq_chip(dev);
retval = request_irq(dev->irq, smsc911x_irqhandler,
irq_flags | IRQF_SHARED, dev->name, dev);
Но я не вижу, что это верно в случае каждый другой драйвер устройства, так почему именно в случае этого конкретного сетевого драйвера?
Почему прерывания отключены глобально перед подключением ISR?
Я не знаю, о чем говорит @Miline, но если вы прочитаете код, вы легко получите, что 'smsc911x_disable_irq_chip()' отключает прерывания на ** стороне устройства **, что является хорошим решением, если вы не совсем уверены в том, что перед вызовом '-> probe()'. – 0andriy
Да, Энди прав, отключив прерывание на устройстве, а не 'disable_irq()' линию irq в целом. Поскольку линия irq разделена, вы не можете на самом деле 'disable_irq()'. И как его общий irq, водитель должен быть готов к тому, чтобы это произошло немедленно. Таким образом, даже если вы находитесь в середине назначения ISR IRQ, прерывание может действительно произойти, и, посмотрев на dev_id 'dev', который является вашим, вы каким-то образом должны что-то сделать для этого прерывания, по крайней мере, игнорируете прерывание. –