1 /*
2  * Copyright (c) 2006-2024 RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author       Notes
8  * 2024-10-08     zhujiale    the first version
9  */
10 #include "mdio.h"
11 
12 static struct rt_list_node mdio_list;
13 
rt_mdio_get_bus_by_name(const char * busname)14 struct mii_bus *rt_mdio_get_bus_by_name(const char *busname)
15 {
16     struct rt_list_node *entry;
17     struct mii_bus *bus;
18 
19     if (!busname)
20     {
21         rt_kprintf("NULL bus name!\n");
22         return RT_NULL;
23     }
24 
25     rt_list_for_each(entry, &mdio_list)
26     {
27         bus = rt_container_of(entry, struct mii_bus, node);
28         if (!strcmp(bus->name, busname))
29             return bus;
30     }
31 
32     return RT_NULL;
33 }
34 
rt_mdio_alloc(void)35 struct mii_bus *rt_mdio_alloc(void)
36 {
37     struct mii_bus *mii;
38     mii = rt_malloc(sizeof(struct mii_bus));
39     if (!mii)
40         return RT_NULL;
41 
42     rt_list_init(&mii->node);
43     return mii;
44 }
45 
rt_mdio_register(struct mii_bus * bus)46 rt_err_t rt_mdio_register(struct mii_bus *bus)
47 {
48     if (!bus)
49         return -RT_ERROR;
50 
51     if(rt_mdio_get_bus_by_name(bus->name))
52     {
53         rt_kprintf("mdio bus %s already exist!\n", bus->name);
54         return -RT_ERROR;
55     }
56 
57     rt_list_insert_before(&mdio_list, &bus->node);
58     return RT_EOK;
59 }
60 
rt_mdio_unregister(struct mii_bus * bus)61 rt_err_t rt_mdio_unregister(struct mii_bus *bus)
62 {
63     if (!bus)
64         return -RT_ERROR;
65 
66     rt_list_remove(&bus->node);
67     return RT_EOK;
68 }
69 
mdio_init(void)70 static int mdio_init(void)
71 {
72     rt_list_init(&mdio_list);
73     return 0;
74 }
75 INIT_CORE_EXPORT(mdio_init);
76