

/**
* 这些code 在 kernel中是怎么添加的、怎么匹配的、probe remove pm 是怎么被调用的,大家都十分熟悉了,
* 这里就不在赘述了. 详情参考 :
* https://blog.youkuaiyun.com/leesagacious/article/details/48306889
* https://blog.youkuaiyun.com/leesagacious/article/details/50246789
*/
static struct platform_driver macb_driver = {
.probe = macb_probe,
.remove = macb_remove,
.driver = {
.name = "macb",
.of_match_table = of_match_ptr(macb_dt_ids),
.pm = &macb_pm_ops,
},
};
module_platform_driver(macb_driver);
先来看一张简单的框图, 先欣赏linux kernel 实现,然后欣赏 verilog 实现.

phy_device 最里层当然是封装了struct device, 因为它要往设备驱动模型中放入这个设备.



/*
* #define PHY_MAX_ADDR 32
* 这个 32 意思很明确了, MDIO bus仅支持一个Mac作为主设备, 最多32个Phy做从设备.
*
* mii_bus 提供了read() 来读取 PHY Identifier Register的值
* 具体到 KSZ9031RNX 就是macb_mdio_read ()函数. 它在 macb_mii_init() 函数中被赋值.
* ixgbe网卡则是 ixgbe_x550em_a_mii_bus_read()函数
*/
for (i = 0; i < PHY_MAX_ADDR; i++) {
phydev = mdiobus_scan(bp->mii_bus, i);
if (IS_ERR(phydev) &&
PTR_ERR(phydev) != -ENODEV) {
ret = PTR_ERR(phydev);
break;
}

本文深入探讨了MACB平台驱动的实现细节,包括资源申请、PHY设备扫描、NAPI机制的应用及I350网卡驱动的具体实现。通过对两种驱动的对比分析,帮助读者理解Linux内核中网络接口控制器驱动的设计理念。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



