Linux Mii management/mdio子系统分析之五 PHY状态机分析及其与net_device的关联

(转载)原文链接:https://blog.csdn.net/u014044624/article/details/123303714


      前面几章基本上完成了mdio模块驱动模型的分析,本篇文章主要讲述phy device的状态机以及phy device与net_device的关联。Phy device主要是对phy的抽象,而net_device主要是对mac的抽象,而mdio总线以及mii_bus主要用于对phy设备的控制(包括设置phy设备的工作模式、速率模式、是否为自适应、phy的link状态等),而net_device需要根据phy的工作模式、速率模式、phy的link状态进行状态的同步,因此需要将net_device与phy device进行绑定与解绑。本章主要分为两个方面:

一、phy_device与net_device的绑定与解绑

 

二、phy device的状态机

 

 

一、phy_device与net_device的绑定与解绑操作。

 

什么时候实现phy_devicenet_device的绑定与解绑操作?

我们从现有各厂家的net_device驱动可以看到,大致存在两种模式:

  1. 在net_device的probe接口中,根据传递的mdio_bus_id、phy_id,查找phy_device并完成net_device与phy_device的关联;在net_device的remove接口中,完成net_device与phy_device的解绑操作;
  2. 在net_device->netdev_ops->ndo_open接口中,据传递的mdio_bus_id、phy_id,查找phy_device并完成net_device与phy_device的关联;在nnet_device->netdev_ops->ndo_stop中,完成net_device与phy_device的解绑操作(即应用层执行ifconfig xxx up/down操作时调用ndo_open/ndo_stop)。

 

关于phy_device与net_device的绑定与解绑主要涉及如下几个函数phy_connect、phy_disconnect

下面我们分析下这两个接口的主要工呢

 

phy_connect分析

该接口主要用来进行一个net_device类型的变量与phy_device类型的变量的关联、设置phy_device的状态为PHY_READY,并启动phy_device的状态机,详细处理流程如下图所示

  1. 确认phy_device是否存在(根据传递的phy_device_id,在mdio_bus_type中查找phy_deviec);
  2. 若phy_device存在,则进行net_device与phy_device的相互关联(phy_device->attached_dev、net_device->phydev),并调用phy_driver->config_init完成对phy device的初始化;
  3. 启动phy_device的状态机对应的延迟队列。

 

 

 

phy_disconnect分析

 

phy_disconnect的操作刚好与phy_connect接口的操作相反,主要提供的功能如下:

  1. 若phy_device支持中断,则调用phy_stop_interrupts关闭中断,并free该中断;
  2. 调用phy_stop_machine接口,关闭该phy_device的状态机对应的延迟队列;
  3. 解除net_device与phy_device关联,若该phy_device是与genphy_driver绑定,则调用device_release_driver解除它们之间的绑定关系。

 

 

 

 

phy_device irq相关说明

     在上面的介绍中,我们提到了phy_device的中断,针对phy_device的中断而言,当两个phy之间的link up/down的变化后(两个phy完成速率协商或者连接断开时),则会触发该中断,从而触发phy_device的状态机的转变(状态转换至PHY_RUNNING/PHY_NOLINK)。

       那若phy_device不支持中断模式呢?那就使用PHY_POLL模式,在该模式下则当phy_device处于PHY_RUNNING状态时,则将phy_device状态自动切换至PHY_CHANGELINK状态,而在PHY_CHANGELINK状态下通过对phy_device的状态寄存器,确定phy_device处于link up/down状态。这类似于之前介绍的MMC部分的mmc card的在位检测模式(若支持中断则通过中断方式通知mmc card的在位与否;若不支持中断,则进行周期1s的延迟队列的调度进行轮询检测)。但与mmc模块不同的是,针对phy_device的状态机对应的延迟队列而言,不管其phy_device是否支持link up/down中断,其状态机对应延迟队列均为周期1s执行(不支持中断则由phy_device的状态机自动切换phy的状态进行检测,支持中断则由中断处理函数中进行状态的切换)。

