Lines Matching refs:cdev

63 	struct ccw_device *cdev = to_ccwdev(dev);  in ccw_bus_match()  local
70 found = ccw_device_id_match(ids, &cdev->id); in ccw_bus_match()
74 cdev->id.driver_info = found->driver_info; in ccw_bus_match()
106 struct ccw_device *cdev = to_ccwdev(dev); in ccw_uevent() local
107 struct ccw_device_id *id = &(cdev->id); in ccw_uevent()
154 struct ccw_device *cdev; in io_subchannel_prepare() local
159 cdev = sch_get_cdev(sch); in io_subchannel_prepare()
160 if (cdev && !device_is_registered(&cdev->dev)) in io_subchannel_prepare()
214 struct ccw_device *cdev = to_ccwdev(dev); in devtype_show() local
215 struct ccw_device_id *id = &(cdev->id); in devtype_show()
227 struct ccw_device *cdev = to_ccwdev(dev); in cutype_show() local
228 struct ccw_device_id *id = &(cdev->id); in cutype_show()
237 struct ccw_device *cdev = to_ccwdev(dev); in modalias_show() local
238 struct ccw_device_id *id = &(cdev->id); in modalias_show()
249 struct ccw_device *cdev = to_ccwdev(dev); in online_show() local
251 return sprintf(buf, cdev->online ? "1\n" : "0\n"); in online_show()
254 int ccw_device_is_orphan(struct ccw_device *cdev) in ccw_device_is_orphan() argument
256 return sch_is_pseudo_sch(to_subchannel(cdev->dev.parent)); in ccw_device_is_orphan()
259 static void ccw_device_unregister(struct ccw_device *cdev) in ccw_device_unregister() argument
261 if (device_is_registered(&cdev->dev)) { in ccw_device_unregister()
263 device_del(&cdev->dev); in ccw_device_unregister()
265 if (cdev->private->flags.initialized) { in ccw_device_unregister()
266 cdev->private->flags.initialized = 0; in ccw_device_unregister()
268 put_device(&cdev->dev); in ccw_device_unregister()
285 int ccw_device_set_offline(struct ccw_device *cdev) in ccw_device_set_offline() argument
290 if (!cdev) in ccw_device_set_offline()
292 if (!cdev->online || !cdev->drv) in ccw_device_set_offline()
295 if (cdev->drv->set_offline) { in ccw_device_set_offline()
296 ret = cdev->drv->set_offline(cdev); in ccw_device_set_offline()
300 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
301 sch = to_subchannel(cdev->dev.parent); in ccw_device_set_offline()
302 cdev->online = 0; in ccw_device_set_offline()
304 while (!dev_fsm_final_state(cdev) && in ccw_device_set_offline()
305 cdev->private->state != DEV_STATE_DISCONNECTED) { in ccw_device_set_offline()
306 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
307 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_offline()
308 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_offline()
309 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
312 ret = ccw_device_offline(cdev); in ccw_device_set_offline()
316 "0.%x.%04x\n", ret, cdev->private->dev_id.ssid, in ccw_device_set_offline()
317 cdev->private->dev_id.devno); in ccw_device_set_offline()
320 state = cdev->private->state; in ccw_device_set_offline()
321 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
323 spin_lock_irq(cdev->ccwlock); in ccw_device_set_offline()
324 cdev->private->state = state; in ccw_device_set_offline()
326 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
327 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_offline()
328 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_offline()
330 if (cdev->private->state == DEV_STATE_BOXED) { in ccw_device_set_offline()
332 dev_name(&cdev->dev)); in ccw_device_set_offline()
333 } else if (cdev->private->state == DEV_STATE_NOT_OPER) { in ccw_device_set_offline()
335 dev_name(&cdev->dev)); in ccw_device_set_offline()
338 put_device(&cdev->dev); in ccw_device_set_offline()
342 cdev->private->state = DEV_STATE_OFFLINE; in ccw_device_set_offline()
343 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in ccw_device_set_offline()
344 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_offline()
346 put_device(&cdev->dev); in ccw_device_set_offline()
362 int ccw_device_set_online(struct ccw_device *cdev) in ccw_device_set_online() argument
367 if (!cdev) in ccw_device_set_online()
369 if (cdev->online || !cdev->drv) in ccw_device_set_online()
372 if (!get_device(&cdev->dev)) in ccw_device_set_online()
375 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
376 ret = ccw_device_online(cdev); in ccw_device_set_online()
377 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
379 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); in ccw_device_set_online()
383 ret, cdev->private->dev_id.ssid, in ccw_device_set_online()
384 cdev->private->dev_id.devno); in ccw_device_set_online()
386 put_device(&cdev->dev); in ccw_device_set_online()
389 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
391 if ((cdev->private->state != DEV_STATE_ONLINE) && in ccw_device_set_online()
392 (cdev->private->state != DEV_STATE_W4SENSE)) { in ccw_device_set_online()
393 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
395 if (cdev->private->state == DEV_STATE_BOXED) { in ccw_device_set_online()
397 dev_name(&cdev->dev)); in ccw_device_set_online()
398 } else if (cdev->private->state == DEV_STATE_NOT_OPER) { in ccw_device_set_online()
400 dev_name(&cdev->dev)); in ccw_device_set_online()
403 put_device(&cdev->dev); in ccw_device_set_online()
406 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
407 if (cdev->drv->set_online) in ccw_device_set_online()
408 ret = cdev->drv->set_online(cdev); in ccw_device_set_online()
412 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
413 cdev->online = 1; in ccw_device_set_online()
414 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
418 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
420 while (!dev_fsm_final_state(cdev) && in ccw_device_set_online()
421 cdev->private->state != DEV_STATE_DISCONNECTED) { in ccw_device_set_online()
422 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
423 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_online()
424 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_online()
425 spin_lock_irq(cdev->ccwlock); in ccw_device_set_online()
427 ret2 = ccw_device_offline(cdev); in ccw_device_set_online()
430 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
431 wait_event(cdev->private->wait_q, (dev_fsm_final_state(cdev) || in ccw_device_set_online()
432 cdev->private->state == DEV_STATE_DISCONNECTED)); in ccw_device_set_online()
434 put_device(&cdev->dev); in ccw_device_set_online()
440 ret2, cdev->private->dev_id.ssid, in ccw_device_set_online()
441 cdev->private->dev_id.devno); in ccw_device_set_online()
442 cdev->private->state = DEV_STATE_OFFLINE; in ccw_device_set_online()
443 spin_unlock_irq(cdev->ccwlock); in ccw_device_set_online()
445 put_device(&cdev->dev); in ccw_device_set_online()
449 static int online_store_handle_offline(struct ccw_device *cdev) in online_store_handle_offline() argument
451 if (cdev->private->state == DEV_STATE_DISCONNECTED) { in online_store_handle_offline()
452 spin_lock_irq(cdev->ccwlock); in online_store_handle_offline()
453 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG_EVAL); in online_store_handle_offline()
454 spin_unlock_irq(cdev->ccwlock); in online_store_handle_offline()
457 if (cdev->drv && cdev->drv->set_offline) in online_store_handle_offline()
458 return ccw_device_set_offline(cdev); in online_store_handle_offline()
462 static int online_store_recog_and_online(struct ccw_device *cdev) in online_store_recog_and_online() argument
465 if (cdev->private->state == DEV_STATE_BOXED) { in online_store_recog_and_online()
466 spin_lock_irq(cdev->ccwlock); in online_store_recog_and_online()
467 ccw_device_recognition(cdev); in online_store_recog_and_online()
468 spin_unlock_irq(cdev->ccwlock); in online_store_recog_and_online()
469 wait_event(cdev->private->wait_q, in online_store_recog_and_online()
470 cdev->private->flags.recog_done); in online_store_recog_and_online()
471 if (cdev->private->state != DEV_STATE_OFFLINE) in online_store_recog_and_online()
475 if (cdev->drv && cdev->drv->set_online) in online_store_recog_and_online()
476 return ccw_device_set_online(cdev); in online_store_recog_and_online()
480 static int online_store_handle_online(struct ccw_device *cdev, int force) in online_store_handle_online() argument
484 ret = online_store_recog_and_online(cdev); in online_store_handle_online()
487 if (force && cdev->private->state == DEV_STATE_BOXED) { in online_store_handle_online()
488 ret = ccw_device_stlck(cdev); in online_store_handle_online()
491 if (cdev->id.cu_type == 0) in online_store_handle_online()
492 cdev->private->state = DEV_STATE_NOT_OPER; in online_store_handle_online()
493 ret = online_store_recog_and_online(cdev); in online_store_handle_online()
503 struct ccw_device *cdev = to_ccwdev(dev); in online_store() local
508 if (atomic_cmpxchg(&cdev->private->onoff, 0, 1) != 0) in online_store()
511 if (!dev_fsm_final_state(cdev) && in online_store()
512 cdev->private->state != DEV_STATE_DISCONNECTED) { in online_store()
517 if (work_pending(&cdev->private->todo_work)) { in online_store()
535 ret = online_store_handle_offline(cdev); in online_store()
538 ret = online_store_handle_online(cdev, force); in online_store()
546 atomic_set(&cdev->private->onoff, 0); in online_store()
553 struct ccw_device *cdev = to_ccwdev(dev); in available_show() local
556 if (ccw_device_is_orphan(cdev)) in available_show()
558 switch (cdev->private->state) { in available_show()
638 static int ccw_device_add(struct ccw_device *cdev) in ccw_device_add() argument
640 struct device *dev = &cdev->dev; in ccw_device_add()
648 struct ccw_device *cdev = to_ccwdev(dev); in match_dev_id() local
651 return ccw_dev_id_is_equal(&cdev->private->dev_id, dev_id); in match_dev_id()
674 static void ccw_device_do_unbind_bind(struct ccw_device *cdev) in ccw_device_do_unbind_bind() argument
678 if (device_is_registered(&cdev->dev)) { in ccw_device_do_unbind_bind()
679 device_release_driver(&cdev->dev); in ccw_device_do_unbind_bind()
680 ret = device_attach(&cdev->dev); in ccw_device_do_unbind_bind()
688 struct ccw_device *cdev; in ccw_device_release() local
690 cdev = to_ccwdev(dev); in ccw_device_release()
691 cio_gp_dma_free(cdev->private->dma_pool, cdev->private->dma_area, in ccw_device_release()
692 sizeof(*cdev->private->dma_area)); in ccw_device_release()
693 cio_gp_dma_destroy(cdev->private->dma_pool, &cdev->dev); in ccw_device_release()
695 put_device(cdev->dev.parent); in ccw_device_release()
696 kfree(cdev->private); in ccw_device_release()
697 kfree(cdev); in ccw_device_release()
702 struct ccw_device *cdev; in io_subchannel_allocate_dev() local
705 cdev = kzalloc(sizeof(*cdev), GFP_KERNEL); in io_subchannel_allocate_dev()
706 if (!cdev) in io_subchannel_allocate_dev()
708 cdev->private = kzalloc(sizeof(struct ccw_device_private), in io_subchannel_allocate_dev()
710 if (!cdev->private) in io_subchannel_allocate_dev()
712 cdev->dev.coherent_dma_mask = sch->dev.coherent_dma_mask; in io_subchannel_allocate_dev()
713 cdev->dev.dma_mask = sch->dev.dma_mask; in io_subchannel_allocate_dev()
714 dma_pool = cio_gp_dma_create(&cdev->dev, 1); in io_subchannel_allocate_dev()
717 cdev->private->dma_pool = dma_pool; in io_subchannel_allocate_dev()
718 cdev->private->dma_area = cio_gp_dma_zalloc(dma_pool, &cdev->dev, in io_subchannel_allocate_dev()
719 sizeof(*cdev->private->dma_area)); in io_subchannel_allocate_dev()
720 if (!cdev->private->dma_area) in io_subchannel_allocate_dev()
722 return cdev; in io_subchannel_allocate_dev()
724 cio_gp_dma_destroy(dma_pool, &cdev->dev); in io_subchannel_allocate_dev()
726 kfree(cdev->private); in io_subchannel_allocate_dev()
728 kfree(cdev); in io_subchannel_allocate_dev()
736 struct ccw_device *cdev) in io_subchannel_initialize_dev() argument
738 struct ccw_device_private *priv = cdev->private; in io_subchannel_initialize_dev()
741 priv->cdev = cdev; in io_subchannel_initialize_dev()
753 cdev->ccwlock = sch->lock; in io_subchannel_initialize_dev()
754 cdev->dev.parent = &sch->dev; in io_subchannel_initialize_dev()
755 cdev->dev.release = ccw_device_release; in io_subchannel_initialize_dev()
756 cdev->dev.groups = ccwdev_attr_groups; in io_subchannel_initialize_dev()
758 device_initialize(&cdev->dev); in io_subchannel_initialize_dev()
759 ret = dev_set_name(&cdev->dev, "0.%x.%04x", cdev->private->dev_id.ssid, in io_subchannel_initialize_dev()
760 cdev->private->dev_id.devno); in io_subchannel_initialize_dev()
769 sch_set_cdev(sch, cdev); in io_subchannel_initialize_dev()
775 put_device(&cdev->dev); in io_subchannel_initialize_dev()
781 struct ccw_device *cdev; in io_subchannel_create_ccwdev() local
784 cdev = io_subchannel_allocate_dev(sch); in io_subchannel_create_ccwdev()
785 if (!IS_ERR(cdev)) { in io_subchannel_create_ccwdev()
786 ret = io_subchannel_initialize_dev(sch, cdev); in io_subchannel_create_ccwdev()
788 cdev = ERR_PTR(ret); in io_subchannel_create_ccwdev()
790 return cdev; in io_subchannel_create_ccwdev()
797 struct ccw_device *cdev; in sch_create_and_recog_new_device() local
800 cdev = io_subchannel_create_ccwdev(sch); in sch_create_and_recog_new_device()
801 if (IS_ERR(cdev)) { in sch_create_and_recog_new_device()
807 io_subchannel_recog(cdev, sch); in sch_create_and_recog_new_device()
813 static void io_subchannel_register(struct ccw_device *cdev) in io_subchannel_register() argument
819 sch = to_subchannel(cdev->dev.parent); in io_subchannel_register()
835 if (device_is_registered(&cdev->dev)) { in io_subchannel_register()
836 if (!cdev->drv) { in io_subchannel_register()
837 ret = device_reprobe(&cdev->dev); in io_subchannel_register()
842 cdev->private->dev_id.ssid, in io_subchannel_register()
843 cdev->private->dev_id.devno); in io_subchannel_register()
857 ret = ccw_device_add(cdev); in io_subchannel_register()
860 cdev->private->dev_id.ssid, in io_subchannel_register()
861 cdev->private->dev_id.devno, ret); in io_subchannel_register()
866 put_device(&cdev->dev); in io_subchannel_register()
870 cdev->private->flags.recog_done = 1; in io_subchannel_register()
871 wake_up(&cdev->private->wait_q); in io_subchannel_register()
877 static void ccw_device_call_sch_unregister(struct ccw_device *cdev) in ccw_device_call_sch_unregister() argument
882 if (!get_device(cdev->dev.parent)) in ccw_device_call_sch_unregister()
884 sch = to_subchannel(cdev->dev.parent); in ccw_device_call_sch_unregister()
894 io_subchannel_recog_done(struct ccw_device *cdev) in io_subchannel_recog_done() argument
897 cdev->private->flags.recog_done = 1; in io_subchannel_recog_done()
900 switch (cdev->private->state) { in io_subchannel_recog_done()
904 cdev->private->flags.recog_done = 1; in io_subchannel_recog_done()
906 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in io_subchannel_recog_done()
915 ccw_device_sched_todo(cdev, CDEV_TODO_REGISTER); in io_subchannel_recog_done()
920 static void io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch) in io_subchannel_recog() argument
927 ccw_device_recognition(cdev); in io_subchannel_recog()
931 static int ccw_device_move_to_sch(struct ccw_device *cdev, in ccw_device_move_to_sch() argument
937 old_sch = to_subchannel(cdev->dev.parent); in ccw_device_move_to_sch()
957 rc = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV); in ccw_device_move_to_sch()
961 cdev->private->dev_id.ssid, in ccw_device_move_to_sch()
962 cdev->private->dev_id.devno, sch->schid.ssid, in ccw_device_move_to_sch()
985 cdev->ccwlock = sch->lock; in ccw_device_move_to_sch()
987 sch_set_cdev(sch, cdev); in ccw_device_move_to_sch()
994 static int ccw_device_move_to_orph(struct ccw_device *cdev) in ccw_device_move_to_orph() argument
996 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_move_to_orph()
999 return ccw_device_move_to_sch(cdev, css->pseudo_subchannel); in ccw_device_move_to_orph()
1004 struct ccw_device *cdev; in io_subchannel_irq() local
1006 cdev = sch_get_cdev(sch); in io_subchannel_irq()
1010 if (cdev) in io_subchannel_irq()
1011 dev_fsm_event(cdev, DEV_EVENT_INTERRUPT); in io_subchannel_irq()
1047 struct ccw_device *cdev; in io_subchannel_probe() local
1068 cdev = sch_get_cdev(sch); in io_subchannel_probe()
1069 rc = ccw_device_add(cdev); in io_subchannel_probe()
1072 put_device(&cdev->dev); in io_subchannel_probe()
1114 struct ccw_device *cdev; in io_subchannel_remove() local
1116 cdev = sch_get_cdev(sch); in io_subchannel_remove()
1117 if (!cdev) in io_subchannel_remove()
1120 ccw_device_unregister(cdev); in io_subchannel_remove()
1135 struct ccw_device *cdev; in io_subchannel_verify() local
1137 cdev = sch_get_cdev(sch); in io_subchannel_verify()
1138 if (cdev) in io_subchannel_verify()
1139 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in io_subchannel_verify()
1144 struct ccw_device *cdev; in io_subchannel_terminate_path() local
1146 cdev = sch_get_cdev(sch); in io_subchannel_terminate_path()
1147 if (!cdev) in io_subchannel_terminate_path()
1154 if (cdev->private->state == DEV_STATE_ONLINE) { in io_subchannel_terminate_path()
1155 ccw_device_kill_io(cdev); in io_subchannel_terminate_path()
1162 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in io_subchannel_terminate_path()
1166 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in io_subchannel_terminate_path()
1172 struct ccw_device *cdev = sch_get_cdev(sch); in io_subchannel_chp_event() local
1182 if (cdev) in io_subchannel_chp_event()
1183 cdev->private->path_gone_mask |= mask; in io_subchannel_chp_event()
1189 if (cdev) in io_subchannel_chp_event()
1190 cdev->private->path_new_mask |= mask; in io_subchannel_chp_event()
1196 if (cdev) in io_subchannel_chp_event()
1197 cdev->private->path_gone_mask |= mask; in io_subchannel_chp_event()
1204 if (cdev) in io_subchannel_chp_event()
1205 cdev->private->path_new_mask |= mask; in io_subchannel_chp_event()
1214 struct ccw_device *cdev; in io_subchannel_quiesce() local
1218 cdev = sch_get_cdev(sch); in io_subchannel_quiesce()
1226 if (cdev->handler) in io_subchannel_quiesce()
1227 cdev->handler(cdev, cdev->private->intparm, ERR_PTR(-EIO)); in io_subchannel_quiesce()
1229 cdev->private->state = DEV_STATE_QUIESCE; in io_subchannel_quiesce()
1230 cdev->private->iretry = 255; in io_subchannel_quiesce()
1231 ret = ccw_device_cancel_halt_clear(cdev); in io_subchannel_quiesce()
1233 ccw_device_set_timeout(cdev, HZ/10); in io_subchannel_quiesce()
1235 wait_event(cdev->private->wait_q, in io_subchannel_quiesce()
1236 cdev->private->state != DEV_STATE_QUIESCE); in io_subchannel_quiesce()
1250 static int device_is_disconnected(struct ccw_device *cdev) in device_is_disconnected() argument
1252 if (!cdev) in device_is_disconnected()
1254 return (cdev->private->state == DEV_STATE_DISCONNECTED || in device_is_disconnected()
1255 cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID); in device_is_disconnected()
1260 struct ccw_device *cdev = to_ccwdev(dev); in recovery_check() local
1264 spin_lock_irq(cdev->ccwlock); in recovery_check()
1265 switch (cdev->private->state) { in recovery_check()
1267 sch = to_subchannel(cdev->dev.parent); in recovery_check()
1273 cdev->private->dev_id.ssid, in recovery_check()
1274 cdev->private->dev_id.devno); in recovery_check()
1275 dev_fsm_event(cdev, DEV_EVENT_VERIFY); in recovery_check()
1282 spin_unlock_irq(cdev->ccwlock); in recovery_check()
1331 struct ccw_device *cdev = to_ccwdev(dev); in purge_fn() local
1332 struct ccw_dev_id *id = &cdev->private->dev_id; in purge_fn()
1334 spin_lock_irq(cdev->ccwlock); in purge_fn()
1336 (cdev->private->state == DEV_STATE_OFFLINE) && in purge_fn()
1337 (atomic_cmpxchg(&cdev->private->onoff, 0, 1) == 0)) { in purge_fn()
1340 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in purge_fn()
1341 atomic_set(&cdev->private->onoff, 0); in purge_fn()
1343 spin_unlock_irq(cdev->ccwlock); in purge_fn()
1363 void ccw_device_set_disconnected(struct ccw_device *cdev) in ccw_device_set_disconnected() argument
1365 if (!cdev) in ccw_device_set_disconnected()
1367 ccw_device_set_timeout(cdev, 0); in ccw_device_set_disconnected()
1368 cdev->private->flags.fake_irb = 0; in ccw_device_set_disconnected()
1369 cdev->private->state = DEV_STATE_DISCONNECTED; in ccw_device_set_disconnected()
1370 if (cdev->online) in ccw_device_set_disconnected()
1374 void ccw_device_set_notoper(struct ccw_device *cdev) in ccw_device_set_notoper() argument
1376 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_set_notoper()
1380 ccw_device_set_timeout(cdev, 0); in ccw_device_set_notoper()
1382 cdev->private->state = DEV_STATE_NOT_OPER; in ccw_device_set_notoper()
1399 struct ccw_device *cdev; in sch_get_action() local
1401 cdev = sch_get_cdev(sch); in sch_get_action()
1404 if (!cdev) in sch_get_action()
1406 if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK) in sch_get_action()
1411 if (!cdev) in sch_get_action()
1413 if (sch->schib.pmcw.dev != cdev->private->dev_id.devno) { in sch_get_action()
1414 if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK) in sch_get_action()
1419 if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK) in sch_get_action()
1423 if (device_is_disconnected(cdev)) in sch_get_action()
1425 if (cdev->online && !cdev->private->flags.resuming) in sch_get_action()
1427 if (cdev->private->state == DEV_STATE_NOT_OPER) in sch_get_action()
1445 struct ccw_device *cdev; in io_subchannel_sch_event() local
1455 cdev = sch_get_cdev(sch); in io_subchannel_sch_event()
1456 if (cdev && work_pending(&cdev->private->todo_work)) in io_subchannel_sch_event()
1466 ccw_device_trigger_reprobe(cdev); in io_subchannel_sch_event()
1475 ccw_device_set_disconnected(cdev); in io_subchannel_sch_event()
1480 ccw_device_set_disconnected(cdev); in io_subchannel_sch_event()
1484 if (!cdev) in io_subchannel_sch_event()
1486 if (cdev->private->state == DEV_STATE_SENSE_ID) { in io_subchannel_sch_event()
1492 dev_fsm_event(cdev, DEV_EVENT_NOTOPER); in io_subchannel_sch_event()
1494 ccw_device_set_notoper(cdev); in io_subchannel_sch_event()
1511 rc = ccw_device_move_to_orph(cdev); in io_subchannel_sch_event()
1517 if (cdev->private->flags.resuming) { in io_subchannel_sch_event()
1525 ccw_device_unregister(cdev); in io_subchannel_sch_event()
1534 if (!cdev || !cdev->private->flags.resuming) in io_subchannel_sch_event()
1542 cdev = get_ccwdev_by_dev_id(&dev_id); in io_subchannel_sch_event()
1543 if (!cdev) { in io_subchannel_sch_event()
1547 rc = ccw_device_move_to_sch(cdev, sch); in io_subchannel_sch_event()
1550 put_device(&cdev->dev); in io_subchannel_sch_event()
1554 ccw_device_trigger_reprobe(cdev); in io_subchannel_sch_event()
1557 put_device(&cdev->dev); in io_subchannel_sch_event()
1570 static void ccw_device_set_int_class(struct ccw_device *cdev) in ccw_device_set_int_class() argument
1572 struct ccw_driver *cdrv = cdev->drv; in ccw_device_set_int_class()
1577 cdev->private->int_class = cdrv->int_class; in ccw_device_set_int_class()
1579 cdev->private->int_class = IRQIO_CIO; in ccw_device_set_int_class()
1583 int __init ccw_device_enable_console(struct ccw_device *cdev) in ccw_device_enable_console() argument
1585 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_enable_console()
1588 if (!cdev->drv || !cdev->handler) in ccw_device_enable_console()
1596 io_subchannel_recog(cdev, sch); in ccw_device_enable_console()
1598 spin_lock_irq(cdev->ccwlock); in ccw_device_enable_console()
1599 while (!dev_fsm_final_state(cdev)) in ccw_device_enable_console()
1600 ccw_device_wait_idle(cdev); in ccw_device_enable_console()
1603 get_device(&cdev->dev); in ccw_device_enable_console()
1604 rc = ccw_device_online(cdev); in ccw_device_enable_console()
1608 while (!dev_fsm_final_state(cdev)) in ccw_device_enable_console()
1609 ccw_device_wait_idle(cdev); in ccw_device_enable_console()
1611 if (cdev->private->state == DEV_STATE_ONLINE) in ccw_device_enable_console()
1612 cdev->online = 1; in ccw_device_enable_console()
1616 spin_unlock_irq(cdev->ccwlock); in ccw_device_enable_console()
1618 put_device(&cdev->dev); in ccw_device_enable_console()
1625 struct ccw_device *cdev; in ccw_device_create_console() local
1641 cdev = io_subchannel_create_ccwdev(sch); in ccw_device_create_console()
1642 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()
1661 void __init ccw_device_destroy_console(struct ccw_device *cdev) in ccw_device_destroy_console() argument
1663 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_destroy_console()
1670 put_device(&cdev->dev); in ccw_device_destroy_console()
1682 void ccw_device_wait_idle(struct ccw_device *cdev) in ccw_device_wait_idle() argument
1684 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_wait_idle()
1696 int ccw_device_force_console(struct ccw_device *cdev) in ccw_device_force_console() argument
1698 return ccw_device_pm_restore(&cdev->dev); in ccw_device_force_console()
1737 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_probe() local
1741 cdev->drv = cdrv; /* to let the driver call _set_online */ in ccw_device_probe()
1742 ccw_device_set_int_class(cdev); in ccw_device_probe()
1743 ret = cdrv->probe ? cdrv->probe(cdev) : -ENODEV; in ccw_device_probe()
1745 cdev->drv = NULL; in ccw_device_probe()
1746 cdev->private->int_class = IRQIO_CIO; in ccw_device_probe()
1755 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_remove() local
1756 struct ccw_driver *cdrv = cdev->drv; in ccw_device_remove()
1761 cdrv->remove(cdev); in ccw_device_remove()
1763 spin_lock_irq(cdev->ccwlock); in ccw_device_remove()
1764 if (cdev->online) { in ccw_device_remove()
1765 cdev->online = 0; in ccw_device_remove()
1766 ret = ccw_device_offline(cdev); in ccw_device_remove()
1767 spin_unlock_irq(cdev->ccwlock); in ccw_device_remove()
1769 wait_event(cdev->private->wait_q, in ccw_device_remove()
1770 dev_fsm_final_state(cdev)); in ccw_device_remove()
1774 ret, cdev->private->dev_id.ssid, in ccw_device_remove()
1775 cdev->private->dev_id.devno); in ccw_device_remove()
1777 put_device(&cdev->dev); in ccw_device_remove()
1778 spin_lock_irq(cdev->ccwlock); in ccw_device_remove()
1780 ccw_device_set_timeout(cdev, 0); in ccw_device_remove()
1781 cdev->drv = NULL; in ccw_device_remove()
1782 cdev->private->int_class = IRQIO_CIO; in ccw_device_remove()
1783 sch = to_subchannel(cdev->dev.parent); in ccw_device_remove()
1784 spin_unlock_irq(cdev->ccwlock); in ccw_device_remove()
1786 __disable_cmf(cdev); in ccw_device_remove()
1793 struct ccw_device *cdev; in ccw_device_shutdown() local
1795 cdev = to_ccwdev(dev); in ccw_device_shutdown()
1796 if (cdev->drv && cdev->drv->shutdown) in ccw_device_shutdown()
1797 cdev->drv->shutdown(cdev); in ccw_device_shutdown()
1798 __disable_cmf(cdev); in ccw_device_shutdown()
1803 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_prepare() local
1805 if (work_pending(&cdev->private->todo_work)) in ccw_device_pm_prepare()
1808 if (atomic_read(&cdev->private->onoff)) in ccw_device_pm_prepare()
1811 if (cdev->online && cdev->drv && cdev->drv->prepare) in ccw_device_pm_prepare()
1812 return cdev->drv->prepare(cdev); in ccw_device_pm_prepare()
1819 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_complete() local
1821 if (cdev->online && cdev->drv && cdev->drv->complete) in ccw_device_pm_complete()
1822 cdev->drv->complete(cdev); in ccw_device_pm_complete()
1827 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_freeze() local
1828 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_freeze()
1832 if (!dev_fsm_final_state(cdev)) in ccw_device_pm_freeze()
1834 if (!cdev->online) in ccw_device_pm_freeze()
1836 if (cdev->drv && cdev->drv->freeze) { in ccw_device_pm_freeze()
1837 ret = cdev->drv->freeze(cdev); in ccw_device_pm_freeze()
1843 cm_enabled = cdev->private->cmb != NULL; in ccw_device_pm_freeze()
1847 ret = ccw_set_cmf(cdev, 0); in ccw_device_pm_freeze()
1861 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_thaw() local
1862 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_thaw()
1865 if (!cdev->online) in ccw_device_pm_thaw()
1871 cm_enabled = cdev->private->cmb != NULL; in ccw_device_pm_thaw()
1877 ret = ccw_set_cmf(cdev, 1); in ccw_device_pm_thaw()
1882 if (cdev->drv && cdev->drv->thaw) in ccw_device_pm_thaw()
1883 ret = cdev->drv->thaw(cdev); in ccw_device_pm_thaw()
1888 static void __ccw_device_pm_restore(struct ccw_device *cdev) in __ccw_device_pm_restore() argument
1890 struct subchannel *sch = to_subchannel(cdev->dev.parent); in __ccw_device_pm_restore()
1901 cdev->private->flags.resuming = 1; in __ccw_device_pm_restore()
1902 cdev->private->path_new_mask = LPM_ANYPATH; in __ccw_device_pm_restore()
1908 sch = to_subchannel(cdev->dev.parent); in __ccw_device_pm_restore()
1910 if (cdev->private->state != DEV_STATE_ONLINE && in __ccw_device_pm_restore()
1911 cdev->private->state != DEV_STATE_OFFLINE) in __ccw_device_pm_restore()
1914 ccw_device_recognition(cdev); in __ccw_device_pm_restore()
1916 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev) || in __ccw_device_pm_restore()
1917 cdev->private->state == DEV_STATE_DISCONNECTED); in __ccw_device_pm_restore()
1921 cdev->private->flags.resuming = 0; in __ccw_device_pm_restore()
1925 static int resume_handle_boxed(struct ccw_device *cdev) in resume_handle_boxed() argument
1927 cdev->private->state = DEV_STATE_BOXED; in resume_handle_boxed()
1928 if (ccw_device_notify(cdev, CIO_BOXED) == NOTIFY_OK) in resume_handle_boxed()
1930 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in resume_handle_boxed()
1934 static int resume_handle_disc(struct ccw_device *cdev) in resume_handle_disc() argument
1936 cdev->private->state = DEV_STATE_DISCONNECTED; in resume_handle_disc()
1937 if (ccw_device_notify(cdev, CIO_GONE) == NOTIFY_OK) in resume_handle_disc()
1939 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in resume_handle_disc()
1945 struct ccw_device *cdev = to_ccwdev(dev); in ccw_device_pm_restore() local
1949 __ccw_device_pm_restore(cdev); in ccw_device_pm_restore()
1950 sch = to_subchannel(cdev->dev.parent); in ccw_device_pm_restore()
1956 switch (cdev->private->state) { in ccw_device_pm_restore()
1959 cdev->private->flags.donotify = 0; in ccw_device_pm_restore()
1962 ret = resume_handle_boxed(cdev); in ccw_device_pm_restore()
1967 ret = resume_handle_disc(cdev); in ccw_device_pm_restore()
1973 if (!ccw_device_test_sense_data(cdev)) { in ccw_device_pm_restore()
1974 ccw_device_update_sense_data(cdev); in ccw_device_pm_restore()
1975 ccw_device_sched_todo(cdev, CDEV_TODO_REBIND); in ccw_device_pm_restore()
1979 if (!cdev->online) in ccw_device_pm_restore()
1982 if (ccw_device_online(cdev)) { in ccw_device_pm_restore()
1983 ret = resume_handle_disc(cdev); in ccw_device_pm_restore()
1989 wait_event(cdev->private->wait_q, dev_fsm_final_state(cdev)); in ccw_device_pm_restore()
1992 if (ccw_device_notify(cdev, CIO_OPER) == NOTIFY_BAD) { in ccw_device_pm_restore()
1993 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG); in ccw_device_pm_restore()
1999 if (cdev->private->cmb) { in ccw_device_pm_restore()
2001 ret = ccw_set_cmf(cdev, 1); in ccw_device_pm_restore()
2005 "(rc=%d)\n", cdev->private->dev_id.ssid, in ccw_device_pm_restore()
2006 cdev->private->dev_id.devno, ret); in ccw_device_pm_restore()
2013 if (cdev->online && cdev->drv && cdev->drv->restore) in ccw_device_pm_restore()
2014 ret = cdev->drv->restore(cdev); in ccw_device_pm_restore()
2071 struct ccw_device *cdev; in ccw_device_todo() local
2076 cdev = priv->cdev; in ccw_device_todo()
2077 sch = to_subchannel(cdev->dev.parent); in ccw_device_todo()
2079 spin_lock_irq(cdev->ccwlock); in ccw_device_todo()
2084 spin_unlock_irq(cdev->ccwlock); in ccw_device_todo()
2088 cmf_reenable(cdev); in ccw_device_todo()
2091 ccw_device_do_unbind_bind(cdev); in ccw_device_todo()
2094 io_subchannel_register(cdev); in ccw_device_todo()
2102 ccw_device_unregister(cdev); in ccw_device_todo()
2104 ccw_device_call_sch_unregister(cdev); in ccw_device_todo()
2110 put_device(&cdev->dev); in ccw_device_todo()
2122 void ccw_device_sched_todo(struct ccw_device *cdev, enum cdev_todo todo) in ccw_device_sched_todo() argument
2125 cdev->private->dev_id.ssid, cdev->private->dev_id.devno, in ccw_device_sched_todo()
2127 if (cdev->private->todo >= todo) in ccw_device_sched_todo()
2129 cdev->private->todo = todo; in ccw_device_sched_todo()
2131 if (!get_device(&cdev->dev)) in ccw_device_sched_todo()
2133 if (!queue_work(cio_work_q, &cdev->private->todo_work)) { in ccw_device_sched_todo()
2135 put_device(&cdev->dev); in ccw_device_sched_todo()
2146 int ccw_device_siosl(struct ccw_device *cdev) in ccw_device_siosl() argument
2148 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_siosl()