net: fec: fix suspend broken on multiple MACs sillicons
On i.MX6SX sdb platform, there has two same enet MACs, after system up,
just eth0 is up, and then do suspend/resume test:
[ 50.437967] PM: Syncing filesystems ... done.
[ 50.476924] Freezing user space processes ... (elapsed 0.005 seconds) done.
[ 50.490093] Freezing remaining freezable tasks ... (elapsed 0.004 seconds) done.
[ 50.559771] ------------[ cut here ]------------
[ 50.564453] WARNING: CPU: 0 PID: 575 at drivers/clk/clk.c:851 __clk_disable+0x60/0x6c()
[ 50.572475] Modules linked in:
[ 50.575578] CPU: 0 PID: 575 Comm: sh Not tainted
3.18.0-rc2-next-20141031-00007-gf61135b #21
[ 50.584031] Backtrace:
[ 50.586550] [<
80011ecc>] (dump_backtrace) from [<
8001206c>] (show_stack+0x18/0x1c)
[ 50.594136] r6:
808a7a54 r5:
00000000 r4:
00000000 r3:
00000000
[ 50.599920] [<
80012054>] (show_stack) from [<
806ab3c0>] (dump_stack+0x80/0x9c)
[ 50.607187] [<
806ab340>] (dump_stack) from [<
8002a3e8>] (warn_slowpath_common+0x6c/0x8c)
[ 50.615294] r5:
00000353 r4:
00000000
[ 50.618940] [<
8002a37c>] (warn_slowpath_common) from [<
8002a42c>] (warn_slowpath_null+0x24/0x2c)
[ 50.627738] r8:
00000000 r7:
be144c44 r6:
be015600 r5:
80070013 r4:
be015600
[ 50.634573] [<
8002a408>] (warn_slowpath_null) from [<
804f8d4c>] (__clk_disable+0x60/0x6c)
[ 50.642777] [<
804f8cec>] (__clk_disable) from [<
804f8e5c>] (clk_disable+0x2c/0x38)
[ 50.650359] r4:
be015600 r3:
00000000
[ 50.654006] [<
804f8e30>] (clk_disable) from [<
80420ab4>] (fec_enet_clk_enable+0xc4/0x258)
[ 50.662196] r5:
be3cb620 r4:
be3cb000
[ 50.665838] [<
804209f0>] (fec_enet_clk_enable) from [<
80421178>] (fec_suspend+0x30/0x180)
[ 50.674026] r7:
be144c44 r6:
be144c10 r5:
8037f5a4 r4:
be3cb000
[ 50.679802] [<
80421148>] (fec_suspend) from [<
8037f5d8>] (platform_pm_suspend+0x34/0x64)
[ 50.687906] r10:
00000000 r9:
00000000 r8:
00000000 r7:
be144c44 r6:
be144c10 r5:
8037f5a4
[ 50.695852] r4:
be144c10 r3:
80421148
[ 50.699511] [<
8037f5a4>] (platform_pm_suspend) from [<
8038784c>] (dpm_run_callback.isra.14+0x34/0x6c)
[ 50.708764] [<
80387818>] (dpm_run_callback.isra.14) from [<
80387f00>] (__device_suspend+0x12c/0x2a4)
[ 50.717909] r9:
8098ec8c r8:
80973bec r6:
00000002 r5:
811c7038 r4:
be144c10
[ 50.724746] [<
80387dd4>] (__device_suspend) from [<
803894fc>] (dpm_suspend+0x64/0x224)
[ 50.732675] r8:
80973bec r7:
be144c10 r6:
8098ec24 r5:
811c7038 r4:
be144cc4
[ 50.739509] [<
80389498>] (dpm_suspend) from [<
8038999c>] (dpm_suspend_start+0x60/0x68)
[ 50.747438] r10:
8082fa24 r9:
00000000 r8:
00000004 r7:
00000003 r6:
00000000 r5:
8116ec80
[ 50.755386] r4:
00000002
[ 50.757969] [<
8038993c>] (dpm_suspend_start) from [<
800679d8>] (suspend_devices_and_enter+0x90/0x3ec)
[ 50.767202] r4:
00000003 r3:
8116eca0
[ 50.770843] [<
80067948>] (suspend_devices_and_enter) from [<
80067f40>] (pm_suspend+0x20c/0x2a4)
[ 50.779553] r8:
00000004 r7:
00000003 r6:
00000000 r5:
8116ec8c r4:
00000003
[ 50.786394] [<
80067d34>] (pm_suspend) from [<
80066858>] (state_store+0x70/0xc0)
[ 50.793718] r6:
8116ec90 r5:
00000003 r4:
bd88a800 r3:
0000006d
[ 50.799496] [<
800667e8>] (state_store) from [<
802b0384>] (kobj_attr_store+0x1c/0x28)
[ 50.807251] r10:
bd399f78 r8:
00000000 r7:
bd88a800 r6:
bd88a800 r5:
00000004 r4:
bd085680
[ 50.815219] [<
802b0368>] (kobj_attr_store) from [<
80153090>] (sysfs_kf_write+0x54/0x58)
[ 50.823252] [<
8015303c>] (sysfs_kf_write) from [<
80151fd8>] (kernfs_fop_write+0xd0/0x194)
[ 50.831441] r6:
00000004 r5:
bd08568c r4:
bd085680 r3:
8015303c
[ 50.837220] [<
80151f08>] (kernfs_fop_write) from [<
800eddb4>] (vfs_write+0xb8/0x1a8)
[ 50.844975] r10:
00000000 r9:
00000000 r8:
00000000 r7:
bd399f78 r6:
01336408 r5:
00000004
[ 50.852924] r4:
bc584dc0
[ 50.855505] [<
800edcfc>] (vfs_write) from [<
800ee0b8>] (SyS_write+0x48/0x88)
[ 50.862567] r10:
00000000 r8:
00000000 r7:
01336408 r6:
00000004 r5:
bc584dc0 r4:
bc584dc0
[ 50.870537] [<
800ee070>] (SyS_write) from [<
8000eb00>] (ret_fast_syscall+0x0/0x48)
[ 50.878120] r9:
bd398000 r8:
8000ecc4 r7:
00000004 r6:
76f42b48 r5:
01336408 r4:
00000004
[ 50.885983] ---[ end trace
7545115d752a316a ]---
[ 50.890765] ------------[ cut here ]------------
The root cause is that eth1 is not opened and clock is not enabled, and .suspend() still
call .fec_enet_clk_enable() to disable clock.
To avoid the broken, let it check network device up status by calling .netif_running()
before disable/enable clocks.
Signed-off-by: Fugang Duan <B38611@freescale.com>
Signed-off-by: David S. Miller <davem@davemloft.net>