diff options
author | Marek Vasut <marek.vasut+renesas@mailbox.org> | 2023-03-19 18:02:42 +0100 |
---|---|---|
committer | Marek Vasut <marek.vasut+renesas@mailbox.org> | 2023-04-07 14:18:48 +0200 |
commit | 7940a93eb9778d275d5c2adcc8ee04e2f52d7b57 (patch) | |
tree | 035c36d0c0990b29786613812b8e82002e69ffac /drivers | |
parent | 9d5a38c2143e32d36908cbd5ef53a688e89edcb5 (diff) | |
download | u-boot-7940a93eb9778d275d5c2adcc8ee04e2f52d7b57.zip u-boot-7940a93eb9778d275d5c2adcc8ee04e2f52d7b57.tar.gz u-boot-7940a93eb9778d275d5c2adcc8ee04e2f52d7b57.tar.bz2 |
net: phy: Iterate over both registered PHYs and struct phy_driver linker list
Introduce U_BOOT_PHY_DRIVER() macro which is used to add struct phy_driver
into a new linker list section containing all compiled in struct phy_driver
drivers. This is so far empty until PHY drivers are converted over to this
macro.
Iterate over both drivers registered using soon to be legacy phy_register()
as well as drivers in the new linker list when looking up a suitable PHY
driver. This way, PHY drivers can be converted over to the new macro one
driver at a time.
The relocation of callbacks for linker list based drivers now happens in
phy_init() call as the drivers are available at that point in time, and
phy_register() is not called for those drivers.
Signed-off-by: Marek Vasut <marek.vasut+renesas@mailbox.org>
Acked-by: Michal Simek <michal.simek@amd.com>
Tested-by: Michal Simek <michal.simek@amd.com> #microblaze (MANUAL_RELOC)
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/phy/phy.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 5097c32..50bfabb 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -495,6 +495,9 @@ static void phy_drv_reloc(struct phy_driver *drv) int phy_init(void) { #ifdef CONFIG_NEEDS_MANUAL_RELOC + const int ll_n_ents = ll_entry_count(struct phy_driver, phy_driver); + struct phy_driver *drv, *ll_entry; + /* * The pointers inside phy_drivers also needs to be updated incase of * manual reloc, without which these points to some invalid @@ -504,6 +507,11 @@ int phy_init(void) head->next = (void *)head->next + gd->reloc_off; head->prev = (void *)head->prev + gd->reloc_off; + + /* Perform manual relocation on linker list based PHY drivers */ + ll_entry = ll_entry_start(struct phy_driver, phy_driver); + for (drv = ll_entry; drv != ll_entry + ll_n_ents; drv++) + phy_drv_reloc(drv); #endif #ifdef CONFIG_B53_SWITCH @@ -660,6 +668,8 @@ static struct phy_driver *generic_for_phy(struct phy_device *phydev) static struct phy_driver *get_phy_driver(struct phy_device *phydev) { + const int ll_n_ents = ll_entry_count(struct phy_driver, phy_driver); + struct phy_driver *ll_entry; struct list_head *entry; int phy_id = phydev->phy_id; struct phy_driver *drv = NULL; @@ -670,6 +680,11 @@ static struct phy_driver *get_phy_driver(struct phy_device *phydev) return drv; } + ll_entry = ll_entry_start(struct phy_driver, phy_driver); + for (drv = ll_entry; drv != ll_entry + ll_n_ents; drv++) + if ((drv->uid & drv->mask) == (phy_id & drv->mask)) + return drv; + /* If we made it here, there's no driver for this PHY */ return generic_for_phy(phydev); } |