【驱动】DM9000网卡驱动分析

Preface


   内核源码版本:linux-2.6.18

   网卡驱动·linux内核网络分层结构http://infohacker.blog.51cto.com/6751239/1221140



DM9000芯片


   DM9000是一款高度集成低功耗快速以太网处理器,该芯片集成了MAC和PHY。DM9000可以和CPU直接连接,支持8位、16位和32位数据总线宽度。该芯片支持10M和100M自适应以太网接口,内部有16K的FIFO以及4K双字节SRAM,支持全双工工作。

   DM9000内部还集成了接收缓冲区,可以在接收到数据的时候把数据存放到缓冲区中,链路层可以直接把数据从缓冲区取走。



网卡驱动程序框架


   在一个网络驱动程序中,一般都提供了一个platform_driver结构变量。

platform_driver结构包括了网卡驱动的相关操作函数,通过platform_driver_register()函数注册到内核设备驱动列表。

   内核会根据驱动程序中设备描述设置网卡的中断和定时器,并且在网络数据包到来的时候调用网卡对应的处理函数。

   通常,网卡需要向内核提供下面几个接口函数:

    • probe:加载网卡驱动的时候执行,主要用于初始化网卡硬件接口,设置网络接口函数;

    • remove:卸载网卡驱动的时候执行该函数,用于从系统中注销网络接口函数;

    • suspend:在挂起网络设备的时候被调用;

    • resume:在恢复网络设备的时候被调用。

   网络设备驱动主要是按照内核网络数据包处理流程中用到的数据结构,设置对应的处理函数供内核使用。



DM9000网卡驱动主要数据结构


   DM9000网卡驱动位于driver/net/dm9000.c文件,有两个主要的数据结构dm9000_driver和board_info。其中,dm9000_driver是platform_driver结构。

1
2
3
4
5
6
7
8
9
10
static struct platform_driver dm9000_driver = {
    .driver = {
        .name    = "dm9000",    //网卡名称
        .owner   = THIS_MODULE,
    },
    .probe   = dm9000_probe,    //加载驱动函数
    .remove  = dm9000_drv_remove,   //删除驱动函数
    .suspend = dm9000_drv_suspend,  //挂起驱动函数
    .resume  = dm9000_drv_resume,   //恢复驱动函数
};


  • dm9000_probe()函数在加载驱动的时候被内核调用,用于检测mqh上设备并且分配资源,设置网络接口控制器;

  • dm9000_drv_remove()函数在卸载驱动的时候被调用,用于释放网卡驱动占用的资源;

  • dm9000_drv_suspend()函数在挂起网卡的时候被调用,该函数会暂时删除网络口;

  • dm9000_drv_resume()函数在恢复网卡接口时被调用,该函数重新加载网络接口。


   DM9000网卡驱动还设置了供DM9000网络控制芯片使用的 board_info结构

上一篇:CentOS 7 配置OpenLDAP


下一篇:云原生时代 Devops 实操笔记