Edit online

设计说明

Ethernet 的源码涉及以下目录:
  • MAC 驱动:MAC 的主驱动代码
    drivers/net/ethernet/artinchip
  • PHY 驱动:使用到的 mdio,phy 等模块的驱动
    drivers/net/phy
  • SysConfig:系统时钟选择,delay 设置等
    drivers/misc/artinchip-syscfg.c
文件命名说明
aicmac_module_submodule.c
aicmac_module_submodule.h
1. 文件说明
文件名称 用途 备注
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 服务 -
  • 函数命名说明:
    aicmac_module_method
  • C 文件格式
    // SPDX-License-Identifier: GPL-2.0-only
    /*
    * Copyright (C) 2021 ArtInChip Technology Co., Ltd.
    * Author: Keliang Liu <keliang.liu@artinchip.com>
    */
    
    #include <>
    
    #include “”
  • 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
  • Module Description
    MODULE_AUTHOR("Keliang Liu");
    MODULE_DESCRIPTION("ArtInChip GMAC Driver");
    MODULE_ALIAS("platform:" AICMAC_RESOURCE_NAME);
    MODULE_LICENSE("GPL");

驱动架构

../../images/mac-arch.jpg
1. 驱动架构图
驱动模块描述:
  • Platform:驱动入口,进行驱动声明和注册,dts 解析

  • Core:驱动核心逻辑,调度其他模块

  • MAC:MAC 子模块处理,其中寄存器操作接口单独封装

  • DMA:DMA 相关逻辑处理,寄存器,Ring,Chain,Descriptor 单独封装

  • MDIO:MDIO 总线相关逻辑处理

  • PHY:PHY 模块相关逻辑处理

  • NAPI:NAPI 接口逻辑处理

  • ethtool:提供 ethtool 接口的逻辑

  • mac addr:和各种外设资源配合完成 mac 地址的逻辑

  • 1588:对 IEEE1588(PTP)的逻辑封装

../../images/mac-para.jpg
2. 数据流程
../../images/mac-data.jpg
3. 数据流程

关键流程设计

  • 初始化流程
    |-->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
  • 设备打开流程
    如果在终端执行 “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

    ../../images/mac-open.jpg

  • 数据发送流程
    执行任何的发送操作(如 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

    ../../images/mac-xmit.jpg

  • 数据接收流程
    有任何数据到达,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

    ../../images/mac-receive.jpg

  • 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

    ../../images/mac-dma.jpg