如下即为执行完phy_connect操作后,针对支持phy_device中断处理接口(phy_interrupt)以及其底半部处理接口(phy_change)与phy_state_machine之间的关联。

 

 

phy device的状态机

 

         在调用phy_connect完成net_device与phy_device的关联后,则启动phy_device的状态机流转对应的延迟队列调度接口,进行phy_device的状态流转操作。如下图为phy_device的状态流程图,下面详细说明下各状态的流转说明:

  1. 当调用phy_device_create创建一个phy_device或者调用phy_remove移除phy_device时,即将phy_device的状态设置为PHY_DOWN;
  2. PHY_START状态,目前在linux3.10的内核中,没有将phy_device的状态切换至PHY_START步骤,因此先跳过;
  3. 当调用phy_connect完成phy_device与net_device的绑定后,即将phy_device的状态设置为PHY_READY状态;或者在phy_device_register、phy_driver_register时完成phy_device与phy_driver的绑定后,也会将其状态设置为PHY_READY。
  4. 当系统调用phy_start接口,且其状态为PHY_READY时,则将其状态流转至PHY_UP状态(一般在net_device->net_ops->ndo_start中,完成phy_connect调用后,则调用phy_start将phy状态流转至PHY_UP);
  5. 在PHY_UP状态时,若该phy_device设置了自适应,则自动将其状态流转至PHY_AN;若该PHY_DEVICE设置为FORCE状态,则自动将其状态流转至PHY_FORCING;
  6. 在PHY_AN状态下,根据读取的phy_device的状态寄存器,若linkup,则将其状态流转至PHY_RUNNING;否则将其状态流转至PHY_NOLINK;
  7. 在PHY_NOLINK状态下,根据读取的phy_device的状态寄存器,若linkup,则将其状态流转至PHY_RUNNING;
  8. 在PHY_FORCING状态下,若读取phy_device的状态寄存器,为linkup,则将其状态流转至PHY_RUNNING;
  9. PHY_RUNNING状态下,若phy_device不支持中断,则将其状态设置为PHY_CHANGELINK,进行phy_device linkup状态的轮询检测;
  10. 在PHY_CHANGELINK状态下,根据读取的phy_device的状态寄存器,若linkup,则将其状态流转至PHY_RUNNING;否则则将其状态设置为PHY_NOLINK;
  11. 当各驱动模块调用phy_stop接口后,则phy_device的状态跳转至PHY_HALTED状态(无条件跳转,一般在net_device->netdev_ops->ndo_stop中会调用phy_stop);
  12. 仅在phy_device处于PHY_HALTED状态时,方才会流转至该PHY_RESUMING状态,该状态可跳转至PHY_AN、PHY_NOLINK、PHY_RUNNING。

 

 

 

以上即为phy_device的状态,当phy_device处于PHY_RUNNING状态时(此时调用netif_carrier_on设置net_device状态),说明两端的phy协商成功,可进行数据通信。以上phy_device的状态流转由接口phy_state_machine实现,该接口的流程图如下:

主要说明如下:

  1. 当phy_device处于PHY_UP状态时,则phy_device状态机处理接口,设置needs_aneg为1,调用phy_start_ange接口,进入PHY_AN状态或PHY_FORCING状态,进行phy_device的状态的协商;
  2. 在PHY_AN状态时,则phy_state_machine判断是否需要将状态跳转至PHY_RUNNING或PHY_NOLINK;
  3. 在PHY_RUNNING状态时,若phy_device不支持中断,则将其状态跳转至PHY_CHANNGELINK状态,由phy_state_machine接口来轮询判断phy_device的状态是否跳转至PHY_RUNNING/PHY_NOLINK;

而像PHY_DOWN、PHY_START、PHY_READY、PHY_UP、PHY_HALTED、

PHY_RESUMING这几个状态,一般由外部模块调用相应的接口进行跳转,而非phy_state_machine自动流转。
 

 

针对net_device也有相应的状态定义,如下图所示主要涉及如下几个状态

