Lines Matching refs:cdev

62 	struct ccw_device *cdev = to_ccwdev(dev);  in ccw_bus_match()  local
69 found = ccw_device_id_match(ids, &cdev->id); in ccw_bus_match()
73 cdev->id.driver_info = found->driver_info; in ccw_bus_match()
105 struct ccw_device *cdev = to_ccwdev(dev); in ccw_uevent() local
106 struct ccw_device_id *id = &(cdev->id); in ccw_uevent()
153 struct ccw_device *cdev; in io_subchannel_prepare() local
158 cdev = sch_get_cdev(sch); in io_subchannel_prepare()
159 if (cdev && !device_is_registered(&cdev->dev)) in io_subchannel_prepare()
213 struct ccw_device *cdev = to_ccwdev(dev); in devtype_show() local
214 struct ccw_device_id *id = &(cdev->id); in devtype_show()
226 struct ccw_device *cdev = to_ccwdev(dev); in cutype_show() local
227 struct ccw_device_id *id = &(cdev->id); in cutype_show()
236 struct ccw_device *cdev = to_ccwdev(dev); in modalias_show() local
237 struct ccw_device_id *id = &(cdev->id); in modalias_show()
248 struct ccw_device *cdev = to_ccwdev(dev); in online_show() local
250 return sprintf(buf, cdev->online ? "1\n" : "0\n"); in online_show()
253 int ccw_device_is_orphan(struct ccw_device *cdev) in ccw_device_is_orphan() argument
255 return sch_is_pseudo_sch(to_subchannel(cdev->dev.parent)); in ccw_device_is_orphan()
258 static void ccw_device_unregister(struct ccw_device *cdev) in ccw_device_unregister() argument
260 if (device_is_registered(&cdev->dev)) { in ccw_device_unregister()
262 device_del(&cdev->dev); in ccw_device_unregister()
264 if (cdev->private->flags.initialized) { in ccw_device_unregister()
265 cdev->private->flags.initialized = 0; in ccw_device_unregister()
267 put_device(&cdev->dev); in ccw_device_unregister()
284 int ccw_device_set_offline(struct ccw_device *cdev) in ccw_device_set_offline() argument
289 if (!cdev) in ccw_device_set_offline()
291 if (!cdev->online || !cdev->drv) in ccw_device_set_offline()
294 if (cdev->drv->set_offline) { in ccw_device_set_offline()
295 ret = cdev->drv->set_offline(cdev); in ccw_device_set_offline()
299 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
300 sch = to_subchannel(cdev->dev.parent); in ccw_device_set_offline()
301 cdev->online = 0; in ccw_device_set_offline()
303 while (!dev_fsm_final_state(cdev) && in ccw_device_set_offline()
304 cdev->private->state != DEV_STATE_DISCONNECTED) { in ccw_device_set_offline()
305 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
306 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_offline()
307 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_offline()
308 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
311 ret = ccw_device_offline(cdev); in ccw_device_set_offline()
315 "0.%x.%04x\n", ret, cdev->private->dev_id.ssid, in ccw_device_set_offline()
316 cdev->private->dev_id.devno); in ccw_device_set_offline()
319 state = cdev->private->state; in ccw_device_set_offline()
320 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
322 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
323 cdev->private->state = state; in ccw_device_set_offline()
325 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
326 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_offline()
327 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_offline()
329 if (cdev->private->state == DEV_STATE_BOXED) { in ccw_device_set_offline()
331 dev_name(&cdev->dev)); in ccw_device_set_offline()
332 } else if (cdev->private->state == DEV_STATE_NOT_OPER) { in ccw_device_set_offline()
334 dev_name(&cdev->dev)); in ccw_device_set_offline()
337 put_device(&cdev->dev); in ccw_device_set_offline()
341 cdev->private->state = DEV_STATE_OFFLINE; in ccw_device_set_offline()
342 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in ccw_device_set_offline()
343 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
345 put_device(&cdev->dev); in ccw_device_set_offline()
361 int ccw_device_set_online(struct ccw_device *cdev) in ccw_device_set_online() argument
366 if (!cdev) in ccw_device_set_online()
368 if (cdev->online || !cdev->drv) in ccw_device_set_online()
371 if (!get_device(&cdev->dev)) in ccw_device_set_online()
374 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
375 ret = ccw_device_online(cdev); in ccw_device_set_online()
376 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
378 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); in ccw_device_set_online()
382 ret, cdev->private->dev_id.ssid, in ccw_device_set_online()
383 cdev->private->dev_id.devno); in ccw_device_set_online()
385 put_device(&cdev->dev); in ccw_device_set_online()
388 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
390 if ((cdev->private->state != DEV_STATE_ONLINE) && in ccw_device_set_online()
391 (cdev->private->state != DEV_STATE_W4SENSE)) { in ccw_device_set_online()
392 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
394 if (cdev->private->state == DEV_STATE_BOXED) { in ccw_device_set_online()
396 dev_name(&cdev->dev)); in ccw_device_set_online()
397 } else if (cdev->private->state == DEV_STATE_NOT_OPER) { in ccw_device_set_online()
399 dev_name(&cdev->dev)); in ccw_device_set_online()
402 put_device(&cdev->dev); in ccw_device_set_online()
405 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
406 if (cdev->drv->set_online) in ccw_device_set_online()
407 ret = cdev->drv->set_online(cdev); in ccw_device_set_online()
411 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
412 cdev->online = 1; in ccw_device_set_online()
413 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
417 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
419 while (!dev_fsm_final_state(cdev) && in ccw_device_set_online()
420 cdev->private->state != DEV_STATE_DISCONNECTED) { in ccw_device_set_online()
421 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
422 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_online()
423 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_online()
424 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
426 ret2 = ccw_device_offline(cdev); in ccw_device_set_online()
429 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
430 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_online()
431 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_online()
433 put_device(&cdev->dev); in ccw_device_set_online()
439 ret2, cdev->private->dev_id.ssid, in ccw_device_set_online()
440 cdev->private->dev_id.devno); in ccw_device_set_online()
441 cdev->private->state = DEV_STATE_OFFLINE; in ccw_device_set_online()
442 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
444 put_device(&cdev->dev); in ccw_device_set_online()
448 static int online_store_handle_offline(struct ccw_device *cdev) in online_store_handle_offline() argument
450 if (cdev->private->state == DEV_STATE_DISCONNECTED) { in online_store_handle_offline()
451 spin_lock_irq(cdev->ccwlock); in online_store_handle_offline()
452 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG_EVAL); in online_store_handle_offline()
453 spin_unlock_irq(cdev->ccwlock); in online_store_handle_offline()
456 if (cdev->drv && cdev->drv->set_offline) in online_store_handle_offline()
457 return ccw_device_set_offline(cdev); in online_store_handle_offline()
461 static int online_store_recog_and_online(struct ccw_device *cdev) in online_store_recog_and_online() argument
464 if (cdev->private->state == DEV_STATE_BOXED) { in online_store_recog_and_online()
465 spin_lock_irq(cdev->ccwlock); in online_store_recog_and_online()
466 ccw_device_recognition(cdev); in online_store_recog_and_online()
467 spin_unlock_irq(cdev->ccwlock); in online_store_recog_and_online()
468 wait_event(cdev->private->wait_q, in online_store_recog_and_online()
469 cdev->private->flags.recog_done); in online_store_recog_and_online()
470 if (cdev->private->state != DEV_STATE_OFFLINE) in online_store_recog_and_online()
474 if (cdev->drv && cdev->drv->set_online) in online_store_recog_and_online()
475 return ccw_device_set_online(cdev); in online_store_recog_and_online()
479 static int online_store_handle_online(struct ccw_device *cdev, int force) in online_store_handle_online() argument
483 ret = online_store_recog_and_online(cdev); in online_store_handle_online()
486 if (force && cdev->private->state == DEV_STATE_BOXED) { in online_store_handle_online()
487 ret = ccw_device_stlck(cdev); in online_store_handle_online()
490 if (cdev->id.cu_type == 0) in online_store_handle_online()
491 cdev->private->state = DEV_STATE_NOT_OPER; in online_store_handle_online()
492 ret = online_store_recog_and_online(cdev); in online_store_handle_online()
502 struct ccw_device *cdev = to_ccwdev(dev); in online_store() local
507 if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) in online_store()
510 if (!dev_fsm_final_state(cdev) && in online_store()
511 cdev->private->state != DEV_STATE_DISCONNECTED) { in online_store()
516 if (work_pending(&cdev->private->todo_work)) { in online_store()
534 ret = online_store_handle_offline(cdev); in online_store()
537 ret = online_store_handle_online(cdev, force); in online_store()
545 atomic_set(&cdev->private->onoff, 0); in online_store()
552 struct ccw_device *cdev = to_ccwdev(dev); in available_show() local
555 if (ccw_device_is_orphan(cdev)) in available_show()
557 switch (cdev->private->state) { in available_show()
637 static int ccw_device_add(struct ccw_device *cdev) in ccw_device_add() argument
639 struct device *dev = &cdev->dev; in ccw_device_add()
647 struct ccw_device *cdev = to_ccwdev(dev); in match_dev_id() local
650 return ccw_dev_id_is_equal(&cdev->private->dev_id, dev_id); in match_dev_id()
673 static void ccw_device_do_unbind_bind(struct ccw_device *cdev) in ccw_device_do_unbind_bind() argument
677 if (device_is_registered(&cdev->dev)) { in ccw_device_do_unbind_bind()
678 device_release_driver(&cdev->dev); in ccw_device_do_unbind_bind()
679 ret = device_attach(&cdev->dev); in ccw_device_do_unbind_bind()
687 struct ccw_device *cdev; in ccw_device_release() local
689 cdev = to_ccwdev(dev); in ccw_device_release()
691 put_device(cdev->dev.parent); in ccw_device_release()
692 kfree(cdev->private); in ccw_device_release()
693 kfree(cdev); in ccw_device_release()
698 struct ccw_device *cdev; in io_subchannel_allocate_dev() local
700 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); in io_subchannel_allocate_dev()
701 if (cdev) { in io_subchannel_allocate_dev()
702 cdev->private = kzalloc(sizeof(struct ccw_device_private), in io_subchannel_allocate_dev()
704 if (cdev->private) in io_subchannel_allocate_dev()
705 return cdev; in io_subchannel_allocate_dev()
707 kfree(cdev); in io_subchannel_allocate_dev()
714 struct ccw_device *cdev) in io_subchannel_initialize_dev() argument
716 struct ccw_device_private *priv = cdev->private; in io_subchannel_initialize_dev()
719 priv->cdev = cdev; in io_subchannel_initialize_dev()
731 cdev->ccwlock = sch->lock; in io_subchannel_initialize_dev()
732 cdev->dev.parent = &sch->dev; in io_subchannel_initialize_dev()
733 cdev->dev.release = ccw_device_release; in io_subchannel_initialize_dev()
734 cdev->dev.groups = ccwdev_attr_groups; in io_subchannel_initialize_dev()
736 device_initialize(&cdev->dev); in io_subchannel_initialize_dev()
737 ret = dev_set_name(&cdev->dev, "0.%x.%04x", cdev->private->dev_id.ssid, in io_subchannel_initialize_dev()
738 cdev->private->dev_id.devno); in io_subchannel_initialize_dev()
747 sch_set_cdev(sch, cdev); in io_subchannel_initialize_dev()
753 put_device(&cdev->dev); in io_subchannel_initialize_dev()
759 struct ccw_device *cdev; in io_subchannel_create_ccwdev() local
762 cdev = io_subchannel_allocate_dev(sch); in io_subchannel_create_ccwdev()
763 if (!IS_ERR(cdev)) { in io_subchannel_create_ccwdev()
764 ret = io_subchannel_initialize_dev(sch, cdev); in io_subchannel_create_ccwdev()
766 cdev = ERR_PTR(ret); in io_subchannel_create_ccwdev()
768 return cdev; in io_subchannel_create_ccwdev()
775 struct ccw_device *cdev; in sch_create_and_recog_new_device() local
778 cdev = io_subchannel_create_ccwdev(sch); in sch_create_and_recog_new_device()
779 if (IS_ERR(cdev)) { in sch_create_and_recog_new_device()
785 io_subchannel_recog(cdev, sch); in sch_create_and_recog_new_device()
791 static void io_subchannel_register(struct ccw_device *cdev) in io_subchannel_register() argument
797 sch = to_subchannel(cdev->dev.parent); in io_subchannel_register()
813 if (device_is_registered(&cdev->dev)) { in io_subchannel_register()
814 if (!cdev->drv) { in io_subchannel_register()
815 ret = device_reprobe(&cdev->dev); in io_subchannel_register()
820 cdev->private->dev_id.ssid, in io_subchannel_register()
821 cdev->private->dev_id.devno); in io_subchannel_register()
833 ret = ccw_device_add(cdev); in io_subchannel_register()
836 cdev->private->dev_id.ssid, in io_subchannel_register()
837 cdev->private->dev_id.devno, ret); in io_subchannel_register()
842 put_device(&cdev->dev); in io_subchannel_register()
846 cdev->private->flags.recog_done = 1; in io_subchannel_register()
847 wake_up(&cdev->private->wait_q); in io_subchannel_register()
853 static void ccw_device_call_sch_unregister(struct ccw_device *cdev) in ccw_device_call_sch_unregister() argument
858 if (!get_device(cdev->dev.parent)) in ccw_device_call_sch_unregister()
860 sch = to_subchannel(cdev->dev.parent); in ccw_device_call_sch_unregister()
870 io_subchannel_recog_done(struct ccw_device *cdev) in io_subchannel_recog_done() argument
873 cdev->private->flags.recog_done = 1; in io_subchannel_recog_done()
876 switch (cdev->private->state) { in io_subchannel_recog_done()
880 cdev->private->flags.recog_done = 1; in io_subchannel_recog_done()
882 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in io_subchannel_recog_done()
891 ccw_device_sched_todo(cdev, CDEV_TODO_REGISTER); in io_subchannel_recog_done()
896 static void io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch) in io_subchannel_recog() argument
903 ccw_device_recognition(cdev); in io_subchannel_recog()
907 static int ccw_device_move_to_sch(struct ccw_device *cdev, in ccw_device_move_to_sch() argument
913 old_sch = to_subchannel(cdev->dev.parent); in ccw_device_move_to_sch()
933 rc = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV); in ccw_device_move_to_sch()
937 cdev->private->dev_id.ssid, in ccw_device_move_to_sch()
938 cdev->private->dev_id.devno, sch->schid.ssid, in ccw_device_move_to_sch()
961 cdev->ccwlock = sch->lock; in ccw_device_move_to_sch()
963 sch_set_cdev(sch, cdev); in ccw_device_move_to_sch()
970 static int ccw_device_move_to_orph(struct ccw_device *cdev) in ccw_device_move_to_orph() argument
972 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_move_to_orph()
975 return ccw_device_move_to_sch(cdev, css->pseudo_subchannel); in ccw_device_move_to_orph()
980 struct ccw_device *cdev; in io_subchannel_irq() local
982 cdev = sch_get_cdev(sch); in io_subchannel_irq()
986 if (cdev) in io_subchannel_irq()
987 dev_fsm_event(cdev, DEV_EVENT_INTERRUPT); in io_subchannel_irq()
1023 struct ccw_device *cdev; in io_subchannel_probe() local
1041 cdev = sch_get_cdev(sch); in io_subchannel_probe()
1042 rc = ccw_device_add(cdev); in io_subchannel_probe()
1045 put_device(&cdev->dev); in io_subchannel_probe()
1079 struct ccw_device *cdev; in io_subchannel_remove() local
1081 cdev = sch_get_cdev(sch); in io_subchannel_remove()
1082 if (!cdev) in io_subchannel_remove()
1085 ccw_device_unregister(cdev); in io_subchannel_remove()
1098 struct ccw_device *cdev; in io_subchannel_verify() local
1100 cdev = sch_get_cdev(sch); in io_subchannel_verify()
1101 if (cdev) in io_subchannel_verify()
1102 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in io_subchannel_verify()
1107 struct ccw_device *cdev; in io_subchannel_terminate_path() local
1109 cdev = sch_get_cdev(sch); in io_subchannel_terminate_path()
1110 if (!cdev) in io_subchannel_terminate_path()
1117 if (cdev->private->state == DEV_STATE_ONLINE) { in io_subchannel_terminate_path()
1118 ccw_device_kill_io(cdev); in io_subchannel_terminate_path()
1125 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in io_subchannel_terminate_path()
1129 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in io_subchannel_terminate_path()
1135 struct ccw_device *cdev = sch_get_cdev(sch); in io_subchannel_chp_event() local
1145 if (cdev) in io_subchannel_chp_event()
1146 cdev->private->path_gone_mask |= mask; in io_subchannel_chp_event()
1152 if (cdev) in io_subchannel_chp_event()
1153 cdev->private->path_new_mask |= mask; in io_subchannel_chp_event()
1159 if (cdev) in io_subchannel_chp_event()
1160 cdev->private->path_gone_mask |= mask; in io_subchannel_chp_event()
1167 if (cdev) in io_subchannel_chp_event()
1168 cdev->private->path_new_mask |= mask; in io_subchannel_chp_event()
1177 struct ccw_device *cdev; in io_subchannel_quiesce() local
1181 cdev = sch_get_cdev(sch); in io_subchannel_quiesce()
1189 if (cdev->handler) in io_subchannel_quiesce()
1190 cdev->handler(cdev, cdev->private->intparm, ERR_PTR(-EIO)); in io_subchannel_quiesce()
1192 cdev->private->state = DEV_STATE_QUIESCE; in io_subchannel_quiesce()
1193 cdev->private->iretry = 255; in io_subchannel_quiesce()
1194 ret = ccw_device_cancel_halt_clear(cdev); in io_subchannel_quiesce()
1196 ccw_device_set_timeout(cdev, HZ/10); in io_subchannel_quiesce()
1198 wait_event(cdev->private->wait_q, in io_subchannel_quiesce()
1199 cdev->private->state != DEV_STATE_QUIESCE); in io_subchannel_quiesce()
1213 static int device_is_disconnected(struct ccw_device *cdev) in device_is_disconnected() argument
1215 if (!cdev) in device_is_disconnected()
1217 return (cdev->private->state == DEV_STATE_DISCONNECTED || in device_is_disconnected()
1218 cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID); in device_is_disconnected()
1223 struct ccw_device *cdev = to_ccwdev(dev); in recovery_check() local
1227 spin_lock_irq(cdev->ccwlock); in recovery_check()
1228 switch (cdev->private->state) { in recovery_check()
1230 sch = to_subchannel(cdev->dev.parent); in recovery_check()
1236 cdev->private->dev_id.ssid, in recovery_check()
1237 cdev->private->dev_id.devno); in recovery_check()
1238 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in recovery_check()
1245 spin_unlock_irq(cdev->ccwlock); in recovery_check()
1294 struct ccw_device *cdev = to_ccwdev(dev); in purge_fn() local
1295 struct ccw_dev_id *id = &cdev->private->dev_id; in purge_fn()
1297 spin_lock_irq(cdev->ccwlock); in purge_fn()
1299 (cdev->private->state == DEV_STATE_OFFLINE) && in purge_fn()
1300 (atomic_cmpxchg(&cdev->private->onoff, 0, 1) == 0)) { in purge_fn()
1303 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in purge_fn()
1304 atomic_set(&cdev->private->onoff, 0); in purge_fn()
1306 spin_unlock_irq(cdev->ccwlock); in purge_fn()
1326 void ccw_device_set_disconnected(struct ccw_device *cdev) in ccw_device_set_disconnected() argument
1328 if (!cdev) in ccw_device_set_disconnected()
1330 ccw_device_set_timeout(cdev, 0); in ccw_device_set_disconnected()
1331 cdev->private->flags.fake_irb = 0; in ccw_device_set_disconnected()
1332 cdev->private->state = DEV_STATE_DISCONNECTED; in ccw_device_set_disconnected()
1333 if (cdev->online) in ccw_device_set_disconnected()
1337 void ccw_device_set_notoper(struct ccw_device *cdev) in ccw_device_set_notoper() argument
1339 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_set_notoper()
1343 ccw_device_set_timeout(cdev, 0); in ccw_device_set_notoper()
1345 cdev->private->state = DEV_STATE_NOT_OPER; in ccw_device_set_notoper()
1362 struct ccw_device *cdev; in sch_get_action() local
1364 cdev = sch_get_cdev(sch); in sch_get_action()
1367 if (!cdev) in sch_get_action()
1369 if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK) in sch_get_action()
1374 if (!cdev) in sch_get_action()
1376 if (sch->schib.pmcw.dev != cdev->private->dev_id.devno) { in sch_get_action()
1377 if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK) in sch_get_action()
1382 if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK) in sch_get_action()
1386 if (device_is_disconnected(cdev)) in sch_get_action()
1388 if (cdev->online && !cdev->private->flags.resuming) in sch_get_action()
1390 if (cdev->private->state == DEV_STATE_NOT_OPER) in sch_get_action()
1408 struct ccw_device *cdev; in io_subchannel_sch_event() local
1418 cdev = sch_get_cdev(sch); in io_subchannel_sch_event()
1419 if (cdev && work_pending(&cdev->private->todo_work)) in io_subchannel_sch_event()
1429 ccw_device_trigger_reprobe(cdev); in io_subchannel_sch_event()
1438 ccw_device_set_disconnected(cdev); in io_subchannel_sch_event()
1443 ccw_device_set_disconnected(cdev); in io_subchannel_sch_event()
1447 if (!cdev) in io_subchannel_sch_event()
1449 if (cdev->private->state == DEV_STATE_SENSE_ID) { in io_subchannel_sch_event()
1455 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in io_subchannel_sch_event()
1457 ccw_device_set_notoper(cdev); in io_subchannel_sch_event()
1474 rc = ccw_device_move_to_orph(cdev); in io_subchannel_sch_event()
1480 if (cdev->private->flags.resuming) { in io_subchannel_sch_event()
1488 ccw_device_unregister(cdev); in io_subchannel_sch_event()
1497 if (!cdev || !cdev->private->flags.resuming) in io_subchannel_sch_event()
1505 cdev = get_ccwdev_by_dev_id(&dev_id); in io_subchannel_sch_event()
1506 if (!cdev) { in io_subchannel_sch_event()
1510 rc = ccw_device_move_to_sch(cdev, sch); in io_subchannel_sch_event()
1513 put_device(&cdev->dev); in io_subchannel_sch_event()
1517 ccw_device_trigger_reprobe(cdev); in io_subchannel_sch_event()
1520 put_device(&cdev->dev); in io_subchannel_sch_event()
1533 static void ccw_device_set_int_class(struct ccw_device *cdev) in ccw_device_set_int_class() argument
1535 struct ccw_driver *cdrv = cdev->drv; in ccw_device_set_int_class()
1540 cdev->private->int_class = cdrv->int_class; in ccw_device_set_int_class()
1542 cdev->private->int_class = IRQIO_CIO; in ccw_device_set_int_class()
1546 int __init ccw_device_enable_console(struct ccw_device *cdev) in ccw_device_enable_console() argument
1548 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_enable_console()
1551 if (!cdev->drv || !cdev->handler) in ccw_device_enable_console()
1559 io_subchannel_recog(cdev, sch); in ccw_device_enable_console()
1561 spin_lock_irq(cdev->ccwlock); in ccw_device_enable_console()
1562 while (!dev_fsm_final_state(cdev)) in ccw_device_enable_console()
1563 ccw_device_wait_idle(cdev); in ccw_device_enable_console()
1566 get_device(&cdev->dev); in ccw_device_enable_console()
1567 rc = ccw_device_online(cdev); in ccw_device_enable_console()
1571 while (!dev_fsm_final_state(cdev)) in ccw_device_enable_console()
1572 ccw_device_wait_idle(cdev); in ccw_device_enable_console()
1574 if (cdev->private->state == DEV_STATE_ONLINE) in ccw_device_enable_console()
1575 cdev->online = 1; in ccw_device_enable_console()
1579 spin_unlock_irq(cdev->ccwlock); in ccw_device_enable_console()
1581 put_device(&cdev->dev); in ccw_device_enable_console()
1588 struct ccw_device *cdev; in ccw_device_create_console() local
1601 cdev = io_subchannel_create_ccwdev(sch); in ccw_device_create_console()
1602 if (IS_ERR(cdev)) { in ccw_device_create_console()
1605 return cdev; in ccw_device_create_console()
1607 cdev->drv = drv; in ccw_device_create_console()
1608 ccw_device_set_int_class(cdev); in ccw_device_create_console()
1609 return cdev; in ccw_device_create_console()
1612 void __init ccw_device_destroy_console(struct ccw_device *cdev) in ccw_device_destroy_console() argument
1614 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_destroy_console()
1619 put_device(&cdev->dev); in ccw_device_destroy_console()
1631 void ccw_device_wait_idle(struct ccw_device *cdev) in ccw_device_wait_idle() argument
1633 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_wait_idle()
1645 int ccw_device_force_console(struct ccw_device *cdev) in ccw_device_force_console() argument
1647 return ccw_device_pm_restore(&cdev->dev); in ccw_device_force_console()
1701 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_probe() local
1705 cdev->drv = cdrv; /* to let the driver call _set_online */ in ccw_device_probe()
1706 ccw_device_set_int_class(cdev); in ccw_device_probe()
1707 ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; in ccw_device_probe()
1709 cdev->drv = NULL; in ccw_device_probe()
1710 cdev->private->int_class = IRQIO_CIO; in ccw_device_probe()
1719 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_remove() local
1720 struct ccw_driver *cdrv = cdev->drv; in ccw_device_remove()
1725 cdrv->remove(cdev); in ccw_device_remove()
1727 spin_lock_irq(cdev->ccwlock); in ccw_device_remove()
1728 if (cdev->online) { in ccw_device_remove()
1729 cdev->online = 0; in ccw_device_remove()
1730 ret = ccw_device_offline(cdev); in ccw_device_remove()
1731 spin_unlock_irq(cdev->ccwlock); in ccw_device_remove()
1733 wait_event(cdev->private->wait_q, in ccw_device_remove()
1734 dev_fsm_final_state(cdev)); in ccw_device_remove()
1738 ret, cdev->private->dev_id.ssid, in ccw_device_remove()
1739 cdev->private->dev_id.devno); in ccw_device_remove()
1741 put_device(&cdev->dev); in ccw_device_remove()
1742 spin_lock_irq(cdev->ccwlock); in ccw_device_remove()
1744 ccw_device_set_timeout(cdev, 0); in ccw_device_remove()
1745 cdev->drv = NULL; in ccw_device_remove()
1746 cdev->private->int_class = IRQIO_CIO; in ccw_device_remove()
1747 sch = to_subchannel(cdev->dev.parent); in ccw_device_remove()
1748 spin_unlock_irq(cdev->ccwlock); in ccw_device_remove()
1750 __disable_cmf(cdev); in ccw_device_remove()
1757 struct ccw_device *cdev; in ccw_device_shutdown() local
1759 cdev = to_ccwdev(dev); in ccw_device_shutdown()
1760 if (cdev->drv && cdev->drv->shutdown) in ccw_device_shutdown()
1761 cdev->drv->shutdown(cdev); in ccw_device_shutdown()
1762 __disable_cmf(cdev); in ccw_device_shutdown()
1767 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_prepare() local
1769 if (work_pending(&cdev->private->todo_work)) in ccw_device_pm_prepare()
1772 if (atomic_read(&cdev->private->onoff)) in ccw_device_pm_prepare()
1775 if (cdev->online && cdev->drv && cdev->drv->prepare) in ccw_device_pm_prepare()
1776 return cdev->drv->prepare(cdev); in ccw_device_pm_prepare()
1783 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_complete() local
1785 if (cdev->online && cdev->drv && cdev->drv->complete) in ccw_device_pm_complete()
1786 cdev->drv->complete(cdev); in ccw_device_pm_complete()
1791 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_freeze() local
1792 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_freeze()
1796 if (!dev_fsm_final_state(cdev)) in ccw_device_pm_freeze()
1798 if (!cdev->online) in ccw_device_pm_freeze()
1800 if (cdev->drv && cdev->drv->freeze) { in ccw_device_pm_freeze()
1801 ret = cdev->drv->freeze(cdev); in ccw_device_pm_freeze()
1807 cm_enabled = cdev->private->cmb != NULL; in ccw_device_pm_freeze()
1811 ret = ccw_set_cmf(cdev, 0); in ccw_device_pm_freeze()
1825 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_thaw() local
1826 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_thaw()
1829 if (!cdev->online) in ccw_device_pm_thaw()
1835 cm_enabled = cdev->private->cmb != NULL; in ccw_device_pm_thaw()
1841 ret = ccw_set_cmf(cdev, 1); in ccw_device_pm_thaw()
1846 if (cdev->drv && cdev->drv->thaw) in ccw_device_pm_thaw()
1847 ret = cdev->drv->thaw(cdev); in ccw_device_pm_thaw()
1852 static void __ccw_device_pm_restore(struct ccw_device *cdev) in __ccw_device_pm_restore() argument
1854 struct subchannel *sch = to_subchannel(cdev->dev.parent); in __ccw_device_pm_restore()
1865 cdev->private->flags.resuming = 1; in __ccw_device_pm_restore()
1866 cdev->private->path_new_mask = LPM_ANYPATH; in __ccw_device_pm_restore()
1872 sch = to_subchannel(cdev->dev.parent); in __ccw_device_pm_restore()
1874 if (cdev->private->state != DEV_STATE_ONLINE && in __ccw_device_pm_restore()
1875 cdev->private->state != DEV_STATE_OFFLINE) in __ccw_device_pm_restore()
1878 ccw_device_recognition(cdev); in __ccw_device_pm_restore()
1880 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev) || in __ccw_device_pm_restore()
1881 cdev->private->state == DEV_STATE_DISCONNECTED); in __ccw_device_pm_restore()
1885 cdev->private->flags.resuming = 0; in __ccw_device_pm_restore()
1889 static int resume_handle_boxed(struct ccw_device *cdev) in resume_handle_boxed() argument
1891 cdev->private->state = DEV_STATE_BOXED; in resume_handle_boxed()
1892 if (ccw_device_notify(cdev, CIO_BOXED) == NOTIFY_OK) in resume_handle_boxed()
1894 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in resume_handle_boxed()
1898 static int resume_handle_disc(struct ccw_device *cdev) in resume_handle_disc() argument
1900 cdev->private->state = DEV_STATE_DISCONNECTED; in resume_handle_disc()
1901 if (ccw_device_notify(cdev, CIO_GONE) == NOTIFY_OK) in resume_handle_disc()
1903 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in resume_handle_disc()
1909 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_restore() local
1913 __ccw_device_pm_restore(cdev); in ccw_device_pm_restore()
1914 sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_restore()
1920 switch (cdev->private->state) { in ccw_device_pm_restore()
1923 cdev->private->flags.donotify = 0; in ccw_device_pm_restore()
1926 ret = resume_handle_boxed(cdev); in ccw_device_pm_restore()
1931 ret = resume_handle_disc(cdev); in ccw_device_pm_restore()
1937 if (!ccw_device_test_sense_data(cdev)) { in ccw_device_pm_restore()
1938 ccw_device_update_sense_data(cdev); in ccw_device_pm_restore()
1939 ccw_device_sched_todo(cdev, CDEV_TODO_REBIND); in ccw_device_pm_restore()
1943 if (!cdev->online) in ccw_device_pm_restore()
1946 if (ccw_device_online(cdev)) { in ccw_device_pm_restore()
1947 ret = resume_handle_disc(cdev); in ccw_device_pm_restore()
1953 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); in ccw_device_pm_restore()
1956 if (ccw_device_notify(cdev, CIO_OPER) == NOTIFY_BAD) { in ccw_device_pm_restore()
1957 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in ccw_device_pm_restore()
1963 if (cdev->private->cmb) { in ccw_device_pm_restore()
1965 ret = ccw_set_cmf(cdev, 1); in ccw_device_pm_restore()
1969 "(rc=%d)\n", cdev->private->dev_id.ssid, in ccw_device_pm_restore()
1970 cdev->private->dev_id.devno, ret); in ccw_device_pm_restore()
1977 if (cdev->online && cdev->drv && cdev->drv->restore) in ccw_device_pm_restore()
1978 ret = cdev->drv->restore(cdev); in ccw_device_pm_restore()
2035 struct ccw_device *cdev; in ccw_device_todo() local
2040 cdev = priv->cdev; in ccw_device_todo()
2041 sch = to_subchannel(cdev->dev.parent); in ccw_device_todo()
2043 spin_lock_irq(cdev->ccwlock); in ccw_device_todo()
2048 spin_unlock_irq(cdev->ccwlock); in ccw_device_todo()
2052 cmf_reenable(cdev); in ccw_device_todo()
2055 ccw_device_do_unbind_bind(cdev); in ccw_device_todo()
2058 io_subchannel_register(cdev); in ccw_device_todo()
2066 ccw_device_unregister(cdev); in ccw_device_todo()
2068 ccw_device_call_sch_unregister(cdev); in ccw_device_todo()
2074 put_device(&cdev->dev); in ccw_device_todo()
2086 void ccw_device_sched_todo(struct ccw_device *cdev, enum cdev_todo todo) in ccw_device_sched_todo() argument
2089 cdev->private->dev_id.ssid, cdev->private->dev_id.devno, in ccw_device_sched_todo()
2091 if (cdev->private->todo >= todo) in ccw_device_sched_todo()
2093 cdev->private->todo = todo; in ccw_device_sched_todo()
2095 if (!get_device(&cdev->dev)) in ccw_device_sched_todo()
2097 if (!queue_work(cio_work_q, &cdev->private->todo_work)) { in ccw_device_sched_todo()
2099 put_device(&cdev->dev); in ccw_device_sched_todo()
2110 int ccw_device_siosl(struct ccw_device *cdev) in ccw_device_siosl() argument
2112 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_siosl()