2

Я собираюсь через функцию зонда следующего драйвераПочему прерывания отключены глобально перед подключением 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?

+0

Я не знаю, о чем говорит @Miline, но если вы прочитаете код, вы легко получите, что 'smsc911x_disable_irq_chip()' отключает прерывания на ** стороне устройства **, что является хорошим решением, если вы не совсем уверены в том, что перед вызовом '-> probe()'. – 0andriy

+1

Да, Энди прав, отключив прерывание на устройстве, а не 'disable_irq()' линию irq в целом. Поскольку линия irq разделена, вы не можете на самом деле 'disable_irq()'. И как его общий irq, водитель должен быть готов к тому, чтобы это произошло немедленно. Таким образом, даже если вы находитесь в середине назначения ISR IRQ, прерывание может действительно произойти, и, посмотрев на dev_id 'dev', который является вашим, вы каким-то образом должны что-то сделать для этого прерывания, по крайней мере, игнорируете прерывание. –

ответ

0

В комментарии говорится, что прерывания отключены глобально; но, как и в вызове функции ниже, прерывания отключены только для подключения драйвера устройства smsc. Обычно это делается для того, чтобы избежать прерывания до того, как водитель подготовится к обработке прерываний. Поскольку это для Ethernet-драйвера, прерывания чаще всего активируются во время интерфейса. Скрипичный код, о котором идет речь, выполняется во время загрузки модуля, который находится перед интерфейсом.

Смежные вопросы