enum netdev_state_t {undefined

__LINK_STATE_START,

__LINK_STATE_PRESENT,

__LINK_STATE_NOCARRIER,

__LINK_STATE_LINKWATCH_PENDING,

__LINK_STATE_DORMANT,

};

 

  1. 当net_device注册至系统时,即设置__LINK_STATE_PRESENT;
  2. 当执行ifconfig xxx up,启用一个net_device时,则将其状态设置为__LINK_STATE_START(记住此时并不代表phy已完成协商且处于linkup状态),并在调用net_device->netdev_ops->ndo_open时,设置__LINK_STATE_NOCARRIER;
  3. 当调用phy_connect完成phy_device与net_device的绑定以及启动phy_device的状态机后,且phy_device跳转至PHY_RUNNING的同时,清除__LINK_STATE_NOCARRIER位,此时方才表明可进行数据通信。

 

 

      以上即是本次的主要内容,主要涉及phy_device与net_device之间的关联建立以及phy_device的状态机流转相关的内容。当phy_device处于PHY_RUNNING状态时,则将net_device的状态设置为carrier_on,即可进行mac层及mac层以上的数据通信工作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/625785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C语言:自定义类型——结构体

一、什么叫做结构体 C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要 …

SMD NTC Thermistor NTC热敏电阻产品基本参数定义

热敏电阻器(Thermistor)是一种电阻值对温度极为灵敏的半导体元件,温度系数可分为Positive Temperature Coefficient 正温度系数热敏电阻又称PTC热敏电阻和Negative Temperature Coefficient 负温度系数热敏电阻又称NTC热敏电阻. NTC热敏电…

Seata分布式事务

文章目录 Seata分布式事务1.分布式事务问题1.1.本地事务1.2.分布式事务 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾 2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.2.1.下载3.2.2.解压3.2.3.修改配置3.2.4.在…

【JVM】常用命令

一、前言 Java虚拟机(JVM)是Java程序运行的基础设施,它负责将Java字节码转换为本地机器代码并执行。在开发过程中,我们经常需要使用一些命令来监控和管理JVM的性能和状态。本文将详细介绍6个常用的JVM命令:jps、jstat…

Linux平台建立GB28181设备模拟器

目录 下载模拟器解决动态库缺少问题运行模拟器抓包参考资料 在没有GB28181摄像机的情况下,在Linux虚拟机中模拟出一台GB28181摄像机用于调试和学习. 下载模拟器 到网站下载Linux 平台版本: https://www.happytimesoft.com/download.html tar -zxvf happytime-gb28181-device…

腾讯云服务器定价_云服务器价格_云服务器计费模式

腾讯云服务器租用价格表:轻量应用服务器2核2G3M价格62元一年、2核2G4M价格118元一年,540元三年、2核4G5M带宽218元一年,2核4G5M带宽756元三年、轻量4核8G12M服务器446元一年、646元15个月,云服务器CVM S5实例2核2G配置280.8元一年…

创新与竞争:Facebook如何在社交媒体市场站稳脚跟

社交媒体市场一直都是激烈的竞争场地,而Facebook凭借其创新的战略一直站稳脚跟,不断引领行业潮流。本文将深入探讨Facebook是如何通过创新与竞争策略,在社交媒体市场中牢牢占据领导地位的。 多元化产品布局 Facebook并非只是一家单一产品的公…

[Java刷算法]牛客—剑指offer第一天

🧛‍♂️个人主页:杯咖啡💡进步是今天的活动,明天的保证!✨目前正在学习:SSM框架,算法刷题🙌牛客网,刷算法过面试的神级网站,用牛客你也牛。 👉免费注册和我一…

我成为开源贡献者的原因竟然是做MySql-CDC数据同步

今年下半年机缘巧合下公司决定搭建自己的数据中台,中台的建设势必少不了数据集成。首先面临的就是数据集成技术选型的问题,按照社区活跃度、数据源适配性、同步效率等要求对市面上几个成熟度较高的开源引擎进行了深度调研。 最终经过内部讨论决定用Apac…

云服务器部署Stable Diffusion Webui从0到1总结:反复重启+循环debug

