Lines Matching refs:sch

273 	struct subchannel *sch;  in ccw_device_set_offline()  local
287 sch = to_subchannel(cdev->dev.parent); in ccw_device_set_offline()
308 io_subchannel_quiesce(sch); in ccw_device_set_offline()
540 struct subchannel *sch; in available_show() local
550 sch = to_subchannel(dev->parent); in available_show()
551 if (!sch->lpm) in available_show()
565 struct subchannel *sch = to_subchannel(dev); in initiate_logging() local
568 rc = chsc_siosl(sch->schid); in initiate_logging()
571 sch->schid.ssid, sch->schid.sch_no, rc); in initiate_logging()
575 sch->schid.ssid, sch->schid.sch_no); in initiate_logging()
582 struct subchannel *sch = to_subchannel(dev); in vpm_show() local
584 return sprintf(buf, "%02x\n", sch->vpm); in vpm_show()
678 static struct ccw_device * io_subchannel_allocate_dev(struct subchannel *sch) in io_subchannel_allocate_dev() argument
696 cdev->dev.dma_mask = sch->dev.dma_mask; in io_subchannel_allocate_dev()
697 ret = dma_set_coherent_mask(&cdev->dev, sch->dev.coherent_dma_mask); in io_subchannel_allocate_dev()
727 static int io_subchannel_initialize_dev(struct subchannel *sch, in io_subchannel_initialize_dev() argument
736 priv->dev_id.devno = sch->schib.pmcw.dev; in io_subchannel_initialize_dev()
737 priv->dev_id.ssid = sch->schid.ssid; in io_subchannel_initialize_dev()
745 cdev->ccwlock = sch->lock; in io_subchannel_initialize_dev()
746 cdev->dev.parent = &sch->dev; in io_subchannel_initialize_dev()
756 if (!get_device(&sch->dev)) { in io_subchannel_initialize_dev()
761 spin_lock_irq(sch->lock); in io_subchannel_initialize_dev()
762 sch_set_cdev(sch, cdev); in io_subchannel_initialize_dev()
763 spin_unlock_irq(sch->lock); in io_subchannel_initialize_dev()
772 static struct ccw_device * io_subchannel_create_ccwdev(struct subchannel *sch) in io_subchannel_create_ccwdev() argument
777 cdev = io_subchannel_allocate_dev(sch); in io_subchannel_create_ccwdev()
779 ret = io_subchannel_initialize_dev(sch, cdev); in io_subchannel_create_ccwdev()
788 static void sch_create_and_recog_new_device(struct subchannel *sch) in sch_create_and_recog_new_device() argument
793 cdev = io_subchannel_create_ccwdev(sch); in sch_create_and_recog_new_device()
796 css_sch_device_unregister(sch); in sch_create_and_recog_new_device()
800 io_subchannel_recog(cdev, sch); in sch_create_and_recog_new_device()
808 struct subchannel *sch; in io_subchannel_register() local
812 sch = to_subchannel(cdev->dev.parent); in io_subchannel_register()
819 if (!device_is_registered(&sch->dev)) in io_subchannel_register()
821 css_update_ssd_info(sch); in io_subchannel_register()
845 if (dev_get_uevent_suppress(&sch->dev)) { in io_subchannel_register()
846 dev_set_uevent_suppress(&sch->dev, 0); in io_subchannel_register()
847 kobject_uevent(&sch->dev.kobj, KOBJ_ADD); 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()
900 static void io_subchannel_recog(struct ccw_device *cdev, struct subchannel *sch) in io_subchannel_recog() argument
906 spin_lock_irq(sch->lock); in io_subchannel_recog()
908 spin_unlock_irq(sch->lock); in io_subchannel_recog()
912 struct subchannel *sch) in ccw_device_move_to_sch() argument
919 if (!get_device(&sch->dev)) in ccw_device_move_to_sch()
931 put_device(&sch->dev); in ccw_device_move_to_sch()
936 mutex_lock(&sch->reg_mutex); in ccw_device_move_to_sch()
937 rc = device_move(&cdev->dev, &sch->dev, DPM_ORDER_PARENT_BEFORE_DEV); in ccw_device_move_to_sch()
938 mutex_unlock(&sch->reg_mutex); in ccw_device_move_to_sch()
942 cdev->private->dev_id.devno, sch->schid.ssid, in ccw_device_move_to_sch()
943 sch->schib.pmcw.dev, rc); in ccw_device_move_to_sch()
951 put_device(&sch->dev); in ccw_device_move_to_sch()
964 spin_lock_irq(sch->lock); in ccw_device_move_to_sch()
965 cdev->ccwlock = sch->lock; in ccw_device_move_to_sch()
966 if (!sch_is_pseudo_sch(sch)) in ccw_device_move_to_sch()
967 sch_set_cdev(sch, cdev); in ccw_device_move_to_sch()
968 spin_unlock_irq(sch->lock); in ccw_device_move_to_sch()
969 if (!sch_is_pseudo_sch(sch)) in ccw_device_move_to_sch()
970 css_update_ssd_info(sch); in ccw_device_move_to_sch()
976 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_move_to_orph() local
977 struct channel_subsystem *css = to_css(sch->dev.parent); in ccw_device_move_to_orph()
982 static void io_subchannel_irq(struct subchannel *sch) in io_subchannel_irq() argument
986 cdev = sch_get_cdev(sch); in io_subchannel_irq()
989 CIO_TRACE_EVENT(6, dev_name(&sch->dev)); in io_subchannel_irq()
996 void io_subchannel_init_config(struct subchannel *sch) in io_subchannel_init_config() argument
998 memset(&sch->config, 0, sizeof(sch->config)); in io_subchannel_init_config()
999 sch->config.csense = 1; in io_subchannel_init_config()
1002 static void io_subchannel_init_fields(struct subchannel *sch) in io_subchannel_init_fields() argument
1004 if (cio_is_console(sch->schid)) in io_subchannel_init_fields()
1005 sch->opm = 0xff; in io_subchannel_init_fields()
1007 sch->opm = chp_get_sch_opm(sch); in io_subchannel_init_fields()
1008 sch->lpm = sch->schib.pmcw.pam & sch->opm; in io_subchannel_init_fields()
1009 sch->isc = cio_is_console(sch->schid) ? CONSOLE_ISC : IO_SCH_ISC; in io_subchannel_init_fields()
1013 sch->schib.pmcw.dev, sch->schid.ssid, in io_subchannel_init_fields()
1014 sch->schid.sch_no, sch->schib.pmcw.pim, in io_subchannel_init_fields()
1015 sch->schib.pmcw.pam, sch->schib.pmcw.pom); in io_subchannel_init_fields()
1017 io_subchannel_init_config(sch); in io_subchannel_init_fields()
1024 static int io_subchannel_probe(struct subchannel *sch) in io_subchannel_probe() argument
1030 if (cio_is_console(sch->schid)) { in io_subchannel_probe()
1031 rc = sysfs_create_group(&sch->dev.kobj, in io_subchannel_probe()
1037 sch->schid.ssid, sch->schid.sch_no, rc); in io_subchannel_probe()
1043 if (dev_get_uevent_suppress(&sch->dev)) { in io_subchannel_probe()
1045 dev_set_uevent_suppress(&sch->dev, 0); in io_subchannel_probe()
1046 kobject_uevent(&sch->dev.kobj, KOBJ_ADD); in io_subchannel_probe()
1048 cdev = sch_get_cdev(sch); in io_subchannel_probe()
1059 io_subchannel_init_fields(sch); in io_subchannel_probe()
1060 rc = cio_commit_config(sch); in io_subchannel_probe()
1063 rc = sysfs_create_group(&sch->dev.kobj, in io_subchannel_probe()
1072 io_priv->dma_area = dma_alloc_coherent(&sch->dev, in io_subchannel_probe()
1080 set_io_private(sch, io_priv); in io_subchannel_probe()
1081 css_schedule_eval(sch->schid); in io_subchannel_probe()
1085 spin_lock_irq(sch->lock); in io_subchannel_probe()
1086 css_sched_sch_todo(sch, SCH_TODO_UNREG); in io_subchannel_probe()
1087 spin_unlock_irq(sch->lock); in io_subchannel_probe()
1091 static void io_subchannel_remove(struct subchannel *sch) in io_subchannel_remove() argument
1093 struct io_subchannel_private *io_priv = to_io_private(sch); in io_subchannel_remove()
1096 cdev = sch_get_cdev(sch); in io_subchannel_remove()
1101 spin_lock_irq(sch->lock); in io_subchannel_remove()
1102 sch_set_cdev(sch, NULL); in io_subchannel_remove()
1103 set_io_private(sch, NULL); in io_subchannel_remove()
1104 spin_unlock_irq(sch->lock); in io_subchannel_remove()
1106 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area), in io_subchannel_remove()
1109 sysfs_remove_group(&sch->dev.kobj, &io_subchannel_attr_group); in io_subchannel_remove()
1112 static void io_subchannel_verify(struct subchannel *sch) in io_subchannel_verify() argument
1116 cdev = sch_get_cdev(sch); in io_subchannel_verify()
1121 static void io_subchannel_terminate_path(struct subchannel *sch, u8 mask) in io_subchannel_terminate_path() argument
1125 cdev = sch_get_cdev(sch); in io_subchannel_terminate_path()
1128 if (cio_update_schib(sch)) in io_subchannel_terminate_path()
1131 if (scsw_actl(&sch->schib.scsw) == 0 || sch->schib.pmcw.lpum != mask) in io_subchannel_terminate_path()
1137 if (cio_clear(sch)) in io_subchannel_terminate_path()
1148 static int io_subchannel_chp_event(struct subchannel *sch, in io_subchannel_chp_event() argument
1151 struct ccw_device *cdev = sch_get_cdev(sch); in io_subchannel_chp_event()
1155 mask = chp_ssd_get_mask(&sch->ssd_info, link); in io_subchannel_chp_event()
1160 sch->opm &= ~mask; in io_subchannel_chp_event()
1161 sch->lpm &= ~mask; in io_subchannel_chp_event()
1164 io_subchannel_terminate_path(sch, mask); in io_subchannel_chp_event()
1167 sch->opm |= mask; in io_subchannel_chp_event()
1168 sch->lpm |= mask; in io_subchannel_chp_event()
1171 io_subchannel_verify(sch); in io_subchannel_chp_event()
1174 if (cio_update_schib(sch)) in io_subchannel_chp_event()
1178 io_subchannel_terminate_path(sch, mask); in io_subchannel_chp_event()
1181 if (cio_update_schib(sch)) in io_subchannel_chp_event()
1183 sch->lpm |= mask & sch->opm; in io_subchannel_chp_event()
1186 io_subchannel_verify(sch); in io_subchannel_chp_event()
1204 static void io_subchannel_quiesce(struct subchannel *sch) in io_subchannel_quiesce() argument
1209 spin_lock_irq(sch->lock); in io_subchannel_quiesce()
1210 cdev = sch_get_cdev(sch); in io_subchannel_quiesce()
1211 if (cio_is_console(sch->schid)) in io_subchannel_quiesce()
1213 if (!sch->schib.pmcw.ena) in io_subchannel_quiesce()
1215 ret = cio_disable_subchannel(sch); in io_subchannel_quiesce()
1226 spin_unlock_irq(sch->lock); in io_subchannel_quiesce()
1229 spin_lock_irq(sch->lock); in io_subchannel_quiesce()
1231 ret = cio_disable_subchannel(sch); in io_subchannel_quiesce()
1234 spin_unlock_irq(sch->lock); in io_subchannel_quiesce()
1237 static void io_subchannel_shutdown(struct subchannel *sch) in io_subchannel_shutdown() argument
1239 io_subchannel_quiesce(sch); in io_subchannel_shutdown()
1253 struct subchannel *sch; in recovery_check() local
1259 sch = to_subchannel(cdev->dev.parent); in recovery_check()
1260 if ((sch->schib.pmcw.pam & sch->opm) == sch->vpm) in recovery_check()
1368 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_set_notoper() local
1371 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in ccw_device_set_notoper()
1373 cio_disable_subchannel(sch); in ccw_device_set_notoper()
1389 static enum io_sch_action sch_get_action(struct subchannel *sch) in sch_get_action() argument
1393 cdev = sch_get_cdev(sch); in sch_get_action()
1394 if (cio_update_schib(sch)) { in sch_get_action()
1405 if (sch->schib.pmcw.dev != cdev->private->dev_id.devno) { in sch_get_action()
1410 if ((sch->schib.pmcw.pam & sch->opm) == 0) { in sch_get_action()
1434 static int io_subchannel_sch_event(struct subchannel *sch, int process) in io_subchannel_sch_event() argument
1442 spin_lock_irqsave(sch->lock, flags); in io_subchannel_sch_event()
1443 if (!device_is_registered(&sch->dev)) in io_subchannel_sch_event()
1445 if (work_pending(&sch->todo_work)) in io_subchannel_sch_event()
1447 cdev = sch_get_cdev(sch); in io_subchannel_sch_event()
1450 action = sch_get_action(sch); in io_subchannel_sch_event()
1452 sch->schid.ssid, sch->schid.sch_no, process, in io_subchannel_sch_event()
1463 io_subchannel_verify(sch); in io_subchannel_sch_event()
1494 spin_unlock_irqrestore(sch->lock, flags); in io_subchannel_sch_event()
1508 spin_lock_irqsave(sch->lock, flags); in io_subchannel_sch_event()
1509 sch_set_cdev(sch, NULL); in io_subchannel_sch_event()
1510 spin_unlock_irqrestore(sch->lock, flags); in io_subchannel_sch_event()
1521 css_sch_device_unregister(sch); in io_subchannel_sch_event()
1526 dev_id.ssid = sch->schid.ssid; in io_subchannel_sch_event()
1527 dev_id.devno = sch->schib.pmcw.dev; in io_subchannel_sch_event()
1530 sch_create_and_recog_new_device(sch); in io_subchannel_sch_event()
1533 rc = ccw_device_move_to_sch(cdev, sch); in io_subchannel_sch_event()
1539 spin_lock_irqsave(sch->lock, flags); in io_subchannel_sch_event()
1541 spin_unlock_irqrestore(sch->lock, flags); in io_subchannel_sch_event()
1551 spin_unlock_irqrestore(sch->lock, flags); in io_subchannel_sch_event()
1571 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_enable_console() local
1577 io_subchannel_init_fields(sch); in ccw_device_enable_console()
1578 rc = cio_commit_config(sch); in ccw_device_enable_console()
1581 sch->driver = &io_subchannel_driver; in ccw_device_enable_console()
1582 io_subchannel_recog(cdev, sch); in ccw_device_enable_console()
1612 struct subchannel *sch; in ccw_device_create_console() local
1614 sch = cio_probe_console(); in ccw_device_create_console()
1615 if (IS_ERR(sch)) in ccw_device_create_console()
1616 return ERR_CAST(sch); in ccw_device_create_console()
1621 io_priv->dma_area = dma_alloc_coherent(&sch->dev, in ccw_device_create_console()
1626 set_io_private(sch, io_priv); in ccw_device_create_console()
1627 cdev = io_subchannel_create_ccwdev(sch); in ccw_device_create_console()
1629 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area), in ccw_device_create_console()
1631 set_io_private(sch, NULL); in ccw_device_create_console()
1632 put_device(&sch->dev); in ccw_device_create_console()
1643 put_device(&sch->dev); in ccw_device_create_console()
1649 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_destroy_console() local
1650 struct io_subchannel_private *io_priv = to_io_private(sch); in ccw_device_destroy_console()
1652 set_io_private(sch, NULL); in ccw_device_destroy_console()
1653 dma_free_coherent(&sch->dev, sizeof(*io_priv->dma_area), in ccw_device_destroy_console()
1655 put_device(&sch->dev); in ccw_device_destroy_console()
1670 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_wait_idle() local
1673 cio_tsch(sch); in ccw_device_wait_idle()
1674 if (sch->schib.scsw.cmd.actl == 0) in ccw_device_wait_idle()
1735 struct subchannel *sch; in ccw_device_remove() local
1761 sch = to_subchannel(cdev->dev.parent); in ccw_device_remove()
1763 io_subchannel_quiesce(sch); in ccw_device_remove()
1818 struct subchannel *sch; in ccw_device_todo() local
1823 sch = to_subchannel(cdev->dev.parent); in ccw_device_todo()
1843 if (!sch_is_pseudo_sch(sch)) in ccw_device_todo()
1844 css_schedule_eval(sch->schid); in ccw_device_todo()
1847 spin_lock_irq(sch->lock); in ccw_device_todo()
1848 sch_set_cdev(sch, NULL); in ccw_device_todo()
1849 spin_unlock_irq(sch->lock); in ccw_device_todo()
1894 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_siosl() local
1896 return chsc_siosl(sch->schid); in ccw_device_siosl()