Lines Matching refs:cdev

26 static void verify_start(struct ccw_device *cdev);
31 static void verify_done(struct ccw_device *cdev, int rc) in verify_done() argument
33 struct subchannel *sch = to_subchannel(cdev->dev.parent); in verify_done()
34 struct ccw_dev_id *id = &cdev->private->dev_id; in verify_done()
35 int mpath = cdev->private->flags.mpath; in verify_done()
36 int pgroup = cdev->private->flags.pgroup; in verify_done()
49 ccw_device_verify_done(cdev, rc); in verify_done()
55 static void nop_build_cp(struct ccw_device *cdev) in nop_build_cp() argument
57 struct ccw_request *req = &cdev->private->req; in nop_build_cp()
58 struct ccw1 *cp = cdev->private->iccws; in nop_build_cp()
70 static void nop_do(struct ccw_device *cdev) in nop_do() argument
72 struct subchannel *sch = to_subchannel(cdev->dev.parent); in nop_do()
73 struct ccw_request *req = &cdev->private->req; in nop_do()
76 ~cdev->private->path_noirq_mask); in nop_do()
79 nop_build_cp(cdev); in nop_do()
80 ccw_request_start(cdev); in nop_do()
84 verify_done(cdev, sch->vpm ? 0 : -EACCES); in nop_do()
90 static enum io_status nop_filter(struct ccw_device *cdev, void *data, in nop_filter() argument
102 static void nop_callback(struct ccw_device *cdev, void *data, int rc) in nop_callback() argument
104 struct subchannel *sch = to_subchannel(cdev->dev.parent); in nop_callback()
105 struct ccw_request *req = &cdev->private->req; in nop_callback()
112 cdev->private->path_noirq_mask |= req->lpm; in nop_callback()
115 cdev->private->path_notoper_mask |= req->lpm; in nop_callback()
122 nop_do(cdev); in nop_callback()
126 verify_done(cdev, rc); in nop_callback()
132 static void spid_build_cp(struct ccw_device *cdev, u8 fn) in spid_build_cp() argument
134 struct ccw_request *req = &cdev->private->req; in spid_build_cp()
135 struct ccw1 *cp = cdev->private->iccws; in spid_build_cp()
137 struct pgid *pgid = &cdev->private->pgid[i]; in spid_build_cp()
147 static void pgid_wipeout_callback(struct ccw_device *cdev, void *data, int rc) in pgid_wipeout_callback() argument
151 verify_done(cdev, rc); in pgid_wipeout_callback()
158 cdev->private->flags.pgid_unknown = 0; in pgid_wipeout_callback()
159 verify_start(cdev); in pgid_wipeout_callback()
165 static void pgid_wipeout_start(struct ccw_device *cdev) in pgid_wipeout_start() argument
167 struct subchannel *sch = to_subchannel(cdev->dev.parent); in pgid_wipeout_start()
168 struct ccw_dev_id *id = &cdev->private->dev_id; in pgid_wipeout_start()
169 struct ccw_request *req = &cdev->private->req; in pgid_wipeout_start()
173 id->ssid, id->devno, cdev->private->pgid_valid_mask, in pgid_wipeout_start()
174 cdev->private->path_noirq_mask); in pgid_wipeout_start()
183 if (cdev->private->flags.mpath) in pgid_wipeout_start()
185 spid_build_cp(cdev, fn); in pgid_wipeout_start()
186 ccw_request_start(cdev); in pgid_wipeout_start()
192 static void spid_do(struct ccw_device *cdev) in spid_do() argument
194 struct subchannel *sch = to_subchannel(cdev->dev.parent); in spid_do()
195 struct ccw_request *req = &cdev->private->req; in spid_do()
199 req->lpm = lpm_adjust(req->lpm, cdev->private->pgid_todo_mask); in spid_do()
207 if (cdev->private->flags.mpath) in spid_do()
209 spid_build_cp(cdev, fn); in spid_do()
210 ccw_request_start(cdev); in spid_do()
214 if (cdev->private->flags.pgid_unknown) { in spid_do()
216 pgid_wipeout_start(cdev); in spid_do()
219 verify_done(cdev, sch->vpm ? 0 : -EACCES); in spid_do()
225 static void spid_callback(struct ccw_device *cdev, void *data, int rc) in spid_callback() argument
227 struct subchannel *sch = to_subchannel(cdev->dev.parent); in spid_callback()
228 struct ccw_request *req = &cdev->private->req; in spid_callback()
235 cdev->private->flags.pgid_unknown = 1; in spid_callback()
236 cdev->private->path_noirq_mask |= req->lpm; in spid_callback()
239 cdev->private->path_notoper_mask |= req->lpm; in spid_callback()
242 if (cdev->private->flags.mpath) { in spid_callback()
244 cdev->private->flags.mpath = 0; in spid_callback()
248 cdev->private->flags.pgroup = 0; in spid_callback()
254 spid_do(cdev); in spid_callback()
258 verify_start(cdev); in spid_callback()
261 verify_done(cdev, rc); in spid_callback()
264 static void spid_start(struct ccw_device *cdev) in spid_start() argument
266 struct ccw_request *req = &cdev->private->req; in spid_start()
275 spid_do(cdev); in spid_start()
298 static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, in pgid_analyze() argument
301 struct pgid *pgid = &cdev->private->pgid[0]; in pgid_analyze()
310 if ((cdev->private->pgid_valid_mask & lpm) == 0) in pgid_analyze()
330 static u8 pgid_to_donepm(struct ccw_device *cdev) in pgid_to_donepm() argument
332 struct subchannel *sch = to_subchannel(cdev->dev.parent); in pgid_to_donepm()
341 if ((cdev->private->pgid_valid_mask & lpm) == 0) in pgid_to_donepm()
343 pgid = &cdev->private->pgid[i]; in pgid_to_donepm()
351 if (cdev->private->flags.mpath) { in pgid_to_donepm()
364 static void pgid_fill(struct ccw_device *cdev, struct pgid *pgid) in pgid_fill() argument
369 memcpy(&cdev->private->pgid[i], pgid, sizeof(struct pgid)); in pgid_fill()
375 static void snid_done(struct ccw_device *cdev, int rc) in snid_done() argument
377 struct ccw_dev_id *id = &cdev->private->dev_id; in snid_done()
378 struct subchannel *sch = to_subchannel(cdev->dev.parent); in snid_done()
387 pgid_analyze(cdev, &pgid, &mismatch, &reserved, &reset); in snid_done()
388 if (reserved == cdev->private->pgid_valid_mask) in snid_done()
393 donepm = pgid_to_donepm(cdev); in snid_done()
395 cdev->private->pgid_reset_mask |= reset; in snid_done()
396 cdev->private->pgid_todo_mask &= in snid_done()
397 ~(donepm | cdev->private->path_noirq_mask); in snid_done()
398 pgid_fill(cdev, pgid); in snid_done()
403 id->devno, rc, cdev->private->pgid_valid_mask, sch->vpm, in snid_done()
404 cdev->private->pgid_todo_mask, mismatch, reserved, reset); in snid_done()
407 if (cdev->private->flags.pgid_unknown) { in snid_done()
408 pgid_wipeout_start(cdev); in snid_done()
412 if (cdev->private->pgid_todo_mask == 0) { in snid_done()
413 verify_done(cdev, sch->vpm == 0 ? -EACCES : 0); in snid_done()
417 spid_start(cdev); in snid_done()
421 cdev->private->flags.pgroup = 0; in snid_done()
422 cdev->private->flags.mpath = 0; in snid_done()
423 verify_start(cdev); in snid_done()
426 verify_done(cdev, rc); in snid_done()
433 static void snid_build_cp(struct ccw_device *cdev) in snid_build_cp() argument
435 struct ccw_request *req = &cdev->private->req; in snid_build_cp()
436 struct ccw1 *cp = cdev->private->iccws; in snid_build_cp()
441 cp->cda = (u32) (addr_t) &cdev->private->pgid[i]; in snid_build_cp()
450 static void snid_do(struct ccw_device *cdev) in snid_do() argument
452 struct subchannel *sch = to_subchannel(cdev->dev.parent); in snid_do()
453 struct ccw_request *req = &cdev->private->req; in snid_do()
457 ~cdev->private->path_noirq_mask); in snid_do()
460 snid_build_cp(cdev); in snid_do()
461 ccw_request_start(cdev); in snid_do()
465 if (cdev->private->pgid_valid_mask) in snid_do()
467 else if (cdev->private->path_noirq_mask) in snid_do()
471 snid_done(cdev, ret); in snid_do()
477 static void snid_callback(struct ccw_device *cdev, void *data, int rc) in snid_callback() argument
479 struct ccw_request *req = &cdev->private->req; in snid_callback()
483 cdev->private->pgid_valid_mask |= req->lpm; in snid_callback()
486 cdev->private->flags.pgid_unknown = 1; in snid_callback()
487 cdev->private->path_noirq_mask |= req->lpm; in snid_callback()
490 cdev->private->path_notoper_mask |= req->lpm; in snid_callback()
497 snid_do(cdev); in snid_callback()
501 snid_done(cdev, rc); in snid_callback()
507 static void verify_start(struct ccw_device *cdev) in verify_start() argument
509 struct subchannel *sch = to_subchannel(cdev->dev.parent); in verify_start()
510 struct ccw_request *req = &cdev->private->req; in verify_start()
511 struct ccw_dev_id *devid = &cdev->private->dev_id; in verify_start()
517 memset(cdev->private->pgid, 0, sizeof(cdev->private->pgid)); in verify_start()
518 cdev->private->pgid_valid_mask = 0; in verify_start()
519 cdev->private->pgid_todo_mask = sch->schib.pmcw.pam; in verify_start()
520 cdev->private->path_notoper_mask = 0; in verify_start()
528 if (cdev->private->flags.pgroup) { in verify_start()
532 snid_do(cdev); in verify_start()
538 nop_do(cdev); in verify_start()
552 void ccw_device_verify_start(struct ccw_device *cdev) in ccw_device_verify_start() argument
555 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_verify_start()
560 cdev->private->flags.pgroup = cdev->private->options.pgroup; in ccw_device_verify_start()
561 cdev->private->flags.mpath = cdev->private->options.mpath; in ccw_device_verify_start()
562 cdev->private->flags.doverify = 0; in ccw_device_verify_start()
563 cdev->private->path_noirq_mask = 0; in ccw_device_verify_start()
564 verify_start(cdev); in ccw_device_verify_start()
570 static void disband_callback(struct ccw_device *cdev, void *data, int rc) in disband_callback() argument
572 struct subchannel *sch = to_subchannel(cdev->dev.parent); in disband_callback()
573 struct ccw_dev_id *id = &cdev->private->dev_id; in disband_callback()
578 cdev->private->flags.mpath = 0; in disband_callback()
586 ccw_device_disband_done(cdev, rc); in disband_callback()
597 void ccw_device_disband_start(struct ccw_device *cdev) in ccw_device_disband_start() argument
599 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_disband_start()
600 struct ccw_request *req = &cdev->private->req; in ccw_device_disband_start()
604 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_disband_start()
613 if (cdev->private->flags.mpath) in ccw_device_disband_start()
615 spid_build_cp(cdev, fn); in ccw_device_disband_start()
616 ccw_request_start(cdev); in ccw_device_disband_start()
619 static void stlck_build_cp(struct ccw_device *cdev, void *buf1, void *buf2) in stlck_build_cp() argument
621 struct ccw_request *req = &cdev->private->req; in stlck_build_cp()
622 struct ccw1 *cp = cdev->private->iccws; in stlck_build_cp()
635 static void stlck_callback(struct ccw_device *cdev, void *data, int rc) in stlck_callback() argument
637 ccw_device_stlck_done(cdev, data, rc); in stlck_callback()
651 void ccw_device_stlck_start(struct ccw_device *cdev, void *data, void *buf1, in ccw_device_stlck_start() argument
654 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_stlck_start()
655 struct ccw_request *req = &cdev->private->req; in ccw_device_stlck_start()
658 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_stlck_start()
666 stlck_build_cp(cdev, buf1, buf2); in ccw_device_stlck_start()
667 ccw_request_start(cdev); in ccw_device_stlck_start()