Lines Matching refs:cdev
27 static void verify_start(struct ccw_device *cdev);
32 static void verify_done(struct ccw_device *cdev, int rc) in verify_done() argument
34 struct subchannel *sch = to_subchannel(cdev->dev.parent); in verify_done()
35 struct ccw_dev_id *id = &cdev->private->dev_id; in verify_done()
36 int mpath = cdev->private->flags.mpath; in verify_done()
37 int pgroup = cdev->private->flags.pgroup; in verify_done()
50 ccw_device_verify_done(cdev, rc); in verify_done()
56 static void nop_build_cp(struct ccw_device *cdev) in nop_build_cp() argument
58 struct ccw_request *req = &cdev->private->req; in nop_build_cp()
59 struct ccw1 *cp = cdev->private->iccws; in nop_build_cp()
71 static void nop_do(struct ccw_device *cdev) in nop_do() argument
73 struct subchannel *sch = to_subchannel(cdev->dev.parent); in nop_do()
74 struct ccw_request *req = &cdev->private->req; in nop_do()
77 ~cdev->private->path_noirq_mask); in nop_do()
80 nop_build_cp(cdev); in nop_do()
81 ccw_request_start(cdev); in nop_do()
85 verify_done(cdev, sch->vpm ? 0 : -EACCES); in nop_do()
91 static enum io_status nop_filter(struct ccw_device *cdev, void *data, in nop_filter() argument
103 static void nop_callback(struct ccw_device *cdev, void *data, int rc) in nop_callback() argument
105 struct subchannel *sch = to_subchannel(cdev->dev.parent); in nop_callback()
106 struct ccw_request *req = &cdev->private->req; in nop_callback()
113 cdev->private->path_noirq_mask |= req->lpm; in nop_callback()
116 cdev->private->path_notoper_mask |= req->lpm; in nop_callback()
123 nop_do(cdev); in nop_callback()
127 verify_done(cdev, rc); in nop_callback()
133 static void spid_build_cp(struct ccw_device *cdev, u8 fn) in spid_build_cp() argument
135 struct ccw_request *req = &cdev->private->req; in spid_build_cp()
136 struct ccw1 *cp = cdev->private->iccws; in spid_build_cp()
138 struct pgid *pgid = &cdev->private->pgid[i]; in spid_build_cp()
148 static void pgid_wipeout_callback(struct ccw_device *cdev, void *data, int rc) in pgid_wipeout_callback() argument
152 verify_done(cdev, rc); in pgid_wipeout_callback()
159 cdev->private->flags.pgid_unknown = 0; in pgid_wipeout_callback()
160 verify_start(cdev); in pgid_wipeout_callback()
166 static void pgid_wipeout_start(struct ccw_device *cdev) in pgid_wipeout_start() argument
168 struct subchannel *sch = to_subchannel(cdev->dev.parent); in pgid_wipeout_start()
169 struct ccw_dev_id *id = &cdev->private->dev_id; in pgid_wipeout_start()
170 struct ccw_request *req = &cdev->private->req; in pgid_wipeout_start()
174 id->ssid, id->devno, cdev->private->pgid_valid_mask, in pgid_wipeout_start()
175 cdev->private->path_noirq_mask); in pgid_wipeout_start()
184 if (cdev->private->flags.mpath) in pgid_wipeout_start()
186 spid_build_cp(cdev, fn); in pgid_wipeout_start()
187 ccw_request_start(cdev); in pgid_wipeout_start()
193 static void spid_do(struct ccw_device *cdev) in spid_do() argument
195 struct subchannel *sch = to_subchannel(cdev->dev.parent); in spid_do()
196 struct ccw_request *req = &cdev->private->req; in spid_do()
200 req->lpm = lpm_adjust(req->lpm, cdev->private->pgid_todo_mask); in spid_do()
208 if (cdev->private->flags.mpath) in spid_do()
210 spid_build_cp(cdev, fn); in spid_do()
211 ccw_request_start(cdev); in spid_do()
215 if (cdev->private->flags.pgid_unknown) { in spid_do()
217 pgid_wipeout_start(cdev); in spid_do()
220 verify_done(cdev, sch->vpm ? 0 : -EACCES); in spid_do()
226 static void spid_callback(struct ccw_device *cdev, void *data, int rc) in spid_callback() argument
228 struct subchannel *sch = to_subchannel(cdev->dev.parent); in spid_callback()
229 struct ccw_request *req = &cdev->private->req; in spid_callback()
236 cdev->private->flags.pgid_unknown = 1; in spid_callback()
237 cdev->private->path_noirq_mask |= req->lpm; in spid_callback()
240 cdev->private->path_notoper_mask |= req->lpm; in spid_callback()
243 if (cdev->private->flags.mpath) { in spid_callback()
245 cdev->private->flags.mpath = 0; in spid_callback()
249 cdev->private->flags.pgroup = 0; in spid_callback()
255 spid_do(cdev); in spid_callback()
259 verify_start(cdev); in spid_callback()
262 verify_done(cdev, rc); in spid_callback()
265 static void spid_start(struct ccw_device *cdev) in spid_start() argument
267 struct ccw_request *req = &cdev->private->req; in spid_start()
276 spid_do(cdev); in spid_start()
299 static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, in pgid_analyze() argument
302 struct pgid *pgid = &cdev->private->pgid[0]; in pgid_analyze()
311 if ((cdev->private->pgid_valid_mask & lpm) == 0) in pgid_analyze()
331 static u8 pgid_to_donepm(struct ccw_device *cdev) in pgid_to_donepm() argument
333 struct subchannel *sch = to_subchannel(cdev->dev.parent); in pgid_to_donepm()
342 if ((cdev->private->pgid_valid_mask & lpm) == 0) in pgid_to_donepm()
344 pgid = &cdev->private->pgid[i]; in pgid_to_donepm()
352 if (cdev->private->flags.mpath) { in pgid_to_donepm()
365 static void pgid_fill(struct ccw_device *cdev, struct pgid *pgid) in pgid_fill() argument
370 memcpy(&cdev->private->pgid[i], pgid, sizeof(struct pgid)); in pgid_fill()
376 static void snid_done(struct ccw_device *cdev, int rc) in snid_done() argument
378 struct ccw_dev_id *id = &cdev->private->dev_id; in snid_done()
379 struct subchannel *sch = to_subchannel(cdev->dev.parent); in snid_done()
388 pgid_analyze(cdev, &pgid, &mismatch, &reserved, &reset); in snid_done()
389 if (reserved == cdev->private->pgid_valid_mask) in snid_done()
394 donepm = pgid_to_donepm(cdev); in snid_done()
396 cdev->private->pgid_reset_mask |= reset; in snid_done()
397 cdev->private->pgid_todo_mask &= in snid_done()
398 ~(donepm | cdev->private->path_noirq_mask); in snid_done()
399 pgid_fill(cdev, pgid); in snid_done()
404 id->devno, rc, cdev->private->pgid_valid_mask, sch->vpm, in snid_done()
405 cdev->private->pgid_todo_mask, mismatch, reserved, reset); in snid_done()
408 if (cdev->private->flags.pgid_unknown) { in snid_done()
409 pgid_wipeout_start(cdev); in snid_done()
413 if (cdev->private->pgid_todo_mask == 0) { in snid_done()
414 verify_done(cdev, sch->vpm == 0 ? -EACCES : 0); in snid_done()
418 spid_start(cdev); in snid_done()
422 cdev->private->flags.pgroup = 0; in snid_done()
423 cdev->private->flags.mpath = 0; in snid_done()
424 verify_start(cdev); in snid_done()
427 verify_done(cdev, rc); in snid_done()
434 static void snid_build_cp(struct ccw_device *cdev) in snid_build_cp() argument
436 struct ccw_request *req = &cdev->private->req; in snid_build_cp()
437 struct ccw1 *cp = cdev->private->iccws; in snid_build_cp()
442 cp->cda = (u32) (addr_t) &cdev->private->pgid[i]; in snid_build_cp()
451 static void snid_do(struct ccw_device *cdev) in snid_do() argument
453 struct subchannel *sch = to_subchannel(cdev->dev.parent); in snid_do()
454 struct ccw_request *req = &cdev->private->req; in snid_do()
458 ~cdev->private->path_noirq_mask); in snid_do()
461 snid_build_cp(cdev); in snid_do()
462 ccw_request_start(cdev); in snid_do()
466 if (cdev->private->pgid_valid_mask) in snid_do()
468 else if (cdev->private->path_noirq_mask) in snid_do()
472 snid_done(cdev, ret); in snid_do()
478 static void snid_callback(struct ccw_device *cdev, void *data, int rc) in snid_callback() argument
480 struct ccw_request *req = &cdev->private->req; in snid_callback()
484 cdev->private->pgid_valid_mask |= req->lpm; in snid_callback()
487 cdev->private->flags.pgid_unknown = 1; in snid_callback()
488 cdev->private->path_noirq_mask |= req->lpm; in snid_callback()
491 cdev->private->path_notoper_mask |= req->lpm; in snid_callback()
498 snid_do(cdev); in snid_callback()
502 snid_done(cdev, rc); in snid_callback()
508 static void verify_start(struct ccw_device *cdev) in verify_start() argument
510 struct subchannel *sch = to_subchannel(cdev->dev.parent); in verify_start()
511 struct ccw_request *req = &cdev->private->req; in verify_start()
512 struct ccw_dev_id *devid = &cdev->private->dev_id; in verify_start()
518 memset(cdev->private->pgid, 0, sizeof(cdev->private->pgid)); in verify_start()
519 cdev->private->pgid_valid_mask = 0; in verify_start()
520 cdev->private->pgid_todo_mask = sch->schib.pmcw.pam; in verify_start()
521 cdev->private->path_notoper_mask = 0; in verify_start()
529 if (cdev->private->flags.pgroup) { in verify_start()
533 snid_do(cdev); in verify_start()
539 nop_do(cdev); in verify_start()
553 void ccw_device_verify_start(struct ccw_device *cdev) in ccw_device_verify_start() argument
556 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_verify_start()
561 cdev->private->flags.pgroup = cdev->private->options.pgroup; in ccw_device_verify_start()
562 cdev->private->flags.mpath = cdev->private->options.mpath; in ccw_device_verify_start()
563 cdev->private->flags.doverify = 0; in ccw_device_verify_start()
564 cdev->private->path_noirq_mask = 0; in ccw_device_verify_start()
565 verify_start(cdev); in ccw_device_verify_start()
571 static void disband_callback(struct ccw_device *cdev, void *data, int rc) in disband_callback() argument
573 struct subchannel *sch = to_subchannel(cdev->dev.parent); in disband_callback()
574 struct ccw_dev_id *id = &cdev->private->dev_id; in disband_callback()
579 cdev->private->flags.mpath = 0; in disband_callback()
587 ccw_device_disband_done(cdev, rc); in disband_callback()
598 void ccw_device_disband_start(struct ccw_device *cdev) in ccw_device_disband_start() argument
600 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_disband_start()
601 struct ccw_request *req = &cdev->private->req; in ccw_device_disband_start()
605 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_disband_start()
614 if (cdev->private->flags.mpath) in ccw_device_disband_start()
616 spid_build_cp(cdev, fn); in ccw_device_disband_start()
617 ccw_request_start(cdev); in ccw_device_disband_start()
625 static void stlck_build_cp(struct ccw_device *cdev, void *buf1, void *buf2) in stlck_build_cp() argument
627 struct ccw_request *req = &cdev->private->req; in stlck_build_cp()
628 struct ccw1 *cp = cdev->private->iccws; in stlck_build_cp()
641 static void stlck_callback(struct ccw_device *cdev, void *data, int rc) in stlck_callback() argument
658 static void ccw_device_stlck_start(struct ccw_device *cdev, void *data, in ccw_device_stlck_start() argument
661 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_stlck_start()
662 struct ccw_request *req = &cdev->private->req; in ccw_device_stlck_start()
665 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_stlck_start()
673 stlck_build_cp(cdev, buf1, buf2); in ccw_device_stlck_start()
674 ccw_request_start(cdev); in ccw_device_stlck_start()
680 int ccw_device_stlck(struct ccw_device *cdev) in ccw_device_stlck() argument
682 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_stlck()
688 if (cdev->drv) { in ccw_device_stlck()
689 if (!cdev->private->options.force) in ccw_device_stlck()
702 cdev->private->state = DEV_STATE_STEAL_LOCK; in ccw_device_stlck()
703 ccw_device_stlck_start(cdev, &data, &buffer[0], &buffer[32]); in ccw_device_stlck()
709 ccw_request_cancel(cdev); in ccw_device_stlck()
717 cdev->private->state = DEV_STATE_BOXED; in ccw_device_stlck()