上次写到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就是传说中的初始化函数,在向内核注册之后,这个函数就被首先调用来进行初始化。
有点累了,先休息一下。
未完待续。