7.5.5. 源码说明¶
7.5.5.1. 代码结构¶
Ethernet 的源码牵涉三个目录
- MAC 驱动 
MAC的主驱动代码
drivers/net/ethernet/artinchip
- PHY 驱动 
使用到的 mdio,phy 等模块的驱动
drivers/net/phy
- SysConfig 
系统时钟选择,delay 设置等
drivers/misc/artinchip-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 ArtInChip Technology Co., Ltd.
* Author: Keliang Liu <keliang.liu@artinchip.com>
*/
#include <>
#include “”
7.5.5.1.5. H 文件格式¶
/* SPDX-License-Identifier: GPL-2.0-only */
/*
* Copyright (C) 2021 ArtInChip Technology Co., Ltd.
* Author: Keliang Liu <keliang.liu@artinchip.com>
*/
#ifndef _XXX_XXX_H_
#define _XXX_XXX_H_
#endif
7.5.5.1.6. Module Description¶
MODULE_AUTHOR("Keliang Liu");
MODULE_DESCRIPTION("ArtInChip 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
