const void *free_irq(unsigned int irq, void *dev_id)用于释放一个之前被request_irq申请的中断.
static int
el3_close(struct net_device *dev)
{
int ioaddr = dev->base_addr;
struct el3_private *lp = netdev_priv(dev);
if (el3_debug > 2)
pr_debug("%s: Shutting down ethercard.\n", dev->name);
el3_down(dev);
free_irq(dev->irq, dev);
}
正常情况下free_irq 一般用作清理函数或者异常case中.
其源码分析如下:
const void *free_irq(unsigned int irq, void *dev_id)
{
#通过irq_to_desc拿到中断号irq对应的中断描述符
struct irq_desc *desc = irq_to_desc(irq);
struct irqaction *action;
const char *devname;
#中断描述符为null 或者中断描述符的成员变量status_use_accessors 包含 _IRQ_PER_CPU_DEVID; 则退出
}
if (!desc || WARN_ON(irq_settings_is_per_cpu_devid(desc)))
return NULL;
#ifdef CONFIG_SMP
if (WARN_ON(desc->affinity_notify))
desc->affinity_notify = NULL;
#endif
#得到这个中断号的处理函数
action = __free_irq(irq, dev_id);
#中断处理函数为null,则退出
if (!action)
return NULL;
#得到这个处理函数的对应的name
devname = action->name;
#释放中断处理函数占用的空间,并返回devname
kfree(action);
return devname;
}
中断API之free_irq
最新推荐文章于 2024-04-25 02:11:10 发布