以太网驱动的流程浅析(四)-以太网驱动probe流程

**Author:张昺华

Email:920052390@qq.com

Time:2019年3月23日星期六

**

此文也在我的个人公众号以及《Linux内核之旅》上有发表:以太网驱动的流程浅析(四)-以太网驱动probe流程

很喜欢一群人在研究技术,一起做有意思的东西,一起分享技术带给我们的快乐,也希望中国有更多的人热爱技术,喜欢一起研究、分享技术,然后可以一起用我们的技术来做一些好玩的东西,可以为这个社会创造一些东西来改善人们的生活。

如下是本人调试过程中的一点经验分享,以太网驱动架构毕竟涉及的东西太多,如下仅仅是针对加载流程和围绕这个问题产生的分析过程和驱动加载流程部分,并不涉及以太网协议层的数据流程分析。

【硬件环境】 Imx6ul

【Linux kernel版本】 Linux4.1.15

【以太网phy】 Realtek8201f

1.1. 以太网驱动probe流程

1.1 以太网初始化

fec_main.c   fec_probe
=>fec_enet_mii_init =>of_get_child_by_name(pdev->dev.of_node, "mdio");
of_mdiobus_register(fep->mii_bus, node); =>rc = of_mdiobus_register_phy(mdio, child, addr); => phy = get_phy_device(mdio, addr, is_c45);
rc = phy_device_register(phy);

搞驱动的都知道,probe是drvier的入口函数:

这个 probe中主要做了哪些事情呢?以下我只写主要的一些,不是全部的。

struct net_device *ndev;这里对net_device进行初始化,分配内存

接下来做如下动作,注释都很明显,我就不解释了,

struct fec_enet_private *fep;



获取时钟:

使能clk,fec_enet_clk_enable(ndev, true);

复位phy,硬件复位,具体取决于不同phy的datasheet的reset时序,fec_reset_phy(pdev);

一些初始化动作,fec_enet_init(ndev);由于代码注释写的很好,上代码:

1.2 获取以太网mac地址

这里获取mac 地址的流程我要说一下,之前有讲过流程,我这里再提一下:

1) 模块化参数设置,如果没有跳到步骤2

2) device tree中设置,如果没有跳到步骤3;

3) from flash / fuse / via platform data,如果没有跳到步骤4;

4) FEC mac registers set by bootloader===》即靠usb方式下载mac address ,如果没有跳到步骤5;

  1. 靠kernel算一个随机数mac address出来,然后写入mac

所以最后一种方式就是kernel会自己算一个mac地址出来,我这里有个前提是这个是freescale(现在被nxp收购了)的控制器代码这样写的,我不确定其他厂商的控制器是否也是这样的流程,技术讲究严谨,所以这里不能一概而论。当然这个mac 地址也是可以用户自己在dts中进行自行配置的。



这里就是kernel随机数的接口了,会总随机池中获取一个随机数并返回。

大家看到那些获取mac address的步骤中有这样的函数

is_valid_ether_addr,用来检测以太网地址是否正确的

因此我们从代码中可以看出,内核认为全0或者是全FF的以太网地址是不正确的,

获取了mac 地址后,就会通过寄存器写入mac中

CONFIG_ARCH_MXC因为我们使用的是这个宏,因此:



否则:

设置buffer传输的基地址

提供一些以太网控制器的操作接口,应用层调用socket通信最终的实现接口方式,并且提供开源工具ethtool工具的底层操作接口支持





所以有些人用ethtool工具发现不同平台可能不一样,同样的命令有些可能返回不同,或者功能不支持,就可以猜想一下可能是因为不同厂商的控制器驱动这里的实现问题导致,部分接口可能没有实现或者有bug等等,这些就要具体问题具体分析了,有些板子可能某些接口根本都没实现,自然ethtool的一些命令就无法正常使用了。

最后进行控制器对phy的复位动作

fec_restart(ndev);

流程如下:

  1. Whack a reset. We should wait for this. For i.MX6SX SOC, enet use AXI bus, we use disable MAC , instead of reset MAC itself.

    2)enet-mac reset will reset mac address registers too, so need to reconfigure it.
  2. Clear any outstanding interrupt.
  3. Reset tx SKB buffers.
  4. Enable MII mode
  5. The phy interface and speed need to get configured,
  6. configure the gasket: RMII, 50 MHz, no loopback, no echo; MII, 25 MHz, no loopback, no echo
  7. Setup multicast filter.
  8. And last, enable the transmit and receive processing
  9. Enable interrupts we wish to service
  10. Init the interrupt coalescing

    fec_enet_init函数的流程到此结束

    我们继续回归到fec_probe函数,然后是注册中断处理函数

4. 网址分享

