这里只写了ath9k层到虚拟硬件层的一些东西,mac层的没有整理。

传输途径主要从ath9k_tx() --->ath_tx_start() --->ath_tx_send_normal() --->ath_tx_txqaddbuf()---->ath9k_hw_txstart()

ath9k_tx()(main.c):

static void ath9k_tx(struct ieee80211_hw *hw,

struct ieee80211_tx_control *control,

struct sk_buff *skb)

{

struct ath_softc *sc = hw->priv;

struct ath_common *common = ath9k_hw_common(sc->sc_ah);

struct ath_tx_control txctl;

struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;

unsigned long flags;

if (sc->ps_enabled) {

/*

* mac80211 does not set PM field for normal data frames, so we

* need to update that based on the current PS mode.

*/

//加载结构ath_sofc中硬件的详细信息和更新PM位

if (ieee80211_is_data(hdr->frame_control) &&

!ieee80211_is_nullfunc(hdr->frame_control) &&

!ieee80211_has_pm(hdr->frame_control)) {

ath_dbg(common, PS,

"Add PM=1 for a TX frame while in PS mode\n");

hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);

}

}

if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_NETWORK_SLEEP)) {

/*

* We are using PS-Poll and mac80211 can request TX while in

* power save mode. Need to wake up hardware for the TX to be

* completed and if needed, also for RX of buffered frames.

*/

ath9k_ps_wakeup(sc); //唤醒正在休眠的硬件

spin_lock_irqsave(&sc->sc_pm_lock, flags);

if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_AUTOSLEEP))

ath9k_hw_setrxabort(sc->sc_ah, 0);

if (ieee80211_is_pspoll(hdr->frame_control)) {

ath_dbg(common, PS,

"Sending PS-Poll to pick a buffered frame\n");

sc->ps_flags |= PS_WAIT_FOR_PSPOLL_DATA;

} else {

ath_dbg(common, PS, "Wake up to complete TX\n");

sc->ps_flags |= PS_WAIT_FOR_TX_ACK;

}

/*

* The actual restore operation will happen only after

* the ps_flags bit is cleared. We are just dropping

* the ps_usecount here.

*/

spin_unlock_irqrestore(&sc->sc_pm_lock, flags);

ath9k_ps_restore(sc);

}

/*

* Cannot tx while the hardware is in full sleep, it first needs a full

* chip reset to recover from that

*/

if (unlikely(sc->sc_ah->power_mode == ATH9K_PM_FULL_SLEEP)) {

ath_err(common, "TX while HW is in FULL_SLEEP mode\n");

goto exit;

}

//用数据结构ath_tx_control跟踪传输状态

memset(&txctl, 0, sizeof(struct ath_tx_control));

txctl.txq = sc->tx.txq_map[skb_get_queue_mapping(skb)];

txctl.sta = control->sta;

ath_dbg(common, XMIT, "transmitting packet, skb: %p\n", skb);

//这里进入下一步的传输,在ath_tx_start中启动传输

if (ath_tx_start(hw, skb, &txctl) != 0) {

ath_dbg(common, XMIT, "TX failed\n");

TX_STAT_INC(txctl.txq->axq_qnum, txfailed);

goto exit;

}

return;

exit:

ieee80211_free_txskb(hw, skb);

}

