##这里主要是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匹配