rt-thread-official/components/drivers/phy/mdio.c

76 lines
1.4 KiB
C

/*
* Copyright (c) 2006-2024 RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date Author Notes
* 2024-10-08 zhujiale the first version
*/
#include "mdio.h"
static struct rt_list_node mdio_list;
struct mii_bus *rt_mdio_get_bus_by_name(const char *busname)
{
struct rt_list_node *entry;
struct mii_bus *bus;
if (!busname)
{
rt_kprintf("NULL bus name!\n");
return RT_NULL;
}
rt_list_for_each(entry, &mdio_list)
{
bus = rt_container_of(entry, struct mii_bus, node);
if (!strcmp(bus->name, busname))
return bus;
}
return RT_NULL;
}
struct mii_bus *rt_mdio_alloc(void)
{
struct mii_bus *mii;
mii = rt_malloc(sizeof(struct mii_bus));
if (!mii)
return RT_NULL;
rt_list_init(&mii->node);
return mii;
}
rt_err_t rt_mdio_register(struct mii_bus *bus)
{
if (!bus)
return -RT_ERROR;
if(rt_mdio_get_bus_by_name(bus->name))
{
rt_kprintf("mdio bus %s already exist!\n", bus->name);
return -RT_ERROR;
}
rt_list_insert_before(&mdio_list, &bus->node);
return RT_EOK;
}
rt_err_t rt_mdio_unregister(struct mii_bus *bus)
{
if (!bus)
return -RT_ERROR;
rt_list_remove(&bus->node);
return RT_EOK;
}
static int mdio_init(void)
{
rt_list_init(&mdio_list);
return 0;
}
INIT_CORE_EXPORT(mdio_init);