Lines Matching refs:cdev

28 static void verify_start(struct ccw_device *cdev);
33 static void verify_done(struct ccw_device *cdev, int rc) in verify_done() argument
35 struct subchannel *sch = to_subchannel(cdev->dev.parent); in verify_done()
36 struct ccw_dev_id *id = &cdev->private->dev_id; in verify_done()
37 int mpath = cdev->private->flags.mpath; in verify_done()
38 int pgroup = cdev->private->flags.pgroup; in verify_done()
51 ccw_device_verify_done(cdev, rc); in verify_done()
57 static void nop_build_cp(struct ccw_device *cdev) in nop_build_cp() argument
59 struct ccw_request *req = &cdev->private->req; in nop_build_cp()
60 struct ccw1 *cp = cdev->private->iccws; in nop_build_cp()
72 static void nop_do(struct ccw_device *cdev) in nop_do() argument
74 struct subchannel *sch = to_subchannel(cdev->dev.parent); in nop_do()
75 struct ccw_request *req = &cdev->private->req; in nop_do()
78 ~cdev->private->path_noirq_mask); in nop_do()
81 nop_build_cp(cdev); in nop_do()
82 ccw_request_start(cdev); in nop_do()
86 verify_done(cdev, sch->vpm ? 0 : -EACCES); in nop_do()
92 static enum io_status nop_filter(struct ccw_device *cdev, void *data, in nop_filter() argument
104 static void nop_callback(struct ccw_device *cdev, void *data, int rc) in nop_callback() argument
106 struct subchannel *sch = to_subchannel(cdev->dev.parent); in nop_callback()
107 struct ccw_request *req = &cdev->private->req; in nop_callback()
114 cdev->private->path_noirq_mask |= req->lpm; in nop_callback()
117 cdev->private->path_notoper_mask |= req->lpm; in nop_callback()
124 nop_do(cdev); in nop_callback()
128 verify_done(cdev, rc); in nop_callback()
134 static void spid_build_cp(struct ccw_device *cdev, u8 fn) in spid_build_cp() argument
136 struct ccw_request *req = &cdev->private->req; in spid_build_cp()
137 struct ccw1 *cp = cdev->private->iccws; in spid_build_cp()
139 struct pgid *pgid = &cdev->private->pgid[i]; in spid_build_cp()
149 static void pgid_wipeout_callback(struct ccw_device *cdev, void *data, int rc) in pgid_wipeout_callback() argument
153 verify_done(cdev, rc); in pgid_wipeout_callback()
160 cdev->private->flags.pgid_unknown = 0; in pgid_wipeout_callback()
161 verify_start(cdev); in pgid_wipeout_callback()
167 static void pgid_wipeout_start(struct ccw_device *cdev) in pgid_wipeout_start() argument
169 struct subchannel *sch = to_subchannel(cdev->dev.parent); in pgid_wipeout_start()
170 struct ccw_dev_id *id = &cdev->private->dev_id; in pgid_wipeout_start()
171 struct ccw_request *req = &cdev->private->req; in pgid_wipeout_start()
175 id->ssid, id->devno, cdev->private->pgid_valid_mask, in pgid_wipeout_start()
176 cdev->private->path_noirq_mask); in pgid_wipeout_start()
185 if (cdev->private->flags.mpath) in pgid_wipeout_start()
187 spid_build_cp(cdev, fn); in pgid_wipeout_start()
188 ccw_request_start(cdev); in pgid_wipeout_start()
194 static void spid_do(struct ccw_device *cdev) in spid_do() argument
196 struct subchannel *sch = to_subchannel(cdev->dev.parent); in spid_do()
197 struct ccw_request *req = &cdev->private->req; in spid_do()
201 req->lpm = lpm_adjust(req->lpm, cdev->private->pgid_todo_mask); in spid_do()
209 if (cdev->private->flags.mpath) in spid_do()
211 spid_build_cp(cdev, fn); in spid_do()
212 ccw_request_start(cdev); in spid_do()
216 if (cdev->private->flags.pgid_unknown) { in spid_do()
218 pgid_wipeout_start(cdev); in spid_do()
221 verify_done(cdev, sch->vpm ? 0 : -EACCES); in spid_do()
227 static void spid_callback(struct ccw_device *cdev, void *data, int rc) in spid_callback() argument
229 struct subchannel *sch = to_subchannel(cdev->dev.parent); in spid_callback()
230 struct ccw_request *req = &cdev->private->req; in spid_callback()
237 cdev->private->flags.pgid_unknown = 1; in spid_callback()
238 cdev->private->path_noirq_mask |= req->lpm; in spid_callback()
241 cdev->private->path_notoper_mask |= req->lpm; in spid_callback()
244 if (cdev->private->flags.mpath) { in spid_callback()
246 cdev->private->flags.mpath = 0; in spid_callback()
250 cdev->private->flags.pgroup = 0; in spid_callback()
256 spid_do(cdev); in spid_callback()
260 verify_start(cdev); in spid_callback()
263 verify_done(cdev, rc); in spid_callback()
266 static void spid_start(struct ccw_device *cdev) in spid_start() argument
268 struct ccw_request *req = &cdev->private->req; in spid_start()
277 spid_do(cdev); in spid_start()
300 static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, in pgid_analyze() argument
303 struct pgid *pgid = &cdev->private->pgid[0]; in pgid_analyze()
312 if ((cdev->private->pgid_valid_mask & lpm) == 0) in pgid_analyze()
332 static u8 pgid_to_donepm(struct ccw_device *cdev) in pgid_to_donepm() argument
334 struct subchannel *sch = to_subchannel(cdev->dev.parent); in pgid_to_donepm()
343 if ((cdev->private->pgid_valid_mask & lpm) == 0) in pgid_to_donepm()
345 pgid = &cdev->private->pgid[i]; in pgid_to_donepm()
353 if (cdev->private->flags.mpath) { in pgid_to_donepm()
366 static void pgid_fill(struct ccw_device *cdev, struct pgid *pgid) in pgid_fill() argument
371 memcpy(&cdev->private->pgid[i], pgid, sizeof(struct pgid)); in pgid_fill()
377 static void snid_done(struct ccw_device *cdev, int rc) in snid_done() argument
379 struct ccw_dev_id *id = &cdev->private->dev_id; in snid_done()
380 struct subchannel *sch = to_subchannel(cdev->dev.parent); in snid_done()
389 pgid_analyze(cdev, &pgid, &mismatch, &reserved, &reset); in snid_done()
390 if (reserved == cdev->private->pgid_valid_mask) in snid_done()
395 donepm = pgid_to_donepm(cdev); in snid_done()
397 cdev->private->pgid_reset_mask |= reset; in snid_done()
398 cdev->private->pgid_todo_mask &= in snid_done()
399 ~(donepm | cdev->private->path_noirq_mask); in snid_done()
400 pgid_fill(cdev, pgid); in snid_done()
405 id->devno, rc, cdev->private->pgid_valid_mask, sch->vpm, in snid_done()
406 cdev->private->pgid_todo_mask, mismatch, reserved, reset); in snid_done()
409 if (cdev->private->flags.pgid_unknown) { in snid_done()
410 pgid_wipeout_start(cdev); in snid_done()
414 if (cdev->private->pgid_todo_mask == 0) { in snid_done()
415 verify_done(cdev, sch->vpm == 0 ? -EACCES : 0); in snid_done()
419 spid_start(cdev); in snid_done()
423 cdev->private->flags.pgroup = 0; in snid_done()
424 cdev->private->flags.mpath = 0; in snid_done()
425 verify_start(cdev); in snid_done()
428 verify_done(cdev, rc); in snid_done()
435 static void snid_build_cp(struct ccw_device *cdev) in snid_build_cp() argument
437 struct ccw_request *req = &cdev->private->req; in snid_build_cp()
438 struct ccw1 *cp = cdev->private->iccws; in snid_build_cp()
443 cp->cda = (u32) (addr_t) &cdev->private->pgid[i]; in snid_build_cp()
452 static void snid_do(struct ccw_device *cdev) in snid_do() argument
454 struct subchannel *sch = to_subchannel(cdev->dev.parent); in snid_do()
455 struct ccw_request *req = &cdev->private->req; in snid_do()
459 ~cdev->private->path_noirq_mask); in snid_do()
462 snid_build_cp(cdev); in snid_do()
463 ccw_request_start(cdev); in snid_do()
467 if (cdev->private->pgid_valid_mask) in snid_do()
469 else if (cdev->private->path_noirq_mask) in snid_do()
473 snid_done(cdev, ret); in snid_do()
479 static void snid_callback(struct ccw_device *cdev, void *data, int rc) in snid_callback() argument
481 struct ccw_request *req = &cdev->private->req; in snid_callback()
485 cdev->private->pgid_valid_mask |= req->lpm; in snid_callback()
488 cdev->private->flags.pgid_unknown = 1; in snid_callback()
489 cdev->private->path_noirq_mask |= req->lpm; in snid_callback()
492 cdev->private->path_notoper_mask |= req->lpm; in snid_callback()
499 snid_do(cdev); in snid_callback()
503 snid_done(cdev, rc); in snid_callback()
509 static void verify_start(struct ccw_device *cdev) in verify_start() argument
511 struct subchannel *sch = to_subchannel(cdev->dev.parent); in verify_start()
512 struct ccw_request *req = &cdev->private->req; in verify_start()
513 struct ccw_dev_id *devid = &cdev->private->dev_id; in verify_start()
519 memset(cdev->private->pgid, 0, sizeof(cdev->private->pgid)); in verify_start()
520 cdev->private->pgid_valid_mask = 0; in verify_start()
521 cdev->private->pgid_todo_mask = sch->schib.pmcw.pam; in verify_start()
522 cdev->private->path_notoper_mask = 0; in verify_start()
530 if (cdev->private->flags.pgroup) { in verify_start()
534 snid_do(cdev); in verify_start()
540 nop_do(cdev); in verify_start()
554 void ccw_device_verify_start(struct ccw_device *cdev) in ccw_device_verify_start() argument
557 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_verify_start()
562 cdev->private->flags.pgroup = cdev->private->options.pgroup; in ccw_device_verify_start()
563 cdev->private->flags.mpath = cdev->private->options.mpath; in ccw_device_verify_start()
564 cdev->private->flags.doverify = 0; in ccw_device_verify_start()
565 cdev->private->path_noirq_mask = 0; in ccw_device_verify_start()
566 verify_start(cdev); in ccw_device_verify_start()
572 static void disband_callback(struct ccw_device *cdev, void *data, int rc) in disband_callback() argument
574 struct subchannel *sch = to_subchannel(cdev->dev.parent); in disband_callback()
575 struct ccw_dev_id *id = &cdev->private->dev_id; in disband_callback()
580 cdev->private->flags.mpath = 0; in disband_callback()
588 ccw_device_disband_done(cdev, rc); in disband_callback()
599 void ccw_device_disband_start(struct ccw_device *cdev) in ccw_device_disband_start() argument
601 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_disband_start()
602 struct ccw_request *req = &cdev->private->req; in ccw_device_disband_start()
606 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_disband_start()
615 if (cdev->private->flags.mpath) in ccw_device_disband_start()
617 spid_build_cp(cdev, fn); in ccw_device_disband_start()
618 ccw_request_start(cdev); in ccw_device_disband_start()
626 static void stlck_build_cp(struct ccw_device *cdev, void *buf1, void *buf2) in stlck_build_cp() argument
628 struct ccw_request *req = &cdev->private->req; in stlck_build_cp()
629 struct ccw1 *cp = cdev->private->iccws; in stlck_build_cp()
642 static void stlck_callback(struct ccw_device *cdev, void *data, int rc) in stlck_callback() argument
659 static void ccw_device_stlck_start(struct ccw_device *cdev, void *data, in ccw_device_stlck_start() argument
662 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_stlck_start()
663 struct ccw_request *req = &cdev->private->req; in ccw_device_stlck_start()
666 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_stlck_start()
674 stlck_build_cp(cdev, buf1, buf2); in ccw_device_stlck_start()
675 ccw_request_start(cdev); in ccw_device_stlck_start()
681 int ccw_device_stlck(struct ccw_device *cdev) in ccw_device_stlck() argument
683 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_stlck()
689 if (cdev->drv) { in ccw_device_stlck()
690 if (!cdev->private->options.force) in ccw_device_stlck()
703 cdev->private->state = DEV_STATE_STEAL_LOCK; in ccw_device_stlck()
704 ccw_device_stlck_start(cdev, &data, &buffer[0], &buffer[32]); in ccw_device_stlck()
710 ccw_request_cancel(cdev); in ccw_device_stlck()
718 cdev->private->state = DEV_STATE_BOXED; in ccw_device_stlck()