linux驱动模块probe,以太网驱动的流程浅析(四)-以太网驱动probe流程【原创】

以太网驱动的流程浅析(四)-以太网驱动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);

191a2b0541630039f82d9ef499e196e3.png

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

88e1a8230e610cada92d7be5e27bd44e.png

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

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

07559357b14000205a1e5c0c55251be2.png

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

struct fec_enet_private *fep;

c27a429eaa4d42a698cacb324f121299.png

b5002c442d9e49da028b0a803a471ecf.png

获取时钟:

f3ae7170dcc0c9415dd42afb846afa00.png

使能clk,fec_enet_clk_enable(ndev, true);

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

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

600cc3a1aec796a8db2d3e7b1deaef57.png

1.2 获取以太网mac地址

db04a449e165b86f9b1174f465dab430.png

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

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

a376d0d24cb20419cdd153bbc4896b32.png

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

24f9cf09b71fc6b509ae2a727370bddf.png

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

548ce5f329685c22b66bb2650983dee9.png

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

7938f9f804fd7dc6aec70ee60c73b4e4.png

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

b2b7db9267bb634d6624c9fc5bde515b.png

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

f8d1891cc1962a4dbe180c3f63f99b9d.png

34f277f92ad64f8d4ace852263e8514b.png

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

c3dfc2759301cfc7bbd1b046c7d7b1f8.png

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

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

e9d4f8cc06b5c10ae7d1bfe18ee04a1d.png

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

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

f01a187ea92965d4e6f6955c492df1fe.png

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

dbbe56d729d6bc05732e188b0041ad9f.png

c573db9dbabae542a93cd80eadfdf7f0.png

否则:

110d7b540d6b8b6a5cb69fd7b480f187.png

设置buffer传输的基地址

d113c15c46674983f927016e19931aa6.png

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

bd8247a04007940b24106c56ca575b34.png

d22e2a5047dfd1b7088b929d5cbd7e1f.png

1ab5c92a820e8455794f37555034801e.png

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

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

fec_restart(ndev);

789b83f9cdef130e7d33f77e7cc181eb.png

流程如下:

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.

3) clear any outstanding interrupt.

4) reset tx skb buffers.

5) enable mii mode

6) the phy interface and speed need to get configured,

7) configure the gasket: rmii, 50 mhz, no loopback, no echo; mii, 25 mhz, no loopback, no echo

8) setup multicast filter.

9) and last, enable the transmit and receive processing

10) enable interrupts we wish to service

11) init the interrupt coalescing

fec_enet_init函数的流程到此结束

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

3e40e905e9fba424beb8e7477081e5d0.png

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值