Lines Matching refs:sch
90 int cio_set_options(struct subchannel *sch, int flags) in cio_set_options() argument
92 struct io_subchannel_private *priv = to_io_private(sch); in cio_set_options()
101 cio_start_handle_notoper(struct subchannel *sch, __u8 lpm) in cio_start_handle_notoper() argument
106 sch->lpm &= ~lpm; in cio_start_handle_notoper()
108 sch->lpm = 0; in cio_start_handle_notoper()
111 "subchannel 0.%x.%04x!\n", sch->schid.ssid, in cio_start_handle_notoper()
112 sch->schid.sch_no); in cio_start_handle_notoper()
114 if (cio_update_schib(sch)) in cio_start_handle_notoper()
117 sprintf(dbf_text, "no%s", dev_name(&sch->dev)); in cio_start_handle_notoper()
119 CIO_HEX_EVENT(0, &sch->schib, sizeof (struct schib)); in cio_start_handle_notoper()
121 return (sch->lpm ? -EACCES : -ENODEV); in cio_start_handle_notoper()
125 cio_start_key (struct subchannel *sch, /* subchannel structure */ in cio_start_key() argument
130 struct io_subchannel_private *priv = to_io_private(sch); in cio_start_key()
135 CIO_TRACE_EVENT(5, dev_name(&sch->dev)); in cio_start_key()
139 orb->cmd.intparm = (u32)(addr_t)sch; in cio_start_key()
145 orb->cmd.lpm = (lpm != 0) ? lpm : sch->lpm; in cio_start_key()
154 ccode = ssch(sch->schid, orb); in cio_start_key()
164 sch->schib.scsw.cmd.actl |= SCSW_ACTL_START_PEND; in cio_start_key()
170 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()
186 cio_resume (struct subchannel *sch) in cio_resume() argument
191 CIO_TRACE_EVENT(4, dev_name(&sch->dev)); in cio_resume()
193 ccode = rsch (sch->schid); in cio_resume()
199 sch->schib.scsw.cmd.actl |= SCSW_ACTL_RESUME_PEND; in cio_resume()
218 cio_halt(struct subchannel *sch) in cio_halt() argument
222 if (!sch) in cio_halt()
226 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_halt()
231 ccode = hsch (sch->schid); in cio_halt()
237 sch->schib.scsw.cmd.actl |= SCSW_ACTL_HALT_PEND; in cio_halt()
251 cio_clear(struct subchannel *sch) in cio_clear() argument
255 if (!sch) in cio_clear()
259 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_clear()
264 ccode = csch (sch->schid); in cio_clear()
270 sch->schib.scsw.cmd.actl |= SCSW_ACTL_CLEAR_PEND; in cio_clear()
285 cio_cancel (struct subchannel *sch) in cio_cancel() argument
289 if (!sch) in cio_cancel()
293 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_cancel()
295 ccode = xsch (sch->schid); in cio_cancel()
302 if (cio_update_schib(sch)) in cio_cancel()
315 static void cio_apply_config(struct subchannel *sch, struct schib *schib) in cio_apply_config() argument
317 schib->pmcw.intparm = sch->config.intparm; in cio_apply_config()
318 schib->pmcw.mbi = sch->config.mbi; in cio_apply_config()
319 schib->pmcw.isc = sch->config.isc; in cio_apply_config()
320 schib->pmcw.ena = sch->config.ena; in cio_apply_config()
321 schib->pmcw.mme = sch->config.mme; in cio_apply_config()
322 schib->pmcw.mp = sch->config.mp; in cio_apply_config()
323 schib->pmcw.csense = sch->config.csense; in cio_apply_config()
324 schib->pmcw.mbfc = sch->config.mbfc; in cio_apply_config()
325 if (sch->config.mbfc) in cio_apply_config()
326 schib->mba = sch->config.mba; in cio_apply_config()
329 static int cio_check_config(struct subchannel *sch, struct schib *schib) in cio_check_config() argument
331 return (schib->pmcw.intparm == sch->config.intparm) && in cio_check_config()
332 (schib->pmcw.mbi == sch->config.mbi) && in cio_check_config()
333 (schib->pmcw.isc == sch->config.isc) && in cio_check_config()
334 (schib->pmcw.ena == sch->config.ena) && in cio_check_config()
335 (schib->pmcw.mme == sch->config.mme) && in cio_check_config()
336 (schib->pmcw.mp == sch->config.mp) && in cio_check_config()
337 (schib->pmcw.csense == sch->config.csense) && in cio_check_config()
338 (schib->pmcw.mbfc == sch->config.mbfc) && in cio_check_config()
339 (!sch->config.mbfc || (schib->mba == sch->config.mba)); in cio_check_config()
345 int cio_commit_config(struct subchannel *sch) in cio_commit_config() argument
351 if (stsch_err(sch->schid, &schib) || !css_sch_is_valid(&schib)) in cio_commit_config()
356 cio_apply_config(sch, &schib); in cio_commit_config()
357 ccode = msch_err(sch->schid, &schib); in cio_commit_config()
362 if (stsch_err(sch->schid, &schib) || in cio_commit_config()
365 if (cio_check_config(sch, &schib)) { in cio_commit_config()
367 memcpy(&sch->schib, &schib, sizeof(schib)); in cio_commit_config()
374 if (tsch(sch->schid, &irb)) in cio_commit_config()
393 int cio_update_schib(struct subchannel *sch) in cio_update_schib() argument
397 if (stsch_err(sch->schid, &schib) || !css_sch_is_valid(&schib)) in cio_update_schib()
400 memcpy(&sch->schib, &schib, sizeof(schib)); in cio_update_schib()
410 int cio_enable_subchannel(struct subchannel *sch, u32 intparm) in cio_enable_subchannel() argument
415 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_enable_subchannel()
417 if (sch_is_pseudo_sch(sch)) in cio_enable_subchannel()
419 if (cio_update_schib(sch)) in cio_enable_subchannel()
422 sch->config.ena = 1; in cio_enable_subchannel()
423 sch->config.isc = sch->isc; in cio_enable_subchannel()
424 sch->config.intparm = intparm; in cio_enable_subchannel()
426 ret = cio_commit_config(sch); in cio_enable_subchannel()
432 sch->config.csense = 0; in cio_enable_subchannel()
433 ret = cio_commit_config(sch); in cio_enable_subchannel()
444 int cio_disable_subchannel(struct subchannel *sch) in cio_disable_subchannel() argument
449 CIO_TRACE_EVENT(2, dev_name(&sch->dev)); in cio_disable_subchannel()
451 if (sch_is_pseudo_sch(sch)) in cio_disable_subchannel()
453 if (cio_update_schib(sch)) in cio_disable_subchannel()
456 sch->config.ena = 0; in cio_disable_subchannel()
457 ret = cio_commit_config(sch); in cio_disable_subchannel()
464 static int cio_check_devno_blacklisted(struct subchannel *sch) in cio_check_devno_blacklisted() argument
466 if (is_blacklisted(sch->schid.ssid, sch->schib.pmcw.dev)) { in cio_check_devno_blacklisted()
473 sch->schib.pmcw.dev, sch->schid.ssid); in cio_check_devno_blacklisted()
479 static int cio_validate_io_subchannel(struct subchannel *sch) in cio_validate_io_subchannel() argument
482 if (!css_sch_is_valid(&sch->schib)) in cio_validate_io_subchannel()
486 return cio_check_devno_blacklisted(sch); in cio_validate_io_subchannel()
489 static int cio_validate_msg_subchannel(struct subchannel *sch) in cio_validate_msg_subchannel() argument
492 if (!css_sch_is_valid(&sch->schib)) in cio_validate_msg_subchannel()
496 return cio_check_devno_blacklisted(sch); in cio_validate_msg_subchannel()
511 int cio_validate_subchannel(struct subchannel *sch, struct subchannel_id schid) in cio_validate_subchannel() argument
526 ccode = stsch_err(schid, &sch->schib); in cio_validate_subchannel()
531 sch->st = sch->schib.pmcw.st; in cio_validate_subchannel()
532 sch->schid = schid; in cio_validate_subchannel()
534 switch (sch->st) { in cio_validate_subchannel()
536 err = cio_validate_io_subchannel(sch); in cio_validate_subchannel()
539 err = cio_validate_msg_subchannel(sch); in cio_validate_subchannel()
548 sch->schid.ssid, sch->schid.sch_no, sch->st); in cio_validate_subchannel()
559 struct subchannel *sch; in do_cio_interrupt() local
565 sch = (struct subchannel *)(unsigned long) tpi_info->intparm; in do_cio_interrupt()
566 if (!sch) { in do_cio_interrupt()
572 spin_lock(sch->lock); in do_cio_interrupt()
576 memcpy (&sch->schib.scsw, &irb->scsw, sizeof (irb->scsw)); in do_cio_interrupt()
578 if (sch->driver && sch->driver->irq) in do_cio_interrupt()
579 sch->driver->irq(sch); in do_cio_interrupt()
584 spin_unlock(sch->lock); in do_cio_interrupt()
609 void cio_tsch(struct subchannel *sch) in cio_tsch() argument
616 if (tsch(sch->schid, irb) != 0) in cio_tsch()
619 memcpy(&sch->schib.scsw, &irb->scsw, sizeof(union scsw)); in cio_tsch()
627 if (sch->driver && sch->driver->irq) in cio_tsch()
628 sch->driver->irq(sch); in cio_tsch()
674 struct subchannel *sch; in cio_probe_console() local
684 sch = css_alloc_subchannel(schid); in cio_probe_console()
685 if (IS_ERR(sch)) in cio_probe_console()
686 return sch; in cio_probe_console()
688 lockdep_set_class(sch->lock, &console_sch_key); in cio_probe_console()
690 sch->config.isc = CONSOLE_ISC; in cio_probe_console()
691 sch->config.intparm = (u32)(addr_t)sch; in cio_probe_console()
692 ret = cio_commit_config(sch); in cio_probe_console()
695 put_device(&sch->dev); in cio_probe_console()
698 console_sch = sch; in cio_probe_console()
699 return sch; in cio_probe_console()
974 int cio_tm_start_key(struct subchannel *sch, struct tcw *tcw, u8 lpm, u8 key) in cio_tm_start_key() argument
977 union orb *orb = &to_io_private(sch)->orb; in cio_tm_start_key()
980 orb->tm.intparm = (u32) (addr_t) sch; in cio_tm_start_key()
983 orb->tm.lpm = lpm ? lpm : sch->lpm; in cio_tm_start_key()
985 cc = ssch(sch->schid, orb); in cio_tm_start_key()
993 return cio_start_handle_notoper(sch, lpm); in cio_tm_start_key()
1004 int cio_tm_intrg(struct subchannel *sch) in cio_tm_intrg() argument
1008 if (!to_io_private(sch)->orb.tm.b) in cio_tm_intrg()
1010 cc = xsch(sch->schid); in cio_tm_intrg()