一, 注册流程
1. 首先注册SDIO卡,进行一些初始化。
2. 进入sdio的probe, 里边调用wlan_add_card()接口。
3. 在这里创建了两个主要的线程
1. wlan_service_main_thread 主要的IO处理
2. wlan_reassociation_thread 主要进行AP的处理,断开时自动重连AP等。
4. 初始化wlan的fw.
5. 注册sbi, 注册net_device设备。
二,数据发送流程
1. wlan_hard_start_xmit接受到数据,接着调用wlan_tx_packet。
2. 在wlan_tx_packet中,通过wmm_map_and_add_skb将skb拷贝到内存中.
3. 调用wake_up_interruptible(&priv->MainThread.waitQ)唤醒mainthread.
4. 主线程通过wmm_process_tx, 调用wlan_process_tx。
5. 最后通过sbi_host_to_card将skb包,发送到card上,由sdio送入wifi模组。
6. wmm_process_fw_iface_tx_xfer_start本身将数据发送。
三, 分析完数据流的通道,看看上层与底层交互的通道。
1. dev->do_ioctl = wlan_do_ioctl, ioctl 流程
1. 跳到wlan_do_ioctl, 进行ioctl 处理。
2. 数据是直接通过参数返回的。
2. 通过wlan_handler_def的netlink返回, 通用的和私有的接口
struct iw_handler_def wlan_handler_def = {
num_standard:sizeof(wlan_handler) / sizeof(iw_handler),
num_private:sizeof(wlan_private_handler) / sizeof(iw_handler),
num_private_args:sizeof(wlan_private_args) / sizeof(struct iw_priv_args),
standard:(iw_handler *) wlan_handler,
private:(iw_handler *) wlan_private_handler,
private_args:(struct iw_priv_args *) wlan_private_args,
#if WIRELESS_EXT > 20
get_wireless_stats:wlan_get_wireless_stats,
#endif
};
3. 返回的方式也有两种,1种直接通过参数返回,1种通过wireless_send_event发送。
阅读(1982) | 评论(0) | 转发(0) |