YT6801 GMAC驱动核心深度解析

YT6801 GMAC 驱动核心解析
这份代码是 YT6801 芯片的 GMAC(千兆以太网控制器)Linux 内核驱动,核心实现以太网数据的收发、硬件控制、调试诊断等功能。以下从执行流程、核心原理、调用结构三方面拆解,帮你快速掌握核心逻辑。
一、整体架构与核心文件分工
先明确代码文件夹中关键文件的角色,建立整体认知:
文件 核心作用
fuxi-gmac.h 驱动核心结构体、宏定义(如寄存器偏移、标志位)
fuxi-gmac-net.c 核心!网络数据收发(TX/RX)、NAPI 轮询、数据包处理
fuxi-gmac-ioctl.c IOCTL 控制接口(调试、EFUSE 读写、MAC 配置、环回测试等)
fuxi-gmac-hw.c 硬件底层操作(寄存器读写、MAC/PHY 硬件初始化)
fuxi-gmac-desc.c DMA 描述符(desc)操作(初始化、重置、映射 / 解映射)
fuxi-gmac-phy.c PHY 芯片交互(链路协商、状态检测)
fuxi-gmac-pci.c PCIe 总线适配(设备枚举、资源申请、中断注册)
fuxi-efuse.c/h EFUSE(一次性可编程存储)操作(MAC 地址、配置参数读写)
fuxi-os.h 跨系统适配结构体(如用户 / 内核数据交互结构)
二、核心执行流程
驱动的执行流程遵循 Linux 网络驱动标准框架,核心分为初始化、数据收发、控制 / 调试、中断处理四大阶段。
阶段 1:驱动初始化(入口在 pci_probe)
PCI 设备探测:fuxi-gmac-pci.c中fxgmac_pci_probe作为 PCI 驱动入口,完成:
申请 PCI 资源(IO 地址、中断);
初始化核心结构体fxgmac_pdata(设备私有数据,包含硬件操作集、通道、统计信息等);
注册网络设备(register_netdev);
初始化硬件(调用hw_ops->hw_init,对应fuxi-gmac-hw.c);
注册 NAPI(网络中断优化机制)、MSI-X 中断(多队列中断)。
硬件初始化:hw_ops(硬件操作集)完成:
复位 GMAC 控制器;
配置 MAC 参数(速率、双工、校验和卸载等);
初始化 DMA 收发描述符环(TX/RX Ring);
初始化 PHY(链路协商)。
阶段 2:数据接收(RX)流程(核心在fuxi-gmac-net.c)
Linux 网络驱动采用NAPI(中断 + 轮询) 优化高吞吐场景,RX 流程如下:
plaintext
硬件收包 → 触发RX中断 → 关闭中断 → NAPI轮询 → 处理数据包 → 重新使能中断
核心函数调用链:
plaintext
fxgmac_one_poll_rx(NAPI轮询入口)

fxgmac_rx_poll(核心RX处理)

fxgmac_dev_read(读取硬件接收状态)

fxgmac_create_skb(创建skb数据包)

napi_gro_receive(将skb交给内核协议栈)
关键逻辑:
描述符环(RX Ring):驱动预先分配一组 DMA 描述符,每个描述符指向一个 skb(内核网络数据包结构),硬件收包后直接 DMA 到 skb 缓冲区,避免 CPU 拷贝;
NAPI 轮询:中断触发后,先关闭中断,再通过fxgmac_rx_poll批量处理数据包(budget为单次最大处理数),处理完再开中断;
数据包校验:检查长度、校验和、VLAN 标签、错误标志,异常则统计并丢弃;
环回测试适配:代码中包含环回测试逻辑(fxgmac_test_tso_flag/fxgmac_test_packet_len),接收包后拷贝到测试缓冲区,用于调试。
阶段 3:数据发送(TX)流程(核心在fuxi-gmac-net.c)
TX 流程是 “内核提交数据包→驱动填充描述符→硬件 DMA 发送→轮询清理完成的描述符”:
plaintext
协议栈发包 → dev_queue_xmit → 驱动tx函数 → 填充TX描述符 → 硬件DMA发送 → NAPI轮询清理描述符
核心函数调用链:
plaintext
fxgmac_one_poll_tx(NAPI轮询入口)

