首页 > 其他分享 >GMAC网卡Fixed-Link模式

GMAC网卡Fixed-Link模式

时间:2023-11-27 14:36:12浏览次数:25  
标签:status node fixed register 网卡 phy link Link Fixed

GMAC网卡Fixed-Link模式

GMAC

fixed-link固定链接模式,mac与对端的连接方式是写死的,通常用于mac to mac(不排除mac to phy的情况)。内核要支持fixed-link模式,需要打开CONFIG_FIXED_PHY配置。

社区版linux的gmac网卡platform平台驱动中,在设备树默认下支持fixed-link,gmac网卡platform平台驱动默认不支持ACPI模式。

fixed-link模式的实现,概括起来就两步,

  • 通过fixed_phy_register创建phy device
  • 连接phy device

fixed-link的link状态通常是固定的,但也可以通过gpio GPIOF_DIR_IN寄存器获取。

设备树Fixed-Link实现

以4.19.90内核版本为例其实现方式如下(内核版本5.3之后使用phylink替代了phy lib,实现接口有所不同):

设备树配置中定义fixed-link属性

设备树fixed-link配置
设备树fixed-link配置

stmac驱动实现of_phy_register_fixed_link函数读取设备树fixed-link属性并通过fixed_phy_register创建phy device,of_phy_connect连接phy device。

stmmac_platform.c:
static int stmmac_dt_phy(struct plat_stmmacenet_data *plat,
             struct device_node *np, struct device *dev)
{
... ...
    /* If phy-handle is not specified, check if we have a fixed-phy */
    if (!plat->phy_node && of_phy_is_fixed_link(np)) {
		if ((of_phy_register_fixed_link(np) < 0))
            return -ENODEV;

        dev_dbg(dev, "Found fixed-link subnode\n");
        plat->phy_node = of_node_get(np);
        mdio = false;
    }
... ...
}

