Lines Matching +full:ssc +full:- +full:block +full:- +full:bus

1 // SPDX-License-Identifier: GPL-2.0
53 /* The ccw bus type uses this table to find devices that it sends to
135 /* set ECKD specific ccw-device options */ in dasd_eckd_probe()
141 "ccw-device options"); in dasd_eckd_probe()
164 return (d1 + (d2 - 1)) / d2; in ceil_quot()
173 switch (rdc->dev_type) { in recs_per_track()
202 geo->cyl = (__u16) cyl; in set_ch_t()
203 geo->head = cyl >> 16; in set_ch_t()
204 geo->head <<= 4; in set_ch_t()
205 geo->head |= head; in set_ch_t()
215 struct dasd_eckd_private *private = device->private; in dasd_eckd_track_from_irb()
224 return -EINVAL; in dasd_eckd_track_from_irb()
229 return -EINVAL; in dasd_eckd_track_from_irb()
243 *track = cyl * private->rdc_data.trk_per_cyl + head; in dasd_eckd_track_from_irb()
250 struct dasd_eckd_private *private = device->private; in set_timestamp()
253 rc = get_phys_clock(&data->ep_sys_time); in set_timestamp()
258 if ((rc && !private->rdc_data.facilities.XRC_supported) || in set_timestamp()
259 rc == -EOPNOTSUPP || rc == -EACCES) in set_timestamp()
262 /* switch on System Time Stamp - needed for XRC Support */ in set_timestamp()
263 data->ga_extended |= 0x08; /* switch on 'Time Stamp Valid' */ in set_timestamp()
264 data->ga_extended |= 0x02; /* switch on 'Extended Parameter' */ in set_timestamp()
267 ccw->count = sizeof(struct DE_eckd_data); in set_timestamp()
268 ccw->flags |= CCW_FLAG_SLI; in set_timestamp()
279 struct dasd_eckd_private *private = device->private; in define_extent()
285 ccw->cmd_code = DASD_ECKD_CCW_DEFINE_EXTENT; in define_extent()
286 ccw->flags = 0; in define_extent()
287 ccw->count = 16; in define_extent()
288 ccw->cda = virt_to_dma32(data); in define_extent()
301 data->mask.perm = 0x1; in define_extent()
302 data->attributes.operation = private->attrib.operation; in define_extent()
305 data->mask.perm = 0x1; in define_extent()
306 data->attributes.operation = DASD_BYPASS_CACHE; in define_extent()
310 data->mask.perm = 0x1; in define_extent()
311 data->attributes.operation = private->attrib.operation; in define_extent()
312 data->blk_size = 0; in define_extent()
318 data->mask.perm = 0x02; in define_extent()
319 data->attributes.operation = private->attrib.operation; in define_extent()
324 data->attributes.operation = DASD_BYPASS_CACHE; in define_extent()
330 data->mask.perm = 0x3; in define_extent()
331 data->mask.auth = 0x1; in define_extent()
332 data->attributes.operation = DASD_BYPASS_CACHE; in define_extent()
336 data->mask.perm = 0x03; in define_extent()
337 data->attributes.operation = private->attrib.operation; in define_extent()
338 data->blk_size = 0; in define_extent()
341 data->mask.perm = 0x02; in define_extent()
342 data->attributes.operation = private->attrib.operation; in define_extent()
343 data->blk_size = blksize; in define_extent()
347 dev_err(&device->cdev->dev, in define_extent()
352 data->attributes.mode = 0x3; /* ECKD */ in define_extent()
354 if ((private->rdc_data.cu_type == 0x2105 || in define_extent()
355 private->rdc_data.cu_type == 0x2107 || in define_extent()
356 private->rdc_data.cu_type == 0x1750) in define_extent()
357 && !(private->uses_cdl && trk < 2)) in define_extent()
358 data->ga_extended |= 0x40; /* Regular Data Format Mode */ in define_extent()
360 heads = private->rdc_data.trk_per_cyl; in define_extent()
366 /* check for sequential prestage - enhance cylinder range */ in define_extent()
367 if (data->attributes.operation == DASD_SEQ_PRESTAGE || in define_extent()
368 data->attributes.operation == DASD_SEQ_ACCESS) { in define_extent()
370 if (endcyl + private->attrib.nr_cyl < private->real_cyl) in define_extent()
371 endcyl += private->attrib.nr_cyl; in define_extent()
373 endcyl = (private->real_cyl - 1); in define_extent()
376 set_ch_t(&data->beg_ext, begcyl, beghead); in define_extent()
377 set_ch_t(&data->end_ext, endcyl, endhead); in define_extent()
387 struct dasd_eckd_private *private = device->private; in locate_record_ext()
392 ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD_EXT; in locate_record_ext()
393 ccw->flags = 0; in locate_record_ext()
395 ccw->count = 22; in locate_record_ext()
397 ccw->count = 20; in locate_record_ext()
398 ccw->cda = virt_to_dma32(data); in locate_record_ext()
404 switch (private->rdc_data.dev_type) { in locate_record_ext()
408 sector = (49 + (rec_on_trk - 1) * (10 + d)) / 8; in locate_record_ext()
412 sector = (39 + (rec_on_trk - 1) * (8 + d)) / 7; in locate_record_ext()
416 data->sector = sector; in locate_record_ext()
421 data->count = count; in locate_record_ext()
424 data->operation.orientation = 0x3; in locate_record_ext()
425 data->operation.operation = 0x03; in locate_record_ext()
428 data->operation.orientation = 0x3; in locate_record_ext()
429 data->operation.operation = 0x16; in locate_record_ext()
432 data->operation.orientation = 0x1; in locate_record_ext()
433 data->operation.operation = 0x03; in locate_record_ext()
434 data->count++; in locate_record_ext()
437 data->operation.orientation = 0x3; in locate_record_ext()
438 data->operation.operation = 0x16; in locate_record_ext()
439 data->count++; in locate_record_ext()
445 data->auxiliary.length_valid = 0x1; in locate_record_ext()
446 data->length = reclen; in locate_record_ext()
447 data->operation.operation = 0x01; in locate_record_ext()
451 data->auxiliary.length_valid = 0x1; in locate_record_ext()
452 data->length = reclen; in locate_record_ext()
453 data->operation.operation = 0x03; in locate_record_ext()
456 data->operation.orientation = 0x0; in locate_record_ext()
457 data->operation.operation = 0x3F; in locate_record_ext()
458 data->extended_operation = 0x11; in locate_record_ext()
459 data->length = 0; in locate_record_ext()
460 data->extended_parameter_length = 0x02; in locate_record_ext()
461 if (data->count > 8) { in locate_record_ext()
462 data->extended_parameter[0] = 0xFF; in locate_record_ext()
463 data->extended_parameter[1] = 0xFF; in locate_record_ext()
464 data->extended_parameter[1] <<= (16 - count); in locate_record_ext()
466 data->extended_parameter[0] = 0xFF; in locate_record_ext()
467 data->extended_parameter[0] <<= (8 - count); in locate_record_ext()
468 data->extended_parameter[1] = 0x00; in locate_record_ext()
470 data->sector = 0xFF; in locate_record_ext()
473 data->auxiliary.length_valid = 0x1; in locate_record_ext()
474 data->length = reclen; /* not tlf, as one might think */ in locate_record_ext()
475 data->operation.operation = 0x3F; in locate_record_ext()
476 data->extended_operation = 0x23; in locate_record_ext()
482 data->auxiliary.length_valid = 0x1; in locate_record_ext()
483 data->length = reclen; in locate_record_ext()
484 data->operation.operation = 0x06; in locate_record_ext()
488 data->auxiliary.length_valid = 0x1; in locate_record_ext()
489 data->length = reclen; in locate_record_ext()
490 data->operation.operation = 0x16; in locate_record_ext()
493 data->operation.operation = 0x06; in locate_record_ext()
496 data->operation.orientation = 0x1; in locate_record_ext()
497 data->operation.operation = 0x0C; in locate_record_ext()
498 data->extended_parameter_length = 0; in locate_record_ext()
499 data->sector = 0xFF; in locate_record_ext()
502 data->auxiliary.length_valid = 0x1; in locate_record_ext()
503 data->length = tlf; in locate_record_ext()
504 data->operation.operation = 0x0C; in locate_record_ext()
507 data->length = reclen; in locate_record_ext()
508 data->auxiliary.length_valid = 0x1; in locate_record_ext()
509 data->operation.operation = 0x0b; in locate_record_ext()
516 set_ch_t(&data->seek_addr, in locate_record_ext()
517 trk / private->rdc_data.trk_per_cyl, in locate_record_ext()
518 trk % private->rdc_data.trk_per_cyl); in locate_record_ext()
519 data->search_arg.cyl = data->seek_addr.cyl; in locate_record_ext()
520 data->search_arg.head = data->seek_addr.head; in locate_record_ext()
521 data->search_arg.record = rec_on_trk; in locate_record_ext()
535 basepriv = basedev->private; in prefix_LRE()
536 startpriv = startdev->private; in prefix_LRE()
537 dedata = &pfxdata->define_extent; in prefix_LRE()
538 lredata = &pfxdata->locate_record; in prefix_LRE()
540 ccw->cmd_code = DASD_ECKD_CCW_PFX; in prefix_LRE()
541 ccw->flags = 0; in prefix_LRE()
543 ccw->count = sizeof(*pfxdata) + 2; in prefix_LRE()
544 ccw->cda = virt_to_dma32(pfxdata); in prefix_LRE()
547 ccw->count = sizeof(*pfxdata); in prefix_LRE()
548 ccw->cda = virt_to_dma32(pfxdata); in prefix_LRE()
557 return -EINVAL; in prefix_LRE()
559 pfxdata->format = format; in prefix_LRE()
560 pfxdata->base_address = basepriv->conf.ned->unit_addr; in prefix_LRE()
561 pfxdata->base_lss = basepriv->conf.ned->ID; in prefix_LRE()
562 pfxdata->validity.define_extent = 1; in prefix_LRE()
565 if (startpriv->uid.type == UA_BASE_PAV_ALIAS) in prefix_LRE()
566 pfxdata->validity.verify_base = 1; in prefix_LRE()
568 if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) { in prefix_LRE()
569 pfxdata->validity.verify_base = 1; in prefix_LRE()
570 pfxdata->validity.hyper_pav = 1; in prefix_LRE()
580 if (dedata->ga_extended & 0x08 && dedata->ga_extended & 0x02) in prefix_LRE()
581 pfxdata->validity.time_stamp = 1; /* 'Time Stamp Valid' */ in prefix_LRE()
604 struct dasd_eckd_private *private = device->private; in locate_record()
612 ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD; in locate_record()
613 ccw->flags = 0; in locate_record()
614 ccw->count = 16; in locate_record()
615 ccw->cda = virt_to_dma32(data); in locate_record()
620 switch (private->rdc_data.dev_type) { in locate_record()
624 sector = (49 + (rec_on_trk - 1) * (10 + d)) / 8; in locate_record()
628 sector = (39 + (rec_on_trk - 1) * (8 + d)) / 7; in locate_record()
632 data->sector = sector; in locate_record()
633 data->count = no_rec; in locate_record()
636 data->operation.orientation = 0x3; in locate_record()
637 data->operation.operation = 0x03; in locate_record()
640 data->operation.orientation = 0x3; in locate_record()
641 data->operation.operation = 0x16; in locate_record()
644 data->operation.orientation = 0x1; in locate_record()
645 data->operation.operation = 0x03; in locate_record()
646 data->count++; in locate_record()
649 data->operation.orientation = 0x3; in locate_record()
650 data->operation.operation = 0x16; in locate_record()
651 data->count++; in locate_record()
657 data->auxiliary.last_bytes_used = 0x1; in locate_record()
658 data->length = reclen; in locate_record()
659 data->operation.operation = 0x01; in locate_record()
663 data->auxiliary.last_bytes_used = 0x1; in locate_record()
664 data->length = reclen; in locate_record()
665 data->operation.operation = 0x03; in locate_record()
671 data->auxiliary.last_bytes_used = 0x1; in locate_record()
672 data->length = reclen; in locate_record()
673 data->operation.operation = 0x06; in locate_record()
677 data->auxiliary.last_bytes_used = 0x1; in locate_record()
678 data->length = reclen; in locate_record()
679 data->operation.operation = 0x16; in locate_record()
682 data->operation.operation = 0x06; in locate_record()
685 data->length = reclen; in locate_record()
686 data->auxiliary.last_bytes_used = 0x1; in locate_record()
687 data->operation.operation = 0x0b; in locate_record()
693 set_ch_t(&data->seek_addr, in locate_record()
694 trk / private->rdc_data.trk_per_cyl, in locate_record()
695 trk % private->rdc_data.trk_per_cyl); in locate_record()
696 data->search_arg.cyl = data->seek_addr.cyl; in locate_record()
697 data->search_arg.head = data->seek_addr.head; in locate_record()
698 data->search_arg.record = rec_on_trk; in locate_record()
702 * Returns 1 if the block is one of the special blocks that needs
709 * ccw->cmd_code |= 0x8;
741 memcpy(uid->vendor, conf->ned->HDA_manufacturer, in create_uid()
742 sizeof(uid->vendor) - 1); in create_uid()
743 EBCASC(uid->vendor, sizeof(uid->vendor) - 1); in create_uid()
744 memcpy(uid->serial, &conf->ned->serial, in create_uid()
745 sizeof(uid->serial) - 1); in create_uid()
746 EBCASC(uid->serial, sizeof(uid->serial) - 1); in create_uid()
747 uid->ssid = conf->gneq->subsystemID; in create_uid()
748 uid->real_unit_addr = conf->ned->unit_addr; in create_uid()
749 if (conf->sneq) { in create_uid()
750 uid->type = conf->sneq->sua_flags; in create_uid()
751 if (uid->type == UA_BASE_PAV_ALIAS) in create_uid()
752 uid->base_unit_addr = conf->sneq->base_unit_addr; in create_uid()
754 uid->type = UA_BASE_DEVICE; in create_uid()
756 if (conf->vdsneq) { in create_uid()
758 sprintf(uid->vduit+2*count, "%02x", in create_uid()
759 conf->vdsneq->uit[count]); in create_uid()
769 struct dasd_eckd_private *private = device->private; in dasd_eckd_generate_uid()
773 return -ENODEV; in dasd_eckd_generate_uid()
774 if (!private->conf.ned || !private->conf.gneq) in dasd_eckd_generate_uid()
775 return -ENODEV; in dasd_eckd_generate_uid()
776 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_generate_uid()
777 create_uid(&private->conf, &private->uid); in dasd_eckd_generate_uid()
778 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_generate_uid()
784 struct dasd_eckd_private *private = device->private; in dasd_eckd_get_uid()
788 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_get_uid()
789 *uid = private->uid; in dasd_eckd_get_uid()
790 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_get_uid()
793 return -EINVAL; in dasd_eckd_get_uid()
827 ccw = cqr->cpaddr; in dasd_eckd_fill_rcd_cqr()
828 ccw->cmd_code = DASD_ECKD_CCW_RCD; in dasd_eckd_fill_rcd_cqr()
829 ccw->flags = 0; in dasd_eckd_fill_rcd_cqr()
830 ccw->cda = virt_to_dma32(rcd_buffer); in dasd_eckd_fill_rcd_cqr()
831 ccw->count = DASD_ECKD_RCD_DATA_SIZE; in dasd_eckd_fill_rcd_cqr()
832 cqr->magic = DASD_ECKD_MAGIC; in dasd_eckd_fill_rcd_cqr()
834 cqr->startdev = device; in dasd_eckd_fill_rcd_cqr()
835 cqr->memdev = device; in dasd_eckd_fill_rcd_cqr()
836 cqr->block = NULL; in dasd_eckd_fill_rcd_cqr()
837 cqr->expires = 10*HZ; in dasd_eckd_fill_rcd_cqr()
838 cqr->lpm = lpm; in dasd_eckd_fill_rcd_cqr()
839 cqr->retries = 256; in dasd_eckd_fill_rcd_cqr()
840 cqr->buildclk = get_tod_clock(); in dasd_eckd_fill_rcd_cqr()
841 cqr->status = DASD_CQR_FILLED; in dasd_eckd_fill_rcd_cqr()
842 set_bit(DASD_CQR_VERIFY_PATH, &cqr->flags); in dasd_eckd_fill_rcd_cqr()
848 * the buffer has to be re-initialized with the EBCDIC "V1.0"
856 if (cqr->status != DASD_CQR_DONE) { in read_conf_cb()
857 ccw = cqr->cpaddr; in read_conf_cb()
858 rcd_buffer = dma32_to_virt(ccw->cda); in read_conf_cb()
880 ciw = ccw_device_get_ciw(device->cdev, CIW_TYPE_RCD); in dasd_eckd_read_conf_immediately()
881 if (!ciw || ciw->cmd != DASD_ECKD_CCW_RCD) in dasd_eckd_read_conf_immediately()
882 return -EOPNOTSUPP; in dasd_eckd_read_conf_immediately()
885 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_eckd_read_conf_immediately()
886 set_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags); in dasd_eckd_read_conf_immediately()
887 cqr->retries = 5; in dasd_eckd_read_conf_immediately()
888 cqr->callback = read_conf_cb; in dasd_eckd_read_conf_immediately()
906 ciw = ccw_device_get_ciw(device->cdev, CIW_TYPE_RCD); in dasd_eckd_read_conf_lpm()
907 if (!ciw || ciw->cmd != DASD_ECKD_CCW_RCD) { in dasd_eckd_read_conf_lpm()
908 ret = -EOPNOTSUPP; in dasd_eckd_read_conf_lpm()
913 ret = -ENOMEM; in dasd_eckd_read_conf_lpm()
922 ret = -ENOMEM; in dasd_eckd_read_conf_lpm()
926 cqr->callback = read_conf_cb; in dasd_eckd_read_conf_lpm()
931 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_read_conf_lpm()
951 conf->ned = NULL; in dasd_eckd_identify_conf_parts()
952 conf->sneq = NULL; in dasd_eckd_identify_conf_parts()
953 conf->vdsneq = NULL; in dasd_eckd_identify_conf_parts()
954 conf->gneq = NULL; in dasd_eckd_identify_conf_parts()
955 count = conf->len / sizeof(struct dasd_sneq); in dasd_eckd_identify_conf_parts()
956 sneq = (struct dasd_sneq *)conf->data; in dasd_eckd_identify_conf_parts()
958 if (sneq->flags.identifier == 1 && sneq->format == 1) in dasd_eckd_identify_conf_parts()
959 conf->sneq = sneq; in dasd_eckd_identify_conf_parts()
960 else if (sneq->flags.identifier == 1 && sneq->format == 4) in dasd_eckd_identify_conf_parts()
961 conf->vdsneq = (struct vd_sneq *)sneq; in dasd_eckd_identify_conf_parts()
962 else if (sneq->flags.identifier == 2) in dasd_eckd_identify_conf_parts()
963 conf->gneq = (struct dasd_gneq *)sneq; in dasd_eckd_identify_conf_parts()
964 else if (sneq->flags.identifier == 3 && sneq->res1 == 1) in dasd_eckd_identify_conf_parts()
965 conf->ned = (struct dasd_ned *)sneq; in dasd_eckd_identify_conf_parts()
968 if (!conf->ned || !conf->gneq) { in dasd_eckd_identify_conf_parts()
969 conf->ned = NULL; in dasd_eckd_identify_conf_parts()
970 conf->sneq = NULL; in dasd_eckd_identify_conf_parts()
971 conf->vdsneq = NULL; in dasd_eckd_identify_conf_parts()
972 conf->gneq = NULL; in dasd_eckd_identify_conf_parts()
973 return -EINVAL; in dasd_eckd_identify_conf_parts()
988 if (gneq->flags.identifier == 2) { in dasd_eckd_path_access()
1003 struct dasd_eckd_private *private = device->private; in dasd_eckd_store_conf_data()
1011 * also replace the old private->conf_data pointer in dasd_eckd_store_conf_data()
1014 cdp = device->path[chp].conf_data; in dasd_eckd_store_conf_data()
1015 if (private->conf.data == cdp) { in dasd_eckd_store_conf_data()
1016 private->conf.data = (void *)conf_data; in dasd_eckd_store_conf_data()
1017 dasd_eckd_identify_conf_parts(&private->conf); in dasd_eckd_store_conf_data()
1019 ccw_device_get_schid(device->cdev, &sch_id); in dasd_eckd_store_conf_data()
1020 device->path[chp].conf_data = conf_data; in dasd_eckd_store_conf_data()
1021 device->path[chp].cssid = sch_id.cssid; in dasd_eckd_store_conf_data()
1022 device->path[chp].ssid = sch_id.ssid; in dasd_eckd_store_conf_data()
1023 chp_desc = ccw_device_get_chp_desc(device->cdev, chp); in dasd_eckd_store_conf_data()
1025 device->path[chp].chpid = chp_desc->chpid; in dasd_eckd_store_conf_data()
1032 struct dasd_eckd_private *private = device->private; in dasd_eckd_clear_conf_data()
1035 private->conf.data = NULL; in dasd_eckd_clear_conf_data()
1036 private->conf.len = 0; in dasd_eckd_clear_conf_data()
1038 kfree(device->path[i].conf_data); in dasd_eckd_clear_conf_data()
1039 device->path[i].conf_data = NULL; in dasd_eckd_clear_conf_data()
1040 device->path[i].cssid = 0; in dasd_eckd_clear_conf_data()
1041 device->path[i].ssid = 0; in dasd_eckd_clear_conf_data()
1042 device->path[i].chpid = 0; in dasd_eckd_clear_conf_data()
1049 struct dasd_eckd_private *private = device->private; in dasd_eckd_read_fc_security()
1055 rc = chsc_scud(private->uid.ssid, (u64 *)esm, &esm_valid); in dasd_eckd_read_fc_security()
1058 device->path[chp].fc_security = 0; in dasd_eckd_read_fc_security()
1064 device->path[chp].fc_security = esm[chp]; in dasd_eckd_read_fc_security()
1066 device->path[chp].fc_security = 0; in dasd_eckd_read_fc_security()
1084 struct dasd_eckd_private *private = device->private; in dasd_eckd_check_cabling()
1094 dasd_eckd_get_uid_string(&private->conf, print_device_uid); in dasd_eckd_check_cabling()
1095 dev_err(&device->cdev->dev, in dasd_eckd_check_cabling()
1112 private = device->private; in dasd_eckd_read_conf()
1113 opm = ccw_device_get_path_mask(device->cdev); in dasd_eckd_read_conf()
1122 if (rc && rc != -EOPNOTSUPP) { /* -EOPNOTSUPP is ok */ in dasd_eckd_read_conf()
1123 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_read_conf()
1129 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_read_conf()
1140 private->conf.data = conf_data; in dasd_eckd_read_conf()
1141 private->conf.len = conf_len; in dasd_eckd_read_conf()
1142 if (dasd_eckd_identify_conf_parts(&private->conf)) { in dasd_eckd_read_conf()
1143 private->conf.data = NULL; in dasd_eckd_read_conf()
1144 private->conf.len = 0; in dasd_eckd_read_conf()
1156 path_err = -EINVAL; in dasd_eckd_read_conf()
1185 struct dasd_eckd_private *private = device->private; in get_fcx_max_data()
1194 fcx_in_gneq = private->conf.gneq->reserved2[7] & 0x04; in get_fcx_max_data()
1195 fcx_in_features = private->features.feature[40] & 0x80; in get_fcx_max_data()
1201 mdc = ccw_device_get_mdc(device->cdev, 0); in get_fcx_max_data()
1203 …dev_warn(&device->cdev->dev, "Detecting the maximum supported data size for zHPF requests failed\n… in get_fcx_max_data()
1212 struct dasd_eckd_private *private = device->private; in verify_fcx_max_data()
1216 if (private->fcx_max_data) { in verify_fcx_max_data()
1217 mdc = ccw_device_get_mdc(device->cdev, lpm); in verify_fcx_max_data()
1219 dev_warn(&device->cdev->dev, in verify_fcx_max_data()
1226 if (fcx_max_data < private->fcx_max_data) { in verify_fcx_max_data()
1227 dev_warn(&device->cdev->dev, in verify_fcx_max_data()
1231 private->fcx_max_data); in verify_fcx_max_data()
1232 return -EACCES; in verify_fcx_max_data()
1241 struct dasd_eckd_private *private = device->private; in rebuild_device_uid()
1243 int rc = -ENODEV; in rebuild_device_uid()
1248 memset(&data->rcd_buffer, 0, sizeof(data->rcd_buffer)); in rebuild_device_uid()
1249 memset(&data->cqr, 0, sizeof(data->cqr)); in rebuild_device_uid()
1250 data->cqr.cpaddr = &data->ccw; in rebuild_device_uid()
1251 rc = dasd_eckd_read_conf_immediately(device, &data->cqr, in rebuild_device_uid()
1252 data->rcd_buffer, in rebuild_device_uid()
1256 if (rc == -EOPNOTSUPP) /* -EOPNOTSUPP is ok */ in rebuild_device_uid()
1258 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in rebuild_device_uid()
1263 memcpy(private->conf.data, data->rcd_buffer, in rebuild_device_uid()
1265 if (dasd_eckd_identify_conf_parts(&private->conf)) { in rebuild_device_uid()
1266 rc = -ENODEV; in rebuild_device_uid()
1296 if (!(lpm & data->tbvpm)) in dasd_eckd_path_available_action()
1298 memset(&data->rcd_buffer, 0, sizeof(data->rcd_buffer)); in dasd_eckd_path_available_action()
1299 memset(&data->cqr, 0, sizeof(data->cqr)); in dasd_eckd_path_available_action()
1300 data->cqr.cpaddr = &data->ccw; in dasd_eckd_path_available_action()
1301 rc = dasd_eckd_read_conf_immediately(device, &data->cqr, in dasd_eckd_path_available_action()
1302 data->rcd_buffer, in dasd_eckd_path_available_action()
1305 switch (dasd_eckd_path_access(data->rcd_buffer, in dasd_eckd_path_available_action()
1316 } else if (rc == -EOPNOTSUPP) { in dasd_eckd_path_available_action()
1317 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_path_available_action()
1321 } else if (rc == -EAGAIN) { in dasd_eckd_path_available_action()
1322 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_path_available_action()
1327 dev_warn(&device->cdev->dev, in dasd_eckd_path_available_action()
1345 memcpy(&path_rcd_buf, data->rcd_buffer, in dasd_eckd_path_available_action()
1378 dev_err(&device->cdev->dev, in dasd_eckd_path_available_action()
1393 memcpy(conf_data, data->rcd_buffer, in dasd_eckd_path_available_action()
1414 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_path_available_action()
1429 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_path_available_action()
1441 device = data->device; in do_pe_handler_work()
1444 if (test_bit(DASD_FLAG_SUSPENDED, &device->flags)) { in do_pe_handler_work()
1449 if (test_and_set_bit(DASD_FLAG_PATH_VERIFY, &device->flags)) { in do_pe_handler_work()
1454 if (data->tbvpm) in do_pe_handler_work()
1456 if (data->fcsecpm) in do_pe_handler_work()
1459 clear_bit(DASD_FLAG_PATH_VERIFY, &device->flags); in do_pe_handler_work()
1461 if (data->isglobal) in do_pe_handler_work()
1476 data->isglobal = 1; in dasd_eckd_pe_handler()
1478 return -ENOMEM; in dasd_eckd_pe_handler()
1481 INIT_WORK(&data->worker, do_pe_handler_work); in dasd_eckd_pe_handler()
1483 data->device = device; in dasd_eckd_pe_handler()
1484 data->tbvpm = tbvpm; in dasd_eckd_pe_handler()
1485 data->fcsecpm = fcsecpm; in dasd_eckd_pe_handler()
1486 schedule_work(&data->worker); in dasd_eckd_pe_handler()
1492 struct dasd_eckd_private *private = device->private; in dasd_eckd_reset_path()
1495 if (!private->fcx_max_data) in dasd_eckd_reset_path()
1496 private->fcx_max_data = get_fcx_max_data(device); in dasd_eckd_reset_path()
1497 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_reset_path()
1500 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_reset_path()
1505 struct dasd_eckd_private *private = device->private; in dasd_eckd_read_features()
1512 memset(&private->features, 0, sizeof(struct dasd_rssd_features)); in dasd_eckd_read_features()
1518 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", "Could not " in dasd_eckd_read_features()
1522 cqr->startdev = device; in dasd_eckd_read_features()
1523 cqr->memdev = device; in dasd_eckd_read_features()
1524 cqr->block = NULL; in dasd_eckd_read_features()
1525 cqr->retries = 256; in dasd_eckd_read_features()
1526 cqr->expires = 10 * HZ; in dasd_eckd_read_features()
1529 prssdp = (struct dasd_psf_prssd_data *) cqr->data; in dasd_eckd_read_features()
1531 prssdp->order = PSF_ORDER_PRSSD; in dasd_eckd_read_features()
1532 prssdp->suborder = 0x41; /* Read Feature Codes */ in dasd_eckd_read_features()
1535 ccw = cqr->cpaddr; in dasd_eckd_read_features()
1536 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_read_features()
1537 ccw->count = sizeof(struct dasd_psf_prssd_data); in dasd_eckd_read_features()
1538 ccw->flags |= CCW_FLAG_CC; in dasd_eckd_read_features()
1539 ccw->cda = virt_to_dma32(prssdp); in dasd_eckd_read_features()
1541 /* Read Subsystem Data - feature codes */ in dasd_eckd_read_features()
1546 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in dasd_eckd_read_features()
1547 ccw->count = sizeof(struct dasd_rssd_features); in dasd_eckd_read_features()
1548 ccw->cda = virt_to_dma32(features); in dasd_eckd_read_features()
1550 cqr->buildclk = get_tod_clock(); in dasd_eckd_read_features()
1551 cqr->status = DASD_CQR_FILLED; in dasd_eckd_read_features()
1554 prssdp = (struct dasd_psf_prssd_data *) cqr->data; in dasd_eckd_read_features()
1556 memcpy(&private->features, features, in dasd_eckd_read_features()
1559 dev_warn(&device->cdev->dev, "Reading device feature codes" in dasd_eckd_read_features()
1561 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_read_features()
1565 /* Read Volume Information - Volume Storage Query */
1568 struct dasd_eckd_private *private = device->private; in dasd_eckd_read_vol_info()
1577 if (private->uid.type == UA_BASE_PAV_ALIAS || in dasd_eckd_read_vol_info()
1578 private->uid.type == UA_HYPER_PAV_ALIAS) in dasd_eckd_read_vol_info()
1585 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_read_vol_info()
1589 cqr = &dasd_vol_info_req->cqr; in dasd_eckd_read_vol_info()
1592 cqr->cpaddr = &dasd_vol_info_req->ccw; in dasd_eckd_read_vol_info()
1593 cqr->data = &dasd_vol_info_req->data; in dasd_eckd_read_vol_info()
1594 cqr->magic = DASD_ECKD_MAGIC; in dasd_eckd_read_vol_info()
1598 prssdp = cqr->data; in dasd_eckd_read_vol_info()
1599 prssdp->order = PSF_ORDER_PRSSD; in dasd_eckd_read_vol_info()
1600 prssdp->suborder = PSF_SUBORDER_VSQ; /* Volume Storage Query */ in dasd_eckd_read_vol_info()
1601 prssdp->lss = private->conf.ned->ID; in dasd_eckd_read_vol_info()
1602 prssdp->volume = private->conf.ned->unit_addr; in dasd_eckd_read_vol_info()
1604 ccw = cqr->cpaddr; in dasd_eckd_read_vol_info()
1605 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_read_vol_info()
1606 ccw->count = sizeof(*prssdp); in dasd_eckd_read_vol_info()
1607 ccw->flags |= CCW_FLAG_CC; in dasd_eckd_read_vol_info()
1608 ccw->cda = virt_to_dma32(prssdp); in dasd_eckd_read_vol_info()
1610 /* Read Subsystem Data - Volume Storage Query */ in dasd_eckd_read_vol_info()
1615 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in dasd_eckd_read_vol_info()
1616 ccw->count = sizeof(*vsq); in dasd_eckd_read_vol_info()
1617 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_read_vol_info()
1618 ccw->cda = virt_to_dma32(vsq); in dasd_eckd_read_vol_info()
1620 cqr->buildclk = get_tod_clock(); in dasd_eckd_read_vol_info()
1621 cqr->status = DASD_CQR_FILLED; in dasd_eckd_read_vol_info()
1622 cqr->startdev = device; in dasd_eckd_read_vol_info()
1623 cqr->memdev = device; in dasd_eckd_read_vol_info()
1624 cqr->block = NULL; in dasd_eckd_read_vol_info()
1625 cqr->retries = 256; in dasd_eckd_read_vol_info()
1626 cqr->expires = device->default_expires * HZ; in dasd_eckd_read_vol_info()
1628 __set_bit(DASD_CQR_SUPPRESS_CR, &cqr->flags); in dasd_eckd_read_vol_info()
1632 memcpy(&private->vsq, vsq, sizeof(*vsq)); in dasd_eckd_read_vol_info()
1634 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_read_vol_info()
1641 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_read_vol_info()
1648 struct dasd_eckd_private *private = device->private; in dasd_eckd_is_ese()
1650 return private->vsq.vol_info.ese; in dasd_eckd_is_ese()
1655 struct dasd_eckd_private *private = device->private; in dasd_eckd_ext_pool_id()
1657 return private->vsq.extent_pool_id; in dasd_eckd_ext_pool_id()
1667 struct dasd_eckd_private *private = device->private; in dasd_eckd_space_configured()
1672 return rc ? : private->vsq.space_configured; in dasd_eckd_space_configured()
1681 struct dasd_eckd_private *private = device->private; in dasd_eckd_space_allocated()
1686 return rc ? : private->vsq.space_allocated; in dasd_eckd_space_allocated()
1691 struct dasd_eckd_private *private = device->private; in dasd_eckd_logical_capacity()
1693 return private->vsq.logical_capacity; in dasd_eckd_logical_capacity()
1703 device = data->device; in dasd_eckd_ext_pool_exhaust_work()
1704 base = data->base; in dasd_eckd_ext_pool_exhaust_work()
1711 dev_warn(&device->cdev->dev, "No space left in the extent pool\n"); in dasd_eckd_ext_pool_exhaust_work()
1726 return -ENOMEM; in dasd_eckd_ext_pool_exhaust()
1727 INIT_WORK(&data->worker, dasd_eckd_ext_pool_exhaust_work); in dasd_eckd_ext_pool_exhaust()
1729 data->device = device; in dasd_eckd_ext_pool_exhaust()
1731 if (cqr->block) in dasd_eckd_ext_pool_exhaust()
1732 data->base = cqr->block->base; in dasd_eckd_ext_pool_exhaust()
1733 else if (cqr->basedev) in dasd_eckd_ext_pool_exhaust()
1734 data->base = cqr->basedev; in dasd_eckd_ext_pool_exhaust()
1736 data->base = NULL; in dasd_eckd_ext_pool_exhaust()
1738 schedule_work(&data->worker); in dasd_eckd_ext_pool_exhaust()
1746 struct dasd_eckd_private *private = device->private; in dasd_eckd_cpy_ext_pool_data()
1751 for (i = 0; i < lcq->pool_count; i++) { in dasd_eckd_cpy_ext_pool_data()
1752 eps = lcq->ext_pool_sum[i]; in dasd_eckd_cpy_ext_pool_data()
1754 memcpy(&private->eps, &eps, in dasd_eckd_cpy_ext_pool_data()
1760 /* Read Extent Pool Information - Logical Configuration Query */
1763 struct dasd_eckd_private *private = device->private; in dasd_eckd_read_ext_pool_info()
1771 if (private->uid.type == UA_BASE_PAV_ALIAS || in dasd_eckd_read_ext_pool_info()
1772 private->uid.type == UA_HYPER_PAV_ALIAS) in dasd_eckd_read_ext_pool_info()
1778 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_read_ext_pool_info()
1784 prssdp = cqr->data; in dasd_eckd_read_ext_pool_info()
1786 prssdp->order = PSF_ORDER_PRSSD; in dasd_eckd_read_ext_pool_info()
1787 prssdp->suborder = PSF_SUBORDER_LCQ; /* Logical Configuration Query */ in dasd_eckd_read_ext_pool_info()
1789 ccw = cqr->cpaddr; in dasd_eckd_read_ext_pool_info()
1790 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_read_ext_pool_info()
1791 ccw->count = sizeof(*prssdp); in dasd_eckd_read_ext_pool_info()
1792 ccw->flags |= CCW_FLAG_CC; in dasd_eckd_read_ext_pool_info()
1793 ccw->cda = virt_to_dma32(prssdp); in dasd_eckd_read_ext_pool_info()
1799 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in dasd_eckd_read_ext_pool_info()
1800 ccw->count = sizeof(*lcq); in dasd_eckd_read_ext_pool_info()
1801 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_read_ext_pool_info()
1802 ccw->cda = virt_to_dma32(lcq); in dasd_eckd_read_ext_pool_info()
1804 cqr->buildclk = get_tod_clock(); in dasd_eckd_read_ext_pool_info()
1805 cqr->status = DASD_CQR_FILLED; in dasd_eckd_read_ext_pool_info()
1806 cqr->startdev = device; in dasd_eckd_read_ext_pool_info()
1807 cqr->memdev = device; in dasd_eckd_read_ext_pool_info()
1808 cqr->block = NULL; in dasd_eckd_read_ext_pool_info()
1809 cqr->retries = 256; in dasd_eckd_read_ext_pool_info()
1810 cqr->expires = device->default_expires * HZ; in dasd_eckd_read_ext_pool_info()
1812 __set_bit(DASD_CQR_SUPPRESS_CR, &cqr->flags); in dasd_eckd_read_ext_pool_info()
1818 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_read_ext_pool_info()
1822 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_read_ext_pool_info()
1834 struct dasd_eckd_private *private = device->private; in dasd_eckd_ext_size()
1835 struct dasd_ext_pool_sum eps = private->eps; in dasd_eckd_ext_size()
1849 struct dasd_eckd_private *private = device->private; in dasd_eckd_ext_pool_warn_thrshld()
1851 return private->eps.warn_thrshld; in dasd_eckd_ext_pool_warn_thrshld()
1856 struct dasd_eckd_private *private = device->private; in dasd_eckd_ext_pool_cap_at_warnlevel()
1858 return private->eps.flags.capacity_at_warnlevel; in dasd_eckd_ext_pool_cap_at_warnlevel()
1866 struct dasd_eckd_private *private = device->private; in dasd_eckd_ext_pool_oos()
1868 return private->eps.flags.pool_oos; in dasd_eckd_ext_pool_oos()
1872 * Build CP for Perform Subsystem Function - SSC.
1887 "Could not allocate PSF-SSC request"); in dasd_eckd_build_psf_ssc()
1890 psf_ssc_data = (struct dasd_psf_ssc_data *)cqr->data; in dasd_eckd_build_psf_ssc()
1891 psf_ssc_data->order = PSF_ORDER_SSC; in dasd_eckd_build_psf_ssc()
1892 psf_ssc_data->suborder = 0xc0; in dasd_eckd_build_psf_ssc()
1894 psf_ssc_data->suborder |= 0x08; in dasd_eckd_build_psf_ssc()
1895 psf_ssc_data->reserved[0] = 0x88; in dasd_eckd_build_psf_ssc()
1897 ccw = cqr->cpaddr; in dasd_eckd_build_psf_ssc()
1898 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_build_psf_ssc()
1899 ccw->cda = virt_to_dma32(psf_ssc_data); in dasd_eckd_build_psf_ssc()
1900 ccw->count = 66; in dasd_eckd_build_psf_ssc()
1902 cqr->startdev = device; in dasd_eckd_build_psf_ssc()
1903 cqr->memdev = device; in dasd_eckd_build_psf_ssc()
1904 cqr->block = NULL; in dasd_eckd_build_psf_ssc()
1905 cqr->retries = 256; in dasd_eckd_build_psf_ssc()
1906 cqr->expires = 10*HZ; in dasd_eckd_build_psf_ssc()
1907 cqr->buildclk = get_tod_clock(); in dasd_eckd_build_psf_ssc()
1908 cqr->status = DASD_CQR_FILLED; in dasd_eckd_build_psf_ssc()
1932 cqr->flags |= flags; in dasd_eckd_psf_ssc()
1938 else if (cqr->intrc == -EAGAIN) in dasd_eckd_psf_ssc()
1939 rc = -EAGAIN; in dasd_eckd_psf_ssc()
1941 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_psf_ssc()
1951 struct dasd_eckd_private *private = device->private; in dasd_eckd_validate_server()
1954 if (private->uid.type == UA_BASE_PAV_ALIAS || in dasd_eckd_validate_server()
1955 private->uid.type == UA_HYPER_PAV_ALIAS) in dasd_eckd_validate_server()
1965 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "PSF-SSC for SSID %04x " in dasd_eckd_validate_server()
1966 "returned rc=%d", private->uid.ssid, rc); in dasd_eckd_validate_server()
1981 == -EAGAIN) { in dasd_eckd_do_validate_server()
1983 schedule_work(&device->kick_validate); in dasd_eckd_do_validate_server()
1994 if (test_bit(DASD_FLAG_OFFLINE, &device->flags) || in dasd_eckd_kick_validate_server()
1995 device->state < DASD_STATE_ONLINE) { in dasd_eckd_kick_validate_server()
2000 if (!schedule_work(&device->kick_validate)) in dasd_eckd_kick_validate_server()
2009 if (!device->copy) in dasd_device_is_primary()
2012 if (device->copy->active->device == device) in dasd_device_is_primary()
2020 struct dasd_block *block; in dasd_eckd_alloc_block() local
2028 block = dasd_alloc_block(); in dasd_eckd_alloc_block()
2029 if (IS_ERR(block)) { in dasd_eckd_alloc_block()
2030 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_alloc_block()
2031 "could not allocate dasd block structure"); in dasd_eckd_alloc_block()
2032 return PTR_ERR(block); in dasd_eckd_alloc_block()
2034 device->block = block; in dasd_eckd_alloc_block()
2035 block->base = device; in dasd_eckd_alloc_block()
2042 struct dasd_eckd_private *private = device->private; in dasd_eckd_pprc_enabled()
2044 return private->rdc_data.facilities.PPRC_enabled; in dasd_eckd_pprc_enabled()
2054 struct dasd_eckd_private *private = device->private; in dasd_eckd_check_characteristics()
2060 INIT_WORK(&device->kick_validate, dasd_eckd_do_validate_server); in dasd_eckd_check_characteristics()
2062 INIT_WORK(&device->suc_work, dasd_alias_handle_summary_unit_check); in dasd_eckd_check_characteristics()
2064 if (!ccw_device_is_pathgroup(device->cdev)) { in dasd_eckd_check_characteristics()
2065 dev_warn(&device->cdev->dev, in dasd_eckd_check_characteristics()
2067 return -EIO; in dasd_eckd_check_characteristics()
2069 if (!ccw_device_is_multipath(device->cdev)) { in dasd_eckd_check_characteristics()
2070 dev_info(&device->cdev->dev, in dasd_eckd_check_characteristics()
2076 dev_warn(&device->cdev->dev, in dasd_eckd_check_characteristics()
2079 return -ENOMEM; in dasd_eckd_check_characteristics()
2081 device->private = private; in dasd_eckd_check_characteristics()
2086 private->init_cqr_status = -1; in dasd_eckd_check_characteristics()
2088 private->attrib.operation = DASD_NORMAL_CACHE; in dasd_eckd_check_characteristics()
2089 private->attrib.nr_cyl = 0; in dasd_eckd_check_characteristics()
2097 device->default_expires = DASD_EXPIRES; in dasd_eckd_check_characteristics()
2098 device->default_retries = DASD_RETRIES; in dasd_eckd_check_characteristics()
2099 device->path_thrhld = DASD_ECKD_PATH_THRHLD; in dasd_eckd_check_characteristics()
2100 device->path_interval = DASD_ECKD_PATH_INTERVAL; in dasd_eckd_check_characteristics()
2101 device->aq_timeouts = DASD_RETRIES_MAX; in dasd_eckd_check_characteristics()
2103 if (private->conf.gneq) { in dasd_eckd_check_characteristics()
2105 for (i = 0; i < private->conf.gneq->timeout.value; i++) in dasd_eckd_check_characteristics()
2107 value = value * private->conf.gneq->timeout.number; in dasd_eckd_check_characteristics()
2110 device->default_expires = value; in dasd_eckd_check_characteristics()
2115 &private->rdc_data, 64); in dasd_eckd_check_characteristics()
2117 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_check_characteristics()
2123 rc = dasd_devmap_set_device_copy_relation(device->cdev, in dasd_eckd_check_characteristics()
2126 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_check_characteristics()
2131 /* check if block device is needed and allocate in case */ in dasd_eckd_check_characteristics()
2160 if ((device->features & DASD_FEATURE_USERAW) && in dasd_eckd_check_characteristics()
2161 !(private->rdc_data.facilities.RT_in_LR)) { in dasd_eckd_check_characteristics()
2162 dev_err(&device->cdev->dev, "The storage server does not " in dasd_eckd_check_characteristics()
2163 "support raw-track access\n"); in dasd_eckd_check_characteristics()
2164 rc = -EINVAL; in dasd_eckd_check_characteristics()
2169 if (private->rdc_data.no_cyl == LV_COMPAT_CYL && in dasd_eckd_check_characteristics()
2170 private->rdc_data.long_no_cyl) in dasd_eckd_check_characteristics()
2171 private->real_cyl = private->rdc_data.long_no_cyl; in dasd_eckd_check_characteristics()
2173 private->real_cyl = private->rdc_data.no_cyl; in dasd_eckd_check_characteristics()
2175 private->fcx_max_data = get_fcx_max_data(device); in dasd_eckd_check_characteristics()
2179 set_bit(DASD_FLAG_DEVICE_RO, &device->flags); in dasd_eckd_check_characteristics()
2181 dev_info(&device->cdev->dev, "New DASD %04X/%02X (CU %04X/%02X) " in dasd_eckd_check_characteristics()
2183 private->rdc_data.dev_type, in dasd_eckd_check_characteristics()
2184 private->rdc_data.dev_model, in dasd_eckd_check_characteristics()
2185 private->rdc_data.cu_type, in dasd_eckd_check_characteristics()
2186 private->rdc_data.cu_model.model, in dasd_eckd_check_characteristics()
2187 private->real_cyl, in dasd_eckd_check_characteristics()
2188 private->rdc_data.trk_per_cyl, in dasd_eckd_check_characteristics()
2189 private->rdc_data.sec_per_trk, in dasd_eckd_check_characteristics()
2190 readonly ? ", read-only device" : ""); in dasd_eckd_check_characteristics()
2196 dasd_free_block(device->block); in dasd_eckd_check_characteristics()
2197 device->block = NULL; in dasd_eckd_check_characteristics()
2201 kfree(device->private); in dasd_eckd_check_characteristics()
2202 device->private = NULL; in dasd_eckd_check_characteristics()
2208 struct dasd_eckd_private *private = device->private; in dasd_eckd_uncheck_device()
2214 private->conf.ned = NULL; in dasd_eckd_uncheck_device()
2215 private->conf.sneq = NULL; in dasd_eckd_uncheck_device()
2216 private->conf.vdsneq = NULL; in dasd_eckd_uncheck_device()
2217 private->conf.gneq = NULL; in dasd_eckd_uncheck_device()
2225 struct dasd_eckd_private *private = device->private; in dasd_eckd_analysis_ccw()
2239 ccw = cqr->cpaddr; in dasd_eckd_analysis_ccw()
2241 define_extent(ccw++, cqr->data, 0, 1, in dasd_eckd_analysis_ccw()
2243 LO_data = cqr->data + sizeof(struct DE_eckd_data); in dasd_eckd_analysis_ccw()
2245 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_analysis_ccw()
2249 count_data = private->count_area; in dasd_eckd_analysis_ccw()
2251 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_analysis_ccw()
2252 ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT; in dasd_eckd_analysis_ccw()
2253 ccw->flags = 0; in dasd_eckd_analysis_ccw()
2254 ccw->count = 8; in dasd_eckd_analysis_ccw()
2255 ccw->cda = virt_to_dma32(count_data); in dasd_eckd_analysis_ccw()
2261 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_analysis_ccw()
2265 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_analysis_ccw()
2266 ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT; in dasd_eckd_analysis_ccw()
2267 ccw->flags = 0; in dasd_eckd_analysis_ccw()
2268 ccw->count = 8; in dasd_eckd_analysis_ccw()
2269 ccw->cda = virt_to_dma32(count_data); in dasd_eckd_analysis_ccw()
2271 cqr->block = NULL; in dasd_eckd_analysis_ccw()
2272 cqr->startdev = device; in dasd_eckd_analysis_ccw()
2273 cqr->memdev = device; in dasd_eckd_analysis_ccw()
2274 cqr->retries = 255; in dasd_eckd_analysis_ccw()
2275 cqr->buildclk = get_tod_clock(); in dasd_eckd_analysis_ccw()
2276 cqr->status = DASD_CQR_FILLED; in dasd_eckd_analysis_ccw()
2278 set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); in dasd_eckd_analysis_ccw()
2279 set_bit(DASD_CQR_SUPPRESS_IT, &cqr->flags); in dasd_eckd_analysis_ccw()
2288 if (init_cqr->status == DASD_CQR_DONE) in dasd_eckd_analysis_evaluation()
2290 else if (init_cqr->status == DASD_CQR_NEED_ERP || in dasd_eckd_analysis_evaluation()
2291 init_cqr->status == DASD_CQR_FAILED) { in dasd_eckd_analysis_evaluation()
2292 sense = dasd_get_sense(&init_cqr->irb); in dasd_eckd_analysis_evaluation()
2311 struct dasd_device *device = init_cqr->startdev; in dasd_eckd_analysis_callback()
2312 struct dasd_eckd_private *private = device->private; in dasd_eckd_analysis_callback()
2314 private->init_cqr_status = dasd_eckd_analysis_evaluation(init_cqr); in dasd_eckd_analysis_callback()
2319 static int dasd_eckd_start_analysis(struct dasd_block *block) in dasd_eckd_start_analysis() argument
2323 init_cqr = dasd_eckd_analysis_ccw(block->base); in dasd_eckd_start_analysis()
2326 init_cqr->callback = dasd_eckd_analysis_callback; in dasd_eckd_start_analysis()
2327 init_cqr->callback_data = NULL; in dasd_eckd_start_analysis()
2328 init_cqr->expires = 5*HZ; in dasd_eckd_start_analysis()
2332 clear_bit(DASD_CQR_FLAGS_USE_ERP, &init_cqr->flags); in dasd_eckd_start_analysis()
2333 init_cqr->retries = 0; in dasd_eckd_start_analysis()
2335 return -EAGAIN; in dasd_eckd_start_analysis()
2338 static int dasd_eckd_end_analysis(struct dasd_block *block) in dasd_eckd_end_analysis() argument
2340 struct dasd_device *device = block->base; in dasd_eckd_end_analysis()
2341 struct dasd_eckd_private *private = device->private; in dasd_eckd_end_analysis()
2347 status = private->init_cqr_status; in dasd_eckd_end_analysis()
2348 private->init_cqr_status = -1; in dasd_eckd_end_analysis()
2357 if (device->features & DASD_FEATURE_USERAW) { in dasd_eckd_end_analysis()
2358 block->bp_block = DASD_RAW_BLOCKSIZE; in dasd_eckd_end_analysis()
2360 block->s2b_shift = 3; in dasd_eckd_end_analysis()
2365 dev_warn(&device->cdev->dev, "The DASD is not formatted\n"); in dasd_eckd_end_analysis()
2366 return -EMEDIUMTYPE; in dasd_eckd_end_analysis()
2368 dev_err(&device->cdev->dev, in dasd_eckd_end_analysis()
2371 return -EIO; in dasd_eckd_end_analysis()
2374 private->uses_cdl = 1; in dasd_eckd_end_analysis()
2378 if (private->count_area[i].kl != 4 || in dasd_eckd_end_analysis()
2379 private->count_area[i].dl != dasd_eckd_cdl_reclen(i) - 4 || in dasd_eckd_end_analysis()
2380 private->count_area[i].cyl != 0 || in dasd_eckd_end_analysis()
2381 private->count_area[i].head != count_area_head[i] || in dasd_eckd_end_analysis()
2382 private->count_area[i].record != count_area_rec[i]) { in dasd_eckd_end_analysis()
2383 private->uses_cdl = 0; in dasd_eckd_end_analysis()
2388 count_area = &private->count_area[3]; in dasd_eckd_end_analysis()
2390 if (private->uses_cdl == 0) { in dasd_eckd_end_analysis()
2392 if ((private->count_area[i].kl != 0) || in dasd_eckd_end_analysis()
2393 (private->count_area[i].dl != in dasd_eckd_end_analysis()
2394 private->count_area[0].dl) || in dasd_eckd_end_analysis()
2395 private->count_area[i].cyl != 0 || in dasd_eckd_end_analysis()
2396 private->count_area[i].head != count_area_head[i] || in dasd_eckd_end_analysis()
2397 private->count_area[i].record != count_area_rec[i]) in dasd_eckd_end_analysis()
2401 count_area = &private->count_area[0]; in dasd_eckd_end_analysis()
2403 if (private->count_area[3].record == 1) in dasd_eckd_end_analysis()
2404 dev_warn(&device->cdev->dev, in dasd_eckd_end_analysis()
2408 if (count_area != NULL && count_area->kl == 0) { in dasd_eckd_end_analysis()
2410 if (dasd_check_blocksize(count_area->dl) == 0) in dasd_eckd_end_analysis()
2411 block->bp_block = count_area->dl; in dasd_eckd_end_analysis()
2413 if (block->bp_block == 0) { in dasd_eckd_end_analysis()
2414 dev_warn(&device->cdev->dev, in dasd_eckd_end_analysis()
2416 return -EMEDIUMTYPE; in dasd_eckd_end_analysis()
2418 block->s2b_shift = 0; /* bits to shift 512 to get a block */ in dasd_eckd_end_analysis()
2419 for (sb = 512; sb < block->bp_block; sb = sb << 1) in dasd_eckd_end_analysis()
2420 block->s2b_shift++; in dasd_eckd_end_analysis()
2422 blk_per_trk = recs_per_track(&private->rdc_data, 0, block->bp_block); in dasd_eckd_end_analysis()
2425 block->blocks = ((unsigned long) private->real_cyl * in dasd_eckd_end_analysis()
2426 private->rdc_data.trk_per_cyl * in dasd_eckd_end_analysis()
2429 dev_info(&device->cdev->dev, in dasd_eckd_end_analysis()
2430 "DASD with %u KB/block, %lu KB total size, %u KB/track, " in dasd_eckd_end_analysis()
2431 "%s\n", (block->bp_block >> 10), in dasd_eckd_end_analysis()
2432 (((unsigned long) private->real_cyl * in dasd_eckd_end_analysis()
2433 private->rdc_data.trk_per_cyl * in dasd_eckd_end_analysis()
2434 blk_per_trk * (block->bp_block >> 9)) >> 1), in dasd_eckd_end_analysis()
2435 ((blk_per_trk * block->bp_block) >> 10), in dasd_eckd_end_analysis()
2436 private->uses_cdl ? in dasd_eckd_end_analysis()
2442 static int dasd_eckd_do_analysis(struct dasd_block *block) in dasd_eckd_do_analysis() argument
2444 struct dasd_eckd_private *private = block->base->private; in dasd_eckd_do_analysis()
2446 if (private->init_cqr_status < 0) in dasd_eckd_do_analysis()
2447 return dasd_eckd_start_analysis(block); in dasd_eckd_do_analysis()
2449 return dasd_eckd_end_analysis(block); in dasd_eckd_do_analysis()
2459 if (cancel_work_sync(&device->reload_device)) in dasd_eckd_online_to_ready()
2461 if (cancel_work_sync(&device->kick_validate)) in dasd_eckd_online_to_ready()
2473 dasd_eckd_fill_geometry(struct dasd_block *block, struct hd_geometry *geo) in dasd_eckd_fill_geometry() argument
2475 struct dasd_eckd_private *private = block->base->private; in dasd_eckd_fill_geometry()
2477 if (dasd_check_blocksize(block->bp_block) == 0) { in dasd_eckd_fill_geometry()
2478 geo->sectors = recs_per_track(&private->rdc_data, in dasd_eckd_fill_geometry()
2479 0, block->bp_block); in dasd_eckd_fill_geometry()
2481 geo->cylinders = private->rdc_data.no_cyl; in dasd_eckd_fill_geometry()
2482 geo->heads = private->rdc_data.trk_per_cyl; in dasd_eckd_fill_geometry()
2510 start_priv = startdev->private; in dasd_eckd_build_check_tcw()
2512 count = rpt * (fdata->stop_unit - fdata->start_unit + 1); in dasd_eckd_build_check_tcw()
2524 start_priv->count++; in dasd_eckd_build_check_tcw()
2526 itcw = itcw_init(cqr->data, itcw_size, ITCW_OP_READ, 0, count, 0); in dasd_eckd_build_check_tcw()
2528 rc = -EINVAL; in dasd_eckd_build_check_tcw()
2532 cqr->cpaddr = itcw_get_tcw(itcw); in dasd_eckd_build_check_tcw()
2533 rc = prepare_itcw(itcw, fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_check_tcw()
2544 rc = -EINVAL; in dasd_eckd_build_check_tcw()
2549 last_tidaw->flags |= TIDAW_FLAGS_LAST; in dasd_eckd_build_check_tcw()
2552 cqr->cpmode = 1; in dasd_eckd_build_check_tcw()
2553 cqr->startdev = startdev; in dasd_eckd_build_check_tcw()
2554 cqr->memdev = startdev; in dasd_eckd_build_check_tcw()
2555 cqr->basedev = base; in dasd_eckd_build_check_tcw()
2556 cqr->retries = startdev->default_retries; in dasd_eckd_build_check_tcw()
2557 cqr->expires = startdev->default_expires * HZ; in dasd_eckd_build_check_tcw()
2558 cqr->buildclk = get_tod_clock(); in dasd_eckd_build_check_tcw()
2559 cqr->status = DASD_CQR_FILLED; in dasd_eckd_build_check_tcw()
2561 set_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags); in dasd_eckd_build_check_tcw()
2595 start_priv = startdev->private; in dasd_eckd_build_check()
2596 base_priv = base->private; in dasd_eckd_build_check()
2598 count = rpt * (fdata->stop_unit - fdata->start_unit + 1); in dasd_eckd_build_check()
2600 use_prefix = base_priv->features.feature[8] & 0x01; in dasd_eckd_build_check()
2616 start_priv->count++; in dasd_eckd_build_check()
2617 data = cqr->data; in dasd_eckd_build_check()
2618 ccw = cqr->cpaddr; in dasd_eckd_build_check()
2621 prefix_LRE(ccw++, data, fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_check()
2625 define_extent(ccw++, data, fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_check()
2629 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_check()
2631 locate_record(ccw++, data, fdata->start_unit, 0, count, in dasd_eckd_build_check()
2636 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_check()
2637 ccw->cmd_code = DASD_ECKD_CCW_READ_COUNT; in dasd_eckd_build_check()
2638 ccw->flags = CCW_FLAG_SLI; in dasd_eckd_build_check()
2639 ccw->count = 8; in dasd_eckd_build_check()
2640 ccw->cda = virt_to_dma32(fmt_buffer); in dasd_eckd_build_check()
2645 cqr->startdev = startdev; in dasd_eckd_build_check()
2646 cqr->memdev = startdev; in dasd_eckd_build_check()
2647 cqr->basedev = base; in dasd_eckd_build_check()
2648 cqr->retries = DASD_RETRIES; in dasd_eckd_build_check()
2649 cqr->expires = startdev->default_expires * HZ; in dasd_eckd_build_check()
2650 cqr->buildclk = get_tod_clock(); in dasd_eckd_build_check()
2651 cqr->status = DASD_CQR_FILLED; in dasd_eckd_build_check()
2653 set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); in dasd_eckd_build_check()
2683 start_priv = startdev->private; in dasd_eckd_build_format()
2684 base_priv = base->private; in dasd_eckd_build_format()
2686 rpt = recs_per_track(&base_priv->rdc_data, 0, fdata->blksize); in dasd_eckd_build_format()
2688 nr_tracks = fdata->stop_unit - fdata->start_unit + 1; in dasd_eckd_build_format()
2691 * fdata->intensity is a bit string that tells us what to do: in dasd_eckd_build_format()
2699 if (fdata->intensity & 0x10) { in dasd_eckd_build_format()
2701 intensity = fdata->intensity & ~0x10; in dasd_eckd_build_format()
2704 intensity = fdata->intensity; in dasd_eckd_build_format()
2707 use_prefix = base_priv->features.feature[8] & 0x01; in dasd_eckd_build_format()
2749 dev_warn(&startdev->cdev->dev, in dasd_eckd_build_format()
2751 fdata->intensity); in dasd_eckd_build_format()
2752 return ERR_PTR(-EINVAL); in dasd_eckd_build_format()
2759 start_priv->count++; in dasd_eckd_build_format()
2760 data = fcp->data; in dasd_eckd_build_format()
2761 ccw = fcp->cpaddr; in dasd_eckd_build_format()
2767 fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_format()
2772 ->define_extent.ga_extended |= 0x04; in dasd_eckd_build_format()
2776 fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_format()
2781 ->ga_extended |= 0x04; in dasd_eckd_build_format()
2784 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_format()
2786 fdata->start_unit, 0, rpt*nr_tracks, in dasd_eckd_build_format()
2788 fdata->blksize); in dasd_eckd_build_format()
2794 fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_format()
2800 fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_format()
2804 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_format()
2806 fdata->start_unit, 0, rpt * nr_tracks + 1, in dasd_eckd_build_format()
2808 base->block->bp_block); in dasd_eckd_build_format()
2814 fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_format()
2819 fdata->start_unit, fdata->stop_unit, in dasd_eckd_build_format()
2823 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_format()
2825 fdata->start_unit, 0, 1, in dasd_eckd_build_format()
2834 (fdata->start_unit + j) / in dasd_eckd_build_format()
2835 base_priv->rdc_data.trk_per_cyl, in dasd_eckd_build_format()
2836 (fdata->start_unit + j) % in dasd_eckd_build_format()
2837 base_priv->rdc_data.trk_per_cyl); in dasd_eckd_build_format()
2841 ect->cyl = address.cyl; in dasd_eckd_build_format()
2842 ect->head = address.head; in dasd_eckd_build_format()
2843 ect->record = 0; in dasd_eckd_build_format()
2844 ect->kl = 0; in dasd_eckd_build_format()
2845 ect->dl = 8; in dasd_eckd_build_format()
2846 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_format()
2847 ccw->cmd_code = DASD_ECKD_CCW_WRITE_RECORD_ZERO; in dasd_eckd_build_format()
2848 ccw->flags = CCW_FLAG_SLI; in dasd_eckd_build_format()
2849 ccw->count = 8; in dasd_eckd_build_format()
2850 ccw->cda = virt_to_dma32(ect); in dasd_eckd_build_format()
2856 ect->cyl = address.cyl; in dasd_eckd_build_format()
2857 ect->head = address.head; in dasd_eckd_build_format()
2858 ect->record = 1; in dasd_eckd_build_format()
2859 ect->kl = 0; in dasd_eckd_build_format()
2860 ect->dl = 0; in dasd_eckd_build_format()
2861 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_format()
2862 ccw->cmd_code = DASD_ECKD_CCW_WRITE_CKD; in dasd_eckd_build_format()
2863 ccw->flags = CCW_FLAG_SLI; in dasd_eckd_build_format()
2864 ccw->count = 8; in dasd_eckd_build_format()
2865 ccw->cda = virt_to_dma32(ect); in dasd_eckd_build_format()
2870 ect->cyl = address.cyl; in dasd_eckd_build_format()
2871 ect->head = address.head; in dasd_eckd_build_format()
2872 ect->record = i + 1; in dasd_eckd_build_format()
2873 ect->kl = 0; in dasd_eckd_build_format()
2874 ect->dl = fdata->blksize; in dasd_eckd_build_format()
2876 * Check for special tracks 0-1 in dasd_eckd_build_format()
2882 ect->kl = 4; in dasd_eckd_build_format()
2883 ect->dl = sizes_trk0[i] - 4; in dasd_eckd_build_format()
2888 ect->kl = 44; in dasd_eckd_build_format()
2889 ect->dl = LABEL_SIZE - 44; in dasd_eckd_build_format()
2891 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_format()
2893 ccw->cmd_code = in dasd_eckd_build_format()
2896 ccw->cmd_code = in dasd_eckd_build_format()
2898 ccw->flags = CCW_FLAG_SLI; in dasd_eckd_build_format()
2899 ccw->count = 8; in dasd_eckd_build_format()
2900 ccw->cda = virt_to_dma32(ect); in dasd_eckd_build_format()
2906 fcp->startdev = startdev; in dasd_eckd_build_format()
2907 fcp->memdev = startdev; in dasd_eckd_build_format()
2908 fcp->basedev = base; in dasd_eckd_build_format()
2909 fcp->retries = 256; in dasd_eckd_build_format()
2910 fcp->expires = startdev->default_expires * HZ; in dasd_eckd_build_format()
2911 fcp->buildclk = get_tod_clock(); in dasd_eckd_build_format()
2912 fcp->status = DASD_CQR_FILLED; in dasd_eckd_build_format()
2948 struct dasd_eckd_private *private = base->private; in dasd_eckd_format_sanity_checks()
2950 if (fdata->start_unit >= in dasd_eckd_format_sanity_checks()
2951 (private->real_cyl * private->rdc_data.trk_per_cyl)) { in dasd_eckd_format_sanity_checks()
2952 dev_warn(&base->cdev->dev, in dasd_eckd_format_sanity_checks()
2954 fdata->start_unit); in dasd_eckd_format_sanity_checks()
2955 return -EINVAL; in dasd_eckd_format_sanity_checks()
2957 if (fdata->stop_unit >= in dasd_eckd_format_sanity_checks()
2958 (private->real_cyl * private->rdc_data.trk_per_cyl)) { in dasd_eckd_format_sanity_checks()
2959 dev_warn(&base->cdev->dev, in dasd_eckd_format_sanity_checks()
2961 fdata->stop_unit); in dasd_eckd_format_sanity_checks()
2962 return -EINVAL; in dasd_eckd_format_sanity_checks()
2964 if (fdata->start_unit > fdata->stop_unit) { in dasd_eckd_format_sanity_checks()
2965 dev_warn(&base->cdev->dev, in dasd_eckd_format_sanity_checks()
2967 fdata->start_unit); in dasd_eckd_format_sanity_checks()
2968 return -EINVAL; in dasd_eckd_format_sanity_checks()
2970 if (dasd_check_blocksize(fdata->blksize) != 0) { in dasd_eckd_format_sanity_checks()
2971 dev_warn(&base->cdev->dev, in dasd_eckd_format_sanity_checks()
2972 "The DASD cannot be formatted with block size %u\n", in dasd_eckd_format_sanity_checks()
2973 fdata->blksize); in dasd_eckd_format_sanity_checks()
2974 return -EINVAL; in dasd_eckd_format_sanity_checks()
2988 struct dasd_eckd_private *private = base->private; in dasd_eckd_format_process_data()
3003 old_start = fdata->start_unit; in dasd_eckd_format_process_data()
3004 old_stop = fdata->stop_unit; in dasd_eckd_format_process_data()
3015 recs_per_track(&private->rdc_data, 0, fdata->blksize); in dasd_eckd_format_process_data()
3020 while (fdata->start_unit <= old_stop) { in dasd_eckd_format_process_data()
3021 step = fdata->stop_unit - fdata->start_unit + 1; in dasd_eckd_format_process_data()
3023 fdata->stop_unit = in dasd_eckd_format_process_data()
3024 fdata->start_unit + format_step - 1; in dasd_eckd_format_process_data()
3032 if (rc == -ENOMEM) { in dasd_eckd_format_process_data()
3045 list_add_tail(&cqr->blocklist, &format_queue); in dasd_eckd_format_process_data()
3048 step = fdata->stop_unit - fdata->start_unit + 1; in dasd_eckd_format_process_data()
3051 fdata->start_unit = fdata->stop_unit + 1; in dasd_eckd_format_process_data()
3052 fdata->stop_unit = old_stop; in dasd_eckd_format_process_data()
3059 device = cqr->startdev; in dasd_eckd_format_process_data()
3060 private = device->private; in dasd_eckd_format_process_data()
3062 if (cqr->status == DASD_CQR_FAILED) { in dasd_eckd_format_process_data()
3068 sense = dasd_get_sense(&cqr->irb); in dasd_eckd_format_process_data()
3069 memcpy(irb, &cqr->irb, sizeof(*irb)); in dasd_eckd_format_process_data()
3071 rc = -EIO; in dasd_eckd_format_process_data()
3073 list_del_init(&cqr->blocklist); in dasd_eckd_format_process_data()
3075 private->count--; in dasd_eckd_format_process_data()
3078 if (rc && rc != -EIO) in dasd_eckd_format_process_data()
3080 if (rc == -EIO) { in dasd_eckd_format_process_data()
3086 * pass the -EIO to the IOCTL, therefore reset the rc in dasd_eckd_format_process_data()
3100 fdata->start_unit = old_start; in dasd_eckd_format_process_data()
3101 fdata->stop_unit = old_stop; in dasd_eckd_format_process_data()
3116 struct dasd_block *block = cqr->block; in test_and_set_format_track() local
3121 spin_lock_irqsave(&block->format_lock, flags); in test_and_set_format_track()
3122 if (cqr->trkcount != atomic_read(&block->trkcount)) { in test_and_set_format_track()
3132 list_for_each_entry(format, &block->format_list, list) { in test_and_set_format_track()
3133 if (format->track == to_format->track) { in test_and_set_format_track()
3138 list_add_tail(&to_format->list, &block->format_list); in test_and_set_format_track()
3141 spin_unlock_irqrestore(&block->format_lock, flags); in test_and_set_format_track()
3146 struct dasd_block *block) in clear_format_track() argument
3150 spin_lock_irqsave(&block->format_lock, flags); in clear_format_track()
3151 atomic_inc(&block->trkcount); in clear_format_track()
3152 list_del_init(&format->list); in clear_format_track()
3153 spin_unlock_irqrestore(&block->format_lock, flags); in clear_format_track()
3161 struct dasd_device *device = cqr->startdev; in dasd_eckd_ese_format_cb()
3162 struct dasd_eckd_private *private = device->private; in dasd_eckd_ese_format_cb()
3165 clear_format_track(format, cqr->basedev->block); in dasd_eckd_ese_format_cb()
3166 private->count--; in dasd_eckd_ese_format_cb()
3180 struct dasd_block *block; in dasd_eckd_ese_format() local
3189 block = cqr->block; in dasd_eckd_ese_format()
3190 base = block->base; in dasd_eckd_ese_format()
3191 private = base->private; in dasd_eckd_ese_format()
3192 blksize = block->bp_block; in dasd_eckd_ese_format()
3193 recs_per_trk = recs_per_track(&private->rdc_data, 0, blksize); in dasd_eckd_ese_format()
3194 format = &startdev->format_entry; in dasd_eckd_ese_format()
3196 first_trk = blk_rq_pos(req) >> block->s2b_shift; in dasd_eckd_ese_format()
3199 (blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift; in dasd_eckd_ese_format()
3207 "ESE error track %llu not within range %llu - %llu\n", in dasd_eckd_ese_format()
3209 return ERR_PTR(-EINVAL); in dasd_eckd_ese_format()
3211 format->track = curr_trk; in dasd_eckd_ese_format()
3215 cqr->retries++; in dasd_eckd_ese_format()
3216 return ERR_PTR(-EEXIST); in dasd_eckd_ese_format()
3222 fdata.intensity = private->uses_cdl ? DASD_FMT_INT_COMPAT : 0; in dasd_eckd_ese_format()
3226 return ERR_PTR(-EINVAL); in dasd_eckd_ese_format()
3236 fcqr->callback = dasd_eckd_ese_format_cb; in dasd_eckd_ese_format()
3237 fcqr->callback_data = (void *) format; in dasd_eckd_ese_format()
3263 struct dasd_block *block; in dasd_eckd_ese_read() local
3273 req = (struct request *) cqr->callback_data; in dasd_eckd_ese_read()
3274 base = cqr->block->base; in dasd_eckd_ese_read()
3275 blksize = base->block->bp_block; in dasd_eckd_ese_read()
3276 block = cqr->block; in dasd_eckd_ese_read()
3277 private = base->private; in dasd_eckd_ese_read()
3281 recs_per_trk = recs_per_track(&private->rdc_data, 0, blksize); in dasd_eckd_ese_read()
3282 first_trk = first_blk = blk_rq_pos(req) >> block->s2b_shift; in dasd_eckd_ese_read()
3285 (blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift; in dasd_eckd_ese_read()
3294 "ESE error track %llu not within range %llu - %llu\n", in dasd_eckd_ese_read()
3296 return -EINVAL; in dasd_eckd_ese_read()
3304 skip_block = curr_trk * recs_per_trk - first_blk; in dasd_eckd_ese_read()
3313 cqr->proc_bytes = blk_count * blksize; in dasd_eckd_ese_read()
3319 skip_block--; in dasd_eckd_ese_read()
3340 * - if data reoccurs (same head and record may reoccur), which may in dasd_eckd_count_records()
3342 * - when the head changes, because we're iterating over several tracks in dasd_eckd_count_records()
3344 * - when we've reached the end of sensible data in the buffer (the in dasd_eckd_count_records()
3357 return i - start; in dasd_eckd_count_records()
3381 trkcount = cdata->expect.stop_unit - cdata->expect.start_unit + 1; in dasd_eckd_format_evaluate_tracks()
3384 for (i = cdata->expect.start_unit; i <= cdata->expect.stop_unit; i++) { in dasd_eckd_format_evaluate_tracks()
3393 if (i != cdata->expect.start_unit) in dasd_eckd_format_evaluate_tracks()
3394 pos += rpt_max - count; in dasd_eckd_format_evaluate_tracks()
3404 cdata->result = DASD_FMT_ERR_TOO_FEW_RECORDS; in dasd_eckd_format_evaluate_tracks()
3408 cdata->result = DASD_FMT_ERR_TOO_MANY_RECORDS; in dasd_eckd_format_evaluate_tracks()
3413 blksize = cdata->expect.blksize; in dasd_eckd_format_evaluate_tracks()
3420 if ((cdata->expect.intensity & 0x08) && in dasd_eckd_format_evaluate_tracks()
3423 blksize = sizes_trk0[j] - 4; in dasd_eckd_format_evaluate_tracks()
3427 if ((cdata->expect.intensity & 0x08) && in dasd_eckd_format_evaluate_tracks()
3429 blksize = LABEL_SIZE - 44; in dasd_eckd_format_evaluate_tracks()
3435 cdata->result = DASD_FMT_ERR_BLKSIZE; in dasd_eckd_format_evaluate_tracks()
3440 cdata->result = DASD_FMT_ERR_KEY_LENGTH; in dasd_eckd_format_evaluate_tracks()
3447 cdata->result = DASD_FMT_ERR_RECORD_ID; in dasd_eckd_format_evaluate_tracks()
3458 if (!cdata->result) { in dasd_eckd_format_evaluate_tracks()
3459 i--; in dasd_eckd_format_evaluate_tracks()
3460 pos--; in dasd_eckd_format_evaluate_tracks()
3463 cdata->unit = i; in dasd_eckd_format_evaluate_tracks()
3464 cdata->num_records = count; in dasd_eckd_format_evaluate_tracks()
3465 cdata->rec = fmt_buffer[pos].record; in dasd_eckd_format_evaluate_tracks()
3466 cdata->blksize = fmt_buffer[pos].dl; in dasd_eckd_format_evaluate_tracks()
3467 cdata->key_length = fmt_buffer[pos].kl; in dasd_eckd_format_evaluate_tracks()
3477 struct dasd_eckd_private *private = base->private; in dasd_eckd_check_device_format()
3487 trk_per_cyl = private->rdc_data.trk_per_cyl; in dasd_eckd_check_device_format()
3490 rpt_max = recs_per_track(&private->rdc_data, 0, 512) + 1; in dasd_eckd_check_device_format()
3491 rpt_exp = recs_per_track(&private->rdc_data, 0, cdata->expect.blksize); in dasd_eckd_check_device_format()
3493 trkcount = cdata->expect.stop_unit - cdata->expect.start_unit + 1; in dasd_eckd_check_device_format()
3498 return -ENOMEM; in dasd_eckd_check_device_format()
3508 if ((private->features.feature[40] & 0x04) && in dasd_eckd_check_device_format()
3509 fmt_buffer_size <= private->fcx_max_data) in dasd_eckd_check_device_format()
3512 rc = dasd_eckd_format_process_data(base, &cdata->expect, enable_pav, in dasd_eckd_check_device_format()
3514 if (rc && rc != -EIO) in dasd_eckd_check_device_format()
3516 if (rc == -EIO) { in dasd_eckd_check_device_format()
3524 rc = dasd_eckd_format_process_data(base, &cdata->expect, in dasd_eckd_check_device_format()
3546 if (cqr->retries < 0) { in dasd_eckd_handle_terminated_request()
3547 cqr->status = DASD_CQR_FAILED; in dasd_eckd_handle_terminated_request()
3550 cqr->status = DASD_CQR_FILLED; in dasd_eckd_handle_terminated_request()
3551 if (cqr->block && (cqr->startdev != cqr->block->base)) { in dasd_eckd_handle_terminated_request()
3553 cqr->startdev = cqr->block->base; in dasd_eckd_handle_terminated_request()
3554 cqr->lpm = dasd_path_get_opm(cqr->block->base); in dasd_eckd_handle_terminated_request()
3561 struct dasd_device *device = (struct dasd_device *) cqr->startdev; in dasd_eckd_erp_action()
3562 struct ccw_device *cdev = device->cdev; in dasd_eckd_erp_action()
3564 switch (cdev->id.cu_type) { in dasd_eckd_erp_action()
3589 struct dasd_eckd_private *private = device->private; in dasd_eckd_check_for_device_change()
3593 if ((scsw_dstat(&irb->scsw) & mask) == mask) { in dasd_eckd_check_for_device_change()
3598 if (!device->block && private->lcu && in dasd_eckd_check_for_device_change()
3599 device->state == DASD_STATE_ONLINE && in dasd_eckd_check_for_device_change()
3600 !test_bit(DASD_FLAG_OFFLINE, &device->flags) && in dasd_eckd_check_for_device_change()
3601 !test_bit(DASD_FLAG_SUSPENDED, &device->flags)) { in dasd_eckd_check_for_device_change()
3615 (scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK)) { in dasd_eckd_check_for_device_change()
3616 if (test_and_set_bit(DASD_FLAG_SUC, &device->flags)) { in dasd_eckd_check_for_device_change()
3625 clear_bit(DASD_FLAG_SUC, &device->flags); in dasd_eckd_check_for_device_change()
3629 private->suc_reason = sense[8]; in dasd_eckd_check_for_device_change()
3632 private->suc_reason); in dasd_eckd_check_for_device_change()
3634 if (!schedule_work(&device->suc_work)) in dasd_eckd_check_for_device_change()
3650 if (device->block && (sense[27] & DASD_SENSE_BIT_0) && in dasd_eckd_check_for_device_change()
3652 (scsw_dstat(&irb->scsw) & DEV_STAT_UNIT_CHECK) && in dasd_eckd_check_for_device_change()
3653 test_bit(DASD_FLAG_IS_RESERVED, &device->flags)) { in dasd_eckd_check_for_device_change()
3654 if (device->features & DASD_FEATURE_FAILONSLCK) in dasd_eckd_check_for_device_change()
3655 set_bit(DASD_FLAG_LOCK_STOLEN, &device->flags); in dasd_eckd_check_for_device_change()
3656 clear_bit(DASD_FLAG_IS_RESERVED, &device->flags); in dasd_eckd_check_for_device_change()
3657 dev_err(&device->cdev->dev, in dasd_eckd_check_for_device_change()
3666 struct dasd_eckd_private *private = device->private; in dasd_eckd_ras_sanity_checks()
3670 trks_per_vol = private->real_cyl * private->rdc_data.trk_per_cyl; in dasd_eckd_ras_sanity_checks()
3673 dev_warn(&device->cdev->dev, in dasd_eckd_ras_sanity_checks()
3676 rc = -EINVAL; in dasd_eckd_ras_sanity_checks()
3678 dev_warn(&device->cdev->dev, in dasd_eckd_ras_sanity_checks()
3681 rc = -EINVAL; in dasd_eckd_ras_sanity_checks()
3683 dev_warn(&device->cdev->dev, in dasd_eckd_ras_sanity_checks()
3686 rc = -EINVAL; in dasd_eckd_ras_sanity_checks()
3706 tmp = from + trks_per_ext - (from % trks_per_ext) - 1; in count_exts()
3709 cur_pos = tmp - from + 1; in count_exts()
3713 if (to - (from + cur_pos) + 1 >= trks_per_ext) { in count_exts()
3714 tmp = to - ((to - trks_per_ext + 1) % trks_per_ext); in count_exts()
3715 count += (tmp - (from + cur_pos) + 1) / trks_per_ext; in count_exts()
3735 return -ENOMEM; in dasd_in_copy_relation()
3739 rc = temp->dev_info[0].state; in dasd_in_copy_relation()
3749 dasd_eckd_dso_ras(struct dasd_device *device, struct dasd_block *block, in dasd_eckd_dso_ras() argument
3753 struct dasd_eckd_private *private = device->private; in dasd_eckd_dso_ras()
3771 return ERR_PTR(-EINVAL); in dasd_eckd_dso_ras()
3779 features = &private->features; in dasd_eckd_dso_ras()
3781 trks_per_ext = dasd_eckd_ext_size(device) * private->rdc_data.trk_per_cyl; in dasd_eckd_dso_ras()
3790 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_dso_ras()
3795 ras_data = cqr->data; in dasd_eckd_dso_ras()
3798 ras_data->order = DSO_ORDER_RAS; in dasd_eckd_dso_ras()
3799 ras_data->flags.vol_type = 0; /* CKD volume */ in dasd_eckd_dso_ras()
3801 ras_data->op_flags.by_extent = by_extent; in dasd_eckd_dso_ras()
3807 if (features->feature[56] & 0x01 && !copy_relation) in dasd_eckd_dso_ras()
3808 ras_data->op_flags.guarantee_init = 1; in dasd_eckd_dso_ras()
3810 ras_data->lss = private->conf.ned->ID; in dasd_eckd_dso_ras()
3811 ras_data->dev_addr = private->conf.ned->unit_addr; in dasd_eckd_dso_ras()
3812 ras_data->nr_exts = nr_exts; in dasd_eckd_dso_ras()
3815 heads = private->rdc_data.trk_per_cyl; in dasd_eckd_dso_ras()
3817 cur_to_trk = first_trk + trks_per_ext - in dasd_eckd_dso_ras()
3818 (first_trk % trks_per_ext) - 1; in dasd_eckd_dso_ras()
3821 ras_range = (struct dasd_dso_ras_ext_range *)(cqr->data + ras_size); in dasd_eckd_dso_ras()
3829 set_ch_t(&ras_range->beg_ext, beg_cyl, beg_head); in dasd_eckd_dso_ras()
3830 set_ch_t(&ras_range->end_ext, end_cyl, end_head); in dasd_eckd_dso_ras()
3833 cur_to_trk = cur_from_trk + trks_per_ext - 1; in dasd_eckd_dso_ras()
3840 ccw = cqr->cpaddr; in dasd_eckd_dso_ras()
3841 ccw->cda = virt_to_dma32(cqr->data); in dasd_eckd_dso_ras()
3842 ccw->cmd_code = DASD_ECKD_CCW_DSO; in dasd_eckd_dso_ras()
3843 ccw->count = size; in dasd_eckd_dso_ras()
3845 cqr->startdev = device; in dasd_eckd_dso_ras()
3846 cqr->memdev = device; in dasd_eckd_dso_ras()
3847 cqr->block = block; in dasd_eckd_dso_ras()
3848 cqr->retries = 256; in dasd_eckd_dso_ras()
3849 cqr->expires = device->default_expires * HZ; in dasd_eckd_dso_ras()
3850 cqr->buildclk = get_tod_clock(); in dasd_eckd_dso_ras()
3851 cqr->status = DASD_CQR_FILLED; in dasd_eckd_dso_ras()
3867 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_release_space_full()
3875 struct dasd_eckd_private *private = device->private; in dasd_eckd_release_space_trks()
3876 struct dasd_block *block = device->block; in dasd_eckd_release_space_trks() local
3888 device_exts = private->real_cyl / dasd_eckd_ext_size(device); in dasd_eckd_release_space_trks()
3889 trks_per_ext = dasd_eckd_ext_size(device) * private->rdc_data.trk_per_cyl; in dasd_eckd_release_space_trks()
3898 stop = cur_pos + step - in dasd_eckd_release_space_trks()
3899 ((cur_pos + step) % trks_per_ext) - 1; in dasd_eckd_release_space_trks()
3906 if (rc == -ENOMEM) { in dasd_eckd_release_space_trks()
3915 spin_lock_irq(&block->queue_lock); in dasd_eckd_release_space_trks()
3916 list_add_tail(&cqr->blocklist, &ras_queue); in dasd_eckd_release_space_trks()
3917 spin_unlock_irq(&block->queue_lock); in dasd_eckd_release_space_trks()
3925 device = cqr->startdev; in dasd_eckd_release_space_trks()
3926 private = device->private; in dasd_eckd_release_space_trks()
3928 spin_lock_irq(&block->queue_lock); in dasd_eckd_release_space_trks()
3929 list_del_init(&cqr->blocklist); in dasd_eckd_release_space_trks()
3930 spin_unlock_irq(&block->queue_lock); in dasd_eckd_release_space_trks()
3932 private->count--; in dasd_eckd_release_space_trks()
3943 if (rdata->intensity & DASD_FMT_INT_ESE_FULL) in dasd_eckd_release_space()
3945 else if (rdata->intensity == 0) in dasd_eckd_release_space()
3946 return dasd_eckd_release_space_trks(device, rdata->start_unit, in dasd_eckd_release_space()
3947 rdata->stop_unit); in dasd_eckd_release_space()
3949 return -EINVAL; in dasd_eckd_release_space()
3954 struct dasd_block *block, in dasd_eckd_build_cp_cmd_single() argument
3980 basedev = block->base; in dasd_eckd_build_cp_cmd_single()
3981 private = basedev->private; in dasd_eckd_build_cp_cmd_single()
3987 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp_cmd_single()
3993 if (bv.bv_len & (blksize - 1)) in dasd_eckd_build_cp_cmd_single()
3995 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp_cmd_single()
3996 count += bv.bv_len >> (block->s2b_shift + 9); in dasd_eckd_build_cp_cmd_single()
3998 cidaw += bv.bv_len >> (block->s2b_shift + 9); in dasd_eckd_build_cp_cmd_single()
4001 if (count != last_rec - first_rec + 1) in dasd_eckd_build_cp_cmd_single()
4002 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp_cmd_single()
4005 use_prefix = private->features.feature[8] & 0x01; in dasd_eckd_build_cp_cmd_single()
4022 if (private->uses_cdl && first_rec < 2*blk_per_trk) { in dasd_eckd_build_cp_cmd_single()
4024 count = 2*blk_per_trk - first_rec; in dasd_eckd_build_cp_cmd_single()
4033 ccw = cqr->cpaddr; in dasd_eckd_build_cp_cmd_single()
4036 if (prefix(ccw++, cqr->data, first_trk, in dasd_eckd_build_cp_cmd_single()
4037 last_trk, cmd, basedev, startdev) == -EAGAIN) { in dasd_eckd_build_cp_cmd_single()
4042 return ERR_PTR(-EAGAIN); in dasd_eckd_build_cp_cmd_single()
4044 idaws = (dma64_t *)(cqr->data + sizeof(struct PFX_eckd_data)); in dasd_eckd_build_cp_cmd_single()
4046 if (define_extent(ccw++, cqr->data, first_trk, in dasd_eckd_build_cp_cmd_single()
4047 last_trk, cmd, basedev, 0) == -EAGAIN) { in dasd_eckd_build_cp_cmd_single()
4052 return ERR_PTR(-EAGAIN); in dasd_eckd_build_cp_cmd_single()
4054 idaws = (dma64_t *)(cqr->data + sizeof(struct DE_eckd_data)); in dasd_eckd_build_cp_cmd_single()
4059 if (private->uses_cdl == 0 || recid > 2*blk_per_trk) { in dasd_eckd_build_cp_cmd_single()
4061 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_cp_cmd_single()
4063 last_rec - recid + 1, cmd, basedev, blksize); in dasd_eckd_build_cp_cmd_single()
4080 /* Locate record for cdl special block ? */ in dasd_eckd_build_cp_cmd_single()
4081 if (private->uses_cdl && recid < 2*blk_per_trk) { in dasd_eckd_build_cp_cmd_single()
4088 blksize - count); in dasd_eckd_build_cp_cmd_single()
4090 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_cp_cmd_single()
4096 if (private->uses_cdl && recid == 2*blk_per_trk) { in dasd_eckd_build_cp_cmd_single()
4097 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_cp_cmd_single()
4100 last_rec - recid + 1, in dasd_eckd_build_cp_cmd_single()
4104 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_cp_cmd_single()
4105 ccw->cmd_code = rcmd; in dasd_eckd_build_cp_cmd_single()
4106 ccw->count = count; in dasd_eckd_build_cp_cmd_single()
4108 ccw->cda = virt_to_dma32(idaws); in dasd_eckd_build_cp_cmd_single()
4109 ccw->flags = CCW_FLAG_IDA; in dasd_eckd_build_cp_cmd_single()
4112 ccw->cda = virt_to_dma32(dst); in dasd_eckd_build_cp_cmd_single()
4113 ccw->flags = 0; in dasd_eckd_build_cp_cmd_single()
4121 block->base->features & DASD_FEATURE_FAILFAST) in dasd_eckd_build_cp_cmd_single()
4122 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); in dasd_eckd_build_cp_cmd_single()
4123 cqr->startdev = startdev; in dasd_eckd_build_cp_cmd_single()
4124 cqr->memdev = startdev; in dasd_eckd_build_cp_cmd_single()
4125 cqr->block = block; in dasd_eckd_build_cp_cmd_single()
4126 cqr->expires = startdev->default_expires * HZ; /* default 5 minutes */ in dasd_eckd_build_cp_cmd_single()
4127 cqr->lpm = dasd_path_get_ppm(startdev); in dasd_eckd_build_cp_cmd_single()
4128 cqr->retries = startdev->default_retries; in dasd_eckd_build_cp_cmd_single()
4129 cqr->buildclk = get_tod_clock(); in dasd_eckd_build_cp_cmd_single()
4130 cqr->status = DASD_CQR_FILLED; in dasd_eckd_build_cp_cmd_single()
4134 set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); in dasd_eckd_build_cp_cmd_single()
4142 struct dasd_block *block, in dasd_eckd_build_cp_cmd_track() argument
4170 basedev = block->base; in dasd_eckd_build_cp_cmd_track()
4176 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp_cmd_track()
4183 cidaw = last_rec - first_rec + 1; in dasd_eckd_build_cp_cmd_track()
4184 trkcount = last_trk - first_trk + 1; in dasd_eckd_build_cp_cmd_track()
4196 ccw = cqr->cpaddr; in dasd_eckd_build_cp_cmd_track()
4199 tlf = last_offs - first_offs + 1; in dasd_eckd_build_cp_cmd_track()
4204 if (prefix_LRE(ccw++, cqr->data, first_trk, in dasd_eckd_build_cp_cmd_track()
4208 tlf) == -EAGAIN) { in dasd_eckd_build_cp_cmd_track()
4213 return ERR_PTR(-EAGAIN); in dasd_eckd_build_cp_cmd_track()
4219 * - all idaws but the first and the last must address full pages in dasd_eckd_build_cp_cmd_track()
4220 * (or 2K blocks on 31-bit) in dasd_eckd_build_cp_cmd_track()
4221 * - the scope of a ccw and it's idal ends with the track boundaries in dasd_eckd_build_cp_cmd_track()
4223 idaws = (dma64_t *)(cqr->data + sizeof(struct PFX_eckd_data)); in dasd_eckd_build_cp_cmd_track()
4237 count_to_trk_end = blk_per_trk - recoffs; in dasd_eckd_build_cp_cmd_track()
4238 count = min((last_rec - recid + 1), in dasd_eckd_build_cp_cmd_track()
4241 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_cp_cmd_track()
4242 ccw->cmd_code = cmd; in dasd_eckd_build_cp_cmd_track()
4243 ccw->count = len_to_track_end; in dasd_eckd_build_cp_cmd_track()
4244 ccw->cda = virt_to_dma32(idaws); in dasd_eckd_build_cp_cmd_track()
4245 ccw->flags = CCW_FLAG_IDA; in dasd_eckd_build_cp_cmd_track()
4260 if ((unsigned long)(dst) & (IDA_BLOCK_SIZE - 1)) { in dasd_eckd_build_cp_cmd_track()
4262 return ERR_PTR(-ERANGE); in dasd_eckd_build_cp_cmd_track()
4268 return ERR_PTR(-ERANGE); in dasd_eckd_build_cp_cmd_track()
4271 seg_len -= part_len; in dasd_eckd_build_cp_cmd_track()
4274 len_to_track_end -= part_len; in dasd_eckd_build_cp_cmd_track()
4276 * -> create an idaw in dasd_eckd_build_cp_cmd_track()
4280 if (!((unsigned long)(idaw_dst + idaw_len) & (IDA_BLOCK_SIZE - 1))) in dasd_eckd_build_cp_cmd_track()
4298 block->base->features & DASD_FEATURE_FAILFAST) in dasd_eckd_build_cp_cmd_track()
4299 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); in dasd_eckd_build_cp_cmd_track()
4300 cqr->startdev = startdev; in dasd_eckd_build_cp_cmd_track()
4301 cqr->memdev = startdev; in dasd_eckd_build_cp_cmd_track()
4302 cqr->block = block; in dasd_eckd_build_cp_cmd_track()
4303 cqr->expires = startdev->default_expires * HZ; /* default 5 minutes */ in dasd_eckd_build_cp_cmd_track()
4304 cqr->lpm = dasd_path_get_ppm(startdev); in dasd_eckd_build_cp_cmd_track()
4305 cqr->retries = startdev->default_retries; in dasd_eckd_build_cp_cmd_track()
4306 cqr->buildclk = get_tod_clock(); in dasd_eckd_build_cp_cmd_track()
4307 cqr->status = DASD_CQR_FILLED; in dasd_eckd_build_cp_cmd_track()
4311 set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); in dasd_eckd_build_cp_cmd_track()
4342 basepriv = basedev->private; in prepare_itcw()
4343 startpriv = startdev->private; in prepare_itcw()
4349 pfxdata.base_address = basepriv->conf.ned->unit_addr; in prepare_itcw()
4350 pfxdata.base_lss = basepriv->conf.ned->ID; in prepare_itcw()
4354 if (startpriv->uid.type == UA_BASE_PAV_ALIAS) in prepare_itcw()
4357 if (startpriv->uid.type == UA_HYPER_PAV_ALIAS) { in prepare_itcw()
4364 dedata->mask.perm = 0x1; in prepare_itcw()
4365 dedata->attributes.operation = basepriv->attrib.operation; in prepare_itcw()
4366 dedata->blk_size = blksize; in prepare_itcw()
4367 dedata->ga_extended |= 0x42; in prepare_itcw()
4368 lredata->operation.orientation = 0x0; in prepare_itcw()
4369 lredata->operation.operation = 0x0C; in prepare_itcw()
4370 lredata->auxiliary.check_bytes = 0x01; in prepare_itcw()
4374 dedata->mask.perm = 0x02; in prepare_itcw()
4375 dedata->attributes.operation = basepriv->attrib.operation; in prepare_itcw()
4376 dedata->blk_size = blksize; in prepare_itcw()
4378 dedata->ga_extended |= 0x42; in prepare_itcw()
4379 lredata->operation.orientation = 0x0; in prepare_itcw()
4380 lredata->operation.operation = 0x3F; in prepare_itcw()
4381 lredata->extended_operation = 0x23; in prepare_itcw()
4382 lredata->auxiliary.check_bytes = 0x2; in prepare_itcw()
4388 if (dedata->ga_extended & 0x08 && dedata->ga_extended & 0x02) in prepare_itcw()
4393 dedata->mask.perm = 0x1; in prepare_itcw()
4394 dedata->attributes.operation = DASD_BYPASS_CACHE; in prepare_itcw()
4395 dedata->ga_extended |= 0x42; in prepare_itcw()
4396 dedata->blk_size = blksize; in prepare_itcw()
4397 lredata->operation.orientation = 0x2; in prepare_itcw()
4398 lredata->operation.operation = 0x16; in prepare_itcw()
4399 lredata->auxiliary.check_bytes = 0x01; in prepare_itcw()
4411 dedata->attributes.mode = 0x3; /* ECKD */ in prepare_itcw()
4413 heads = basepriv->rdc_data.trk_per_cyl; in prepare_itcw()
4419 /* check for sequential prestage - enhance cylinder range */ in prepare_itcw()
4420 if (dedata->attributes.operation == DASD_SEQ_PRESTAGE || in prepare_itcw()
4421 dedata->attributes.operation == DASD_SEQ_ACCESS) { in prepare_itcw()
4423 if (endcyl + basepriv->attrib.nr_cyl < basepriv->real_cyl) in prepare_itcw()
4424 endcyl += basepriv->attrib.nr_cyl; in prepare_itcw()
4426 endcyl = (basepriv->real_cyl - 1); in prepare_itcw()
4429 set_ch_t(&dedata->beg_ext, begcyl, beghead); in prepare_itcw()
4430 set_ch_t(&dedata->end_ext, endcyl, endhead); in prepare_itcw()
4432 dedata->ep_format = 0x20; /* records per track is valid */ in prepare_itcw()
4433 dedata->ep_rec_per_track = blk_per_trk; in prepare_itcw()
4436 switch (basepriv->rdc_data.dev_type) { in prepare_itcw()
4440 sector = (49 + (rec_on_trk - 1) * (10 + d)) / 8; in prepare_itcw()
4444 sector = (39 + (rec_on_trk - 1) * (8 + d)) / 7; in prepare_itcw()
4450 lredata->auxiliary.length_valid = 0; in prepare_itcw()
4451 lredata->auxiliary.length_scope = 0; in prepare_itcw()
4452 lredata->sector = 0xff; in prepare_itcw()
4454 lredata->auxiliary.length_valid = 1; in prepare_itcw()
4455 lredata->auxiliary.length_scope = 1; in prepare_itcw()
4456 lredata->sector = sector; in prepare_itcw()
4458 lredata->auxiliary.imbedded_ccw_valid = 1; in prepare_itcw()
4459 lredata->length = tlf; in prepare_itcw()
4460 lredata->imbedded_ccw = cmd; in prepare_itcw()
4461 lredata->count = count; in prepare_itcw()
4462 set_ch_t(&lredata->seek_addr, begcyl, beghead); in prepare_itcw()
4463 lredata->search_arg.cyl = lredata->seek_addr.cyl; in prepare_itcw()
4464 lredata->search_arg.head = lredata->seek_addr.head; in prepare_itcw()
4465 lredata->search_arg.record = rec_on_trk; in prepare_itcw()
4474 struct dasd_block *block, in dasd_eckd_build_cp_tpm_track() argument
4505 basedev = block->base; in dasd_eckd_build_cp_tpm_track()
4513 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp_tpm_track()
4521 trkcount = last_trk - first_trk + 1; in dasd_eckd_build_cp_tpm_track()
4527 ctidaw += (last_trk - first_trk); in dasd_eckd_build_cp_tpm_track()
4538 tlf = last_offs - first_offs + 1; in dasd_eckd_build_cp_tpm_track()
4543 itcw = itcw_init(cqr->data, itcw_size, itcw_op, 0, ctidaw, 0); in dasd_eckd_build_cp_tpm_track()
4545 ret = -EINVAL; in dasd_eckd_build_cp_tpm_track()
4548 cqr->cpaddr = itcw_get_tcw(itcw); in dasd_eckd_build_cp_tpm_track()
4553 (last_rec - first_rec + 1) * blksize, in dasd_eckd_build_cp_tpm_track()
4554 tlf, blk_per_trk) == -EAGAIN) { in dasd_eckd_build_cp_tpm_track()
4558 ret = -EAGAIN; in dasd_eckd_build_cp_tpm_track()
4564 * We can let the block layer handle this by setting seg_boundary_mask in dasd_eckd_build_cp_tpm_track()
4580 count_to_trk_end = blk_per_trk - offs; in dasd_eckd_build_cp_tpm_track()
4581 count = min((last_rec - recid + 1), in dasd_eckd_build_cp_tpm_track()
4588 seg_len -= part_len; in dasd_eckd_build_cp_tpm_track()
4589 len_to_track_end -= part_len; in dasd_eckd_build_cp_tpm_track()
4599 ret = -EINVAL; in dasd_eckd_build_cp_tpm_track()
4611 ret = -EINVAL; in dasd_eckd_build_cp_tpm_track()
4616 last_tidaw->flags |= TIDAW_FLAGS_LAST; in dasd_eckd_build_cp_tpm_track()
4617 last_tidaw->flags &= ~TIDAW_FLAGS_INSERT_CBC; in dasd_eckd_build_cp_tpm_track()
4621 block->base->features & DASD_FEATURE_FAILFAST) in dasd_eckd_build_cp_tpm_track()
4622 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); in dasd_eckd_build_cp_tpm_track()
4623 cqr->cpmode = 1; in dasd_eckd_build_cp_tpm_track()
4624 cqr->startdev = startdev; in dasd_eckd_build_cp_tpm_track()
4625 cqr->memdev = startdev; in dasd_eckd_build_cp_tpm_track()
4626 cqr->block = block; in dasd_eckd_build_cp_tpm_track()
4627 cqr->expires = startdev->default_expires * HZ; /* default 5 minutes */ in dasd_eckd_build_cp_tpm_track()
4628 cqr->lpm = dasd_path_get_ppm(startdev); in dasd_eckd_build_cp_tpm_track()
4629 cqr->retries = startdev->default_retries; in dasd_eckd_build_cp_tpm_track()
4630 cqr->buildclk = get_tod_clock(); in dasd_eckd_build_cp_tpm_track()
4631 cqr->status = DASD_CQR_FILLED; in dasd_eckd_build_cp_tpm_track()
4635 set_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); in dasd_eckd_build_cp_tpm_track()
4636 set_bit(DASD_CQR_SUPPRESS_IT, &cqr->flags); in dasd_eckd_build_cp_tpm_track()
4646 struct dasd_block *block, in dasd_eckd_build_cp() argument
4662 basedev = block->base; in dasd_eckd_build_cp()
4663 private = basedev->private; in dasd_eckd_build_cp()
4666 blksize = block->bp_block; in dasd_eckd_build_cp()
4667 blk_per_trk = recs_per_track(&private->rdc_data, 0, blksize); in dasd_eckd_build_cp()
4669 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp()
4670 /* Calculate record id of first and last block. */ in dasd_eckd_build_cp()
4671 first_rec = first_trk = blk_rq_pos(req) >> block->s2b_shift; in dasd_eckd_build_cp()
4674 (blk_rq_pos(req) + blk_rq_sectors(req) - 1) >> block->s2b_shift; in dasd_eckd_build_cp()
4676 cdlspecial = (private->uses_cdl && first_rec < 2*blk_per_trk); in dasd_eckd_build_cp()
4678 fcx_multitrack = private->features.feature[40] & 0x20; in dasd_eckd_build_cp()
4681 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp()
4684 data_size += (last_trk - first_trk) * 4; in dasd_eckd_build_cp()
4687 cmdrtd = private->features.feature[9] & 0x20; in dasd_eckd_build_cp()
4688 cmdwtd = private->features.feature[12] & 0x40; in dasd_eckd_build_cp()
4689 use_prefix = private->features.feature[8] & 0x01; in dasd_eckd_build_cp()
4694 } else if ((data_size <= private->fcx_max_data) in dasd_eckd_build_cp()
4696 cqr = dasd_eckd_build_cp_tpm_track(startdev, block, req, in dasd_eckd_build_cp()
4701 if (IS_ERR(cqr) && (PTR_ERR(cqr) != -EAGAIN) && in dasd_eckd_build_cp()
4702 (PTR_ERR(cqr) != -ENOMEM)) in dasd_eckd_build_cp()
4707 cqr = dasd_eckd_build_cp_cmd_track(startdev, block, req, in dasd_eckd_build_cp()
4712 if (IS_ERR(cqr) && (PTR_ERR(cqr) != -EAGAIN) && in dasd_eckd_build_cp()
4713 (PTR_ERR(cqr) != -ENOMEM)) in dasd_eckd_build_cp()
4717 cqr = dasd_eckd_build_cp_cmd_single(startdev, block, req, in dasd_eckd_build_cp()
4726 struct dasd_block *block, in dasd_eckd_build_cp_raw() argument
4755 end_padding_sectors = (DASD_RAW_SECTORS_PER_TRACK - end_sector_offset) % in dasd_eckd_build_cp_raw()
4757 basedev = block->base; in dasd_eckd_build_cp_raw()
4763 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp_raw()
4767 last_trk = (blk_rq_pos(req) + blk_rq_sectors(req) - 1) / in dasd_eckd_build_cp_raw()
4769 trkcount = last_trk - first_trk + 1; in dasd_eckd_build_cp_raw()
4776 return ERR_PTR(-EINVAL); in dasd_eckd_build_cp_raw()
4788 base_priv = basedev->private; in dasd_eckd_build_cp_raw()
4789 use_prefix = base_priv->features.feature[8] & 0x01; in dasd_eckd_build_cp_raw()
4808 ccw = cqr->cpaddr; in dasd_eckd_build_cp_raw()
4809 data = cqr->data; in dasd_eckd_build_cp_raw()
4816 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_cp_raw()
4823 idaws = (dma64_t *)(cqr->data + size); in dasd_eckd_build_cp_raw()
4826 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_cp_raw()
4827 ccw->cmd_code = cmd; in dasd_eckd_build_cp_raw()
4829 ccw->count = 57326; in dasd_eckd_build_cp_raw()
4831 len_to_track_end = 65536 - start_padding_sectors * 512; in dasd_eckd_build_cp_raw()
4832 ccw->cda = virt_to_dma32(idaws); in dasd_eckd_build_cp_raw()
4833 ccw->flags |= CCW_FLAG_IDA; in dasd_eckd_build_cp_raw()
4834 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_build_cp_raw()
4845 ccw[-1].flags |= CCW_FLAG_CC; in dasd_eckd_build_cp_raw()
4846 ccw->cmd_code = cmd; in dasd_eckd_build_cp_raw()
4848 ccw->count = 57326; in dasd_eckd_build_cp_raw()
4851 ccw->cda = virt_to_dma32(idaws); in dasd_eckd_build_cp_raw()
4852 ccw->flags |= CCW_FLAG_IDA; in dasd_eckd_build_cp_raw()
4853 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_build_cp_raw()
4856 len_to_track_end -= seg_len; in dasd_eckd_build_cp_raw()
4862 block->base->features & DASD_FEATURE_FAILFAST) in dasd_eckd_build_cp_raw()
4863 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); in dasd_eckd_build_cp_raw()
4864 cqr->startdev = startdev; in dasd_eckd_build_cp_raw()
4865 cqr->memdev = startdev; in dasd_eckd_build_cp_raw()
4866 cqr->block = block; in dasd_eckd_build_cp_raw()
4867 cqr->expires = startdev->default_expires * HZ; in dasd_eckd_build_cp_raw()
4868 cqr->lpm = dasd_path_get_ppm(startdev); in dasd_eckd_build_cp_raw()
4869 cqr->retries = startdev->default_retries; in dasd_eckd_build_cp_raw()
4870 cqr->buildclk = get_tod_clock(); in dasd_eckd_build_cp_raw()
4871 cqr->status = DASD_CQR_FILLED; in dasd_eckd_build_cp_raw()
4891 private = cqr->block->base->private; in dasd_eckd_free_cp()
4892 blksize = cqr->block->bp_block; in dasd_eckd_free_cp()
4893 blk_per_trk = recs_per_track(&private->rdc_data, 0, blksize); in dasd_eckd_free_cp()
4894 recid = blk_rq_pos(req) >> cqr->block->s2b_shift; in dasd_eckd_free_cp()
4895 ccw = cqr->cpaddr; in dasd_eckd_free_cp()
4898 if (private->uses_cdl == 0 || recid > 2*blk_per_trk) in dasd_eckd_free_cp()
4904 if (private->uses_cdl && recid <= 2*blk_per_trk) in dasd_eckd_free_cp()
4907 if (ccw->flags & CCW_FLAG_IDA) in dasd_eckd_free_cp()
4908 cda = dma64_to_virt(*((dma64_t *)dma32_to_virt(ccw->cda))); in dasd_eckd_free_cp()
4910 cda = dma32_to_virt(ccw->cda); in dasd_eckd_free_cp()
4924 status = cqr->status == DASD_CQR_DONE; in dasd_eckd_free_cp()
4925 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_free_cp()
4933 * Either reset cqr->startdev as well (summary unit check handling)
4944 if (cqr->cpmode == 1) { in dasd_eckd_reset_ccw_to_base_io()
4945 tcw = cqr->cpaddr; in dasd_eckd_reset_ccw_to_base_io()
4947 dcw = (struct dcw *)&tccb->tca[0]; in dasd_eckd_reset_ccw_to_base_io()
4948 pfxdata = (struct PFX_eckd_data *)&dcw->cd[0]; in dasd_eckd_reset_ccw_to_base_io()
4949 pfxdata->validity.verify_base = 0; in dasd_eckd_reset_ccw_to_base_io()
4950 pfxdata->validity.hyper_pav = 0; in dasd_eckd_reset_ccw_to_base_io()
4952 ccw = cqr->cpaddr; in dasd_eckd_reset_ccw_to_base_io()
4953 pfxdata = cqr->data; in dasd_eckd_reset_ccw_to_base_io()
4954 if (ccw->cmd_code == DASD_ECKD_CCW_PFX) { in dasd_eckd_reset_ccw_to_base_io()
4955 pfxdata->validity.verify_base = 0; in dasd_eckd_reset_ccw_to_base_io()
4956 pfxdata->validity.hyper_pav = 0; in dasd_eckd_reset_ccw_to_base_io()
4964 struct dasd_block *block, in dasd_eckd_build_alias_cp() argument
4975 private = startdev->private; in dasd_eckd_build_alias_cp()
4976 if (private->count >= DASD_ECKD_CHANQ_MAX_SIZE) in dasd_eckd_build_alias_cp()
4977 return ERR_PTR(-EBUSY); in dasd_eckd_build_alias_cp()
4979 spin_lock_irqsave(get_ccwdev_lock(startdev->cdev), flags); in dasd_eckd_build_alias_cp()
4980 private->count++; in dasd_eckd_build_alias_cp()
4981 if ((base->features & DASD_FEATURE_USERAW)) in dasd_eckd_build_alias_cp()
4982 cqr = dasd_eckd_build_cp_raw(startdev, block, req); in dasd_eckd_build_alias_cp()
4984 cqr = dasd_eckd_build_cp(startdev, block, req); in dasd_eckd_build_alias_cp()
4986 private->count--; in dasd_eckd_build_alias_cp()
4987 spin_unlock_irqrestore(get_ccwdev_lock(startdev->cdev), flags); in dasd_eckd_build_alias_cp()
4997 spin_lock_irqsave(get_ccwdev_lock(cqr->memdev->cdev), flags); in dasd_eckd_free_alias_cp()
4998 private = cqr->memdev->private; in dasd_eckd_free_alias_cp()
4999 private->count--; in dasd_eckd_free_alias_cp()
5000 spin_unlock_irqrestore(get_ccwdev_lock(cqr->memdev->cdev), flags); in dasd_eckd_free_alias_cp()
5008 struct dasd_eckd_private *private = device->private; in dasd_eckd_fill_info()
5010 info->label_block = 2; in dasd_eckd_fill_info()
5011 info->FBA_layout = private->uses_cdl ? 0 : 1; in dasd_eckd_fill_info()
5012 info->format = private->uses_cdl ? DASD_FORMAT_CDL : DASD_FORMAT_LDL; in dasd_eckd_fill_info()
5013 info->characteristics_size = sizeof(private->rdc_data); in dasd_eckd_fill_info()
5014 memcpy(info->characteristics, &private->rdc_data, in dasd_eckd_fill_info()
5015 sizeof(private->rdc_data)); in dasd_eckd_fill_info()
5016 info->confdata_size = min_t(unsigned long, private->conf.len, in dasd_eckd_fill_info()
5017 sizeof(info->configuration_data)); in dasd_eckd_fill_info()
5018 memcpy(info->configuration_data, private->conf.data, in dasd_eckd_fill_info()
5019 info->confdata_size); in dasd_eckd_fill_info()
5041 return -EACCES; in dasd_eckd_release()
5048 cqr = &dasd_reserve_req->cqr; in dasd_eckd_release()
5050 memset(&dasd_reserve_req->ccw, 0, in dasd_eckd_release()
5051 sizeof(dasd_reserve_req->ccw)); in dasd_eckd_release()
5052 cqr->cpaddr = &dasd_reserve_req->ccw; in dasd_eckd_release()
5053 cqr->data = &dasd_reserve_req->data; in dasd_eckd_release()
5054 cqr->magic = DASD_ECKD_MAGIC; in dasd_eckd_release()
5056 ccw = cqr->cpaddr; in dasd_eckd_release()
5057 ccw->cmd_code = DASD_ECKD_CCW_RELEASE; in dasd_eckd_release()
5058 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_release()
5059 ccw->count = 32; in dasd_eckd_release()
5060 ccw->cda = virt_to_dma32(cqr->data); in dasd_eckd_release()
5061 cqr->startdev = device; in dasd_eckd_release()
5062 cqr->memdev = device; in dasd_eckd_release()
5063 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_eckd_release()
5064 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); in dasd_eckd_release()
5065 cqr->retries = 2; /* set retry counter to enable basic ERP */ in dasd_eckd_release()
5066 cqr->expires = 2 * HZ; in dasd_eckd_release()
5067 cqr->buildclk = get_tod_clock(); in dasd_eckd_release()
5068 cqr->status = DASD_CQR_FILLED; in dasd_eckd_release()
5072 clear_bit(DASD_FLAG_IS_RESERVED, &device->flags); in dasd_eckd_release()
5077 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_release()
5096 return -EACCES; in dasd_eckd_reserve()
5103 cqr = &dasd_reserve_req->cqr; in dasd_eckd_reserve()
5105 memset(&dasd_reserve_req->ccw, 0, in dasd_eckd_reserve()
5106 sizeof(dasd_reserve_req->ccw)); in dasd_eckd_reserve()
5107 cqr->cpaddr = &dasd_reserve_req->ccw; in dasd_eckd_reserve()
5108 cqr->data = &dasd_reserve_req->data; in dasd_eckd_reserve()
5109 cqr->magic = DASD_ECKD_MAGIC; in dasd_eckd_reserve()
5111 ccw = cqr->cpaddr; in dasd_eckd_reserve()
5112 ccw->cmd_code = DASD_ECKD_CCW_RESERVE; in dasd_eckd_reserve()
5113 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_reserve()
5114 ccw->count = 32; in dasd_eckd_reserve()
5115 ccw->cda = virt_to_dma32(cqr->data); in dasd_eckd_reserve()
5116 cqr->startdev = device; in dasd_eckd_reserve()
5117 cqr->memdev = device; in dasd_eckd_reserve()
5118 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_eckd_reserve()
5119 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); in dasd_eckd_reserve()
5120 cqr->retries = 2; /* set retry counter to enable basic ERP */ in dasd_eckd_reserve()
5121 cqr->expires = 2 * HZ; in dasd_eckd_reserve()
5122 cqr->buildclk = get_tod_clock(); in dasd_eckd_reserve()
5123 cqr->status = DASD_CQR_FILLED; in dasd_eckd_reserve()
5127 set_bit(DASD_FLAG_IS_RESERVED, &device->flags); in dasd_eckd_reserve()
5132 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_reserve()
5137 * Steal lock ioctl - unconditional reserve device.
5150 return -EACCES; in dasd_eckd_steal_lock()
5157 cqr = &dasd_reserve_req->cqr; in dasd_eckd_steal_lock()
5159 memset(&dasd_reserve_req->ccw, 0, in dasd_eckd_steal_lock()
5160 sizeof(dasd_reserve_req->ccw)); in dasd_eckd_steal_lock()
5161 cqr->cpaddr = &dasd_reserve_req->ccw; in dasd_eckd_steal_lock()
5162 cqr->data = &dasd_reserve_req->data; in dasd_eckd_steal_lock()
5163 cqr->magic = DASD_ECKD_MAGIC; in dasd_eckd_steal_lock()
5165 ccw = cqr->cpaddr; in dasd_eckd_steal_lock()
5166 ccw->cmd_code = DASD_ECKD_CCW_SLCK; in dasd_eckd_steal_lock()
5167 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_steal_lock()
5168 ccw->count = 32; in dasd_eckd_steal_lock()
5169 ccw->cda = virt_to_dma32(cqr->data); in dasd_eckd_steal_lock()
5170 cqr->startdev = device; in dasd_eckd_steal_lock()
5171 cqr->memdev = device; in dasd_eckd_steal_lock()
5172 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_eckd_steal_lock()
5173 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); in dasd_eckd_steal_lock()
5174 cqr->retries = 2; /* set retry counter to enable basic ERP */ in dasd_eckd_steal_lock()
5175 cqr->expires = 2 * HZ; in dasd_eckd_steal_lock()
5176 cqr->buildclk = get_tod_clock(); in dasd_eckd_steal_lock()
5177 cqr->status = DASD_CQR_FILLED; in dasd_eckd_steal_lock()
5181 set_bit(DASD_FLAG_IS_RESERVED, &device->flags); in dasd_eckd_steal_lock()
5186 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_steal_lock()
5191 * SNID - Sense Path Group ID
5206 return -EACCES; in dasd_eckd_snid()
5209 return -EFAULT; in dasd_eckd_snid()
5218 cqr = &dasd_reserve_req->cqr; in dasd_eckd_snid()
5220 memset(&dasd_reserve_req->ccw, 0, in dasd_eckd_snid()
5221 sizeof(dasd_reserve_req->ccw)); in dasd_eckd_snid()
5222 cqr->cpaddr = &dasd_reserve_req->ccw; in dasd_eckd_snid()
5223 cqr->data = &dasd_reserve_req->data; in dasd_eckd_snid()
5224 cqr->magic = DASD_ECKD_MAGIC; in dasd_eckd_snid()
5226 ccw = cqr->cpaddr; in dasd_eckd_snid()
5227 ccw->cmd_code = DASD_ECKD_CCW_SNID; in dasd_eckd_snid()
5228 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_snid()
5229 ccw->count = 12; in dasd_eckd_snid()
5230 ccw->cda = virt_to_dma32(cqr->data); in dasd_eckd_snid()
5231 cqr->startdev = device; in dasd_eckd_snid()
5232 cqr->memdev = device; in dasd_eckd_snid()
5233 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_eckd_snid()
5234 set_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags); in dasd_eckd_snid()
5235 set_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags); in dasd_eckd_snid()
5236 cqr->retries = 5; in dasd_eckd_snid()
5237 cqr->expires = 10 * HZ; in dasd_eckd_snid()
5238 cqr->buildclk = get_tod_clock(); in dasd_eckd_snid()
5239 cqr->status = DASD_CQR_FILLED; in dasd_eckd_snid()
5240 cqr->lpm = usrparm.path_mask; in dasd_eckd_snid()
5244 if (!rc && usrparm.path_mask && (cqr->lpm != usrparm.path_mask)) in dasd_eckd_snid()
5245 rc = -EIO; in dasd_eckd_snid()
5247 usrparm.data = *((struct dasd_snid_data *)cqr->data); in dasd_eckd_snid()
5249 rc = -EFAULT; in dasd_eckd_snid()
5255 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_snid()
5280 cqr->startdev = device; in dasd_eckd_performance()
5281 cqr->memdev = device; in dasd_eckd_performance()
5282 cqr->retries = 0; in dasd_eckd_performance()
5283 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_eckd_performance()
5284 cqr->expires = 10 * HZ; in dasd_eckd_performance()
5287 prssdp = (struct dasd_psf_prssd_data *) cqr->data; in dasd_eckd_performance()
5289 prssdp->order = PSF_ORDER_PRSSD; in dasd_eckd_performance()
5290 prssdp->suborder = 0x01; /* Performance Statistics */ in dasd_eckd_performance()
5291 prssdp->varies[1] = 0x01; /* Perf Statistics for the Subsystem */ in dasd_eckd_performance()
5293 ccw = cqr->cpaddr; in dasd_eckd_performance()
5294 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_performance()
5295 ccw->count = sizeof(struct dasd_psf_prssd_data); in dasd_eckd_performance()
5296 ccw->flags |= CCW_FLAG_CC; in dasd_eckd_performance()
5297 ccw->cda = virt_to_dma32(prssdp); in dasd_eckd_performance()
5299 /* Read Subsystem Data - Performance Statistics */ in dasd_eckd_performance()
5304 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in dasd_eckd_performance()
5305 ccw->count = sizeof(struct dasd_rssd_perf_stats_t); in dasd_eckd_performance()
5306 ccw->cda = virt_to_dma32(stats); in dasd_eckd_performance()
5308 cqr->buildclk = get_tod_clock(); in dasd_eckd_performance()
5309 cqr->status = DASD_CQR_FILLED; in dasd_eckd_performance()
5312 prssdp = (struct dasd_psf_prssd_data *) cqr->data; in dasd_eckd_performance()
5316 rc = -EFAULT; in dasd_eckd_performance()
5318 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_performance()
5329 struct dasd_eckd_private *private = device->private; in dasd_eckd_get_attrib()
5330 struct attrib_data_t attrib = private->attrib; in dasd_eckd_get_attrib()
5334 return -EACCES; in dasd_eckd_get_attrib()
5336 return -EINVAL; in dasd_eckd_get_attrib()
5341 rc = -EFAULT; in dasd_eckd_get_attrib()
5353 struct dasd_eckd_private *private = device->private; in dasd_eckd_set_attrib()
5357 return -EACCES; in dasd_eckd_set_attrib()
5359 return -EINVAL; in dasd_eckd_set_attrib()
5362 return -EFAULT; in dasd_eckd_set_attrib()
5363 private->attrib = attrib; in dasd_eckd_set_attrib()
5365 dev_info(&device->cdev->dev, in dasd_eckd_set_attrib()
5367 private->attrib.operation, private->attrib.nr_cyl); in dasd_eckd_set_attrib()
5385 return -EACCES; in dasd_symm_io()
5389 rc = -EFAULT; in dasd_symm_io()
5394 rc = -EINVAL; in dasd_symm_io()
5407 rc = -EINVAL; in dasd_symm_io()
5414 rc = -ENOMEM; in dasd_symm_io()
5419 rc = -EFAULT; in dasd_symm_io()
5436 cqr->startdev = device; in dasd_symm_io()
5437 cqr->memdev = device; in dasd_symm_io()
5438 cqr->retries = 3; in dasd_symm_io()
5439 cqr->expires = 10 * HZ; in dasd_symm_io()
5440 cqr->buildclk = get_tod_clock(); in dasd_symm_io()
5441 cqr->status = DASD_CQR_FILLED; in dasd_symm_io()
5444 ccw = cqr->cpaddr; in dasd_symm_io()
5447 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_symm_io()
5448 ccw->count = usrparm.psf_data_len; in dasd_symm_io()
5449 ccw->flags |= CCW_FLAG_CC; in dasd_symm_io()
5450 ccw->cda = virt_to_dma32(psf_data); in dasd_symm_io()
5455 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in dasd_symm_io()
5456 ccw->count = usrparm.rssd_result_len; in dasd_symm_io()
5457 ccw->flags = CCW_FLAG_SLI ; in dasd_symm_io()
5458 ccw->cda = virt_to_dma32(rssd_result); in dasd_symm_io()
5464 rc = -EFAULT; in dasd_symm_io()
5471 dasd_sfree_request(cqr, cqr->memdev); in dasd_symm_io()
5483 dasd_eckd_ioctl(struct dasd_block *block, unsigned int cmd, void __user *argp) in dasd_eckd_ioctl() argument
5485 struct dasd_device *device = block->base; in dasd_eckd_ioctl()
5505 return -ENOTTY; in dasd_eckd_ioctl()
5526 if (from->flags & CCW_FLAG_IDA) in dasd_eckd_dump_ccw_range()
5527 datap = dma64_to_virt(*((dma64_t *)dma32_to_virt(from->cda))); in dasd_eckd_dump_ccw_range()
5529 datap = dma32_to_virt(from->cda); in dasd_eckd_dump_ccw_range()
5532 for (count = 0; count < from->count && count < 128; count++) { in dasd_eckd_dump_ccw_range()
5545 dev_err(&device->cdev->dev, "%s", page); in dasd_eckd_dump_ccw_range()
5556 stat = (u64 *) &irb->scsw; in dasd_eckd_dump_sense_dbf()
5581 dev = &device->cdev->dev; in dasd_eckd_dump_sense_ccw()
5593 req, scsw_cc(&irb->scsw), scsw_fctl(&irb->scsw), in dasd_eckd_dump_sense_ccw()
5594 scsw_actl(&irb->scsw), scsw_stctl(&irb->scsw), in dasd_eckd_dump_sense_ccw()
5595 scsw_dstat(&irb->scsw), scsw_cstat(&irb->scsw), in dasd_eckd_dump_sense_ccw()
5596 req ? req->intrc : 0); in dasd_eckd_dump_sense_ccw()
5598 dma32_to_virt(irb->scsw.cmd.cpa)); in dasd_eckd_dump_sense_ccw()
5599 if (irb->esw.esw0.erw.cons) { in dasd_eckd_dump_sense_ccw()
5601 len += sprintf(page + len, "Sense(hex) %2d-%2d:", in dasd_eckd_dump_sense_ccw()
5606 irb->ecw[8 * sl + sct]); in dasd_eckd_dump_sense_ccw()
5611 if (irb->ecw[27] & DASD_SENSE_BIT_0) { in dasd_eckd_dump_sense_ccw()
5615 irb->ecw[7] >> 4, irb->ecw[7] & 0x0f, in dasd_eckd_dump_sense_ccw()
5616 irb->ecw[1] & 0x10 ? "" : "no"); in dasd_eckd_dump_sense_ccw()
5621 irb->ecw[6] & 0x0f, irb->ecw[22] >> 4); in dasd_eckd_dump_sense_ccw()
5624 sprintf(page + len, "SORRY - NO VALID SENSE AVAILABLE\n"); in dasd_eckd_dump_sense_ccw()
5632 first = req->cpaddr; in dasd_eckd_dump_sense_ccw()
5633 for (last = first; last->flags & (CCW_FLAG_CC | CCW_FLAG_DC); last++); in dasd_eckd_dump_sense_ccw()
5639 /* scsw->cda is either valid or zero */ in dasd_eckd_dump_sense_ccw()
5641 fail = dma32_to_virt(irb->scsw.cmd.cpa); /* failing CCW */ in dasd_eckd_dump_sense_ccw()
5642 if (from < fail - 2) { in dasd_eckd_dump_sense_ccw()
5643 from = fail - 2; /* there is a gap - print header */ in dasd_eckd_dump_sense_ccw()
5652 if (from < last - 1) { in dasd_eckd_dump_sense_ccw()
5653 from = last - 1; /* there is a gap - print header */ in dasd_eckd_dump_sense_ccw()
5684 req, scsw_cc(&irb->scsw), scsw_fctl(&irb->scsw), in dasd_eckd_dump_sense_tcw()
5685 scsw_actl(&irb->scsw), scsw_stctl(&irb->scsw), in dasd_eckd_dump_sense_tcw()
5686 scsw_dstat(&irb->scsw), scsw_cstat(&irb->scsw), in dasd_eckd_dump_sense_tcw()
5687 irb->scsw.tm.fcxs, in dasd_eckd_dump_sense_tcw()
5688 (irb->scsw.tm.ifob << 7) | irb->scsw.tm.sesq, in dasd_eckd_dump_sense_tcw()
5689 req ? req->intrc : 0); in dasd_eckd_dump_sense_tcw()
5691 dma32_to_virt(irb->scsw.tm.tcw)); in dasd_eckd_dump_sense_tcw()
5695 if (irb->scsw.tm.tcw && (irb->scsw.tm.fcxs & 0x01)) in dasd_eckd_dump_sense_tcw()
5696 tsb = tcw_get_tsb(dma32_to_virt(irb->scsw.tm.tcw)); in dasd_eckd_dump_sense_tcw()
5699 len += sprintf(page + len, "tsb->length %d\n", tsb->length); in dasd_eckd_dump_sense_tcw()
5700 len += sprintf(page + len, "tsb->flags %x\n", tsb->flags); in dasd_eckd_dump_sense_tcw()
5701 len += sprintf(page + len, "tsb->dcw_offset %d\n", tsb->dcw_offset); in dasd_eckd_dump_sense_tcw()
5702 len += sprintf(page + len, "tsb->count %d\n", tsb->count); in dasd_eckd_dump_sense_tcw()
5703 residual = tsb->count - 28; in dasd_eckd_dump_sense_tcw()
5706 switch (tsb->flags & 0x07) { in dasd_eckd_dump_sense_tcw()
5708 len += sprintf(page + len, "tsb->tsa.iostat.dev_time %d\n", in dasd_eckd_dump_sense_tcw()
5709 tsb->tsa.iostat.dev_time); in dasd_eckd_dump_sense_tcw()
5710 len += sprintf(page + len, "tsb->tsa.iostat.def_time %d\n", in dasd_eckd_dump_sense_tcw()
5711 tsb->tsa.iostat.def_time); in dasd_eckd_dump_sense_tcw()
5712 len += sprintf(page + len, "tsb->tsa.iostat.queue_time %d\n", in dasd_eckd_dump_sense_tcw()
5713 tsb->tsa.iostat.queue_time); in dasd_eckd_dump_sense_tcw()
5714 len += sprintf(page + len, "tsb->tsa.iostat.dev_busy_time %d\n", in dasd_eckd_dump_sense_tcw()
5715 tsb->tsa.iostat.dev_busy_time); in dasd_eckd_dump_sense_tcw()
5716 len += sprintf(page + len, "tsb->tsa.iostat.dev_act_time %d\n", in dasd_eckd_dump_sense_tcw()
5717 tsb->tsa.iostat.dev_act_time); in dasd_eckd_dump_sense_tcw()
5718 sense = tsb->tsa.iostat.sense; in dasd_eckd_dump_sense_tcw()
5721 len += sprintf(page + len, "tsb->tsa.ddpc.rc %d\n", in dasd_eckd_dump_sense_tcw()
5722 tsb->tsa.ddpc.rc); in dasd_eckd_dump_sense_tcw()
5725 "tsb->tsa.ddpc.rcq %2d-%2d: ", in dasd_eckd_dump_sense_tcw()
5727 rcq = tsb->tsa.ddpc.rcq; in dasd_eckd_dump_sense_tcw()
5734 sense = tsb->tsa.ddpc.sense; in dasd_eckd_dump_sense_tcw()
5738 "tsb->tsa.intrg.: not supported yet\n"); in dasd_eckd_dump_sense_tcw()
5745 "Sense(hex) %2d-%2d:", in dasd_eckd_dump_sense_tcw()
5767 sprintf(page + len, "SORRY - NO VALID SENSE AVAILABLE\n"); in dasd_eckd_dump_sense_tcw()
5770 sprintf(page + len, "SORRY - NO TSB DATA AVAILABLE\n"); in dasd_eckd_dump_sense_tcw()
5772 dev_err(&device->cdev->dev, "%s", page); in dasd_eckd_dump_sense_tcw()
5788 test_bit(DASD_CQR_SUPPRESS_IT, &req->flags)) in dasd_eckd_dump_sense()
5792 test_bit(DASD_CQR_SUPPRESS_CR, &req->flags)) in dasd_eckd_dump_sense()
5796 test_bit(DASD_CQR_SUPPRESS_NRF, &req->flags)) in dasd_eckd_dump_sense()
5799 if (scsw_cstat(&irb->scsw) == 0x40 && in dasd_eckd_dump_sense()
5800 test_bit(DASD_CQR_SUPPRESS_IL, &req->flags)) in dasd_eckd_dump_sense()
5803 if (scsw_is_tm(&irb->scsw)) in dasd_eckd_dump_sense()
5811 struct dasd_eckd_private *private = device->private; in dasd_eckd_reload_device()
5823 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_reload_device()
5824 old_base = private->uid.base_unit_addr; in dasd_eckd_reload_device()
5825 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_eckd_reload_device()
5846 dasd_eckd_get_uid_string(&private->conf, print_uid); in dasd_eckd_reload_device()
5847 dev_info(&device->cdev->dev, in dasd_eckd_reload_device()
5854 return -1; in dasd_eckd_reload_device()
5872 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_read_message_buffer()
5877 cqr->lpm = lpum; in dasd_eckd_read_message_buffer()
5879 cqr->startdev = device; in dasd_eckd_read_message_buffer()
5880 cqr->memdev = device; in dasd_eckd_read_message_buffer()
5881 cqr->block = NULL; in dasd_eckd_read_message_buffer()
5882 cqr->expires = 10 * HZ; in dasd_eckd_read_message_buffer()
5883 set_bit(DASD_CQR_VERIFY_PATH, &cqr->flags); in dasd_eckd_read_message_buffer()
5887 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_eckd_read_message_buffer()
5888 cqr->retries = 256; in dasd_eckd_read_message_buffer()
5891 prssdp = (struct dasd_psf_prssd_data *) cqr->data; in dasd_eckd_read_message_buffer()
5893 prssdp->order = PSF_ORDER_PRSSD; in dasd_eckd_read_message_buffer()
5894 prssdp->suborder = 0x03; /* Message Buffer */ in dasd_eckd_read_message_buffer()
5897 ccw = cqr->cpaddr; in dasd_eckd_read_message_buffer()
5898 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_read_message_buffer()
5899 ccw->count = sizeof(struct dasd_psf_prssd_data); in dasd_eckd_read_message_buffer()
5900 ccw->flags |= CCW_FLAG_CC; in dasd_eckd_read_message_buffer()
5901 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_read_message_buffer()
5902 ccw->cda = virt_to_dma32(prssdp); in dasd_eckd_read_message_buffer()
5904 /* Read Subsystem Data - message buffer */ in dasd_eckd_read_message_buffer()
5909 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in dasd_eckd_read_message_buffer()
5910 ccw->count = sizeof(struct dasd_rssd_messages); in dasd_eckd_read_message_buffer()
5911 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_read_message_buffer()
5912 ccw->cda = virt_to_dma32(message_buf); in dasd_eckd_read_message_buffer()
5914 cqr->buildclk = get_tod_clock(); in dasd_eckd_read_message_buffer()
5915 cqr->status = DASD_CQR_FILLED; in dasd_eckd_read_message_buffer()
5918 prssdp = (struct dasd_psf_prssd_data *) cqr->data; in dasd_eckd_read_message_buffer()
5923 } else if (cqr->lpm) { in dasd_eckd_read_message_buffer()
5929 cqr->lpm = 0; in dasd_eckd_read_message_buffer()
5932 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_read_message_buffer()
5935 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_read_message_buffer()
5942 struct dasd_eckd_private *private = device->private; in dasd_eckd_query_host_access()
5950 if (!device->block && private->lcu->pav == HYPER_PAV) in dasd_eckd_query_host_access()
5951 return -EOPNOTSUPP; in dasd_eckd_query_host_access()
5954 if (!(private->features.feature[14] & 0x80)) in dasd_eckd_query_host_access()
5955 return -EOPNOTSUPP; in dasd_eckd_query_host_access()
5961 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_query_host_access()
5968 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_query_host_access()
5970 return -ENOMEM; in dasd_eckd_query_host_access()
5972 cqr->startdev = device; in dasd_eckd_query_host_access()
5973 cqr->memdev = device; in dasd_eckd_query_host_access()
5974 cqr->block = NULL; in dasd_eckd_query_host_access()
5975 cqr->retries = 256; in dasd_eckd_query_host_access()
5976 cqr->expires = 10 * HZ; in dasd_eckd_query_host_access()
5979 prssdp = (struct dasd_psf_prssd_data *) cqr->data; in dasd_eckd_query_host_access()
5981 prssdp->order = PSF_ORDER_PRSSD; in dasd_eckd_query_host_access()
5982 prssdp->suborder = PSF_SUBORDER_QHA; /* query host access */ in dasd_eckd_query_host_access()
5984 prssdp->lss = private->conf.ned->ID; in dasd_eckd_query_host_access()
5985 prssdp->volume = private->conf.ned->unit_addr; in dasd_eckd_query_host_access()
5988 ccw = cqr->cpaddr; in dasd_eckd_query_host_access()
5989 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_query_host_access()
5990 ccw->count = sizeof(struct dasd_psf_prssd_data); in dasd_eckd_query_host_access()
5991 ccw->flags |= CCW_FLAG_CC; in dasd_eckd_query_host_access()
5992 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_query_host_access()
5993 ccw->cda = virt_to_dma32(prssdp); in dasd_eckd_query_host_access()
5995 /* Read Subsystem Data - query host access */ in dasd_eckd_query_host_access()
5997 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in dasd_eckd_query_host_access()
5998 ccw->count = sizeof(struct dasd_psf_query_host_access); in dasd_eckd_query_host_access()
5999 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_query_host_access()
6000 ccw->cda = virt_to_dma32(host_access); in dasd_eckd_query_host_access()
6002 cqr->buildclk = get_tod_clock(); in dasd_eckd_query_host_access()
6003 cqr->status = DASD_CQR_FILLED; in dasd_eckd_query_host_access()
6005 __set_bit(DASD_CQR_SUPPRESS_CR, &cqr->flags); in dasd_eckd_query_host_access()
6010 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_query_host_access()
6013 rc = -EOPNOTSUPP; in dasd_eckd_query_host_access()
6016 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_query_host_access()
6033 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_host_access_count()
6035 return -ENOMEM; in dasd_eckd_host_access_count()
6044 access->host_access_information; in dasd_eckd_host_access_count()
6045 for (i = 0; i < info->entry_count; i++) { in dasd_eckd_host_access_count()
6047 (info->entry + i * info->entry_size); in dasd_eckd_host_access_count()
6048 if (entry->status_flags & DASD_ECKD_PG_GROUPED) in dasd_eckd_host_access_count()
6069 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_hosts_print()
6071 return -ENOMEM; in dasd_hosts_print()
6080 access->host_access_information; in dasd_hosts_print()
6081 for (i = 0; i < info->entry_count; i++) { in dasd_hosts_print()
6083 (info->entry + i * info->entry_size); in dasd_hosts_print()
6085 seq_printf(m, "pgid %*phN\n", 11, entry->pgid); in dasd_hosts_print()
6087 seq_printf(m, "status_flags %02x\n", entry->status_flags); in dasd_hosts_print()
6089 memcpy(&sysplex, &entry->sysplex_name, sizeof(sysplex) - 1); in dasd_hosts_print()
6093 seq_printf(m, "supported_cylinder %d\n", entry->cylinder); in dasd_hosts_print()
6096 entry->timestamp); in dasd_hosts_print()
6110 if (copy->entry[i].configured && in copy_relation_find_device()
6111 strncmp(copy->entry[i].busid, busid, DASD_BUS_ID_SIZE) == 0) in copy_relation_find_device()
6112 return copy->entry[i].device; in copy_relation_find_device()
6126 if (copy->entry[i].configured && in copy_pair_set_active()
6127 strncmp(copy->entry[i].busid, new_busid, in copy_pair_set_active()
6129 copy->active = &copy->entry[i]; in copy_pair_set_active()
6130 copy->entry[i].primary = true; in copy_pair_set_active()
6131 } else if (copy->entry[i].configured && in copy_pair_set_active()
6132 strncmp(copy->entry[i].busid, old_busid, in copy_pair_set_active()
6134 copy->entry[i].primary = false; in copy_pair_set_active()
6144 * IO is paused on the block queue before swap and may be resumed afterwards.
6151 struct dasd_block *block; in dasd_eckd_copy_pair_swap() local
6154 copy = device->copy; in dasd_eckd_copy_pair_swap()
6157 primary = copy->active->device; in dasd_eckd_copy_pair_swap()
6161 if (strncmp(dev_name(&primary->cdev->dev), prim_busid, DASD_BUS_ID_SIZE) != 0) in dasd_eckd_copy_pair_swap()
6176 /* swap DASD internal device <> block assignment */ in dasd_eckd_copy_pair_swap()
6177 block = primary->block; in dasd_eckd_copy_pair_swap()
6178 primary->block = NULL; in dasd_eckd_copy_pair_swap()
6179 secondary->block = block; in dasd_eckd_copy_pair_swap()
6180 block->base = secondary; in dasd_eckd_copy_pair_swap()
6185 gdp = block->gdp; in dasd_eckd_copy_pair_swap()
6188 /* re-enable device */ in dasd_eckd_copy_pair_swap()
6197 * Perform Subsystem Function - Peer-to-Peer Remote Copy Extended Query
6212 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_query_pprc_status()
6216 cqr->startdev = device; in dasd_eckd_query_pprc_status()
6217 cqr->memdev = device; in dasd_eckd_query_pprc_status()
6218 cqr->block = NULL; in dasd_eckd_query_pprc_status()
6219 cqr->retries = 256; in dasd_eckd_query_pprc_status()
6220 cqr->expires = 10 * HZ; in dasd_eckd_query_pprc_status()
6223 prssdp = (struct dasd_psf_prssd_data *)cqr->data; in dasd_eckd_query_pprc_status()
6225 prssdp->order = PSF_ORDER_PRSSD; in dasd_eckd_query_pprc_status()
6226 prssdp->suborder = PSF_SUBORDER_PPRCEQ; in dasd_eckd_query_pprc_status()
6227 prssdp->varies[0] = PPRCEQ_SCOPE_4; in dasd_eckd_query_pprc_status()
6230 ccw = cqr->cpaddr; in dasd_eckd_query_pprc_status()
6231 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_query_pprc_status()
6232 ccw->count = sizeof(struct dasd_psf_prssd_data); in dasd_eckd_query_pprc_status()
6233 ccw->flags |= CCW_FLAG_CC; in dasd_eckd_query_pprc_status()
6234 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_query_pprc_status()
6235 ccw->cda = virt_to_dma32(prssdp); in dasd_eckd_query_pprc_status()
6237 /* Read Subsystem Data - query host access */ in dasd_eckd_query_pprc_status()
6239 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in dasd_eckd_query_pprc_status()
6240 ccw->count = sizeof(*pprc_data); in dasd_eckd_query_pprc_status()
6241 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_query_pprc_status()
6242 ccw->cda = virt_to_dma32(pprc_data); in dasd_eckd_query_pprc_status()
6244 cqr->buildclk = get_tod_clock(); in dasd_eckd_query_pprc_status()
6245 cqr->status = DASD_CQR_FILLED; in dasd_eckd_query_pprc_status()
6251 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_query_pprc_status()
6254 rc = -EOPNOTSUPP; in dasd_eckd_query_pprc_status()
6257 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_query_pprc_status()
6262 * ECKD NOP - no operation
6272 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_eckd_nop()
6276 cqr->startdev = device; in dasd_eckd_nop()
6277 cqr->memdev = device; in dasd_eckd_nop()
6278 cqr->block = NULL; in dasd_eckd_nop()
6279 cqr->retries = 1; in dasd_eckd_nop()
6280 cqr->expires = 10 * HZ; in dasd_eckd_nop()
6282 ccw = cqr->cpaddr; in dasd_eckd_nop()
6283 ccw->cmd_code = DASD_ECKD_CCW_NOP; in dasd_eckd_nop()
6284 ccw->flags |= CCW_FLAG_SLI; in dasd_eckd_nop()
6286 cqr->buildclk = get_tod_clock(); in dasd_eckd_nop()
6287 cqr->status = DASD_CQR_FILLED; in dasd_eckd_nop()
6291 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, in dasd_eckd_nop()
6293 rc = -EOPNOTSUPP; in dasd_eckd_nop()
6295 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_nop()
6305 * Perform Subsystem Function - CUIR response
6323 "Could not allocate PSF-CUIR request"); in dasd_eckd_psf_cuir_response()
6327 psf_cuir = (struct dasd_psf_cuir_response *)cqr->data; in dasd_eckd_psf_cuir_response()
6328 psf_cuir->order = PSF_ORDER_CUIR_RESPONSE; in dasd_eckd_psf_cuir_response()
6329 psf_cuir->cc = response; in dasd_eckd_psf_cuir_response()
6330 psf_cuir->chpid = device->path[pos].chpid; in dasd_eckd_psf_cuir_response()
6331 psf_cuir->message_id = message_id; in dasd_eckd_psf_cuir_response()
6332 psf_cuir->cssid = device->path[pos].cssid; in dasd_eckd_psf_cuir_response()
6333 psf_cuir->ssid = device->path[pos].ssid; in dasd_eckd_psf_cuir_response()
6334 ccw = cqr->cpaddr; in dasd_eckd_psf_cuir_response()
6335 ccw->cmd_code = DASD_ECKD_CCW_PSF; in dasd_eckd_psf_cuir_response()
6336 ccw->cda = virt_to_dma32(psf_cuir); in dasd_eckd_psf_cuir_response()
6337 ccw->flags = CCW_FLAG_SLI; in dasd_eckd_psf_cuir_response()
6338 ccw->count = sizeof(struct dasd_psf_cuir_response); in dasd_eckd_psf_cuir_response()
6340 cqr->startdev = device; in dasd_eckd_psf_cuir_response()
6341 cqr->memdev = device; in dasd_eckd_psf_cuir_response()
6342 cqr->block = NULL; in dasd_eckd_psf_cuir_response()
6343 cqr->retries = 256; in dasd_eckd_psf_cuir_response()
6344 cqr->expires = 10*HZ; in dasd_eckd_psf_cuir_response()
6345 cqr->buildclk = get_tod_clock(); in dasd_eckd_psf_cuir_response()
6346 cqr->status = DASD_CQR_FILLED; in dasd_eckd_psf_cuir_response()
6347 set_bit(DASD_CQR_VERIFY_PATH, &cqr->flags); in dasd_eckd_psf_cuir_response()
6351 dasd_sfree_request(cqr, cqr->memdev); in dasd_eckd_psf_cuir_response()
6367 if (cuir->record_selector == 0) in dasd_eckd_get_ref_conf()
6370 conf_data = device->path[pos].conf_data; in dasd_eckd_get_ref_conf()
6371 if (conf_data->gneq.record_selector == in dasd_eckd_get_ref_conf()
6372 cuir->record_selector) in dasd_eckd_get_ref_conf()
6376 return device->path[pathmask_to_pos(lpum)].conf_data; in dasd_eckd_get_ref_conf()
6401 if (!cuir->ned_map || in dasd_eckd_cuir_scope()
6402 !(cuir->neq_map[0] | cuir->neq_map[1] | cuir->neq_map[2])) in dasd_eckd_cuir_scope()
6408 pos = 8 - ffs(cuir->ned_map); in dasd_eckd_cuir_scope()
6409 ref_ned = (char *)&ref_conf_data->neds[pos]; in dasd_eckd_cuir_scope()
6410 ref_gneq = (char *)&ref_conf_data->gneq; in dasd_eckd_cuir_scope()
6412 mask = cuir->neq_map[2]; in dasd_eckd_cuir_scope()
6413 mask |= cuir->neq_map[1] << 8; in dasd_eckd_cuir_scope()
6414 mask |= cuir->neq_map[0] << 16; in dasd_eckd_cuir_scope()
6419 conf_data = device->path[path].conf_data; in dasd_eckd_cuir_scope()
6420 pos = 8 - ffs(cuir->ned_map); in dasd_eckd_cuir_scope()
6421 ned = (char *) &conf_data->neds[pos]; in dasd_eckd_cuir_scope()
6425 gneq = (char *)&conf_data->gneq; in dasd_eckd_cuir_scope()
6430 pos = ffs(bitmask) - 1; in dasd_eckd_cuir_scope()
6431 if (memcmp(&ref_gneq[31 - pos], &gneq[31 - pos], 1) in dasd_eckd_cuir_scope()
6452 pos = 8 - ffs(paths); in dasd_eckd_cuir_notify_user()
6456 device->path[pos].cssid, in dasd_eckd_cuir_notify_user()
6457 device->path[pos].chpid); in dasd_eckd_cuir_notify_user()
6460 device->path[pos].cssid, in dasd_eckd_cuir_notify_user()
6461 device->path[pos].chpid); in dasd_eckd_cuir_notify_user()
6462 clear_bit(7 - pos, &paths); in dasd_eckd_cuir_notify_user()
6478 return -EINVAL; in dasd_eckd_cuir_remove_path()
6497 struct dasd_eckd_private *private = device->private; in dasd_eckd_cuir_quiesce()
6505 list_for_each_entry_safe(dev, n, &private->lcu->active_devices, in dasd_eckd_cuir_quiesce()
6507 spin_lock_irqsave(get_ccwdev_lock(dev->cdev), flags); in dasd_eckd_cuir_quiesce()
6509 spin_unlock_irqrestore(get_ccwdev_lock(dev->cdev), flags); in dasd_eckd_cuir_quiesce()
6515 list_for_each_entry_safe(dev, n, &private->lcu->inactive_devices, in dasd_eckd_cuir_quiesce()
6517 spin_lock_irqsave(get_ccwdev_lock(dev->cdev), flags); in dasd_eckd_cuir_quiesce()
6519 spin_unlock_irqrestore(get_ccwdev_lock(dev->cdev), flags); in dasd_eckd_cuir_quiesce()
6526 &private->lcu->grouplist, group) { in dasd_eckd_cuir_quiesce()
6527 list_for_each_entry_safe(dev, n, &pavgroup->baselist, in dasd_eckd_cuir_quiesce()
6529 spin_lock_irqsave(get_ccwdev_lock(dev->cdev), flags); in dasd_eckd_cuir_quiesce()
6532 get_ccwdev_lock(dev->cdev), flags); in dasd_eckd_cuir_quiesce()
6537 list_for_each_entry_safe(dev, n, &pavgroup->aliaslist, in dasd_eckd_cuir_quiesce()
6539 spin_lock_irqsave(get_ccwdev_lock(dev->cdev), flags); in dasd_eckd_cuir_quiesce()
6542 get_ccwdev_lock(dev->cdev), flags); in dasd_eckd_cuir_quiesce()
6558 struct dasd_eckd_private *private = device->private; in dasd_eckd_cuir_resume()
6569 &private->lcu->active_devices, in dasd_eckd_cuir_resume()
6579 &private->lcu->inactive_devices, in dasd_eckd_cuir_resume()
6590 &private->lcu->grouplist, in dasd_eckd_cuir_resume()
6593 &pavgroup->baselist, in dasd_eckd_cuir_resume()
6603 &pavgroup->aliaslist, in dasd_eckd_cuir_resume()
6629 if (cuir->code == CUIR_QUIESCE) { in dasd_eckd_handle_cuir()
6635 } else if (cuir->code == CUIR_RESUME) { in dasd_eckd_handle_cuir()
6643 cuir->message_id, lpum); in dasd_eckd_handle_cuir()
6646 cuir->message_id); in dasd_eckd_handle_cuir()
6648 device->discipline->check_attention(device, lpum); in dasd_eckd_handle_cuir()
6653 struct dasd_eckd_private *private = device->private; in dasd_eckd_oos_resume()
6658 spin_lock_irqsave(&private->lcu->lock, flags); in dasd_eckd_oos_resume()
6659 list_for_each_entry_safe(dev, n, &private->lcu->active_devices, in dasd_eckd_oos_resume()
6661 if (dev->stopped & DASD_STOPPED_NOSPC) in dasd_eckd_oos_resume()
6664 list_for_each_entry_safe(dev, n, &private->lcu->inactive_devices, in dasd_eckd_oos_resume()
6666 if (dev->stopped & DASD_STOPPED_NOSPC) in dasd_eckd_oos_resume()
6671 &private->lcu->grouplist, in dasd_eckd_oos_resume()
6673 list_for_each_entry_safe(dev, n, &pavgroup->baselist, in dasd_eckd_oos_resume()
6675 if (dev->stopped & DASD_STOPPED_NOSPC) in dasd_eckd_oos_resume()
6678 list_for_each_entry_safe(dev, n, &pavgroup->aliaslist, in dasd_eckd_oos_resume()
6680 if (dev->stopped & DASD_STOPPED_NOSPC) in dasd_eckd_oos_resume()
6684 spin_unlock_irqrestore(&private->lcu->lock, flags); in dasd_eckd_oos_resume()
6692 switch (oos->code) { in dasd_eckd_handle_oos()
6695 dev_warn(&device->cdev->dev, in dasd_eckd_handle_oos()
6701 dev_warn(&device->cdev->dev, in dasd_eckd_handle_oos()
6706 dev_info(&device->cdev->dev, in dasd_eckd_handle_oos()
6715 device->discipline->check_attention(device, lpum); in dasd_eckd_handle_oos()
6726 device = data->device; in dasd_eckd_check_attention_work()
6733 rc = dasd_eckd_read_message_buffer(device, messages, data->lpum); in dasd_eckd_check_attention_work()
6737 if (messages->length == ATTENTION_LENGTH_CUIR && in dasd_eckd_check_attention_work()
6738 messages->format == ATTENTION_FORMAT_CUIR) in dasd_eckd_check_attention_work()
6739 dasd_eckd_handle_cuir(device, messages, data->lpum); in dasd_eckd_check_attention_work()
6740 if (messages->length == ATTENTION_LENGTH_OOS && in dasd_eckd_check_attention_work()
6741 messages->format == ATTENTION_FORMAT_OOS) in dasd_eckd_check_attention_work()
6742 dasd_eckd_handle_oos(device, messages, data->lpum); in dasd_eckd_check_attention_work()
6756 return -ENOMEM; in dasd_eckd_check_attention()
6757 INIT_WORK(&data->worker, dasd_eckd_check_attention_work); in dasd_eckd_check_attention()
6759 data->device = device; in dasd_eckd_check_attention()
6760 data->lpum = lpum; in dasd_eckd_check_attention()
6761 schedule_work(&data->worker); in dasd_eckd_check_attention()
6770 dev_err(&device->cdev->dev, in dasd_eckd_disable_hpf_path()
6780 struct dasd_eckd_private *private = device->private; in dasd_eckd_disable_hpf_device()
6782 dev_err(&device->cdev->dev, in dasd_eckd_disable_hpf_device()
6784 private->fcx_max_data = 0; in dasd_eckd_disable_hpf_device()
6789 struct dasd_eckd_private *private = device->private; in dasd_eckd_hpf_enabled()
6791 return private->fcx_max_data ? 1 : 0; in dasd_eckd_hpf_enabled()
6797 struct dasd_eckd_private *private = device->private; in dasd_eckd_handle_hpf_error()
6799 if (!private->fcx_max_data) { in dasd_eckd_handle_hpf_error()
6805 if (irb->scsw.tm.sesq == SCSW_SESQ_DEV_NOFCX) { in dasd_eckd_handle_hpf_error()
6807 } else if (irb->scsw.tm.sesq == SCSW_SESQ_PATH_NOFCX) { in dasd_eckd_handle_hpf_error()
6808 if (dasd_eckd_disable_hpf_path(device, irb->esw.esw1.lpum)) in dasd_eckd_handle_hpf_error()
6822 static unsigned int dasd_eckd_max_sectors(struct dasd_block *block) in dasd_eckd_max_sectors() argument
6824 if (block->base->features & DASD_FEATURE_USERAW) { in dasd_eckd_max_sectors()
6832 return DASD_ECKD_MAX_BLOCKS_RAW << block->s2b_shift; in dasd_eckd_max_sectors()
6835 return DASD_ECKD_MAX_BLOCKS << block->s2b_shift; in dasd_eckd_max_sectors()
6840 .name = "dasd-eckd",
6921 return -ENOMEM; in dasd_eckd_init()
6926 return -ENOMEM; in dasd_eckd_init()
6933 return -ENOMEM; in dasd_eckd_init()
6940 return -ENOMEM; in dasd_eckd_init()