龙芯2K1000平台重启后之前设置IP失效问题解决

  最近遇到了一个比较烦人的问题,就是我的这个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] 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值