当前位置: 首页 > news >正文

PHY自协商

1. 自协商定义

        自动协商模式是端口根据另一端设备的连接速度和双工模式,自动把它的速度调节到最高的公共水平,即线路两端能具有的最快速度和双工模式。

        自协商功能允许一个网络设备能够将自己所支持的工作模式信息传达给网络上的对端,并接受对方可能传递过来的相应信息,从而解决双工和10M/100M速率自协商问题。自协商功能完全由物理层芯片设计实现,因此并不使用专用数据包或带来任何高层协议开销。

        自协商功能的基本机制是:每个网络设备在上电、管理命令发出、或是用户干预时发出FLP(快速连接脉冲),协商信息封装在这些FLP序列中。FLT中包含有时钟/数字序列,将这些数据从中提取出来就可以得到对端设备支持的工作模式,以及一些用于协商握手机制的其他信息。

        总结一句话:自协商是PHY与PHY之间的通信协商,与MAC无直接关系!

2. 自协商过程

        如果两端都支持自协商,则都会接收到对方的FLP,并且把FLP中的信息解码出来,得到对方的连接能力,并且把对端的自协商能力值记录在自协商对端能力寄存器中(Auto-Negotiation Link Partner Ability Register , PHY标准寄存器地址5 ),同时把状态寄存器(PHY标准寄存器地址1)的自协商完成bit(bit5)置成1,在自协商未完成的情况下,这个bit一直为0。然后各自根据自己和对方的最大连接能力,选择最好的连接方式Link。比如,如果双方都即支持10M也支持100M,则速率按照100M连接;双方都即支持全双工也支持半双工,则按照全双工连接。

        以太网的自动协商功能是由PHY硬件自己完成的,不需要我们的内核去做什么指导工作,只要设置相应寄存器启动自动协商后,我们就可以读相关的寄存器来得到现在协商成啥了。

        以太网端口两端的工作模式必须协商一致,否则就会出现流量一大速度变慢,或者甚至出现接口掉线的问题。如果此时网络出现故障,不通、或者速度很慢,请检查接口是否协商为100M位以上的速度,以及全双工工作模式。如果没有,且端口为up的状态,可以尝试将强制将一端网络设定位100M位、全双工的工作模式,以调试网络是否恢复正常。但是若之后两端拔插网线,或者其他原因导致端口重新协商,则有可能仍会导致协商不匹配。

3. 普通链接脉冲和快速链接脉冲

        OSI模型定义了7层网络模型,以太网MAC层对应OSI模型中的第二层-数据链路层,以太网PHY对应OSI模型中的第一层-物理层。对于以太网而言,物理层的主要功能是将在网线或者光纤中传输的原始数据(电压,电流等)转化为可被接收且符合协议的数字信号,其为数据链路层提供物理连接。

        自协商协议的主要内容包括:双工模式,运行速率等。自动协商功能完全由物理层PHY芯片实现,无需额外数据包和高层协议开销。根据广播通信速率10M或者100M的不同,自动协商功能提供两种模式NLP(Figure 6)和FLP(Figure 2)。

 3.1 10Base-TE自动协商模式(10M)

        使用单独10Base-TE广播自动协商模式时, PHY芯片会通过Figure 1中TXD_P, TXD_N和RXD_P,RXD_N发送NLP(Normal Link Pulse)普通链路脉冲,每个脉冲间隔16ms。

3.2 100Base-TX自动协商模式(100M)

        使用100Bast-TX自动协商模式时, PHY芯片会通过Figure 1中TXD_P, TXD_N和RXD_P,RXD_N发送FLP(Fast Link Pulse)快速链路脉冲。

4. 代码逻辑

        以stmmac为例

