Searched refs:mvdev (Results 1 - 5 of 5) sorted by relevance

/linux-4.4.14/drivers/misc/mic/host/
H A Dmic_virtio.c75 static int mic_virtio_copy_to_user(struct mic_vdev *mvdev, void __user *ubuf, mic_virtio_copy_to_user() argument
79 struct mic_device *mdev = mvdev->mdev; mic_virtio_copy_to_user()
81 struct mic_vringh *mvr = &mvdev->mvr[vr_idx]; mic_virtio_copy_to_user()
107 mvdev->in_bytes_dma += partlen; mic_virtio_copy_to_user()
108 mvdev->in_bytes += partlen; mic_virtio_copy_to_user()
114 dev_err(mic_dev(mvdev), "%s %d err %d\n", __func__, __LINE__, err); mic_virtio_copy_to_user()
124 static int mic_virtio_copy_from_user(struct mic_vdev *mvdev, void __user *ubuf, mic_virtio_copy_from_user() argument
128 struct mic_device *mdev = mvdev->mdev; mic_virtio_copy_from_user()
130 struct mic_vringh *mvr = &mvdev->mvr[vr_idx]; mic_virtio_copy_from_user()
136 mvdev->tx_dst_unaligned += len; mic_virtio_copy_from_user()
139 mvdev->tx_len_unaligned += len; mic_virtio_copy_from_user()
157 mvdev->out_bytes_dma += partlen; mic_virtio_copy_from_user()
158 mvdev->out_bytes += partlen; mic_virtio_copy_from_user()
170 mvdev->out_bytes += len; mic_virtio_copy_from_user()
173 dev_err(mic_dev(mvdev), "%s %d err %d\n", __func__, __LINE__, err); mic_virtio_copy_from_user()
183 struct mic_vdev *mvdev = mvrh->mvdev; mic_notify() local
184 s8 db = mvdev->dc->h2c_vdev_db; mic_notify()
187 mvdev->mdev->ops->send_intr(mvdev->mdev, db); mic_notify()
208 static int mic_vringh_copy(struct mic_vdev *mvdev, struct vringh_kiov *iov, mic_vringh_copy() argument
218 ret = mic_virtio_copy_to_user(mvdev, ubuf, partlen, mic_vringh_copy()
223 ret = mic_virtio_copy_from_user(mvdev, ubuf, partlen, mic_vringh_copy()
228 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_vringh_copy()
255 static int _mic_virtio_copy(struct mic_vdev *mvdev, _mic_virtio_copy() argument
263 struct mic_vringh *mvr = &mvdev->mvr[copy->vr_idx]; _mic_virtio_copy()
286 dev_err(mic_dev(mvdev), "%s %d err %d\n", _mic_virtio_copy()
294 ret = mic_vringh_copy(mvdev, riov, ubuf, len, MIC_VRINGH_READ, _mic_virtio_copy()
297 dev_err(mic_dev(mvdev), "%s %d err %d\n", _mic_virtio_copy()
305 ret = mic_vringh_copy(mvdev, wiov, ubuf, len, !MIC_VRINGH_READ, _mic_virtio_copy()
308 dev_err(mic_dev(mvdev), "%s %d err %d\n", _mic_virtio_copy()
346 static inline int mic_verify_copy_args(struct mic_vdev *mvdev, mic_verify_copy_args() argument
349 if (copy->vr_idx >= mvdev->dd->num_vq) { mic_verify_copy_args()
350 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_verify_copy_args()
358 int mic_virtio_copy_desc(struct mic_vdev *mvdev, mic_virtio_copy_desc() argument
362 struct mic_vringh *mvr = &mvdev->mvr[copy->vr_idx]; mic_virtio_copy_desc()
364 err = mic_verify_copy_args(mvdev, copy); mic_virtio_copy_desc()
369 if (!mic_vdevup(mvdev)) { mic_virtio_copy_desc()
371 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_virtio_copy_desc()
375 err = _mic_virtio_copy(mvdev, copy); mic_virtio_copy_desc()
377 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_virtio_copy_desc()
385 static void mic_virtio_init_post(struct mic_vdev *mvdev) mic_virtio_init_post() argument
387 struct mic_vqconfig *vqconfig = mic_vq_config(mvdev->dd); mic_virtio_init_post()
390 for (i = 0; i < mvdev->dd->num_vq; i++) { mic_virtio_init_post()
392 dev_warn(mic_dev(mvdev), "used_address zero??\n"); mic_virtio_init_post()
395 mvdev->mvr[i].vrh.vring.used = mic_virtio_init_post()
396 (void __force *)mvdev->mdev->aper.va + mic_virtio_init_post()
400 mvdev->dc->used_address_updated = 0; mic_virtio_init_post()
402 dev_dbg(mic_dev(mvdev), "%s: device type %d LINKUP\n", mic_virtio_init_post()
403 __func__, mvdev->virtio_id); mic_virtio_init_post()
406 static inline void mic_virtio_device_reset(struct mic_vdev *mvdev) mic_virtio_device_reset() argument
410 dev_dbg(mic_dev(mvdev), "%s: status %d device type %d RESET\n", mic_virtio_device_reset()
411 __func__, mvdev->dd->status, mvdev->virtio_id); mic_virtio_device_reset()
413 for (i = 0; i < mvdev->dd->num_vq; i++) mic_virtio_device_reset()
418 mutex_lock_nested(&mvdev->mvr[i].vr_mutex, i + 1); mic_virtio_device_reset()
421 mvdev->dd->status = 0; mic_virtio_device_reset()
422 mvdev->dc->vdev_reset = 0; mic_virtio_device_reset()
423 mvdev->dc->host_ack = 1; mic_virtio_device_reset()
425 for (i = 0; i < mvdev->dd->num_vq; i++) { mic_virtio_device_reset()
426 struct vringh *vrh = &mvdev->mvr[i].vrh; mic_virtio_device_reset()
427 mvdev->mvr[i].vring.info->avail_idx = 0; mic_virtio_device_reset()
433 for (i = 0; i < mvdev->dd->num_vq; i++) mic_virtio_device_reset()
434 mutex_unlock(&mvdev->mvr[i].vr_mutex); mic_virtio_device_reset()
440 struct mic_vdev *mvdev; mic_virtio_reset_devices() local
445 mvdev = list_entry(pos, struct mic_vdev, list); mic_virtio_reset_devices()
446 mic_virtio_device_reset(mvdev); mic_virtio_reset_devices()
447 mvdev->poll_wake = 1; mic_virtio_reset_devices()
448 wake_up(&mvdev->waitq); mic_virtio_reset_devices()
454 struct mic_vdev *mvdev = container_of(work, struct mic_vdev, mic_bh_handler() local
457 if (mvdev->dc->used_address_updated) mic_bh_handler()
458 mic_virtio_init_post(mvdev); mic_bh_handler()
460 if (mvdev->dc->vdev_reset) mic_bh_handler()
461 mic_virtio_device_reset(mvdev); mic_bh_handler()
463 mvdev->poll_wake = 1; mic_bh_handler()
464 wake_up(&mvdev->waitq); mic_bh_handler()
469 struct mic_vdev *mvdev = data; mic_virtio_intr_handler() local
470 struct mic_device *mdev = mvdev->mdev; mic_virtio_intr_handler()
473 schedule_work(&mvdev->virtio_bh_work); mic_virtio_intr_handler()
477 int mic_virtio_config_change(struct mic_vdev *mvdev, mic_virtio_config_change() argument
482 struct mic_bootparam *bootparam = mvdev->mdev->dp; mic_virtio_config_change()
485 mutex_lock(&mvdev->mdev->mic_mutex); mic_virtio_config_change()
486 for (i = 0; i < mvdev->dd->num_vq; i++) mic_virtio_config_change()
487 mutex_lock_nested(&mvdev->mvr[i].vr_mutex, i + 1); mic_virtio_config_change()
489 if (db == -1 || mvdev->dd->type == -1) { mic_virtio_config_change()
494 if (copy_from_user(mic_vq_configspace(mvdev->dd), mic_virtio_config_change()
495 argp, mvdev->dd->config_len)) { mic_virtio_config_change()
496 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_virtio_config_change()
501 mvdev->dc->config_change = MIC_VIRTIO_PARAM_CONFIG_CHANGED; mic_virtio_config_change()
502 mvdev->mdev->ops->send_intr(mvdev->mdev, db); mic_virtio_config_change()
506 mvdev->dc->guest_ack, msecs_to_jiffies(100)); mic_virtio_config_change()
511 dev_dbg(mic_dev(mvdev), mic_virtio_config_change()
513 mvdev->dc->config_change = 0; mic_virtio_config_change()
514 mvdev->dc->guest_ack = 0; mic_virtio_config_change()
516 for (i = 0; i < mvdev->dd->num_vq; i++) mic_virtio_config_change()
517 mutex_unlock(&mvdev->mvr[i].vr_mutex); mic_virtio_config_change()
518 mutex_unlock(&mvdev->mdev->mic_mutex); mic_virtio_config_change()
522 static int mic_copy_dp_entry(struct mic_vdev *mvdev, mic_copy_dp_entry() argument
527 struct mic_device *mdev = mvdev->mdev; mic_copy_dp_entry()
534 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_copy_dp_entry()
541 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_copy_dp_entry()
548 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_copy_dp_entry()
554 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_copy_dp_entry()
563 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_copy_dp_entry()
581 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_copy_dp_entry()
599 static void mic_init_device_ctrl(struct mic_vdev *mvdev, mic_init_device_ctrl() argument
613 mvdev->dc = dc; mic_init_device_ctrl()
616 int mic_virtio_add_device(struct mic_vdev *mvdev, mic_virtio_add_device() argument
619 struct mic_device *mdev = mvdev->mdev; mic_virtio_add_device()
632 ret = mic_copy_dp_entry(mvdev, argp, &type, &dd); mic_virtio_add_device()
638 mic_init_device_ctrl(mvdev, dd); mic_virtio_add_device()
640 mvdev->dd = dd; mic_virtio_add_device()
641 mvdev->virtio_id = type; mic_virtio_add_device()
643 INIT_WORK(&mvdev->virtio_bh_work, mic_bh_handler); mic_virtio_add_device()
646 struct mic_vringh *mvr = &mvdev->mvr[i]; mic_virtio_add_device()
647 struct mic_vring *vr = &mvdev->mvr[i].vring; mic_virtio_add_device()
657 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_virtio_add_device()
663 vr->info->magic = cpu_to_le32(MIC_MAGIC + mvdev->virtio_id + i); mic_virtio_add_device()
668 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_virtio_add_device()
676 *(u32 *)mic_vq_features(mvdev->dd), num, false, mic_virtio_add_device()
679 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_virtio_add_device()
686 mvr->mvdev = mvdev; mic_virtio_add_device()
693 mvr->buf_da = mic_map_single(mvdev->mdev, mvr->buf, mic_virtio_add_device()
698 mvdev->virtio_id); mic_virtio_add_device()
699 mvdev->virtio_db = mic_next_db(mdev); mic_virtio_add_device()
700 mvdev->virtio_cookie = mic_request_threaded_irq(mdev, mic_virtio_add_device()
702 NULL, irqname, mvdev, mic_virtio_add_device()
703 mvdev->virtio_db, MIC_INTR_DB); mic_virtio_add_device()
704 if (IS_ERR(mvdev->virtio_cookie)) { mic_virtio_add_device()
705 ret = PTR_ERR(mvdev->virtio_cookie); mic_virtio_add_device()
710 mvdev->dc->c2h_vdev_db = mvdev->virtio_db; mic_virtio_add_device()
712 list_add_tail(&mvdev->list, &mdev->vdev_list); mic_virtio_add_device()
732 struct mic_vringh *mvr = &mvdev->mvr[j]; mic_virtio_add_device()
742 void mic_virtio_del_device(struct mic_vdev *mvdev) mic_virtio_del_device() argument
746 struct mic_device *mdev = mvdev->mdev; mic_virtio_del_device()
758 "Requesting hot remove id %d\n", mvdev->virtio_id); mic_virtio_del_device()
759 mvdev->dc->config_change = MIC_VIRTIO_PARAM_DEV_REMOVE; mic_virtio_del_device()
763 mvdev->dc->guest_ack, msecs_to_jiffies(100)); mic_virtio_del_device()
769 mvdev->virtio_id, mvdev->dc->config_change, mic_virtio_del_device()
770 mvdev->dc->guest_ack, retry); mic_virtio_del_device()
771 mvdev->dc->config_change = 0; mic_virtio_del_device()
772 mvdev->dc->guest_ack = 0; mic_virtio_del_device()
774 mic_free_irq(mdev, mvdev->virtio_cookie, mvdev); mic_virtio_del_device()
775 flush_work(&mvdev->virtio_bh_work); mic_virtio_del_device()
776 vqconfig = mic_vq_config(mvdev->dd); mic_virtio_del_device()
777 for (i = 0; i < mvdev->dd->num_vq; i++) { mic_virtio_del_device()
778 struct mic_vringh *mvr = &mvdev->mvr[i]; mic_virtio_del_device()
780 mic_unmap_single(mvdev->mdev, mvr->buf_da, mic_virtio_del_device()
794 if (tmp_mvdev == mvdev) { mic_virtio_del_device()
798 mvdev->virtio_id); mic_virtio_del_device()
809 mvdev->dd->type = -1; mic_virtio_del_device()
H A Dmic_fops.c32 struct mic_vdev *mvdev; mic_open() local
36 mvdev = kzalloc(sizeof(*mvdev), GFP_KERNEL); mic_open()
37 if (!mvdev) mic_open()
40 init_waitqueue_head(&mvdev->waitq); mic_open()
41 INIT_LIST_HEAD(&mvdev->list); mic_open()
42 mvdev->mdev = mdev; mic_open()
43 mvdev->virtio_id = -1; mic_open()
45 f->private_data = mvdev; mic_open()
51 struct mic_vdev *mvdev = (struct mic_vdev *)f->private_data; mic_release() local
53 if (-1 != mvdev->virtio_id) mic_release()
54 mic_virtio_del_device(mvdev); mic_release()
56 kfree(mvdev); mic_release()
62 struct mic_vdev *mvdev = (struct mic_vdev *)f->private_data; mic_ioctl() local
69 ret = mic_virtio_add_device(mvdev, argp); mic_ioctl()
71 dev_err(mic_dev(mvdev), mic_ioctl()
82 ret = mic_vdev_inited(mvdev); mic_ioctl()
89 dev_dbg(mic_dev(mvdev), mic_ioctl()
94 ret = mic_virtio_copy_desc(mvdev, &copy); mic_ioctl()
96 dev_err(mic_dev(mvdev), mic_ioctl()
104 dev_err(mic_dev(mvdev), "%s %d errno ret %d\n", mic_ioctl()
112 ret = mic_vdev_inited(mvdev); mic_ioctl()
116 ret = mic_virtio_config_change(mvdev, argp); mic_ioctl()
118 dev_err(mic_dev(mvdev), mic_ioctl()
139 struct mic_vdev *mvdev = (struct mic_vdev *)f->private_data; mic_poll() local
142 poll_wait(f, &mvdev->waitq, wait); mic_poll()
144 if (mic_vdev_inited(mvdev)) { mic_poll()
146 } else if (mvdev->poll_wake) { mic_poll()
147 mvdev->poll_wake = 0; mic_poll()
155 mic_query_offset(struct mic_vdev *mvdev, unsigned long offset, mic_query_offset() argument
158 struct mic_device *mdev = mvdev->mdev; mic_query_offset()
176 for (i = 0; i < mvdev->dd->num_vq; i++) { mic_query_offset()
177 struct mic_vringh *mvr = &mvdev->mvr[i]; mic_query_offset()
194 struct mic_vdev *mvdev = (struct mic_vdev *)f->private_data; mic_mmap() local
199 err = mic_vdev_inited(mvdev); mic_mmap()
207 i = mic_query_offset(mvdev, offset, &size, &pa); mic_mmap()
214 dev_dbg(mic_dev(mvdev), mic_mmap()
216 __func__, __LINE__, mvdev->virtio_id, size, offset, mic_mmap()
H A Dmic_virtio.h53 * @mvdev: Back pointer to MIC virtio device for vringh_notify(..).
64 struct mic_vdev *mvdev; member in struct:mic_vringh
114 int mic_virtio_add_device(struct mic_vdev *mvdev,
116 void mic_virtio_del_device(struct mic_vdev *mvdev);
117 int mic_virtio_config_change(struct mic_vdev *mvdev,
119 int mic_virtio_copy_desc(struct mic_vdev *mvdev,
125 static inline struct device *mic_dev(struct mic_vdev *mvdev) mic_dev() argument
127 return &mvdev->mdev->pdev->dev; mic_dev()
131 static inline int mic_vdev_inited(struct mic_vdev *mvdev) mic_vdev_inited() argument
134 if (!mvdev->dd || !mvdev->dd->type) { mic_vdev_inited()
135 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_vdev_inited()
141 if (mvdev->dd->type == -1) { mic_vdev_inited()
142 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_vdev_inited()
151 static inline bool mic_vdevup(struct mic_vdev *mvdev) mic_vdevup() argument
153 return !!mvdev->dd->status; mic_vdevup()
H A Dmic_debugfs.c202 struct mic_vdev *mvdev; mic_vdev_info_show() local
207 mvdev = list_entry(pos, struct mic_vdev, list); mic_vdev_info_show()
209 mvdev->virtio_id, mic_vdev_info_show()
210 mic_vdevup(mvdev) ? "UP" : "DOWN", mic_vdev_info_show()
211 mvdev->in_bytes, mic_vdev_info_show()
212 mvdev->out_bytes); mic_vdev_info_show()
217 struct mic_vringh *mvr = &mvdev->mvr[i]; mic_vdev_info_show()
/linux-4.4.14/drivers/misc/mic/card/
H A Dmic_virtio.c65 static inline struct device *mic_dev(struct mic_vdev *mvdev) mic_dev() argument
67 return mvdev->vdev.dev.parent; mic_dev()
149 struct mic_vdev *mvdev = to_micvdev(vdev); mic_set_status() local
152 iowrite8(status, &mvdev->desc->status); mic_set_status()
153 mic_send_intr(mvdev->mdev, mvdev->c2h_vdev_db); mic_set_status()
159 struct mic_vdev *mvdev = to_micvdev(vdev); mic_reset_inform_host() local
160 struct mic_device_ctrl __iomem *dc = mvdev->dc; mic_reset_inform_host()
165 mic_send_intr(mvdev->mdev, mvdev->c2h_vdev_db); mic_reset_inform_host()
174 dev_dbg(mic_dev(mvdev), "%s: retry: %d\n", __func__, retry); mic_reset_inform_host()
177 iowrite8(0, &mvdev->desc->status); mic_reset_inform_host()
182 struct mic_vdev *mvdev = to_micvdev(vdev); mic_reset() local
184 dev_dbg(mic_dev(mvdev), "%s: virtio id %d\n", mic_reset()
188 complete_all(&mvdev->reset_done); mic_reset()
196 struct mic_vdev *mvdev = vq->priv; mic_notify() local
198 mic_send_intr(mvdev->mdev, mvdev->c2h_vdev_db); mic_notify()
204 struct mic_vdev *mvdev = to_micvdev(vq->vdev); mic_del_vq() local
207 free_pages((unsigned long) vr->used, get_order(mvdev->used_size[n])); mic_del_vq()
209 mic_card_unmap(mvdev->mdev, mvdev->vr[n]); mic_del_vq()
210 mvdev->vr[n] = NULL; mic_del_vq()
215 struct mic_vdev *mvdev = to_micvdev(vdev); mic_del_vqs() local
219 dev_dbg(mic_dev(mvdev), "%s\n", __func__); mic_del_vqs()
235 struct mic_vdev *mvdev = to_micvdev(vdev); mic_find_vq() local
244 u8 type = ioread8(&mvdev->desc->type); mic_find_vq()
246 if (index >= ioread8(&mvdev->desc->num_vq)) mic_find_vq()
253 vqconfig = mic_vq_config(mvdev->desc) + index; mic_find_vq()
257 va = mic_card_map(mvdev->mdev, le64_to_cpu(config.address), vr_size); mic_find_vq()
260 mvdev->vr[index] = va; mic_find_vq()
279 mvdev->used_size[index] = PAGE_ALIGN(sizeof(__u16) * 3 + mic_find_vq()
283 get_order(mvdev->used_size[index])); mic_find_vq()
286 dev_err(mic_dev(mvdev), "%s %d err %d\n", mic_find_vq()
302 vq->priv = mvdev; mic_find_vq()
307 mic_card_unmap(mvdev->mdev, mvdev->vr[index]); mic_find_vq()
316 struct mic_vdev *mvdev = to_micvdev(vdev); mic_find_vqs() local
317 struct mic_device_ctrl __iomem *dc = mvdev->dc; mic_find_vqs()
321 if (nvqs > ioread8(&mvdev->desc->num_vq)) mic_find_vqs()
325 dev_dbg(mic_dev(mvdev), "%s: %d: %s\n", mic_find_vqs()
339 mic_send_intr(mvdev->mdev, mvdev->c2h_vdev_db); mic_find_vqs()
346 dev_dbg(mic_dev(mvdev), "%s: retry: %d\n", __func__, retry); mic_find_vqs()
376 struct mic_vdev *mvdev = data; mic_virtio_intr_handler() local
379 mic_ack_interrupt(mvdev->mdev); mic_virtio_intr_handler()
380 list_for_each_entry(vq, &mvdev->vdev.vqs, list) mic_virtio_intr_handler()
401 struct mic_vdev *mvdev; mic_add_device() local
406 mvdev = kzalloc(sizeof(*mvdev), GFP_KERNEL); mic_add_device()
407 if (!mvdev) { mic_add_device()
413 mvdev->mdev = &mdrv->mdev; mic_add_device()
414 mvdev->vdev.dev.parent = mdrv->dev; mic_add_device()
415 mvdev->vdev.dev.release = mic_virtio_release_dev; mic_add_device()
416 mvdev->vdev.id.device = type; mic_add_device()
417 mvdev->vdev.config = &mic_vq_config_ops; mic_add_device()
418 mvdev->desc = d; mic_add_device()
419 mvdev->dc = (void __iomem *)d + mic_aligned_desc_size(d); mic_add_device()
420 init_completion(&mvdev->reset_done); mic_add_device()
423 mvdev->virtio_cookie = mic_request_card_irq(mic_virtio_intr_handler, mic_add_device()
424 NULL, "virtio intr", mvdev, virtio_db); mic_add_device()
425 if (IS_ERR(mvdev->virtio_cookie)) { mic_add_device()
426 ret = PTR_ERR(mvdev->virtio_cookie); mic_add_device()
429 iowrite8((u8)virtio_db, &mvdev->dc->h2c_vdev_db); mic_add_device()
430 mvdev->c2h_vdev_db = ioread8(&mvdev->dc->c2h_vdev_db); mic_add_device()
432 ret = register_virtio_device(&mvdev->vdev); mic_add_device()
434 dev_err(mic_dev(mvdev), mic_add_device()
439 iowrite64((u64)mvdev, &mvdev->dc->vdev); mic_add_device()
440 dev_dbg(mic_dev(mvdev), "%s: registered mic device %u type %u mvdev %p\n", mic_add_device()
441 __func__, offset, type, mvdev); mic_add_device() local
446 mic_free_card_irq(mvdev->virtio_cookie, mvdev); mic_add_device()
448 kfree(mvdev); mic_add_device()
458 struct mic_vdev *mvdev = to_micvdev(vdev); mic_match_desc() local
460 return mvdev->desc == (void __iomem *)data; mic_match_desc()
468 struct mic_vdev *mvdev = (struct mic_vdev *)ioread64(&dc->vdev); mic_handle_config_change() local
474 virtio_config_changed(&mvdev->vdev); mic_handle_config_change()
487 struct mic_vdev *mvdev = (struct mic_vdev *)ioread64(&dc->vdev); mic_remove_device() local
493 "%s %d config_change %d type %d mvdev %p\n", mic_remove_device()
495 ioread8(&dc->config_change), ioread8(&d->type), mvdev); mic_remove_device()
498 reinit_completion(&mvdev->reset_done); mic_remove_device()
499 unregister_virtio_device(&mvdev->vdev); mic_remove_device()
500 mic_free_card_irq(mvdev->virtio_cookie, mvdev); mic_remove_device()
502 wait_for_completion(&mvdev->reset_done); mic_remove_device()
503 kfree(mvdev); mic_remove_device()

Completed in 135 milliseconds