/*
 * 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);