|
@@ -37,71 +37,6 @@
|
|
|
#include "mic_virtio.h"
|
|
|
|
|
|
static struct mic_driver *g_drv;
|
|
|
-static struct mic_irq *shutdown_cookie;
|
|
|
-
|
|
|
-static void mic_notify_host(u8 state)
|
|
|
-{
|
|
|
- struct mic_driver *mdrv = g_drv;
|
|
|
- struct mic_bootparam __iomem *bootparam = mdrv->dp;
|
|
|
-
|
|
|
- iowrite8(state, &bootparam->shutdown_status);
|
|
|
- dev_dbg(mdrv->dev, "%s %d system_state %d\n",
|
|
|
- __func__, __LINE__, state);
|
|
|
- mic_send_intr(&mdrv->mdev, ioread8(&bootparam->c2h_shutdown_db));
|
|
|
-}
|
|
|
-
|
|
|
-static int mic_panic_event(struct notifier_block *this, unsigned long event,
|
|
|
- void *ptr)
|
|
|
-{
|
|
|
- struct mic_driver *mdrv = g_drv;
|
|
|
- struct mic_bootparam __iomem *bootparam = mdrv->dp;
|
|
|
-
|
|
|
- iowrite8(-1, &bootparam->h2c_config_db);
|
|
|
- iowrite8(-1, &bootparam->h2c_shutdown_db);
|
|
|
- mic_notify_host(MIC_CRASHED);
|
|
|
- return NOTIFY_DONE;
|
|
|
-}
|
|
|
-
|
|
|
-static struct notifier_block mic_panic = {
|
|
|
- .notifier_call = mic_panic_event,
|
|
|
-};
|
|
|
-
|
|
|
-static irqreturn_t mic_shutdown_isr(int irq, void *data)
|
|
|
-{
|
|
|
- struct mic_driver *mdrv = g_drv;
|
|
|
- struct mic_bootparam __iomem *bootparam = mdrv->dp;
|
|
|
-
|
|
|
- mic_ack_interrupt(&g_drv->mdev);
|
|
|
- if (ioread8(&bootparam->shutdown_card))
|
|
|
- orderly_poweroff(true);
|
|
|
- return IRQ_HANDLED;
|
|
|
-}
|
|
|
-
|
|
|
-static int mic_shutdown_init(void)
|
|
|
-{
|
|
|
- int rc = 0;
|
|
|
- struct mic_driver *mdrv = g_drv;
|
|
|
- struct mic_bootparam __iomem *bootparam = mdrv->dp;
|
|
|
- int shutdown_db;
|
|
|
-
|
|
|
- shutdown_db = mic_next_card_db();
|
|
|
- shutdown_cookie = mic_request_card_irq(mic_shutdown_isr, NULL,
|
|
|
- "Shutdown", mdrv, shutdown_db);
|
|
|
- if (IS_ERR(shutdown_cookie))
|
|
|
- rc = PTR_ERR(shutdown_cookie);
|
|
|
- else
|
|
|
- iowrite8(shutdown_db, &bootparam->h2c_shutdown_db);
|
|
|
- return rc;
|
|
|
-}
|
|
|
-
|
|
|
-static void mic_shutdown_uninit(void)
|
|
|
-{
|
|
|
- struct mic_driver *mdrv = g_drv;
|
|
|
- struct mic_bootparam __iomem *bootparam = mdrv->dp;
|
|
|
-
|
|
|
- iowrite8(-1, &bootparam->h2c_shutdown_db);
|
|
|
- mic_free_card_irq(shutdown_cookie, mdrv);
|
|
|
-}
|
|
|
|
|
|
static int __init mic_dp_init(void)
|
|
|
{
|
|
@@ -359,11 +294,7 @@ int __init mic_driver_init(struct mic_driver *mdrv)
|
|
|
u8 node_id;
|
|
|
|
|
|
g_drv = mdrv;
|
|
|
- /*
|
|
|
- * Unloading the card module is not supported. The MIC card module
|
|
|
- * handles fundamental operations like host/card initiated shutdowns
|
|
|
- * and informing the host about card crashes and cannot be unloaded.
|
|
|
- */
|
|
|
+ /* Unloading the card module is not supported. */
|
|
|
if (!try_module_get(mdrv->dev->driver->owner)) {
|
|
|
rc = -ENODEV;
|
|
|
goto done;
|
|
@@ -374,12 +305,9 @@ int __init mic_driver_init(struct mic_driver *mdrv)
|
|
|
rc = mic_init_irq();
|
|
|
if (rc)
|
|
|
goto dp_uninit;
|
|
|
- rc = mic_shutdown_init();
|
|
|
- if (rc)
|
|
|
- goto irq_uninit;
|
|
|
if (!mic_request_dma_chans(mdrv)) {
|
|
|
rc = -ENODEV;
|
|
|
- goto shutdown_uninit;
|
|
|
+ goto irq_uninit;
|
|
|
}
|
|
|
rc = mic_devices_init(mdrv);
|
|
|
if (rc)
|
|
@@ -390,21 +318,18 @@ int __init mic_driver_init(struct mic_driver *mdrv)
|
|
|
NULL, &scif_hw_ops,
|
|
|
0, node_id, &mdrv->mdev.mmio, NULL,
|
|
|
NULL, mdrv->dp, mdrv->dma_ch,
|
|
|
- mdrv->num_dma_ch);
|
|
|
+ mdrv->num_dma_ch, true);
|
|
|
if (IS_ERR(mdrv->scdev)) {
|
|
|
rc = PTR_ERR(mdrv->scdev);
|
|
|
goto device_uninit;
|
|
|
}
|
|
|
mic_create_card_debug_dir(mdrv);
|
|
|
- atomic_notifier_chain_register(&panic_notifier_list, &mic_panic);
|
|
|
done:
|
|
|
return rc;
|
|
|
device_uninit:
|
|
|
mic_devices_uninit(mdrv);
|
|
|
dma_free:
|
|
|
mic_free_dma_chans(mdrv);
|
|
|
-shutdown_uninit:
|
|
|
- mic_shutdown_uninit();
|
|
|
irq_uninit:
|
|
|
mic_uninit_irq();
|
|
|
dp_uninit:
|
|
@@ -425,13 +350,6 @@ void mic_driver_uninit(struct mic_driver *mdrv)
|
|
|
scif_unregister_device(mdrv->scdev);
|
|
|
mic_devices_uninit(mdrv);
|
|
|
mic_free_dma_chans(mdrv);
|
|
|
- /*
|
|
|
- * Inform the host about the shutdown status i.e. poweroff/restart etc.
|
|
|
- * The module cannot be unloaded so the only code path to call
|
|
|
- * mic_devices_uninit(..) is the shutdown callback.
|
|
|
- */
|
|
|
- mic_notify_host(system_state);
|
|
|
- mic_shutdown_uninit();
|
|
|
mic_uninit_irq();
|
|
|
mic_dp_uninit();
|
|
|
module_put(mdrv->dev->driver->owner);
|