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层以上的数据通信工作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[LitCTF 2023]easy_shark

解压缩,发现需要输入密码,使用010打开,发现frflags和deflags都被修改了,这就会造成压缩包伪加密 把他们都改为0,再打开 将流量包使用wirshark打开 过滤http,并追踪 得到以下信息 看到了一个类似于flag格…

Graham扫描凸包算法

凸包(Convex Hull)是包含给定点集合的最小凸多边形。凸包算法有多种实现方法,其中包括基于递增极角排序、Graham扫描、Jarvis步进法等。下面,我将提供一个简单的凸包算法实现,基于Graham扫描算法。 Graham扫描算法是一…

hf-mirror 使用

文章目录 命令下载搜索下载gated model 根据这篇文章: 大模型下载使我痛苦 得知 Huggingface 镜像站 https://hf-mirror.com 命令下载 网站首页会介绍下载方法 更多用法(多线程加速等)详见这篇文章。简介: 方法一:…

DBeaver安装步骤

DBeaver 是一个基于 Java 开发,免费开源的通用数据库管理和开发工具,使用非常友好的 ASL 协议。可以通过官方网站或者 Github 进行下载。 由于 DBeaver 基于 Java 开发,可以运行在各种操作系统上,包括:Windows、Linux…

用Photoshop来制作GIF动画

录了个GIF格式的录屏文件,领导让再剪辑下,于是用Photoshop2023进行剪辑,录屏文件有约1400帧,PS保存为GIF格式时,还是挺耗时的,平时少用PS来进行GIF剪辑,编辑后的GIF不能动,网上搜索的…

Servlet- Response

一、预览 介绍完Servlet-Resquest的相关内容后,接下来就是Servlet- Response的内容。读者阅读完本篇文章后将可以自如地解析请求、设置响应,完成对客户端的响应。 二、Response体系结构 Response的体系结构与Request完全一样,其中ServletRe…

【LeetCode】203. 移除链表元素(简单)——代码随想录算法训练营Day03

题目链接:203. 移除链表元素 题目描述 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 示例 1: 输入:head [1,2,6,3,4,5,6], val 6 输出&#xff…

低代码高逻辑谱写IT组织和个人的第二成长曲线 | 专访西门子Mendix中国区总经理王炯

在今天快速演进的数字化转型浪潮中,低代码平台已经成为推动企业敏捷适应市场变化的关键引擎。在此背景下,西门子Mendix作为市场上的领导者,以其创新的低代码解决方案不断地刷新着行业标准。 近日,LowCode低码时代访谈了西门子Men…

Linux:curl命令

一、最常用的curl命令 1、发送GET请求 curl URL curl URL?a1&bnihao 2、发送POST请求 curl -X POST -d a1&bnihao URL 3、发送json格式请求: curl -H "Content-Type: application/json" -X POST -d {"abc":123,"bcd"…

k8s---配置资源管理

内容预知 目录 内容预知 secret资源配置 secert的几种模式 pod如何来引用secret 陈述式创建secret 声明式base64编码配置secret 将secret用vlumes的方式挂载到pod中 传参的方式将环境变量导入pod 如何通过secret加密方式获取仓库密码 configmap的资源配置 陈述式创建…

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V1模型算法详解

【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V1模型算法详解 文章目录 【图像分类】【深度学习】【轻量级网络】【Pytorch版本】EfficientNet_V1模型算法详解前言EfficientNet_V1讲解问题辨析(Problem Formulation)缩放尺寸(Scaling Dimensions)复合缩…

图深度网络浅层理解

图神经网络 1.输入: 图网络 2.输出: 节点类别、某两个节点的新连接、产生新的图或子图 3.端到端表示学习(Representation Learning)/图嵌入: 将节点映射为d维的向量,d维向量就包含了这个节点的连接关系…

IPKISS ------ 远程服务器 IPKISS 内置示例安装问题

IPKISS ------ 远程服务器示例安装问题 引言正文 引言 很多时候,如果我们在服务器上使用管理员权限安装了 IPKISS 证书,而我们使用个人账号登录服务器时有时候会显示如下界面: 我们会看到这个 PyCharm (Luceda Academy) 是灰色的。那么该怎…

Linux网络文件共享服务

目录 一.文件存储类型 1.直连式存储:Direct-Attached Storage,简称DAS 2.存储区域网络:Storage Area Network,简称SAN(可以使用空间,管理也是你来管理) 3.网络附加存储:Network-…

2024打胜仗,从打造高绩效团队开始

如何提高员工执行力,打造高绩效团队?是所有管理者都会关注的问题。对于组织来说,一个优秀的团队,是保障组织绩效稳定且不断提升的关键,那么应该如何管理团队,实现团队整体绩效提高呢?华恒智信通…

简单整理FFmpeg相关命令集

FFmpeg相关命令集 简单整理了FFmpeg相关命令,主要包括ffplay播放控制和媒体播放命令、ffmpeg命令相关参数以及常用的提取音视频等命令。 🎡导航小助手🎡 FFmpeg相关命令集1.ffmpeg命令分类查询2.ffplay命令2.1 ffplay播放控制2.2 ffplay命令…

云联惠 被查 消费积分合法化!——全新消费返利模式!共享购!

大家好 我是吴军 一家软件开发公司的产品经理 今天讲一讲,曾经盛极一时的云联惠,巅峰时期达到一千万的用户,资金6000亿。 前几年云联惠如火如荼,到处都是在宣传云联惠的,小编也略玩了一下下。 当时因为政策的不明朗…

十三、Three场景物体增加发光特效

物体发光效果非常炫酷,本期来讲three场景内物体自带发光效果怎么来实现。本次使用的是threejs138版本,在vue3+vite+ant的项目中使用。 下面来看看实现的效果。绿色罐体有了明显的发光效果。 实现步骤 增加composer.js import { UnrealBloomPass } from three/examples/jsm/po…

【已解决】Linux下执行Shell脚本出现$‘\r‘: command not found

【已解决】Linux下执行Shell脚本出现$‘\r‘: command not found 1、起因2、原因:3、解决方法:(运行以下命令即可修改该脚本格式) 1、起因 今天把 Windows 的项目导入 linux 运行,执行 shell 脚本的时候,报…

(2023版)斯坦福CS231n学习笔记:DL与CV教程 (3) | 正则化与最优化

前言 📚 笔记专栏:斯坦福CS231N:面向视觉识别的卷积神经网络(23)🔗 课程链接:https://www.bilibili.com/video/BV1xV411R7i5💻 CS231n: 深度学习计算机视觉(2017&#xf…