//初始化PHY状态机
stmmac_dvr_probestmmac_mdio_registerof_mdiobus_registerof_mdiobus_register_phyphy_device_create			INIT_DELAYED_WORK(&dev->state_queue,phy_state_machine)
//启动状态机     
#define PHY_STATE_TIME	HZ	//Linux核心每隔固定周期会发出timer interrupt (IRQ 0),HZ是用来定义每一秒有几次timer interrupts。举例来说,HZ为1000,代表每秒有1000次timer interrupts。 
stmmac_openphylink_startphy_startphy_start_machinephy_trigger_machinephy_queue_state_machine(phydev,PHY_STATE_TIME)	//每隔1秒启动一次状态机mod_delayed_work(system_power_efficient_wq, &phydev->state_queue, jiffies);void phy_state_machine(struct work_struct *work)
{struct delayed_work *dwork = to_delayed_work(work);struct phy_device *phydev =container_of(dwork, struct phy_device, state_queue);bool needs_aneg = false, do_suspend = false;enum phy_state old_state;int err = 0;mutex_lock(&phydev->lock);old_state = phydev->state;switch (phydev->state) {case PHY_DOWN:case PHY_READY:break;case PHY_UP:needs_aneg = true;break;case PHY_NOLINK:case PHY_RUNNING:err = phy_check_link_status(phydev);break;case PHY_HALTED:if (phydev->link) {phydev->link = 0;phy_link_down(phydev, true);}do_suspend = true;break;}mutex_unlock(&phydev->lock);if (needs_aneg)err = phy_start_aneg(phydev);else if (do_suspend)phy_suspend(phydev);if (err < 0)phy_error(phydev);if (old_state != phydev->state) {phydev_dbg(phydev, "PHY state change %s -> %s\n",phy_state_to_str(old_state),phy_state_to_str(phydev->state));if (phydev->drv && phydev->drv->link_change_notify)phydev->drv->link_change_notify(phydev);}mutex_unlock(&phydev->lock);
}            

        当phy状态变为PHY_UP时,状态机会配置、启动自协商功能,然后调用phy_check_link_status获取自协商的结果。

int phy_start_aneg(struct phy_device *phydev)
{int err;if (!phydev->drv)return -EIO;mutex_lock(&phydev->lock);if (AUTONEG_DISABLE == phydev->autoneg)		//如果PHY不支持自适应,从setting总取出合适的speed和duplex进行配置phy_sanitize_settings(phydev);err = phy_config_aneg(phydev);if (err < 0)goto out_unlock;if (phy_is_started(phydev))//如果phy->state==PHY_UPerr = phy_check_link_status(phydev);
out_unlock:mutex_unlock(&phydev->lock);return err;
}			static int phy_config_aneg(struct phy_device *phydev)
{if (phydev->drv->config_aneg)	//如果PHY driver提供了config_aneg回调则调用回调return phydev->drv->config_aneg(phydev);if (phydev->is_c45 && !(phydev->c45_ids.devices_in_package & BIT(0)))	//如果指定了C45则调用下面函数return genphy_c45_config_aneg(phydev);return genphy_config_aneg(phydev);	//如果上面两条都不满足,则用这个函数
}

        通常phy driver里会提供read_status回调函数,在这个回调函数中会读取PHY的speed和duplex等等信息并将结果返回给调用者;

        在phy_check_link_status中调用phy driver里提供的read_status回调函数获取phy speed,然后调用phy_link_change将获取到的phy speed赋值给pl->phy_state将phy最新状态通知到MAC。

        当phy状态变为PHY_RUNNING时,needs_aneg不会被赋值为ture,不会再启动自协商并获取PHY状态了,但是PHY_RUNNING时会一直调用phy_check_link_status获取PHY状态并通知给MAC。

5. 特别注意

        需要特别注意的是,千兆phy必须打开自协商使能方可运行。强制千兆只能通过关闭十兆百兆广播能力的方式实现,这是802.3协议中规定的。

        协议规定千兆无法像十兆百兆一样强制的原因通过查找资料和测试猜测如下:

1、千兆协商的过程需要确定两端phy的主从关系

