Lines Matching refs:sch

64 static int eadm_subchannel_start(struct subchannel *sch, struct aob *aob)  in eadm_subchannel_start()  argument
66 union orb *orb = &get_eadm_private(sch)->orb; in eadm_subchannel_start()
71 orb->eadm.intparm = (u32)(addr_t)sch; in eadm_subchannel_start()
75 EADM_LOG_HEX(6, &sch->schid, sizeof(sch->schid)); in eadm_subchannel_start()
77 cc = ssch(sch->schid, orb); in eadm_subchannel_start()
80 sch->schib.scsw.eadm.actl |= SCSW_ACTL_START_PEND; in eadm_subchannel_start()
91 static int eadm_subchannel_clear(struct subchannel *sch) in eadm_subchannel_clear() argument
95 cc = csch(sch->schid); in eadm_subchannel_clear()
99 sch->schib.scsw.eadm.actl |= SCSW_ACTL_CLEAR_PEND; in eadm_subchannel_clear()
105 struct subchannel *sch = (struct subchannel *) data; in eadm_subchannel_timeout() local
107 spin_lock_irq(sch->lock); in eadm_subchannel_timeout()
109 EADM_LOG_HEX(1, &sch->schid, sizeof(sch->schid)); in eadm_subchannel_timeout()
110 if (eadm_subchannel_clear(sch)) in eadm_subchannel_timeout()
112 spin_unlock_irq(sch->lock); in eadm_subchannel_timeout()
115 static void eadm_subchannel_set_timeout(struct subchannel *sch, int expires) in eadm_subchannel_set_timeout() argument
117 struct eadm_private *private = get_eadm_private(sch); in eadm_subchannel_set_timeout()
128 private->timer.data = (unsigned long) sch; in eadm_subchannel_set_timeout()
133 static void eadm_subchannel_irq(struct subchannel *sch) in eadm_subchannel_irq() argument
135 struct eadm_private *private = get_eadm_private(sch); in eadm_subchannel_irq()
136 struct eadm_scsw *scsw = &sch->schib.scsw.eadm; in eadm_subchannel_irq()
152 eadm_subchannel_set_timeout(sch, 0); in eadm_subchannel_irq()
158 css_sched_sch_todo(sch, SCH_TODO_EVAL); in eadm_subchannel_irq()
171 struct subchannel *sch; in eadm_get_idle_sch() local
176 sch = private->sch; in eadm_get_idle_sch()
177 spin_lock(sch->lock); in eadm_get_idle_sch()
181 spin_unlock(sch->lock); in eadm_get_idle_sch()
184 return sch; in eadm_get_idle_sch()
186 spin_unlock(sch->lock); in eadm_get_idle_sch()
196 struct subchannel *sch; in eadm_start_aob() local
200 sch = eadm_get_idle_sch(); in eadm_start_aob()
201 if (!sch) in eadm_start_aob()
204 spin_lock_irqsave(sch->lock, flags); in eadm_start_aob()
205 eadm_subchannel_set_timeout(sch, EADM_TIMEOUT); in eadm_start_aob()
206 ret = eadm_subchannel_start(sch, aob); in eadm_start_aob()
211 eadm_subchannel_set_timeout(sch, 0); in eadm_start_aob()
212 private = get_eadm_private(sch); in eadm_start_aob()
214 css_sched_sch_todo(sch, SCH_TODO_EVAL); in eadm_start_aob()
217 spin_unlock_irqrestore(sch->lock, flags); in eadm_start_aob()
223 static int eadm_subchannel_probe(struct subchannel *sch) in eadm_subchannel_probe() argument
235 spin_lock_irq(sch->lock); in eadm_subchannel_probe()
236 set_eadm_private(sch, private); in eadm_subchannel_probe()
238 private->sch = sch; in eadm_subchannel_probe()
239 sch->isc = EADM_SCH_ISC; in eadm_subchannel_probe()
240 ret = cio_enable_subchannel(sch, (u32)(unsigned long)sch); in eadm_subchannel_probe()
242 set_eadm_private(sch, NULL); in eadm_subchannel_probe()
243 spin_unlock_irq(sch->lock); in eadm_subchannel_probe()
247 spin_unlock_irq(sch->lock); in eadm_subchannel_probe()
253 if (dev_get_uevent_suppress(&sch->dev)) { in eadm_subchannel_probe()
254 dev_set_uevent_suppress(&sch->dev, 0); in eadm_subchannel_probe()
255 kobject_uevent(&sch->dev.kobj, KOBJ_ADD); in eadm_subchannel_probe()
261 static void eadm_quiesce(struct subchannel *sch) in eadm_quiesce() argument
263 struct eadm_private *private = get_eadm_private(sch); in eadm_quiesce()
267 spin_lock_irq(sch->lock); in eadm_quiesce()
271 if (eadm_subchannel_clear(sch)) in eadm_quiesce()
275 spin_unlock_irq(sch->lock); in eadm_quiesce()
279 spin_lock_irq(sch->lock); in eadm_quiesce()
283 eadm_subchannel_set_timeout(sch, 0); in eadm_quiesce()
285 ret = cio_disable_subchannel(sch); in eadm_quiesce()
288 spin_unlock_irq(sch->lock); in eadm_quiesce()
291 static int eadm_subchannel_remove(struct subchannel *sch) in eadm_subchannel_remove() argument
293 struct eadm_private *private = get_eadm_private(sch); in eadm_subchannel_remove()
299 eadm_quiesce(sch); in eadm_subchannel_remove()
301 spin_lock_irq(sch->lock); in eadm_subchannel_remove()
302 set_eadm_private(sch, NULL); in eadm_subchannel_remove()
303 spin_unlock_irq(sch->lock); in eadm_subchannel_remove()
310 static void eadm_subchannel_shutdown(struct subchannel *sch) in eadm_subchannel_shutdown() argument
312 eadm_quiesce(sch); in eadm_subchannel_shutdown()
315 static int eadm_subchannel_freeze(struct subchannel *sch) in eadm_subchannel_freeze() argument
317 return cio_disable_subchannel(sch); in eadm_subchannel_freeze()
320 static int eadm_subchannel_restore(struct subchannel *sch) in eadm_subchannel_restore() argument
322 return cio_enable_subchannel(sch, (u32)(unsigned long)sch); in eadm_subchannel_restore()
335 static int eadm_subchannel_sch_event(struct subchannel *sch, int process) in eadm_subchannel_sch_event() argument
340 spin_lock_irqsave(sch->lock, flags); in eadm_subchannel_sch_event()
341 if (!device_is_registered(&sch->dev)) in eadm_subchannel_sch_event()
344 if (work_pending(&sch->todo_work)) in eadm_subchannel_sch_event()
347 if (cio_update_schib(sch)) { in eadm_subchannel_sch_event()
348 css_sched_sch_todo(sch, SCH_TODO_UNREG); in eadm_subchannel_sch_event()
351 private = get_eadm_private(sch); in eadm_subchannel_sch_event()
356 spin_unlock_irqrestore(sch->lock, flags); in eadm_subchannel_sch_event()