/* * removes a virtio device if a hot remove event has been * requested by the host. */ static int mic_remove_device(struct mic_device_desc __iomem *d, unsigned int offset, struct mic_driver *mdrv) { struct mic_device_ctrl __iomem *dc = (void __iomem *)d + mic_aligned_desc_size(d); struct mic_vdev *mvdev = (struct mic_vdev *)ioread64(&dc->vdev); u8 status; int ret = -1; if (ioread8(&dc->config_change) == MIC_VIRTIO_PARAM_DEV_REMOVE) { dev_dbg(mdrv->dev, "%s %d config_change %d type %d mvdev %p\n", __func__, __LINE__, ioread8(&dc->config_change), ioread8(&d->type), mvdev); status = ioread8(&d->status); reinit_completion(&mvdev->reset_done); unregister_virtio_device(&mvdev->vdev); mic_free_card_irq(mvdev->virtio_cookie, mvdev); if (status & VIRTIO_CONFIG_S_DRIVER_OK) wait_for_completion(&mvdev->reset_done); kfree(mvdev); iowrite8(1, &dc->guest_ack); dev_dbg(mdrv->dev, "%s %d guest_ack %d\n", __func__, __LINE__, ioread8(&dc->guest_ack)); ret = 0; } return ret; }
int mc_send_command(struct fsl_mc_io *mc_io, struct mc_command *cmd) { enum mc_cmd_status status; uint64_t response; if (!mc_io || !mc_io->regs) return -EACCES; /* --- Call lock function here in case portal is shared --- */ rte_spinlock_lock(&mc_portal_lock); mc_write_command(mc_io->regs, cmd); /* Spin until status changes */ do { response = ioread64(mc_io->regs); status = mc_cmd_read_status((struct mc_command *)&response); /* --- Call wait function here to prevent blocking --- * Change the loop condition accordingly to exit on timeout. */ } while (status == MC_CMD_STATUS_READY); /* Read the response back into the command buffer */ mc_read_response(mc_io->regs, cmd); /* --- Call unlock function here in case portal is shared --- */ rte_spinlock_unlock(&mc_portal_lock); return mc_status_to_error(status); }
static void mic_handle_config_change(struct mic_device_desc __iomem *d, unsigned int offset, struct mic_driver *mdrv) { struct mic_device_ctrl __iomem *dc = (void __iomem *)d + mic_aligned_desc_size(d); struct mic_vdev *mvdev = (struct mic_vdev *)ioread64(&dc->vdev); struct virtio_driver *drv; if (ioread8(&dc->config_change) != MIC_VIRTIO_PARAM_CONFIG_CHANGED) return; dev_dbg(mdrv->dev, "%s %d\n", __func__, __LINE__); drv = container_of(mvdev->vdev.dev.driver, struct virtio_driver, driver); if (drv->config_changed) drv->config_changed(&mvdev->vdev); iowrite8(1, &dc->guest_ack); }