Altera 三速以太网 MAC 驱动程序

版权所有 © 2008-2014 Altera Corporation

这是 Altera 三速以太网 (TSE) 控制器的驱动程序,它使用 SGDMA 和 MSGDMA 软 DMA IP 组件。该驱动程序使用平台总线来获取组件资源。用于测试此驱动程序的设计是为 Cyclone(R) V SOC FPGA 板、Cyclone(R) V FPGA 板构建的,并分别使用 ARM 和 NIOS 处理器主机进行了测试。预期的用例是嵌入式系统和外部对等设备之间用于状态和嵌入式系统的简单配置的简单通信。

有关更多信息,请访问 www.altera.com 和 www.rocketboards.org。驱动程序的支持论坛可以在 www.rocketboards.org 上找到,用于测试此驱动程序的设计也可以在那里找到。也可以从维护者处获得此驱动程序的支持,该维护者可以在 MAINTAINERS 中找到。

三速以太网、SGDMA 和 MSGDMA 组件都是软 IP 组件,可以使用 Altera Quartus 工具链组装并构建到 FPGA 中。Quartus 13.1 和 14.0 用于构建此驱动程序测试的设计。sopc2dts 工具用于为驱动程序创建设备树,可以在 rocketboards.org 上找到。

驱动程序探测函数检查设备树,并确定三速以太网实例是使用 SGDMA 还是 MSGDMA 组件。然后,探测函数将安装适当的 DMA 例程集,以初始化、设置发送、接收和各自配置的中断处理原语。

SGDMA 组件将在不久的将来(在 2014 年初编写时的未来 1-2 年内)被弃用,转而使用 MSGDMA 组件。包含 SGDMA 支持是为了现有设计和参考,以防开发人员希望支持他们自己的软 DMA 逻辑和驱动程序支持。任何新的设计都不应使用 SGDMA。

SGDMA 一次仅支持单个发送或接收操作,因此与 MSGDMA 软 IP 相比,性能不会那么好。请访问 www.altera.com 了解已知的、有文档记录的 SGDMA 勘误表。

目前,SGDMA 或 MSGDMA 都不支持分散/收集 DMA。分散/收集 DMA 将添加到此驱动程序的未来维护更新中。

目前不支持巨型帧。

该驱动程序将 PHY 操作限制为 10/100Mbps,并且尚未完全测试 1Gbps。此支持将在未来的维护更新中添加。

1. 内核配置

内核配置选项是 ALTERA_TSE

设备驱动程序 ---> 网络设备支持 ---> 以太网驱动程序支持 ---> Altera 三速以太网 MAC 支持 (ALTERA_TSE)

2. 驱动程序参数列表

  • debug: 消息级别(0:无输出,16:全部);

  • dma_rx_num:接收列表中的描述符数量(默认为 64);

  • dma_tx_num:发送列表中的描述符数量(默认为 64)。

3. 命令行选项

驱动程序参数也可以通过使用命令行传递

altera_tse=dma_rx_num:128,dma_tx_num:512

4. 驱动程序信息和注意事项

4.1. 发送过程

当内核调用驱动程序的发送例程时,它会通过调用底层 DMA 发送例程(SGDMA 或 MSGDMA)来设置发送描述符,并启动发送操作。一旦发送完成,发送 DMA 逻辑就会驱动一个中断。驱动程序通过回收发送和跟踪请求的发送操作所需的资源,在中断处理链的上下文中处理发送完成。

4.2. 接收过程

驱动程序将在驱动程序初始化期间将接收缓冲区发布到接收 DMA 逻辑。接收缓冲区可能会或可能不会排队,具体取决于底层 DMA 逻辑(MSGDMA 能够对接收缓冲区进行排队,SGDMA 不能将接收缓冲区排队到 SGDMA 接收逻辑)。当收到数据包时,DMA 逻辑会生成中断。驱动程序通过获取 DMA 接收逻辑状态来处理接收中断,并收集接收完成情况,直到没有更多的接收完成情况可用为止。

4.3. 中断缓解

驱动程序能够使用 NAPI 来缓解其接收操作的 DMA 中断数量。发送操作尚不支持中断缓解,但将在未来的维护版本中添加。

