- MAC注册:
./drivers/net/ethernet/freescale/fec_main.c注册mac驱动,compatible匹配dts里面的”fsl,imx6q-fec”的MAC设备,成功后->probe(fec_probe)中:
struct net_device *ndev = alloc_ethrdev_mqs(); //创建net_dev
SET_NETDEV_DEV(ndev, &pdev->dev); //绑定net_dev到具体dev
时钟资源get与prepare
fec_reset_phy(); //dts里面phy-reset-gpio
fec_enet_init(dev); //配置fec寄存器,napi接口add
-> netif_napi_add();
->ndev->netdev_ops;
->ndev->ethtool_ops;
fec_enet_mii_init();
->创建fep->mii_bus;
->mdiobus_register();
register_netdev();
- PHY注册:
- 1、mdio总线注册:
./drivers/net/phy/mdio_bus.c提供了mdio_bus的通用接口,mdio_bus_init()负责创建mdio_bus总线以及bus->match、bus->pm,./drivers/net/phy/phy_device.c通过subsys_initcall(phy_init);的phy_init()函数中调用mdio_bus_init()注册mdio总线;
2、mdio驱动注册:
Phy_init()函数调用phy_drivers_register();来注册phy_drivers,包括Generic PHY和Generic 10G PHY这2个通用phy_drivers,挂在mdio_bus总线上。
3、mdio设备注册:
./drivers/net/ethnet/freescale/fec_main.c的probe->fec_enet_mii_init()中调用mdiobus_register(bus);->device_register(&bus->dev);来注册ethx的mdio设备,及具体phy。
遍历0到PHY_MAX_ADDR的phy地址,mdiobus_scan();
Phy_device_register():主要包括
mdiobus_register_device(); //mdiodev->bus->mdio_map[paddr] = mdiodev;
Phy_scan_fixups(); //phy寄存器配置
device_add(); //
- eth设备的ioctl
ethx被up的时候,->fec_enet_mii_probe(ndev);
首先尝试phy是否被绑定,如果不存在则尝试遍历该网卡的mii总线上的phy是否存在。
eth设备支持ioctl的操作,比如读写phy寄存器等。
sockfd = socket(PF_LOCAL, SOCK_DGRAM, 0);
ret = ioctl(sockfd, SIOCGMIIPHY, &ifr);
通过socket.c的ioctl -> sock_do_ioctl ->dev_ioctl(); ->mac_ioctl
Mac_ioctl就是netdev注册的drv->fec_enet_ioctl();
->phy_mii_ioctl();
->mdiobus_read(bus, phy_id, reg_addr);