Lines Matching +full:compound +full:- +full:device

1 // SPDX-License-Identifier: GPL-2.0
51 struct dasd_ccw_req *cqr = erp->refers; in dasd_3990_erp_cleanup()
53 dasd_free_erp_request(erp, erp->memdev); in dasd_3990_erp_cleanup()
54 cqr->status = final_status; in dasd_3990_erp_cleanup()
63 * Block the given device request queue to prevent from further
70 struct dasd_device *device = erp->startdev; in dasd_3990_erp_block_queue() local
73 DBF_DEV_EVENT(DBF_INFO, device, in dasd_3990_erp_block_queue()
76 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_3990_erp_block_queue()
77 dasd_device_set_stop_bits(device, DASD_STOPPED_PENDING); in dasd_3990_erp_block_queue()
78 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_3990_erp_block_queue()
79 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_block_queue()
80 if (erp->block) in dasd_3990_erp_block_queue()
81 dasd_block_set_timer(erp->block, expires); in dasd_3990_erp_block_queue()
83 dasd_device_set_timer(device, expires); in dasd_3990_erp_block_queue()
91 * This means either device offline or not installed.
102 struct dasd_device *device = erp->startdev; in dasd_3990_erp_int_req() local
107 if (erp->function != dasd_3990_erp_int_req) { in dasd_3990_erp_int_req()
109 erp->retries = 256; in dasd_3990_erp_int_req()
110 erp->function = dasd_3990_erp_int_req; in dasd_3990_erp_int_req()
114 /* issue a message and wait for 'device ready' interrupt */ in dasd_3990_erp_int_req()
115 dev_err(&device->cdev->dev, in dasd_3990_erp_int_req()
116 "is offline or not installed - " in dasd_3990_erp_int_req()
143 struct dasd_device *device = erp->startdev; in dasd_3990_erp_alternate_path() local
148 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_3990_erp_alternate_path()
149 opm = ccw_device_get_path_mask(device->cdev); in dasd_3990_erp_alternate_path()
150 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_3990_erp_alternate_path()
151 if (erp->lpm == 0) in dasd_3990_erp_alternate_path()
152 erp->lpm = dasd_path_get_opm(device) & in dasd_3990_erp_alternate_path()
153 ~(erp->irb.esw.esw0.sublog.lpum); in dasd_3990_erp_alternate_path()
155 erp->lpm &= ~(erp->irb.esw.esw0.sublog.lpum); in dasd_3990_erp_alternate_path()
157 if ((erp->lpm & opm) != 0x00) { in dasd_3990_erp_alternate_path()
159 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_3990_erp_alternate_path()
161 erp->lpm, erp->irb.esw.esw0.sublog.lpum, opm); in dasd_3990_erp_alternate_path()
164 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_alternate_path()
165 erp->retries = 10; in dasd_3990_erp_alternate_path()
167 dev_err(&device->cdev->dev, in dasd_3990_erp_alternate_path()
169 "/opm=%x)\n", erp->irb.esw.esw0.sublog.lpum, opm); in dasd_3990_erp_alternate_path()
172 erp->status = DASD_CQR_FAILED; in dasd_3990_erp_alternate_path()
195 struct dasd_device *device = erp->startdev; in dasd_3990_erp_DCTL() local
200 dctl_cqr = dasd_alloc_erp_request(erp->magic, 1, in dasd_3990_erp_DCTL()
202 device); in dasd_3990_erp_DCTL()
204 dev_err(&device->cdev->dev, in dasd_3990_erp_DCTL()
205 "Unable to allocate DCTL-CQR\n"); in dasd_3990_erp_DCTL()
206 erp->status = DASD_CQR_FAILED; in dasd_3990_erp_DCTL()
210 DCTL_data = dctl_cqr->data; in dasd_3990_erp_DCTL()
212 DCTL_data->subcommand = 0x02; /* Inhibit Write */ in dasd_3990_erp_DCTL()
213 DCTL_data->modifier = modifier; in dasd_3990_erp_DCTL()
215 ccw = dctl_cqr->cpaddr; in dasd_3990_erp_DCTL()
217 ccw->cmd_code = CCW_CMD_DCTL; in dasd_3990_erp_DCTL()
218 ccw->count = 4; in dasd_3990_erp_DCTL()
219 ccw->cda = virt_to_dma32(DCTL_data); in dasd_3990_erp_DCTL()
220 dctl_cqr->flags = erp->flags; in dasd_3990_erp_DCTL()
221 dctl_cqr->function = dasd_3990_erp_DCTL; in dasd_3990_erp_DCTL()
222 dctl_cqr->refers = erp; in dasd_3990_erp_DCTL()
223 dctl_cqr->startdev = device; in dasd_3990_erp_DCTL()
224 dctl_cqr->memdev = device; in dasd_3990_erp_DCTL()
225 dctl_cqr->magic = erp->magic; in dasd_3990_erp_DCTL()
226 dctl_cqr->expires = 5 * 60 * HZ; in dasd_3990_erp_DCTL()
227 dctl_cqr->retries = 2; in dasd_3990_erp_DCTL()
229 dctl_cqr->buildclk = get_tod_clock(); in dasd_3990_erp_DCTL()
231 dctl_cqr->status = DASD_CQR_FILLED; in dasd_3990_erp_DCTL()
260 erp->function = dasd_3990_erp_action_1_sec; in dasd_3990_erp_action_1_sec()
267 erp->function = dasd_3990_erp_action_1; in dasd_3990_erp_action_1()
269 if (erp->status == DASD_CQR_FAILED && in dasd_3990_erp_action_1()
270 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) { in dasd_3990_erp_action_1()
271 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_action_1()
272 erp->retries = 10; in dasd_3990_erp_action_1()
273 erp->lpm = dasd_path_get_opm(erp->startdev); in dasd_3990_erp_action_1()
274 erp->function = dasd_3990_erp_action_1_sec; in dasd_3990_erp_action_1()
284 * Set the current request to PENDING to block the CQR queue for that device
301 struct dasd_device *device = erp->startdev; in dasd_3990_erp_action_4() local
306 if (erp->function != dasd_3990_erp_action_4) { in dasd_3990_erp_action_4()
308 DBF_DEV_EVENT(DBF_INFO, device, "%s", in dasd_3990_erp_action_4()
311 erp->retries = 256; in dasd_3990_erp_action_4()
312 erp->function = dasd_3990_erp_action_4; in dasd_3990_erp_action_4()
317 DBF_DEV_EVENT(DBF_INFO, device, in dasd_3990_erp_action_4()
320 erp->retries); in dasd_3990_erp_action_4()
325 DBF_DEV_EVENT(DBF_INFO, device, in dasd_3990_erp_action_4()
326 "busy - redriving request later, " in dasd_3990_erp_action_4()
328 erp->retries); in dasd_3990_erp_action_4()
331 /* no state change pending - retry */ in dasd_3990_erp_action_4()
332 DBF_DEV_EVENT(DBF_INFO, device, in dasd_3990_erp_action_4()
335 erp->retries); in dasd_3990_erp_action_4()
336 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_action_4()
369 erp->retries = 10; in dasd_3990_erp_action_5()
370 erp->function = dasd_3990_erp_action_5; in dasd_3990_erp_action_5()
394 struct dasd_device *device = erp->startdev; in dasd_3990_handle_env_data() local
399 case 0x00: /* Format 0 - Program or System Checks */ in dasd_3990_handle_env_data()
407 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
408 "FORMAT 0 - Invalid Command\n"); in dasd_3990_handle_env_data()
411 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
412 "FORMAT 0 - Invalid Command " in dasd_3990_handle_env_data()
416 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
417 "FORMAT 0 - CCW Count less than " in dasd_3990_handle_env_data()
421 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
422 "FORMAT 0 - Invalid Parameter\n"); in dasd_3990_handle_env_data()
425 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
426 "FORMAT 0 - Diagnostic of Special" in dasd_3990_handle_env_data()
430 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
431 "FORMAT 0 - Channel Returned with " in dasd_3990_handle_env_data()
435 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
436 "FORMAT 0 - Reset Notification\n"); in dasd_3990_handle_env_data()
439 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
440 "FORMAT 0 - Storage Path Restart\n"); in dasd_3990_handle_env_data()
443 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
444 "FORMAT 0 - Channel requested " in dasd_3990_handle_env_data()
448 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
449 "FORMAT 0 - Invalid Defective/" in dasd_3990_handle_env_data()
453 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
454 "FORMAT 0 - DPS Installation " in dasd_3990_handle_env_data()
458 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
459 "FORMAT 0 - Command Invalid on " in dasd_3990_handle_env_data()
463 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
464 "FORMAT 0 - Status Not As " in dasd_3990_handle_env_data()
469 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
470 "FORMAT 0 - Reserved\n"); in dasd_3990_handle_env_data()
477 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
478 "FORMAT 0 - Device Error " in dasd_3990_handle_env_data()
482 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
483 "FORMAT 0 - Reserved\n"); in dasd_3990_handle_env_data()
486 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
487 "FORMAT 0 - Device Fenced - " in dasd_3990_handle_env_data()
488 "device = %02x\n", sense[4]); in dasd_3990_handle_env_data()
491 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
492 "FORMAT 0 - Data Pinned for " in dasd_3990_handle_env_data()
493 "Device\n"); in dasd_3990_handle_env_data()
496 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
497 "FORMAT 0 - Reserved\n"); in dasd_3990_handle_env_data()
502 case 0x10: /* Format 1 - Device Equipment Checks */ in dasd_3990_handle_env_data()
507 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
508 "FORMAT 1 - Device Status 1 not as " in dasd_3990_handle_env_data()
512 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
513 "FORMAT 1 - Index missing\n"); in dasd_3990_handle_env_data()
516 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
517 "FORMAT 1 - Interruption cannot be " in dasd_3990_handle_env_data()
521 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
522 "FORMAT 1 - Device did not respond to " in dasd_3990_handle_env_data()
526 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
527 "FORMAT 1 - Device check-2 error or Set " in dasd_3990_handle_env_data()
531 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
532 "FORMAT 1 - Head address does not " in dasd_3990_handle_env_data()
536 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
537 "FORMAT 1 - Device status 1 not valid\n"); in dasd_3990_handle_env_data()
540 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
541 "FORMAT 1 - Device not ready\n"); in dasd_3990_handle_env_data()
544 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
545 "FORMAT 1 - Track physical address did " in dasd_3990_handle_env_data()
549 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
550 "FORMAT 1 - Missing device address bit\n"); in dasd_3990_handle_env_data()
553 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
554 "FORMAT 1 - Drive motor switch is off\n"); in dasd_3990_handle_env_data()
557 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
558 "FORMAT 1 - Seek incomplete\n"); in dasd_3990_handle_env_data()
561 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
562 "FORMAT 1 - Cylinder address did not " in dasd_3990_handle_env_data()
566 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
567 "FORMAT 1 - Offset active cannot be " in dasd_3990_handle_env_data()
571 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
572 "FORMAT 1 - Reserved\n"); in dasd_3990_handle_env_data()
576 case 0x20: /* Format 2 - 3990 Equipment Checks */ in dasd_3990_handle_env_data()
579 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
580 "FORMAT 2 - 3990 check-2 error\n"); in dasd_3990_handle_env_data()
583 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
584 "FORMAT 2 - Support facility errors\n"); in dasd_3990_handle_env_data()
587 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
588 "FORMAT 2 - Microcode detected error " in dasd_3990_handle_env_data()
593 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
594 "FORMAT 2 - Reserved\n"); in dasd_3990_handle_env_data()
598 case 0x30: /* Format 3 - 3990 Control Checks */ in dasd_3990_handle_env_data()
601 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
602 "FORMAT 3 - Allegiance terminated\n"); in dasd_3990_handle_env_data()
605 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
606 "FORMAT 3 - Reserved\n"); in dasd_3990_handle_env_data()
610 case 0x40: /* Format 4 - Data Checks */ in dasd_3990_handle_env_data()
613 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
614 "FORMAT 4 - Home address area error\n"); in dasd_3990_handle_env_data()
617 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
618 "FORMAT 4 - Count area error\n"); in dasd_3990_handle_env_data()
621 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
622 "FORMAT 4 - Key area error\n"); in dasd_3990_handle_env_data()
625 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
626 "FORMAT 4 - Data area error\n"); in dasd_3990_handle_env_data()
629 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
630 "FORMAT 4 - No sync byte in home address " in dasd_3990_handle_env_data()
634 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
635 "FORMAT 4 - No sync byte in count address " in dasd_3990_handle_env_data()
639 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
640 "FORMAT 4 - No sync byte in key area\n"); in dasd_3990_handle_env_data()
643 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
644 "FORMAT 4 - No sync byte in data area\n"); in dasd_3990_handle_env_data()
647 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
648 "FORMAT 4 - Home address area error; " in dasd_3990_handle_env_data()
652 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
653 "FORMAT 4 - Count area error; offset " in dasd_3990_handle_env_data()
657 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
658 "FORMAT 4 - Key area error; offset " in dasd_3990_handle_env_data()
662 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
663 "FORMAT 4 - Data area error; " in dasd_3990_handle_env_data()
667 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
668 "FORMAT 4 - No sync byte in home " in dasd_3990_handle_env_data()
672 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
673 "FORMAT 4 - No sync byte in count " in dasd_3990_handle_env_data()
677 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
678 "FORMAT 4 - No sync byte in key area; " in dasd_3990_handle_env_data()
682 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
683 "FORMAT 4 - No sync byte in data area; " in dasd_3990_handle_env_data()
687 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
688 "FORMAT 4 - Reserved\n"); in dasd_3990_handle_env_data()
692 case 0x50: /* Format 5 - Data Check with displacement information */ in dasd_3990_handle_env_data()
695 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
696 "FORMAT 5 - Data Check in the " in dasd_3990_handle_env_data()
700 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
701 "FORMAT 5 - Data Check in the count " in dasd_3990_handle_env_data()
705 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
706 "FORMAT 5 - Data Check in the key area\n"); in dasd_3990_handle_env_data()
709 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
710 "FORMAT 5 - Data Check in the data " in dasd_3990_handle_env_data()
714 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
715 "FORMAT 5 - Data Check in the " in dasd_3990_handle_env_data()
719 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
720 "FORMAT 5 - Data Check in the count area; " in dasd_3990_handle_env_data()
724 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
725 "FORMAT 5 - Data Check in the key area; " in dasd_3990_handle_env_data()
729 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
730 "FORMAT 5 - Data Check in the data area; " in dasd_3990_handle_env_data()
734 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
735 "FORMAT 5 - Reserved\n"); in dasd_3990_handle_env_data()
739 case 0x60: /* Format 6 - Usage Statistics/Overrun Errors */ in dasd_3990_handle_env_data()
742 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
743 "FORMAT 6 - Overrun on channel A\n"); in dasd_3990_handle_env_data()
746 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
747 "FORMAT 6 - Overrun on channel B\n"); in dasd_3990_handle_env_data()
750 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
751 "FORMAT 6 - Overrun on channel C\n"); in dasd_3990_handle_env_data()
754 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
755 "FORMAT 6 - Overrun on channel D\n"); in dasd_3990_handle_env_data()
758 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
759 "FORMAT 6 - Overrun on channel E\n"); in dasd_3990_handle_env_data()
762 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
763 "FORMAT 6 - Overrun on channel F\n"); in dasd_3990_handle_env_data()
766 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
767 "FORMAT 6 - Overrun on channel G\n"); in dasd_3990_handle_env_data()
770 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
771 "FORMAT 6 - Overrun on channel H\n"); in dasd_3990_handle_env_data()
774 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
775 "FORMAT 6 - Reserved\n"); in dasd_3990_handle_env_data()
779 case 0x70: /* Format 7 - Device Connection Control Checks */ in dasd_3990_handle_env_data()
782 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
783 "FORMAT 7 - RCC initiated by a connection " in dasd_3990_handle_env_data()
787 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
788 "FORMAT 7 - RCC 1 sequence not " in dasd_3990_handle_env_data()
792 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
793 "FORMAT 7 - RCC 1 and RCC 2 sequences not " in dasd_3990_handle_env_data()
797 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
798 "FORMAT 7 - Invalid tag-in during " in dasd_3990_handle_env_data()
802 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
803 "FORMAT 7 - extra RCC required\n"); in dasd_3990_handle_env_data()
806 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
807 "FORMAT 7 - Invalid DCC selection " in dasd_3990_handle_env_data()
811 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
812 "FORMAT 7 - Missing end operation; device " in dasd_3990_handle_env_data()
816 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
817 "FORMAT 7 - Missing end operation; device " in dasd_3990_handle_env_data()
821 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
822 "FORMAT 7 - Invalid tag-in for an " in dasd_3990_handle_env_data()
826 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
827 "FORMAT 7 - Invalid tag-in for an " in dasd_3990_handle_env_data()
831 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
832 "FORMAT 7 - 3990 microcode time out when " in dasd_3990_handle_env_data()
836 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
837 "FORMAT 7 - No response to selection " in dasd_3990_handle_env_data()
841 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
842 "FORMAT 7 - Permanent path error (DASD " in dasd_3990_handle_env_data()
846 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
847 "FORMAT 7 - DASD controller not available" in dasd_3990_handle_env_data()
851 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
852 "FORMAT 7 - Reserved\n"); in dasd_3990_handle_env_data()
856 case 0x80: /* Format 8 - Additional Device Equipment Checks */ in dasd_3990_handle_env_data()
860 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
861 "FORMAT 8 - Error correction code " in dasd_3990_handle_env_data()
865 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
866 "FORMAT 8 - Unexpected end operation " in dasd_3990_handle_env_data()
870 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
871 "FORMAT 8 - End operation with transfer " in dasd_3990_handle_env_data()
875 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
876 "FORMAT 8 - End operation with transfer " in dasd_3990_handle_env_data()
880 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
881 "FORMAT 8 - DPS checks after a system " in dasd_3990_handle_env_data()
885 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
886 "FORMAT 8 - DPS cannot be filled\n"); in dasd_3990_handle_env_data()
889 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
890 "FORMAT 8 - Short busy time-out during " in dasd_3990_handle_env_data()
891 "device selection\n"); in dasd_3990_handle_env_data()
894 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
895 "FORMAT 8 - DASD controller failed to " in dasd_3990_handle_env_data()
899 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
900 "FORMAT 8 - No interruption from device " in dasd_3990_handle_env_data()
904 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
905 "FORMAT 8 - Reserved\n"); in dasd_3990_handle_env_data()
909 case 0x90: /* Format 9 - Device Read, Write, and Seek Checks */ in dasd_3990_handle_env_data()
914 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
915 "FORMAT 9 - Device check-2 error\n"); in dasd_3990_handle_env_data()
918 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
919 "FORMAT 9 - Head address did not " in dasd_3990_handle_env_data()
923 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
924 "FORMAT 9 - Track physical address did " in dasd_3990_handle_env_data()
928 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
929 "FORMAT 9 - Cylinder address did not " in dasd_3990_handle_env_data()
933 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
934 "FORMAT 9 - Reserved\n"); in dasd_3990_handle_env_data()
938 case 0xF0: /* Format F - Cache Storage Checks */ in dasd_3990_handle_env_data()
941 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
942 "FORMAT F - Operation Terminated\n"); in dasd_3990_handle_env_data()
945 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
946 "FORMAT F - Subsystem Processing Error\n"); in dasd_3990_handle_env_data()
949 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
950 "FORMAT F - Cache or nonvolatile storage " in dasd_3990_handle_env_data()
954 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
955 "FORMAT F - Caching terminated\n"); in dasd_3990_handle_env_data()
958 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
959 "FORMAT F - Cache fast write access not " in dasd_3990_handle_env_data()
963 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
964 "FORMAT F - Track format incorrect\n"); in dasd_3990_handle_env_data()
967 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
968 "FORMAT F - Caching reinitiated\n"); in dasd_3990_handle_env_data()
971 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
972 "FORMAT F - Nonvolatile storage " in dasd_3990_handle_env_data()
976 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
977 "FORMAT F - Volume is suspended duplex\n"); in dasd_3990_handle_env_data()
979 dasd_eer_write(device, erp->refers, in dasd_3990_handle_env_data()
983 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
984 "FORMAT F - Subsystem status cannot be " in dasd_3990_handle_env_data()
988 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
989 "FORMAT F - Caching status reset to " in dasd_3990_handle_env_data()
993 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
994 "FORMAT F - DASD Fast Write inhibited\n"); in dasd_3990_handle_env_data()
997 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
998 "FORMAT F - Reserved\n"); in dasd_3990_handle_env_data()
1003 dev_err(&device->cdev->dev, in dasd_3990_handle_env_data()
1021 * erp 'new' erp_head - pointer to new ERP
1027 struct dasd_device *device = erp->startdev; in dasd_3990_erp_com_rej() local
1029 erp->function = dasd_3990_erp_com_rej; in dasd_3990_erp_com_rej()
1031 /* env data present (ACTION 10 - retry should work) */ in dasd_3990_erp_com_rej()
1034 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_com_rej()
1035 "Command Reject - environmental data present"); in dasd_3990_erp_com_rej()
1039 erp->retries = 5; in dasd_3990_erp_com_rej()
1042 dev_err(&device->cdev->dev, "An I/O request was rejected" in dasd_3990_erp_com_rej()
1046 dev_err(&device->cdev->dev, "An I/O request was rejected on a copy pair secondary device\n"); in dasd_3990_erp_com_rej()
1048 set_bit(DASD_CQR_SUPPRESS_CR, &erp->refers->flags); in dasd_3990_erp_com_rej()
1051 if (!test_bit(DASD_CQR_SUPPRESS_CR, &erp->flags)) in dasd_3990_erp_com_rej()
1052 dev_err(&device->cdev->dev, in dasd_3990_erp_com_rej()
1071 * erp new erp_head - pointer to new ERP
1077 struct dasd_device *device = erp->startdev; in dasd_3990_erp_bus_out() local
1082 if (erp->function != dasd_3990_erp_bus_out) { in dasd_3990_erp_bus_out()
1083 erp->retries = 256; in dasd_3990_erp_bus_out()
1084 erp->function = dasd_3990_erp_bus_out; in dasd_3990_erp_bus_out()
1088 /* issue a message and wait for 'device ready' interrupt */ in dasd_3990_erp_bus_out()
1089 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_bus_out()
1110 * erp new erp_head - pointer to new ERP
1116 struct dasd_device *device = erp->startdev; in dasd_3990_erp_equip_check() local
1118 erp->function = dasd_3990_erp_equip_check; in dasd_3990_erp_equip_check()
1121 dev_err(&device->cdev->dev, "Write inhibited path encountered\n"); in dasd_3990_erp_equip_check()
1127 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_equip_check()
1128 "Equipment Check - " "environmental data present"); in dasd_3990_erp_equip_check()
1136 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_equip_check()
1137 "Equipment Check - retry exhausted or " in dasd_3990_erp_equip_check()
1143 /* all other equipment checks - Action 5 */ in dasd_3990_erp_equip_check()
1145 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_equip_check()
1163 * erp new erp_head - pointer to new ERP
1169 struct dasd_device *device = erp->startdev; in dasd_3990_erp_data_check() local
1171 erp->function = dasd_3990_erp_data_check; in dasd_3990_erp_data_check()
1176 dev_emerg(&device->cdev->dev, in dasd_3990_erp_data_check()
1186 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_data_check()
1194 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_data_check()
1202 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_data_check()
1222 * erp new erp_head - pointer to new ERP
1228 struct dasd_device *device = erp->startdev; in dasd_3990_erp_overrun() local
1230 erp->function = dasd_3990_erp_overrun; in dasd_3990_erp_overrun()
1232 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_overrun()
1233 "Overrun - service overrun or overrun" in dasd_3990_erp_overrun()
1251 * erp new erp_head - pointer to new ERP
1257 struct dasd_device *device = erp->startdev; in dasd_3990_erp_inv_format() local
1259 erp->function = dasd_3990_erp_inv_format; in dasd_3990_erp_inv_format()
1263 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_inv_format()
1272 dev_err(&device->cdev->dev, "Track format is not valid\n"); in dasd_3990_erp_inv_format()
1284 * Handles 24 byte 'End-of-Cylinder' error.
1295 struct dasd_device *device = default_erp->startdev; in dasd_3990_erp_EOC() local
1297 dev_err(&device->cdev->dev, in dasd_3990_erp_EOC()
1300 /* implement action 7 - BUG */ in dasd_3990_erp_EOC()
1309 * Handles 24 byte 'Environmental-Data Present' error.
1314 * erp new erp_head - pointer to new ERP
1320 struct dasd_device *device = erp->startdev; in dasd_3990_erp_env_data() local
1322 erp->function = dasd_3990_erp_env_data; in dasd_3990_erp_env_data()
1324 DBF_DEV_EVENT(DBF_WARNING, device, "%s", "Environmental data present"); in dasd_3990_erp_env_data()
1332 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_env_data()
1349 * erp new erp_head - pointer to new ERP
1355 struct dasd_device *device = default_erp->startdev; in dasd_3990_erp_no_rec() local
1362 if (!test_bit(DASD_CQR_SUPPRESS_NRF, &default_erp->flags)) in dasd_3990_erp_no_rec()
1363 dev_err(&device->cdev->dev, in dasd_3990_erp_no_rec()
1381 * erp new erp_head - pointer to new ERP
1387 struct dasd_device *device = erp->startdev; in dasd_3990_erp_file_prot() local
1389 dev_err(&device->cdev->dev, in dasd_3990_erp_file_prot()
1400 * Checks if the original request was started on an alias device.
1402 * the erp request can be started on a base device.
1414 struct dasd_ccw_req *cqr = erp->refers; in dasd_3990_erp_inspect_alias()
1417 if (cqr->block && in dasd_3990_erp_inspect_alias()
1418 (cqr->block->base != cqr->startdev)) { in dasd_3990_erp_inspect_alias()
1420 sense = dasd_get_sense(&erp->refers->irb); in dasd_3990_erp_inspect_alias()
1424 if (!test_bit(DASD_FLAG_OFFLINE, &cqr->startdev->flags) && sense in dasd_3990_erp_inspect_alias()
1428 * remove device from alias handling to prevent new in dasd_3990_erp_inspect_alias()
1430 * wrong alias device in dasd_3990_erp_inspect_alias()
1432 dasd_alias_remove_device(cqr->startdev); in dasd_3990_erp_inspect_alias()
1434 /* schedule worker to reload device */ in dasd_3990_erp_inspect_alias()
1435 dasd_reload_device(cqr->startdev); in dasd_3990_erp_inspect_alias()
1438 if (cqr->startdev->features & DASD_FEATURE_ERPLOG) { in dasd_3990_erp_inspect_alias()
1439 DBF_DEV_EVENT(DBF_ERR, cqr->startdev, in dasd_3990_erp_inspect_alias()
1440 "ERP on alias device for request %p," in dasd_3990_erp_inspect_alias()
1441 " recover on base device %s", cqr, in dasd_3990_erp_inspect_alias()
1442 dev_name(&cqr->block->base->cdev->dev)); in dasd_3990_erp_inspect_alias()
1445 erp->startdev = cqr->block->base; in dasd_3990_erp_inspect_alias()
1446 erp->function = dasd_3990_erp_inspect_alias; in dasd_3990_erp_inspect_alias()
1502 /* 'End-of-Cylinder' */ in dasd_3990_erp_inspect_24()
1518 /* other (unknown) error - do default ERP */ in dasd_3990_erp_inspect_24()
1551 struct dasd_device *device = erp->startdev; in dasd_3990_erp_action_10_32() local
1553 erp->retries = 256; in dasd_3990_erp_action_10_32()
1554 erp->function = dasd_3990_erp_action_10_32; in dasd_3990_erp_action_10_32()
1556 DBF_DEV_EVENT(DBF_WARNING, device, "%s", "Perform logging requested"); in dasd_3990_erp_action_10_32()
1585 struct dasd_device *device = default_erp->startdev; in dasd_3990_erp_action_1B_32() local
1594 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_action_1B_32()
1597 default_erp->function = dasd_3990_erp_action_1B_32; in dasd_3990_erp_action_1B_32()
1602 while (cqr->refers != NULL) { in dasd_3990_erp_action_1B_32()
1603 cqr = cqr->refers; in dasd_3990_erp_action_1B_32()
1606 if (scsw_is_tm(&cqr->irb.scsw)) { in dasd_3990_erp_action_1B_32()
1607 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_action_1B_32()
1609 " in transport mode - just retry"); in dasd_3990_erp_action_1B_32()
1615 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_action_1B_32()
1616 "Imprecise ending is set - just retry"); in dasd_3990_erp_action_1B_32()
1622 /* Imprecise ending is not set -> addr from IRB-SCSW */ in dasd_3990_erp_action_1B_32()
1623 cpa = default_erp->refers->irb.scsw.cmd.cpa; in dasd_3990_erp_action_1B_32()
1626 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_action_1B_32()
1634 erp = dasd_alloc_erp_request(cqr->magic, in dasd_3990_erp_action_1B_32()
1637 sizeof(struct LO_eckd_data), device); in dasd_3990_erp_action_1B_32()
1640 DBF_DEV_EVENT(DBF_ERR, device, "%s", in dasd_3990_erp_action_1B_32()
1646 DE_data = erp->data; in dasd_3990_erp_action_1B_32()
1647 oldccw = cqr->cpaddr; in dasd_3990_erp_action_1B_32()
1648 if (oldccw->cmd_code == DASD_ECKD_CCW_PFX) { in dasd_3990_erp_action_1B_32()
1649 PFX_data = cqr->data; in dasd_3990_erp_action_1B_32()
1650 memcpy(DE_data, &PFX_data->define_extent, in dasd_3990_erp_action_1B_32()
1653 memcpy(DE_data, cqr->data, sizeof(struct DE_eckd_data)); in dasd_3990_erp_action_1B_32()
1656 LO_data = erp->data + sizeof(struct DE_eckd_data); in dasd_3990_erp_action_1B_32()
1664 /* operation code is WRITE DATA -> data area orientation */ in dasd_3990_erp_action_1B_32()
1668 /* operation code is FORMAT WRITE -> index orientation */ in dasd_3990_erp_action_1B_32()
1685 ccw = erp->cpaddr; in dasd_3990_erp_action_1B_32()
1687 ccw->cmd_code = DASD_ECKD_CCW_DEFINE_EXTENT; in dasd_3990_erp_action_1B_32()
1688 ccw->flags = CCW_FLAG_CC; in dasd_3990_erp_action_1B_32()
1689 ccw->count = 16; in dasd_3990_erp_action_1B_32()
1690 ccw->cda = virt_to_dma32(DE_data); in dasd_3990_erp_action_1B_32()
1695 ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD; in dasd_3990_erp_action_1B_32()
1696 ccw->flags = CCW_FLAG_CC; in dasd_3990_erp_action_1B_32()
1697 ccw->count = 16; in dasd_3990_erp_action_1B_32()
1698 ccw->cda = virt_to_dma32(LO_data); in dasd_3990_erp_action_1B_32()
1702 ccw->cmd_code = CCW_CMD_TIC; in dasd_3990_erp_action_1B_32()
1703 ccw->cda = cpa; in dasd_3990_erp_action_1B_32()
1706 erp->flags = default_erp->flags; in dasd_3990_erp_action_1B_32()
1707 erp->function = dasd_3990_erp_action_1B_32; in dasd_3990_erp_action_1B_32()
1708 erp->refers = default_erp->refers; in dasd_3990_erp_action_1B_32()
1709 erp->startdev = device; in dasd_3990_erp_action_1B_32()
1710 erp->memdev = device; in dasd_3990_erp_action_1B_32()
1711 erp->magic = default_erp->magic; in dasd_3990_erp_action_1B_32()
1712 erp->expires = default_erp->expires; in dasd_3990_erp_action_1B_32()
1713 erp->retries = 256; in dasd_3990_erp_action_1B_32()
1714 erp->buildclk = get_tod_clock(); in dasd_3990_erp_action_1B_32()
1715 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_action_1B_32()
1718 dasd_free_erp_request(default_erp, device); in dasd_3990_erp_action_1B_32()
1743 struct dasd_device *device = previous_erp->startdev; in dasd_3990_update_1B() local
1750 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_update_1B()
1752 " - follow on"); in dasd_3990_update_1B()
1757 while (cqr->refers != NULL) { in dasd_3990_update_1B()
1758 cqr = cqr->refers; in dasd_3990_update_1B()
1761 if (scsw_is_tm(&cqr->irb.scsw)) { in dasd_3990_update_1B()
1762 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_update_1B()
1764 " in transport mode - just retry"); in dasd_3990_update_1B()
1770 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_update_1B()
1771 "Imprecise ending is set - just retry"); in dasd_3990_update_1B()
1773 previous_erp->status = DASD_CQR_FILLED; in dasd_3990_update_1B()
1779 /* Imprecise ending is not set -> addr from IRB-SCSW */ in dasd_3990_update_1B()
1780 cpa = previous_erp->irb.scsw.cmd.cpa; in dasd_3990_update_1B()
1783 dev_err(&device->cdev->dev, in dasd_3990_update_1B()
1786 previous_erp->status = DASD_CQR_FAILED; in dasd_3990_update_1B()
1794 LO_data = erp->data + sizeof(struct DE_eckd_data); in dasd_3990_update_1B()
1798 previous_erp->status = DASD_CQR_FAILED; in dasd_3990_update_1B()
1804 /* operation code is WRITE DATA -> data area orientation */ in dasd_3990_update_1B()
1808 /* operation code is FORMAT WRITE -> index orientation */ in dasd_3990_update_1B()
1825 ccw = erp->cpaddr; /* addr of DE ccw */ in dasd_3990_update_1B()
1828 ccw->cda = cpa; in dasd_3990_update_1B()
1830 erp->status = DASD_CQR_FILLED; in dasd_3990_update_1B()
1840 * Handles the compound ERP action retry code.
1859 erp->retries = 1; in dasd_3990_erp_compound_retry()
1863 erp->retries = 2; in dasd_3990_erp_compound_retry()
1867 erp->retries = 10; in dasd_3990_erp_compound_retry()
1871 erp->retries = 256; in dasd_3990_erp_compound_retry()
1878 erp->function = dasd_3990_erp_compound_retry; in dasd_3990_erp_compound_retry()
1886 * Handles the compound ERP action for retry on alternate
1903 if (erp->status == DASD_CQR_FAILED && in dasd_3990_erp_compound_path()
1904 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) { in dasd_3990_erp_compound_path()
1907 erp->lpm = dasd_path_get_opm(erp->startdev); in dasd_3990_erp_compound_path()
1908 erp->status = DASD_CQR_NEED_ERP; in dasd_3990_erp_compound_path()
1912 erp->function = dasd_3990_erp_compound_path; in dasd_3990_erp_compound_path()
1920 * Handles the compound ERP action for retry code.
1945 erp->retries = 1; in dasd_3990_erp_compound_code()
1951 /* should not happen - continue */ in dasd_3990_erp_compound_code()
1956 erp->function = dasd_3990_erp_compound_code; in dasd_3990_erp_compound_code()
1966 * Handles the compound ERP action for configuration
1983 struct dasd_device *device = erp->startdev; in dasd_3990_erp_compound_config() local
1984 dev_err(&device->cdev->dev, in dasd_3990_erp_compound_config()
1985 "Compound configuration error occurred\n"); in dasd_3990_erp_compound_config()
1988 erp->function = dasd_3990_erp_compound_config; in dasd_3990_erp_compound_config()
1996 * Does the further compound program action if
1997 * compound retry was not successful.
2011 if ((erp->function == dasd_3990_erp_compound_retry) && in dasd_3990_erp_compound()
2012 (erp->status == DASD_CQR_NEED_ERP)) { in dasd_3990_erp_compound()
2017 if ((erp->function == dasd_3990_erp_compound_path) && in dasd_3990_erp_compound()
2018 (erp->status == DASD_CQR_NEED_ERP)) { in dasd_3990_erp_compound()
2023 if ((erp->function == dasd_3990_erp_compound_code) && in dasd_3990_erp_compound()
2024 (erp->status == DASD_CQR_NEED_ERP)) { in dasd_3990_erp_compound()
2029 /* if no compound action ERP specified, the request failed */ in dasd_3990_erp_compound()
2030 if (erp->status == DASD_CQR_NEED_ERP) in dasd_3990_erp_compound()
2031 erp->status = DASD_CQR_FAILED; in dasd_3990_erp_compound()
2050 dasd_3990_erp_handle_sim(struct dasd_device *device, char *sense) in dasd_3990_erp_handle_sim() argument
2055 dev_err(&device->cdev->dev, "SIM - SRC: " in dasd_3990_erp_handle_sim()
2060 dev_warn(&device->cdev->dev, "log SIM - SRC: " in dasd_3990_erp_handle_sim()
2085 struct dasd_device *device = erp->startdev; in dasd_3990_erp_inspect_32() local
2087 erp->function = dasd_3990_erp_inspect_32; in dasd_3990_erp_inspect_32()
2091 dasd_3990_erp_handle_sim(device, sense); in dasd_3990_erp_inspect_32()
2095 /* compound program action codes (byte25 bit 0 == '1') */ in dasd_3990_erp_inspect_32()
2103 case 0x00: /* success - use default ERP for retries */ in dasd_3990_erp_inspect_32()
2104 DBF_DEV_EVENT(DBF_DEBUG, device, "%s", in dasd_3990_erp_inspect_32()
2106 " - just retry"); in dasd_3990_erp_inspect_32()
2110 dev_err(&device->cdev->dev, in dasd_3990_erp_inspect_32()
2122 dev_err(&device->cdev->dev, in dasd_3990_erp_inspect_32()
2133 dev_err(&device->cdev->dev, in dasd_3990_erp_inspect_32()
2145 dev_emerg(&device->cdev->dev, in dasd_3990_erp_inspect_32()
2151 ("Invalid data - No way to inform application " in dasd_3990_erp_inspect_32()
2155 case 0x1D: /* state-change pending */ in dasd_3990_erp_inspect_32()
2156 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_inspect_32()
2158 "for the subsystem or device"); in dasd_3990_erp_inspect_32()
2164 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_inspect_32()
2166 "for the subsystem or device"); in dasd_3990_erp_inspect_32()
2170 default: /* all others errors - default erp */ in dasd_3990_erp_inspect_32()
2179 static void dasd_3990_erp_disable_path(struct dasd_device *device, __u8 lpum) in dasd_3990_erp_disable_path() argument
2183 if (!(device->features & DASD_FEATURE_PATH_AUTODISABLE)) { in dasd_3990_erp_disable_path()
2184 dev_err(&device->cdev->dev, in dasd_3990_erp_disable_path()
2186 device->path[pos].cssid, device->path[pos].chpid, lpum); in dasd_3990_erp_disable_path()
2191 if (!(dasd_path_get_opm(device) & ~lpum)) { in dasd_3990_erp_disable_path()
2192 dev_err(&device->cdev->dev, in dasd_3990_erp_disable_path()
2194 device->path[pos].cssid, device->path[pos].chpid, lpum); in dasd_3990_erp_disable_path()
2198 dev_err(&device->cdev->dev, in dasd_3990_erp_disable_path()
2199 "Path %x.%02x (pathmask %02x) is disabled - IFCC threshold exceeded\n", in dasd_3990_erp_disable_path()
2200 device->path[pos].cssid, device->path[pos].chpid, lpum); in dasd_3990_erp_disable_path()
2201 dasd_path_remove_opm(device, lpum); in dasd_3990_erp_disable_path()
2202 dasd_path_add_ifccpm(device, lpum); in dasd_3990_erp_disable_path()
2205 device->path[pos].errorclk = 0; in dasd_3990_erp_disable_path()
2206 atomic_set(&device->path[pos].error_count, 0); in dasd_3990_erp_disable_path()
2211 struct dasd_device *device = erp->startdev; in dasd_3990_erp_account_error() local
2212 __u8 lpum = erp->refers->irb.esw.esw1.lpum; in dasd_3990_erp_account_error()
2216 if (!device->path_thrhld) in dasd_3990_erp_account_error()
2224 if ((tod_to_ns(clk - device->path[pos].errorclk) / NSEC_PER_SEC) in dasd_3990_erp_account_error()
2225 >= device->path_interval) { in dasd_3990_erp_account_error()
2226 atomic_set(&device->path[pos].error_count, 0); in dasd_3990_erp_account_error()
2227 device->path[pos].errorclk = 0; in dasd_3990_erp_account_error()
2229 atomic_inc(&device->path[pos].error_count); in dasd_3990_erp_account_error()
2230 device->path[pos].errorclk = clk; in dasd_3990_erp_account_error()
2232 if (atomic_read(&device->path[pos].error_count) >= in dasd_3990_erp_account_error()
2233 device->path_thrhld) in dasd_3990_erp_account_error()
2234 dasd_3990_erp_disable_path(device, lpum); in dasd_3990_erp_account_error()
2260 struct dasd_device *device = erp->startdev; in dasd_3990_erp_control_check() local
2262 if (scsw_cstat(&erp->refers->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK in dasd_3990_erp_control_check()
2264 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_3990_erp_control_check()
2277 * the 24-byte or the 32-byte inspection routine.
2300 sense = dasd_get_sense(&erp->refers->irb); in dasd_3990_erp_inspect()
2332 * cqr head of the current ERP-chain (or single cqr if
2335 * erp pointer to new ERP-chain head
2340 struct dasd_device *device = cqr->startdev; in dasd_3990_erp_add_erp() local
2347 if (cqr->cpmode == 1) { in dasd_3990_erp_add_erp()
2357 erp = dasd_alloc_erp_request(cqr->magic, in dasd_3990_erp_add_erp()
2358 cplength, datasize, device); in dasd_3990_erp_add_erp()
2360 if (cqr->retries <= 0) { in dasd_3990_erp_add_erp()
2361 DBF_DEV_EVENT(DBF_ERR, device, "%s", in dasd_3990_erp_add_erp()
2363 cqr->status = DASD_CQR_FAILED; in dasd_3990_erp_add_erp()
2364 cqr->stopclk = get_tod_clock(); in dasd_3990_erp_add_erp()
2366 DBF_DEV_EVENT(DBF_ERR, device, in dasd_3990_erp_add_erp()
2369 cqr->retries); in dasd_3990_erp_add_erp()
2370 dasd_block_set_timer(device->block, (HZ << 3)); in dasd_3990_erp_add_erp()
2375 ccw = cqr->cpaddr; in dasd_3990_erp_add_erp()
2376 if (cqr->cpmode == 1) { in dasd_3990_erp_add_erp()
2378 erp->cpmode = 1; in dasd_3990_erp_add_erp()
2379 erp->cpaddr = PTR_ALIGN(erp->data, 64); in dasd_3990_erp_add_erp()
2380 tcw = erp->cpaddr; in dasd_3990_erp_add_erp()
2382 *tcw = *((struct tcw *)cqr->cpaddr); in dasd_3990_erp_add_erp()
2383 tcw->tsb = virt_to_dma64(tsb); in dasd_3990_erp_add_erp()
2384 } else if (ccw->cmd_code == DASD_ECKD_CCW_PSF) { in dasd_3990_erp_add_erp()
2386 erp->cpaddr = cqr->cpaddr; in dasd_3990_erp_add_erp()
2389 ccw = erp->cpaddr; in dasd_3990_erp_add_erp()
2390 ccw->cmd_code = CCW_CMD_NOOP; in dasd_3990_erp_add_erp()
2391 ccw->flags = CCW_FLAG_CC; in dasd_3990_erp_add_erp()
2393 ccw->cmd_code = CCW_CMD_TIC; in dasd_3990_erp_add_erp()
2394 ccw->cda = virt_to_dma32(cqr->cpaddr); in dasd_3990_erp_add_erp()
2397 erp->flags = cqr->flags; in dasd_3990_erp_add_erp()
2398 erp->function = dasd_3990_erp_add_erp; in dasd_3990_erp_add_erp()
2399 erp->refers = cqr; in dasd_3990_erp_add_erp()
2400 erp->startdev = device; in dasd_3990_erp_add_erp()
2401 erp->memdev = device; in dasd_3990_erp_add_erp()
2402 erp->block = cqr->block; in dasd_3990_erp_add_erp()
2403 erp->magic = cqr->magic; in dasd_3990_erp_add_erp()
2404 erp->expires = cqr->expires; in dasd_3990_erp_add_erp()
2405 erp->retries = device->default_retries; in dasd_3990_erp_add_erp()
2406 erp->buildclk = get_tod_clock(); in dasd_3990_erp_add_erp()
2407 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_add_erp()
2417 * Add ERP to the head of the ERP-chain containing the ERP processing
2421 * cqr head of the current ERP-chain (or single cqr if
2425 * erp pointer to new ERP-chain head
2453 * Check if the device status of the given cqr is the same.
2472 if (cqr1->startdev != cqr2->startdev) in dasd_3990_erp_error_match()
2475 sense1 = dasd_get_sense(&cqr1->irb); in dasd_3990_erp_error_match()
2476 sense2 = dasd_get_sense(&cqr2->irb); in dasd_3990_erp_error_match()
2478 /* one request has sense data, the other not -> no match, return 0 */ in dasd_3990_erp_error_match()
2481 /* no sense data in both cases -> check cstat for IFCC */ in dasd_3990_erp_error_match()
2483 if ((scsw_cstat(&cqr1->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK | in dasd_3990_erp_error_match()
2485 (scsw_cstat(&cqr2->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK | in dasd_3990_erp_error_match()
2489 /* check sense data; byte 0-2,25,27 */ in dasd_3990_erp_error_match()
2507 * quick exit if current cqr is not an ERP (cqr->refers=NULL)
2513 * erp erp-pointer to the already defined error
2525 if (cqr->refers == NULL) { /* return if not in erp */ in dasd_3990_erp_in_erp()
2531 match = dasd_3990_erp_error_match(erp_head, cqr->refers); in dasd_3990_erp_in_erp()
2533 cqr = cqr->refers; /* check next erp/cqr in queue */ in dasd_3990_erp_in_erp()
2535 } while ((cqr->refers != NULL) && (!match)); in dasd_3990_erp_in_erp()
2551 * - do further defined ERP action or
2552 * - wait for interrupt or
2553 * - exit with permanent error
2565 struct dasd_device *device = erp->startdev; in dasd_3990_erp_further_erp() local
2566 char *sense = dasd_get_sense(&erp->irb); in dasd_3990_erp_further_erp()
2569 if ((erp->function == dasd_3990_erp_bus_out) || in dasd_3990_erp_further_erp()
2570 (erp->function == dasd_3990_erp_action_1) || in dasd_3990_erp_further_erp()
2571 (erp->function == dasd_3990_erp_action_4)) { in dasd_3990_erp_further_erp()
2575 } else if (erp->function == dasd_3990_erp_action_1_sec) { in dasd_3990_erp_further_erp()
2577 } else if (erp->function == dasd_3990_erp_action_5) { in dasd_3990_erp_further_erp()
2605 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_3990_erp_further_erp()
2614 ((erp->function == dasd_3990_erp_compound_retry) || in dasd_3990_erp_further_erp()
2615 (erp->function == dasd_3990_erp_compound_path) || in dasd_3990_erp_further_erp()
2616 (erp->function == dasd_3990_erp_compound_code) || in dasd_3990_erp_further_erp()
2617 (erp->function == dasd_3990_erp_compound_config))) { in dasd_3990_erp_further_erp()
2626 dev_err(&device->cdev->dev, in dasd_3990_erp_further_erp()
2629 erp->status = DASD_CQR_FAILED; in dasd_3990_erp_further_erp()
2648 * erp_head first ERP in ERP-chain
2660 struct dasd_device *device = erp_head->startdev; in dasd_3990_erp_handle_match_erp() local
2670 /* remove the request from the device queue */ in dasd_3990_erp_handle_match_erp()
2671 list_del(&erp_done->blocklist); in dasd_3990_erp_handle_match_erp()
2674 erp_done = erp_done->refers; in dasd_3990_erp_handle_match_erp()
2677 dasd_free_erp_request(erp_free, erp_free->memdev); in dasd_3990_erp_handle_match_erp()
2681 if (erp->retries > 0) { in dasd_3990_erp_handle_match_erp()
2683 char *sense = dasd_get_sense(&erp->refers->irb); in dasd_3990_erp_handle_match_erp()
2686 if (sense && erp->function == dasd_3990_erp_action_4) { in dasd_3990_erp_handle_match_erp()
2691 erp->function == dasd_3990_erp_action_1B_32) { in dasd_3990_erp_handle_match_erp()
2695 } else if (sense && erp->function == dasd_3990_erp_int_req) { in dasd_3990_erp_handle_match_erp()
2701 DBF_DEV_EVENT(DBF_DEBUG, device, in dasd_3990_erp_handle_match_erp()
2703 erp->retries, erp); in dasd_3990_erp_handle_match_erp()
2706 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_handle_match_erp()
2710 /* no retry left - check for further necessary action */ in dasd_3990_erp_handle_match_erp()
2730 * erp erp-pointer to the head of the ERP action chain.
2732 * - either a ptr to an additional ERP cqr or
2733 * - the original given cqr (which's status might
2740 struct dasd_device *device = cqr->startdev; in dasd_3990_erp_action() local
2743 if (device->features & DASD_FEATURE_ERPLOG) { in dasd_3990_erp_action()
2745 dev_err(&device->cdev->dev, in dasd_3990_erp_action()
2746 "ERP chain at BEGINNING of ERP-ACTION\n"); in dasd_3990_erp_action()
2748 temp_erp != NULL; temp_erp = temp_erp->refers) { in dasd_3990_erp_action()
2749 dev_err(&device->cdev->dev, in dasd_3990_erp_action()
2751 temp_erp, temp_erp->status, temp_erp->refers); in dasd_3990_erp_action()
2755 /* double-check if current erp/cqr was successful */ in dasd_3990_erp_action()
2756 if ((scsw_cstat(&cqr->irb.scsw) == 0x00) && in dasd_3990_erp_action()
2757 (scsw_dstat(&cqr->irb.scsw) == in dasd_3990_erp_action()
2760 DBF_DEV_EVENT(DBF_DEBUG, device, in dasd_3990_erp_action()
2762 " - NO ERP necessary", cqr); in dasd_3990_erp_action()
2764 cqr->status = DASD_CQR_DONE; in dasd_3990_erp_action()
2773 /* no matching erp found - set up erp */ in dasd_3990_erp_action()
2778 /* matching erp found - set all leading erp's to DONE */ in dasd_3990_erp_action()
2788 if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) { in dasd_3990_erp_action()
2789 erp->lpm = cqr->lpm; in dasd_3990_erp_action()
2792 if (device->features & DASD_FEATURE_ERPLOG) { in dasd_3990_erp_action()
2794 dev_err(&device->cdev->dev, in dasd_3990_erp_action()
2795 "ERP chain at END of ERP-ACTION\n"); in dasd_3990_erp_action()
2797 temp_erp != NULL; temp_erp = temp_erp->refers) { in dasd_3990_erp_action()
2798 dev_err(&device->cdev->dev, in dasd_3990_erp_action()
2800 temp_erp, temp_erp->status, temp_erp->refers); in dasd_3990_erp_action()
2805 if (list_empty(&erp->blocklist)) { in dasd_3990_erp_action()
2806 cqr->status = DASD_CQR_IN_ERP; in dasd_3990_erp_action()
2808 list_add_tail(&erp->blocklist, &cqr->blocklist); in dasd_3990_erp_action()