Lines Matching refs:sch
39 int vfio_ccw_sch_quiesce(struct subchannel *sch)
41 struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev);
45 spin_lock_irq(sch->lock);
46 if (!sch->schib.pmcw.ena)
48 ret = cio_disable_subchannel(sch);
55 ret = cio_cancel_halt_clear(sch, &iretry);
59 sch->schid.ssid, sch->schid.sch_no);
68 spin_unlock_irq(sch->lock);
75 spin_lock_irq(sch->lock);
76 ret = cio_disable_subchannel(sch);
80 spin_unlock_irq(sch->lock);
132 static void vfio_ccw_sch_irq(struct subchannel *sch)
134 struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev);
152 static int vfio_ccw_sch_probe(struct subchannel *sch)
154 struct pmcw *pmcw = &sch->schib.pmcw;
159 dev_warn(&sch->dev, "vfio: ccw: does not support QDIO: %s\n",
160 dev_name(&sch->dev));
195 private->sch = sch;
196 dev_set_drvdata(&sch->dev, private);
199 spin_lock_irq(sch->lock);
201 sch->isc = VFIO_CCW_ISC;
202 ret = cio_enable_subchannel(sch, (u32)(unsigned long)sch);
203 spin_unlock_irq(sch->lock);
213 ret = vfio_ccw_mdev_reg(sch);
217 if (dev_get_uevent_suppress(&sch->dev)) {
218 dev_set_uevent_suppress(&sch->dev, 0);
219 kobject_uevent(&sch->dev.kobj, KOBJ_ADD);
223 sch->schid.cssid, sch->schid.ssid,
224 sch->schid.sch_no);
228 cio_disable_subchannel(sch);
230 dev_set_drvdata(&sch->dev, NULL);
237 static int vfio_ccw_sch_remove(struct subchannel *sch)
239 struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev);
242 vfio_ccw_sch_quiesce(sch);
249 vfio_ccw_mdev_unreg(sch);
251 dev_set_drvdata(&sch->dev, NULL);
258 sch->schid.cssid, sch->schid.ssid,
259 sch->schid.sch_no);
263 static void vfio_ccw_sch_shutdown(struct subchannel *sch)
265 vfio_ccw_sch_quiesce(sch);
270 * @sch: subchannel
278 static int vfio_ccw_sch_event(struct subchannel *sch, int process)
280 struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev);
284 spin_lock_irqsave(sch->lock, flags);
285 if (!device_is_registered(&sch->dev))
288 if (work_pending(&sch->todo_work))
293 if (cio_update_schib(sch))
297 spin_unlock_irqrestore(sch->lock, flags);
329 static int vfio_ccw_chp_event(struct subchannel *sch,
332 struct vfio_ccw_private *private = dev_get_drvdata(&sch->dev);
333 int mask = chp_ssd_get_mask(&sch->ssd_info, link);
339 trace_vfio_ccw_chp_event(private->sch->schid, mask, event);
341 mdev_uuid(private->mdev), sch->schid.cssid,
342 sch->schid.ssid, sch->schid.sch_no,
345 if (cio_update_schib(sch))
351 sch->opm &= ~mask;
352 sch->lpm &= ~mask;
353 if (sch->schib.pmcw.lpum & mask)
354 cio_cancel_halt_clear(sch, &retry);
358 if (sch->schib.pmcw.lpum & mask)
359 cio_cancel_halt_clear(sch, &retry);
365 sch->opm |= mask;
366 sch->lpm |= mask;
370 sch->lpm |= mask & sch->opm;