概述
多网卡情况下,系统上映射的网卡和物理网卡有时无法一一对应,要达到一一对应,可以参考以下方式。
涉及gamc驱动代码部分
代码主要位于:driver/net/ethernet/stmicro/stmmac/目录下
当dts中gmac和dwmac-rk.c::rk_gmac_dwmac_driver匹配后将进入rk_gmac_proc
rk_gmac_proc:
//填充plat_stmmacenet_data,即gmac和device之上总线层结构体
struct plat_stmmacenet_data *plat_dat;
//从设备树中获取gmac设备resources
struct stmmac_resources stmmac_res;
stmmac_probe_config_dt(pdev, &stmmac_res.mac);
//如果设备树(包括kernel中原本的设备树,或uboot对kernel设备树修改后的设备树)中相关参数异常,则使用如下接口获取
plat_dat->fix_mac_speed = rk_fix_speed;
plat_dat->get_eth_addr = rk_get_eth_addr;
//对网卡属性的一些配置
stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
根据bus-id指定网卡名
目的:按照plat_stmmacenet_data的bus_id来指定网卡序号,例如busid=0对应eth0,busid=1对应eth1
首先看下驱动中网卡命名过程:
stmmac_dvr_probe
//修改名字在注册网卡设备接口中进行
register_netdev
register_netdevice
dev_get_valid_name
dev_alloc_name_ns
__dev_alloc_name:
将通过设备树中的,例如gmac0: ethernet@fe2a0000,gmac1: ethernet@fe010000
以地址的大小排序,对eth%d赋值,按例这里得到gmac0对应eth1,gmac1对应eth0
按照bus_id来指定网卡序号:
--- a/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/kernel/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -4444,14 +4444,14 @@ int stmmac_dvr_probe(struct device *device,
goto error_mdio_register;
}
}
-
+ snprintf(ndev->name, IFNAMSIZ, ndev->name, plat_dat->bus_id);
+ printk("ssdbg >>> fixup ndev->name=%s\n", ndev->name);
ret = register_netdev(ndev);
if (ret) {
dev_err(priv->device, "%s: ERROR %i registering the device\n",
__func__, ret);
goto error_netdev_register;
}