中断API之free_irq

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;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值