Lines Matching refs:cdev

37 static void ccw_timeout_log(struct ccw_device *cdev)
45 sch = to_subchannel(cdev->dev.parent);
56 dev_name(&cdev->dev));
73 cdev->private->dma_area->iccws)
84 cdev->private->state);
91 &cdev->private->flags, sizeof(cdev->private->flags), 0);
101 struct ccw_device *cdev = priv->cdev;
103 spin_lock_irq(cdev->ccwlock);
105 ccw_timeout_log(cdev);
106 dev_fsm_event(cdev, DEV_EVENT_TIMEOUT);
107 spin_unlock_irq(cdev->ccwlock);
114 ccw_device_set_timeout(struct ccw_device *cdev, int expires)
117 del_timer(&cdev->private->timer);
120 if (timer_pending(&cdev->private->timer)) {
121 if (mod_timer(&cdev->private->timer, jiffies + expires))
124 cdev->private->timer.expires = jiffies + expires;
125 add_timer(&cdev->private->timer);
129 ccw_device_cancel_halt_clear(struct ccw_device *cdev)
134 sch = to_subchannel(cdev->dev.parent);
135 ret = cio_cancel_halt_clear(sch, &cdev->private->iretry);
139 cdev->private->dev_id.ssid,
140 cdev->private->dev_id.devno);
145 void ccw_device_update_sense_data(struct ccw_device *cdev)
147 memset(&cdev->id, 0, sizeof(cdev->id));
148 cdev->id.cu_type = cdev->private->dma_area->senseid.cu_type;
149 cdev->id.cu_model = cdev->private->dma_area->senseid.cu_model;
150 cdev->id.dev_type = cdev->private->dma_area->senseid.dev_type;
151 cdev->id.dev_model = cdev->private->dma_area->senseid.dev_model;
154 int ccw_device_test_sense_data(struct ccw_device *cdev)
156 return cdev->id.cu_type ==
157 cdev->private->dma_area->senseid.cu_type &&
158 cdev->id.cu_model ==
159 cdev->private->dma_area->senseid.cu_model &&
160 cdev->id.dev_type ==
161 cdev->private->dma_area->senseid.dev_type &&
162 cdev->id.dev_model ==
163 cdev->private->dma_area->senseid.dev_model;
194 ccw_device_recog_done(struct ccw_device *cdev, int state)
199 sch = to_subchannel(cdev->dev.parent);
215 if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID)
220 if (cdev->private->state == DEV_STATE_DISCONNECTED_SENSE_ID &&
222 cdev->private->flags.recog_done = 1;
223 cdev->private->state = DEV_STATE_DISCONNECTED;
224 wake_up(&cdev->private->wait_q);
227 if (cdev->private->flags.resuming) {
228 cdev->private->state = state;
229 cdev->private->flags.recog_done = 1;
230 wake_up(&cdev->private->wait_q);
237 if (!cdev->online) {
238 ccw_device_update_sense_data(cdev);
241 cdev->private->state = DEV_STATE_OFFLINE;
242 cdev->private->flags.recog_done = 1;
243 if (ccw_device_test_sense_data(cdev)) {
244 cdev->private->flags.donotify = 1;
245 ccw_device_online(cdev);
246 wake_up(&cdev->private->wait_q);
248 ccw_device_update_sense_data(cdev);
249 ccw_device_sched_todo(cdev, CDEV_TODO_REBIND);
253 if (cdev->id.cu_type != 0) { /* device was recognized before */
254 cdev->private->flags.recog_done = 1;
255 cdev->private->state = DEV_STATE_BOXED;
256 wake_up(&cdev->private->wait_q);
261 cdev->private->state = state;
262 io_subchannel_recog_done(cdev);
263 wake_up(&cdev->private->wait_q);
270 ccw_device_sense_id_done(struct ccw_device *cdev, int err)
274 ccw_device_recog_done(cdev, DEV_STATE_OFFLINE);
277 ccw_device_recog_done(cdev, DEV_STATE_BOXED);
280 ccw_device_recog_done(cdev, DEV_STATE_NOT_OPER);
287 * @cdev: device for which an event occurred
296 int ccw_device_notify(struct ccw_device *cdev, int event)
300 if (!cdev->drv)
302 if (!cdev->online)
305 cdev->private->dev_id.ssid, cdev->private->dev_id.devno,
307 if (!cdev->drv->notify) {
311 if (cdev->drv->notify(cdev, event))
319 static void ccw_device_oper_notify(struct ccw_device *cdev)
321 struct subchannel *sch = to_subchannel(cdev->dev.parent);
323 if (ccw_device_notify(cdev, CIO_OPER) == NOTIFY_OK) {
325 ccw_device_sched_todo(cdev, CDEV_TODO_ENABLE_CMF);
327 cdev->private->path_new_mask = sch->vpm;
331 ccw_device_set_notoper(cdev);
332 ccw_device_sched_todo(cdev, CDEV_TODO_REBIND);
339 ccw_device_done(struct ccw_device *cdev, int state)
343 sch = to_subchannel(cdev->dev.parent);
345 ccw_device_set_timeout(cdev, 0);
351 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
353 cdev->private->state = state;
358 cdev->private->dev_id.devno, sch->schid.sch_no);
359 if (cdev->online &&
360 ccw_device_notify(cdev, CIO_BOXED) != NOTIFY_OK)
361 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
362 cdev->private->flags.donotify = 0;
366 cdev->private->dev_id.devno, sch->schid.sch_no);
367 if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK)
368 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
370 ccw_device_set_disconnected(cdev);
371 cdev->private->flags.donotify = 0;
375 "%04x\n", cdev->private->dev_id.devno,
377 if (ccw_device_notify(cdev, CIO_NO_PATH) != NOTIFY_OK) {
378 cdev->private->state = DEV_STATE_NOT_OPER;
379 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
381 ccw_device_set_disconnected(cdev);
382 cdev->private->flags.donotify = 0;
388 if (cdev->private->flags.donotify) {
389 cdev->private->flags.donotify = 0;
390 ccw_device_oper_notify(cdev);
392 wake_up(&cdev->private->wait_q);
398 void ccw_device_recognition(struct ccw_device *cdev)
400 struct subchannel *sch = to_subchannel(cdev->dev.parent);
410 cdev->private->flags.recog_done = 0;
411 cdev->private->state = DEV_STATE_SENSE_ID;
413 ccw_device_recog_done(cdev, DEV_STATE_NOT_OPER);
416 ccw_device_sense_id_start(cdev);
422 static void ccw_device_request_event(struct ccw_device *cdev, enum dev_event e)
426 ccw_request_notoper(cdev);
429 ccw_request_handler(cdev);
432 ccw_request_timeout(cdev);
439 static void ccw_device_report_path_events(struct ccw_device *cdev)
441 struct subchannel *sch = to_subchannel(cdev->dev.parent);
447 if (mask & cdev->private->path_gone_mask & ~(sch->vpm))
449 if (mask & cdev->private->path_new_mask & sch->vpm)
451 if (mask & cdev->private->pgid_reset_mask & sch->vpm)
454 if (cdev->online && cdev->drv->path_event)
455 cdev->drv->path_event(cdev, path_event);
458 static void ccw_device_reset_path_events(struct ccw_device *cdev)
460 cdev->private->path_gone_mask = 0;
461 cdev->private->path_new_mask = 0;
462 cdev->private->pgid_reset_mask = 0;
484 static void ccw_device_handle_broken_paths(struct ccw_device *cdev)
486 struct subchannel *sch = to_subchannel(cdev->dev.parent);
489 if (broken_paths && (cdev->private->path_broken_mask != broken_paths))
492 cdev->private->path_broken_mask = broken_paths;
495 void ccw_device_verify_done(struct ccw_device *cdev, int err)
499 sch = to_subchannel(cdev->dev.parent);
508 if (cdev->private->flags.doverify) {
509 ccw_device_verify_start(cdev);
515 ccw_device_done(cdev, DEV_STATE_ONLINE);
517 if (cdev->private->flags.fake_irb) {
518 create_fake_irb(&cdev->private->dma_area->irb,
519 cdev->private->flags.fake_irb);
520 cdev->private->flags.fake_irb = 0;
521 if (cdev->handler)
522 cdev->handler(cdev, cdev->private->intparm,
523 &cdev->private->dma_area->irb);
524 memset(&cdev->private->dma_area->irb, 0,
527 ccw_device_report_path_events(cdev);
528 ccw_device_handle_broken_paths(cdev);
533 cdev->private->flags.donotify = 0;
534 ccw_device_done(cdev, DEV_STATE_BOXED);
538 cdev->private->flags.donotify = 0;
539 ccw_device_done(cdev, DEV_STATE_DISCONNECTED);
543 cdev->private->flags.donotify = 0;
544 ccw_device_done(cdev, DEV_STATE_NOT_OPER);
547 ccw_device_reset_path_events(cdev);
554 ccw_device_online(struct ccw_device *cdev)
559 if ((cdev->private->state != DEV_STATE_OFFLINE) &&
560 (cdev->private->state != DEV_STATE_BOXED))
562 sch = to_subchannel(cdev->dev.parent);
567 dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
571 cdev->private->state = DEV_STATE_VERIFY;
572 ccw_device_verify_start(cdev);
577 ccw_device_disband_done(struct ccw_device *cdev, int err)
581 ccw_device_done(cdev, DEV_STATE_OFFLINE);
584 ccw_device_done(cdev, DEV_STATE_BOXED);
587 cdev->private->flags.donotify = 0;
588 ccw_device_done(cdev, DEV_STATE_NOT_OPER);
597 ccw_device_offline(struct ccw_device *cdev)
602 if (cdev->private->state == DEV_STATE_DISCONNECTED ||
603 cdev->private->state == DEV_STATE_NOT_OPER) {
604 cdev->private->flags.donotify = 0;
605 ccw_device_done(cdev, DEV_STATE_NOT_OPER);
608 if (cdev->private->state == DEV_STATE_BOXED) {
609 ccw_device_done(cdev, DEV_STATE_BOXED);
612 if (ccw_device_is_orphan(cdev)) {
613 ccw_device_done(cdev, DEV_STATE_OFFLINE);
616 sch = to_subchannel(cdev->dev.parent);
621 if (cdev->private->state != DEV_STATE_ONLINE)
624 if (!cdev->private->flags.pgroup) {
626 ccw_device_done(cdev, DEV_STATE_OFFLINE);
630 cdev->private->state = DEV_STATE_DISBAND_PGID;
631 ccw_device_disband_start(cdev);
638 static void ccw_device_generic_notoper(struct ccw_device *cdev,
641 if (ccw_device_notify(cdev, CIO_GONE) != NOTIFY_OK)
642 ccw_device_sched_todo(cdev, CDEV_TODO_UNREG);
644 ccw_device_set_disconnected(cdev);
650 static void ccw_device_offline_verify(struct ccw_device *cdev,
653 struct subchannel *sch = to_subchannel(cdev->dev.parent);
662 ccw_device_online_verify(struct ccw_device *cdev, enum dev_event dev_event)
666 if (cdev->private->state == DEV_STATE_W4SENSE) {
667 cdev->private->flags.doverify = 1;
670 sch = to_subchannel(cdev->dev.parent);
676 ccw_device_verify_done(cdev, -ENODEV);
682 (scsw_stctl(&cdev->private->dma_area->irb.scsw) &
689 cdev->private->flags.doverify = 1;
693 cdev->private->state = DEV_STATE_VERIFY;
694 ccw_device_verify_start(cdev);
700 static void ccw_device_boxed_verify(struct ccw_device *cdev,
703 struct subchannel *sch = to_subchannel(cdev->dev.parent);
705 if (cdev->online) {
707 ccw_device_done(cdev, DEV_STATE_NOT_OPER);
709 ccw_device_online_verify(cdev, dev_event);
717 static int ccw_device_call_handler(struct ccw_device *cdev)
730 stctl = scsw_stctl(&cdev->private->dma_area->irb.scsw);
735 !cdev->private->options.repall &&
737 !(cdev->private->options.fast &&
742 ccw_device_set_timeout(cdev, 0);
744 if (cdev->handler)
745 cdev->handler(cdev, cdev->private->intparm,
746 &cdev->private->dma_area->irb);
748 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
756 ccw_device_irq(struct ccw_device *cdev, enum dev_event dev_event)
768 if (ccw_device_do_sense(cdev, irb) != 0)
770 memcpy(&cdev->private->dma_area->irb, irb,
772 cdev->private->state = DEV_STATE_W4SENSE;
773 cdev->private->intparm = 0;
777 if (cdev->handler)
778 cdev->handler (cdev, 0, irb);
779 if (cdev->private->flags.doverify)
780 ccw_device_online_verify(cdev, 0);
784 ccw_device_accumulate_irb(cdev, irb);
785 if (is_cmd && cdev->private->flags.dosense) {
786 if (ccw_device_do_sense(cdev, irb) == 0) {
787 cdev->private->state = DEV_STATE_W4SENSE;
792 if (ccw_device_call_handler(cdev) && cdev->private->flags.doverify)
794 ccw_device_online_verify(cdev, 0);
801 ccw_device_online_timeout(struct ccw_device *cdev, enum dev_event dev_event)
805 ccw_device_set_timeout(cdev, 0);
806 cdev->private->iretry = 255;
807 cdev->private->async_kill_io_rc = -ETIMEDOUT;
808 ret = ccw_device_cancel_halt_clear(cdev);
810 ccw_device_set_timeout(cdev, 3*HZ);
811 cdev->private->state = DEV_STATE_TIMEOUT_KILL;
815 dev_fsm_event(cdev, DEV_EVENT_NOTOPER);
816 else if (cdev->handler)
817 cdev->handler(cdev, cdev->private->intparm,
825 ccw_device_w4sense(struct ccw_device *cdev, enum dev_event dev_event)
835 ccw_device_do_sense(cdev, irb);
839 cdev->private->dev_id.ssid,
840 cdev->private->dev_id.devno);
841 if (cdev->handler)
842 cdev->handler (cdev, 0, irb);
853 cdev->private->flags.dosense = 0;
854 memset(&cdev->private->dma_area->irb, 0, sizeof(struct irb));
855 ccw_device_accumulate_irb(cdev, irb);
859 ccw_device_accumulate_basic_sense(cdev, irb);
860 if (cdev->private->flags.dosense) {
862 ccw_device_do_sense(cdev, irb);
866 cdev->private->state = DEV_STATE_ONLINE;
868 wake_up(&cdev->private->wait_q);
870 if (ccw_device_call_handler(cdev) && cdev->private->flags.doverify)
872 ccw_device_online_verify(cdev, 0);
876 ccw_device_killing_irq(struct ccw_device *cdev, enum dev_event dev_event)
878 ccw_device_set_timeout(cdev, 0);
880 ccw_device_online_verify(cdev, 0);
882 if (cdev->handler)
883 cdev->handler(cdev, cdev->private->intparm,
884 ERR_PTR(cdev->private->async_kill_io_rc));
888 ccw_device_killing_timeout(struct ccw_device *cdev, enum dev_event dev_event)
892 ret = ccw_device_cancel_halt_clear(cdev);
894 ccw_device_set_timeout(cdev, 3*HZ);
898 ccw_device_online_verify(cdev, 0);
899 if (cdev->handler)
900 cdev->handler(cdev, cdev->private->intparm,
901 ERR_PTR(cdev->private->async_kill_io_rc));
904 void ccw_device_kill_io(struct ccw_device *cdev)
908 ccw_device_set_timeout(cdev, 0);
909 cdev->private->iretry = 255;
910 cdev->private->async_kill_io_rc = -EIO;
911 ret = ccw_device_cancel_halt_clear(cdev);
913 ccw_device_set_timeout(cdev, 3*HZ);
914 cdev->private->state = DEV_STATE_TIMEOUT_KILL;
918 ccw_device_online_verify(cdev, 0);
919 if (cdev->handler)
920 cdev->handler(cdev, cdev->private->intparm,
925 ccw_device_delay_verify(struct ccw_device *cdev, enum dev_event dev_event)
928 cdev->private->flags.doverify = 1;
932 ccw_device_start_id(struct ccw_device *cdev, enum dev_event dev_event)
936 sch = to_subchannel(cdev->dev.parent);
940 cdev->private->state = DEV_STATE_DISCONNECTED_SENSE_ID;
941 ccw_device_sense_id_start(cdev);
944 void ccw_device_trigger_reprobe(struct ccw_device *cdev)
948 if (cdev->private->state != DEV_STATE_DISCONNECTED)
951 sch = to_subchannel(cdev->dev.parent);
970 if (sch->schib.pmcw.dev != cdev->private->dev_id.devno)
973 ccw_device_start_id(cdev, 0);
976 static void ccw_device_disabled_irq(struct ccw_device *cdev,
981 sch = to_subchannel(cdev->dev.parent);
990 ccw_device_change_cmfstate(struct ccw_device *cdev, enum dev_event dev_event)
992 retry_set_schib(cdev);
993 cdev->private->state = DEV_STATE_ONLINE;
994 dev_fsm_event(cdev, dev_event);
997 static void ccw_device_update_cmfblock(struct ccw_device *cdev,
1000 cmf_retry_copy_block(cdev);
1001 cdev->private->state = DEV_STATE_ONLINE;
1002 dev_fsm_event(cdev, dev_event);
1006 ccw_device_quiesce_done(struct ccw_device *cdev, enum dev_event dev_event)
1008 ccw_device_set_timeout(cdev, 0);
1009 cdev->private->state = DEV_STATE_NOT_OPER;
1010 wake_up(&cdev->private->wait_q);
1014 ccw_device_quiesce_timeout(struct ccw_device *cdev, enum dev_event dev_event)
1018 ret = ccw_device_cancel_halt_clear(cdev);
1020 ccw_device_set_timeout(cdev, HZ/10);
1022 cdev->private->state = DEV_STATE_NOT_OPER;
1023 wake_up(&cdev->private->wait_q);
1032 ccw_device_nop(struct ccw_device *cdev, enum dev_event dev_event)