Lines Matching refs:cdev

60 	struct ccw_device *cdev = to_ccwdev(dev);  in ccw_bus_match()  local
67 found = ccw_device_id_match(ids, &cdev->id); in ccw_bus_match()
71 cdev->id.driver_info = found->driver_info; in ccw_bus_match()
103 struct ccw_device *cdev = to_ccwdev(dev); in ccw_uevent() local
104 struct ccw_device_id *id = &(cdev->id); in ccw_uevent()
152 struct ccw_device *cdev; in io_subchannel_prepare() local
157 cdev = sch_get_cdev(sch); in io_subchannel_prepare()
158 if (cdev && !device_is_registered(&cdev->dev)) in io_subchannel_prepare()
250 struct ccw_device *cdev = to_ccwdev(dev); in devtype_show() local
251 struct ccw_device_id *id = &(cdev->id); in devtype_show()
263 struct ccw_device *cdev = to_ccwdev(dev); in cutype_show() local
264 struct ccw_device_id *id = &(cdev->id); in cutype_show()
273 struct ccw_device *cdev = to_ccwdev(dev); in modalias_show() local
274 struct ccw_device_id *id = &(cdev->id); in modalias_show()
285 struct ccw_device *cdev = to_ccwdev(dev); in online_show() local
287 return sprintf(buf, cdev->online ? "1\n" : "0\n"); in online_show()
290 int ccw_device_is_orphan(struct ccw_device *cdev) in ccw_device_is_orphan() argument
292 return sch_is_pseudo_sch(to_subchannel(cdev->dev.parent)); in ccw_device_is_orphan()
295 static void ccw_device_unregister(struct ccw_device *cdev) in ccw_device_unregister() argument
297 if (device_is_registered(&cdev->dev)) { in ccw_device_unregister()
299 device_del(&cdev->dev); in ccw_device_unregister()
301 if (cdev->private->flags.initialized) { in ccw_device_unregister()
302 cdev->private->flags.initialized = 0; in ccw_device_unregister()
304 put_device(&cdev->dev); in ccw_device_unregister()
321 int ccw_device_set_offline(struct ccw_device *cdev) in ccw_device_set_offline() argument
326 if (!cdev) in ccw_device_set_offline()
328 if (!cdev->online || !cdev->drv) in ccw_device_set_offline()
331 if (cdev->drv->set_offline) { in ccw_device_set_offline()
332 ret = cdev->drv->set_offline(cdev); in ccw_device_set_offline()
336 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
337 sch = to_subchannel(cdev->dev.parent); in ccw_device_set_offline()
338 cdev->online = 0; in ccw_device_set_offline()
340 while (!dev_fsm_final_state(cdev) && in ccw_device_set_offline()
341 cdev->private->state != DEV_STATE_DISCONNECTED) { in ccw_device_set_offline()
342 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
343 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_offline()
344 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_offline()
345 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
348 ret = ccw_device_offline(cdev); in ccw_device_set_offline()
352 "0.%x.%04x\n", ret, cdev->private->dev_id.ssid, in ccw_device_set_offline()
353 cdev->private->dev_id.devno); in ccw_device_set_offline()
356 state = cdev->private->state; in ccw_device_set_offline()
357 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
359 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
360 cdev->private->state = state; in ccw_device_set_offline()
362 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
363 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_offline()
364 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_offline()
366 if (cdev->private->state == DEV_STATE_BOXED) { in ccw_device_set_offline()
368 "being set offline\n", dev_name(&cdev->dev)); in ccw_device_set_offline()
369 } else if (cdev->private->state == DEV_STATE_NOT_OPER) { in ccw_device_set_offline()
371 "being set offline\n", dev_name(&cdev->dev)); in ccw_device_set_offline()
374 put_device(&cdev->dev); in ccw_device_set_offline()
378 cdev->private->state = DEV_STATE_OFFLINE; in ccw_device_set_offline()
379 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in ccw_device_set_offline()
380 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
382 put_device(&cdev->dev); in ccw_device_set_offline()
398 int ccw_device_set_online(struct ccw_device *cdev) in ccw_device_set_online() argument
403 if (!cdev) in ccw_device_set_online()
405 if (cdev->online || !cdev->drv) in ccw_device_set_online()
408 if (!get_device(&cdev->dev)) in ccw_device_set_online()
411 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
412 ret = ccw_device_online(cdev); in ccw_device_set_online()
413 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
415 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); in ccw_device_set_online()
419 ret, cdev->private->dev_id.ssid, in ccw_device_set_online()
420 cdev->private->dev_id.devno); in ccw_device_set_online()
422 put_device(&cdev->dev); in ccw_device_set_online()
425 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
427 if ((cdev->private->state != DEV_STATE_ONLINE) && in ccw_device_set_online()
428 (cdev->private->state != DEV_STATE_W4SENSE)) { in ccw_device_set_online()
429 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
431 if (cdev->private->state == DEV_STATE_BOXED) { in ccw_device_set_online()
434 dev_name(&cdev->dev)); in ccw_device_set_online()
435 } else if (cdev->private->state == DEV_STATE_NOT_OPER) { in ccw_device_set_online()
438 dev_name(&cdev->dev)); in ccw_device_set_online()
441 put_device(&cdev->dev); in ccw_device_set_online()
444 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
445 if (cdev->drv->set_online) in ccw_device_set_online()
446 ret = cdev->drv->set_online(cdev); in ccw_device_set_online()
450 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
451 cdev->online = 1; in ccw_device_set_online()
452 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
456 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
458 while (!dev_fsm_final_state(cdev) && in ccw_device_set_online()
459 cdev->private->state != DEV_STATE_DISCONNECTED) { in ccw_device_set_online()
460 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
461 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_online()
462 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_online()
463 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
465 ret2 = ccw_device_offline(cdev); in ccw_device_set_online()
468 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
469 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_online()
470 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_online()
472 put_device(&cdev->dev); in ccw_device_set_online()
478 ret2, cdev->private->dev_id.ssid, in ccw_device_set_online()
479 cdev->private->dev_id.devno); in ccw_device_set_online()
480 cdev->private->state = DEV_STATE_OFFLINE; in ccw_device_set_online()
481 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
483 put_device(&cdev->dev); in ccw_device_set_online()
487 static int online_store_handle_offline(struct ccw_device *cdev) in online_store_handle_offline() argument
489 if (cdev->private->state == DEV_STATE_DISCONNECTED) { in online_store_handle_offline()
490 spin_lock_irq(cdev->ccwlock); in online_store_handle_offline()
491 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG_EVAL); in online_store_handle_offline()
492 spin_unlock_irq(cdev->ccwlock); in online_store_handle_offline()
495 if (cdev->drv && cdev->drv->set_offline) in online_store_handle_offline()
496 return ccw_device_set_offline(cdev); in online_store_handle_offline()
500 static int online_store_recog_and_online(struct ccw_device *cdev) in online_store_recog_and_online() argument
503 if (cdev->private->state == DEV_STATE_BOXED) { in online_store_recog_and_online()
504 spin_lock_irq(cdev->ccwlock); in online_store_recog_and_online()
505 ccw_device_recognition(cdev); in online_store_recog_and_online()
506 spin_unlock_irq(cdev->ccwlock); in online_store_recog_and_online()
507 wait_event(cdev->private->wait_q, in online_store_recog_and_online()
508 cdev->private->flags.recog_done); in online_store_recog_and_online()
509 if (cdev->private->state != DEV_STATE_OFFLINE) in online_store_recog_and_online()
513 if (cdev->drv && cdev->drv->set_online) in online_store_recog_and_online()
514 return ccw_device_set_online(cdev); in online_store_recog_and_online()
518 static int online_store_handle_online(struct ccw_device *cdev, int force) in online_store_handle_online() argument
522 ret = online_store_recog_and_online(cdev); in online_store_handle_online()
525 if (force && cdev->private->state == DEV_STATE_BOXED) { in online_store_handle_online()
526 ret = ccw_device_stlck(cdev); in online_store_handle_online()
529 if (cdev->id.cu_type == 0) in online_store_handle_online()
530 cdev->private->state = DEV_STATE_NOT_OPER; in online_store_handle_online()
531 ret = online_store_recog_and_online(cdev); in online_store_handle_online()
541 struct ccw_device *cdev = to_ccwdev(dev); in online_store() local
546 if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) in online_store()
549 if (!dev_fsm_final_state(cdev) && in online_store()
550 cdev->private->state != DEV_STATE_DISCONNECTED) { in online_store()
555 if (work_pending(&cdev->private->todo_work)) { in online_store()
573 ret = online_store_handle_offline(cdev); in online_store()
576 ret = online_store_handle_online(cdev, force); in online_store()
584 atomic_set(&cdev->private->onoff, 0); in online_store()
591 struct ccw_device *cdev = to_ccwdev(dev); in available_show() local
594 if (ccw_device_is_orphan(cdev)) in available_show()
596 switch (cdev->private->state) { in available_show()
681 static int ccw_device_add(struct ccw_device *cdev) in ccw_device_add() argument
683 struct device *dev = &cdev->dev; in ccw_device_add()
691 struct ccw_device *cdev = to_ccwdev(dev); in match_dev_id() local
694 return ccw_dev_id_is_equal(&cdev->private->dev_id, dev_id); in match_dev_id()
717 static void ccw_device_do_unbind_bind(struct ccw_device *cdev) in ccw_device_do_unbind_bind() argument
721 if (device_is_registered(&cdev->dev)) { in ccw_device_do_unbind_bind()
722 device_release_driver(&cdev->dev); in ccw_device_do_unbind_bind()
723 ret = device_attach(&cdev->dev); in ccw_device_do_unbind_bind()
731 struct ccw_device *cdev; in ccw_device_release() local
733 cdev = to_ccwdev(dev); in ccw_device_release()
735 put_device(cdev->dev.parent); in ccw_device_release()
736 kfree(cdev->private); in ccw_device_release()
737 kfree(cdev); in ccw_device_release()
742 struct ccw_device *cdev; in io_subchannel_allocate_dev() local
744 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); in io_subchannel_allocate_dev()
745 if (cdev) { in io_subchannel_allocate_dev()
746 cdev->private = kzalloc(sizeof(struct ccw_device_private), in io_subchannel_allocate_dev()
748 if (cdev->private) in io_subchannel_allocate_dev()
749 return cdev; in io_subchannel_allocate_dev()
751 kfree(cdev); in io_subchannel_allocate_dev()
758 struct ccw_device *cdev) in io_subchannel_initialize_dev() argument
760 struct ccw_device_private *priv = cdev->private; in io_subchannel_initialize_dev()
763 priv->cdev = cdev; in io_subchannel_initialize_dev()
776 cdev->ccwlock = sch->lock; in io_subchannel_initialize_dev()
777 cdev->dev.parent = &sch->dev; in io_subchannel_initialize_dev()
778 cdev->dev.release = ccw_device_release; in io_subchannel_initialize_dev()
779 cdev->dev.groups = ccwdev_attr_groups; in io_subchannel_initialize_dev()
781 device_initialize(&cdev->dev); in io_subchannel_initialize_dev()
782 ret = dev_set_name(&cdev->dev, "0.%x.%04x", cdev->private->dev_id.ssid, in io_subchannel_initialize_dev()
783 cdev->private->dev_id.devno); in io_subchannel_initialize_dev()
792 sch_set_cdev(sch, cdev); in io_subchannel_initialize_dev()
798 put_device(&cdev->dev); in io_subchannel_initialize_dev()
804 struct ccw_device *cdev; in io_subchannel_create_ccwdev() local
807 cdev = io_subchannel_allocate_dev(sch); in io_subchannel_create_ccwdev()
808 if (!IS_ERR(cdev)) { in io_subchannel_create_ccwdev()
809 ret = io_subchannel_initialize_dev(sch, cdev); in io_subchannel_create_ccwdev()
811 cdev = ERR_PTR(ret); in io_subchannel_create_ccwdev()
813 return cdev; in io_subchannel_create_ccwdev()
820 struct ccw_device *cdev; in sch_create_and_recog_new_device() local
823 cdev = io_subchannel_create_ccwdev(sch); in sch_create_and_recog_new_device()
824 if (IS_ERR(cdev)) { in sch_create_and_recog_new_device()
830 io_subchannel_recog(cdev, sch); in sch_create_and_recog_new_device()
836 static void io_subchannel_register(struct ccw_device *cdev) in io_subchannel_register() argument
842 sch = to_subchannel(cdev->dev.parent); in io_subchannel_register()
858 if (device_is_registered(&cdev->dev)) { in io_subchannel_register()
859 if (!cdev->drv) { in io_subchannel_register()
860 ret = device_reprobe(&cdev->dev); in io_subchannel_register()
865 cdev->private->dev_id.ssid, in io_subchannel_register()
866 cdev->private->dev_id.devno); in io_subchannel_register()
878 ret = ccw_device_add(cdev); in io_subchannel_register()
881 cdev->private->dev_id.ssid, in io_subchannel_register()
882 cdev->private->dev_id.devno, ret); in io_subchannel_register()
887 put_device(&cdev->dev); in io_subchannel_register()
891 cdev->private->flags.recog_done = 1; in io_subchannel_register()
892 wake_up(&cdev->private->wait_q); in io_subchannel_register()
898 static void ccw_device_call_sch_unregister(struct ccw_device *cdev) in ccw_device_call_sch_unregister() argument
903 if (!get_device(cdev->dev.parent)) in ccw_device_call_sch_unregister()
905 sch = to_subchannel(cdev->dev.parent); in ccw_device_call_sch_unregister()
915 io_subchannel_recog_done(struct ccw_device *cdev) in io_subchannel_recog_done() argument
918 cdev->private->flags.recog_done = 1; in io_subchannel_recog_done()
921 switch (cdev->private->state) { in io_subchannel_recog_done()
925 cdev->private->flags.recog_done = 1; in io_subchannel_recog_done()
927 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in io_subchannel_recog_done()
936 ccw_device_sched_todo(cdev, CDEV_TODO_REGISTER); in io_subchannel_recog_done()
941 static void io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch) in io_subchannel_recog() argument
948 ccw_device_recognition(cdev); in io_subchannel_recog()
952 static int ccw_device_move_to_sch(struct ccw_device *cdev, in ccw_device_move_to_sch() argument
958 old_sch = to_subchannel(cdev->dev.parent); in ccw_device_move_to_sch()
978 rc = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV); in ccw_device_move_to_sch()
982 cdev->private->dev_id.ssid, in ccw_device_move_to_sch()
983 cdev->private->dev_id.devno, sch->schid.ssid, in ccw_device_move_to_sch()
1006 cdev->private->schid = sch->schid; in ccw_device_move_to_sch()
1007 cdev->ccwlock = sch->lock; in ccw_device_move_to_sch()
1009 sch_set_cdev(sch, cdev); in ccw_device_move_to_sch()
1016 static int ccw_device_move_to_orph(struct ccw_device *cdev) in ccw_device_move_to_orph() argument
1018 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_move_to_orph()
1021 return ccw_device_move_to_sch(cdev, css->pseudo_subchannel); in ccw_device_move_to_orph()
1026 struct ccw_device *cdev; in io_subchannel_irq() local
1028 cdev = sch_get_cdev(sch); in io_subchannel_irq()
1032 if (cdev) in io_subchannel_irq()
1033 dev_fsm_event(cdev, DEV_EVENT_INTERRUPT); in io_subchannel_irq()
1069 struct ccw_device *cdev; in io_subchannel_probe() local
1087 cdev = sch_get_cdev(sch); in io_subchannel_probe()
1088 rc = ccw_device_add(cdev); in io_subchannel_probe()
1091 put_device(&cdev->dev); in io_subchannel_probe()
1126 struct ccw_device *cdev; in io_subchannel_remove() local
1128 cdev = sch_get_cdev(sch); in io_subchannel_remove()
1129 if (!cdev) in io_subchannel_remove()
1133 spin_lock_irq(cdev->ccwlock); in io_subchannel_remove()
1136 cdev->private->state = DEV_STATE_NOT_OPER; in io_subchannel_remove()
1137 spin_unlock_irq(cdev->ccwlock); in io_subchannel_remove()
1138 ccw_device_unregister(cdev); in io_subchannel_remove()
1147 struct ccw_device *cdev; in io_subchannel_verify() local
1149 cdev = sch_get_cdev(sch); in io_subchannel_verify()
1150 if (cdev) in io_subchannel_verify()
1151 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in io_subchannel_verify()
1156 struct ccw_device *cdev; in io_subchannel_terminate_path() local
1158 cdev = sch_get_cdev(sch); in io_subchannel_terminate_path()
1159 if (!cdev) in io_subchannel_terminate_path()
1166 if (cdev->private->state == DEV_STATE_ONLINE) { in io_subchannel_terminate_path()
1167 ccw_device_kill_io(cdev); in io_subchannel_terminate_path()
1174 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in io_subchannel_terminate_path()
1178 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in io_subchannel_terminate_path()
1184 struct ccw_device *cdev = sch_get_cdev(sch); in io_subchannel_chp_event() local
1194 if (cdev) in io_subchannel_chp_event()
1195 cdev->private->path_gone_mask |= mask; in io_subchannel_chp_event()
1201 if (cdev) in io_subchannel_chp_event()
1202 cdev->private->path_new_mask |= mask; in io_subchannel_chp_event()
1208 if (cdev) in io_subchannel_chp_event()
1209 cdev->private->path_gone_mask |= mask; in io_subchannel_chp_event()
1216 if (cdev) in io_subchannel_chp_event()
1217 cdev->private->path_new_mask |= mask; in io_subchannel_chp_event()
1226 struct ccw_device *cdev; in io_subchannel_quiesce() local
1230 cdev = sch_get_cdev(sch); in io_subchannel_quiesce()
1238 if (cdev->handler) in io_subchannel_quiesce()
1239 cdev->handler(cdev, cdev->private->intparm, ERR_PTR(-EIO)); in io_subchannel_quiesce()
1241 cdev->private->state = DEV_STATE_QUIESCE; in io_subchannel_quiesce()
1242 cdev->private->iretry = 255; in io_subchannel_quiesce()
1243 ret = ccw_device_cancel_halt_clear(cdev); in io_subchannel_quiesce()
1245 ccw_device_set_timeout(cdev, HZ/10); in io_subchannel_quiesce()
1247 wait_event(cdev->private->wait_q, in io_subchannel_quiesce()
1248 cdev->private->state != DEV_STATE_QUIESCE); in io_subchannel_quiesce()
1262 static int device_is_disconnected(struct ccw_device *cdev) in device_is_disconnected() argument
1264 if (!cdev) in device_is_disconnected()
1266 return (cdev->private->state == DEV_STATE_DISCONNECTED || in device_is_disconnected()
1267 cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID); in device_is_disconnected()
1272 struct ccw_device *cdev = to_ccwdev(dev); in recovery_check() local
1275 spin_lock_irq(cdev->ccwlock); in recovery_check()
1276 switch (cdev->private->state) { in recovery_check()
1279 cdev->private->dev_id.ssid, in recovery_check()
1280 cdev->private->dev_id.devno); in recovery_check()
1281 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in recovery_check()
1288 spin_unlock_irq(cdev->ccwlock); in recovery_check()
1337 struct ccw_device *cdev = to_ccwdev(dev); in purge_fn() local
1338 struct ccw_dev_id *id = &cdev->private->dev_id; in purge_fn()
1340 spin_lock_irq(cdev->ccwlock); in purge_fn()
1342 (cdev->private->state == DEV_STATE_OFFLINE) && in purge_fn()
1343 (atomic_cmpxchg(&cdev->private->onoff, 0, 1) == 0)) { in purge_fn()
1346 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in purge_fn()
1347 atomic_set(&cdev->private->onoff, 0); in purge_fn()
1349 spin_unlock_irq(cdev->ccwlock); in purge_fn()
1369 void ccw_device_set_disconnected(struct ccw_device *cdev) in ccw_device_set_disconnected() argument
1371 if (!cdev) in ccw_device_set_disconnected()
1373 ccw_device_set_timeout(cdev, 0); in ccw_device_set_disconnected()
1374 cdev->private->flags.fake_irb = 0; in ccw_device_set_disconnected()
1375 cdev->private->state = DEV_STATE_DISCONNECTED; in ccw_device_set_disconnected()
1376 if (cdev->online) in ccw_device_set_disconnected()
1380 void ccw_device_set_notoper(struct ccw_device *cdev) in ccw_device_set_notoper() argument
1382 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_set_notoper()
1386 ccw_device_set_timeout(cdev, 0); in ccw_device_set_notoper()
1388 cdev->private->state = DEV_STATE_NOT_OPER; in ccw_device_set_notoper()
1405 struct ccw_device *cdev; in sch_get_action() local
1407 cdev = sch_get_cdev(sch); in sch_get_action()
1410 if (!cdev) in sch_get_action()
1412 if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK) in sch_get_action()
1417 if (!cdev) in sch_get_action()
1419 if (sch->schib.pmcw.dev != cdev->private->dev_id.devno) { in sch_get_action()
1420 if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK) in sch_get_action()
1425 if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK) in sch_get_action()
1429 if (device_is_disconnected(cdev)) in sch_get_action()
1431 if (cdev->online && !cdev->private->flags.resuming) in sch_get_action()
1433 if (cdev->private->state == DEV_STATE_NOT_OPER) in sch_get_action()
1451 struct ccw_device *cdev; in io_subchannel_sch_event() local
1461 cdev = sch_get_cdev(sch); in io_subchannel_sch_event()
1462 if (cdev && work_pending(&cdev->private->todo_work)) in io_subchannel_sch_event()
1472 ccw_device_trigger_reprobe(cdev); in io_subchannel_sch_event()
1481 ccw_device_set_disconnected(cdev); in io_subchannel_sch_event()
1486 ccw_device_set_disconnected(cdev); in io_subchannel_sch_event()
1490 if (!cdev) in io_subchannel_sch_event()
1492 if (cdev->private->state == DEV_STATE_SENSE_ID) { in io_subchannel_sch_event()
1498 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in io_subchannel_sch_event()
1500 ccw_device_set_notoper(cdev); in io_subchannel_sch_event()
1517 rc = ccw_device_move_to_orph(cdev); in io_subchannel_sch_event()
1523 if (cdev->private->flags.resuming) { in io_subchannel_sch_event()
1531 ccw_device_unregister(cdev); in io_subchannel_sch_event()
1540 if (!cdev || !cdev->private->flags.resuming) in io_subchannel_sch_event()
1548 cdev = get_ccwdev_by_dev_id(&dev_id); in io_subchannel_sch_event()
1549 if (!cdev) { in io_subchannel_sch_event()
1553 rc = ccw_device_move_to_sch(cdev, sch); in io_subchannel_sch_event()
1556 put_device(&cdev->dev); in io_subchannel_sch_event()
1560 ccw_device_trigger_reprobe(cdev); in io_subchannel_sch_event()
1563 put_device(&cdev->dev); in io_subchannel_sch_event()
1576 static void ccw_device_set_int_class(struct ccw_device *cdev) in ccw_device_set_int_class() argument
1578 struct ccw_driver *cdrv = cdev->drv; in ccw_device_set_int_class()
1583 cdev->private->int_class = cdrv->int_class; in ccw_device_set_int_class()
1585 cdev->private->int_class = IRQIO_CIO; in ccw_device_set_int_class()
1589 int __init ccw_device_enable_console(struct ccw_device *cdev) in ccw_device_enable_console() argument
1591 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_enable_console()
1594 if (!cdev->drv || !cdev->handler) in ccw_device_enable_console()
1602 io_subchannel_recog(cdev, sch); in ccw_device_enable_console()
1604 spin_lock_irq(cdev->ccwlock); in ccw_device_enable_console()
1605 while (!dev_fsm_final_state(cdev)) in ccw_device_enable_console()
1606 ccw_device_wait_idle(cdev); in ccw_device_enable_console()
1609 get_device(&cdev->dev); in ccw_device_enable_console()
1610 rc = ccw_device_online(cdev); in ccw_device_enable_console()
1614 while (!dev_fsm_final_state(cdev)) in ccw_device_enable_console()
1615 ccw_device_wait_idle(cdev); in ccw_device_enable_console()
1617 if (cdev->private->state == DEV_STATE_ONLINE) in ccw_device_enable_console()
1618 cdev->online = 1; in ccw_device_enable_console()
1622 spin_unlock_irq(cdev->ccwlock); in ccw_device_enable_console()
1624 put_device(&cdev->dev); in ccw_device_enable_console()
1631 struct ccw_device *cdev; in ccw_device_create_console() local
1644 cdev = io_subchannel_create_ccwdev(sch); in ccw_device_create_console()
1645 if (IS_ERR(cdev)) { in ccw_device_create_console()
1648 return cdev; in ccw_device_create_console()
1650 cdev->drv = drv; in ccw_device_create_console()
1651 ccw_device_set_int_class(cdev); in ccw_device_create_console()
1652 return cdev; in ccw_device_create_console()
1655 void __init ccw_device_destroy_console(struct ccw_device *cdev) in ccw_device_destroy_console() argument
1657 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_destroy_console()
1662 put_device(&cdev->dev); in ccw_device_destroy_console()
1674 void ccw_device_wait_idle(struct ccw_device *cdev) in ccw_device_wait_idle() argument
1676 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_wait_idle()
1688 int ccw_device_force_console(struct ccw_device *cdev) in ccw_device_force_console() argument
1690 return ccw_device_pm_restore(&cdev->dev); in ccw_device_force_console()
1744 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_probe() local
1748 cdev->drv = cdrv; /* to let the driver call _set_online */ in ccw_device_probe()
1749 ccw_device_set_int_class(cdev); in ccw_device_probe()
1750 ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; in ccw_device_probe()
1752 cdev->drv = NULL; in ccw_device_probe()
1753 cdev->private->int_class = IRQIO_CIO; in ccw_device_probe()
1762 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_remove() local
1763 struct ccw_driver *cdrv = cdev->drv; in ccw_device_remove()
1767 cdrv->remove(cdev); in ccw_device_remove()
1769 spin_lock_irq(cdev->ccwlock); in ccw_device_remove()
1770 if (cdev->online) { in ccw_device_remove()
1771 cdev->online = 0; in ccw_device_remove()
1772 ret = ccw_device_offline(cdev); in ccw_device_remove()
1773 spin_unlock_irq(cdev->ccwlock); in ccw_device_remove()
1775 wait_event(cdev->private->wait_q, in ccw_device_remove()
1776 dev_fsm_final_state(cdev)); in ccw_device_remove()
1780 ret, cdev->private->dev_id.ssid, in ccw_device_remove()
1781 cdev->private->dev_id.devno); in ccw_device_remove()
1783 put_device(&cdev->dev); in ccw_device_remove()
1784 spin_lock_irq(cdev->ccwlock); in ccw_device_remove()
1786 ccw_device_set_timeout(cdev, 0); in ccw_device_remove()
1787 cdev->drv = NULL; in ccw_device_remove()
1788 cdev->private->int_class = IRQIO_CIO; in ccw_device_remove()
1789 spin_unlock_irq(cdev->ccwlock); in ccw_device_remove()
1790 __disable_cmf(cdev); in ccw_device_remove()
1797 struct ccw_device *cdev; in ccw_device_shutdown() local
1799 cdev = to_ccwdev(dev); in ccw_device_shutdown()
1800 if (cdev->drv && cdev->drv->shutdown) in ccw_device_shutdown()
1801 cdev->drv->shutdown(cdev); in ccw_device_shutdown()
1802 __disable_cmf(cdev); in ccw_device_shutdown()
1807 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_prepare() local
1809 if (work_pending(&cdev->private->todo_work)) in ccw_device_pm_prepare()
1812 if (atomic_read(&cdev->private->onoff)) in ccw_device_pm_prepare()
1815 if (cdev->online && cdev->drv && cdev->drv->prepare) in ccw_device_pm_prepare()
1816 return cdev->drv->prepare(cdev); in ccw_device_pm_prepare()
1823 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_complete() local
1825 if (cdev->online && cdev->drv && cdev->drv->complete) in ccw_device_pm_complete()
1826 cdev->drv->complete(cdev); in ccw_device_pm_complete()
1831 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_freeze() local
1832 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_freeze()
1836 if (!dev_fsm_final_state(cdev)) in ccw_device_pm_freeze()
1838 if (!cdev->online) in ccw_device_pm_freeze()
1840 if (cdev->drv && cdev->drv->freeze) { in ccw_device_pm_freeze()
1841 ret = cdev->drv->freeze(cdev); in ccw_device_pm_freeze()
1847 cm_enabled = cdev->private->cmb != NULL; in ccw_device_pm_freeze()
1851 ret = ccw_set_cmf(cdev, 0); in ccw_device_pm_freeze()
1865 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_thaw() local
1866 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_thaw()
1869 if (!cdev->online) in ccw_device_pm_thaw()
1875 cm_enabled = cdev->private->cmb != NULL; in ccw_device_pm_thaw()
1881 ret = ccw_set_cmf(cdev, 1); in ccw_device_pm_thaw()
1886 if (cdev->drv && cdev->drv->thaw) in ccw_device_pm_thaw()
1887 ret = cdev->drv->thaw(cdev); in ccw_device_pm_thaw()
1892 static void __ccw_device_pm_restore(struct ccw_device *cdev) in __ccw_device_pm_restore() argument
1894 struct subchannel *sch = to_subchannel(cdev->dev.parent); in __ccw_device_pm_restore()
1905 cdev->private->flags.resuming = 1; in __ccw_device_pm_restore()
1906 cdev->private->path_new_mask = LPM_ANYPATH; in __ccw_device_pm_restore()
1912 sch = to_subchannel(cdev->dev.parent); in __ccw_device_pm_restore()
1914 if (cdev->private->state != DEV_STATE_ONLINE && in __ccw_device_pm_restore()
1915 cdev->private->state != DEV_STATE_OFFLINE) in __ccw_device_pm_restore()
1918 ccw_device_recognition(cdev); in __ccw_device_pm_restore()
1920 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev) || in __ccw_device_pm_restore()
1921 cdev->private->state == DEV_STATE_DISCONNECTED); in __ccw_device_pm_restore()
1925 cdev->private->flags.resuming = 0; in __ccw_device_pm_restore()
1929 static int resume_handle_boxed(struct ccw_device *cdev) in resume_handle_boxed() argument
1931 cdev->private->state = DEV_STATE_BOXED; in resume_handle_boxed()
1932 if (ccw_device_notify(cdev, CIO_BOXED) == NOTIFY_OK) in resume_handle_boxed()
1934 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in resume_handle_boxed()
1938 static int resume_handle_disc(struct ccw_device *cdev) in resume_handle_disc() argument
1940 cdev->private->state = DEV_STATE_DISCONNECTED; in resume_handle_disc()
1941 if (ccw_device_notify(cdev, CIO_GONE) == NOTIFY_OK) in resume_handle_disc()
1943 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in resume_handle_disc()
1949 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_restore() local
1953 __ccw_device_pm_restore(cdev); in ccw_device_pm_restore()
1954 sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_restore()
1960 switch (cdev->private->state) { in ccw_device_pm_restore()
1963 cdev->private->flags.donotify = 0; in ccw_device_pm_restore()
1966 ret = resume_handle_boxed(cdev); in ccw_device_pm_restore()
1971 ret = resume_handle_disc(cdev); in ccw_device_pm_restore()
1977 if (!ccw_device_test_sense_data(cdev)) { in ccw_device_pm_restore()
1978 ccw_device_update_sense_data(cdev); in ccw_device_pm_restore()
1979 ccw_device_sched_todo(cdev, CDEV_TODO_REBIND); in ccw_device_pm_restore()
1983 if (!cdev->online) in ccw_device_pm_restore()
1986 if (ccw_device_online(cdev)) { in ccw_device_pm_restore()
1987 ret = resume_handle_disc(cdev); in ccw_device_pm_restore()
1993 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); in ccw_device_pm_restore()
1996 if (ccw_device_notify(cdev, CIO_OPER) == NOTIFY_BAD) { in ccw_device_pm_restore()
1997 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in ccw_device_pm_restore()
2003 if (cdev->private->cmb) { in ccw_device_pm_restore()
2005 ret = ccw_set_cmf(cdev, 1); in ccw_device_pm_restore()
2009 "(rc=%d)\n", cdev->private->dev_id.ssid, in ccw_device_pm_restore()
2010 cdev->private->dev_id.devno, ret); in ccw_device_pm_restore()
2017 if (cdev->online && cdev->drv && cdev->drv->restore) in ccw_device_pm_restore()
2018 ret = cdev->drv->restore(cdev); in ccw_device_pm_restore()
2075 struct ccw_device *cdev; in ccw_device_todo() local
2080 cdev = priv->cdev; in ccw_device_todo()
2081 sch = to_subchannel(cdev->dev.parent); in ccw_device_todo()
2083 spin_lock_irq(cdev->ccwlock); in ccw_device_todo()
2088 spin_unlock_irq(cdev->ccwlock); in ccw_device_todo()
2092 cmf_reenable(cdev); in ccw_device_todo()
2095 ccw_device_do_unbind_bind(cdev); in ccw_device_todo()
2098 io_subchannel_register(cdev); in ccw_device_todo()
2106 ccw_device_unregister(cdev); in ccw_device_todo()
2108 ccw_device_call_sch_unregister(cdev); in ccw_device_todo()
2114 put_device(&cdev->dev); in ccw_device_todo()
2126 void ccw_device_sched_todo(struct ccw_device *cdev, enum cdev_todo todo) in ccw_device_sched_todo() argument
2129 cdev->private->dev_id.ssid, cdev->private->dev_id.devno, in ccw_device_sched_todo()
2131 if (cdev->private->todo >= todo) in ccw_device_sched_todo()
2133 cdev->private->todo = todo; in ccw_device_sched_todo()
2135 if (!get_device(&cdev->dev)) in ccw_device_sched_todo()
2137 if (!queue_work(cio_work_q, &cdev->private->todo_work)) { in ccw_device_sched_todo()
2139 put_device(&cdev->dev); in ccw_device_sched_todo()
2150 int ccw_device_siosl(struct ccw_device *cdev) in ccw_device_siosl() argument
2152 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_siosl()