zynq Ethernet device driver --- Linux kernel 实现欣赏

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

在这里插入图片描述
在这里插入图片描述

/**
 *     这些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;
					}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值