4.4) Ethtool 支持

支持 Ethtool。可以使用以下命令获取驱动程序统计信息和内部错误:ethtool -S ethX。可以转储寄存器等。

4.5) PHY 支持

该驱动程序与 PAL 兼容,可用于 PHY 和 GPHY 设备。

4.7) 源文件列表:

  • Kconfig

  • Makefile

  • altera_tse_main.c:主网络设备驱动程序

  • altera_tse_ethtool.c:ethtool 支持

  • altera_tse.h:私有驱动程序结构和通用定义

  • altera_msgdma.h:MSGDMA 实现函数定义

  • altera_sgdma.h:SGDMA 实现函数定义

  • altera_msgdma.c:MSGDMA 实现

  • altera_sgdma.c:SGDMA 实现

  • altera_sgdmahw.h:SGDMA 寄存器和描述符定义

  • altera_msgdmahw.h:MSGDMA 寄存器和描述符定义

  • altera_utils.c:驱动程序实用程序函数

  • altera_utils.h:驱动程序实用程序函数定义

5. 调试信息

驱动程序导出调试信息,例如内部统计信息、调试信息、MAC 和 DMA 寄存器等。

用户可以使用 ethtool 支持来获取统计信息:例如,使用:ethtool -S ethX(显示统计计数器)或查看 MAC 寄存器:例如,使用:ethtool -d ethX

开发人员还可以使用 “debug” 模块参数来获取进一步的调试信息。

6. 统计信息支持

控制器和驱动程序支持 IEEE 标准定义的统计信息、RFC 定义的统计信息以及驱动程序或 Altera 定义的统计信息的组合。包含这些统计信息的标准定义的四个规范如下

TSE 和设备驱动程序支持的统计信息如下

“tx_packets” 等效于 IEEE 802.3-2012 第 5.2.2.1.2 节中定义的 aFramesTransmittedOK。此统计信息是成功发送的帧的计数。

“rx_packets” 等效于 IEEE 802.3-2012 第 5.2.2.1.5 节中定义的 aFramesReceivedOK。此统计信息是成功接收的帧的计数。此计数不包括任何错误数据包,例如 CRC 错误、长度错误或对齐错误。

“rx_crc_errors” 等效于 IEEE 802.3-2012 第 5.2.2.1.6 节中定义的 aFrameCheckSequenceErrors。此统计信息是长度为整数个字节且在接收帧时未通过 CRC 测试的帧的计数。

“rx_align_errors” 等效于 IEEE 802.3-2012 第 5.2.2.1.7 节中定义的 aAlignmentErrors。此统计信息是长度不是整数个字节且在接收帧时未通过 CRC 测试的帧的计数。

“tx_bytes” 等效于 IEEE 802.3-2012 第 5.2.2.1.8 节中定义的 aOctetsTransmittedOK。此统计信息是从接口成功发送的数据和填充字节的计数。

“rx_bytes” 等效于 IEEE 802.3-2012 第 5.2.2.1.14 节中定义的 aOctetsReceivedOK。此统计信息是控制器成功接收的数据和填充字节的计数。

“tx_pause” 等效于 IEEE 802.3-2012 第 30.3.4.2 节中定义的 aPAUSEMACCtrlFramesTransmitted。此统计信息是从网络控制器发送的 PAUSE 帧的计数。

“rx_pause” 等效于 IEEE 802.3-2012 第 30.3.4.3 节中定义的 aPAUSEMACCtrlFramesReceived。此统计信息是网络控制器接收的 PAUSE 帧的计数。

“rx_errors” 等效于 RFC 2863 中定义的 ifInErrors。此统计信息是接收到的包含错误的数据包数量的计数,这些错误阻止了数据包传递到更高级别的协议。

“tx_errors” 等效于 RFC 2863 中定义的 ifOutErrors。此统计信息是由于错误而无法发送的数据包数量的计数。

“rx_unicast” 等效于 RFC 2863 中定义的 ifInUcastPkts。此统计信息是接收到的未寻址到广播地址或多播组的数据包数量的计数。

“rx_multicast” 等效于 RFC 2863 中定义的 ifInMulticastPkts。此统计信息是接收到的寻址到多播地址组的数据包数量的计数。

