RealTek 8169/8168/8101的驱动代码,一共就一个文件(drivers/net/r8169.c),而且总代码行也就5千行左右,很适合新手入门学习。
而像intel e1000e的驱动,包含了较多的文件(总入口文件:drivers/net/e1000e/netdev.c),总代码行至少在1万行以上。
先来看看r8169的相关代码:
rtl8169_open中,用dma_alloc_coherent为网卡的接收发送申请了描述符环。
至于接收方向,与每个描述符对应的存放报文数据的buffer,是用kmalloc_node申请的,然后通过dma_map_single(此函数返回值为物理地址)做dma映射。
值得注意的是,此处调用kmalloc_node时,指定了从网卡所属的numa node申请内存。这是对性能的考虑。
但是,驱动在从硬件接收报文时,却做了一次报文拷贝,这对性能很不利。见rtl8169_rx_interrupt函数,其内部调用了rtl8169_try_rx_copy,其代码如下。
static struct sk_buff *rtl8169_try_rx_copy(void *data,
struct rtl8169_private *tp,
int pkt_size,
dma_addr_t addr)
{
struct sk_buff *skb;
struct device *d = &tp->pci_dev->dev;
data = rtl8169_align(data);