Lines Matching refs:sch

68 	struct subchannel *sch = to_subchannel(dev);
72 idset_sch_del(cb->set, sch->schid);
74 rc = cb->fn_known_sch(sch, cb->data);
91 struct subchannel *sch;
94 sch = get_subchannel_by_schid(schid);
95 if (sch) {
97 rc = cb->fn_known_sch(sch, cb->data);
98 put_device(&sch->dev);
143 struct subchannel *sch;
146 sch = kmalloc (sizeof (*sch), GFP_KERNEL | GFP_DMA);
147 if (sch == NULL)
149 ret = cio_validate_subchannel (sch, schid);
151 kfree(sch);
154 INIT_WORK(&sch->todo_work, css_sch_todo);
155 return sch;
161 struct subchannel *sch;
163 sch = to_subchannel(dev);
164 if (!cio_is_console(sch->schid)) {
166 sch->config.intparm = 0;
167 cio_commit_config(sch);
168 kfree(sch->lock);
169 kfree(sch);
173 static int css_sch_device_register(struct subchannel *sch)
177 mutex_lock(&sch->reg_mutex);
178 dev_set_name(&sch->dev, "0.%x.%04x", sch->schid.ssid,
179 sch->schid.sch_no);
180 ret = device_register(&sch->dev);
181 mutex_unlock(&sch->reg_mutex);
187 * @sch: subchannel to be unregistered
189 void css_sch_device_unregister(struct subchannel *sch)
191 mutex_lock(&sch->reg_mutex);
192 if (device_is_registered(&sch->dev))
193 device_unregister(&sch->dev);
194 mutex_unlock(&sch->reg_mutex);
227 void css_update_ssd_info(struct subchannel *sch)
231 if (cio_is_console(sch->schid)) {
234 ssd_from_pmcw(&sch->ssd_info, &sch->schib.pmcw);
236 ret = chsc_get_ssd_info(sch->schid, &sch->ssd_info);
238 ssd_from_pmcw(&sch->ssd_info, &sch->schib.pmcw);
239 ssd_register_chpids(&sch->ssd_info);
246 struct subchannel *sch = to_subchannel(dev);
248 return sprintf(buf, "%01x\n", sch->st);
256 struct subchannel *sch = to_subchannel(dev);
258 return sprintf(buf, "css:t%01X\n", sch->st);
278 static int css_register_subchannel(struct subchannel *sch)
283 sch->dev.parent = &channel_subsystems[0]->device;
284 sch->dev.bus = &css_bus_type;
285 sch->dev.release = &css_subchannel_release;
286 sch->dev.groups = default_subch_attr_groups;
296 dev_set_uevent_suppress(&sch->dev, 1);
297 css_update_ssd_info(sch);
299 ret = css_sch_device_register(sch);
301 CIO_MSG_EVENT(0, "Could not register sch 0.%x.%04x: %d\n",
302 sch->schid.ssid, sch->schid.sch_no, ret);
305 if (!sch->driver) {
311 dev_set_uevent_suppress(&sch->dev, 0);
312 kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
320 struct subchannel *sch;
323 sch = cio_get_console_subchannel();
325 sch = css_alloc_subchannel(schid);
326 if (IS_ERR(sch))
327 return PTR_ERR(sch);
329 ret = css_register_subchannel(sch);
332 put_device(&sch->dev);
340 struct subchannel *sch;
343 sch = to_subchannel(dev);
344 return schid_equal(&sch->schid, schid);
384 CIO_MSG_EVENT(4, "event: sch 0.%x.%04x, new\n", schid.ssid,
390 static int css_evaluate_known_subchannel(struct subchannel *sch, int slow)
394 if (sch->driver) {
395 if (sch->driver->sch_event)
396 ret = sch->driver->sch_event(sch, slow);
398 dev_dbg(&sch->dev,
403 CIO_MSG_EVENT(2, "eval: sch 0.%x.%04x, rc=%d\n",
404 sch->schid.ssid, sch->schid.sch_no, ret);
411 struct subchannel *sch;
414 sch = get_subchannel_by_schid(schid);
415 if (sch) {
416 ret = css_evaluate_known_subchannel(sch, slow);
417 put_device(&sch->dev);
426 * @sch: subchannel
433 void css_sched_sch_todo(struct subchannel *sch, enum sch_todo todo)
435 CIO_MSG_EVENT(4, "sch_todo: sched sch=0.%x.%04x todo=%d\n",
436 sch->schid.ssid, sch->schid.sch_no, todo);
437 if (sch->todo >= todo)
440 if (!get_device(&sch->dev))
442 sch->todo = todo;
443 if (!queue_work(cio_work_q, &sch->todo_work)) {
445 put_device(&sch->dev);
451 struct subchannel *sch;
455 sch = container_of(work, struct subchannel, todo_work);
457 spin_lock_irq(sch->lock);
458 todo = sch->todo;
459 CIO_MSG_EVENT(4, "sch_todo: sch=0.%x.%04x, todo=%d\n", sch->schid.ssid,
460 sch->schid.sch_no, todo);
461 sch->todo = SCH_TODO_NOTHING;
462 spin_unlock_irq(sch->lock);
468 ret = css_evaluate_known_subchannel(sch, 1);
470 spin_lock_irq(sch->lock);
471 css_sched_sch_todo(sch, todo);
472 spin_unlock_irq(sch->lock);
476 css_sch_device_unregister(sch);
480 put_device(&sch->dev);
501 static int slow_eval_known_fn(struct subchannel *sch, void *data)
507 eval = idset_sch_contains(slow_subchannel_set, sch->schid);
508 idset_sch_del(slow_subchannel_set, sch->schid);
511 rc = css_evaluate_known_subchannel(sch, 1);
513 css_schedule_eval(sch->schid);
589 struct subchannel *sch = to_subchannel(dev);
591 idset_sch_del(set, sch->schid);
636 struct subchannel *sch;
657 sch = get_subchannel_by_schid(mchk_schid);
658 if (sch) {
659 css_update_ssd_info(sch);
660 put_device(&sch->dev);
1100 int sch_is_pseudo_sch(struct subchannel *sch)
1102 return sch == to_css(sch->dev.parent)->pseudo_subchannel;
1107 struct subchannel *sch = to_subchannel(dev);
1112 if (sch->st == id->type)
1121 struct subchannel *sch;
1124 sch = to_subchannel(dev);
1125 sch->driver = to_cssdriver(dev->driver);
1126 ret = sch->driver->probe ? sch->driver->probe(sch) : 0;
1128 sch->driver = NULL;
1134 struct subchannel *sch;
1137 sch = to_subchannel(dev);
1138 ret = sch->driver->remove ? sch->driver->remove(sch) : 0;
1139 sch->driver = NULL;
1145 struct subchannel *sch;
1147 sch = to_subchannel(dev);
1148 if (sch->driver && sch->driver->shutdown)
1149 sch->driver->shutdown(sch);
1154 struct subchannel *sch = to_subchannel(dev);
1157 ret = add_uevent_var(env, "ST=%01X", sch->st);
1160 ret = add_uevent_var(env, "MODALIAS=css:t%01X", sch->st);
1166 struct subchannel *sch = to_subchannel(dev);
1169 if (mutex_is_locked(&sch->reg_mutex))
1171 if (!sch->dev.driver)
1173 drv = to_cssdriver(sch->dev.driver);
1175 return drv->prepare ? drv->prepare(sch) : 0;
1180 struct subchannel *sch = to_subchannel(dev);
1183 if (!sch->dev.driver)
1185 drv = to_cssdriver(sch->dev.driver);
1187 drv->complete(sch);
1192 struct subchannel *sch = to_subchannel(dev);
1195 if (!sch->dev.driver)
1197 drv = to_cssdriver(sch->dev.driver);
1198 return drv->freeze ? drv->freeze(sch) : 0;
1203 struct subchannel *sch = to_subchannel(dev);
1206 if (!sch->dev.driver)
1208 drv = to_cssdriver(sch->dev.driver);
1209 return drv->thaw ? drv->thaw(sch) : 0;
1214 struct subchannel *sch = to_subchannel(dev);
1217 css_update_ssd_info(sch);
1218 if (!sch->dev.driver)
1220 drv = to_cssdriver(sch->dev.driver);
1221 return drv->restore ? drv->restore(sch) : 0;