Lines Matching refs:cdev
29 static void verify_start(struct ccw_device *cdev);
34 static void verify_done(struct ccw_device *cdev, int rc) in verify_done() argument
36 struct subchannel *sch = to_subchannel(cdev->dev.parent); in verify_done()
37 struct ccw_dev_id *id = &cdev->private->dev_id; in verify_done()
38 int mpath = cdev->private->flags.mpath; in verify_done()
39 int pgroup = cdev->private->flags.pgroup; in verify_done()
52 ccw_device_verify_done(cdev, rc); in verify_done()
58 static void nop_build_cp(struct ccw_device *cdev) in nop_build_cp() argument
60 struct ccw_request *req = &cdev->private->req; in nop_build_cp()
61 struct ccw1 *cp = cdev->private->dma_area->iccws; in nop_build_cp()
73 static void nop_do(struct ccw_device *cdev) in nop_do() argument
75 struct subchannel *sch = to_subchannel(cdev->dev.parent); in nop_do()
76 struct ccw_request *req = &cdev->private->req; in nop_do()
79 ~cdev->private->path_noirq_mask); in nop_do()
82 nop_build_cp(cdev); in nop_do()
83 ccw_request_start(cdev); in nop_do()
87 verify_done(cdev, sch->vpm ? 0 : -EACCES); in nop_do()
93 static enum io_status nop_filter(struct ccw_device *cdev, void *data, in nop_filter() argument
105 static void nop_callback(struct ccw_device *cdev, void *data, int rc) in nop_callback() argument
107 struct subchannel *sch = to_subchannel(cdev->dev.parent); in nop_callback()
108 struct ccw_request *req = &cdev->private->req; in nop_callback()
115 cdev->private->path_noirq_mask |= req->lpm; in nop_callback()
118 cdev->private->path_notoper_mask |= req->lpm; in nop_callback()
125 nop_do(cdev); in nop_callback()
129 verify_done(cdev, rc); in nop_callback()
135 static void spid_build_cp(struct ccw_device *cdev, u8 fn) in spid_build_cp() argument
137 struct ccw_request *req = &cdev->private->req; in spid_build_cp()
138 struct ccw1 *cp = cdev->private->dma_area->iccws; in spid_build_cp()
140 struct pgid *pgid = &cdev->private->dma_area->pgid[i]; in spid_build_cp()
150 static void pgid_wipeout_callback(struct ccw_device *cdev, void *data, int rc) in pgid_wipeout_callback() argument
154 verify_done(cdev, rc); in pgid_wipeout_callback()
161 cdev->private->flags.pgid_unknown = 0; in pgid_wipeout_callback()
162 verify_start(cdev); in pgid_wipeout_callback()
168 static void pgid_wipeout_start(struct ccw_device *cdev) in pgid_wipeout_start() argument
170 struct subchannel *sch = to_subchannel(cdev->dev.parent); in pgid_wipeout_start()
171 struct ccw_dev_id *id = &cdev->private->dev_id; in pgid_wipeout_start()
172 struct ccw_request *req = &cdev->private->req; in pgid_wipeout_start()
176 id->ssid, id->devno, cdev->private->pgid_valid_mask, in pgid_wipeout_start()
177 cdev->private->path_noirq_mask); in pgid_wipeout_start()
186 if (cdev->private->flags.mpath) in pgid_wipeout_start()
188 spid_build_cp(cdev, fn); in pgid_wipeout_start()
189 ccw_request_start(cdev); in pgid_wipeout_start()
195 static void spid_do(struct ccw_device *cdev) in spid_do() argument
197 struct subchannel *sch = to_subchannel(cdev->dev.parent); in spid_do()
198 struct ccw_request *req = &cdev->private->req; in spid_do()
202 req->lpm = lpm_adjust(req->lpm, cdev->private->pgid_todo_mask); in spid_do()
210 if (cdev->private->flags.mpath) in spid_do()
212 spid_build_cp(cdev, fn); in spid_do()
213 ccw_request_start(cdev); in spid_do()
217 if (cdev->private->flags.pgid_unknown) { in spid_do()
219 pgid_wipeout_start(cdev); in spid_do()
222 verify_done(cdev, sch->vpm ? 0 : -EACCES); in spid_do()
228 static void spid_callback(struct ccw_device *cdev, void *data, int rc) in spid_callback() argument
230 struct subchannel *sch = to_subchannel(cdev->dev.parent); in spid_callback()
231 struct ccw_request *req = &cdev->private->req; in spid_callback()
238 cdev->private->flags.pgid_unknown = 1; in spid_callback()
239 cdev->private->path_noirq_mask |= req->lpm; in spid_callback()
242 cdev->private->path_notoper_mask |= req->lpm; in spid_callback()
245 if (cdev->private->flags.mpath) { in spid_callback()
247 cdev->private->flags.mpath = 0; in spid_callback()
251 cdev->private->flags.pgroup = 0; in spid_callback()
257 spid_do(cdev); in spid_callback()
261 verify_start(cdev); in spid_callback()
264 verify_done(cdev, rc); in spid_callback()
267 static void spid_start(struct ccw_device *cdev) in spid_start() argument
269 struct ccw_request *req = &cdev->private->req; in spid_start()
278 spid_do(cdev); in spid_start()
301 static void pgid_analyze(struct ccw_device *cdev, struct pgid **p, in pgid_analyze() argument
304 struct pgid *pgid = &cdev->private->dma_area->pgid[0]; in pgid_analyze()
313 if ((cdev->private->pgid_valid_mask & lpm) == 0) in pgid_analyze()
333 static u8 pgid_to_donepm(struct ccw_device *cdev) in pgid_to_donepm() argument
335 struct subchannel *sch = to_subchannel(cdev->dev.parent); in pgid_to_donepm()
344 if ((cdev->private->pgid_valid_mask & lpm) == 0) in pgid_to_donepm()
346 pgid = &cdev->private->dma_area->pgid[i]; in pgid_to_donepm()
354 if (cdev->private->flags.mpath) { in pgid_to_donepm()
367 static void pgid_fill(struct ccw_device *cdev, struct pgid *pgid) in pgid_fill() argument
372 memcpy(&cdev->private->dma_area->pgid[i], pgid, in pgid_fill()
379 static void snid_done(struct ccw_device *cdev, int rc) in snid_done() argument
381 struct ccw_dev_id *id = &cdev->private->dev_id; in snid_done()
382 struct subchannel *sch = to_subchannel(cdev->dev.parent); in snid_done()
391 pgid_analyze(cdev, &pgid, &mismatch, &reserved, &reset); in snid_done()
392 if (reserved == cdev->private->pgid_valid_mask) in snid_done()
397 donepm = pgid_to_donepm(cdev); in snid_done()
399 cdev->private->pgid_reset_mask |= reset; in snid_done()
400 cdev->private->pgid_todo_mask &= in snid_done()
401 ~(donepm | cdev->private->path_noirq_mask); in snid_done()
402 pgid_fill(cdev, pgid); in snid_done()
407 id->devno, rc, cdev->private->pgid_valid_mask, sch->vpm, in snid_done()
408 cdev->private->pgid_todo_mask, mismatch, reserved, reset); in snid_done()
411 if (cdev->private->flags.pgid_unknown) { in snid_done()
412 pgid_wipeout_start(cdev); in snid_done()
416 if (cdev->private->pgid_todo_mask == 0) { in snid_done()
417 verify_done(cdev, sch->vpm == 0 ? -EACCES : 0); in snid_done()
421 spid_start(cdev); in snid_done()
425 cdev->private->flags.pgroup = 0; in snid_done()
426 cdev->private->flags.mpath = 0; in snid_done()
427 verify_start(cdev); in snid_done()
430 verify_done(cdev, rc); in snid_done()
437 static void snid_build_cp(struct ccw_device *cdev) in snid_build_cp() argument
439 struct ccw_request *req = &cdev->private->req; in snid_build_cp()
440 struct ccw1 *cp = cdev->private->dma_area->iccws; in snid_build_cp()
445 cp->cda = virt_to_dma32(&cdev->private->dma_area->pgid[i]); in snid_build_cp()
454 static void snid_do(struct ccw_device *cdev) in snid_do() argument
456 struct subchannel *sch = to_subchannel(cdev->dev.parent); in snid_do()
457 struct ccw_request *req = &cdev->private->req; in snid_do()
461 ~cdev->private->path_noirq_mask); in snid_do()
464 snid_build_cp(cdev); in snid_do()
465 ccw_request_start(cdev); in snid_do()
469 if (cdev->private->pgid_valid_mask) in snid_do()
471 else if (cdev->private->path_noirq_mask) in snid_do()
475 snid_done(cdev, ret); in snid_do()
481 static void snid_callback(struct ccw_device *cdev, void *data, int rc) in snid_callback() argument
483 struct ccw_request *req = &cdev->private->req; in snid_callback()
487 cdev->private->pgid_valid_mask |= req->lpm; in snid_callback()
490 cdev->private->flags.pgid_unknown = 1; in snid_callback()
491 cdev->private->path_noirq_mask |= req->lpm; in snid_callback()
494 cdev->private->path_notoper_mask |= req->lpm; in snid_callback()
501 snid_do(cdev); in snid_callback()
505 snid_done(cdev, rc); in snid_callback()
511 static void verify_start(struct ccw_device *cdev) in verify_start() argument
513 struct subchannel *sch = to_subchannel(cdev->dev.parent); in verify_start()
514 struct ccw_request *req = &cdev->private->req; in verify_start()
515 struct ccw_dev_id *devid = &cdev->private->dev_id; in verify_start()
521 memset(cdev->private->dma_area->pgid, 0, in verify_start()
522 sizeof(cdev->private->dma_area->pgid)); in verify_start()
523 cdev->private->pgid_valid_mask = 0; in verify_start()
524 cdev->private->pgid_todo_mask = sch->schib.pmcw.pam; in verify_start()
525 cdev->private->path_notoper_mask = 0; in verify_start()
533 if (cdev->private->flags.pgroup) { in verify_start()
537 snid_do(cdev); in verify_start()
543 nop_do(cdev); in verify_start()
557 void ccw_device_verify_start(struct ccw_device *cdev) in ccw_device_verify_start() argument
560 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_verify_start()
565 cdev->private->flags.pgroup = cdev->private->options.pgroup; in ccw_device_verify_start()
566 cdev->private->flags.mpath = cdev->private->options.mpath; in ccw_device_verify_start()
567 cdev->private->flags.doverify = 0; in ccw_device_verify_start()
568 cdev->private->path_noirq_mask = 0; in ccw_device_verify_start()
569 verify_start(cdev); in ccw_device_verify_start()
575 static void disband_callback(struct ccw_device *cdev, void *data, int rc) in disband_callback() argument
577 struct subchannel *sch = to_subchannel(cdev->dev.parent); in disband_callback()
578 struct ccw_dev_id *id = &cdev->private->dev_id; in disband_callback()
583 cdev->private->flags.mpath = 0; in disband_callback()
591 ccw_device_disband_done(cdev, rc); in disband_callback()
602 void ccw_device_disband_start(struct ccw_device *cdev) in ccw_device_disband_start() argument
604 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_disband_start()
605 struct ccw_request *req = &cdev->private->req; in ccw_device_disband_start()
609 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_disband_start()
618 if (cdev->private->flags.mpath) in ccw_device_disband_start()
620 spid_build_cp(cdev, fn); in ccw_device_disband_start()
621 ccw_request_start(cdev); in ccw_device_disband_start()
629 static void stlck_build_cp(struct ccw_device *cdev, void *buf1, void *buf2) in stlck_build_cp() argument
631 struct ccw_request *req = &cdev->private->req; in stlck_build_cp()
632 struct ccw1 *cp = cdev->private->dma_area->iccws; in stlck_build_cp()
645 static void stlck_callback(struct ccw_device *cdev, void *data, int rc) in stlck_callback() argument
662 static void ccw_device_stlck_start(struct ccw_device *cdev, void *data, in ccw_device_stlck_start() argument
665 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_stlck_start()
666 struct ccw_request *req = &cdev->private->req; in ccw_device_stlck_start()
669 CIO_HEX_EVENT(4, &cdev->private->dev_id, sizeof(cdev->private->dev_id)); in ccw_device_stlck_start()
677 stlck_build_cp(cdev, buf1, buf2); in ccw_device_stlck_start()
678 ccw_request_start(cdev); in ccw_device_stlck_start()
684 int ccw_device_stlck(struct ccw_device *cdev) in ccw_device_stlck() argument
686 struct subchannel *sch = to_subchannel(cdev->dev.parent); in ccw_device_stlck()
692 if (cdev->drv) { in ccw_device_stlck()
693 if (!cdev->private->options.force) in ccw_device_stlck()
706 cdev->private->state = DEV_STATE_STEAL_LOCK; in ccw_device_stlck()
707 ccw_device_stlck_start(cdev, &data, &buffer[0], &buffer[32]); in ccw_device_stlck()
713 ccw_request_cancel(cdev); in ccw_device_stlck()
721 cdev->private->state = DEV_STATE_BOXED; in ccw_device_stlck()