wlan驱动的代码总结

wlan驱动的代码总结:   

一: wlan_probe 函数中要完成的工作(主要是 wlan_add_card 函数)

此函数在 sdio 的驱动中已经讲诉过是 wlan 设备的一些准备工作及注册过程,它主要完成以下几件事情:

1 )、建立 net_device 结构,关于此结构的扩展可以参看《 linux 设备驱动》网络驱动章节。相应的调用是 alloc_etherdev 函数,此函数为 alloc_netdev 的上层调用(细节请参看《 linux 设备驱动》)。

2 )、接下来是对 net_device 结构中一些成员的初始化,完成这此注册的函数是内核函数 register_netdev

关于其中详细的初始化过程,其大致的流程如下:

  a 、对 net_device 结构的进一步初始化,包括指定打开、传送、关闭等函数。

  b wlan_init_sw 用来初始化软件适配器部分,也就是会初始化一个 wlan_adapter 结构体,同时初始化 wlan 中的命令响应定时器。

  c wlan_create_thread 创建主线程,线程函数是 wlan_service_main_thread ,此函数为 wlan 驱动中的主要处理函数,负责对接收数据和发送数据完成中断的相应——对应的函数为 sbi_get_int_status ,此函数将会完成中断处理;对深度睡眠的设备的唤醒——对应的函数为 sbi_exit_deep_sleep ;对响应设备命令的回复——对应的函数为 wlan_process_cmdresp ;对设备事件的处理——对应的函数为 wlan_process_event

随后的 os_sched_timeout 用于超时唤醒(睡眠指定的时间后,由时间超时来唤醒),主要是确认线程安全的建立。

  d sbi_register_dev 初始化 SDIO 设备,关于这个函数查看《 sdio 驱动笔记文档》。

  e SET_NETDEV_DEV 实现 sysfs 中物理设备创建一个与网络类逻辑设备的链接,也就是说将物理设备与网络设备联系起来。

  f wlan_init_fw 下载固件至网卡,主要用于命令、时间等的响应。

注意:这里我们区分一下两个函数 wlan_tx_packet wlan_process_tx 。在 wlan_service_main_thread 中我们调用的是 wmm_process_tx 函数用来推送数据,而 wmm_process_tx 主要使用 wlan_process_tx 来推送数据,也就是说我们实际使用的是 wmm_process_tx 函数来推送数据(有关 wmm 的一些知识,请参阅另一篇 < 文档 IEEE 802.11e 分析文档 > )。

那么另一个函数 wlan_tx_packet 呢?我们注意到这个初始化语句 dev->hard_start_xmit = wlan_hard_start_xmit ,这是对设备用 来实际操作数据推送的函数的初始化,将缓冲区中的数据推送至网卡的这个过程将由此函数完成。这个函数实际调用的函数即是 wlan_tx_packet 函数,我们在看一下 wlan_tx_packet ,它会调用 wmm_map_and_add_skb 将数据放入 wmm 的缓冲区,然后唤醒主线程 wlan_service_main_thread 去处理,主线程会调用 wmm_process_tx 函数,剩下步骤请参看上面。

对于接收数据的函数来说,则是 wlan_process_rx_packet ,它是在检测到设备发出数据到达的中断时被调用的,也就是说在 sbi_get_int_status 函数中。

 

注册过程

sbi_register();--->

sdio_register_driver(&wlan_sdio)-->

int sdio_register_driver(struct sdio_driver *drv)
{
 drv->drv.name = drv->name;
 drv->drv.bus = &sdio_bus_type;
 return driver_register(&drv->drv);

}

--->bus_add_driver(drv);--->

driver_attach(drv);-->

bus_for_each_dev(drv->bus, NULL, drv, __driver_attach);-->

driver_probe_device(drv, dev);-->

drv->bus->match(dev, drv)--》驱动定义的ID和通过sdio读出模块的ID对比看是否一致)

really_probe(dev, drv);---->

                                            wlan_probe --->真正调用驱动的probe

driver_bound(dev);--->

你可能感兴趣的:(thread,linux,工作,网络,service,文档)