
cpsw-proxy-client.c 驱动代码解析一、驱动定位与核心架构这是 TI CPSWCommon Platform Ethernet Switch代理客户端驱动运行在A72 Linux 侧通过RPMsg与运行在MAIN R5F 核上的 EthFwEthernet Firmware服务器通信间接控制 CPSW 以太网交换机硬件。核心设计思想Linux 不直接操作 CPSW 硬件而是作为客户端向 R5F 上的 EthFw 服务器发送请求由服务器分配资源并管理底层硬件。这就是Proxy Client的含义。二、数据结构层次cpsw_proxy_priv (全局驱动实例) ├── rpmsg_device — RPMsg 通信端点 ├── virt_ports[] — 虚拟端口数组 │ └── virtual_port — 单个虚拟端口 │ ├── net_device — Linux 网络设备eth0/eth1/eth2... │ ├── rx_chans[] — RX DMA 通道数组 │ │ └── rx_dma_chan — NAPI hrtimer UDMA RX通道 CPPI描述符池 │ ├── tx_chans[] — TX DMA 通道数组 │ │ └── tx_dma_chan — NAPI hrtimer UDMA TX通道 CPPI描述符池 │ ├── mcast_list — 组播地址列表 │ └── vlan_mcast_list[] — 每VLAN组播列表 ├── req_params — 请求参数互斥保护 └── resp_msg — 响应消息缓冲两种虚拟端口类型第41-44行VIRT_SWITCH_PORT— 交换端口ALE决定转发目的VIRT_MAC_ONLY_PORT— 纯MAC端口定向发送到物理MAC口三、模块功能分块1. RPMsg 通信层第226-502行回调函数cpsw_proxy_client_cb第226行接收 EthFw 服务器发来的消息ETHFW_MSG_NOTIFY处理异步通知ETHFW_NOTIFYCLIENT_HWERROR硬件错误 → 关闭网络设备ETHFW_NOTIFYCLIENT_RECOVERED恢复 → 重新打开网络设备ETHFW_MSG_RESPONSE请求-响应模式的回复通过completion唤醒等待者请求-响应机制send_request_get_response第447行构造请求消息 →rpmsg_send发送 →wait_for_completion_timeout等待500ms超时→ 回调填充响应 → 返回所有请求串行化req_params_mutex保护消息构造create_request_message第300行支持 15 种请求类型涵盖RX/TX DMA 通道分配与释放MAC 地址分配/注册/注销VLAN 加入/离开组播过滤添加/删除IPv4 地址注册/注销虚拟端口附加/分离/信息查询/链路状态2. 虚拟端口生命周期管理第504-813行初始化流程probe 中依次调用get_virtual_port_info() → 向EthFw查询可用端口信息 ↓ → 获得 vswitch_ports/vmac_ports 位掩码 attach_virtual_ports() → 逐个附加端口获取 token/features/通道数 ↓ allocate_port_resources() → 分配RX流、TX线程、MAC地址 ↓ init_tx_chans() / init_rx_chans() → 创建UDMA通道和CPPI描述符池 ↓ init_netdevs() → 创建net_device并注册 ↓ register_dma_irq_handlers() → 注册DMA中断清理流程反向释放包含detach_virtual_ports()通知 EthFw 释放远端资源。3. TX 发送路径第1845-2000行vport_ndo_xmit— 核心发送函数skb → DMA映射 → 分配CPPI5描述符 → 填充psdata(校验和卸载) → 处理非线性skb的frags → skb_tx_timestamp() → BQL更新 → k3_udma_glue_push_tx_chn() 推送到UDMA → 流控检查关键细节第1891-1894行Switch端口由ALE路由MAC端口则设置port_id定向发送第1903-1913行TX 校验和卸载通过psdata[2]传递偏移信息给硬件第1954行skb_tx_timestamp(skb)— 软件发送时间戳已在主线代码中第1972-1983行描述符池不足时停队列带 SMP 内存屏障防竞态TX 完成路径tx_compl_packets第1068行从 UDMA 完成队列pop描述符 →vport_xmit_free释放 DMA 映射和描述符 →napi_consume_skb释放 skb → BQL 更新 → 唤醒停住的队列4. RX 接收路径第1195-1356行接收轮询vport_rx_poll第1323行NAPI 轮询每轮 budget 个包调用vport_rx_packets从 UDMA pop 描述符 → 解析 psdata 获取校验和信息 →dma_unmap_single→skb_put设置数据长度 →vport_rx_csum处理校验和 →napi_gro_receive送协议栈完成后分配新 skb 通过vport_rx_push推回给硬件RX 校验和vport_rx_csum第1170行解析 psdata[2] 中的硬件校验和结果对非分片的 IPv4/IPv6 TCP/UDP 包设置CHECKSUM_UNNECESSARY。5. 网络设备操作第1810-2093行NDO 回调函数功能ndo_openvport_ndo_open开启DMA通道、NAPI、注册MAC到EthFwndo_stopvport_ndo_stop注销MAC、停止DMA、teardownndo_start_xmitvport_ndo_xmit发送数据包ndo_get_stats64vport_ndo_get_statsper-CPU 统计聚合ndo_tx_timeoutvport_ndo_tx_timeout超时诊断与恢复ndo_set_rx_modevport_set_rx_mode组播过滤通过workqueuendo_vlan_rx_add_vidvport_add_vid加入VLANndo_vlan_rx_kill_vidvport_del_vid离开VLAN组播管理第1588-1691行不支持混杂模式组播过滤由 EthFw 服务器执行。Switch 端口需要ETHFW_MCAST_FILTERINGfeature 才支持。6. Ethtool 操作第1374-1503行回调功能get_linkMAC端口通过RPMsg查询链路状态Switch端口用通用实现get/set_coalesce配置 RX/TX 中断合并hrtimer pacing最小 20usget/set_per_queue_coalesce按队列配置中断合并get_ts_info声明软件时间戳能力本次新增7. IPv4 地址同步第2398-2516行Switch 端口注册inetaddr_notifier当 IP 地址变化时自动向 EthFw 注册/注销 IPv4 地址用于硬件路由。8. 驱动注册与平台适配第2541-2665行SoC 适配SoCDMA 兼容字符串J7200/J721E/J784S4ti,j721e-navss-main-udmapAM62PXti,am64-dmss-pktdma驱动以rpmsg_driver形式注册module_rpmsg_driver匹配ETHFW_SERVICE_EP_NAME端点名。四、中断与 NAPI 架构硬中断 → disable_irq_nosync → napi_schedule ↓ NAPI poll → 批量处理描述符 → napi_complete_done ↓ ┌─ 有 pacing → hrtimer 延迟 enable_irq └─ 无 pacing → 直接 enable_irqhrtimer pacing 机制允许在高低负载间平衡中断频率通过 ethtool coalesce 配置。五、与 EthFw 的关系图┌─────────────────────────────┐ │ A72 Linux │ 本驱动 │ cpsw-proxy-client │ │ ┌───────────┐ ┌─────────┐ │ │ │ eth0 (SW) │ │eth2(MAC)│ │ │ └─────┬─────┘ └────┬────┘ │ │ │ RPMsg通道 │ │ ├────────┼──────────────────┤ │ R5F EthFw Server │ │ ┌─────┴─────┐ ┌────┴────┐│ │ │ CPSW ALE │ │PHY 接口 ││ │ │ 交换逻辑 │ │ MAC ││ │ └───────────┘ └─────────┘│ └─────────────────────────────┘Linux 侧的每个virtual_port对应 EthFw 分配的一个虚拟端口DMA 通道由 EthFw 远端配置k3_udma_glue_request_remote_rx_chn_for_thread_idLinux 侧只负责描述符池管理和数据收发。六、数据流总结发送skb→ DMA映射 → CPPI5描述符链 → UDMA TX推入 → 硬件发送 → 完成中断 → NAPI回收接收预分配skb → UDMA RX推入 → 硬件接收 → 完成中断 → NAPI pop → 解析校验和 → 协议栈 → 补充新skb