2、无法像十百兆的协商一样通过不同的广播码确认对方的速率

相关文章:

PHY自协商

1. 自协商定义 自动协商模式是端口根据另一端设备的连接速度和双工模式&#xff0c;自动把它的速度调节到最高的公共水平&#xff0c;即线路两端能具有的最快速度和双工模式。 自协商功能允许一个网络设备能够将自己所支持的工作模式信息传达给网络上的对端&#xff0c;并接受对…...

【大数据离线开发】8.2 Hive的安装和配置

8.3 Hive的安装和配置 安装模式&#xff1a; 嵌入模式 &#xff1a;不需要使用MySQL&#xff0c;需要Hive自带的一个关系型数据库&#xff1a;Derby本地模式、远程模式 ----> 需要MySQL数据库的支持 安装 hive 安装包 1、解压tar -zxvf apache-hive-2.3.0-bin.tar.gz -C…...

Capture Modules:车载网络报文捕获模块

&#xff08;以下所有图片均来源于Technica官网&#xff09; Technica Engineering的新一代硬件设备&#xff0c;即Capture Modules&#xff0c;提供了五种变体以涵盖不同带宽的车载以太网&#xff08;100BASE-T1和1000BASE-T1&#xff09;以及常见的IVN技术&#xff08;CAN、C…...

数据结构与算法系列之时间与空间复杂度

这里写目录标题算法的复杂度大O的渐进表示法实例分析空间复杂度每日一题算法的复杂度 衡量一个算法的好坏&#xff0c;一般 是从时间和空间两个维度来衡量的&#xff0c; 即时间复杂度和空间复杂度。 时间复杂度主要衡量一个算法的运行快慢&#xff0c; 空间复杂度主要衡量一个…...

Python代码使用PyQt5制作界面并封装

目录参考链接续&#xff1a;https://blog.csdn.net/yulinxx/article/details/93344163 若要对此程序进行封装&#xff0c;加个界面&#xff0c;然后制作成 EXE&#xff0c; 使用 PyQt5 制作界面&#xff0c;PyInstaller 进行封装成 EXE 可参考&#xff1a; Python制作小软件…...

【Node.js】MySQL数据库的第三方模块(mysql)

mysql安装操作MySQL数据库的第三方模块&#xff08;mysql&#xff09;通过第三方模块&#xff08;mysql2&#xff09;连接到MySQL数据库mysql插入数据mysql插入数据的便捷方式mysql更新数据mysql更新数据的便捷方式mysql删除数据安装操作MySQL数据库的第三方模块&#xff08;my…...

Docker中安装并配置单机版redis

1、使用docker安装redis 搜索Reis镜像&#xff0c;这里展示的是官方最新的镜像docker search redis 使用官方dockerhub搜索redis 2、选用常用的redis5.0作为安装的版本docker pull redis:5.0 3、运行redis容器的两种方式 3.1 不映射外部配置文件直接运行redis5.0镜像docker …...

模拟微信聊天-课后程序(JAVA基础案例教程-黑马程序员编著-第八章-课后作业)

【案例9-1】 模拟微信聊天 【案例介绍】 1.案例描述 在如今&#xff0c;微信聊天已经人们生活中必不可少的重要组成部分&#xff0c;人们的交流很多都是通过微信来进行的。本案例要求&#xff1a;将多线程与UDP通信相关知识结合&#xff0c;模拟实现微信聊天小程序。通过监…...

html2canvas将页面dom元素内容渲染成图片保存至本地

html2canvas:https://html2canvas.hertzen.com/configuration/ github:https://github.com/niklasvh/html2canvas 效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compa…...

前端进阶JS运行原理

JS运行原理 深入了解V8引擎原理 浏览器内核是由两部分组成的&#xff0c;以webkit为例&#xff1a; WebCore&#xff1a;负责HTML解析、布局、渲染等等相关的工作&#xff1b;JavaScriptCore&#xff1a;解析、执行JavaScript代码&#xff1b; 官方对V8引擎的定义&#xff1…...