fxgmac_tx_poll(核心TX处理)

hw_ops->tx_complete(检查硬件是否完成发送)

desc_ops->unmap_desc_data(解映射skb,释放资源)

netdev_tx_completed_queue(统计发送完成的包数/字节数)
关键逻辑:
TX 描述符环:与 RX 类似,驱动将协议栈的 skb 映射到 DMA 地址,填充描述符后通知硬件取包发送;
发送完成检查:fxgmac_tx_poll轮询检查描述符的 “OWN 位”(硬件所有权),硬件发送完成后,驱动释放 skb 并重置描述符;
TX 挂死检测:代码中包含 TX 挂死保护(FXGMAC_TX_HANG_TIMER_ENABLED),若描述符长时间未被硬件处理,触发设备重启;
队列唤醒:当 TX 描述符空闲数超过阈值(FXGMAC_TX_DESC_MIN_FREE),唤醒被暂停的发送队列。
阶段 4:IOCTL 控制与调试(核心在fuxi-gmac-ioctl.c)
用户层通过ioctl指令与驱动交互,完成调试、配置操作,核心流程:
plaintext
用户层调用ioctl → fxgmac_netdev_ops_ioctl(入口)

校验指令合法性(魔数、指令号)

拷贝用户层数据到内核

根据cmd_type分支处理(如环回测试、EFUSE读写、MAC配置)

将结果拷贝回用户层
核心指令类型(cmd_type):
指令类型 作用
FXGMAC_DFS_IOCTL_DIAG_BEGIN/END 环回测试开始 / 结束
FXGMAC_EFUSE_READ/WRITE_* EFUSE 读写(MAC 地址、补丁寄存器、LED 配置)
FXGMAC_GET/SET_MAC_DATA 读取 / 设置 MAC 地址(写入 EFUSE 永久生效)
FXGMAC_DFS_IOCTL_DEVICE_RESET 设备重置
FXGMAC_EFUSE_LOAD 加载 EFUSE 配置到硬件
三、核心原理

  1. DMA 描述符机制
    GMAC 控制器通过DMA 描述符环实现无 CPU 参与的数据包收发:
    描述符(fxgmac_dma_desc)包含缓冲区地址、长度、状态位(如 OWN 位:0 = 驱动拥有,1 = 硬件拥有);
    TX:驱动填充描述符→置 OWN 位→硬件 DMA 取数发送→清 OWN 位→驱动回收;
    RX:驱动预置空描述符→置 OWN 位→硬件收包后 DMA 填数据→清 OWN 位→驱动取数。
  2. NAPI 机制
    传统中断模式下,高吞吐时中断频繁导致 CPU 占用过高;NAPI 将 “中断触发” 改为 “中断 + 轮询”:
    首次收包触发中断,关闭中断,切换为轮询模式;
    轮询处理完所有待处理包后,重新使能中断;
    驱动中fxgmac_one_poll_rx/tx是 NAPI 轮询函数,绑定到中断队列。
  3. EFUSE(一次性可编程存储)
    YT6801 的 EFUSE 用于存储关键配置(掉电不丢):
    MAC 地址、PHY 配置、LED 参数、补丁寄存器;
    fuxi-efuse.c提供读写接口,ioctl指令通过hw_ops调用这些接口;
    写 EFUSE 通常是一次性操作,驱动中做了参数校验避免误写。
  4. 环回测试(调试核心)
    驱动支持硬件环回测试(用于调试):
    通过FXGMAC_DFS_IOCTL_DIAG_BEGIN开启测试,标记lb_test_flag=1;
    收发流程中检测测试标志,将收到的包缓存到fxgmac_test_skb_array;
    FXGMAC_DFS_IOCTL_DIAG_END关闭测试,释放缓存的 skb。
    四、核心调用结构(关键结构体 + 函数依赖)
  5. 核心结构体
    结构体 作用 核心成员
    fxgmac_pdata 设备私有数据(全局核心) netdev(网络设备)、hw_ops(硬件操作集)、channel(收发通道)、expansion(扩展字段:测试标志、skb 缓存)
    fxgmac_channel 收发通道(多队列) tx_ring/rx_ring(描述符环)、napi_tx/napi_rx(NAPI 对象)
    fxgmac_ring 描述符环 cur/dirty(读写指针)、dma_desc_count(描述符数量)、desc_data(描述符数据)
    fxgmac_desc_data 描述符关联数据 dma_desc(硬件描述符)、skb(关联的数据包)、rx/tx(收发专用字段)
    ext_ioctl_data IOCTL 数据交互 cmd_type(指令类型)、cmd_buf(数据大小)
  6. 核心操作集(函数指针)
    驱动通过 “操作集” 解耦硬件逻辑与上层流程,核心操作集:
    c
    运行
    // 硬件操作集(fuxi-gmac-hw.c实现)
    struct fxgmac_hw_ops {
    int (*hw_init)(struct fxgmac_pdata *pdata); // 硬件初始化
    bool (*tx_complete)(struct fxgmac_dma_desc *desc); // 检查TX完成
    int (*read_mac_subsys_from_efuse)(…); // 读MAC地址
    int (*write_mac_subsys_to_efuse)(…); // 写MAC地址
    // … 其他硬件操作(LED、EFUSE、中断)
    };

