Linux下smi/mdio总线驱动
(2015-01-21 10:55:54)
标签:
it |
分类: linux |
MII (媒体独立接口), 是 IEEE802.3 定义的以太网行业标准接口, smi 是 mii 中的标准管理接口, 有两跟管脚, mdio 和 mdc ,用来现实双向的数据输入/输出和时钟同步。 mdio 主要作用用来配置/读取 phy 的寄存器, 实现监控作用。 Smi 总线也就是mdio 总线。
以 mips 架构的 caium
octeon 处理器为例介绍 mdio 总线的驱动。
内核代码 drivers/net/phy/mdio-octeon.c
static int __init octeon_mdiobus_mod_init(void)
{
// 同 uart,usb,spi,i2c 等总线一样 , mdio 作为 platform 驱动注册到内核
return
platform_driver_register(&octeon_mdiobus_driver);
}
static struct platform_driver
octeon_mdiobus_driver = {
.driver = {
.name
= "mdio-octeon",
.owner
= THIS_MODULE,
. of_match_table =
octeon_mdiobus_match ,
},
.probe
= octeon_mdiobus_probe ,
.remove
= __exit_p(octeon_mdiobus_remove),
};
内核根据 of_match_table 找到了 octeon-3860-mdio 的驱动文件,
static struct of_device_id octeon_mdiobus_match[] = {
{
.compatible =
"cavium,octeon-3860-mdio",
},
{},
};
MODULE_DEVICE_TABLE(of, octeon_mdiobus_match);
该驱动说明支持符合” canium,octeon-3860-mdio” 规范接口的操作。
进入 probe()
static int __init octeon_mdiobus_probe(struct platform_device *pdev)
{
/* probe() 总体思想即填充一个 struct
octeon_mdiobus 的数据结构,
最后将此数据结构作为 pdev 的私有成员。 octeon_mdiobus 定义为:
struct octeon_mdiobus {
//struct mii_bus 是 linux 定义 mii 总线的通用数据结构。
struct mii_bus
*mii_bus;
u64
register_base;
resource_size_t
mdio_phys;
resource_size_t
regsize;
enum octeon_mdiobus_mode
mode;
int
phy_irq[PHY_MAX_ADDR];
};
octeon_mdiobus_mode 定义:
enum octeon_mdiobus_mode {
UNINIT = 0,
C22,
// IEEE802.3-2005
的条款 22.2.4,
22.3.4
C45
// 条款 45. 不用的条款使用不同的数据帧结构。
};
*/
struct octeon_mdiobus
*bus;
struct resource
*res_mem;
union cvmx_smix_en
smi_en;
int err =
-ENOENT;
// 为 platfrom 设备 pdev 的私有数据分配内存,长度 struct
octeon_mdiobus 的长度
bus =
devm_kzalloc(&pdev->dev, sizeof(*bus),
GFP_KERNEL);
if (!bus)
return -ENOMEM;
res_mem = platform_get_resource(pdev,
IORESOURCE_MEM, 0);
if (res_mem == NULL)
{
dev_err(&pdev->dev, "found no memory
resource\n");
err = -ENXIO;
goto fail_region;
}
以
内核代码
static int __init octeon_mdiobus_mod_init(void)
{
}
};
内核根据
static struct of_device_id octeon_mdiobus_match[] = {
};
MODULE_DEVICE_TABLE(of, octeon_mdiobus_match);
该驱动说明支持符合”
进入
static int __init octeon_mdiobus_probe(struct platform_device *pdev)
{
struct octeon_mdiobus {
};
octeon_mdiobus_mode
enum octeon_mdiobus_mode {
的条款
};
*/
//