最近遇到了一个比较烦人的问题,就是我的这个loongnix系统上在接网口0之后,设置了固定的IP地址,重启之后,之前创建的有线连接失效,反而新增了一个新的有线连接。捯饬了两三天,终于将其优化成固定的MAC。其间,有一个跑精简系统的2k1000的板子的网口MAC地址每次开机不会改变,误导了我,走了点弯路。这里记录一下。
首先明确的是,我不能通过set ethaddr来设置这个地址,虽然能快速解决,但是比较麻烦,如果板卡较多,为了防止MAC冲突,还得每个都得记录一下。
板子使用的PHY芯片都是RTL8211F。(可以忽略中间调试过程,直接看最后几段的解决方法)
首先,我肯定的认为是我的内核有问题,在排查过程中,使用dmesg看,驱动每次执行完会打印当前的MAC地址。4.19版本内核的打印值都是相同的。
[ 4.023834] stmmac - user ID: 0xd1, Synopsys ID: 0x37
[ 4.023841] Enhanced/Alternate descriptors
[ 4.023847] Ring mode enabled
[ 4.023855] DMA HW capability register supported
[ 4.023863] RX Checksum Offload Engine supported (type 2)
[ 4.023897] TX Checksum insertion supported
[ 4.023902] Wake-Up On Lan supported
[ 4.023909] Enable GMAC 64bit DMA
[ 4.023914] Enable RX Mitigation via HW Watchdog Timer
[ 4.023925] eth%d: device MAC address d6:40:79:32:5d:51
[ 4.032971] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[ 4.033190] ata1.00: ATA-10: KINGSTON SNS4151S316G, S9FM01.1, max UDMA/100
[ 4.033201] ata1.00: 31277232 sectors, multi 16: LBA48 NCQ (depth 31/32)
[ 4.033493] ata1.00: configured for UDMA/100
[ 4.034012] scsi 0:0:0:0: Direct-Access ATA KINGSTON SNS4151 01.1 PQ: 0 ANSI: 5
[ 4.035508] libphy: stmmac: probed
[ 4.035526] eth0: PHY ID 001cc916 at 0 IRQ 0 (stmmac-0:00) active
[ 4.035535] eth0: PHY ID 001cc916 at 1 IRQ 0 (stmmac-0:01)
这里在初步怀疑是内核的问题的时候,而且错误的以为是内核从PHY芯片里读出来的MAC值。看到这个内核调用的是drivers/net/ethernet/stmicro/stmmac驱动之后,二话没说,就来了一顿移植。两个版本的内核框架性的东西改动挺多的,好多文件都要改,移了半天没编过,果断放弃。
接下来,对比两个版本的内核,发现都是通过读去2K1000的寄存器获取的MAC值。
static void dwmac1000_get_umac_addr(void __iomem *ioaddr, unsigned char *addr,
unsigned int reg_n)
{
stmmac_get_mac_addr(ioaddr, addr, GMAC_ADDR_HIGH(reg_n),
GMAC_ADDR_LOW(reg_n));
}
void stmmac_get_mac_addr(void __iomem *ioaddr, unsigned char *addr,
unsigned int high, unsigned int low)
{
unsigned int hi_addr, lo_addr;
/* Read the MAC address from the hardware */
hi_addr = readl(ioaddr + high);
lo_addr = readl(ioaddr + low);
/* Extract the MAC address from the high and low words */
addr[0]