Lines Matching full:sch

89 int cio_set_options(struct subchannel *sch, int flags)  in cio_set_options()  argument
91 struct io_subchannel_private *priv = to_io_private(sch); in cio_set_options()
100 cio_start_handle_notoper(struct subchannel *sch, __u8 lpm) in cio_start_handle_notoper() argument
105 sch->lpm &= ~lpm; in cio_start_handle_notoper()
107 sch->lpm = 0; in cio_start_handle_notoper()
110 "subchannel 0.%x.%04x!\n", sch->schid.ssid, in cio_start_handle_notoper()
111 sch->schid.sch_no); in cio_start_handle_notoper()
113 if (cio_update_schib(sch)) in cio_start_handle_notoper()
116 sprintf(dbf_text, "no%s", dev_name(&sch->dev)); in cio_start_handle_notoper()
118 CIO_HEX_EVENT(0, &sch->schib, sizeof (struct schib)); in cio_start_handle_notoper()
120 return (sch->lpm ? -EACCES : -ENODEV); in cio_start_handle_notoper()
124 cio_start_key (struct subchannel *sch, /* subchannel structure */ in cio_start_key() argument
129 struct io_subchannel_private *priv = to_io_private(sch); in cio_start_key()
134 CIO_TRACE_EVENT(5, dev_name(&sch->dev)); in cio_start_key()
137 /* sch is always under 2G. */ in cio_start_key()
138 orb->cmd.intparm = (u32)virt_to_phys(sch); in cio_start_key()
144 orb->cmd.lpm = (lpm != 0) ? lpm : sch->lpm; in cio_start_key()
153 ccode = ssch(sch->schid, orb); in cio_start_key()
163 sch->schib.scsw.cmd.actl |= SCSW_ACTL_START_PEND; in cio_start_key()
169 return cio_start_handle_notoper(sch, lpm); in cio_start_key()
177 cio_start (struct subchannel *sch, struct ccw1 *cpa, __u8 lpm) in cio_start() argument
179 return cio_start_key(sch, cpa, lpm, PAGE_DEFAULT_KEY); in cio_start()
187 cio_resume (struct subchannel *sch) in cio_resume() argument
192 CIO_TRACE_EVENT(4, dev_name(&sch->dev)); in cio_resume()
194 ccode = rsch (sch->schid); in cio_resume()
200 sch->schib.scsw.cmd.actl |= SCSW_ACTL_RESUME_PEND; in cio_resume()
220 cio_halt(struct subchannel *sch) in cio_halt() argument
224 if (!sch) in cio_halt()
228 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_halt()
233 ccode = hsch (sch->schid); in cio_halt()
239 sch->schib.scsw.cmd.actl |= SCSW_ACTL_HALT_PEND; in cio_halt()
254 cio_clear(struct subchannel *sch) in cio_clear() argument
258 if (!sch) in cio_clear()
262 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_clear()
267 ccode = csch (sch->schid); in cio_clear()
273 sch->schib.scsw.cmd.actl |= SCSW_ACTL_CLEAR_PEND; in cio_clear()
289 cio_cancel (struct subchannel *sch) in cio_cancel() argument
293 if (!sch) in cio_cancel()
297 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_cancel()
299 ccode = xsch (sch->schid); in cio_cancel()
306 if (cio_update_schib(sch)) in cio_cancel()
322 * @sch: subchannel on which to perform the cancel_halt_clear operation
335 int cio_cancel_halt_clear(struct subchannel *sch, int *iretry) in cio_cancel_halt_clear() argument
339 if (cio_update_schib(sch)) in cio_cancel_halt_clear()
341 if (!sch->schib.pmcw.ena) in cio_cancel_halt_clear()
345 if (!(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_HALT_PEND) && in cio_cancel_halt_clear()
346 !(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_CLEAR_PEND)) { in cio_cancel_halt_clear()
347 if (!scsw_is_tm(&sch->schib.scsw)) { in cio_cancel_halt_clear()
348 ret = cio_cancel(sch); in cio_cancel_halt_clear()
359 if (!(scsw_actl(&sch->schib.scsw) & SCSW_ACTL_CLEAR_PEND)) { in cio_cancel_halt_clear()
362 ret = cio_halt(sch); in cio_cancel_halt_clear()
372 ret = cio_clear(sch); in cio_cancel_halt_clear()
380 static void cio_apply_config(struct subchannel *sch, struct schib *schib) in cio_apply_config() argument
382 schib->pmcw.intparm = sch->config.intparm; in cio_apply_config()
383 schib->pmcw.mbi = sch->config.mbi; in cio_apply_config()
384 schib->pmcw.isc = sch->config.isc; in cio_apply_config()
385 schib->pmcw.ena = sch->config.ena; in cio_apply_config()
386 schib->pmcw.mme = sch->config.mme; in cio_apply_config()
387 schib->pmcw.mp = sch->config.mp; in cio_apply_config()
388 schib->pmcw.csense = sch->config.csense; in cio_apply_config()
389 schib->pmcw.mbfc = sch->config.mbfc; in cio_apply_config()
390 if (sch->config.mbfc) in cio_apply_config()
391 schib->mba = sch->config.mba; in cio_apply_config()
394 static int cio_check_config(struct subchannel *sch, struct schib *schib) in cio_check_config() argument
396 return (schib->pmcw.intparm == sch->config.intparm) && in cio_check_config()
397 (schib->pmcw.mbi == sch->config.mbi) && in cio_check_config()
398 (schib->pmcw.isc == sch->config.isc) && in cio_check_config()
399 (schib->pmcw.ena == sch->config.ena) && in cio_check_config()
400 (schib->pmcw.mme == sch->config.mme) && in cio_check_config()
401 (schib->pmcw.mp == sch->config.mp) && in cio_check_config()
402 (schib->pmcw.csense == sch->config.csense) && in cio_check_config()
403 (schib->pmcw.mbfc == sch->config.mbfc) && in cio_check_config()
404 (!sch->config.mbfc || (schib->mba == sch->config.mba)); in cio_check_config()
410 int cio_commit_config(struct subchannel *sch) in cio_commit_config() argument
416 if (stsch(sch->schid, &schib) || !css_sch_is_valid(&schib)) in cio_commit_config()
421 cio_apply_config(sch, &schib); in cio_commit_config()
422 ccode = msch(sch->schid, &schib); in cio_commit_config()
427 if (stsch(sch->schid, &schib) || in cio_commit_config()
430 if (cio_check_config(sch, &schib)) { in cio_commit_config()
432 memcpy(&sch->schib, &schib, sizeof(schib)); in cio_commit_config()
439 if (tsch(sch->schid, &irb)) in cio_commit_config()
456 * @sch: subchannel on which to perform stsch
459 int cio_update_schib(struct subchannel *sch) in cio_update_schib() argument
463 if (stsch(sch->schid, &schib)) in cio_update_schib()
466 memcpy(&sch->schib, &schib, sizeof(schib)); in cio_update_schib()
477 * @sch: subchannel to be enabled
480 int cio_enable_subchannel(struct subchannel *sch, u32 intparm) in cio_enable_subchannel() argument
485 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_enable_subchannel()
487 if (sch_is_pseudo_sch(sch)) in cio_enable_subchannel()
489 if (cio_update_schib(sch)) in cio_enable_subchannel()
492 sch->config.ena = 1; in cio_enable_subchannel()
493 sch->config.isc = sch->isc; in cio_enable_subchannel()
494 sch->config.intparm = intparm; in cio_enable_subchannel()
496 ret = cio_commit_config(sch); in cio_enable_subchannel()
502 sch->config.csense = 0; in cio_enable_subchannel()
503 ret = cio_commit_config(sch); in cio_enable_subchannel()
512 * @sch: subchannel to disable
514 int cio_disable_subchannel(struct subchannel *sch) in cio_disable_subchannel() argument
519 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_disable_subchannel()
521 if (sch_is_pseudo_sch(sch)) in cio_disable_subchannel()
523 if (cio_update_schib(sch)) in cio_disable_subchannel()
526 sch->config.ena = 0; in cio_disable_subchannel()
527 ret = cio_commit_config(sch); in cio_disable_subchannel()
540 struct subchannel *sch; in do_cio_interrupt() local
552 sch = phys_to_virt(tpi_info->intparm); in do_cio_interrupt()
553 spin_lock(&sch->lock); in do_cio_interrupt()
557 memcpy (&sch->schib.scsw, &irb->scsw, sizeof (irb->scsw)); in do_cio_interrupt()
559 if (sch->driver && sch->driver->irq) in do_cio_interrupt()
560 sch->driver->irq(sch); in do_cio_interrupt()
565 spin_unlock(&sch->lock); in do_cio_interrupt()
586 void cio_tsch(struct subchannel *sch) in cio_tsch() argument
593 if (tsch(sch->schid, irb) != 0) in cio_tsch()
596 memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw)); in cio_tsch()
604 if (sch->driver && sch->driver->irq) in cio_tsch()
605 sch->driver->irq(sch); in cio_tsch()
651 struct subchannel *sch; in cio_probe_console() local
666 sch = css_alloc_subchannel(schid, &schib); in cio_probe_console()
667 if (IS_ERR(sch)) in cio_probe_console()
668 return sch; in cio_probe_console()
670 lockdep_set_class(&sch->lock, &console_sch_key); in cio_probe_console()
672 sch->config.isc = CONSOLE_ISC; in cio_probe_console()
673 sch->config.intparm = (u32)virt_to_phys(sch); in cio_probe_console()
674 ret = cio_commit_config(sch); in cio_probe_console()
677 put_device(&sch->dev); in cio_probe_console()
680 console_sch = sch; in cio_probe_console()
681 return sch; in cio_probe_console()
706 * @sch: subchannel on which to perform the start function
714 int cio_tm_start_key(struct subchannel *sch, struct tcw *tcw, u8 lpm, u8 key) in cio_tm_start_key() argument
717 union orb *orb = &to_io_private(sch)->orb; in cio_tm_start_key()
720 orb->tm.intparm = (u32)virt_to_phys(sch); in cio_tm_start_key()
723 orb->tm.lpm = lpm ? lpm : sch->lpm; in cio_tm_start_key()
725 cc = ssch(sch->schid, orb); in cio_tm_start_key()
733 return cio_start_handle_notoper(sch, lpm); in cio_tm_start_key()
740 * @sch: subchannel on which to perform the interrogate function
745 int cio_tm_intrg(struct subchannel *sch) in cio_tm_intrg() argument
749 if (!to_io_private(sch)->orb.tm.b) in cio_tm_intrg()
751 cc = xsch(sch->schid); in cio_tm_intrg()