/linux-4.4.14/drivers/misc/mic/host/ |
H A D | mic_virtio.c | 75 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 D | mic_fops.c | 32 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, ©); 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 D | mic_virtio.h | 53 * @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 D | mic_debugfs.c | 202 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 D | mic_virtio.c | 65 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()
|