Python识别二维码的两种方法(cv2)

在学习Python处理二维码的过程中&#xff0c;我们看到的大多是“用python生成酷炫二维码”、“用Python制作动图二维码”之类的文章。而关于使用Python批量识别二维码的教程&#xff0c;并不多见。所以今天我会给大家分享两种批量识别二维码的Python技巧&#xff01;pyzbar PI…...

用一个例子告诉你 怎样使用Spark中RDD的算子

目录 1. 前言 1.1 操作分类 1.2 语法知识 2. transformations 2.1 map 2.2 mapPartitions 2.3 flatMap 2.4 glom 2.5 groupBy 2.6 filter 2.7 sample 2.8 distinct 2.9 coalesce 2.10 repartition 2.11 sortBy 2.12 partitionBy 2.13 reduceByKey 2.14 gro…...

什么是跨域? 出现原因及解决方法

目录一、什么是跨域二、为什么有跨域问题&#xff1f;三、解决跨域问题的方案1.Jsonp2.nginx3.CORS3.1 什么是cors3.2 原理四、GateWay网关中实现跨域步骤一、什么是跨域 跨域&#xff1a;浏览器对于javascript的同源策略的限制 。 同源政策的目的&#xff0c;是为了保证用户…...

低代码系统能够解决哪些痛点?

低代码系统能够解决哪些痛点&#xff1f;如果用4句话去归纳&#xff0c;低代码开发可以解决以下问题—— 为企业提供更高的灵活性&#xff0c;用户可以突破代码的限制自主开发业务应用&#xff1b;通过减少对专业软件开发人员的依赖&#xff0c;公司可以快速响应市场上的新业务…...

华为OD机试题,用 Java 解【两数之和绝对值最小】问题

最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...

AcWing算法提高课-3.1.1热浪

宣传一下算法提高课整理 <— CSDN个人主页&#xff1a;更好的阅读体验 <— 题目传送门点这里 题目描述 德克萨斯纯朴的民众们这个夏天正在遭受巨大的热浪&#xff01;&#xff01;&#xff01; 他们的德克萨斯长角牛吃起来不错&#xff0c;可是它们并不是很擅长生产富…...

华为OD机试题【最差产品奖】用 C++ 编码,速通 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明最差产…...

NFT市场大战:Blur市场地位可持续吗?

在战胜无数虚张声势的挑战者之后&#xff0c;OpenSea终于迎来了一个实力雄厚的竞争对手&#xff0c;已威胁到它的市场主导地位。opensea是什么&#xff1f;参考《NFT&#xff0c;区块链的产物之一&#xff0c;了解NFT交易平台Opensea》 继成功的空投之后&#xff0c;Blur并没有…...

初识CSS

1.CSS语法形式CSS基本语法规则就是:选择器若干属性声明由选择器选择一个元素,其中的属性声明就作用于该元素.比如:<body><p>这是一个段落</p><!-- style可以放在代码的任意地方 --><style>p{/* 将字体颜色设置为红色 */color: red;}</style&g…...

kubernetes(k8s)知识总结(第3期)

1. PV 与 PVC PV 是持久卷&#xff08;Persistent Volume&#xff09;的首字母缩写。通常情况下&#xff0c;可以事先在 k8s 集群创建 PV 对象&#xff1a; apiVersion: v1 kind: PersistentVolume metadata:name: nfs spec:storageClassName: manualcapacity:storage: 1Giac…...

别再瞎猜了!手把手教你用公式算清摄像头MIPI Lane数(附Excel计算器)

摄像头MIPI Lane数计算实战&#xff1a;从理论到Excel工具全解析 在嵌入式摄像头模组开发中&#xff0c;MIPI Lane数的选择往往让工程师陷入两难&#xff1a;Lane数不足会导致数据吞吐瓶颈&#xff0c;而过度配置又会增加功耗和成本。我曾见过一个团队因为凭经验选择了2 Lane配…...

