From: lintao Date: Fri, 14 Mar 2014 01:26:54 +0000 (+0800) Subject: mmc: core: If controller drv had not registed shutdown callback, X-Git-Tag: firefly_0821_release~6096 X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=1b360afa71c18c9dd8ab16b1100f77b7acf616fe;p=firefly-linux-kernel-4.4.55.git mmc: core: If controller drv had not registed shutdown callback, mmc_bus_shutdown SHOULD NOT fall throught it We find kernel panic when rebooting system for nandflash based machine [ 105.821908] PC is at mmc_bus_shutdown+0xc/0x18 [ 105.826376] LR is at device_shutdown+0x114/0x174 [ 105.831015] pc : [] lr : [] psr: 600f0013 [ 105.831015] sp : cf0d9e58 ip : 00000000 fp : 00036864 [ 105.842499] r10: cdd888fc r9 : cf0d8000 r8 : c09e001c [ 105.847738] r7 : c0f9edd4 r6 : cdd8f1c8 r5 : cdd888c8 r4 : cdd888d4 [ 105.854275] r3 : 00000000 r2 : 00000001 r1 : 00000002 r0 : cdd888c0 [ 105.860815] Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user [ 105.867963] Control: 10c53c7d Table: 6df9004a DAC: 00000015 ..... [ 106.799170] [] (mmc_bus_shutdown+0xc/0x18) from [] (device_shutdown+0x114/0x174) [ 106.808341] [] (device_shutdown+0x114/0x174) from [] (kernel_restart+0xc/0x50) [ 106.817331] [] (kernel_restart+0xc/0x50) from [] (SyS_reboot+0x160/0x1dc) [ 106.825891] [] (SyS_reboot+0x160/0x1dc) from [] (ret_fast_syscall+0x0/0x48) --- diff --git a/drivers/mmc/core/bus.c b/drivers/mmc/core/bus.c index 42c1bbc47daa..37b4be81e530 100644 --- a/drivers/mmc/core/bus.c +++ b/drivers/mmc/core/bus.c @@ -126,8 +126,19 @@ static void mmc_bus_shutdown(struct device *dev) { struct mmc_driver *drv = to_mmc_driver(dev->driver); struct mmc_card *card = mmc_dev_to_card(dev); + struct mmc_host *host = card->host; + int ret; + + if (dev->driver && drv->shutdown) + drv->shutdown(card); + + if (host->bus_ops->shutdown) { + ret = host->bus_ops->shutdown(host); + + if (ret) + pr_warn("%s: error %d during shutdown\n",mmc_hostname(host), ret); + } - drv->shutdown(card); } #ifdef CONFIG_PM_SLEEP