На этой стороне микросхемы с FPGA для проверки MAC / PHY, на основе Linux 3.6.4, резюме кода здесь.
Последовательность инициализации PHY
первый шаг
phy_init
mdio_bus_init
bus_register (& mdio_bus_type); // AutoProbe
phy_driver_register (& genphy_driver);
Второй шаг, конкретные инициализации PHY привода (в примере icplus)
icplus_init
phy_drivers_register (icplus_driver, ARRAY_SIZE (icplus_driver));
phy_driver_register
new_driver-> driver.bus = & mdio_bus_type; // также mdio_bus_type
new_driver-> driver.probe = phy_probe;
new_driver-> driver.remove = phy_remove;
driver_register
bus_add_driver
driver_attach // не запускали следующее в качестве первой регистрации водителя, а не матч устройство, только примеры
__driver_attach
driver_match_device
DRV - > BUS-> // матч mdio_bus_type внутри mdio_bus_match
Третий шаг, драйвер сетевой карты
mt_eth_init
platform_driver_register (& mt_eth_driver);
mt_eth_drv_probe
mt_eth_mii_init
mdiobus_register
device_register
device_add
bus_add_device
bus_probe_device
device_attach
__device_attach
driver_match_device
DRV - > BUS-> // матч mdio_bus_type внутри mdio_bus_match
driver_probe_device
really_probe
dev-> BUS-> // Зонд т.е. phy_probe, государство в это время PHY_READY
phydev-> DRV - > зонда // Если это так, то конкретные вызовы зонда PHY, такие как icplus из mdiobus_scan
get_phy_device
get_phy_id
phy_device_create // PHY_DOWN состояние
mdiobus_scan
phy_device_register
device_register // , а затем вышеуказанного способа в качестве
mt_eth_mii_probe // одном уровне и mdiobus_register , вызов mt_eth_mii_init
phy_connect
bus_find_device_by_name
phy_connect_direct
phy_attach_direct // состояние в это время PHY_READY
phy_init_hw
phydev-> DRV - > config_init (phydev); // ICPLUS воплощено в
phy_start_machine
Планирование delayed_work, на самом деле, phy_state_machine
mt_eth_adjust_link
Добавить mdio_bus_match, выяснит, чтобы посмотреть на ((phydrv-> phy_id & phydrv-> phy_id_mask) == (phydev-> phy_id и phydrv-> phy_id_mask)) или нет.