ChatGLM-6B角色扮演功能开发:基于Prompt的智能对话系统

ChatGLM-6B角色扮演功能开发&#xff1a;基于Prompt的智能对话系统 1. 引言 想象一下&#xff0c;你正在开发一个智能客服系统&#xff0c;需要让AI能够扮演不同角色的专业人士来回答用户问题。或者你正在创建一个教育应用&#xff0c;希望AI能够化身历史人物、科学导师或文学…...

让幻想更真实:Kook Zimage真实幻想Turbo负面提示词使用指南

让幻想更真实&#xff1a;Kook Zimage真实幻想Turbo负面提示词使用指南 1. 为什么负面提示词如此重要 在AI图像生成领域&#xff0c;我们常常把注意力放在如何写好正面提示词上&#xff0c;却忽略了负面提示词的重要性。负面提示词就像一位隐形的编辑&#xff0c;默默剔除那些…...

深度解析ShardingCore:EF Core分库分表架构实战与性能优化指南

深度解析ShardingCore&#xff1a;EF Core分库分表架构实战与性能优化指南 【免费下载链接】sharding-core high performance lightweight solution for efcore sharding table and sharding database support read-write-separation .一款ef-core下高性能、轻量级针对分表分库…...

Java 25正式支持ZGC 2.0仅剩72小时!你还没掌握这8个颠覆性调优参数?

第一章&#xff1a;ZGC 2.0在Java 25中的里程碑意义与演进全景ZGC 2.0 是 Java 25 中最具突破性的垃圾回收器升级&#xff0c;标志着低延迟 GC 技术从“亚毫秒停顿”正式迈向“纳秒级停顿保障”的新纪元。它不再仅依赖染色指针&#xff08;Colored Pointers&#xff09;和读屏障…...

ssm+java2026年毕设唐山铂悦山养老院护理管理【源码+论文】

本系统&#xff08;程序源码&#xff09;带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容一、选题背景关于养老院医护管理问题的研究&#xff0c;现有研究主要以医院信息管理系统&#xff08;HIS&#xff09;或综合性养老服务平台…...

告别玄学调参!用ADS RFPro给你的微带线电路拍张‘电磁CT’

电磁场可视化革命&#xff1a;用ADS RFPro透视微带线设计的隐藏世界 在射频电路设计中&#xff0c;微带线就像城市地下的管网系统——表面看似平静&#xff0c;内部却暗流涌动。传统设计方法如同闭着眼睛规划城市道路&#xff0c;只能依靠S参数这类"交通流量统计"来间…...

Zotero插件生态:从翻译到效率提升的进阶配置指南

1. Zotero插件生态全景&#xff1a;从翻译到全流程优化 第一次接触Zotero时&#xff0c;我和大多数人一样&#xff0c;只是把它当作一个简单的文献管理工具。直到某天深夜赶论文&#xff0c;连续手动整理了47篇参考文献后&#xff0c;手指酸痛的我突然意识到&#xff1a;这绝对…...

Rufus高效启动盘制作实战攻略:30分钟从入门到精通

Rufus高效启动盘制作实战攻略&#xff1a;30分钟从入门到精通 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 系统重装难题如何高效解决&#xff1f; 当你的电脑遭遇系统崩溃、病毒入侵或需要全…...

轻量NAS整合:OpenClaw+nanobot自动同步群晖文件的配置方法

轻量NAS整合&#xff1a;OpenClawnanobot自动同步群晖文件的配置方法 1. 为什么需要自动化文件管理 作为一个长期使用群晖NAS的用户&#xff0c;我经常遇到这样的困扰&#xff1a;下载文件夹里堆满了各种文件&#xff0c;手动分类整理耗时耗力&#xff1b;重要文档的版本管理…...