传输途径 ath9k层到硬件层的更多相关文章

  1. mac层到ath9k层,ath9k层到硬件层

    如上图,整个 mac 层分成两个部分——UMAC 和 LMAC.LMAC 分成 MAC 下半部分和硬件抽象层. 硬件抽象层和ath9k层的连接 在hw.h中的函数struct ath_hw_ops() ...

  2. 第11节-BLE协议HCI层的硬件接口

    本篇博客由韦东山视频整理所得 如何控制链路层让其发出广播包.数据包?通过HCI层向它发出命令,也可以通过ATT层.L2CAP层向LL层发出数据. 学习资料: 蓝牙协议core_v5.0.pdf < ...

  3. 在Ubuntu上为Android系统内置Java应用程序测试Application Frameworks层的硬件服务(老罗学习笔记6)

    一:Eclipse下 1.创建工程: ---- 2.创建后目录 3.添加java函数 4.在src下创建package,在package下创建file 5.res---layout下创建xml文件,命 ...

  4. 通过硬件层提高Android动画的性能

    曾有许多人问我为什么在他们开发的应用中,动画的性能表现都很差.对于这类问题,我往往会问他们:你们有尝试过在硬件层解决动画的性能问题么? 我们都知道,在播放动画的过程中View在每一帧动画的显示时重绘自 ...

  5. 为Android系统内置Java应用程序测试Application Frameworks层的硬件服务

    我们在Android系统增加硬件服务的目的是为了让应用层的APP能够通过Java接口来访问硬件服务.那么, APP如何通过Java接口来访问Application Frameworks层提供的硬件服务 ...

  6. gcc 头文件是用户应用程序和函数库之间的桥梁和纽带 功能的真正逻辑实现是以硬件层为基础

    gcc GCC, the GNU Compiler Collection - GNU Project - Free Software Foundation (FSF) http://gcc.gnu.o ...

  7. 一个项目中说系统分为表现层、控制层、逻辑层、DAO层和最终数据库五层架构-转

    表现层就是看到的东西,比如你现在看到的当前页面控制层就将你的请求从页面传到后台代码逻辑层就是处理你的请求的代码DAO层就是将数据存到数据库中的代码数据库就是数据库了,存东西用的 ,DAO层就是将访问数 ...

  8. Linux 网卡驱动学习(六)(应用层、tcp 层、ip 层、设备层和驱动层作用解析)

    本文将介绍网络连接建立的过程.收发包流程,以及当中应用层.tcp层.ip层.设备层和驱动层各层发挥的作用. 1.应用层 对于使用socket进行网络连接的server端程序.我们会先调用socket函 ...

  9. Android native进程间通信实例-binder篇之——HAL层访问JAVA层的服务

    有一天在群里聊天的时候,有人提出一个问题,怎样才能做到HAL层访问JAVA层的接口?刚好我不会,所以做了一点研究. 之前的文章末尾部分说过了service call 可以用来调试系统的binder服务 ...

随机推荐

  1. [Xcode 实际操作]六、媒体与动画-(14)使用SystemSoundId播放简短声音

    目录:[Swift]Xcode实际操作 本文将演示如何播放音频素材. 在项目名称上点击鼠标右键,弹出右键菜单, 选择[Add Files to "DemoApp"],往项目中导入文 ...

  2. HDU-1068-GirlsandBoys(最大独立集,二分图匹配)

    链接:https://vjudge.net/problem/HDU-1068#author=0 题意: 学校对n个学生(男女都有)进行的调查了,发现了某些学生暗生情愫,现在需要你选出一个最大的集合,这 ...

  3. Linux上安装Docker,并成功部署NET Core 2.0

    概述 容器,顾名思义是用来存放并容纳东西的器皿: 而容器技术伴着Docker的兴起也渐渐的映入大家的眼帘,它是一个抽象的概念,同时也是默默存在世上多年的技术,不仅能使应用程序间完全的隔离,而且还能在共 ...

  4. oracle rollback 观察时间

    ###########issue 0: db alert 有如下提示, thread 1 cannot allocatete new log, sequenec 1111 通过检查v$log ,发现1 ...

  5. 057 Insert Interval 插入区间

    给出一个无重叠的按照区间起始端点排序的区间列表.在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间).示例 1:给定区间 [1,3],[6,9],插入并合并 ...

  6. Auto yes to the License Agreement on sudo apt-get -y install oracle-java7-installer

    参考一 参考二 我自己的做法是: && add-apt-repository ppa:webupd8team/java \ && apt-get update \ &a ...

  7. HDU 1176 免费馅饼 矩阵取数, dp + 滚动数组

    http://acm.hdu.edu.cn/showproblem.php?pid=1176 首先可以处理出整张地图的状态. book[T][POS]表示第T秒,在第pos个地方有多少个馅饼. dp[ ...

  8. Codeforces Round #377 (Div. 2) D. Exams 贪心 + 简单模拟

    http://codeforces.com/contest/732/problem/D 这题我发现很多人用二分答案,但是是不用的. 我们统计一个数值all表示要准备考试的所有日子和.+m(这些时间用来 ...

  9. ruby 正则表达式 匹配所有符合规则的信息

    假设一个字符串当中有很多符合规则的信息,下面的例子可以把所有匹配到的结果打印出来: message="afhadhffkdf414j9tr3j43i3433094jwoert223jwew1 ...

  10. 用TextWriterTraceListener实现建议log文件记录

    log4net之类3方组件确实很方便,但是想写个小小的demo之类的程序,有点用不起啊. 微软自带的TraceListener要实现一个简易的日志帮助类还是很简单的,直接上代码,自己备用,也希望对同样 ...