e1000网卡驱动第二天

news/2025/3/4 7:49:12/

    上次写到e1000_configure,不去详细关注内部的实现。只是先按照函数的顺序来理解,e1000_set_rx_mode应该是设置接收相关的控制寄存器,设置接收的模式。e1000_restore_vlan似乎有些困难,保存某个状态还是什么,等到湘西看的时候再说吧。e1000_init_manageability对MANC寄存器进行初始化。e1000_configure_tx设置传输相关的寄存器。e1000_setup_rctl设置rctl寄存器。e1000_configure_rx设置接收相关的寄存器,包括一些接收相关的函数。然后为接收申请缓冲区,指针保存在adapter->rx_ring[]这个数组中。

    e1000_up这个函数应该是启动过程中需要执行的。我们看看它里面有什么相关的操作。e1000_configure这个函数执行了很多东西,我们不去看细节了。clear_bit(__E1000_DOWN, &adapter->flags);表明清除down比特,也就是开启这个设备。napi_enable开启napi功能,napi的接收机制还不太了解。e1000_irq_enable对IMS寄存器进行写操作,功能是使能irq。现在网卡可以中断处理器了。ew32(ICS, E1000_ICS_LSC);对于这行代码有一个注释:fire a link change interrupt to start the watchdog。通过链路状态的改变来启开watchdog。为了满足好奇,我们先去看看ICS寄存器的功能:大概就是如果设置这个寄存器的某个位,这个位的中断就被产生了。E1000_ICS_LSC=0x00000004 /* Link Status Change */这样链路状态改变这个中断就发出了,那么谁来响应这个中断呢?根据注释应该是watchdog这个函数。好的,分析到此为止。

    e1000_power_up_phy对PHY_CTRL进行写操作,也就是设置了启动命令。读写操作通过e1000_write_phy_reg和e1000_read_phy_reg莱实现的,我们不去管他们实现的细节,读intel 82571的文档可以发现phy寄存器,只有32个,这个ctrl寄存器是第0个,用于控制底层。可以被软件所配置。在函数前面的注释中说明,这个函数后面应该紧接着调用e1000_reset函数,因为启动底层会导致很多物理的动作,也就是说,可能各种状态都改变了。

    e1000_power_down_phy与up对应。在down之前,也就是对PHY_CTRL进行写操作之前,需要进行各种检测,比如wol, amt等,如果他们是活动的,那么就不能进行down操作。

    e1000_down首先进行adapter->flags的设置,将其设置为down.从而不能重新调度watchdog函数。对应于e1000_up的napi_enable,我们调用napi_disable来实现禁止napi。e1000_irq_disable来禁止中断。然后删除三个时钟函数,随后保存了tx_queue_len是什么意思,不明白。netif_carrier_off(netdev);通知内核此设备的载波丢失。netif_stop_queue(netdev);停止队列,通知内核不要进行接收和发送操作?我觉得是这样子的。e1000_reset(adapter);e1000_clean_all_tx_rings(adapter);e1000_clean_all_rx_rings(adapter);随后的这三个操作后面两个也许好理解,可是为什么调用e1000_reset呢?让设备和驱动都处于一种已知的状态么?也许是因为down之后需要处理一下,不要让设备无序。

    e1000_reinit_locked似乎是用于重新初始化的,利用resetting标志位来确定,e1000_down和e1000_up来重新启动驱动。

    e1000_reset很大一部分代码用于确定pba,我们查找一下pba的作用,用于设置接收和发送缓冲区大小。然后设置了hw的一些变量和成员,e1000_reset_hw函数的调用让hw处于一个已知的状态么?然后是e1000_init_hw。e1000_update_mng_vlan用来设置一些vlan的东西。后来继续设置硬件,e1000_reset_adaptive以及读写IGP02E1000_PHY_POWER_MGMT寄存器,最后释放了控制。

    e1000_dump_eeprom对eeprom进行检测,也就是说在相信eeprom没有出错前,必须进行校验,如果校验正确,则可以继续使用其中的数值。

    e1000_is_need_ioport用来确定一个适配器是否需要io端口资源。

    e1000_probe就是传说中的初始化函数,在向内核注册之后,这个函数就被首先调用来进行初始化。

    有点累了,先休息一下。

    未完待续。


http://www.ppmy.cn/news/585102.html

相关文章

EHub_tx1_tx2_E100 Cartographer 完美部署安装

目录 1.1 安装必要的依赖包 1.2 protobuf安装 1.3 ceres 1.13.0安装 1.4 abseil 安装 1.5 carographer 安装 特别的错误解决: 1.6 carographer 测试 目前机器人使用中需要进行SLAM建图,因为移动机器人想要实现自主行走,核心在于实现自主…

ROS机器人 RIA-E100使用

E100 以下内容源自 原E100文档: Demo Applications — Gaitech EDU 2.5 documentation https://edu.gaitech.hk/ria_e100/demo-apps.html 克隆git&编译 mkdir –p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://github.com/gaitech-robotics/RIA-E100…

e1000e网卡驱动分析笔记

驱动中有e1000的e1000e两个版本, 差别不大, e1000e使用了msix, 更先进一点点. 比较难懂的都是一些基础系的东西, 如下 1) PCIE的配置空间初始化 2) msix机制及初始化 3) napi机制 4) dma机制 下面一个个回答这些问题, 因为内容实在太多, 没法每个问题将的很清楚, 而且我…

e100网卡收包流程分析

四、网卡的数据接收内核如何从网卡接受数据,传统的经典过程: 1、数据到达网卡; 2、网卡产生一个中断给内核; 3、内核使用I/O指令,从网卡I/O区域中去读取数据; 我们在许多网卡驱动中,都可以在网卡…

E100.C简析(~/drivers/net/ethernet/intel/e100.c)

2019独角兽企业重金招聘Python工程师标准>>> 支持网络协议栈的底层网卡驱动是一个怎么也绕不过去的话题,以Intel PRO/100网卡驱动为例,分析一下Linux下网卡驱动的实现。同时也兼谈一些pci总线的问题。PCI总线的框架系统只提供对PCI总线系统的…

Intel E100 网卡驱动实例分析

本来是做zero-copy的,顺便把分析记录写下来,供大家参考,如果有错误清大家多包涵。只挑重要的来说,一些细节的地方我也不大懂,要看芯片手册才行,我们作软件的就别看那么细了,最重要是把主要流程弄…

Java获取文件的hash值(SHA256)

目录 简介 获取网络文件的sha256值(方式一) 获取本地文件的sha256值(方式二) 简介 在工作开发当中需求要通过文件的hash值比对文件是否被篡改过,于是通过使用了(sha256)hash值进行比对&#x…

【STL】容器适配器

放在专栏【C知识总结】,会持续更新,期待支持 1、什么是适配器? 我们生活中就存在大量的适配器,最常见的莫过于我们常见的电源适配器,它的作用就是将交流电源转化为直流电源进行输出,可以说电源适配器在电流…