“rx_broadcast” 等同于 RFC 2863 中定义的 ifInBroadcastPkts。此统计数据是对接收到的目标地址为广播地址的包的数量的计数。

“tx_discards” 等同于 RFC 2863 中定义的 ifOutDiscards。此统计数据是未传输的出站数据包的数量,即使未检测到错误。可能发生这种情况的一个原因是释放内部缓冲区空间。

“tx_unicast” 等同于 RFC 2863 中定义的 ifOutUcastPkts。此统计数据是对未寻址到多播组或广播地址的已传输数据包的数量的计数。

“tx_multicast” 等同于 RFC 2863 中定义的 ifOutMulticastPkts。此统计数据是对寻址到多播组的已传输数据包的数量的计数。

“tx_broadcast” 等同于 RFC 2863 中定义的 ifOutBroadcastPkts。此统计数据是对寻址到广播地址的已传输数据包的数量的计数。

“ether_drops” 等同于 RFC 2819 中定义的 etherStatsDropEvents。此统计数据是对由于缺少内部控制器资源而丢弃的数据包数量的计数。

“rx_total_bytes” 等同于 RFC 2819 中定义的 etherStatsOctets。此统计数据是对控制器接收的总字节数的计数,包括错误和丢弃的数据包。

“rx_total_packets” 等同于 RFC 2819 中定义的 etherStatsPkts。此统计数据是对控制器接收的数据包总数的计数,包括错误、丢弃、单播、多播和广播数据包。

“rx_undersize” 等同于 RFC 2819 中定义的 etherStatsUndersizePkts。此统计数据是对接收到的长度小于 64 字节的格式正确的数据包数量的计数。

“rx_oversize” 等同于 RFC 2819 中定义的 etherStatsOversizePkts。此统计数据是对接收到的长度大于 1518 字节的格式正确的数据包数量的计数。

“rx_64_bytes” 等同于 RFC 2819 中定义的 etherStatsPkts64Octets。此统计数据是对接收到的长度为 64 个八位字节的数据包总数的计数。

“rx_65_127_bytes” 等同于 RFC 2819 中定义的 etherStatsPkts65to127Octets。此统计数据是对接收到的长度在 65 到 127 个八位字节之间(包含 65 和 127)的数据包总数的计数。

“rx_128_255_bytes” 等同于 RFC 2819 中定义的 etherStatsPkts128to255Octets。此统计数据是接收到的长度在 128 到 255 个八位字节之间(包含 128 和 255)的数据包总数。

“rx_256_511_bytes” 等同于 RFC 2819 中定义的 etherStatsPkts256to511Octets。此统计数据是接收到的长度在 256 到 511 个八位字节之间(包含 256 和 511)的数据包总数。

“rx_512_1023_bytes” 等同于 RFC 2819 中定义的 etherStatsPkts512to1023Octets。此统计数据是接收到的长度在 512 到 1023 个八位字节之间(包含 512 和 1023)的数据包总数。

“rx_1024_1518_bytes” 等同于 RFC 2819 中定义的 etherStatsPkts1024to1518Octets。此统计数据是接收到的长度在 1024 到 1518 个八位字节之间(包含 1024 和 1518)的数据包总数。

“rx_gte_1519_bytes” 是 Altera TSE 的特定行为定义的统计数据。此统计数据是对接收到的长度在 1519 和 frm_length 寄存器中配置的最大帧长度之间的正确帧和错误帧的数量的计数。有关更多详细信息,请参阅 Altera TSE 用户指南。

“rx_jabbers” 等同于 RFC 2819 中定义的 etherStatsJabbers。此统计数据是接收到的长度大于 1518 个八位字节,并且具有以下情况的数据包总数:带有整数个八位字节的错误 CRC (CRC 错误) 或带有非整数个八位字节的错误 CRC (对齐错误)。

“rx_runts” 等同于 RFC 2819 中定义的 etherStatsFragments。此统计数据是接收到的长度小于 64 个八位字节,并且具有以下情况的数据包总数:带有整数个八位字节的错误 CRC (CRC 错误) 或带有非整数个八位字节的错误 CRC (对齐错误)。