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. 驱动架构图

../../../_images/mac-arch.jpg

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. 数据结构

../../../_images/mac-para.jpg

7.5.5.2.4. 数据流程

../../../_images/mac-data.jpg

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
../../../_images/mac-open.jpg

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
../../../_images/mac-xmit.jpg

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
../../../_images/mac-receive.jpg

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
../../../_images/mac-dma.jpg