上次写到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就是传说中的初始化函数,在向内核注册之后,这个函数就被首先调用来进行初始化。

有点累了,先休息一下。

未完待续。

e1000网卡驱动第二天相关推荐

  1. e1000网卡驱动第二天_3

    e1000_open首先检查设备的状态,然后申请发送描述符和接收描述符,启动,初始化adapter->mng_vlan_id,获得硬件控制,e1000_configure,申请irq,开启设备, ...

  2. e1000网卡驱动初感受

    在网络上搜索到一片Linux-千兆网卡驱动实现机制浅析,自己大概浏览了一下,觉得写得很好,可是自己没有看明白的时候还是白扯.想起来一句话,文档时写给已经懂了的人的.这句话在我做一个小东西的时候领悟的特 ...

  3. 6.S081 lab: networking e1000 网卡驱动 附 Linux 网卡驱动编写分析

    本文是 6.S081 操作系统课程学习最后一个 lab,编写一个 intel 的 e1000 网卡的驱动在 xv6 下.需要复习知识有:操作系统知识,计算机组成原理 DMA 相关,循环缓冲区的概念,e ...

  4. linux网卡e1000下载,Linux E1000网卡驱动分析

    本分析主要针对e1000网卡,驱动源码为7.3.20-k2.本文的目的不是为了讲述如何编写驱动程序,主要是分析网卡驱动内部的实现机制. Linux-千兆网卡驱动实现机制浅析 作者: Minit, 出处 ...

  5. e1000网卡驱动小结

    1.网卡的初始化 e1000网卡的初始化调用函数e1000_probe(),网卡作为一种PCI设备就要初始化PCI设备的一些属性,设置DMA,初始化驱动的操作函数(收包函数.发包函数).设置循环队列缓 ...

  6. mandrake安装INTEL e1000网卡驱动

    使用U盘 #mkdir /usb #mount /dev/sda1 /usb 或 #mount /dev/scsi/host1/bus0/target0/lun0/disc /usb 如果你的电脑上还 ...

  7. Centos6.5更新e1000网卡驱动

    在工作过程中经常遇到linux的操作系统网络不正常的情况,以前没有注意到,今天查看系统日志发现原来是网络驱动的问题.索性直接更新系统,更新网卡 问题:linux系统经常出现断网的情况,重启之后系统恢复 ...

  8. 网络数据包收发流程(三):e1000网卡和DMA

    早就想整理网络数据包收发流程了,一直太懒没动笔.今天下决心写了 一.硬件环境 intel82546:PHY与MAC集成在一起的PCI网卡芯片,很强大 bcm5461:   PHY芯片,与之对应的MAC ...

  9. linux没有网卡驱动能pxe吗,PXE所需要的网卡驱动制作

    对PXE 来说: vmlinuz:就是引导内核文件 initr.img:就是驱动文件 如果遇到机器网卡不被PXE支持怎么办? 解决思路 如果熟悉 Linux 的启动过程和驱动程序,那么要解决本文的问题 ...

最新文章

  1. 【Ubuntu】dpkg: 处理软件包 XXXX (--configure)时出错解决方法
  2. python语言程序设计基础第二版第六章答案-Python语言程序设计基础(第2版) 课后题 第六章...
  3. 一个简单的apache cgi-bin
  4. The mook jong 计数DP
  5. 使用Infinispan作为持久性解决方案
  6. 49session的生命周期实例
  7. linux修改upd53端口,Centos iptables打开端口53
  8. 送书 | 主成分分析PCA
  9. C#LeetCode刷题之#643-子数组最大平均数 I( Maximum Average Subarray I)
  10. Eigen教程(1)之简介
  11. C语言pop_back用法,【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)...
  12. 算法 Tricks(一)—— 字符串和数组的翻转
  13. 一阶滞后环节matlab,一个一阶惯性带有滞后环节的PID仿真程序
  14. 自定义View之Layout方法详解
  15. 基于MATLAB的线性规划
  16. Windows XP下无法安装字体的解决方案
  17. HBase:HBase的rowKey设计技巧
  18. ImageView实现圆形头像效果
  19. 国内外Java学习论坛汇总
  20. Win32_DiskDrive 硬盘 参数说明

热门文章

  1. win10如何修改锁屏(欢迎界面)的用户名
  2. 关于CreateParams的参数
  3. 争取能让大家都能看懂的 DFA 算法
  4. 理解SVM ——入门SVM和代码实现
  5. 自己动手写操作系统--搭建保护模式下的运行环境:bochs下安装freedos
  6. Python机器学习05——判别分析
  7. EditText的hint居中,设置EditText的hint位置
  8. Java面向对象01:什么是面向对象
  9. 20189220 余超《Linux内核原理与分析》第五周作业
  10. 微信小程序js把数字转化成字母