Lines Matching refs:vcdev
281 static void virtio_ccw_drop_indicators(struct virtio_ccw_device *vcdev) in virtio_ccw_drop_indicators() argument
285 list_for_each_entry(info, &vcdev->virtqueues, node) in virtio_ccw_drop_indicators()
286 drop_airq_indicator(info->vq, vcdev->airq_info); in virtio_ccw_drop_indicators()
289 static int doing_io(struct virtio_ccw_device *vcdev, __u32 flag) in doing_io() argument
294 spin_lock_irqsave(get_ccwdev_lock(vcdev->cdev), flags); in doing_io()
295 if (vcdev->err) in doing_io()
298 ret = vcdev->curr_io & flag; in doing_io()
299 spin_unlock_irqrestore(get_ccwdev_lock(vcdev->cdev), flags); in doing_io()
303 static int ccw_io_helper(struct virtio_ccw_device *vcdev, in ccw_io_helper() argument
311 spin_lock_irqsave(get_ccwdev_lock(vcdev->cdev), flags); in ccw_io_helper()
312 ret = ccw_device_start(vcdev->cdev, ccw, intparm, 0, 0); in ccw_io_helper()
314 if (!vcdev->curr_io) in ccw_io_helper()
315 vcdev->err = 0; in ccw_io_helper()
316 vcdev->curr_io |= flag; in ccw_io_helper()
318 spin_unlock_irqrestore(get_ccwdev_lock(vcdev->cdev), flags); in ccw_io_helper()
321 wait_event(vcdev->wait_q, doing_io(vcdev, flag) == 0); in ccw_io_helper()
322 return ret ? ret : vcdev->err; in ccw_io_helper()
325 static void virtio_ccw_drop_indicator(struct virtio_ccw_device *vcdev, in virtio_ccw_drop_indicator() argument
331 struct airq_info *airq_info = vcdev->airq_info; in virtio_ccw_drop_indicator()
333 if (vcdev->is_thinint) { in virtio_ccw_drop_indicator()
345 indicatorp = kmalloc(sizeof(&vcdev->indicators), in virtio_ccw_drop_indicator()
351 ccw->count = sizeof(vcdev->indicators); in virtio_ccw_drop_indicator()
355 vcdev->indicators = 0; in virtio_ccw_drop_indicator()
357 ret = ccw_io_helper(vcdev, ccw, in virtio_ccw_drop_indicator()
358 vcdev->is_thinint ? in virtio_ccw_drop_indicator()
362 dev_info(&vcdev->cdev->dev, in virtio_ccw_drop_indicator()
364 else if (vcdev->is_thinint) in virtio_ccw_drop_indicator()
365 virtio_ccw_drop_indicators(vcdev); in virtio_ccw_drop_indicator()
398 struct virtio_ccw_device *vcdev; in virtio_ccw_kvm_notify() local
401 vcdev = to_vc_device(info->vq->vdev); in virtio_ccw_kvm_notify()
402 ccw_device_get_schid(vcdev->cdev, &schid); in virtio_ccw_kvm_notify()
409 static int virtio_ccw_read_vq_conf(struct virtio_ccw_device *vcdev, in virtio_ccw_read_vq_conf() argument
414 vcdev->config_block->index = index; in virtio_ccw_read_vq_conf()
418 ccw->cda = (__u32)(unsigned long)(vcdev->config_block); in virtio_ccw_read_vq_conf()
419 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_READ_VQ_CONF); in virtio_ccw_read_vq_conf()
422 return vcdev->config_block->num; in virtio_ccw_read_vq_conf()
427 struct virtio_ccw_device *vcdev = to_vc_device(vq->vdev); in virtio_ccw_del_vq() local
435 spin_lock_irqsave(&vcdev->lock, flags); in virtio_ccw_del_vq()
437 spin_unlock_irqrestore(&vcdev->lock, flags); in virtio_ccw_del_vq()
440 if (vcdev->revision == 0) { in virtio_ccw_del_vq()
457 ret = ccw_io_helper(vcdev, ccw, in virtio_ccw_del_vq()
478 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_del_vqs() local
484 virtio_ccw_drop_indicator(vcdev, ccw); in virtio_ccw_del_vqs()
497 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_setup_vq() local
507 dev_warn(&vcdev->cdev->dev, "no info\n"); in virtio_ccw_setup_vq()
514 dev_warn(&vcdev->cdev->dev, "no info block\n"); in virtio_ccw_setup_vq()
518 info->num = virtio_ccw_read_vq_conf(vcdev, ccw, i); in virtio_ccw_setup_vq()
526 dev_warn(&vcdev->cdev->dev, "no queue\n"); in virtio_ccw_setup_vq()
536 dev_warn(&vcdev->cdev->dev, "no vq\n"); in virtio_ccw_setup_vq()
542 if (vcdev->revision == 0) { in virtio_ccw_setup_vq()
559 err = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_VQ | i); in virtio_ccw_setup_vq()
561 dev_warn(&vcdev->cdev->dev, "SET_VQ failed\n"); in virtio_ccw_setup_vq()
569 spin_lock_irqsave(&vcdev->lock, flags); in virtio_ccw_setup_vq()
570 list_add(&info->node, &vcdev->virtqueues); in virtio_ccw_setup_vq()
571 spin_unlock_irqrestore(&vcdev->lock, flags); in virtio_ccw_setup_vq()
587 static int virtio_ccw_register_adapter_ind(struct virtio_ccw_device *vcdev, in virtio_ccw_register_adapter_ind() argument
603 &vcdev->airq_info); in virtio_ccw_register_adapter_ind()
608 info = vcdev->airq_info; in virtio_ccw_register_adapter_ind()
616 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_IND_ADAPTER); in virtio_ccw_register_adapter_ind()
626 dev_warn(&vcdev->cdev->dev, in virtio_ccw_register_adapter_ind()
628 virtio_ccw_drop_indicators(vcdev); in virtio_ccw_register_adapter_ind()
640 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_find_vqs() local
660 indicatorp = kmalloc(sizeof(&vcdev->indicators), GFP_DMA | GFP_KERNEL); in virtio_ccw_find_vqs()
663 *indicatorp = (unsigned long) &vcdev->indicators; in virtio_ccw_find_vqs()
664 if (vcdev->is_thinint) { in virtio_ccw_find_vqs()
665 ret = virtio_ccw_register_adapter_ind(vcdev, vqs, nvqs, ccw); in virtio_ccw_find_vqs()
668 vcdev->is_thinint = 0; in virtio_ccw_find_vqs()
670 if (!vcdev->is_thinint) { in virtio_ccw_find_vqs()
672 vcdev->indicators = 0; in virtio_ccw_find_vqs()
675 ccw->count = sizeof(vcdev->indicators); in virtio_ccw_find_vqs()
677 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_IND); in virtio_ccw_find_vqs()
682 *indicatorp = (unsigned long) &vcdev->indicators2; in virtio_ccw_find_vqs()
683 vcdev->indicators2 = 0; in virtio_ccw_find_vqs()
686 ccw->count = sizeof(vcdev->indicators2); in virtio_ccw_find_vqs()
688 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_SET_CONF_IND); in virtio_ccw_find_vqs()
704 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_reset() local
712 *vcdev->status = 0; in virtio_ccw_reset()
719 ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_RESET); in virtio_ccw_reset()
725 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_get_features() local
746 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_READ_FEAT); in virtio_ccw_get_features()
754 if (vcdev->revision == 0) in virtio_ccw_get_features()
763 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_READ_FEAT); in virtio_ccw_get_features()
775 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_finalize_features() local
780 if (vcdev->revision >= 1 && in virtio_ccw_finalize_features()
806 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_WRITE_FEAT); in virtio_ccw_finalize_features()
810 if (vcdev->revision == 0) in virtio_ccw_finalize_features()
820 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_WRITE_FEAT); in virtio_ccw_finalize_features()
832 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_get_config() local
850 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_READ_CONFIG); in virtio_ccw_get_config()
854 memcpy(vcdev->config, config_area, offset + len); in virtio_ccw_get_config()
856 memcpy(buf, &vcdev->config[offset], len); in virtio_ccw_get_config()
857 if (vcdev->config_ready < offset + len) in virtio_ccw_get_config()
858 vcdev->config_ready = offset + len; in virtio_ccw_get_config()
869 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_set_config() local
882 if (vcdev->config_ready < offset) in virtio_ccw_set_config()
884 memcpy(&vcdev->config[offset], buf, len); in virtio_ccw_set_config()
886 memcpy(config_area, vcdev->config, sizeof(vcdev->config)); in virtio_ccw_set_config()
891 ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_WRITE_CONFIG); in virtio_ccw_set_config()
900 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_get_status() local
902 return *vcdev->status; in virtio_ccw_get_status()
907 struct virtio_ccw_device *vcdev = to_vc_device(vdev); in virtio_ccw_set_status() local
908 u8 old_status = *vcdev->status; in virtio_ccw_set_status()
917 *vcdev->status = status; in virtio_ccw_set_status()
921 ccw->cda = (__u32)(unsigned long)vcdev->status; in virtio_ccw_set_status()
922 ret = ccw_io_helper(vcdev, ccw, VIRTIO_CCW_DOING_WRITE_STATUS); in virtio_ccw_set_status()
925 *vcdev->status = old_status; in virtio_ccw_set_status()
950 struct virtio_ccw_device *vcdev = to_vc_device(dev); in virtio_ccw_release_dev() local
952 kfree(vcdev->status); in virtio_ccw_release_dev()
953 kfree(vcdev->config_block); in virtio_ccw_release_dev()
954 kfree(vcdev); in virtio_ccw_release_dev()
968 static struct virtqueue *virtio_ccw_vq_by_ind(struct virtio_ccw_device *vcdev, in virtio_ccw_vq_by_ind() argument
976 spin_lock_irqsave(&vcdev->lock, flags); in virtio_ccw_vq_by_ind()
977 list_for_each_entry(info, &vcdev->virtqueues, node) { in virtio_ccw_vq_by_ind()
983 spin_unlock_irqrestore(&vcdev->lock, flags); in virtio_ccw_vq_by_ind()
987 static void virtio_ccw_check_activity(struct virtio_ccw_device *vcdev, in virtio_ccw_check_activity() argument
990 if (vcdev->curr_io & activity) { in virtio_ccw_check_activity()
1004 vcdev->curr_io &= ~activity; in virtio_ccw_check_activity()
1005 wake_up(&vcdev->wait_q); in virtio_ccw_check_activity()
1009 dev_warn(&vcdev->cdev->dev, in virtio_ccw_check_activity()
1022 struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev); in virtio_ccw_int_handler() local
1026 if (!vcdev) in virtio_ccw_int_handler()
1029 vcdev->err = PTR_ERR(irb); in virtio_ccw_int_handler()
1030 virtio_ccw_check_activity(vcdev, activity); in virtio_ccw_int_handler()
1044 vcdev->err = -EOPNOTSUPP; in virtio_ccw_int_handler()
1047 vcdev->err = -EIO; in virtio_ccw_int_handler()
1049 virtio_ccw_check_activity(vcdev, activity); in virtio_ccw_int_handler()
1050 for_each_set_bit(i, &vcdev->indicators, in virtio_ccw_int_handler()
1051 sizeof(vcdev->indicators) * BITS_PER_BYTE) { in virtio_ccw_int_handler()
1053 clear_bit(i, &vcdev->indicators); in virtio_ccw_int_handler()
1055 vq = virtio_ccw_vq_by_ind(vcdev, i); in virtio_ccw_int_handler()
1058 if (test_bit(0, &vcdev->indicators2)) { in virtio_ccw_int_handler()
1059 virtio_config_changed(&vcdev->vdev); in virtio_ccw_int_handler()
1060 clear_bit(0, &vcdev->indicators2); in virtio_ccw_int_handler()
1109 struct virtio_ccw_device *vcdev; in virtio_grab_drvdata() local
1112 vcdev = dev_get_drvdata(&cdev->dev); in virtio_grab_drvdata()
1113 if (!vcdev || vcdev->going_away) { in virtio_grab_drvdata()
1117 vcdev->going_away = true; in virtio_grab_drvdata()
1119 return vcdev; in virtio_grab_drvdata()
1125 struct virtio_ccw_device *vcdev = virtio_grab_drvdata(cdev); in virtio_ccw_remove() local
1127 if (vcdev && cdev->online) { in virtio_ccw_remove()
1128 if (vcdev->device_lost) in virtio_ccw_remove()
1129 virtio_break_device(&vcdev->vdev); in virtio_ccw_remove()
1130 unregister_virtio_device(&vcdev->vdev); in virtio_ccw_remove()
1141 struct virtio_ccw_device *vcdev = virtio_grab_drvdata(cdev); in virtio_ccw_offline() local
1143 if (!vcdev) in virtio_ccw_offline()
1145 if (vcdev->device_lost) in virtio_ccw_offline()
1146 virtio_break_device(&vcdev->vdev); in virtio_ccw_offline()
1147 unregister_virtio_device(&vcdev->vdev); in virtio_ccw_offline()
1154 static int virtio_ccw_set_transport_rev(struct virtio_ccw_device *vcdev) in virtio_ccw_set_transport_rev() argument
1175 vcdev->revision = VIRTIO_CCW_REV_MAX; in virtio_ccw_set_transport_rev()
1177 rev->revision = vcdev->revision; in virtio_ccw_set_transport_rev()
1180 ret = ccw_io_helper(vcdev, ccw, in virtio_ccw_set_transport_rev()
1183 if (vcdev->revision == 0) in virtio_ccw_set_transport_rev()
1191 vcdev->revision--; in virtio_ccw_set_transport_rev()
1203 struct virtio_ccw_device *vcdev; in virtio_ccw_online() local
1206 vcdev = kzalloc(sizeof(*vcdev), GFP_KERNEL); in virtio_ccw_online()
1207 if (!vcdev) { in virtio_ccw_online()
1212 vcdev->config_block = kzalloc(sizeof(*vcdev->config_block), in virtio_ccw_online()
1214 if (!vcdev->config_block) { in virtio_ccw_online()
1218 vcdev->status = kzalloc(sizeof(*vcdev->status), GFP_DMA | GFP_KERNEL); in virtio_ccw_online()
1219 if (!vcdev->status) { in virtio_ccw_online()
1224 vcdev->is_thinint = virtio_ccw_use_airq; /* at least try */ in virtio_ccw_online()
1226 vcdev->vdev.dev.parent = &cdev->dev; in virtio_ccw_online()
1227 vcdev->vdev.dev.release = virtio_ccw_release_dev; in virtio_ccw_online()
1228 vcdev->vdev.config = &virtio_ccw_config_ops; in virtio_ccw_online()
1229 vcdev->cdev = cdev; in virtio_ccw_online()
1230 init_waitqueue_head(&vcdev->wait_q); in virtio_ccw_online()
1231 INIT_LIST_HEAD(&vcdev->virtqueues); in virtio_ccw_online()
1232 spin_lock_init(&vcdev->lock); in virtio_ccw_online()
1235 dev_set_drvdata(&cdev->dev, vcdev); in virtio_ccw_online()
1237 vcdev->vdev.id.vendor = cdev->id.cu_type; in virtio_ccw_online()
1238 vcdev->vdev.id.device = cdev->id.cu_model; in virtio_ccw_online()
1240 ret = virtio_ccw_set_transport_rev(vcdev); in virtio_ccw_online()
1244 ret = register_virtio_device(&vcdev->vdev); in virtio_ccw_online()
1255 put_device(&vcdev->vdev.dev); in virtio_ccw_online()
1258 if (vcdev) { in virtio_ccw_online()
1259 kfree(vcdev->status); in virtio_ccw_online()
1260 kfree(vcdev->config_block); in virtio_ccw_online()
1262 kfree(vcdev); in virtio_ccw_online()
1269 struct virtio_ccw_device *vcdev = dev_get_drvdata(&cdev->dev); in virtio_ccw_cio_notify() local
1275 if (!vcdev) in virtio_ccw_cio_notify()
1280 vcdev->device_lost = true; in virtio_ccw_cio_notify()