Lines Matching +full:non +full:- +full:operational

1 // SPDX-License-Identifier: GPL-2.0
54 orb->eadm.compat1 = 1; in orb_init()
55 orb->eadm.compat2 = 1; in orb_init()
56 orb->eadm.fmt = 1; in orb_init()
57 orb->eadm.x = 1; in orb_init()
62 union orb *orb = &get_eadm_private(sch)->orb; in eadm_subchannel_start()
66 orb->eadm.aob = (u32)virt_to_phys(aob); in eadm_subchannel_start()
67 orb->eadm.intparm = (u32)virt_to_phys(sch); in eadm_subchannel_start()
68 orb->eadm.key = PAGE_DEFAULT_KEY >> 4; in eadm_subchannel_start()
71 EADM_LOG_HEX(6, &sch->schid, sizeof(sch->schid)); in eadm_subchannel_start()
73 cc = ssch(sch->schid, orb); in eadm_subchannel_start()
76 sch->schib.scsw.eadm.actl |= SCSW_ACTL_START_PEND; in eadm_subchannel_start()
80 return -EBUSY; in eadm_subchannel_start()
81 case 3: /* not operational */ in eadm_subchannel_start()
82 return -ENODEV; in eadm_subchannel_start()
91 cc = csch(sch->schid); in eadm_subchannel_clear()
93 return -ENODEV; in eadm_subchannel_clear()
95 sch->schib.scsw.eadm.actl |= SCSW_ACTL_CLEAR_PEND; in eadm_subchannel_clear()
102 struct subchannel *sch = private->sch; in eadm_subchannel_timeout()
104 spin_lock_irq(sch->lock); in eadm_subchannel_timeout()
106 EADM_LOG_HEX(1, &sch->schid, sizeof(sch->schid)); in eadm_subchannel_timeout()
109 spin_unlock_irq(sch->lock); in eadm_subchannel_timeout()
117 del_timer(&private->timer); in eadm_subchannel_set_timeout()
119 mod_timer(&private->timer, jiffies + expires); in eadm_subchannel_set_timeout()
125 struct eadm_scsw *scsw = &sch->schib.scsw.eadm; in eadm_subchannel_irq()
134 if ((scsw->stctl & (SCSW_STCTL_ALERT_STATUS | SCSW_STCTL_STATUS_PEND)) in eadm_subchannel_irq()
135 && scsw->eswf == 1 && irb->esw.eadm.erw.r) in eadm_subchannel_irq()
138 if (scsw->fctl & SCSW_FCTL_CLEAR_FUNC) in eadm_subchannel_irq()
143 if (private->state != EADM_BUSY) { in eadm_subchannel_irq()
146 private->state = EADM_NOT_OPER; in eadm_subchannel_irq()
150 scm_irq_handler(phys_to_virt(scsw->aob), error); in eadm_subchannel_irq()
151 private->state = EADM_IDLE; in eadm_subchannel_irq()
153 if (private->completion) in eadm_subchannel_irq()
154 complete(private->completion); in eadm_subchannel_irq()
165 sch = private->sch; in eadm_get_idle_sch()
166 spin_lock(sch->lock); in eadm_get_idle_sch()
167 if (private->state == EADM_IDLE) { in eadm_get_idle_sch()
168 private->state = EADM_BUSY; in eadm_get_idle_sch()
169 list_move_tail(&private->head, &eadm_list); in eadm_get_idle_sch()
170 spin_unlock(sch->lock); in eadm_get_idle_sch()
175 spin_unlock(sch->lock); in eadm_get_idle_sch()
191 return -EBUSY; in eadm_start_aob()
193 spin_lock_irqsave(sch->lock, flags); in eadm_start_aob()
202 private->state = EADM_NOT_OPER; in eadm_start_aob()
206 spin_unlock_irqrestore(sch->lock, flags); in eadm_start_aob()
219 return -ENOMEM; in eadm_subchannel_probe()
221 INIT_LIST_HEAD(&private->head); in eadm_subchannel_probe()
222 timer_setup(&private->timer, eadm_subchannel_timeout, 0); in eadm_subchannel_probe()
224 spin_lock_irq(sch->lock); in eadm_subchannel_probe()
226 private->state = EADM_IDLE; in eadm_subchannel_probe()
227 private->sch = sch; in eadm_subchannel_probe()
228 sch->isc = EADM_SCH_ISC; in eadm_subchannel_probe()
232 spin_unlock_irq(sch->lock); in eadm_subchannel_probe()
236 spin_unlock_irq(sch->lock); in eadm_subchannel_probe()
239 list_add(&private->head, &eadm_list); in eadm_subchannel_probe()
251 spin_lock_irq(sch->lock); in eadm_quiesce()
252 if (private->state != EADM_BUSY) in eadm_quiesce()
258 private->completion = &completion; in eadm_quiesce()
259 spin_unlock_irq(sch->lock); in eadm_quiesce()
263 spin_lock_irq(sch->lock); in eadm_quiesce()
264 private->completion = NULL; in eadm_quiesce()
270 } while (ret == -EBUSY); in eadm_quiesce()
272 spin_unlock_irq(sch->lock); in eadm_quiesce()
280 list_del(&private->head); in eadm_subchannel_remove()
285 spin_lock_irq(sch->lock); in eadm_subchannel_remove()
287 spin_unlock_irq(sch->lock); in eadm_subchannel_remove()
298 * eadm_subchannel_sch_event - process subchannel event
300 * @process: non-zero if function is called in process context
303 * to the current operational state of the subchannel. Return zero when the
304 * event has been handled sufficiently or -EAGAIN when this function should
312 spin_lock_irqsave(sch->lock, flags); in eadm_subchannel_sch_event()
313 if (!device_is_registered(&sch->dev)) in eadm_subchannel_sch_event()
316 if (work_pending(&sch->todo_work)) in eadm_subchannel_sch_event()
324 if (private->state == EADM_NOT_OPER) in eadm_subchannel_sch_event()
325 private->state = EADM_IDLE; in eadm_subchannel_sch_event()
328 spin_unlock_irqrestore(sch->lock, flags); in eadm_subchannel_sch_event()
357 return -ENXIO; in eadm_sch_init()
361 return -ENOMEM; in eadm_sch_init()