这里只写了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. java中的 break continue return作用详解

    break: 此语句导致程序终止包含它的循环,并进行程序的下一阶段(整个循环后面的语句),即,不是跳到下一个循环周期而是退出循环.如果break语句包含在嵌套循环里,它只跳出最里面的循环. 如下代码: ...

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

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

  3. 第八届蓝桥杯大赛个人赛决赛(软件类)真题C++

    哥德巴赫分解 哥德巴赫猜想认为:不小于4的偶数都可以表示为两个素数的和. 你不需要去证明这个定理,但可以通过计算机对有限数量的偶数进行分解,验证是否可行. 实际上,一般一个偶数会有多种不同的分解方案, ...

  4. ES6新特性使用小结(三)

    九.数据类型 Symbol /* * Symbol 数据类型 概念: Symbol 提供一个独一无二的值 * */ { let a1 = Symbol(); let a2 = Symbol(); co ...

  5. POJ-3177-RedundantPaths(边联通分量,缩点)

    链接:https://vjudge.net/problem/POJ-3177#author=Dillydally 题意: 有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可 ...

  6. sublime下Docblocker插件自定义配置

    1.下载安装Docblocker插件 栏目preferences-->Package Control 输入 Docblocker 搜索插件,单击安装 简单使用: 在函数头部输入: /**   按 ...

  7. js中把字符串转换成number格式方法

    方法主要有三种 转换函数.强制类型转换.利用js变量弱类型转换. 1. 转换函数: js提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有 ...

  8. spark-2.2.0-bin-hadoop2.6和spark-1.6.1-bin-hadoop2.6发行包自带案例全面详解(java、python、r和scala)之Basic包下的JavaPageRank.java(图文详解)

    不多说,直接上干货! spark-1.6.1-bin-hadoop2.6里Basic包下的JavaPageRank.java /* * Licensed to the Apache Software ...

  9. 看懂物联网fr

        看懂物联网 2015-10-11 物联网世界 1.第三次IT浪潮 互联网时代的特征是信息驱动了生产力,无论众包.订单式生产这些理论:还是B2C.O2O各类业务模式:归根结底,是信息优化了生产关 ...

  10. windows环境下memcache配置方法 详细篇

    将memcache服务器安装包解压到C:\memcached文件夹后,使用cmd命令窗口安装. 1>开始>运行:CMD(确定) 2>cd C:\memcached(回车) 3> ...