【问题标题】:how to retrieve bus pointer from device tree如何从设备树中检索总线指针
【发布时间】:2013-05-21 14:31:05
【问题描述】:

问题:

我正在尝试找到一种方法来检索已添加到设备树中的mdio_bus 的开发对象。当我克服这个问题时,我确信我会迅速将手掌放在额头上,但对于我的一生,我无法在任何地方找到答案。我已经看到如何使用bus_find_device_by_name() 在总线上查找对象,但我似乎无法找到如何获取总线本身。

背景:

我们使用连接到 at919g20 上的 MACB 的 Micrel KSZ8863 以太网交换机为我们的主机提供网络访问。我没有使用固定 PHY 选项,而是将 MDIO 地址 0 伪装成“假”PHY,表示到交换机的固定 MII 链路。我正在为交换机编写一个驱动程序,以接收其中断并监视向外的 PHY 并控制“假”PHY 到主机的链路状态。为了在基本 MIIM 配置之外配置交换机,您需要使用 MDIO 总线上的 SMI 来访问交换机中的完整寄存器阵列。通过进一步调整 MACB 中的 mii_read/write 函数,在 reg 地址中添加一个标头,我相信我可以使用 MACB 的 MDIO/MII 控制器为 SMI 请求做正确的事情。因为总线不再由 PHY:REG 寻址,所以我需要能够从开关驱动程序直接向总线发出原始读/写命令。这让我回到了我的问题:如何按名称从设备树中请求 mdio_bus 的 dev 对象?

谢谢, 布赖恩

【问题讨论】:

  • 这似乎是主题并且足够完整以回答 - 对于足够熟悉主题的人来说。不熟悉的请不要以不熟悉为由进行近距离投票。

标签: linux-device-driver embedded-linux


【解决方案1】:

在四处寻找一种方法来检索指向 mii_bus 对象的设备指针后,我最终想出了以下解决方案。我不确定这是最好的方法,但它看起来很干净。我基本上最终向 mdio_bus.c 添加了一个辅助函数,它允许另一个驱动程序使用 class_find_device() 按名称搜索总线。我确信有更好的方法来做到这一点,这不涉及添加到公共汽车的驱动程序,但这似乎也不是最糟糕的方法。

-布赖恩

这是我添加到 mdio_bus.c 中的函数:

/**
 * mdiobus_match_name - compares specified string to the device name 
 * @dev: device object to be examined
 * @data: pointer to string to compare device name to
 *
 * Description: matching function used in call to class_find_device() to find
 *              a device with the specified name
 */
static int mdiobus_match_name( struct device * dev, void * data )
{
    const char * name = data;

    return sysfs_streq( name, dev_name( dev ) );
}

/**
 * mdiobus_find_by_name - Convenience function for retrieving an mii_bus pointer
 *                        by name
 * @name: name of the bus being searched for
 */
struct mii_bus * mdiobus_find_by_name( char * name )
{
    struct device * dev;

    /* search devices registered for with the mdio_bus_class using the device
       name as the matching criteria */
    dev = class_find_device( &mdio_bus_class,
                             NULL,
                             (void *)name,
                             mdiobus_match_name );

    /* return the mii_bus pointer or NULL if none was found */
    return dev ? container_of( dev, struct mii_bus, dev ) : NULL;
}
EXPORT_SYMBOL( mdiobus_find_by_name );

【讨论】:

  • @Brian_Karcz 你应该把它发布到 Linux 内核列表之一,看看这个子系统的维护者是否可以接受它。
  • @Peter_L 我想过。如果有人比我有更多的 Linux 内核经验,我会让它炖一会儿,以防万一有更好的方法。我还必须弄清楚此类列表存在于何处以及如何发布到它们。
  • 我还应该注意,我将新函数的声明与导出的其余 mdiobus_* 函数一起添加到 phy.h。
  • @Brian_K 该列表的存档是 lkml.org 。你可以订阅vger.kernel.org/vger-lists.html 有几个子系统有自己的列表。这些名单上的人技术含量很高,很可能会在这方面提供帮助,或者至少为您指明正确的方向。
  • Brian - 感谢您发布您的问题和最终解决方案。我也遇到了同样的问题,并通过 Google 在 Stack Exchange 上找到了您的帖子。它似乎像一个魅力!谢谢——安迪
猜你喜欢
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-26
  • 1970-01-01
相关资源
最近更新 更多