// 描述符操作集(fuxi-gmac-desc.c实现)
struct fxgmac_desc_ops {
void (*tx_desc_reset)(struct fxgmac_desc_data *desc); // 重置TX描述符
void (*unmap_desc_data)(…); // 解映射skb
// … 其他描述符操作
};
3. 关键函数调用关系图
plaintext
┌─────────────────────────────────┐
│ 上层内核网络栈 │
└───────────┬─────────────────────┘


┌─────────────────────────────────┐
│ register_netdev (网络设备注册) │
└───────────┬─────────────────────┘


┌─────────────────────────────────┐
│ NAPI轮询(rx/tx) │
│ ├─ fxgmac_one_poll_rx │
│ │ └─ fxgmac_rx_poll │
│ │ ├─ fxgmac_create_skb │
│ │ └─ napi_gro_receive │
│ └─ fxgmac_one_poll_tx │
│ └─ fxgmac_tx_poll │
│ ├─ hw_ops->tx_complete │
│ └─ desc_ops->unmap_desc │
└───────────┬─────────────────────┘


┌─────────────────────────────────┐
│ 硬件操作(hw_ops) │
│ ├─ 寄存器读写 │
│ ├─ DMA描述符操作 │
│ └─ PHY/EFUSE交互 │
└───────────┬─────────────────────┘


┌─────────────────────────────────┐
│ IOCTL控制(调试/配置) │
│ └─ fxgmac_netdev_ops_ioctl │
│ ├─ 环回测试控制 │
│ ├─ MAC地址配置 │
│ └─ EFUSE读写 │
└─────────────────────────────────┘
五、快速上手关键点
核心入口:
驱动加载:PCI probe(fxgmac_pci_probe)→ 硬件初始化 → 注册 netdev;
数据收发:NAPI 轮询(fxgmac_rx_poll/fxgmac_tx_poll)是核心;
调试配置:fxgmac_netdev_ops_ioctl是用户层控制入口。
关键调试点:
环回测试:通过FXGMAC_DFS_IOCTL_DIAG_BEGIN开启,抓包验证收发;
MAC 地址:FXGMAC_GET/SET_MAC_DATA读写 EFUSE 中的 MAC;
TX 挂死:关注FXGMAC_TX_HANG_TIMER_ENABLED相关逻辑,排查硬件卡死;
描述符环:ring->cur/ring->dirty指针是否正常推进(异常则收发异常)。
核心宏定义:
FXGMAC_MAX_DBG_BUF_LEN:调试缓冲区大小;
FXGMAC_TX_DESC_MIN_FREE:TX 队列唤醒阈值;
FXGMAC_EPHY_LOOPBACK_DETECT_ENABLED:开启 PHY 环回检测;
FXGMAC_NOT_USE_PAGE_MAPPING:关闭页映射(影响 skb 创建方式)。
异常排查:
收不到包:检查 RX 描述符是否初始化、PHY 链路是否 UP、中断是否注册;
发不出包:检查 TX 描述符 OWN 位、硬件是否复位、队列是否暂停;
MAC 地址失效:检查 EFUSE 读写是否成功(FXGMAC_GET_MAC_DATA)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1119541.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

