atheros无线驱动之:数据接收流程
1:数据处理函数tasklet,workqueue
在之前的初始化代码中的函数__ath_attach()中,有如下的代码:
#ifndef ATH_SUPPORT_HTC
#ifdef ADF_SUPPORT
ATH_INIT_TQUEUE(&osdev->intr_tq, (adf_os_defer_fn_t)ath_tasklet, (void*)dev);
#else
ATH_INIT_TQUEUE(&osdev->intr_tq, ath_tasklet, dev);
#endif
#endif
首先开看看 ATH_INIT_TQUEUE()是怎么定义的:
#ifdef DECLARE_TASKLET /* native tasklets */
#define tq_struct tasklet_struct
#define ATH_INIT_TQUEUE(a,b,c) tasklet_init((a),(b),(unsigned long)(c))
#define ATH_SCHEDULE_TQUEUE(a,b) tasklet_schedule((a))
typedef unsigned long TQUEUE_ARG;
#define mark_bh(a)
#else /* immediate work queue */
#define ATH_INIT_TQUEUE(a,b,c) INIT_TQUEUE(a,b,c)
#define ATH_SCHEDULE_TQUEUE(a,b) do { \
*(b) |= queue_task((a), &tq_immediate); \
} while(0)
typedef void *TQUEUE_ARG;
#define tasklet_disable(t) do { (void) t; local_bh_disable(); } while (0)
#define tasklet_enable(t) do { (void) t; local_bh_enable(); } while (0)
#endif /* !DECLARE_TASKLET */
有上面的定义可以知道:次数定义的是中断处理函数的下半部,其实现采用俩种方式:tasklet和work_queue。
在中断处理函数中将会调用task或者queue的调度函数即上面定义的:ATH_SCHEDULE_TQUEUE
函数ath_tasklet()定义如下:
static void ath_tasklet(TQUEUE_ARG data)
{
struct net_device *dev = (struct net_device *)data;
struct ath_softc_net80211 *scn = ath_netdev_priv(dev);
do_ath_handle_intr(scn->sc_dev);
}
#define do_ath_handle_intr(_dev) do{ ath_handle_intr_generic(_dev);}while(0)
#define ath_handle_intr_generic(_dev) scn->sc_ops->handle_intr(_dev)
static const struct ath_ops ath_ar_ops = {
ath_handle_intr, /* handle_intr */
ath_rx_tasklet, /* rx_proc */
}
2:中断的申请
在__ath_attach()有如下中断申请代码
#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
if (request_irq(dev->irq, ath_isr, SA_SHIRQ, dev->name, dev)) {
#else
#ifdef ATH_AHB
if (request_irq(dev->irq, ath_isr, IRQF_DISABLED, dev->name, dev)) {
#else
if (request_irq(dev->irq, ath_isr, IRQF_SHARED, dev->name, dev)) {
#endif
#endif
printk(KERN_WARNING "%s: request_irq failed\n", dev->name);
error = -EIO;
goto bad3;
} 由此可知,中断处理函数为:
ath_isr(int irq, void *dev_id, struct pt_regs *regs)
{
do_ath_isr(irq,dev_id,regs);
}
#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
#define do_ath_isr(_irq,_dev_id) do{ return ath_isr_generic(_irq,_dev_id);}while(0)
#else
#define do_ath_isr(_irq,_dev_id,_regs) do{ returnath_isr_generic(_irq,_dev_id,_regs);}while(0)
#endif //if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,19)
irqreturn_t ath_isr_generic(int irq, void *dev_id, struct pt_regs *regs)
#endif
{
struct net_device *dev = dev_id;
struct ath_softc_net80211 *scn = ath_netdev_priv(dev);
int sched, needmark = 0;
/* always acknowledge the interrupt */
sched = scn->sc_ops->isr(scn->sc_dev);
switch(sched)
{
case ATH_ISR_NOSCHED:
return IRQ_HANDLED;
case ATH_ISR_NOTMINE:
return IRQ_NONE;
default:
if ((dev->flags & (IFF_RUNNING|IFF_UP)) != (IFF_RUNNING|IFF_UP))
{
DPRINTF_INTSAFE(scn, ATH_DEBUG_INTR, "%s: flags 0x%x\n", __func__, dev->flags);
scn->sc_ops->disable_interrupt(scn->sc_dev); /* disable further intr's */
return IRQ_HANDLED;
}
}
/*
** See if the transmit queue processing needs to be scheduled
*/
ATH_SCHEDULE_TQUEUE(&scn->sc_osdev->intr_tq, &needmark);
if (needmark)
mark_bh(IMMEDIATE_BH);
return IRQ_HANDLED;
}上面已经说明了在中断处理函数中对tasklet或者workqueue的调度。
3:代码执行流程
其代码执行过程如下:
当数据数据之后,会交给函数ieee80211_input(),在测函数中会处理80211的三大数据包类似,数据帧,管理帧和控制帧。
atheros无线驱动之:数据接收流程的更多相关文章
- twemproxy接收流程探索——twemproxy代码分析正编
在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份优秀的c语言,为此,在twemproxy的代码中会大篇幅使用c指针.但是不论是普通类型的指针还是函数指针,都可以让我们这 ...
- twemproxy接收流程探索——剖析twemproxy代码正编
本文旨在帮助大家探索出twemproxy接收流程的代码逻辑框架,有些具体的实现需要我们在未来抽空去探索或者大家自行探索.在这篇文章开始前,大家要做好一个小小的心理准备,由于twemproxy代码是一份 ...
- Linux内核二层数据包接收流程
本文主要讲解了Linux内核二层数据包接收流程,使用的内核的版本是2.6.32.27 为了方便理解,本文采用整体流程图加伪代码的方式从内核高层面上梳理了二层数据包接收的流程,希望可以对大家有所帮助.阅 ...
- [转帖]Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点
Linux TCP/IP协议栈,数据发送接收流程,TCP协议特点 http://network.51cto.com/art/201909/603780.htm 可以毫不夸张的说现如今的互联网是基于TC ...
- linux 内核网络数据包接收流程
转:https://segmentfault.com/a/1190000008836467 本文将介绍在Linux系统中,数据包是如何一步一步从网卡传到进程手中的. 如果英文没有问题,强烈建议阅读后面 ...
- stm32 usb数据接收与数据发送程序流程分析
http://blog.csdn.net/u011318735/article/details/17424349 既然学习了USB,那就必须的搞懂USB设备与USB主机数据是怎么通讯的.这里主要讲设备 ...
- Linux input系统数据上报流程【转】
转自:https://segmentfault.com/a/1190000017255939 作为鸡生蛋系列文章,这里主要关注Linux input系统,主要为触摸事件上报流程. 读该文章最好有对li ...
- pf_ring DNA接收流程代码分析
经过一个月的学习,对pf_ring DNA的内核部分有了一些认识,本文侧重pf_ring对ixgbe的改动分析. 先说一说接收流程吧,流程如下: 其中,硬中断处理函数是ixgbe_msix_clean ...
- 内核中用于数据接收的结构体struct msghdr(转)
内核中用于数据接收的结构体struct msghdr(转) 我们从一个实际的数据包发送的例子入手,来看看其发送的具体流程,以及过程中涉及到的相关数据结构.在我们的虚拟机上发送icmp回显请求包,pin ...
随机推荐
- Run time setting设置详解
Pacing转载自belie 1> Run time setting设置中的Browser:‘Simulate a new user on each iteration’选项例如:录制了 ...
- OSG addEventHandler W键显示网格 L键控制光照 F键切换全屏窗口 S键显示统计数据 事件处理器
#include <osgGA/StateSetManipulator> #include <osgViewer/ViewerEventHandlers> // add the ...
- Codeforces Round #186 (Div. 2).D
纠结的一道dp. 状态转移方程还是比较好想的,优化比较纠结 D. Ilya and Roads time limit per test 3 seconds memory limit per test ...
- ios mrc & arc 并用
如果在arc工程中倒入mrc文件就会提示出错. 解决办法如下: 在targets的build phases选项下Compile Sources下选择要使用arc编译的文件,双击它,输入-fno-obj ...
- Android开源项目分类汇总【畜生级别】
From :http://blog.csdn.net/forlong401/article/details/25459403?c=6c4cd677a617db4655988e41ee081691#t7 ...
- js 中 this 的指向问题
高程上的大前提: 1.this 对象是在运行时基于函数的执行环境绑定的:在全局函数中,this 等于window,而当函数被作为某个对象的方法调用时,this 等于那个对象:不过,匿名函数的执行环境具 ...
- 技术宅之flappy bird 二逼鸟
师雪坤和刘阳 风靡一时的虐心小游戏<Flappy Bird>,以玩法简单.难度超高著称,不过,最近这款让全世界玩家几欲怒摔手机的游戏,被两位中国技术宅设计的"玩鸟机器人" ...
- 170331、58到家MQ如何快速实现流量削峰填谷
问:为什么会有本文? 答:上一篇文章<到底什么时候该使用MQ?>引起了广泛的讨论,有朋友回复说,MQ的还有一个典型应用场景是缓冲流量,削峰填谷,本文将简单介绍下,MQ要实现什么细节,才能缓 ...
- echart绑定点击事件
实例页面:http://echarts.baidu.com/echarts2/doc/example/event.html option = { tooltip : { trigger: 'axis' ...
- Mongodb系列文章
http://blog.csdn.net/congcong68 学习MongoDB 六: MongoDB查询(游标操作.游标信息)(三) Mongodb官方C#驱动示例 MongoDB Driver ...