dm8168千兆网口挂载nfs失败的解决方法

一、内核打印
CPSW phy found : id is : 0x1cc912 
PHY 0:00 not found 
IP-Config: Complete: 
    device=eth0, addr=192.168.0.33, mask=255.255.255.0, gw=192.168.0.1, 
    host=192.168.0.33, domain=, nis-domain=(none), 
    bootserver=192.168.0.1, rootserver=192.168.0.150, rootpath= 
PHY: 0:01 - Link is Up - 1000/Full 
VFS: Unable to mount root fs via NFS, trying floppy. 
VFS: Cannot open root device "nfs" or unknown-block(2,0) 
Please append a correct "root=" boot option; here are the available partitions: 
1f00            128 mtdblock0  (driver?) 
1f01            2304 mtdblock1  (driver?) 
1f02            128 mtdblock2  (driver?) 
1f03            4352 mtdblock3  (driver?) 
1f04          107520 mtdblock4  (driver?) 
1f05          12288 mtdblock5  (driver?) 
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0) 
Backtrace: 
[] (dump_backtrace+0x0/0x110) from [] (dump_stack+0x18/0x1c) 
 r6:00008000 r5:c4770000 r4:c0500b58 r3:60000013 
[] (dump_stack+0x0/0x1c) from [] (panic+0x5c/0x178) 
[] (panic+0x0/0x178) from [] (mount_block_root+0x1c4/0x204) 
 r3:00000000 r2:00000000 r1:c4425f58 r0:c0448c15 
 r7:c0448c79 
[] (mount_block_root+0x0/0x204) from [] (mount_root+0xac/0xcc) 
[] (mount_root+0x0/0xcc) from [] (prepare_namespace+0x16c/0x1cc) 
 r4:c0500024 
[] (prepare_namespace+0x0/0x1cc) from [] (kernel_init+0x114/0x154) 
 r5:c002d0ac r4:c002d0ac 
[] (kernel_init+0x0/0x154) from [] (do_exit+0x0/0x5d0) 
 r5:c0008c5c r4:00000000

二、问题背景
  笔者用百兆网线连接板子的时候,可以进入文件系统,这也隐含说明,笔者的网络文件系统是
没有问题的;但是用千兆网线连接板子的时候,内核启动的时候会卡在挂载网络文件系统的那一步。

见(一、内核打印)中打印的信息。
  笔者使用的网卡不是TI官方原理图上的那个网卡,是我们后换了个网卡(RTL8211CL),所以刚
开始怀疑可能是内核网卡驱动对我们这款网卡千兆支持有问题,所以费了点时间熟悉了下RTL8211CL,并结合内核代码去分析。后来笔者在 genphy_read_status()这个函数跟踪打印中,有了点突破性
的发现,这个函数在drivers/net/phy/phy_device.c 。本来在百兆网线连接的环境下,因为打印
也出现了卡住问题(见:一、内核打印),后来思考问题可能网卡哪边初始化太迟,导致在挂载
网络文件系统的时候,还未完成,就导致了这卡住的问题,顺着这个思路,进行了一些测试,最后
问题解决了。

三、问题分析
  去分析 init/main.c 、init/do_mounts.c 、net/phy/phy_device.c 文件中相关代码。

四、解决方法
  方法一、在启动参数 bootargs 中添加 rootdelay=2 即可;
  方法二、在内核代码init/main.c文件中,有个kernel_init()函数,在此函数中以下代码
          位置添加一个延时两秒 ssleep(2),注意包含头文件 #include ;
if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) { 
    ramdisk_execute_command = NULL; 
    ssleep(2);//延时两秒左右 
    prepare_namespace(); 
}


bootargs 'console=ttyO2,115200n8 rootwait rw mem=256M notifyk.vpssm3_sva=0xBEE00000 vram=20M root=/dev/nfs nfsroot=192.168.x.x:/rootfs_path ip=192.168.x.x:::::eth0 mtdparts=omap2-nand.0:1M(boot),3M(kernel),50M(rootfs),400M(data1),58M(data2) rootdelay=3'


注意加了rootdelay=3,百兆则不需要。是否千兆协商并up的时间更长一些?

你可能感兴趣的:(dm8168千兆网口挂载nfs失败的解决方法)