网络驱动代码疑问
大虾门,帮我分析下./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函数,他是怎么触发软中断的?
回复 1# linuxLife12345
软中断在处理完中断之后由系统自动去调用的, 好像是中断下部分处理吧。这个应该是上部。我记的在软中断注册时,填入处理函数名称,当中断处理时,它会自动调用处理函数来处理软中断。建议你搜索一下软中断注册函数,应该能找到。
页:
[1]