• Home
  • Raw
  • Download

Lines Matching +full:de +full:- +full:serialized

1 // SPDX-License-Identifier: GPL-2.0
8 * Michael Holzheu <holzheu@de.ibm.com>
9 * Frank Munzert <munzert@de.ibm.com>
38 * is used to read spool data page-wise.
89 * (cdev) using the urd->cdev pointer. Each ccw device has a reference to the
90 * ur device using dev_get_drvdata(&cdev->dev) pointer.
93 * - ur_probe gets a urd reference, ur_remove drops the reference
94 * dev_get_drvdata(&cdev->dev)
95 * - ur_open gets a urd reference, ur_release drops the reference
96 * (urf->urd)
99 * - urdev_alloc get a cdev reference (urd->cdev)
100 * - urdev_free drops the cdev reference (urd->cdev)
102 * Setting and clearing of dev_get_drvdata(&cdev->dev) is protected by the ccwdev lock
111 urd->reclen = cdev->id.driver_info; in urdev_alloc()
112 ccw_device_get_id(cdev, &urd->dev_id); in urdev_alloc()
113 mutex_init(&urd->io_mutex); in urdev_alloc()
114 init_waitqueue_head(&urd->wait); in urdev_alloc()
115 INIT_WORK(&urd->uevent_work, ur_uevent); in urdev_alloc()
116 spin_lock_init(&urd->open_lock); in urdev_alloc()
117 refcount_set(&urd->ref_count, 1); in urdev_alloc()
118 urd->cdev = cdev; in urdev_alloc()
119 get_device(&cdev->dev); in urdev_alloc()
126 if (urd->cdev) in urdev_free()
127 put_device(&urd->cdev->dev); in urdev_free()
133 refcount_inc(&urd->ref_count); in urdev_get()
142 urd = dev_get_drvdata(&cdev->dev); in urdev_get_from_cdev()
160 put_device(&cdev->dev); in urdev_get_from_devno()
166 if (refcount_dec_and_test(&urd->ref_count)) in urdev_put()
171 * Low-level functions to do I/O to a ur device.
181 * on a completion event it publishes at urd->io_done. The function
197 while (ptr->cda) { in free_chan_prog()
198 kfree((void *)(addr_t) ptr->cda); in free_chan_prog()
207 * with a final NOP CCW command-chained on (which ensures that CE and DE
222 * We chain a NOP onto the writes to force CE+DE together. in alloc_chan_prog()
229 return ERR_PTR(-ENOMEM); in alloc_chan_prog()
238 return ERR_PTR(-ENOMEM); in alloc_chan_prog()
243 return ERR_PTR(-EFAULT); in alloc_chan_prog()
247 /* The following NOP CCW forces CE+DE to be presented together */ in alloc_chan_prog()
255 struct ccw_device *cdev = urd->cdev; in do_ur_io()
260 rc = mutex_lock_interruptible(&urd->io_mutex); in do_ur_io()
264 urd->io_done = &event; in do_ur_io()
279 mutex_unlock(&urd->io_mutex); in do_ur_io()
287 "EVENT=unsol_de", /* Unsolicited device-end interrupt */ in ur_uevent()
291 kobject_uevent_env(&urd->cdev->dev.kobj, KOBJ_CHANGE, envp); in ur_uevent()
305 intparm, irb->scsw.cmd.cstat, irb->scsw.cmd.dstat, in ur_int_handler()
306 irb->scsw.cmd.count); in ur_int_handler()
308 urd = dev_get_drvdata(&cdev->dev); in ur_int_handler()
312 if (scsw_dstat(&irb->scsw) & DEV_STAT_DEV_END) { in ur_int_handler()
315 * device-ready state. in ur_int_handler()
318 schedule_work(&urd->uevent_work); in ur_int_handler()
325 urd->io_request_rc = PTR_ERR(irb); in ur_int_handler()
326 else if (irb->scsw.cmd.dstat == (DEV_STAT_CHN_END | DEV_STAT_DEV_END)) in ur_int_handler()
327 urd->io_request_rc = 0; in ur_int_handler()
329 urd->io_request_rc = -EIO; in ur_int_handler()
331 complete(urd->io_done); in ur_int_handler()
335 * reclen sysfs attribute - The record length to be used for write CCWs
345 return -ENODEV; in ur_attr_reclen_show()
346 rc = sprintf(buf, "%zu\n", urd->reclen); in ur_attr_reclen_show()
364 * diagnose code 0x210 - retrieve device information
375 ur_diag210.vrdcdvno = urd->dev_id.devno; in get_urd_class()
381 return -EOPNOTSUPP; in get_urd_class()
385 return -ENODEV; in get_urd_class()
387 return -EIO; in get_urd_class()
401 urf->urd = urd; in urfile_alloc()
404 urf->dev_reclen); in urfile_alloc()
411 TRACE("urfile_free: urf=%p urd=%p\n", urf, urf->urd); in urfile_free()
432 if (urd->io_request_rc) { in do_write()
433 rc = urd->io_request_rc; in do_write()
447 struct urfile *urf = file->private_data; in ur_write()
454 if (count % urf->dev_reclen) in ur_write()
455 return -EINVAL; /* count must be a multiple of reclen */ in ur_write()
457 if (count > urf->dev_reclen * MAX_RECS_PER_IO) in ur_write()
458 count = urf->dev_reclen * MAX_RECS_PER_IO; in ur_write()
460 return do_write(urf->urd, udata, count, urf->dev_reclen, ppos); in ur_write()
464 * diagnose code 0x14 subcode 0x0028 - position spool file to designated
479 return -ENOMEDIUM; in diag_position_to_record()
481 return -ENODATA; /* position beyond end of file */ in diag_position_to_record()
483 return -EIO; in diag_position_to_record()
488 * diagnose code 0x14 subcode 0x0000 - read next spool file buffer
504 return -ENODATA; in diag_read_file()
506 return -ENOMEDIUM; in diag_read_file()
508 return -EIO; in diag_read_file()
521 urd = ((struct urfile *) file->private_data)->urd; in diag14_read()
522 reclen = ((struct urfile *) file->private_data)->file_reclen; in diag14_read()
524 rc = diag_position_to_record(urd->dev_id.devno, *offs / PAGE_SIZE + 1); in diag14_read()
525 if (rc == -ENODATA) in diag14_read()
533 return -ENOMEM; in diag14_read()
538 rc = diag_read_file(urd->dev_id.devno, buf); in diag14_read()
539 if (rc == -ENODATA) { in diag14_read()
546 len = min(count - copied, PAGE_SIZE - res); in diag14_read()
548 rc = -EFAULT; in diag14_read()
573 urd = ((struct urfile *) file->private_data)->urd; in ur_read()
574 rc = mutex_lock_interruptible(&urd->io_mutex); in ur_read()
578 mutex_unlock(&urd->io_mutex); in ur_read()
583 * diagnose code 0x14 subcode 0x0fff - retrieve next file descriptor
597 return -ENODATA; in diag_read_next_file_info()
609 return -ENOMEM; in verify_uri_device()
617 if (fcb->file_stat & (FLG_SYSTEM_HOLD | FLG_USER_HOLD)) { in verify_uri_device()
618 rc = -EPERM; in verify_uri_device()
625 rc = -ENOMEM; in verify_uri_device()
628 rc = diag_read_file(urd->dev_id.devno, buf); in verify_uri_device()
629 if ((rc != 0) && (rc != -ENODATA)) /* EOF does not hurt */ in verify_uri_device()
636 if (!(fcb->file_stat & FLG_IN_USE)) { in verify_uri_device()
637 rc = -EMFILE; in verify_uri_device()
651 switch (urd->class) { in verify_device()
657 return -EOPNOTSUPP; in verify_device()
668 return -ENOMEM; in get_uri_file_reclen()
672 if (fcb->file_stat & FLG_CP_DUMP) in get_uri_file_reclen()
675 rc = fcb->rec_len; in get_uri_file_reclen()
684 switch (urd->class) { in get_file_reclen()
690 return -EOPNOTSUPP; in get_file_reclen()
702 accmode = file->f_flags & O_ACCMODE; in ur_open()
705 return -EACCES; in ur_open()
714 rc = -ENXIO; in ur_open()
718 spin_lock(&urd->open_lock); in ur_open()
719 while (urd->open_flag) { in ur_open()
720 spin_unlock(&urd->open_lock); in ur_open()
721 if (file->f_flags & O_NONBLOCK) { in ur_open()
722 rc = -EBUSY; in ur_open()
725 if (wait_event_interruptible(urd->wait, urd->open_flag == 0)) { in ur_open()
726 rc = -ERESTARTSYS; in ur_open()
729 spin_lock(&urd->open_lock); in ur_open()
731 urd->open_flag++; in ur_open()
732 spin_unlock(&urd->open_lock); in ur_open()
736 if (((accmode == O_RDONLY) && (urd->class != DEV_CLASS_UR_I)) || in ur_open()
737 ((accmode == O_WRONLY) && (urd->class != DEV_CLASS_UR_O))) { in ur_open()
738 TRACE("ur_open: unsupported dev class (%d)\n", urd->class); in ur_open()
739 rc = -EACCES; in ur_open()
749 rc = -ENOMEM; in ur_open()
753 urf->dev_reclen = urd->reclen; in ur_open()
757 urf->file_reclen = rc; in ur_open()
758 file->private_data = urf; in ur_open()
764 spin_lock(&urd->open_lock); in ur_open()
765 urd->open_flag--; in ur_open()
766 spin_unlock(&urd->open_lock); in ur_open()
775 struct urfile *urf = file->private_data; in ur_release()
778 spin_lock(&urf->urd->open_lock); in ur_release()
779 urf->urd->open_flag--; in ur_release()
780 spin_unlock(&urf->urd->open_lock); in ur_release()
781 wake_up_interruptible(&urf->urd->wait); in ur_release()
782 urdev_put(urf->urd); in ur_release()
789 if ((file->f_flags & O_ACCMODE) != O_RDONLY) in ur_llseek()
790 return -ESPIPE; /* seek allowed only for reader */ in ur_llseek()
792 return -ESPIPE; /* only multiples of 4K allowed */ in ur_llseek()
813 * ur_probe, ur_remove, ur_set_online and ur_set_offline are serialized
816 * urd->char_device is used as indication that the online function has
829 rc = -ENOMEM; in ur_probe()
833 rc = ur_create_attributes(&cdev->dev); in ur_probe()
835 rc = -ENOMEM; in ur_probe()
840 urd->class = get_urd_class(urd); in ur_probe()
841 if (urd->class < 0) { in ur_probe()
842 rc = urd->class; in ur_probe()
845 if ((urd->class != DEV_CLASS_UR_I) && (urd->class != DEV_CLASS_UR_O)) { in ur_probe()
846 rc = -EOPNOTSUPP; in ur_probe()
850 dev_set_drvdata(&cdev->dev, urd); in ur_probe()
851 cdev->handler = ur_int_handler; in ur_probe()
858 ur_remove_attributes(&cdev->dev); in ur_probe()
878 rc = -ENODEV; in ur_set_online()
882 if (urd->char_device) { in ur_set_online()
884 rc = -EBUSY; in ur_set_online()
888 minor = urd->dev_id.devno; in ur_set_online()
891 urd->char_device = cdev_alloc(); in ur_set_online()
892 if (!urd->char_device) { in ur_set_online()
893 rc = -ENOMEM; in ur_set_online()
897 urd->char_device->ops = &ur_fops; in ur_set_online()
898 urd->char_device->owner = ur_fops.owner; in ur_set_online()
900 rc = cdev_add(urd->char_device, MKDEV(major, minor), 1); in ur_set_online()
903 if (urd->cdev->id.cu_type == READER_PUNCH_DEVTYPE) { in ur_set_online()
904 if (urd->class == DEV_CLASS_UR_I) in ur_set_online()
905 sprintf(node_id, "vmrdr-%s", dev_name(&cdev->dev)); in ur_set_online()
906 if (urd->class == DEV_CLASS_UR_O) in ur_set_online()
907 sprintf(node_id, "vmpun-%s", dev_name(&cdev->dev)); in ur_set_online()
908 } else if (urd->cdev->id.cu_type == PRINTER_DEVTYPE) { in ur_set_online()
909 sprintf(node_id, "vmprt-%s", dev_name(&cdev->dev)); in ur_set_online()
911 rc = -EOPNOTSUPP; in ur_set_online()
915 urd->device = device_create(vmur_class, &cdev->dev, in ur_set_online()
916 urd->char_device->dev, NULL, "%s", node_id); in ur_set_online()
917 if (IS_ERR(urd->device)) { in ur_set_online()
918 rc = PTR_ERR(urd->device); in ur_set_online()
927 cdev_del(urd->char_device); in ur_set_online()
928 urd->char_device = NULL; in ur_set_online()
945 return -ENODEV; in ur_set_offline_force()
946 if (!urd->char_device) { in ur_set_offline_force()
948 rc = -EBUSY; in ur_set_offline_force()
951 if (!force && (refcount_read(&urd->ref_count) > 2)) { in ur_set_offline_force()
954 rc = -EBUSY; in ur_set_offline_force()
957 if (cancel_work_sync(&urd->uevent_work)) { in ur_set_offline_force()
958 /* Work not run yet - need to release reference here */ in ur_set_offline_force()
961 device_destroy(vmur_class, urd->char_device->dev); in ur_set_offline_force()
962 cdev_del(urd->char_device); in ur_set_offline_force()
963 urd->char_device = NULL; in ur_set_offline_force()
989 if (cdev->online) in ur_remove()
991 ur_remove_attributes(&cdev->dev); in ur_remove()
994 urdev_put(dev_get_drvdata(&cdev->dev)); in ur_remove()
995 dev_set_drvdata(&cdev->dev, NULL); in ur_remove()
996 cdev->handler = NULL; in ur_remove()
1013 return -ENODEV; in ur_init()
1018 return -ENOMEM; in ur_init()