这里只写了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. E20190420-hm

    impact n. 巨大影响; 强大作用; 撞击; 冲撞; 冲击力;      v. (对某事物) 有影响,有作用; 冲击; 撞击; incident  n. 发生的事情(尤指不寻常的或讨厌的); 严 ...

  2. Unity 5.6中的混合光照(下)

    https://mp.weixin.qq.com/s/DNQFsWpZm-ybIlF3DTAk2A 在<Unity 5.6中的混合光照(上)>中,我们介绍了混合模式,以及Subtracti ...

  3. bzoj4889: [Tjoi2017]不勤劳的图书管理员(树套树)

    传送门 据说正解线段树套平衡树 然而网上参考(抄)了一个树状数组套动态开点线段树的 思路比较清楚,看代码应该就明白了 //minamoto #include<iostream> #incl ...

  4. [Xcode 实际操作]五、使用表格-(8)自定义UITableView单元格Accessory样式(附件图标)

    目录:[Swift]Xcode实际操作 本文将演示如何自定义单元格的附件图标. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //首先添 ...

  5. GFS安装

    GlusterFS 搭建 1.环境要求 IP地址 主机名称 系统 172.16.2.201 test01 Centos 6.4 172.16.2.202 test02 Centos 6.4 172.1 ...

  6. Linux常用命令(补充)-grep

    grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正 ...

  7. 特殊形状图片之遮罩蒙版CSS3-Mask效果

    前不久做了一个项目,需要一个小效果,就是获取用户头像以心形的形状展现在页面上,开始小五想的实现方式是canvas画图或CSS3的clip(剪切),发现都不理想,和设计稿里的图形美观度相差太大,而且实现 ...

  8. Linux下FTP用户的使用配置

    1.创建本地账户,用户名为自己的姓名拼音,使用本地用户测试,从以下几个方面来观察,账户 .密码.访问目录(可否查看上级目录) .上传下载的权限.

  9. 删除vi编辑产生的.swp文件(linux编辑文件没有退出时直接关闭程序产生的临时文件)

    关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备不测(不测下面讨论),如果你正常退出,那么这个 ...

  10. @Column 注解详情

    @Column标记表示所持久化属性所映射表中的字段,该注释的属性定义如下: @Target({METHOD, FIELD}) @Retention(RUNTIME) public @interface ...