http://stackoverflow.com/questions/5308090/set-ip-address-using-siocsifaddr-ioctl

http://www.ibm.com/support/knowledgecenter/ssw_aix_72/com.ibm.aix.commtrf2/ioctl_socket_control_operations.htm

https://lkml.org/lkml/2017/2/3/396

linux PHY驱动

http://www.latelee.org/programming-under-linux/linux-phy-driver.html

Linux PHY几个状态的跟踪

http://www.latelee.org/programming-under-linux/linux-phy-state.html

第十六章PHY -基于Linux3.10

https://blog.csdn.net/shichaog/article/details/44682931

### End

以太网驱动的流程浅析(四)-以太网驱动probe流程【原创】的更多相关文章

  1. Android 4.4 Kitkat Phone工作流程浅析(六)__InCallActivity显示更新流程

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...

  2. Android 4.4 Kitkat Phone工作流程浅析(八)__Phone状态分析

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象.与Google原生AOSP有些许差异.请读者知悉. ...

  3. Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...

  4. 以太网驱动的流程浅析(一)-Ifconfig主要流程【原创】

    以太网驱动的流程浅析(一)-Ifconfig主要流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<Lin ...

  5. 以太网驱动的流程浅析(三)-ifconfig的-19错误最底层分析【原创】

    以太网驱动流程浅析(三)-ifconfig的-19错误最底层分析 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及& ...

  6. 以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取【原创】

    以太网驱动的流程浅析(五)-mii_bus初始化以及phy id的获取 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号 ...

  7. 以太网驱动的流程浅析(二)-Ifconfig的详细代码流程【原创】

    以太网驱动流程浅析(二)-ifconfig的详细代码流程 Author:张昺华 Email:920052390@qq.com Time:2019年3月23日星期六 此文也在我的个人公众号以及<L ...

  8. “四核”驱动的“三维”导航 -- 淘宝新UI(需求分析篇)

    前言 孔子说:"软件是对客观世界的抽象". 首先声明,这里的"三维导航"和地图没一毛钱关系,"四核驱动"和硬件也没关系,而是为了复杂的应用而 ...

  9. 四核驱动的三维导航—淘宝新UI(设计篇)

    前面有一篇博客说到了淘宝UWP的"四核驱动的三维导航—淘宝新UI(需求分析篇)",花了两周的时间实现了这个框架,然后又陆陆续续用了三周的时间完善它. 多窗口导航,与传统的导航方式的 ...

随机推荐

  1. Python文件头注释的含义,你肯定不懂

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:冰火梦幻  本文档描述了Python语言文件头里典型注释的含义. 1. ...

  2. Python 电路绘制库 schemdraw 你会吗?【面试必学】

    前言本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理.作者:skyztttt 引子 由于最近在学习ardunio的使用,其中牵涉到绘 ...

  3. 为什么JDK动态代理中要求目标类实现的接口数量不能超过65535个

    先明确几个概念: Class文件是一组以8字节为基础单位的二进制流 各个数据项目严格按照顺序紧凑排列在class文件中 中间没有任何分隔符,这使得class文件中存储的内容几乎是全部程序运行的程序 J ...

  4. JS内置对象-Array之forEach()、map()、every()、some()、filter()的用法

    简述forEach().map().every().some()和filter()的用法 在文章开头,先问大家一个问题: 在Javascript中,如何处理数组中的每一项数据? 有人可能会说,这还不简 ...

  5. 【Activiti】使用学习

    [Activiti]使用学习 转载: ================================================== 1.下载安装 2.清空表 3.开启sql打印 4. 5. = ...

  6. 【VUE】数组

    [VUE]常用函数 转载:https://www.cnblogs.com/yangchongxing/p/10637087.html 目录 ============================== ...

  7. 《Java基础知识》流程控制

    流程控制分类: 一.顺序结构如果没有流程控制(即没有分支结构和循环结构),Java方法里面的语句是一个顺序执行流,从上到下依次执行每条语句. 二.分支结构1.if语句if语句使用布尔表达式或者布尔值作 ...

  8. before和after的操作

    before和after,前者是在元素之前插入东西,后者是在元素后面插入东西,但插入的东西不仅仅只是文字而已,还有图标,以及计算器的操作. 由于两者的操作基本一样,这里以before为例 插入文字 & ...

  9. shell概述与echo命令

    一.Shell概述 1.什么是shell? 由此可见shell是用户与系统进行交互的接口,通过执行各种命令来完成时间处理与调度. 2.shell分类 Shell类别 易学性 可移植性 编辑性 快捷性 ...

  10. CURL命令学习二

    -a, --append 用于上传文件时,如果服务器上该文件不存在则创建,如果存在则追加到源文件. -K, --config <file> 指定从某个文件读取curl参数.如果指定-为文件 ...