linuxLife12345 发表于 2012-06-18 16:57

网络驱动代码疑问

大虾门,帮我分析下./driver/net/korina.c下面的一段代码

RX中断申请:
ret = request_irq(lp->rx_irq, &korina_rx_dma_interrupt,
                IRQF_SHARED | IRQF_DISABLED, "Korina ethernet Rx", dev);

Rx中断处理:
/* Ethernet Rx DMA interrupt */
static irqreturn_t korina_rx_dma_interrupt(int irq, void *dev_id)
{
        struct net_device *dev = dev_id;
        struct korina_private *lp = netdev_priv(dev);
        u32 dmas, dmasm;
        irqreturn_t retval;

        dmas = readl (&lp->rx_dma_regs->dmas);
        if (dmas & (DMA_STAT_DONE | DMA_STAT_HALT | DMA_STAT_ERR)) {
                netif_rx_schedule_prep (dev, &lp->napi);

                dmasm = readl (&lp->rx_dma_regs->dmasm);
                writel (dmasm | (DMA_STAT_DONE |
                                DMA_STAT_HALT | DMA_STAT_ERR),
                                &lp->rx_dma_regs->dmasm);

                if (dmas & DMA_STAT_ERR)
                        printk(KERN_ERR DRV_NAME "%s: DMA error\n", dev->name);

                retval = IRQ_HANDLED;
        } else
                retval = IRQ_NONE;

        return retval;
}

问题:
为什么这里面没有调用:__netif_rx_schedule函数,他是怎么触发软中断的?

daniel_kohler 发表于 2012-06-21 08:49

回复 1# linuxLife12345


    软中断在处理完中断之后由系统自动去调用的,

jzwxh77 发表于 2012-07-06 15:59

好像是中断下部分处理吧。这个应该是上部。我记的在软中断注册时,填入处理函数名称,当中断处理时,它会自动调用处理函数来处理软中断。建议你搜索一下软中断注册函数,应该能找到。
页: [1]
查看完整版本: 网络驱动代码疑问