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

理解系统内核linux phy驱动

PHY设备驱动是基于device、driver、bus的连接方式,驱动涉及如下几个重要部分: 总线 - sturct mii_bus (mii stand for media independent interface) 设备 - struct phy_device 驱动 - struct phy_driver。PHY驱动函数驱动功能:

函数名称    功能描述
soft_reset    执行 phy 的软件复位
config_init    在 phy 复位后将 phy 配置为一个既定的状态
probe    创建 phy->priv 并执行类似驱动绑定的过程
suspend/resume    电源管理挂起与恢复功能
config_aneq    修改速率双工模式自协商等配置
aneq_done    驱动自协商的结果
read_status    获取当前的速率双工与自协商配置状态
ack_interrupt    清楚挂起的中断
did_interrupt    检查是否 phy 触发了一个中断信号
config_intr    开启、关闭中断
remove    当驱动被移除时调用的接口
ts_info    请求查询 HW 时间戳状态
hwtstap    设置 phy 的 HW时间戳配置
rxtstamp    在 phy 这一层为 skb 请求一个接收时间戳
txtsamp    在 phy 这一层为 skd 请求一个发送时间戳
set_wol    使能 Wake-on-Lan
get_wol    获取 Wake-on-Lan 状态
read_mmd_indirect    读取 phy MMD 间接寄存器
write_mmd_indirect    写入 phy MMD 间接寄存器

个驱动都有独立的操作函数来对 phy 进行操作,也就是说网卡会直接调用类似 phy_ops 中的虚函数来使用 phy 的功能。而对于这种 phy 驱动而言,它与网卡驱动是独立的,将网卡驱动与 phy 驱动关联起来步骤:

PHY驱动的注册:在phy_init函数中不仅注册了mdio_bus总线,还注册了一个通用的PHY驱动作为缺省的内核PHY驱动,但是如果PHY芯片的内部寄存器和802.3定义的并不一样或者需要特殊的功能配置以实现更强的功能,这就需要专有的驱动。

*phy_start_aneg_priv-启动此phy设备的自动协商
*@phydev:phy_device结构
*@sync:表示是否等待工作队列取消
描述:对设置进行Sanitize(如果我们没有自动协商它们),然后调用驱动程序的config_aeg函数。如果PHYCONTROL层正在运行,我们会更改状态以反映自动协商或强制的开始

static int phy_start_aneg_priv(struct phy_device *phydev, bool sync)
{bool trigger = 0;int err;if (!phydev->drv)return -EIO;mutex_lock(&phydev->lock);printk("111111111111\n");if (AUTONEG_DISABLE == phydev->autoneg)phy_sanitize_settings(phydev);printk("~~phydev->autoneg~~~~~~~~~~\n",phydev->autoneg);/* Invalidate LP advertising flags */phydev->lp_advertising = 0;printk("222222222\n");err = phydev->drv->config_aneg(phydev);printk("err=%d\n",err );if (err < 0)goto out_unlock;printk("333333333\n");if (phydev->state != PHY_HALTED) {if (AUTONEG_ENABLE == phydev->autoneg) {phydev->state = PHY_AN;phydev->link_timeout = PHY_AN_TIMEOUT;} else {phydev->state = PHY_FORCING;phydev->link_timeout = PHY_FORCE_TIMEOUT;}}/* Re-schedule a PHY state machine to check PHY status because* negotiation may already be done and aneg interrupt may not be* generated.*/if (phy_interrupt_is_valid(phydev) && (phydev->state == PHY_AN)) {err = phy_aneg_done(phydev);if (err > 0) {trigger = true;err = 0;}}out_unlock:mutex_unlock(&phydev->lock);if (trigger)phy_trigger_machine(phydev, sync);return err;
}

相关文章:

  • SwiftUI 如何动态开始和停止播放永久重复(repeatForever)动画
  • ES7-ES13有何新特性?
  • 【设计模式】聊聊职责链模式
  • 【计算机网络笔记】路由算法之距离向量路由算法
  • InfoNCE Loss公式及源码理解
  • QFontDialog开发详解
  • CentOS 8搭建WordPress
  • 2023.11.19 hadoop之MapReduce
  • LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索Indexes for information retrieve
  • 源码安装Apache
  • NGINX缓存详解之服务端缓存
  • Reactive.Net绑定Subscribe调用wpf控件报错
  • 学习Rust适合写什么练手项目?【云驻共创】
  • 【云原生-Kurbernetes篇】HPA 与 Rancher管理工具
  • LVS+keepalived——高可用集群
  • ➹使用webpack配置多页面应用(MPA)
  • CSS选择器——伪元素选择器之处理父元素高度及外边距溢出
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • JDK 6和JDK 7中的substring()方法
  • Js基础知识(一) - 变量
  • October CMS - 快速入门 9 Images And Galleries
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • SpringBoot几种定时任务的实现方式
  • TypeScript迭代器
  • Vue 动态创建 component
  • webpack4 一点通
  • 百度地图API标注+时间轴组件
  • 计算机在识别图像时“看到”了什么?
  • 聊聊flink的TableFactory
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 思否第一天
  • 突破自己的技术思维
  • 吴恩达Deep Learning课程练习题参考答案——R语言版
  • 阿里云ACE认证之理解CDN技术
  • #if #elif #endif
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (C++17) std算法之执行策略 execution
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (二)fiber的基本认识
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十二)springboot实战——SSE服务推送事件案例实现
  • **登录+JWT+异常处理+拦截器+ThreadLocal-开发思想与代码实现**
  • ../depcomp: line 571: exec: g++: not found
  • .\OBJ\test1.axf: Error: L6230W: Ignoring --entry command. Cannot find argumen 'Reset_Handler'
  • .mysql secret在哪_MySQL如何使用索引
  • .Net Winform开发笔记(一)
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • .NET开源项目介绍及资源推荐:数据持久层
  • .NET企业级应用架构设计系列之技术选型
  • .NET是什么