stmmac_main.c:
static int stmmac_init_phy(struct net_device *dev)
{
... ...
	if (priv->plat->phy_node) {
		phydev = of_phy_connect(dev, priv->plat->phy_node,
					&stmmac_adjust_link, 0, interface);
... ...
}

通过of_phy_register_fixed_link函数可知,fixed-link的配置方式不只一种

/drivers/of/of_mdio.c:
int of_phy_register_fixed_link(struct device_node *np)
{
	struct fixed_phy_status status = {};
	struct device_node *fixed_link_node;
	u32 fixed_link_prop[5];
	const char *managed;
	int link_gpio = -1;

	if (of_property_read_string(np, "managed", &managed) == 0 &&
	    strcmp(managed, "in-band-status") == 0) {
		/* status is zeroed, namely its .link member */
		goto register_phy;
	}

	/* New binding */
	fixed_link_node = of_get_child_by_name(np, "fixed-link");
	if (fixed_link_node) {
		status.link = 1;
		status.duplex = of_property_read_bool(fixed_link_node,
						      "full-duplex");
		if (of_property_read_u32(fixed_link_node, "speed",
					 &status.speed)) {
			of_node_put(fixed_link_node);
			return -EINVAL;
		}
		status.pause = of_property_read_bool(fixed_link_node, "pause");
		status.asym_pause = of_property_read_bool(fixed_link_node,
							  "asym-pause");
		link_gpio = of_get_named_gpio_flags(fixed_link_node,
						    "link-gpios", 0, NULL);
		of_node_put(fixed_link_node);
		if (link_gpio == -EPROBE_DEFER)
			return -EPROBE_DEFER;

		goto register_phy;
	}

	/* Old binding */
	if (of_property_read_u32_array(np, "fixed-link", fixed_link_prop,
				       ARRAY_SIZE(fixed_link_prop)) == 0) {
		status.link = 1;
		status.duplex = fixed_link_prop[1];
		status.speed  = fixed_link_prop[2];
		status.pause  = fixed_link_prop[3];
		status.asym_pause = fixed_link_prop[4];
		goto register_phy;
	}

	return -ENODEV;

register_phy:
	return PTR_ERR_OR_ZERO(fixed_phy_register(PHY_POLL, &status, link_gpio,
						  np));
}
EXPORT_SYMBOL(of_phy_register_fixed_link);

ACPI Fixed-Link实现

本质上ACPI和设备树fixed-link实现是一致的,只是部分接口函数不同,ACPI下可以使用phy_connect_direct进行连接(5.3之后的内核版本使用phylink模式,连接函数是phylink_connect_phy)。

stmmac_platform.c:
int fw_phy_register_fixed_link(struct fwnode_handle *np,
			       struct plat_stmmacenet_data *plat)
{
	struct fixed_phy_status status = {};
	u32 fixed_link_prop[5];
	int size = 5, err;
	int link_gpio = -1;
	struct phy_device *phydev = NULL;

	if (FORCE_FIXED_LINK) {
		status.link = 1;
		status.duplex = DUPLEX_FULL;
		status.speed = SPEED_1000;
		pr_info("force fixed-link busid %d\n", plat->bus_id);
	} else {
		err = fwnode_property_read_u32_array(np, "fixed-link", fixed_link_prop, size);
		if (err) {
			pr_err("----there is no fixed-link property in DSD--\n");
			return 0;
		}
		status.link = 1;
		status.duplex = fixed_link_prop[1];
		status.speed = fixed_link_prop[2];
		status.pause  = fixed_link_prop[3];
		status.asym_pause = fixed_link_prop[4];
	}

	phydev = fixed_phy_register(PHY_POLL, &status, link_gpio, 0);
	if (IS_ERR(phydev)) {
		pr_err("fixed_phy_register failed\n");
		return -1;
	}
	plat->fixedphydev = phydev;
	return 0;
}

stmmac_main.c:
static int stmmac_init_phy(struct net_device *dev)
{
... ...
if (priv->plat->fixedphydev) {
		phydev = priv->plat->fixedphydev;
		if (phy_connect_direct(dev, phydev, &stmmac_adjust_link,
				       interface)) {
			netdev_err(priv->dev, "phy_connect_direct failed\n");
			phydev = NULL;
}
... ...
}

标签:status,node,fixed,register,网卡,phy,link,Link,Fixed
From: https://www.cnblogs.com/forwards/p/17859265.html

相关文章

  • wch-link使用指南
    我手中的wch-link是透明外壳的,是官网赠送的,包括CTS、RTS、GND、DTR、GND、5V、3V3、GND、RXD、TXD和USB组成,需要注意的是Win7运行时驱动报错,无数字签名强制,要在开机时,快速按F8键,然后在下方选择关闭数字签名签字的勾,然后回车。驱动就不会报错了,我用的340驱动。......
  • java List集合(ArrayList,LinkedList,Vector)
    Hii,mJinXiang⭐前言⭐本篇文章主要介绍java List集合的三种实现类ArrayList,LinkedList,Vector以及部分理论知识......
  • 集合框架(二)LinkedList的常见使用
    Hii,mJinXiang⭐前言 ⭐本篇文章主要介绍LinkedList的常见使用以及部分理论知识......
  • GWAS:plink进行meta分析
    之前教程提到过Metal是可以做Meta分析,除了Metal,PLINK也可以进行Meta分析。命令如下所示:plink--meta-analysisgwas1.plinkgwas2.plinkgwas3.plink+logscaleqt--meta-analysis-snp-fieldSNP--meta-analysis-chr-fieldCHR--meta-analysis-bp-fieldBP--meta-analysis......
  • 零代码AppLink平台触发事件组件
    AppLink平台组件组成AppLink平台组件分成三个板块触发事件组件、基础组件和数据连接器触发组件下有三个组件,分别是Webhook、定时器、高级Webhook,那他们在AppLink平台里的原理、触发动作以及怎么使用呢?接下来为大家演示下。Webhook是什么?Webhook是AppLink的内置组件之一,其工作原......
  • Flink之Catalog
    Catalog概述Catalog提供了元数据信息,例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。数据处理最关键的方面之一是管理元数据。元数据可以是临时的,例如临时表、或者通过TableEnvironment注册的UDF。元数据也可以是持久化的,例如HiveMetastore中的......
  • Flink实战(11)-Exactly-Once语义之两阶段提交
    0大纲[ApacheFlink]2017年12月发布的1.4.0版本开始,为流计算引入里程碑特性:TwoPhaseCommitSinkFunction。它提取了两阶段提交协议的通用逻辑,使得通过Flink来构建端到端的Exactly-Once程序成为可能。同时支持:数据源(source)和输出端(sink)包括ApacheKafka0.11及更高版本。它提......
  • java中ArrayList和LinkedList的区别
    Java中ArrayList和LinkedList都是List集合的实现类,它们都可以用来存储一组有序的元素,但是它们的内部实现方式不同,在使用时也有不同的适用场景。ArrayList是一个基于动态数组的实现,它可以容纳任何类型的对象,并且允许对元素进行随机访问。当添加或者删除元素时,ArrayList需要移动内......
  • Flink源码解析(六)——数据分区解析
    一、数据分区概念对分布式计算引擎来说,数据分区的主要作用是将现环节的数据进行切分,交给下游位于不同物理节点上的Task计算。二、Flink数据分区接口体系1、顶层接口ChannelSelector(1).setup()方法设置下游算子的通道数量。从该接口中可以看到,算子里的每一个分区器都知道下游......
  • 基于 Flink SQL 和 Paimon 构建流式湖仓新方案
    本文整理自阿里云智能开源表存储负责人,FounderofPaimon,FlinkPMC成员李劲松在云栖大会开源大数据专场的分享。本篇内容主要分为四部分:数据分析架构演进介绍ApachePaimonFlink+Paimon流式湖仓流式湖仓Demo演示数据分析架构演进目前,数据分析架构正在从Hive到Lakehouse的演变......