• Nimrod Andy's avatar
    net: fec: fix suspend broken on multiple MACs sillicons · f4c4a4e0
    Nimrod Andy authored
    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: default avatarFugang Duan <B38611@freescale.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    f4c4a4e0
fec_main.c 85.7 KB