日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux网络设备—mdio总线

發布時間:2023/12/10 linux 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux网络设备—mdio总线 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.結構體

struct mii_bus {const char *name; //總線名char id[MII_BUS_ID_SIZE]; //idvoid *priv; //私有數據int (*read)(struct mii_bus *bus, int phy_id, int regnum); //讀方法int (*write)(struct mii_bus *bus, int phy_id, int regnum, u16 val); //寫方法int (*reset)(struct mii_bus *bus); //復位struct mutex mdio_lock;struct device *parent; //父設備enum {MDIOBUS_ALLOCATED = 1,MDIOBUS_REGISTERED,MDIOBUS_UNREGISTERED,MDIOBUS_RELEASED,} state; //總線狀態struct device dev; //設備文件struct phy_device *phy_map[PHY_MAX_ADDR]; //PHY設備數組u32 phy_mask;int *irq; //中斷 };

二.初始化過程

在phy_init函數中調用了mdio_bus_init初始化mdio總線

int __init mdio_bus_init(void) {int ret;ret = class_register(&mdio_bus_class); //注冊設備類if (!ret) {ret = bus_register(&mdio_bus_type); //注冊mdio總線if (ret)class_unregister(&mdio_bus_class);}return ret; }

設備類"/sys/class/mdio_bus"

static struct class mdio_bus_class = {.name = "mdio_bus",.dev_release = mdiobus_release, };

總線類型"/sys/bus/mdio"

struct bus_type mdio_bus_type = {.name = "mdio_bus",.match = mdio_bus_match, //匹配方法.pm = MDIO_BUS_PM_OPS, }; EXPORT_SYMBOL(mdio_bus_type);

三.mdio總線注冊
1.調用mdiobus_alloc函數分配內存

struct mii_bus *mdiobus_alloc(void) {struct mii_bus *bus;bus = kzalloc(sizeof(*bus), GFP_KERNEL); //分配內存if (bus != NULL)bus->state = MDIOBUS_ALLOCATED;return bus; } EXPORT_SYMBOL(mdiobus_alloc);

2.填充mii_bus的結構體成員

mii_bus->name = ; mii_bus->read = ; mii_bus->write = ; mii_bus->reset = ; mii_bus->parent = ; mii_bus->priv = ; mii_bus->id = ;

3.注冊mii_bus

int mdiobus_register(struct mii_bus *bus) {int i, err;if (NULL == bus || NULL == bus->name || NULL == bus->read ||NULL == bus->write)return -EINVAL;BUG_ON(bus->state != MDIOBUS_ALLOCATED &&bus->state != MDIOBUS_UNREGISTERED);bus->dev.parent = bus->parent;bus->dev.class = &mdio_bus_class; //總線設備類"/sys/bus/mdio_bus"bus->dev.groups = NULL;dev_set_name(&bus->dev, "%s", bus->id); //設置總線設備名err = device_register(&bus->dev); //注冊設備文件if (err) {printk(KERN_ERR "mii_bus %s failed to register\n", bus->id);return -EINVAL;}mutex_init(&bus->mdio_lock);if (bus->reset)bus->reset(bus); //總線復位for (i = 0; i < PHY_MAX_ADDR; i++) {if ((bus->phy_mask & (1 << i)) == 0) {struct phy_device *phydev;phydev = mdiobus_scan(bus, i); //掃描phy設備if (IS_ERR(phydev)) {err = PTR_ERR(phydev);goto error;}}}bus->state = MDIOBUS_REGISTERED; //狀態設置為已注冊pr_info("%s: probed\n", bus->name);return 0; error:while (--i >= 0) {if (bus->phy_map[i])device_unregister(&bus->phy_map[i]->dev);}device_del(&bus->dev);return err; } EXPORT_SYMBOL(mdiobus_register);

調用了mdiobus_scan函數

struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr) {struct phy_device *phydev;int err;phydev = get_phy_device(bus, addr); //獲取創建phy設備if (IS_ERR(phydev) || phydev == NULL)return phydev;err = phy_device_register(phydev); //注冊phy設備if (err) {phy_device_free(phydev);return NULL;}return phydev; } EXPORT_SYMBOL(mdiobus_scan);

動態地創建了PHY設備

四.mii、mdio、phy、mac關系圖

總結

以上是生活随笔為你收集整理的linux网络设备—mdio总线的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。