• Huacai Chen's avatar
    stmmac: Don't init ptp again when resume from suspend/hibernation · fe131929
    Huacai Chen authored
    Both stmmac_open() and stmmac_resume() call stmmac_hw_setup(), and
    stmmac_hw_setup() call stmmac_init_ptp() unconditionally. However, only
    stmmac_release() calls stmmac_release_ptp(). Since stmmac_suspend()
    doesn't call stmmac_release_ptp(), stmmac_resume() also needn't call
    stmmac_init_ptp().
    
    This patch also fix a "scheduling while atomic" problem when resume
    from suspend/hibernation. Because stmmac_init_ptp() will trigger
    scheduling while stmmac_resume() hold a spinlock.
    
    Callgraph of "scheduling while atomic":
    stmmac_resume() --> stmmac_hw_setup() --> stmmac_init_ptp() -->
    stmmac_ptp_register() --> ptp_clock_register() --> device_create() -->
    device_create_groups_vargs() --> device_add() --> devtmpfs_create_node()
    --> wait_for_common() --> schedule_timeout() --> __schedule()
    Signed-off-by: default avatarHuacai Chen <chenhc@lemote.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    fe131929
stmmac_main.c 86.8 KB