Lines Matching refs:sch

71 	struct subchannel *sch = to_subchannel(dev);
76 idset_sch_del(cb->set, sch->schid);
78 rc = cb->fn_known_sch(sch, cb->data);
95 struct subchannel *sch;
98 sch = get_subchannel_by_schid(schid);
99 if (sch) {
101 rc = cb->fn_known_sch(sch, cb->data);
102 put_device(&sch->dev);
151 static int css_sch_create_locks(struct subchannel *sch)
153 sch->lock = kmalloc(sizeof(*sch->lock), GFP_KERNEL);
154 if (!sch->lock)
157 spin_lock_init(sch->lock);
158 mutex_init(&sch->reg_mutex);
165 struct subchannel *sch = to_subchannel(dev);
167 sch->config.intparm = 0;
168 cio_commit_config(sch);
169 kfree(sch->driver_override);
170 kfree(sch->lock);
171 kfree(sch);
207 struct subchannel *sch;
214 sch = kzalloc(sizeof(*sch), GFP_KERNEL | GFP_DMA);
215 if (!sch)
218 sch->schid = schid;
219 sch->schib = *schib;
220 sch->st = schib->pmcw.st;
222 ret = css_sch_create_locks(sch);
226 INIT_WORK(&sch->todo_work, css_sch_todo);
227 sch->dev.release = &css_subchannel_release;
228 sch->dev.dma_mask = &sch->dma_mask;
229 device_initialize(&sch->dev);
234 ret = dma_set_coherent_mask(&sch->dev, DMA_BIT_MASK(31));
241 ret = dma_set_mask(&sch->dev, DMA_BIT_MASK(64));
245 return sch;
248 kfree(sch->lock);
250 kfree(sch);
254 static int css_sch_device_register(struct subchannel *sch)
258 mutex_lock(&sch->reg_mutex);
259 dev_set_name(&sch->dev, "0.%x.%04x", sch->schid.ssid,
260 sch->schid.sch_no);
261 ret = device_add(&sch->dev);
262 mutex_unlock(&sch->reg_mutex);
268 * @sch: subchannel to be unregistered
270 void css_sch_device_unregister(struct subchannel *sch)
272 mutex_lock(&sch->reg_mutex);
273 if (device_is_registered(&sch->dev))
274 device_unregister(&sch->dev);
275 mutex_unlock(&sch->reg_mutex);
307 void css_update_ssd_info(struct subchannel *sch)
311 ret = chsc_get_ssd_info(sch->schid, &sch->ssd_info);
313 ssd_from_pmcw(&sch->ssd_info, &sch->schib.pmcw);
315 ssd_register_chpids(&sch->ssd_info);
321 struct subchannel *sch = to_subchannel(dev);
323 return sprintf(buf, "%01x\n", sch->st);
331 struct subchannel *sch = to_subchannel(dev);
333 return sprintf(buf, "css:t%01X\n", sch->st);
342 struct subchannel *sch = to_subchannel(dev);
345 ret = driver_set_override(dev, &sch->driver_override, buf, count);
355 struct subchannel *sch = to_subchannel(dev);
359 len = snprintf(buf, PAGE_SIZE, "%s\n", sch->driver_override);
385 struct subchannel *sch = to_subchannel(dev);
386 struct chsc_ssd_info *ssd = &sch->ssd_info;
407 struct subchannel *sch = to_subchannel(dev);
408 struct pmcw *pmcw = &sch->schib.pmcw;
419 struct subchannel *sch = to_subchannel(dev);
420 struct pmcw *pmcw = &sch->schib.pmcw;
424 return sysfs_emit(buf, "0.%x.%04x\n", sch->schid.ssid,
443 int css_register_subchannel(struct subchannel *sch)
448 sch->dev.parent = &channel_subsystems[0]->device;
449 sch->dev.bus = &css_bus_type;
450 sch->dev.groups = default_subch_attr_groups;
452 if (sch->st == SUBCHANNEL_TYPE_IO)
453 sch->dev.type = &io_subchannel_type;
455 css_update_ssd_info(sch);
457 ret = css_sch_device_register(sch);
459 CIO_MSG_EVENT(0, "Could not register sch 0.%x.%04x: %d\n",
460 sch->schid.ssid, sch->schid.sch_no, ret);
468 struct subchannel *sch;
471 sch = css_alloc_subchannel(schid, schib);
472 if (IS_ERR(sch))
473 return PTR_ERR(sch);
475 ret = css_register_subchannel(sch);
477 put_device(&sch->dev);
485 struct subchannel *sch;
488 sch = to_subchannel(dev);
489 return schid_equal(&sch->schid, schid);
539 static int css_evaluate_known_subchannel(struct subchannel *sch, int slow)
543 if (sch->driver) {
544 if (sch->driver->sch_event)
545 ret = sch->driver->sch_event(sch, slow);
547 dev_dbg(&sch->dev,
552 CIO_MSG_EVENT(2, "eval: sch 0.%x.%04x, rc=%d\n",
553 sch->schid.ssid, sch->schid.sch_no, ret);
560 struct subchannel *sch;
563 sch = get_subchannel_by_schid(schid);
564 if (sch) {
565 ret = css_evaluate_known_subchannel(sch, slow);
566 put_device(&sch->dev);
575 * @sch: subchannel
582 void css_sched_sch_todo(struct subchannel *sch, enum sch_todo todo)
584 CIO_MSG_EVENT(4, "sch_todo: sched sch=0.%x.%04x todo=%d\n",
585 sch->schid.ssid, sch->schid.sch_no, todo);
586 if (sch->todo >= todo)
589 if (!get_device(&sch->dev))
591 sch->todo = todo;
592 if (!queue_work(cio_work_q, &sch->todo_work)) {
594 put_device(&sch->dev);
601 struct subchannel *sch;
605 sch = container_of(work, struct subchannel, todo_work);
607 spin_lock_irq(sch->lock);
608 todo = sch->todo;
609 CIO_MSG_EVENT(4, "sch_todo: sch=0.%x.%04x, todo=%d\n", sch->schid.ssid,
610 sch->schid.sch_no, todo);
611 sch->todo = SCH_TODO_NOTHING;
612 spin_unlock_irq(sch->lock);
618 ret = css_evaluate_known_subchannel(sch, 1);
620 spin_lock_irq(sch->lock);
621 css_sched_sch_todo(sch, todo);
622 spin_unlock_irq(sch->lock);
626 css_sch_device_unregister(sch);
630 put_device(&sch->dev);
649 static int slow_eval_known_fn(struct subchannel *sch, void *data)
655 eval = idset_sch_contains(slow_subchannel_set, sch->schid);
656 idset_sch_del(slow_subchannel_set, sch->schid);
659 rc = css_evaluate_known_subchannel(sch, 1);
661 css_schedule_eval(sch->schid);
748 struct subchannel *sch = to_subchannel(dev);
749 struct pmcw *pmcw = &sch->schib.pmcw;
756 if (sch->st == SUBCHANNEL_TYPE_IO &&
757 (sch->opm & pmcw->pam & pmcw->pom))
758 idset_sch_del(set, sch->schid);
766 struct subchannel *sch = to_subchannel(dev);
768 if (sch->st == SUBCHANNEL_TYPE_IO && sch->config.ena)
769 idset_sch_del(set, sch->schid);
826 struct subchannel *sch;
847 sch = get_subchannel_by_schid(mchk_schid);
848 if (sch) {
849 css_update_ssd_info(sch);
850 put_device(&sch->dev);
1359 int sch_is_pseudo_sch(struct subchannel *sch)
1361 if (!sch->dev.parent)
1363 return sch == to_css(sch->dev.parent)->pseudo_subchannel;
1368 struct subchannel *sch = to_subchannel(dev);
1373 if (sch->driver_override && strcmp(sch->driver_override, drv->name))
1377 if (sch->st == id->type)
1386 struct subchannel *sch;
1389 sch = to_subchannel(dev);
1390 sch->driver = to_cssdriver(dev->driver);
1391 ret = sch->driver->probe ? sch->driver->probe(sch) : 0;
1393 sch->driver = NULL;
1399 struct subchannel *sch;
1401 sch = to_subchannel(dev);
1402 if (sch->driver->remove)
1403 sch->driver->remove(sch);
1404 sch->driver = NULL;
1409 struct subchannel *sch;
1411 sch = to_subchannel(dev);
1412 if (sch->driver && sch->driver->shutdown)
1413 sch->driver->shutdown(sch);
1418 const struct subchannel *sch = to_subchannel(dev);
1421 ret = add_uevent_var(env, "ST=%01X", sch->st);
1424 ret = add_uevent_var(env, "MODALIAS=css:t%01X", sch->st);