这里只写了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. 多版本Shader与multi_compile

    多版本Shader与multi_compile   https://docs.unity3d.com/Manual/SL-MultipleProgramVariants.html   #pragma ...

  2. 【Unity】物理碰撞实验

    http://www.cnblogs.com/javawebsoa/archive/2013/05/18/3085818.html 这几天为了准备面试,所以决定对平时学习中的盲点扫盲一下,首先想到的就 ...

  3. [UE4]C++设置AnimInstance的相关问题

    注意:ue4 4.17调用LoadObject<UAnimBlueprintGeneratedClass>直接崩 http://aigo.iteye.com/blog/2285001 UA ...

  4. 51nod1154(dp)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1154 题意:中文题目诶- 思路:字符串长度不大于5e3,O(n ...

  5. 2015 Noip提高组 Day2

    P2678 跳石头 [题目背景] 一年一度的“跳石头”比赛又要开始了! [题目描述] 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和 ...

  6. DNS(域名系统)服务器

    DNS(Domain Name System),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的Ip数串.通过主机名,最终得到该主机 ...

  7. 6.Python初窥门径(小数据池,集合,深浅拷贝)

    Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的 ...

  8. MySQL server has gone away和Maximum execution time of 120 seconds exceeded

    今天在写采集时碰到两个问题1.MySQL server has gone away2.Maximum execution time of 120 seconds exceeded 采集程序写好运行大概 ...

  9. Eclipse中各图标含义

    Eclipse中定义很多小图标,在平时的开发工作中,熟悉这些小图标还是很有意义的.那具体意义大家又知道多少呢? 首先,通过在搜索“eclipse icon meaning”,找到了一个比较有用的链接, ...

  10. plsql过期注册

    Product Code:4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserial Number:601769password:xs374ca 打开plsql工具 点击注册即可