`
tomhibolu
  • 浏览: 1384295 次
文章分类
社区版块
存档分类
最新评论

Linux驱动修炼之道-DM9000A网卡驱动框架源码分析(中)

 
阅读更多

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处

http://blog.csdn.net/woshixingaaa/archive/2011/06/18/6552910.aspx

网络设备的初始化:

通过模块的加载函数看出DM9000A的驱动是以平台驱动的形式注册进内核的,下边是模块的加载函数:

下边是平台驱动结构体:

下面来分析probe函数,用来执行分配的内核函数是alloc_netdev,函数原型是:


这里的sizeof_priv是驱动程序私有数据区的大小;这个区成员和net_device结构一同分配给网络设备。实际上,他们都处于一大块内存中,但是驱动程序不需要知道这些。name是接口的名字,其在用户空间可见;这个名字可以使用类似printf中%d的格式,内核将用下一个可用的接口号替代%d,最后,setup是一个初始化函数,用来设置net_device结构剩余的部分。网络子系统对alloc_netdev,为不同种类的接口封装了许多函数。最常用的是alloc_etherdev,它定义在linux/etherdevice.h中:

该函数使用eth%d的形式指定分配给网络设备的名字。它提供了自己的初始化函数(ether_setup),用正确的值为以太网设备设置net_device中的许多成员。那么在DM9000A中这个私有数据成员是什么呢,看下边的结构:

这个struct board_info就是那个私有数据,用来保存芯片相关的一些私有信息。

下面是probe函数的实现:

下边看看挂起和唤醒函数:

挂起函数完成了设置挂起标志,并没有真正把设备移除而只是设置了移除标志,复位PHY,停止PHY,禁止所有中断,禁止接受引脚。

唤醒函数完成了复位dm9000,初始化dm9000,标记设备为attached,清除挂起标志。

网络设备的打开与释放:

首先来看这个open函数:

然后是stop函数:


复位PHY,停止PHY,禁止所有中断,禁止接收引脚。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics