Lines Matching refs:device

94 tape_medium_state_show(struct device *dev, struct device_attribute *attr, char *buf)  in tape_medium_state_show()
106 tape_first_minor_show(struct device *dev, struct device_attribute *attr, char *buf) in tape_first_minor_show()
118 tape_state_show(struct device *dev, struct device_attribute *attr, char *buf) in tape_state_show()
131 tape_operation_show(struct device *dev, struct device_attribute *attr, char *buf) in tape_operation_show()
158 tape_blocksize_show(struct device *dev, struct device_attribute *attr, char *buf) in tape_blocksize_show()
187 tape_state_set(struct tape_device *device, enum tape_state newstate) in tape_state_set() argument
191 if (device->tape_state == TS_NOT_OPER) { in tape_state_set()
195 DBF_EVENT(4, "ts. dev: %x\n", device->first_minor); in tape_state_set()
197 if (device->tape_state < TS_SIZE && device->tape_state >=0 ) in tape_state_set()
198 str = tape_state_verbose[device->tape_state]; in tape_state_set()
208 device->tape_state = newstate; in tape_state_set()
209 wake_up(&device->state_change_wq); in tape_state_set()
213 struct tape_device *device; member
225 struct tape_device *device = p->device; in tape_med_state_work_handler() local
231 "unloaded\n", dev_name(&device->cdev->dev)); in tape_med_state_work_handler()
233 kobject_uevent_env(&device->cdev->dev.kobj, KOBJ_CHANGE, envp); in tape_med_state_work_handler()
237 dev_name(&device->cdev->dev)); in tape_med_state_work_handler()
239 kobject_uevent_env(&device->cdev->dev.kobj, KOBJ_CHANGE, envp); in tape_med_state_work_handler()
244 tape_put_device(device); in tape_med_state_work_handler()
249 tape_med_state_work(struct tape_device *device, enum tape_medium_state state) in tape_med_state_work() argument
256 p->device = tape_get_device(device); in tape_med_state_work()
263 tape_med_state_set(struct tape_device *device, enum tape_medium_state newstate) in tape_med_state_set() argument
267 oldstate = device->medium_state; in tape_med_state_set()
270 device->medium_state = newstate; in tape_med_state_set()
273 device->tape_generic_status |= GMT_DR_OPEN(~0); in tape_med_state_set()
275 tape_med_state_work(device, MS_UNLOADED); in tape_med_state_set()
278 device->tape_generic_status &= ~GMT_DR_OPEN(~0); in tape_med_state_set()
280 tape_med_state_work(device, MS_LOADED); in tape_med_state_set()
285 wake_up(&device->state_change_wq); in tape_med_state_set()
292 __tape_cancel_io(struct tape_device *device, struct tape_request *request) in __tape_cancel_io() argument
303 rc = ccw_device_clear(device->cdev, (long) request); in __tape_cancel_io()
311 schedule_delayed_work(&device->tape_dnr, 0); in __tape_cancel_io()
332 tape_assign_minor(struct tape_device *device) in tape_assign_minor() argument
348 device->first_minor = minor; in tape_assign_minor()
349 list_add_tail(&device->node, &tmp->node); in tape_assign_minor()
356 tape_remove_minor(struct tape_device *device) in tape_remove_minor() argument
359 list_del_init(&device->node); in tape_remove_minor()
360 device->first_minor = -1; in tape_remove_minor()
373 tape_generic_online(struct tape_device *device, in tape_generic_online() argument
378 DBF_LH(6, "tape_enable_device(%p, %p)\n", device, discipline); in tape_generic_online()
380 if (device->tape_state != TS_INIT) { in tape_generic_online()
381 DBF_LH(3, "Tapestate not INIT (%d)\n", device->tape_state); in tape_generic_online()
385 timer_setup(&device->lb_timeout, tape_long_busy_timeout, 0); in tape_generic_online()
388 device->discipline = discipline; in tape_generic_online()
393 rc = discipline->setup_device(device); in tape_generic_online()
396 rc = tape_assign_minor(device); in tape_generic_online()
400 rc = tapechar_setup_device(device); in tape_generic_online()
404 tape_state_set(device, TS_UNUSED); in tape_generic_online()
406 DBF_LH(3, "(%08x): Drive set online\n", device->cdev_id); in tape_generic_online()
411 tape_remove_minor(device); in tape_generic_online()
413 device->discipline->cleanup_device(device); in tape_generic_online()
414 device->discipline = NULL; in tape_generic_online()
421 tape_cleanup_device(struct tape_device *device) in tape_cleanup_device() argument
423 tapechar_cleanup_device(device); in tape_cleanup_device()
424 device->discipline->cleanup_device(device); in tape_cleanup_device()
425 module_put(device->discipline->owner); in tape_cleanup_device()
426 tape_remove_minor(device); in tape_cleanup_device()
427 tape_med_state_set(device, MS_UNKNOWN); in tape_cleanup_device()
440 struct tape_device *device; in tape_generic_offline() local
442 device = dev_get_drvdata(&cdev->dev); in tape_generic_offline()
443 if (!device) { in tape_generic_offline()
448 device->cdev_id, device); in tape_generic_offline()
450 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_generic_offline()
451 switch (device->tape_state) { in tape_generic_offline()
454 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_generic_offline()
457 tape_state_set(device, TS_INIT); in tape_generic_offline()
458 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_generic_offline()
459 tape_cleanup_device(device); in tape_generic_offline()
464 device->cdev_id); in tape_generic_offline()
465 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_generic_offline()
469 DBF_LH(3, "(%08x): Drive set offline.\n", device->cdev_id); in tape_generic_offline()
479 struct tape_device *device; in tape_alloc_device() local
481 device = kzalloc(sizeof(struct tape_device), GFP_KERNEL); in tape_alloc_device()
482 if (device == NULL) { in tape_alloc_device()
486 device->modeset_byte = kmalloc(1, GFP_KERNEL | GFP_DMA); in tape_alloc_device()
487 if (device->modeset_byte == NULL) { in tape_alloc_device()
489 kfree(device); in tape_alloc_device()
492 mutex_init(&device->mutex); in tape_alloc_device()
493 INIT_LIST_HEAD(&device->req_queue); in tape_alloc_device()
494 INIT_LIST_HEAD(&device->node); in tape_alloc_device()
495 init_waitqueue_head(&device->state_change_wq); in tape_alloc_device()
496 init_waitqueue_head(&device->wait_queue); in tape_alloc_device()
497 device->tape_state = TS_INIT; in tape_alloc_device()
498 device->medium_state = MS_UNKNOWN; in tape_alloc_device()
499 *device->modeset_byte = 0; in tape_alloc_device()
500 device->first_minor = -1; in tape_alloc_device()
501 atomic_set(&device->ref_count, 1); in tape_alloc_device()
502 INIT_DELAYED_WORK(&device->tape_dnr, tape_delayed_next_request); in tape_alloc_device()
504 return device; in tape_alloc_device()
512 tape_get_device(struct tape_device *device) in tape_get_device() argument
516 count = atomic_inc_return(&device->ref_count); in tape_get_device()
517 DBF_EVENT(4, "tape_get_device(%p) = %i\n", device, count); in tape_get_device()
518 return device; in tape_get_device()
528 tape_put_device(struct tape_device *device) in tape_put_device() argument
532 count = atomic_dec_return(&device->ref_count); in tape_put_device()
533 DBF_EVENT(4, "tape_put_device(%p) -> %i\n", device, count); in tape_put_device()
536 kfree(device->modeset_byte); in tape_put_device()
537 kfree(device); in tape_put_device()
547 struct tape_device *device, *tmp; in tape_find_device() local
549 device = ERR_PTR(-ENODEV); in tape_find_device()
553 device = tape_get_device(tmp); in tape_find_device()
558 return device; in tape_find_device()
567 struct tape_device *device; in tape_generic_probe() local
571 device = tape_alloc_device(); in tape_generic_probe()
572 if (IS_ERR(device)) in tape_generic_probe()
578 tape_put_device(device); in tape_generic_probe()
581 dev_set_drvdata(&cdev->dev, device); in tape_generic_probe()
583 device->cdev = cdev; in tape_generic_probe()
585 device->cdev_id = devid_to_int(&dev_id); in tape_generic_probe()
590 __tape_discard_requests(struct tape_device *device) in __tape_discard_requests() argument
595 list_for_each_safe(l, n, &device->req_queue) { in __tape_discard_requests()
602 request->device = NULL; in __tape_discard_requests()
603 tape_put_device(device); in __tape_discard_requests()
619 struct tape_device * device; in tape_generic_remove() local
621 device = dev_get_drvdata(&cdev->dev); in tape_generic_remove()
622 if (!device) { in tape_generic_remove()
625 DBF_LH(3, "(%08x): tape_generic_remove(%p)\n", device->cdev_id, cdev); in tape_generic_remove()
627 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_generic_remove()
628 switch (device->tape_state) { in tape_generic_remove()
630 tape_state_set(device, TS_NOT_OPER); in tape_generic_remove()
636 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_generic_remove()
642 tape_state_set(device, TS_NOT_OPER); in tape_generic_remove()
643 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_generic_remove()
644 tape_cleanup_device(device); in tape_generic_remove()
653 device->cdev_id); in tape_generic_remove()
655 dev_name(&device->cdev->dev)); in tape_generic_remove()
656 tape_state_set(device, TS_NOT_OPER); in tape_generic_remove()
657 __tape_discard_requests(device); in tape_generic_remove()
658 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_generic_remove()
659 tape_cleanup_device(device); in tape_generic_remove()
662 device = dev_get_drvdata(&cdev->dev); in tape_generic_remove()
663 if (device) { in tape_generic_remove()
666 tape_put_device(device); in tape_generic_remove()
721 if (request->device) in tape_free_request()
722 tape_put_device(request->device); in tape_free_request()
729 __tape_start_io(struct tape_device *device, struct tape_request *request) in __tape_start_io() argument
734 device->cdev, in __tape_start_io()
745 schedule_delayed_work(&device->tape_dnr, 0); in __tape_start_io()
755 __tape_start_next_request(struct tape_device *device) in __tape_start_next_request() argument
761 DBF_LH(6, "__tape_start_next_request(%p)\n", device); in __tape_start_next_request()
766 list_for_each_safe(l, n, &device->req_queue) { in __tape_start_next_request()
790 rc = __tape_cancel_io(device, request); in __tape_start_next_request()
792 rc = __tape_start_io(device, request); in __tape_start_next_request()
813 struct tape_device *device = in tape_delayed_next_request() local
816 DBF_LH(6, "tape_delayed_next_request(%p)\n", device); in tape_delayed_next_request()
817 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_delayed_next_request()
818 __tape_start_next_request(device); in tape_delayed_next_request()
819 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_delayed_next_request()
824 struct tape_device *device = from_timer(device, t, lb_timeout); in tape_long_busy_timeout() local
827 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_long_busy_timeout()
828 request = list_entry(device->req_queue.next, struct tape_request, list); in tape_long_busy_timeout()
830 DBF_LH(6, "%08x: Long busy timeout.\n", device->cdev_id); in tape_long_busy_timeout()
831 __tape_start_next_request(device); in tape_long_busy_timeout()
832 tape_put_device(device); in tape_long_busy_timeout()
833 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_long_busy_timeout()
838 struct tape_device * device, in __tape_end_request() argument
842 DBF_LH(6, "__tape_end_request(%p, %p, %i)\n", device, request, rc); in __tape_end_request()
856 if (!list_empty(&device->req_queue)) in __tape_end_request()
857 __tape_start_next_request(device); in __tape_end_request()
864 tape_dump_sense_dbf(struct tape_device *device, struct tape_request *request, in tape_dump_sense_dbf() argument
876 DBF_EVENT(3, "DEVICE: %08x OP\t: %s\n", device->cdev_id, op); in tape_dump_sense_dbf()
890 __tape_start_request(struct tape_device *device, struct tape_request *request) in __tape_start_request() argument
900 if (device->tape_state == TS_INIT) in __tape_start_request()
902 if (device->tape_state == TS_UNUSED) in __tape_start_request()
906 if (device->tape_state == TS_BLKUSE) in __tape_start_request()
908 if (device->tape_state != TS_IN_USE) in __tape_start_request()
913 request->device = tape_get_device(device); in __tape_start_request()
915 if (list_empty(&device->req_queue)) { in __tape_start_request()
917 rc = __tape_start_io(device, request); in __tape_start_request()
922 list_add(&request->list, &device->req_queue); in __tape_start_request()
926 list_add_tail(&request->list, &device->req_queue); in __tape_start_request()
936 tape_do_io_async(struct tape_device *device, struct tape_request *request) in tape_do_io_async() argument
940 DBF_LH(6, "tape_do_io_async(%p, %p)\n", device, request); in tape_do_io_async()
942 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_do_io_async()
944 rc = __tape_start_request(device, request); in tape_do_io_async()
945 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_do_io_async()
962 tape_do_io(struct tape_device *device, struct tape_request *request) in tape_do_io() argument
966 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_do_io()
969 request->callback_data = &device->wait_queue; in tape_do_io()
971 rc = __tape_start_request(device, request); in tape_do_io()
972 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_do_io()
976 wait_event(device->wait_queue, (request->callback == NULL)); in tape_do_io()
994 tape_do_io_interruptible(struct tape_device *device, in tape_do_io_interruptible() argument
999 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_do_io_interruptible()
1002 request->callback_data = &device->wait_queue; in tape_do_io_interruptible()
1003 rc = __tape_start_request(device, request); in tape_do_io_interruptible()
1004 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_do_io_interruptible()
1008 rc = wait_event_interruptible(device->wait_queue, in tape_do_io_interruptible()
1015 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_do_io_interruptible()
1016 rc = __tape_cancel_io(device, request); in tape_do_io_interruptible()
1017 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_do_io_interruptible()
1022 device->wait_queue, in tape_do_io_interruptible()
1027 DBF_EVENT(3, "IO stopped on %08x\n", device->cdev_id); in tape_do_io_interruptible()
1037 tape_cancel_io(struct tape_device *device, struct tape_request *request) in tape_cancel_io() argument
1041 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_cancel_io()
1042 rc = __tape_cancel_io(device, request); in tape_cancel_io()
1043 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_cancel_io()
1053 struct tape_device *device; in __tape_do_irq() local
1057 device = dev_get_drvdata(&cdev->dev); in __tape_do_irq()
1058 if (device == NULL) { in __tape_do_irq()
1063 DBF_LH(6, "__tape_do_irq(device=%p, request=%p)\n", device, request); in __tape_do_irq()
1071 device->cdev_id); in __tape_do_irq()
1074 __tape_end_request(device, request, -EIO); in __tape_do_irq()
1078 device->cdev_id, PTR_ERR(irb)); in __tape_do_irq()
1094 device->cdev_id, irb->scsw.cmd.cc, irb->scsw.cmd.fctl); in __tape_do_irq()
1096 schedule_delayed_work(&device->tape_dnr, HZ); in __tape_do_irq()
1104 !list_empty(&device->req_queue)) { in __tape_do_irq()
1107 req = list_entry(device->req_queue.next, in __tape_do_irq()
1110 DBF_EVENT(3, "(%08x): del timer\n", device->cdev_id); in __tape_do_irq()
1111 if (del_timer(&device->lb_timeout)) { in __tape_do_irq()
1112 tape_put_device(device); in __tape_do_irq()
1113 __tape_start_next_request(device); in __tape_do_irq()
1121 device->tape_generic_status |= GMT_ONLINE(~0); in __tape_do_irq()
1123 device->tape_generic_status &= ~GMT_ONLINE(~0); in __tape_do_irq()
1130 tape_dump_sense_dbf(device, request, irb); in __tape_do_irq()
1133 device->tape_generic_status |= GMT_ONLINE(~0); in __tape_do_irq()
1135 if (device->tape_state == TS_NOT_OPER) { in __tape_do_irq()
1145 __tape_end_request(device, request, -EIO); in __tape_do_irq()
1149 rc = device->discipline->irq(device, request, irb); in __tape_do_irq()
1160 device->tape_generic_status |= GMT_ONLINE(~0); in __tape_do_irq()
1161 __tape_end_request(device, request, rc); in __tape_do_irq()
1166 device->lb_timeout.expires = jiffies + in __tape_do_irq()
1168 DBF_EVENT(3, "(%08x): add timer\n", device->cdev_id); in __tape_do_irq()
1169 add_timer(&device->lb_timeout); in __tape_do_irq()
1173 rc = __tape_start_io(device, request); in __tape_do_irq()
1175 __tape_end_request(device, request, rc); in __tape_do_irq()
1178 rc = __tape_cancel_io(device, request); in __tape_do_irq()
1180 __tape_end_request(device, request, rc); in __tape_do_irq()
1185 __tape_end_request(device, request, -EIO); in __tape_do_irq()
1187 __tape_end_request(device, request, rc); in __tape_do_irq()
1197 tape_open(struct tape_device *device) in tape_open() argument
1201 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_open()
1202 if (device->tape_state == TS_NOT_OPER) { in tape_open()
1205 } else if (device->tape_state == TS_IN_USE) { in tape_open()
1208 } else if (device->tape_state == TS_BLKUSE) { in tape_open()
1211 } else if (device->discipline != NULL && in tape_open()
1212 !try_module_get(device->discipline->owner)) { in tape_open()
1216 tape_state_set(device, TS_IN_USE); in tape_open()
1219 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_open()
1227 tape_release(struct tape_device *device) in tape_release() argument
1229 spin_lock_irq(get_ccwdev_lock(device->cdev)); in tape_release()
1230 if (device->tape_state == TS_IN_USE) in tape_release()
1231 tape_state_set(device, TS_UNUSED); in tape_release()
1232 module_put(device->discipline->owner); in tape_release()
1233 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in tape_release()
1241 tape_mtop(struct tape_device *device, int mt_op, int mt_count) in tape_mtop() argument
1252 fn = device->discipline->mtop_array[mt_op]; in tape_mtop()
1261 if ((rc = fn(device, 500)) != 0) in tape_mtop()
1264 rc = fn(device, mt_count); in tape_mtop()
1266 rc = fn(device, mt_count); in tape_mtop()