北约2025防务全景:六代机、高超音速防御与多域作战革新

北约2025防务全景:六代机、高超音速防御与多域作战革新 文章来源 微信公众号 知未防务 北约联合空中力量能力中心(JAPCC)2025年第40期期刊聚焦“联合空天力量转型”,涵盖国防战略调整、尖端装备研发、外军实战经验等核心内容&…

基于Java web的旅游景区票务保险酒店线路管理系统的设计与实现应用和研究

文章目录摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着旅游业的快速发展,旅游景区管理系统的信息化需求日益增长。基于Java Web的旅…

计算机专业学生的普遍困境

随着互联网行业的深度调整与人工智能技术的迅猛发展,计算机专业学生正面临前所未有的焦虑与迷茫在当今高校,计算机专业的学生们往往陷入一种矛盾境地:一方面,他们怀揣着对技术的热爱和对高薪职业的期待;另一方面&#…

【2026年最新】做PPT好用的AI工具推荐

ChatPPT是必优科技(非塔猫)旗下的AI PPT工具,官网www.chatppt.cn,以“自研WernickeLLM双模型”驱动,中文语义理解、内容保真与全链路编辑能力领先,免费版开放80%核心功能,是中文场景下PPT制作的…

基于Java的加油站销售积分管理系统的设计与实应用和研究

文章目录摘要项目简介大数据系统开发流程主要运用技术介绍爬虫核心代码展示结论源码文档获取定制开发/同行可拿货,招校园代理 :文章底部获取博主联系方式!摘要 随着加油站行业竞争的加剧,提升客户忠诚度成为企业发展的关键。基于Java的加油站…

深化软件技术产业发展 助力我省打造国际一流数字经济高地的建议

软件产业是数字经济的核心支柱,更是粤港澳大湾区建设国际科技创新中心的关键抓手。当前广东软件业务收入已突破2.2万亿元,连续多年居全国首位,鸿蒙生态设备超10亿台,数字经济规模达6.9万亿元,但仍存在核心软件“卡脖子…

设计模式--享元模式

享元模式 建议阅读:https://gpp.tkchu.me/flyweight.html 定义 在我们打游戏时,有没有想过为什么这么多的人物或者景色能被这么快的渲染出来,而没有丝毫卡顿(当然GPU性能要好0.0)。 比如说,求生之路的大量丧…

KTH7111昆泰芯16位高速高精度离轴磁编码器可编程ABZ/UVW/PWM/SPI/SSI多模式输出角度传感器

