net: fec: avoid kernal crash by NULL pointer when no phy connection
On i.MX6SX sabreauto board, when there have no phy daughter board connection,
there have kernel crash by NULL pointer:
fec 2188000.ethernet eth0: could not attach to PHY
Unable to handle kernel NULL pointer dereference at virtual address
00000220
pgd =
80004000
[
00000220] *pgd=
00000000
Internal error: Oops: 5 [#1] PREEMPT SMP ARM
Modules linked in:
CPU: 0 PID: 1 Comm: swapper/0 Not tainted 3.14.24-01042-g27eaeea-dirty #405
task:
d8078000 ti:
d8076000 task.ti:
d8076000
PC is at mutex_lock+0x10/0x54
LR is at phy_start+0x14/0x68
pc : [<
806ad4e4>] lr : [<
803b0f90>] psr:
60000113
sp :
d8077d80 ip :
00000000 fp :
d83cc000
r10:
0000100c r9 :
d83cc800 r8 :
00000000
r7 :
d83bcd0c r6 :
00000200 r5 :
00000220 r4 :
00000220
r3 :
00000000 r2 :
00000000 r1 :
d83bcd90 r0 :
00000220
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control:
10c5387d Table:
8000404a DAC:
00000015
Process swapper/0 (pid: 1, stack limit = 0xd8076240)
Stack: (0xd8077d80 to 0xd8078000)
7d80:
00000000 803b0f90 00000001 00000000 d83bc800 803be034 00000007 805c3fb4
7da0:
00000003 80d4e0bc 805efcb8 fffffff1 fffffff0 00000000 00000000 d8077dfc
7dc0:
0000000d 80d6ce80 80d126b0 800499c8 d83bc800 d83bc800 806f0f40 d83bc82c
7de0:
00000000 00000000 80d6ce80 80d126b0 0000016b 80540250 d8076008 d83bc800
7e00:
0000016b d83bc800 00001003 00000001 00001002 805404d4 d83bc800 00000120
7e20:
00001002 00001002 00000000 805405d4 d83bc800 00000001 80d126c0 00001002
7e40:
80dbc5dc 80d02024 00000000 806ae360 00000002 d6128420 d6127198 12400000
7e60:
00000000 00000000 00000002 d61271e8 00000000 12400000 d801674c 800e49f0
7e80:
d6127198 d6124e58 00000000 80238848 d61271c4 00000000 00000001 d8016700
7ea0:
80dd2e00 80d752c0 80d752c0 80cfdaec 0000010c 80239430 806c2e90 d800f080
7ec0:
d800f380 804e46b4 ffffffbc 80d15cb0 00000007 80d752c0 80d752c0 80d01e94
7ee0:
0000010c d8076030 00000000 800088cc 80dbaba4 80bd411c d80a6f00 806b1e04
7f00:
00000000 00000000 00000000 80125b84 00000000 80d2c56c 60000113 00000001
7f20:
ef7ff9df 806c80cc 0000010c 80043f5c 80c95eb8 00000007 ef7ffa1d 00000007
7f40:
80d2c55c 80d15cb0 00000007 80d752c0 80d752c0 80ccc50c 0000010c 80d0a114
7f60:
80d0a10c 80cccc04 00000007 00000007 80ccc50c 806ae410 00000000 8004cb84
7f80:
80d17bc0 00000000 806a4bd4 00000000 00000000 00000000 00000000 00000000
7fa0:
00000000 806a4bdc 00000000 8000e5f8 00000000 00000000 00000000 00000000
7fc0:
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
7fe0:
00000000 00000000 00000000 00000000 00000013 00000000 1e79a7bb e5337f77
[<
806ad4e4>] (mutex_lock) from [<
803b0f90>] (phy_start+0x14/0x68)
[<
803b0f90>] (phy_start) from [<
803be034>] (fec_enet_open+0x448/0x5dc)
[<
803be034>] (fec_enet_open) from [<
80540250>] (__dev_open+0xa8/0x110)
[<
80540250>] (__dev_open) from [<
805404d4>] (__dev_change_flags+0x88/0x170)
[<
805404d4>] (__dev_change_flags) from [<
805405d4>] (dev_change_flags+0x18/0x48)
[<
805405d4>] (dev_change_flags) from [<
80d02024>] (ip_auto_config+0x190/0xf94)
[<
80d02024>] (ip_auto_config) from [<
800088cc>] (do_one_initcall+0xe8/0x144)
[<
800088cc>] (do_one_initcall) from [<
80cccc04>] (kernel_init_freeable+0x104/0x1c8)
[<
80cccc04>] (kernel_init_freeable) from [<
806a4bdc>] (kernel_init+0x8/0xec)
[<
806a4bdc>] (kernel_init) from [<
8000e5f8>] (ret_from_fork+0x14/0x3c)
Code:
e92d4010 e3a03000 e1a04000 ee073fba (
e1903f9f)
Add phydev check to fix the issue.
Signed-off-by: Fugang Duan <B38611@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>