Lines Matching full:sch
274 struct subchannel *sch; in ccw_device_set_offline() local
288 sch = to_subchannel(cdev->dev.parent); in ccw_device_set_offline()
309 io_subchannel_quiesce(sch); in ccw_device_set_offline()
544 struct subchannel *sch; in available_show() local
554 sch = to_subchannel(dev->parent); in available_show()
555 if (!sch->lpm) in available_show()
569 struct subchannel *sch = to_subchannel(dev); in initiate_logging() local
572 rc = chsc_siosl(sch->schid); in initiate_logging()
575 sch->schid.ssid, sch->schid.sch_no, rc); in initiate_logging()
579 sch->schid.ssid, sch->schid.sch_no); in initiate_logging()
586 struct subchannel *sch = to_subchannel(dev); in vpm_show() local
588 return sysfs_emit(buf, "%02x\n", sch->vpm); in vpm_show()
684 static struct ccw_device * io_subchannel_allocate_dev(struct subchannel *sch) in io_subchannel_allocate_dev() argument
702 cdev->dev.dma_mask = sch->dev.dma_mask; in io_subchannel_allocate_dev()
703 ret = dma_set_coherent_mask(&cdev->dev, sch->dev.coherent_dma_mask); in io_subchannel_allocate_dev()
733 static int io_subchannel_initialize_dev(struct subchannel *sch, in io_subchannel_initialize_dev() argument
742 priv->dev_id.devno = sch->schib.pmcw.dev; in io_subchannel_initialize_dev()
743 priv->dev_id.ssid = sch->schid.ssid; in io_subchannel_initialize_dev()
752 cdev->ccwlock = &sch->lock; in io_subchannel_initialize_dev()
753 cdev->dev.parent = &sch->dev; in io_subchannel_initialize_dev()
763 if (!get_device(&sch->dev)) { in io_subchannel_initialize_dev()
768 spin_lock_irq(&sch->lock); in io_subchannel_initialize_dev()
769 sch_set_cdev(sch, cdev); in io_subchannel_initialize_dev()
770 spin_unlock_irq(&sch->lock); in io_subchannel_initialize_dev()
779 static struct ccw_device * io_subchannel_create_ccwdev(struct subchannel *sch) in io_subchannel_create_ccwdev() argument
784 cdev = io_subchannel_allocate_dev(sch); in io_subchannel_create_ccwdev()
786 ret = io_subchannel_initialize_dev(sch, cdev); in io_subchannel_create_ccwdev()
795 static void sch_create_and_recog_new_device(struct subchannel *sch) in sch_create_and_recog_new_device() argument
800 cdev = io_subchannel_create_ccwdev(sch); in sch_create_and_recog_new_device()
803 css_sch_device_unregister(sch); in sch_create_and_recog_new_device()
807 io_subchannel_recog(cdev, sch); in sch_create_and_recog_new_device()
815 struct subchannel *sch; in io_subchannel_register() local
819 sch = to_subchannel(cdev->dev.parent); in io_subchannel_register()
826 if (!device_is_registered(&sch->dev)) in io_subchannel_register()
828 css_update_ssd_info(sch); in io_subchannel_register()
855 spin_lock_irqsave(&sch->lock, flags); in io_subchannel_register()
856 sch_set_cdev(sch, NULL); in io_subchannel_register()
857 spin_unlock_irqrestore(&sch->lock, flags); in io_subchannel_register()
902 static void io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch) in io_subchannel_recog() argument
908 spin_lock_irq(&sch->lock); in io_subchannel_recog()
910 spin_unlock_irq(&sch->lock); in io_subchannel_recog()
914 struct subchannel *sch) in ccw_device_move_to_sch() argument
921 if (!get_device(&sch->dev)) in ccw_device_move_to_sch()
933 put_device(&sch->dev); in ccw_device_move_to_sch()
938 mutex_lock(&sch->reg_mutex); in ccw_device_move_to_sch()
939 rc = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV); in ccw_device_move_to_sch()
940 mutex_unlock(&sch->reg_mutex); in ccw_device_move_to_sch()
944 cdev->private->dev_id.devno, sch->schid.ssid, in ccw_device_move_to_sch()
945 sch->schib.pmcw.dev, rc); in ccw_device_move_to_sch()
953 put_device(&sch->dev); in ccw_device_move_to_sch()
966 spin_lock_irq(&sch->lock); in ccw_device_move_to_sch()
967 cdev->ccwlock = &sch->lock; in ccw_device_move_to_sch()
968 if (!sch_is_pseudo_sch(sch)) in ccw_device_move_to_sch()
969 sch_set_cdev(sch, cdev); in ccw_device_move_to_sch()
970 spin_unlock_irq(&sch->lock); in ccw_device_move_to_sch()
971 if (!sch_is_pseudo_sch(sch)) in ccw_device_move_to_sch()
972 css_update_ssd_info(sch); in ccw_device_move_to_sch()
978 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_move_to_orph() local
979 struct channel_subsystem *css = to_css(sch->dev.parent); in ccw_device_move_to_orph()
984 static void io_subchannel_irq(struct subchannel *sch) in io_subchannel_irq() argument
988 cdev = sch_get_cdev(sch); in io_subchannel_irq()
991 CIO_TRACE_EVENT(6, dev_name(&sch->dev)); in io_subchannel_irq()
998 void io_subchannel_init_config(struct subchannel *sch) in io_subchannel_init_config() argument
1000 memset(&sch->config, 0, sizeof(sch->config)); in io_subchannel_init_config()
1001 sch->config.csense = 1; in io_subchannel_init_config()
1004 static void io_subchannel_init_fields(struct subchannel *sch) in io_subchannel_init_fields() argument
1006 if (cio_is_console(sch->schid)) in io_subchannel_init_fields()
1007 sch->opm = 0xff; in io_subchannel_init_fields()
1009 sch->opm = chp_get_sch_opm(sch); in io_subchannel_init_fields()
1010 sch->lpm = sch->schib.pmcw.pam & sch->opm; in io_subchannel_init_fields()
1011 sch->isc = cio_is_console(sch->schid) ? CONSOLE_ISC : IO_SCH_ISC; in io_subchannel_init_fields()
1015 sch->schib.pmcw.dev, sch->schid.ssid, in io_subchannel_init_fields()
1016 sch->schid.sch_no, sch->schib.pmcw.pim, in io_subchannel_init_fields()
1017 sch->schib.pmcw.pam, sch->schib.pmcw.pom); in io_subchannel_init_fields()
1019 io_subchannel_init_config(sch); in io_subchannel_init_fields()
1026 static int io_subchannel_probe(struct subchannel *sch) in io_subchannel_probe() argument
1032 if (cio_is_console(sch->schid)) { in io_subchannel_probe()
1033 rc = sysfs_create_group(&sch->dev.kobj, in io_subchannel_probe()
1039 sch->schid.ssid, sch->schid.sch_no, rc); in io_subchannel_probe()
1044 cdev = sch_get_cdev(sch); in io_subchannel_probe()
1055 io_subchannel_init_fields(sch); in io_subchannel_probe()
1056 rc = cio_commit_config(sch); in io_subchannel_probe()
1059 rc = sysfs_create_group(&sch->dev.kobj, in io_subchannel_probe()
1068 io_priv->dma_area = dma_alloc_coherent(&sch->dev, in io_subchannel_probe()
1076 set_io_private(sch, io_priv); in io_subchannel_probe()
1077 css_schedule_eval(sch->schid); in io_subchannel_probe()
1081 spin_lock_irq(&sch->lock); in io_subchannel_probe()
1082 css_sched_sch_todo(sch, SCH_TODO_UNREG); in io_subchannel_probe()
1083 spin_unlock_irq(&sch->lock); in io_subchannel_probe()
1087 static void io_subchannel_remove(struct subchannel *sch) in io_subchannel_remove() argument
1089 struct io_subchannel_private *io_priv = to_io_private(sch); in io_subchannel_remove()
1092 cdev = sch_get_cdev(sch); in io_subchannel_remove()
1097 spin_lock_irq(&sch->lock); in io_subchannel_remove()
1098 sch_set_cdev(sch, NULL); in io_subchannel_remove()
1099 set_io_private(sch, NULL); in io_subchannel_remove()
1100 spin_unlock_irq(&sch->lock); in io_subchannel_remove()
1102 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area), in io_subchannel_remove()
1105 sysfs_remove_group(&sch->dev.kobj, &io_subchannel_attr_group); in io_subchannel_remove()
1108 static void io_subchannel_verify(struct subchannel *sch) in io_subchannel_verify() argument
1112 cdev = sch_get_cdev(sch); in io_subchannel_verify()
1116 css_schedule_eval(sch->schid); in io_subchannel_verify()
1119 static void io_subchannel_terminate_path(struct subchannel *sch, u8 mask) in io_subchannel_terminate_path() argument
1123 cdev = sch_get_cdev(sch); in io_subchannel_terminate_path()
1126 if (cio_update_schib(sch)) in io_subchannel_terminate_path()
1129 if (scsw_actl(&sch->schib.scsw) == 0 || sch->schib.pmcw.lpum != mask) in io_subchannel_terminate_path()
1135 if (cio_clear(sch)) in io_subchannel_terminate_path()
1146 static int io_subchannel_chp_event(struct subchannel *sch, in io_subchannel_chp_event() argument
1149 struct ccw_device *cdev = sch_get_cdev(sch); in io_subchannel_chp_event()
1153 mask = chp_ssd_get_mask(&sch->ssd_info, link); in io_subchannel_chp_event()
1158 sch->opm &= ~mask; in io_subchannel_chp_event()
1159 sch->lpm &= ~mask; in io_subchannel_chp_event()
1162 io_subchannel_terminate_path(sch, mask); in io_subchannel_chp_event()
1165 sch->opm |= mask; in io_subchannel_chp_event()
1166 sch->lpm |= mask; in io_subchannel_chp_event()
1169 io_subchannel_verify(sch); in io_subchannel_chp_event()
1172 if (cio_update_schib(sch)) in io_subchannel_chp_event()
1176 io_subchannel_terminate_path(sch, mask); in io_subchannel_chp_event()
1179 if (cio_update_schib(sch)) in io_subchannel_chp_event()
1181 sch->lpm |= mask & sch->opm; in io_subchannel_chp_event()
1184 io_subchannel_verify(sch); in io_subchannel_chp_event()
1202 static void io_subchannel_quiesce(struct subchannel *sch) in io_subchannel_quiesce() argument
1207 spin_lock_irq(&sch->lock); in io_subchannel_quiesce()
1208 cdev = sch_get_cdev(sch); in io_subchannel_quiesce()
1209 if (cio_is_console(sch->schid)) in io_subchannel_quiesce()
1211 if (!sch->schib.pmcw.ena) in io_subchannel_quiesce()
1213 ret = cio_disable_subchannel(sch); in io_subchannel_quiesce()
1224 spin_unlock_irq(&sch->lock); in io_subchannel_quiesce()
1227 spin_lock_irq(&sch->lock); in io_subchannel_quiesce()
1229 ret = cio_disable_subchannel(sch); in io_subchannel_quiesce()
1232 spin_unlock_irq(&sch->lock); in io_subchannel_quiesce()
1235 static void io_subchannel_shutdown(struct subchannel *sch) in io_subchannel_shutdown() argument
1237 io_subchannel_quiesce(sch); in io_subchannel_shutdown()
1251 struct subchannel *sch; in recovery_check() local
1257 sch = to_subchannel(cdev->dev.parent); in recovery_check()
1258 if ((sch->schib.pmcw.pam & sch->opm) == sch->vpm) in recovery_check()
1319 static int purge_fn(struct subchannel *sch, void *data) in purge_fn() argument
1323 spin_lock_irq(&sch->lock); in purge_fn()
1324 if (sch->st != SUBCHANNEL_TYPE_IO || !sch->schib.pmcw.dnv) in purge_fn()
1327 if (!is_blacklisted(sch->schid.ssid, sch->schib.pmcw.dev)) in purge_fn()
1330 cdev = sch_get_cdev(sch); in purge_fn()
1341 css_sched_sch_todo(sch, SCH_TODO_UNREG); in purge_fn()
1342 CIO_MSG_EVENT(3, "ccw: purging 0.%x.%04x%s\n", sch->schid.ssid, in purge_fn()
1343 sch->schib.pmcw.dev, cdev ? "" : " (no cdev)"); in purge_fn()
1346 spin_unlock_irq(&sch->lock); in purge_fn()
1379 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_set_notoper() local
1382 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in ccw_device_set_notoper()
1384 cio_disable_subchannel(sch); in ccw_device_set_notoper()
1402 static enum io_sch_action sch_get_action(struct subchannel *sch) in sch_get_action() argument
1407 cdev = sch_get_cdev(sch); in sch_get_action()
1408 rc = cio_update_schib(sch); in sch_get_action()
1431 if (sch->schib.pmcw.dev != cdev->private->dev_id.devno) { in sch_get_action()
1436 if ((sch->schib.pmcw.pam & sch->opm) == 0) { in sch_get_action()
1452 * @sch: subchannel
1460 static int io_subchannel_sch_event(struct subchannel *sch, int process) in io_subchannel_sch_event() argument
1468 spin_lock_irqsave(&sch->lock, flags); in io_subchannel_sch_event()
1469 if (!device_is_registered(&sch->dev)) in io_subchannel_sch_event()
1471 if (work_pending(&sch->todo_work)) in io_subchannel_sch_event()
1473 cdev = sch_get_cdev(sch); in io_subchannel_sch_event()
1476 action = sch_get_action(sch); in io_subchannel_sch_event()
1477 CIO_MSG_EVENT(2, "event: sch 0.%x.%04x, process=%d, action=%d\n", in io_subchannel_sch_event()
1478 sch->schid.ssid, sch->schid.sch_no, process, in io_subchannel_sch_event()
1489 io_subchannel_verify(sch); in io_subchannel_sch_event()
1522 spin_unlock_irqrestore(&sch->lock, flags); in io_subchannel_sch_event()
1538 spin_lock_irqsave(&sch->lock, flags); in io_subchannel_sch_event()
1539 sch_set_cdev(sch, NULL); in io_subchannel_sch_event()
1540 spin_unlock_irqrestore(&sch->lock, flags); in io_subchannel_sch_event()
1551 css_sch_device_unregister(sch); in io_subchannel_sch_event()
1556 dev_id.ssid = sch->schid.ssid; in io_subchannel_sch_event()
1557 dev_id.devno = sch->schib.pmcw.dev; in io_subchannel_sch_event()
1560 sch_create_and_recog_new_device(sch); in io_subchannel_sch_event()
1563 rc = ccw_device_move_to_sch(cdev, sch); in io_subchannel_sch_event()
1569 spin_lock_irqsave(&sch->lock, flags); in io_subchannel_sch_event()
1571 spin_unlock_irqrestore(&sch->lock, flags); in io_subchannel_sch_event()
1581 spin_unlock_irqrestore(&sch->lock, flags); in io_subchannel_sch_event()
1601 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_enable_console() local
1607 io_subchannel_init_fields(sch); in ccw_device_enable_console()
1608 rc = cio_commit_config(sch); in ccw_device_enable_console()
1611 sch->driver = &io_subchannel_driver; in ccw_device_enable_console()
1612 io_subchannel_recog(cdev, sch); in ccw_device_enable_console()
1642 struct subchannel *sch; in ccw_device_create_console() local
1644 sch = cio_probe_console(); in ccw_device_create_console()
1645 if (IS_ERR(sch)) in ccw_device_create_console()
1646 return ERR_CAST(sch); in ccw_device_create_console()
1651 io_priv->dma_area = dma_alloc_coherent(&sch->dev, in ccw_device_create_console()
1656 set_io_private(sch, io_priv); in ccw_device_create_console()
1657 cdev = io_subchannel_create_ccwdev(sch); in ccw_device_create_console()
1659 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area), in ccw_device_create_console()
1661 set_io_private(sch, NULL); in ccw_device_create_console()
1662 put_device(&sch->dev); in ccw_device_create_console()
1673 put_device(&sch->dev); in ccw_device_create_console()
1679 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_destroy_console() local
1680 struct io_subchannel_private *io_priv = to_io_private(sch); in ccw_device_destroy_console()
1682 set_io_private(sch, NULL); in ccw_device_destroy_console()
1683 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area), in ccw_device_destroy_console()
1685 put_device(&sch->dev); in ccw_device_destroy_console()
1700 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_wait_idle() local
1703 cio_tsch(sch); in ccw_device_wait_idle()
1704 if (sch->schib.scsw.cmd.actl == 0) in ccw_device_wait_idle()
1765 struct subchannel *sch; in ccw_device_remove() local
1791 sch = to_subchannel(cdev->dev.parent); in ccw_device_remove()
1793 io_subchannel_quiesce(sch); in ccw_device_remove()
1848 struct subchannel *sch; in ccw_device_todo() local
1853 sch = to_subchannel(cdev->dev.parent); in ccw_device_todo()
1873 if (!sch_is_pseudo_sch(sch)) in ccw_device_todo()
1874 css_schedule_eval(sch->schid); in ccw_device_todo()
1877 spin_lock_irq(&sch->lock); in ccw_device_todo()
1878 sch_set_cdev(sch, NULL); in ccw_device_todo()
1879 spin_unlock_irq(&sch->lock); in ccw_device_todo()
1924 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_siosl() local
1926 return chsc_siosl(sch->schid); in ccw_device_siosl()