DM9000 网络驱动程序¶
Copyright 2008 Simtec Electronics,
Ben Dooks <ben@simtec.co.uk> <ben-linux@fluff.org>
简介¶
本文档描述了如何使用包含在文件 drivers/net/dm9000.c 和 drivers/net/dm9000.h 中的基于 DM9000 平台设备的网络驱动程序。
该驱动程序支持三种 DM9000 变体:最初支持的 DM9000E 以及较新的 DM9000A 和 DM9000B 设备。它目前由 Ben Dooks 维护和测试,任何针对此驱动程序的补丁都应抄送给他。
定义平台设备¶
附加到平台设备的最小资源集如下:
地址寄存器的物理地址
数据寄存器的物理地址
设备中断引脚连接到的 IRQ 线。
这些资源应按此顺序指定,因为两个地址区域的顺序很重要(驱动程序期望它们分别为地址和数据)。
arch/arm/mach-s3c/mach-bast.c 中的一个示例是:
static struct resource bast_dm9k_resource[] = {
[0] = {
.start = S3C2410_CS5 + BAST_PA_DM9000,
.end = S3C2410_CS5 + BAST_PA_DM9000 + 3,
.flags = IORESOURCE_MEM,
},
[1] = {
.start = S3C2410_CS5 + BAST_PA_DM9000 + 0x40,
.end = S3C2410_CS5 + BAST_PA_DM9000 + 0x40 + 0x3f,
.flags = IORESOURCE_MEM,
},
[2] = {
.start = IRQ_DM9000,
.end = IRQ_DM9000,
.flags = IORESOURCE_IRQ | IORESOURCE_IRQ_HIGHLEVEL,
}
};
static struct platform_device bast_device_dm9k = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
.resource = bast_dm9k_resource,
};
请注意 bast_dm9k_resource[2].flags 中 IRQ 触发标志的设置,如果不存在,这将生成警告。标志字段中的触发将传递给 request_irq()
在注册 IRQ 处理程序时,以确保正确设置 IRQ。
这显示了一个典型的平台设备,没有提供可选的配置平台数据。下一个示例使用相同的资源,但添加了可选的平台数据以传递额外的配置数据。
static struct dm9000_plat_data bast_dm9k_platdata = {
.flags = DM9000_PLATF_16BITONLY,
};
static struct platform_device bast_device_dm9k = {
.name = "dm9000",
.id = 0,
.num_resources = ARRAY_SIZE(bast_dm9k_resource),
.resource = bast_dm9k_resource,
.dev = {
.platform_data = &bast_dm9k_platdata,
}
};
平台数据在 include/linux/dm9000.h 中定义,并在下面描述。
平台数据¶
DM9000 的额外平台数据可以描述设备的 IO 总线宽度、是否将外部 PHY 连接到设备以及外部配置 EEPROM 的可用性。
平台数据 .flags 字段的标志如下:
DM9000_PLATF_8BITONLY
IO 应使用 8 位操作完成。
DM9000_PLATF_16BITONLY
IO 应使用 16 位操作完成。
DM9000_PLATF_32BITONLY
IO 应使用 32 位操作完成。
DM9000_PLATF_EXT_PHY
该芯片连接到外部 PHY。
DM9000_PLATF_NO_EEPROM
这可以用来表示板上没有 EEPROM,或者应该向用户隐藏 EEPROM。
DM9000_PLATF_SIMPLE_PHY
切换到使用更简单的 PHY 轮询方法,该方法不尝试定期读取 MII PHY 状态。这仅在使用内部 PHY 时可用。有关更多信息,请参阅有关链接状态轮询的部分。
配置符号 DM9000_FORCE_SIMPLE_PHY_POLL,Kconfig 条目“强制基于简单 NSR 的 PHY 轮询”允许在构建时强制启用此标志。
PHY 链接状态轮询¶
驱动程序会跟踪链接状态,并通知网络核心有关链接(载波)可用性的信息。这由多种方法管理,具体取决于芯片的版本以及正在使用的 PHY。
对于内部 PHY,原始(当前为默认)方法是读取 MII 状态,如果芯片中具有必要的中断支持,则在状态更改时读取,或者每两秒通过定期计时器读取。
为了减少内部 PHY 的开销,现在可以选择使用 DM9000_FORCE_SIMPLE_PHY_POLL 配置或 DM9000_PLATF_SIMPLE_PHY 平台数据选项来读取摘要信息,而无需昂贵的 MII 访问。此方法更快,但不会打印太多信息。
当使用外部 PHY 时,驱动程序目前必须轮询 MII 链路状态,因为没有方法可以在链路更改时获取中断。
DM9000A / DM9000B¶
这些芯片在功能上与 DM9000E 相似,并且可以由同一驱动程序轻松支持。其特点是:
内部 PHY 状态更改时的中断。这意味着在使用内部 PHY 时,可以在这些设备上禁用 PHY 状态的定期轮询。
TCP/UDP 校验和卸载,驱动程序目前不支持。
ethtool¶
该驱动程序支持 ethtool 接口,用于访问驱动程序状态信息、PHY 状态和 EEPROM。