Start接口是否UPN清除中断标志,关闭该类中断检查中断状态字HAL_INT_FATALHAL_INT_RXHAL_INT_TXFatal Error Tasklet关闭接收中断关闭发送中断调用ath_rx_tasklet调用ath_tx_taskletEnd中断处理过程
1. 网络设备wifi0打开的时候会调用ath_init()函数(if_ath.c),该注册了中断处理函数:
irqreturn_t ath_intr(int irq, void *dev_id, struct pt_regs *regs) 2. 中断处理过程:
a) 调用ath_hal_intrpend(ah),查看是否为自己的设备产生的中断,如果不是则返
回。
b) 如果NIC没有Open则调用ath_hal_getisr(ah, &status); /* clear ISR */和
ath_hal_intrset(ah, 0); /* disable further intr's */
c) 调用ath_hal_getisr(ah, &status);获得产生中断的类型,根据不同的类型进行不
同的处理。HAL_INT_RX为数据接收中断,调用ATH_SCHEDULE_TQUEUE(&sc->sc_rxtq, &needmark);HAL_INT_TX为数据发送中断,调用ATH_SCHEDULE_TQUEUE(&sc->sc_txtq, &needmark),启动相应的工作队列。
3. 接收工作队列处理函数static void ath_rx_tasklet(TQUEUE_ARG data)
a) 从struct ath_softc的sc_rxbuf中取出第一个空闲的struct ath_buf b) 调用ath_hal_rxprocdescfast(),与HAL层同步descript,获得状态 c) 检查状态并处理各种接收错误
d) 如果net80211协议栈没有该站点信息,则新建立一个站点信息,计算RSSI e) 如果是聚合帧,则调用owl_input函数处理数据帧,否则调用ieee80211_input
传递数据帧到协议栈
Start从队列中取出一个ath_buf与HAL层同步Desc,获取状态rx_stats处理接收错误YRx_stats != 0从队列中取出一个ath_buf协议栈是否有该node?Y记录RSSIY生成一个新nodeAggressive?owl_input处理aggresive帧ieee80211_input传递数据给协议栈ath_led_eventY还有待处理buf?EndAth_rx_tasklet流程图
4. net802.11协议栈处理接收到的数据帧(检查是否关联、是否需要解密、是否为
AMSDU帧……),通过调用ieee80211_deliver_data函数,最终调用了netif_rx。
netif_rx () 内核 ieee80211_deliver_data () MAC层 ieee80211_input () ath_rx_tasklet () 物理驱动层 ath_intr() 产生接收中断 NIC 数据帧接收流程图 硬件层 5.5 数据发送
各个虚拟VAP的dev数据结构中的hard_start_xmit()函数指针赋值为ieee80211_hardstart()。
dev_queue_xmit () 内核 hard_start_xmit () ieee80211_hardstart() 查到目的node? Y 是否关联? Y Y 驱动 PowerSave? ieee80211_pwrsave()缓存待发送数据帧 skb->dev = parent skb的dev指向物理设备 丢弃数据帧 dev_queue_xmit () 数据帧发送流程图
5.6 参数配置
atheros的无线驱动的参数配置通过Linux Wireless Extension定义的标准ioctl集以及atheros定义的私有ioctl集来完成。驱动层的wlan.ko负责处理这些ioctl。
5.6.1 Linux Wireless Extensions处理函数(标准部分)
static struct iw_handler_def ieee80211_iw_handler_def = { #define N(a) (sizeof (a) / sizeof (a[0]))
.standard = (iw_handler *) ieee80211_handlers, .num_standard = N(ieee80211_handlers),
.private = (iw_handler *) ieee80211_priv_handlers, .num_private = N(ieee80211_priv_handlers),
.private_args = (struct iw_priv_args *) ieee80211_priv_args, .num_private_args = N(ieee80211_priv_args), #undef N };
static const iw_handler ieee80211_handlers[] = {
(iw_handler) NULL, /* SIOCSIWCOMMIT */
(iw_handler) ieee80211_ioctl_giwname, /* SIOCGIWNAME */ (iw_handler) NULL, /* SIOCSIWNWID */ (iw_handler) NULL, /* SIOCGIWNWID */
(iw_handler) ieee80211_ioctl_siwfreq, /* SIOCSIWFREQ */ (iw_handler) ieee80211_ioctl_giwfreq, /* SIOCGIWFREQ */ (iw_handler) ieee80211_ioctl_siwmode, /* SIOCSIWMODE */ (iw_handler) ieee80211_ioctl_giwmode, /* SIOCGIWMODE */ (iw_handler) ieee80211_ioctl_siwsens, /* SIOCSIWSENS */ (iw_handler) ieee80211_ioctl_giwsens, /* SIOCGIWSENS */ (iw_handler) NULL /* not used */, /* SIOCSIWRANGE */ (iw_handler) ieee80211_ioctl_giwrange, /* SIOCGIWRANGE */ (iw_handler) NULL /* not used */, /* SIOCSIWPRIV */ (iw_handler) NULL /* kernel code */, /* SIOCGIWPRIV */ (iw_handler) NULL /* not used */, /* SIOCSIWSTATS */ (iw_handler) NULL /* kernel code */, /* SIOCGIWSTATS */ (iw_handler) NULL, /* SIOCSIWSPY */ (iw_handler) NULL, /* SIOCGIWSPY */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* -- hole -- */
(iw_handler) ieee80211_ioctl_siwap, /* SIOCSIWAP */ (iw_handler) ieee80211_ioctl_giwap, /* SIOCGIWAP */ (iw_handler) NULL, /* -- hole -- */
(iw_handler) ieee80211_ioctl_iwaplist, /* SIOCGIWAPLIST */ #ifdef SIOCGIWSCAN
(iw_handler) ieee80211_ioctl_siwscan, /* SIOCSIWSCAN */ (iw_handler) ieee80211_ioctl_giwscan, /* SIOCGIWSCAN */ #else
(iw_handler) NULL, /* SIOCSIWSCAN */ (iw_handler) NULL, /* SIOCGIWSCAN */ #endif /* SIOCGIWSCAN */
(iw_handler) ieee80211_ioctl_siwessid, /* SIOCSIWESSID */ (iw_handler) ieee80211_ioctl_giwessid, /* SIOCGIWESSID */ (iw_handler) ieee80211_ioctl_siwnickn, /* SIOCSIWNICKN */ (iw_handler) ieee80211_ioctl_giwnickn, /* SIOCGIWNICKN */ (iw_handler) NULL, /* -- hole -- */ (iw_handler) NULL, /* -- hole -- */
(iw_handler) ieee80211_ioctl_siwrate, /* SIOCSIWRATE */ (iw_handler) ieee80211_ioctl_giwrate, /* SIOCGIWRATE */ (iw_handler) ieee80211_ioctl_siwrts, /* SIOCSIWRTS */ (iw_handler) ieee80211_ioctl_giwrts, /* SIOCGIWRTS */ (iw_handler) ieee80211_ioctl_siwfrag, /* SIOCSIWFRAG */ (iw_handler) ieee80211_ioctl_giwfrag, /* SIOCGIWFRAG */ (iw_handler) ieee80211_ioctl_siwtxpow, /* SIOCSIWTXPOW */
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库Atherose pb42无线AP简要分析 (2)(4)在线全文阅读。
相关推荐: