7.5.5. 源码说明
7.5.5.1. 代码结构
Ethernet 的源码牵涉三个目录
MAC 驱动
MAC的主驱动代码
drivers/net/ethernet/zx
PHY 驱动
使用到的 mdio,phy 等模块的驱动
drivers/net/phy
SysConfig
系统时钟选择,delay 设置等
drivers/misc/zx-syscfg.c
7.5.5.1.1. 文件命名说明
aicmac_module_submodule.c
aicmac_module_submodule.h
7.5.5.1.2. 文件说明
文件名称 |
用途 |
备注 |
---|---|---|
aicmac.h |
priv 数据结构,宏入口 |
|
aicmac_core.c |
驱动核心逻辑 |
|
aicmac_platform.c |
平台相关,驱动注册,dts 配置处理 |
|
aicmac_platform.h |
platform 数据结构,包含其他模块 |
|
aicmac_napi.c |
napi 接口及相关逻辑 |
|
aicmac_mac.c |
mac相关逻辑代码 |
|
aicmac_gmac_reg.c |
gmac registers |
|
aicmac_dma.c |
dma相关逻辑代码 |
|
aicmac_dma_reg.c |
dma registers |
|
aicmac_dma_desc.c |
dma descriptor |
entended descriptor |
aicmac_dma_ring.c |
dma ring mode |
推荐使用 ringmode |
aicmac_dma_chain.c |
dma chain mode |
|
aicmac_mdio.c |
mdio 相关逻辑代码 |
|
aicmac_phy.c |
physic 相关逻辑代码 |
|
aicmac_ethtool.c |
ethtool 相关逻辑代码 |
|
aicmac_macaddr.c |
mac地址各种生成逻辑 |
|
aicmac_util.c |
公共函数 |
主要为信息格式化输出 |
aicmac_1588.c |
IEEE1588/PTP 相关逻辑 |
|
aicmac_hwstamp.c |
hardware stamp, 为 IEEE1588 服务 |
7.5.5.1.3. 函数命名说明
aicmac_module_method
7.5.5.1.4. C 文件格式
// SPDX-License-Identifier: GPL-2.0-only
/*
* Copyright (C) 2021 ZX Technology Co., Ltd.
* Author: Keliang Liu <keliang.liu@zx.com>
*/
#include <>
#include “”
7.5.5.1.5. H 文件格式
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2021 ZX Technology Co., Ltd.
* Author: Keliang Liu <keliang.liu@zx.com>
*/
#ifndef _XXX_XXX_H_
#define _XXX_XXX_H_
#endif
7.5.5.1.6. Module Description
MODULE_AUTHOR("Keliang Liu");
MODULE_DESCRIPTION("ZX GMAC Driver");
MODULE_ALIAS("platform:" AICMAC_RESOURCE_NAME);
MODULE_LICENSE("GPL");
7.5.5.2. 驱动架构
7.5.5.2.1. 驱动架构图
7.5.5.2.2. 驱动模块描述
Platform:驱动入口,进行驱动声明和注册,dts 解析
Core:驱动核心逻辑,调度其他模块
MAC:MAC 子模块处理,其中寄存器操作接口单独封装
DMA:DMA 相关逻辑处理,寄存器,Ring,Chain,Descriptor 单独封装
MDIO:MDIO 总线相关逻辑处理
PHY:PHY 模块相关逻辑处理
NAPI:NAPI 接口逻辑处理
ethtool:提供 ethtool 接口的逻辑
mac addr:和各种外设资源配合完成 mac 地址的逻辑
1588:对 IEEE1588(PTP)的逻辑封装
7.5.5.2.3. 数据结构
7.5.5.2.4. 数据流程
7.5.5.3. 关键流程设计
7.5.5.3.1. 初始化流程
|-->aicmac_platform_get_resources
|-->kzalloc aicma_resources
|-->platform_get_irq_byname
|-->devm_platform_ioremap_resource
|-->aicmac_platform_get_config
|-->aicmac_platform_init_data
|-->aicmac_phy_init_data
|-->aicmac_mac_init_data
|-->aicmac_mdio_init_data
|-->aicmac_mda_init_data
|-->aicmac_napi_init_data
|-->aicmac_1588_init_data
|-->aicmac_platform_get_mac_addr
|-->aicmac_platform_init_ioirq
|-->handle clk: mac clk, pclk
|-->aicmac_1588_init_clk
|-->devm_reset_control_get
|-->aicmac_core_init
|-->devm_alloc_etherdev_mqs
|-->netdev_priv(ndev)
|-->create_singlethread_workqueue
|-->aicmac_service_task
|-->reset_control_assert
|-->aicmac_mac_init
|-->aicmac_mac_ip_init
|-->aicmac_mac_reg_core_init
|-->aicmac_dma_init
|-->dma_set_mask_and_coherent
|-->aicmac_napi_init
|-->netif_set_real_num_rx_queues
|-->netif_set_real_num_tx_queues
|-->aicmac_core_setup_napiop
|-->netif_napi_add(rx)
|-->netif_napi_add(tx)
|-->mutex_init
|-->aicmac_mdio_register
|-->mdiobus_alloc
|-->of_mdiobus_register
|-->mdiobus_get_phy
|-->aicmac_phy_init
|-->phylink_create
|-->aicmac_1588_init
|-->ptp_clock_register
|-->register_netdev
7.5.5.3.2. 设备打开流程
如果在终端执行 “ifconfig eth0 up”,则进行设备打开流程,函数 aicmac_open 被调用 .. code-block:
aicmac_open
|-->aicmac_mac_reg_core_init
|-->aicmac_mac_reg_init_basic_config(mac, dev);
|-->aicmac_mac_reg_init_tx_func(mac, dev);
|-->aicmac_mac_reg_init_rx_func(mac, dev);
|-->aicmac_phy_connect
|-->phylink_of_phy_connect
|-->mdiobus_get_phy
|-->phylink_connect_phy
|-->aicmac_dma_ring_set_16kib_bfsize
|-->aicmac_dma_ring_set_bfsize
|-->aicmac_dma_alloc_dma_desc_resources
|-->aicmac_dma_alloc_dma_rx_desc_resources
|-->aicmac_dma_alloc_dma_rx_desc_resources
|-->aicmac_dma_init_desc_rings
|-->aicmac_dma_init_rx_desc_rings
|-->aicmac_dma_init_tx_desc_rings
|-->aicmac_dma_clear_rx_descriptors
|-->aicmac_dma_clear_tx_descriptors
|-->aicmac_hw_setup
|-->aicmac_dma_init_engine
|-->aicmac_mac_reg_reset
|-->aicmac_mac_reg_set_umac_addr
|-->aicmac_mac_reg_core_init
|-->aicmac_mac_reg_rx_ipc_enable
|-->aicmac_mac_reg_enable_mac
|-->aicmac_dma_operation_mode
|-->aicmac_dma_reg_operation_mode_rx
|-->aicmac_dma_reg_operation_mode_tx
|-->aicmac_dma_start_all_dma
|-->aicmac_dma_reg_start_rx
|-->aicmac_dma_reg_start_tx
|-->aicmac_init_coalesce
|-->aicmac_tx_timer
|-->phylink_start
|-->request_irq->aicmac_interrupt
|-->aicmac_enable_all_queues
|-->netif_tx_start_all_queues
7.5.5.3.3. 数据发送流程
执行任何的发送操作(如 ping 命令),aicmac_xmit 将被调用 .. code-block:
aicmac_xmit
|-->aicmac_tx_avail
|-->aicmac_vlan_insert
|-->aicmac_dma_ring_is_jumbo_frm
|-->aicmac_dma_ring_jumbo_frm
|-->aicmac_dma_desc_set_addr
|-->aicmac_dma_desc_prepare_tx_desc
|-->skb_tx_timestamp
|-->netdev_tx_sent_queue
|-->aicmac_dma_reg_enable_transmission
|-->aicmac_tx_timer_arm
7.5.5.3.4. 数据接收流程
有任何数据到达,MAC 将产生中断,则函数 aicmac_interrupt 被执行
aicmac_interrupt
|-->aicmac_napi_check
|-->invoke aicmac_napi_poll_rx
|-->aicmac_rx
|-->netif_msg_rx_status
|-->aicmac_dma_desc_get_rx_status
|-->dma_sync_single_for_cpu
|-->skb_copy_to_linear_data
|-->skb_put
|-->page_pool_recycle_direct
|-->skb_add_rx_frag
|-->page_pool_release_page
|-->aicmac_1588_get_rx_hwtstamp
|-->skb_set_hash
|-->skb_record_rx_queue
|-->napi_gro_receive
|-->aicmac_rx_refill
|-->aicmac_dma_reg_enable_irq
|-->aicmac_dma_set_operation_mode
7.5.5.3.5. DMA初始化流程
DMA 模块将在设备 Open 的时候初始化 .. code-block:
aicmac_dma_init_desc_rings
|-->aicmac_dma_init_rx_desc_rings
|-->aicmac_dma_clear_rx_descriptors
|-->aicmac_dma_desc_init_rx_desc
|-->aicmac_dma_init_rx_buffers
|-->aicmac_dma_chain_init(RX,TX)
|-->aicmac_dmac_init_tx_desc_rings
|-->aicmac_dma_desc_clear
|-->netdev_tx_reset_queue
|-->aicmac_dma_clear_descriptors
|-->aicmac_dma_clear_rx_descriptors
|-->aicmac_dma_desc_init_rx_desc
|-->aicmac_dma_clear_tx_descriptors
|-->aicmac_dma_desc_init_tx_desc
|-->aicmac_dma_display_rings