文章目录 在学校服务器部署Stable Diffusion Webui(一)准备工作(二)环境配置(三)git拉取项目到本地(四)运行项目 遇到的问题:(一)使用git clone时…

JAVAEE初阶 多线程进阶(二)

多线程进阶相关知识点 一.CAS1.1 CAS的原子类1.2 实现自旋锁1.3CAS中的ABA问题1.4 ABA问题的解决 二. callable接口三.reentrantLock3.1 reentrantLock与synchronized区别 四.信息量 semaphore五. CountDownLatch六. concurrentHashMap6.1 concurrentHashMap的优点 一.CAS CAS …

如何解决csgo搬砖饰品买了跌价的问题

大家好,我是阿阳。 经常有粉丝问:近期是该买还是该抛,每次买了就跌,抛了就涨,太揪心了。 在这聊聊阿阳自己对这个问题的看法,首先大家都知道csgo游戏搬砖从饰品持有时间长短,可以分为两类&…

【Python学习】Python学习20- 面向对象(1)

目录 【Python学习】Python学习20- 面向对象(1) 前言面向对象技术简介类的创建实例:创建实例对象访问属性 Python内置类属性完整代码输出 参考 文章所属专区 Python学习 前言 本章节主要说明Python的面向对象的处理。Python从设计之初就已经…

【Python学习】Python学习19- 异常处理

目录 【Python学习】Python学习19- 异常处理 前言python标准异常异常处理带异常类型语法不带异常类型语法使用except而带多种异常类型try-finally 语句触发异常 参考 文章所属专区 Python学习 前言 本章节主要说明Python的异常处理。 python标准异常 BaseException 所有异常…

中级Python面试问题

文章目录 专栏导读1、xrange 和 range 函数有什么区别?2、什么是字典理解?举个例子3、元组理解吗?如果是,怎么做,如果不是,为什么?4、 列表和元组的区别?5、浅拷贝和深拷贝有什么区别…

微信小程序上传并显示图片

实现效果&#xff1a; 上传前显示&#xff1a; 点击后可上传&#xff0c;上传后显示&#xff1a; 源代码&#xff1a; .wxml <view class"{{company_logo_src?blank-area:}}" style"position:absolute;top:30rpx;right:30rpx;height:100rpx;width:100rp…

OWASP漏洞原理启航(第一课)

OWASP Top 10 2021 介紹 漏洞原理启航介绍 OWASP 定义&#xff1a; AI介绍 OWASP (开放Web应用程序和安全项目) 是一个全球性的社区&#xff0c;致力于提供关于Web应用程序安全性的信息、教育和支持。OWASP是一个非盈利组织&#xff0c;由志愿者驱动&#xff0c;旨在提高Web应…

从“精益思想“看机器人的开发与应用:一场科技与效率的完美融合

在科技飞速发展的今天&#xff0c;机器人已经深入到我们的生活和工作之中&#xff0c;成为了提高效率、提升质量的重要工具。然而&#xff0c;如何让机器人的开发和利用更有效率、更精细&#xff0c;这是摆在我们面前的一道难题。此时&#xff0c;"精益思想"的出现&a…

记ubuntu2004通过NetworkManager修改网络的优先级

这里写自定义目录标题 前言步骤 前言 起因在于万恶的校园网&#xff0c;突然台式有线死活没法认证&#xff08;感觉是IP冲突了&#xff1f;另外一台电脑同样的系统就没有问题&#xff0c;连路由器WIFI也是可以的&#xff0c;路由器设置的是桥接模式&#xff0c;有没有大佬提供…

不分青红皂白,美杜莎勒索软件攻击慈善饮用水机构Water for People

据The Record网站消息&#xff0c;1月11日&#xff0c;勒索软件组织美杜莎&#xff08;Medusa&#xff09;在其暗网受害名单网站上列出了 Water for People——一家专为贫困地区提供清洁饮用水的非盈利组织。 美杜莎向该组织索要30万美元赎金&#xff0c;否则将公布被盗信息。W…