Lines Matching +full:non +full:- +full:operational
1 // SPDX-License-Identifier: GPL-2.0
53 orb->eadm.compat1 = 1; in orb_init()
54 orb->eadm.compat2 = 1; in orb_init()
55 orb->eadm.fmt = 1; in orb_init()
56 orb->eadm.x = 1; in orb_init()
61 union orb *orb = &get_eadm_private(sch)->orb; in eadm_subchannel_start()
65 orb->eadm.aob = (u32)__pa(aob); in eadm_subchannel_start()
66 orb->eadm.intparm = (u32)(addr_t)sch; in eadm_subchannel_start()
67 orb->eadm.key = PAGE_DEFAULT_KEY >> 4; in eadm_subchannel_start()
70 EADM_LOG_HEX(6, &sch->schid, sizeof(sch->schid)); in eadm_subchannel_start()
72 cc = ssch(sch->schid, orb); in eadm_subchannel_start()
75 sch->schib.scsw.eadm.actl |= SCSW_ACTL_START_PEND; in eadm_subchannel_start()
79 return -EBUSY; in eadm_subchannel_start()
80 case 3: /* not operational */ in eadm_subchannel_start()
81 return -ENODEV; in eadm_subchannel_start()
90 cc = csch(sch->schid); in eadm_subchannel_clear()
92 return -ENODEV; in eadm_subchannel_clear()
94 sch->schib.scsw.eadm.actl |= SCSW_ACTL_CLEAR_PEND; in eadm_subchannel_clear()
101 struct subchannel *sch = private->sch; in eadm_subchannel_timeout()
103 spin_lock_irq(sch->lock); in eadm_subchannel_timeout()
105 EADM_LOG_HEX(1, &sch->schid, sizeof(sch->schid)); in eadm_subchannel_timeout()
108 spin_unlock_irq(sch->lock); in eadm_subchannel_timeout()
116 del_timer(&private->timer); in eadm_subchannel_set_timeout()
118 mod_timer(&private->timer, jiffies + expires); in eadm_subchannel_set_timeout()
124 struct eadm_scsw *scsw = &sch->schib.scsw.eadm; in eadm_subchannel_irq()
133 if ((scsw->stctl & (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)) in eadm_subchannel_irq()
134 && scsw->eswf == 1 && irb->esw.eadm.erw.r) in eadm_subchannel_irq()
137 if (scsw->fctl & SCSW_FCTL_CLEAR_FUNC) in eadm_subchannel_irq()
142 if (private->state != EADM_BUSY) { in eadm_subchannel_irq()
145 private->state = EADM_NOT_OPER; in eadm_subchannel_irq()
149 scm_irq_handler((struct aob *)(unsigned long)scsw->aob, error); in eadm_subchannel_irq()
150 private->state = EADM_IDLE; in eadm_subchannel_irq()
152 if (private->completion) in eadm_subchannel_irq()
153 complete(private->completion); in eadm_subchannel_irq()
164 sch = private->sch; in eadm_get_idle_sch()
165 spin_lock(sch->lock); in eadm_get_idle_sch()
166 if (private->state == EADM_IDLE) { in eadm_get_idle_sch()
167 private->state = EADM_BUSY; in eadm_get_idle_sch()
168 list_move_tail(&private->head, &eadm_list); in eadm_get_idle_sch()
169 spin_unlock(sch->lock); in eadm_get_idle_sch()
174 spin_unlock(sch->lock); in eadm_get_idle_sch()
190 return -EBUSY; in eadm_start_aob()
192 spin_lock_irqsave(sch->lock, flags); in eadm_start_aob()
201 private->state = EADM_NOT_OPER; in eadm_start_aob()
205 spin_unlock_irqrestore(sch->lock, flags); in eadm_start_aob()
218 return -ENOMEM; in eadm_subchannel_probe()
220 INIT_LIST_HEAD(&private->head); in eadm_subchannel_probe()
221 timer_setup(&private->timer, eadm_subchannel_timeout, 0); in eadm_subchannel_probe()
223 spin_lock_irq(sch->lock); in eadm_subchannel_probe()
225 private->state = EADM_IDLE; in eadm_subchannel_probe()
226 private->sch = sch; in eadm_subchannel_probe()
227 sch->isc = EADM_SCH_ISC; in eadm_subchannel_probe()
231 spin_unlock_irq(sch->lock); in eadm_subchannel_probe()
235 spin_unlock_irq(sch->lock); in eadm_subchannel_probe()
238 list_add(&private->head, &eadm_list); in eadm_subchannel_probe()
250 spin_lock_irq(sch->lock); in eadm_quiesce()
251 if (private->state != EADM_BUSY) in eadm_quiesce()
257 private->completion = &completion; in eadm_quiesce()
258 spin_unlock_irq(sch->lock); in eadm_quiesce()
262 spin_lock_irq(sch->lock); in eadm_quiesce()
263 private->completion = NULL; in eadm_quiesce()
269 } while (ret == -EBUSY); in eadm_quiesce()
271 spin_unlock_irq(sch->lock); in eadm_quiesce()
279 list_del(&private->head); in eadm_subchannel_remove()
284 spin_lock_irq(sch->lock); in eadm_subchannel_remove()
286 spin_unlock_irq(sch->lock); in eadm_subchannel_remove()
297 * eadm_subchannel_sch_event - process subchannel event
299 * @process: non-zero if function is called in process context
302 * to the current operational state of the subchannel. Return zero when the
303 * event has been handled sufficiently or -EAGAIN when this function should
311 spin_lock_irqsave(sch->lock, flags); in eadm_subchannel_sch_event()
312 if (!device_is_registered(&sch->dev)) in eadm_subchannel_sch_event()
315 if (work_pending(&sch->todo_work)) in eadm_subchannel_sch_event()
323 if (private->state == EADM_NOT_OPER) in eadm_subchannel_sch_event()
324 private->state = EADM_IDLE; in eadm_subchannel_sch_event()
327 spin_unlock_irqrestore(sch->lock, flags); in eadm_subchannel_sch_event()
356 return -ENXIO; in eadm_sch_init()
360 return -ENOMEM; in eadm_sch_init()