Lines Matching full:sch
61 static int eadm_subchannel_start(struct subchannel *sch, struct aob *aob) in eadm_subchannel_start() argument
63 union orb *orb = &get_eadm_private(sch)->orb; in eadm_subchannel_start()
68 orb->eadm.intparm = (u32)virt_to_phys(sch); in eadm_subchannel_start()
72 EADM_LOG_HEX(6, &sch->schid, sizeof(sch->schid)); in eadm_subchannel_start()
74 cc = ssch(sch->schid, orb); in eadm_subchannel_start()
77 sch->schib.scsw.eadm.actl |= SCSW_ACTL_START_PEND; in eadm_subchannel_start()
88 static int eadm_subchannel_clear(struct subchannel *sch) in eadm_subchannel_clear() argument
92 cc = csch(sch->schid); in eadm_subchannel_clear()
96 sch->schib.scsw.eadm.actl |= SCSW_ACTL_CLEAR_PEND; in eadm_subchannel_clear()
103 struct subchannel *sch = private->sch; in eadm_subchannel_timeout() local
105 spin_lock_irq(&sch->lock); in eadm_subchannel_timeout()
107 EADM_LOG_HEX(1, &sch->schid, sizeof(sch->schid)); in eadm_subchannel_timeout()
108 if (eadm_subchannel_clear(sch)) in eadm_subchannel_timeout()
110 spin_unlock_irq(&sch->lock); in eadm_subchannel_timeout()
113 static void eadm_subchannel_set_timeout(struct subchannel *sch, int expires) in eadm_subchannel_set_timeout() argument
115 struct eadm_private *private = get_eadm_private(sch); in eadm_subchannel_set_timeout()
123 static void eadm_subchannel_irq(struct subchannel *sch) in eadm_subchannel_irq() argument
125 struct eadm_private *private = get_eadm_private(sch); in eadm_subchannel_irq()
126 struct eadm_scsw *scsw = &sch->schib.scsw.eadm; in eadm_subchannel_irq()
142 eadm_subchannel_set_timeout(sch, 0); in eadm_subchannel_irq()
148 css_sched_sch_todo(sch, SCH_TODO_EVAL); in eadm_subchannel_irq()
161 struct subchannel *sch; in eadm_get_idle_sch() local
166 sch = private->sch; in eadm_get_idle_sch()
167 spin_lock(&sch->lock); in eadm_get_idle_sch()
171 spin_unlock(&sch->lock); in eadm_get_idle_sch()
174 return sch; in eadm_get_idle_sch()
176 spin_unlock(&sch->lock); in eadm_get_idle_sch()
186 struct subchannel *sch; in eadm_start_aob() local
190 sch = eadm_get_idle_sch(); in eadm_start_aob()
191 if (!sch) in eadm_start_aob()
194 spin_lock_irqsave(&sch->lock, flags); in eadm_start_aob()
195 eadm_subchannel_set_timeout(sch, EADM_TIMEOUT); in eadm_start_aob()
196 ret = eadm_subchannel_start(sch, aob); in eadm_start_aob()
201 eadm_subchannel_set_timeout(sch, 0); in eadm_start_aob()
202 private = get_eadm_private(sch); in eadm_start_aob()
204 css_sched_sch_todo(sch, SCH_TODO_EVAL); in eadm_start_aob()
207 spin_unlock_irqrestore(&sch->lock, flags); in eadm_start_aob()
213 static int eadm_subchannel_probe(struct subchannel *sch) in eadm_subchannel_probe() argument
225 spin_lock_irq(&sch->lock); in eadm_subchannel_probe()
226 set_eadm_private(sch, private); in eadm_subchannel_probe()
228 private->sch = sch; in eadm_subchannel_probe()
229 sch->isc = EADM_SCH_ISC; in eadm_subchannel_probe()
230 ret = cio_enable_subchannel(sch, (u32)virt_to_phys(sch)); in eadm_subchannel_probe()
232 set_eadm_private(sch, NULL); in eadm_subchannel_probe()
233 spin_unlock_irq(&sch->lock); in eadm_subchannel_probe()
237 spin_unlock_irq(&sch->lock); in eadm_subchannel_probe()
246 static void eadm_quiesce(struct subchannel *sch) in eadm_quiesce() argument
248 struct eadm_private *private = get_eadm_private(sch); in eadm_quiesce()
252 spin_lock_irq(&sch->lock); in eadm_quiesce()
256 if (eadm_subchannel_clear(sch)) in eadm_quiesce()
260 spin_unlock_irq(&sch->lock); in eadm_quiesce()
264 spin_lock_irq(&sch->lock); in eadm_quiesce()
268 eadm_subchannel_set_timeout(sch, 0); in eadm_quiesce()
270 ret = cio_disable_subchannel(sch); in eadm_quiesce()
273 spin_unlock_irq(&sch->lock); in eadm_quiesce()
276 static void eadm_subchannel_remove(struct subchannel *sch) in eadm_subchannel_remove() argument
278 struct eadm_private *private = get_eadm_private(sch); in eadm_subchannel_remove()
284 eadm_quiesce(sch); in eadm_subchannel_remove()
286 spin_lock_irq(&sch->lock); in eadm_subchannel_remove()
287 set_eadm_private(sch, NULL); in eadm_subchannel_remove()
288 spin_unlock_irq(&sch->lock); in eadm_subchannel_remove()
293 static void eadm_subchannel_shutdown(struct subchannel *sch) in eadm_subchannel_shutdown() argument
295 eadm_quiesce(sch); in eadm_subchannel_shutdown()
300 * @sch: subchannel
308 static int eadm_subchannel_sch_event(struct subchannel *sch, int process) in eadm_subchannel_sch_event() argument
313 spin_lock_irqsave(&sch->lock, flags); in eadm_subchannel_sch_event()
314 if (!device_is_registered(&sch->dev)) in eadm_subchannel_sch_event()
317 if (work_pending(&sch->todo_work)) in eadm_subchannel_sch_event()
320 if (cio_update_schib(sch)) { in eadm_subchannel_sch_event()
321 css_sched_sch_todo(sch, SCH_TODO_UNREG); in eadm_subchannel_sch_event()
324 private = get_eadm_private(sch); in eadm_subchannel_sch_event()
329 spin_unlock_irqrestore(&sch->lock, flags); in eadm_subchannel_sch_event()