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结构的进一步初始化,包括指定打开、传送、关闭等函数。

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

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

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

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

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

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

注意:这里我们区分一下两个函数wlan_tx_packetwlan_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);--->

 

 

 

 

 

 

 

 

你可能感兴趣的:(wlan驱动的代码总结)