此生既入苦寒山,何妨再攀险峰!
分类:
2011-08-24 11:38:56
原文地址:Linux以太网驱动笔记1 作者:myleeming
1. 首先澄清两个概念:
物理层(PHY):定义了数据传送与接收所需要的电与光信号、线路状态、时钟基准、数据编码和电路等,并向数据链路层设备提供标准接口。物理层的芯片称之为PHY。
数据链路层(MAC):则提供寻址机构、数据帧的构建、数据差错检查、传送控制、向网络层提供标准的数据接口等功能。以太网卡中数据链路层的芯片称之为MAC控制器。
2. 网络设备和块设备最大的不同:块设备只响应来自内核的请求,而网络驱动程序异步地接手来自外部世界的数据包
3. 阅读以太网驱动可以先从:/drivers/net下面的loopback.c plip.c 然后再深入到sep4020的网卡驱动。
4. net_device结构有一个priv的私有数据指针,出于性能和灵活性方面的考虑,不鼓励直接访问priv成员,当驱动程序需要访问私有数据指针时,应当使用netdev_priv函数。
5. net_device的大部分接口相关的信息可由ether_setup函数(针对以太网)正确设置,针对其他非以太网接口的也有相应的辅助函数,第三版中说在drivers/net/net_init.c中有,可是我找了半天没找着,不知道是不是linux2.6的高版本中修改了
6. 关于net_device->flags的具体描述在/include/linux/if.h中
7. 一旦准备好开始发送数据,open方法还应该启动接口的传输队列,,具体函数为netif_start_queue;在接口被关闭时,必须调用设备不能传输其他数据包的函数,netif_stop_queue.,我们通常也在发送的过程中调用netif_stop_queue.来暂停发送,我们这里的开始,停止,暂停都是以内核为主体的。
8. 我们的以太网驱动关于数据包传输(tx)那一块可能有提升性能的空间,我们在实现这个函数的时候已进入就是用netif_stop_queue函数使内核暂停发包,但是对于我们的硬件缓冲区开辟在esram中,可以容纳20次同时传输,而不向其他的硬件只能承载单个数据包(第三版p511),因此可能在这里我们可以作改进,待看完后继续。
9. 由于网络驱动的设备速度很快,收发包的频率也很快,因此一旦出现异常情况而采用我们在普通驱动里面一贯采用的不加任何限制的printk输出提示,可能会造成每秒钟成千上万的控制台消息,不仅使系统整理性能下降,而且可能会隐藏潜在的问题,因此内核提供了一种方式
为了防止printk()瞬时被呼叫次数过多,可以通过printk_ratelimit()来控制速度。 printk_ratelimit()通過跟蹤發送到控制台的消息數量工作,當輸出速度超過一個臨界值,就返回零。 printk_ratelimit()通过跟踪发送到控制台的消息数量工作,当输出速度超过一个临界值,就返回零。 可通過修改/proc/sys/kernel/{printk_ratelimit, printk_ratelimit_burst} 來調節printk_ratelimit() 的計算。可通过修改/proc/sys/kernel/{printk_ratelimit, printk_ratelimit_burst}来调节printk_ratelimit()的计算。
printk_ratelimit() 的典型用法如下: printk_ratelimit()的典型用法如下:
if (printk_ratelimit()) if (printk_ratelimit())
printk(KERN_INFO "Hello, world!\n"); printk(KERN_INFO "Hello, world!\n");
10. 网卡中断的两种重要的事务就是:新数据包的到达,外发数据包的传输完成。
11. 网卡驱动除了常见的中断模式,还有轮询模式;轮询的低效率仅表现在接口没有事情做的是很,如果系统中存在处理大流量的高速接口时,每个时候都有大量的数据包需要处理,这时候就没有必要用中断了,利用轮询反而效率更高,也就是linux中的NAPI技术,相应的资料可以参考/Documentation/networking/NAPI_HOWTO.txt
12. 在以太网的rx(数据包接收),一般都会这样写:skb = alloc_skb(pktlen + 2, GFP_ATOMIC); 然后再接下来的代码中skb_reserve(skb, 2); 该函数可在数据包前保留2个字节,这样14字节的以太网头就变成16字节,可以和IP头(16字节)对齐。
13. MII (Media Independent Interface 介质无关接口)
MII即媒体独立接口,它是IEEE-802.3定义的以太网行业标准。它包括一个数据接口,以及一个MAC和PHY之间的管理接口(图1)。
数据接口:包括分别用于发送器和接收器的两条独立信道。每条信道都有自己的数据、时钟和控制信号。MII数据接口总共需要16个信号。
管理接口:是个双信号接口,一个是时钟信号,另一个是数据信号。通过管理接口,上层能监视和控制PHY。MII Management interface只有两条信号线。
14. 正如之前所提到的,MAC和PHY之间有两条独立信道,一条是数据,一条是管理。
对应我们的SEP4020手册中的接口信号:
/************************以下是数据********************************/
MCLK I MAC 时钟 GPI8
MTXD1 O MAC 发送数据第 1 位 GPI7
MTXD0 O MAC 发送数据第 0 位 GPI6
MTXEN O MAC 发送使能 GPI5
MCRS_DV I MAC 载波信号及接收有效 GPI4
MRXD1 I MAC 接收数据第 1 位 GPI3
MRXD0 I MAC 接收数据第 0 位 GPI2
/************************以下是管理*******************************/
MDC O MAC 到 PHY 的时钟输出 GPI1
MDIO I/O MAC到PHY的输入输出数据 GP12
/****************************************************************/
15. 通过netif_carrier_off,netif_carrier_on来显示的告诉以太网接口层链路状态的改变,也可以通过netif_carrier_ok来检测当前的载波状态。