GMAC网卡Fixed-Link模式

这篇具有很好参考价值的文章主要介绍了GMAC网卡Fixed-Link模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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属性

GMAC网卡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)。文章来源地址https://www.toymoban.com/news/detail-747268.html

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;
}
... ...
}

到了这里,关于GMAC网卡Fixed-Link模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • St-link(swd模式)和jtag连接

    在给STM32烧写程序调试的时候,传统20脚JTAG底座个头大,占用PCB面积多,连接线复杂。 采用SWD模式st-link,只需要四根线即可与目标板实现通讯,可实现程序下载,单步调试等功能,除了不能检测目标板电压、不能给目标板供电、速度有所降低之外,与完整版ST-Link的功能是一

    2024年02月13日
    浏览(41)
  • vSphere ESXI配置多网卡链路聚合模式

    背景:使用浪潮NF5280M6服务器安装ESXI6.7,服务器使用两个光纤网卡连接华为交换机。如果ESXI主机仅使用一块网卡则可以正常使用,但是如果是两块网卡配置聚合模式,那么需要配置配置呢?   为了提高服务器的接入带宽和可靠性,将两个或者更多的物理网卡聚合成一个网

    2023年04月16日
    浏览(43)
  • 【网络BSP开发经验】Linux gmac驱动调试

    网络设备驱动是linux内核中三大类设备驱动之一,它用来完成高层网络协议的底层数据传输及设备控制。 网络设备与其他两种设备的区别: 网络接口不存在于linux的文件系统中,及/dev下没有设备文件,用户通过套接口socket函数使用网络。 网络除了响应来自内核的请求外,还

    2024年02月10日
    浏览(36)
  • 无线网卡无法开启N模式的解决方法

    故障现象 : 无线网卡无法开启N模式。 解决方案 : 1、首先确认路由器支持N模式; 2、确认安装正确的无线网卡驱动; 3、调节2.4频带的802.11n信道宽度为自动。  

    2024年02月05日
    浏览(44)
  • 网卡聚合(bond)模式简介及交换机侧配置

    网卡绑定mode共有七种(0~6) : bond0、bond1、bond2、bond3、bond4、bond5、bond6 第一种模式:mode=0 ,即:(balance-rr) Round-robin policy(平衡抡循环策略,需要配置交换机静态聚合) 第二种模式:mode=1,即: (active-backup) Active-backup policy(主-备份策略) 第三种模式:mode=2,即:(balance-xor)

    2024年02月08日
    浏览(48)
  • 虚拟网卡、网络模式造成的tcp并发量的问题

    课程中的项目: 4 台虚拟机,1 台作为服务器接收 TCP 连接,3 台作为客户端发起连接,在服务器端达到 100 w 的并发连接量 已排查的问题: 进程 fd 数量的限制 每个进程的 fd 数量默认限制是1024,修改为了1048576(2 ^ 20) 服务器端 socket 五元组耗尽 服务器端:1 个监听端口 --

    2024年01月16日
    浏览(32)
  • openssl3.2 - 官方demo学习 - mac - gmac.c

    使用GMAC算法, 设置参数(指定加密算法 e.g. AES-128-GCM, 设置iv) 用key执行初始化, 然后对明文生成MAC数据 官方注释给出建议, key, iv最好不要硬编码出现在程序中

    2024年01月16日
    浏览(44)
  • 【STM32】自举模式 和 程序下载(ST-Link和串口示例)

    STM32官方网站 STM32中文社区 如果遇到不清楚的概念,可以看之前的文章。 STM32有一个特殊的功能,就是可以通过不同的方式启动程序,这就是所谓的自举模式(Boot Mode)。 STM32的自举模式由两个引脚控制,分别是 BOOT0 和 BOOT1 ,它们可以接到不同的电平(高电平或低电平),

    2024年02月04日
    浏览(37)
  • vmware网卡(网络适配器)桥接、NAT、仅主机3种模式解析

    Windows系统安装好vmware后,在网络连接中会生成 VMnet1 和 VMnet8 两个虚拟网卡。 VMnet1作用于仅主机模式,VMnet8作用于NAT模式。           虚拟机网卡选用桥接模式,虚拟机和安装虚拟机的物理机(主机或母机)IP地址在同一个网段,虚拟机和母机可以相互访问。如果局域网物理

    2024年02月09日
    浏览(46)
  • 路由器的妙用:使用无线路由器无线桥接模式充当电脑的无线网卡

    在原路由无线覆盖的范围内,使用无网卡台式和其他主机,并且有闲置的无线路由器 或者网线太短,可以使用无线路由器充当网卡使用 这里以tendaF6无线路由器进行操作演示(各路由器大同小异) 路由器通电,长按路由器重置按钮,重置路由器,然后使用手机或者电脑连接无

    2024年01月19日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包