wireless流程简明分析

一, 注册流程
 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发送。

你可能感兴趣的:(wireless流程简明分析)