KTH7111是一款高速高精度的磁编码器,内置了先进的自动非线性校准(ANLC)功能。 用户可通过写入寄存器或引脚触发校准流程,芯片能够自动完成传感器非线性误差的测 量与补偿参数计算,并将校准结果存入内部MTP(…

表格解析结果错位严重,如何纠正单元格的对应关系?

国家金融监督管理总局鼓励银行业保险业加快数字金融发展,发挥数字技术与数据要素双轮驱动作用;支持贸易数字化,鼓励金融机构利用数字技术加强贸易数据应用,创新电子贸易单据相关金融产品与服务,为电子提单等使用创造便…

台湾大哥大:全民皆可通过其交易所直接购买加密货币

电信巨擘台湾大哥大于2026年1月5日正式宣布,旗下虚拟资产交易所TWEX全面开放给所有民众使用,不再局限于其电信服务的既有用户。这项举措不仅象征着加密货币投资的“全民化”时代正式来临,更为市场提供了一个由大型企业背书、强调安全与信赖的…

一行命令踩坑?Step-Audio-EditX 中 Git LFS 报错的完整解决方案

📌 摘要 在部署 Step-Audio-EditX 这类包含大模型权重的项目时,很多同学都会遇到一个看似“莫名其妙”的错误:git: lfs is not a git command。本文将结合真实安装场景,详细分析该问题产生的原因,并给出在 Ubuntu 环境…

NginxDeny绕过-玄武杯2025-眼见不为实

一、附件代码 # pylint: disablemissing-module-docstring,missing-function-docstringimport os from flask import Flask, render_templateapp Flask(__name__, template_folder"templates")app.route("/") def index():return render_template("…

【DRIS】颠覆隐蔽通信!DRIS技术实现同步检测与无源干扰,无需信道知识和额外功耗【附MATLAB代码】

颠覆隐蔽通信!DRIS技术实现同步检测与无源干扰,无需信道知识和额外功耗 文章来源 微信公众号 EW Frontier 一、文章题目 基于迪斯科可重构智能表面(DRIS)的隐蔽通信同步检测与干扰技术 二、摘要 隐蔽通信相比密码学和物理层…

不同就业方向(如AI、网络安全、前端开发)的具体学习路径和技能要求是什么?

了解不同就业方向的具体要求,确实是做好职业规划的关键一步。下面这个表格汇总了AI、网络安全和前端开发这三个热门方向的概况,帮你快速建立整体印象。对比维度​AI(人工智能)​网络安全​前端开发​核心岗位举例​算法工程师、数…

引领企业发展:走进标杆企业参观游学考察的好处

在当前瞬息万变的商业环境中,企业面临着一个挑战:如何在快速发展的行业发展中保持竞争力,持续创新,同时还能提高员工的技能和才能?答案可能比您想象的要简单——标杆研学游学。标杆研学游学,一种通过实地考…

信创云渲染:助力数字时代自主创新与高效协作

在信息技术应用创新发展的浪潮下,各行各业正加速推进数字化、智能化转型。其中,图形图像处理与实时交互的高负载需求日益凸显,特别是在工业设计、建筑设计、仿真培训、数字孪生、互动媒体等领域。传统的本地渲染模式受限于终端算力、部署成本…

20260106给荣品RD-RK3588S-AHD开发板适配Rockchip原厂的Buildroot【linux-6.1】系统时适配hdmi0输出

20260106给荣品RD-RK3588S-AHD开发板适配Rockchip原厂的Buildroot【linux-6.1】系统时适配hdmi0输出 2026/1/6 17:44缘起:荣品PRO-RK3566开发板适配Rockchip原厂的Buildroot【linux-5.10】系统时,eth0是默认隐藏的。 查询/询问DeepSeek之后,可…

Instagram账号风控全解:深度剖析封号原因、申诉流程与长效预防策略

近年来,Instagram的风控系统日趋严格,账号被封成为许多用户,无论是个人用户、多账号运营者还是跨境电商与广告投手,都可能突然面临的困扰:明明正常操作,却突然收到账号禁用通知?新注册的账号毫无…

2026必备!专科生毕业论文必备!10个AI论文平台深度测评

2026必备!专科生毕业论文必备!10个AI论文平台深度测评 2026年专科生论文写作新选择:AI平台测评指南 随着人工智能技术的不断进步,越来越多的专科生开始借助AI工具辅助毕业论文的撰写。然而,面对市场上琳琅满目的AI论文…

基于微信小程序的毕业设计项目:个性化英语学习小程序+毕业论文+答辩ppt全套

博主介绍: CSDN毕设辅导第一人、靠谱第一人、csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客优秀创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术范围:…