MDIO总线相关_1

##这里主要是driver端

在drivers/net/phy里面针对某一品牌的网络交换设备有一个文件 例如 smsc ,有一个smsc.c

该品牌有多个设备.每个设备对应一个结构体,因此组成了一个结构体数组

数组元素类型 : struct phy_driver

数组元素举例

{
	.phy_id		= 0x0007c0f0, /* OUI=0x00800f, Model#=0x0f */
	.phy_id_mask	= 0xfffffff0,
	.name		= "SMSC LAN8710/LAN8720",
	
	.features	= (PHY_BASIC_FEATURES | SUPPORTED_Pause
				| SUPPORTED_Asym_Pause),
	.flags		= PHY_HAS_INTERRUPT | PHY_HAS_MAGICANEG,
	
	/* basic functions */
	.config_aneg	= genphy_config_aneg,
	.read_status	= lan87xx_read_status,
	.config_init	= smsc_phy_config_init,
	
	/* IRQ related */
	.ack_interrupt	= smsc_phy_ack_interrupt,
	.config_intr	= smsc_phy_config_intr,
	
	.suspend	= genphy_suspend,
	.resume		= genphy_resume,
	
	.driver		= { .owner = THIS_MODULE, }
}

针对数组中的每个元素都会注册一次
每个设备的注册流程

1/填充数组元素中的driver结构体(类型struct device_driver)

	new_driver->driver.name = new_driver->name;
	new_driver->driver.bus = &mdio_bus_type;
	new_driver->driver.probe = phy_probe;
	new_driver->driver.remove = phy_remove;

参数说明

1/

new_driver->name ="SMSC LAN911x Internal PHY";

2/

struct bus_type mdio_bus_type = {
	.name		= "mdio_bus",
	.match		= mdio_bus_match,
	.pm		= MDIO_BUS_PM_OPS,
	.dev_attrs	= mdio_dev_attrs,
};

3/
phy_probe 一品牌的设备共用一个
4/
phy_remove 一品牌的设备公用一个


2/注册
driver_register(&new_driver->driver);


配置内核

Device Drivers  --->
	[*] Network device support  --->
		<*>   PHY Device support and infrastructure  --->
			< >   Drivers for SMSC PHYs

注意,最后匹配的并不是 phy_driver 和 phy_device
而是phy_driver中的driver和phy_device匹配

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值