这里只写了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. Unity3d 5.3.5使用sqlite3

    http://blog.csdn.net/glunoy/article/details/52037598 国内讲的乱七八糟,更有故作神秘提供Mono.Data.Sqlite.dll System.Da ...

  2. ICPC 2016 China Final J. Mr.Panda and TubeMaster【最大费用最大流】

    有一种限制下界强制选的,但是也可以不用 把每个格点拆成两个,一个连s一个连t,对于不是必选的连中间连流量1费用0边表示不选,然后黑白染色,黑点连横着白点连竖着,边权就是这条水管的权值,然后跑最大费用最 ...

  3. Jmeter接口自动化参数化 (转自软件测试部落)

    测试场景: 有个查询城市(大概一百个 )天气预报的接口(需求参考第一课),需要根据不同的citycode,去查询对应城市的天气预报,这种接口该如何去测试呢? 分析需求: 不管是功能测试需求,还是接口测 ...

  4. 2017-9-14 NOIP模拟赛

    送分题 (songfen)e Time Limit: 10 00ms y Memory Limit:128MB题目描述LYK 喜欢干一些有挑战的事, 比如说求区间最大子段和. 它知道这个题目有 O(n ...

  5. thinkphp5实现mysql数据库备份

    其实备份数据库说白了就是向一个.sql的文档中写入一条一条的sql命令 public function back() { $to_file_name="backsql.sql"; ...

  6. nutzboot 使用nacos替换zookeeper

    先放一段从网上拷贝一段分布式CAP理论的概念 分布式领域中存在CAP理论,且该理论已被证明:任何分布式系统只可同时满足两点,无法三者兼顾. ①C:Consistency,一致性,数据一致更新,所有数据 ...

  7. Python多继承C3算法

    Python3 多继承的MRO算法选择.MRO(Method Resolution Order):方法解析顺序. Python3 只保留了C3算法! C3算法解析: 1.C3算法解析 C3算法:MRO ...

  8. Java EE学习笔记(九)

    MyBatis的关联映射 1.关联关系概述 1).实际的开发中,对数据库的操作常常会涉及到多张表,这在面向对象中就涉及到了对象与对象之间的关联关系.针对多表之间的操作,MyBatis提供了关联映射,通 ...

  9. 转 AIX filesystemcache引发的Oracle事故

    http://blog.itpub.net/26015009/viewspace-1806629/

  10. 线段树 & 题目

    首先说下我写的线段树吧. 我是按照线段树[完全版]那个人的写法来写的,因为网上大多数题解都是按照他的写法来写. 确实比较飘逸,所以就借用了. 节点大小是maxn是4倍,准确来说是大于maxn的2^x次 ...