Lines Matching +full:current +full:- +full:sense

1 // SPDX-License-Identifier: GPL-2.0
10 #define KMSG_COMPONENT "dasd-eckd"
34 * 24 and 32 byte sense ERP functions
55 struct dasd_ccw_req *cqr = erp->refers; in dasd_3990_erp_cleanup()
57 dasd_free_erp_request(erp, erp->memdev); in dasd_3990_erp_cleanup()
58 cqr->status = final_status; in dasd_3990_erp_cleanup()
74 struct dasd_device *device = erp->startdev; in dasd_3990_erp_block_queue()
80 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_3990_erp_block_queue()
82 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_3990_erp_block_queue()
83 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_block_queue()
84 if (erp->block) in dasd_3990_erp_block_queue()
85 dasd_block_set_timer(erp->block, expires); in dasd_3990_erp_block_queue()
98 * erp current erp
106 struct dasd_device *device = erp->startdev; in dasd_3990_erp_int_req()
111 if (erp->function != dasd_3990_erp_int_req) { in dasd_3990_erp_int_req()
113 erp->retries = 256; in dasd_3990_erp_int_req()
114 erp->function = dasd_3990_erp_int_req; in dasd_3990_erp_int_req()
119 dev_err(&device->cdev->dev, in dasd_3990_erp_int_req()
120 "is offline or not installed - " in dasd_3990_erp_int_req()
139 * erp pointer to the current ERP
147 struct dasd_device *device = erp->startdev; in dasd_3990_erp_alternate_path()
152 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_3990_erp_alternate_path()
153 opm = ccw_device_get_path_mask(device->cdev); in dasd_3990_erp_alternate_path()
154 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_3990_erp_alternate_path()
155 if (erp->lpm == 0) in dasd_3990_erp_alternate_path()
156 erp->lpm = dasd_path_get_opm(device) & in dasd_3990_erp_alternate_path()
157 ~(erp->irb.esw.esw0.sublog.lpum); in dasd_3990_erp_alternate_path()
159 erp->lpm &= ~(erp->irb.esw.esw0.sublog.lpum); in dasd_3990_erp_alternate_path()
161 if ((erp->lpm & opm) != 0x00) { in dasd_3990_erp_alternate_path()
165 erp->lpm, erp->irb.esw.esw0.sublog.lpum, opm); in dasd_3990_erp_alternate_path()
168 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_alternate_path()
169 erp->retries = 10; in dasd_3990_erp_alternate_path()
171 dev_err(&device->cdev->dev, in dasd_3990_erp_alternate_path()
173 "/opm=%x)\n", erp->irb.esw.esw0.sublog.lpum, opm); in dasd_3990_erp_alternate_path()
176 erp->status = DASD_CQR_FAILED; in dasd_3990_erp_alternate_path()
188 * erp pointer to the current (failed) ERP
199 struct dasd_device *device = erp->startdev; in dasd_3990_erp_DCTL()
204 dctl_cqr = dasd_alloc_erp_request(erp->magic, 1, in dasd_3990_erp_DCTL()
208 dev_err(&device->cdev->dev, in dasd_3990_erp_DCTL()
209 "Unable to allocate DCTL-CQR\n"); in dasd_3990_erp_DCTL()
210 erp->status = DASD_CQR_FAILED; in dasd_3990_erp_DCTL()
214 DCTL_data = dctl_cqr->data; in dasd_3990_erp_DCTL()
216 DCTL_data->subcommand = 0x02; /* Inhibit Write */ in dasd_3990_erp_DCTL()
217 DCTL_data->modifier = modifier; in dasd_3990_erp_DCTL()
219 ccw = dctl_cqr->cpaddr; in dasd_3990_erp_DCTL()
221 ccw->cmd_code = CCW_CMD_DCTL; in dasd_3990_erp_DCTL()
222 ccw->count = 4; in dasd_3990_erp_DCTL()
223 ccw->cda = (__u32)(addr_t) DCTL_data; in dasd_3990_erp_DCTL()
224 dctl_cqr->flags = erp->flags; in dasd_3990_erp_DCTL()
225 dctl_cqr->function = dasd_3990_erp_DCTL; in dasd_3990_erp_DCTL()
226 dctl_cqr->refers = erp; in dasd_3990_erp_DCTL()
227 dctl_cqr->startdev = device; in dasd_3990_erp_DCTL()
228 dctl_cqr->memdev = device; in dasd_3990_erp_DCTL()
229 dctl_cqr->magic = erp->magic; in dasd_3990_erp_DCTL()
230 dctl_cqr->expires = 5 * 60 * HZ; in dasd_3990_erp_DCTL()
231 dctl_cqr->retries = 2; in dasd_3990_erp_DCTL()
233 dctl_cqr->buildclk = get_tod_clock(); in dasd_3990_erp_DCTL()
235 dctl_cqr->status = DASD_CQR_FILLED; in dasd_3990_erp_DCTL()
256 * erp pointer to the current ERP
264 erp->function = dasd_3990_erp_action_1_sec; in dasd_3990_erp_action_1_sec()
271 erp->function = dasd_3990_erp_action_1; in dasd_3990_erp_action_1()
273 if (erp->status == DASD_CQR_FAILED && in dasd_3990_erp_action_1()
274 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) { in dasd_3990_erp_action_1()
275 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_action_1()
276 erp->retries = 10; in dasd_3990_erp_action_1()
277 erp->lpm = dasd_path_get_opm(erp->startdev); in dasd_3990_erp_action_1()
278 erp->function = dasd_3990_erp_action_1_sec; in dasd_3990_erp_action_1()
288 * Set the current request to PENDING to block the CQR queue for that device
294 * sense sense data of the actual error
295 * erp pointer to the current ERP
302 dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_action_4() argument
305 struct dasd_device *device = erp->startdev; in dasd_3990_erp_action_4()
310 if (erp->function != dasd_3990_erp_action_4) { in dasd_3990_erp_action_4()
315 erp->retries = 256; in dasd_3990_erp_action_4()
316 erp->function = dasd_3990_erp_action_4; in dasd_3990_erp_action_4()
319 if (sense && (sense[25] == 0x1D)) { /* state change pending */ in dasd_3990_erp_action_4()
324 erp->retries); in dasd_3990_erp_action_4()
328 } else if (sense && (sense[25] == 0x1E)) { /* busy */ in dasd_3990_erp_action_4()
330 "busy - redriving request later, " in dasd_3990_erp_action_4()
332 erp->retries); in dasd_3990_erp_action_4()
335 /* no state change pending - retry */ in dasd_3990_erp_action_4()
339 erp->retries); in dasd_3990_erp_action_4()
340 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_action_4()
350 * 24 byte sense ERP functions (only)
362 * erp pointer to the current ERP
373 erp->retries = 10; in dasd_3990_erp_action_5()
374 erp->function = dasd_3990_erp_action_5; in dasd_3990_erp_action_5()
385 * Does a analysis of the sense data (message Format)
389 * sense current sense data
395 dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense) in dasd_3990_handle_env_data() argument
398 struct dasd_device *device = erp->startdev; in dasd_3990_handle_env_data()
399 char msg_format = (sense[7] & 0xF0); in dasd_3990_handle_env_data()
400 char msg_no = (sense[7] & 0x0F); in dasd_3990_handle_env_data()
404 case 0x00: /* Format 0 - Program or System Checks */ in dasd_3990_handle_env_data()
406 if (sense[1] & 0x10) { /* check message to operator bit */ in dasd_3990_handle_env_data()
412 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
413 "FORMAT 0 - Invalid Command\n"); in dasd_3990_handle_env_data()
416 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
417 "FORMAT 0 - Invalid Command " in dasd_3990_handle_env_data()
421 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
422 "FORMAT 0 - CCW Count less than " in dasd_3990_handle_env_data()
426 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
427 "FORMAT 0 - Invalid Parameter\n"); in dasd_3990_handle_env_data()
430 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
431 "FORMAT 0 - Diagnostic of Special" in dasd_3990_handle_env_data()
435 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
436 "FORMAT 0 - Channel Returned with " in dasd_3990_handle_env_data()
440 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
441 "FORMAT 0 - Reset Notification\n"); in dasd_3990_handle_env_data()
444 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
445 "FORMAT 0 - Storage Path Restart\n"); in dasd_3990_handle_env_data()
448 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
449 "FORMAT 0 - Channel requested " in dasd_3990_handle_env_data()
450 "... %02x\n", sense[8]); in dasd_3990_handle_env_data()
453 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
454 "FORMAT 0 - Invalid Defective/" in dasd_3990_handle_env_data()
458 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
459 "FORMAT 0 - DPS Installation " in dasd_3990_handle_env_data()
463 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
464 "FORMAT 0 - Command Invalid on " in dasd_3990_handle_env_data()
468 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
469 "FORMAT 0 - Status Not As " in dasd_3990_handle_env_data()
471 sense[8]); in dasd_3990_handle_env_data()
474 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
475 "FORMAT 0 - Reserved\n"); in dasd_3990_handle_env_data()
482 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
483 "FORMAT 0 - Device Error " in dasd_3990_handle_env_data()
487 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
488 "FORMAT 0 - Reserved\n"); in dasd_3990_handle_env_data()
491 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
492 "FORMAT 0 - Device Fenced - " in dasd_3990_handle_env_data()
493 "device = %02x\n", sense[4]); in dasd_3990_handle_env_data()
496 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
497 "FORMAT 0 - Data Pinned for " in dasd_3990_handle_env_data()
501 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
502 "FORMAT 0 - Reserved\n"); in dasd_3990_handle_env_data()
507 case 0x10: /* Format 1 - Device Equipment Checks */ in dasd_3990_handle_env_data()
512 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
513 "FORMAT 1 - Device Status 1 not as " in dasd_3990_handle_env_data()
517 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
518 "FORMAT 1 - Index missing\n"); in dasd_3990_handle_env_data()
521 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
522 "FORMAT 1 - Interruption cannot be " in dasd_3990_handle_env_data()
526 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
527 "FORMAT 1 - Device did not respond to " in dasd_3990_handle_env_data()
531 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
532 "FORMAT 1 - Device check-2 error or Set " in dasd_3990_handle_env_data()
536 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
537 "FORMAT 1 - Head address does not " in dasd_3990_handle_env_data()
541 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
542 "FORMAT 1 - Device status 1 not valid\n"); in dasd_3990_handle_env_data()
545 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
546 "FORMAT 1 - Device not ready\n"); in dasd_3990_handle_env_data()
549 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
550 "FORMAT 1 - Track physical address did " in dasd_3990_handle_env_data()
554 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
555 "FORMAT 1 - Missing device address bit\n"); in dasd_3990_handle_env_data()
558 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
559 "FORMAT 1 - Drive motor switch is off\n"); in dasd_3990_handle_env_data()
562 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
563 "FORMAT 1 - Seek incomplete\n"); in dasd_3990_handle_env_data()
566 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
567 "FORMAT 1 - Cylinder address did not " in dasd_3990_handle_env_data()
571 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
572 "FORMAT 1 - Offset active cannot be " in dasd_3990_handle_env_data()
576 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
577 "FORMAT 1 - Reserved\n"); in dasd_3990_handle_env_data()
581 case 0x20: /* Format 2 - 3990 Equipment Checks */ in dasd_3990_handle_env_data()
584 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
585 "FORMAT 2 - 3990 check-2 error\n"); in dasd_3990_handle_env_data()
588 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
589 "FORMAT 2 - Support facility errors\n"); in dasd_3990_handle_env_data()
592 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
593 "FORMAT 2 - Microcode detected error " in dasd_3990_handle_env_data()
595 sense[8]); in dasd_3990_handle_env_data()
598 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
599 "FORMAT 2 - Reserved\n"); in dasd_3990_handle_env_data()
603 case 0x30: /* Format 3 - 3990 Control Checks */ in dasd_3990_handle_env_data()
606 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
607 "FORMAT 3 - Allegiance terminated\n"); in dasd_3990_handle_env_data()
610 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
611 "FORMAT 3 - Reserved\n"); in dasd_3990_handle_env_data()
615 case 0x40: /* Format 4 - Data Checks */ in dasd_3990_handle_env_data()
618 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
619 "FORMAT 4 - Home address area error\n"); in dasd_3990_handle_env_data()
622 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
623 "FORMAT 4 - Count area error\n"); in dasd_3990_handle_env_data()
626 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
627 "FORMAT 4 - Key area error\n"); in dasd_3990_handle_env_data()
630 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
631 "FORMAT 4 - Data area error\n"); 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 home 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 count address " in dasd_3990_handle_env_data()
644 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
645 "FORMAT 4 - No sync byte in key area\n"); in dasd_3990_handle_env_data()
648 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
649 "FORMAT 4 - No sync byte in data area\n"); in dasd_3990_handle_env_data()
652 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
653 "FORMAT 4 - Home address area error; " in dasd_3990_handle_env_data()
657 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
658 "FORMAT 4 - Count area error; offset " in dasd_3990_handle_env_data()
662 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
663 "FORMAT 4 - Key area error; offset " in dasd_3990_handle_env_data()
667 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
668 "FORMAT 4 - Data area error; " 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 home " 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 count " 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 key area; " in dasd_3990_handle_env_data()
687 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
688 "FORMAT 4 - No sync byte in data area; " in dasd_3990_handle_env_data()
692 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
693 "FORMAT 4 - Reserved\n"); in dasd_3990_handle_env_data()
697 case 0x50: /* Format 5 - Data Check with displacement information */ 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 " 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 count " in dasd_3990_handle_env_data()
710 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
711 "FORMAT 5 - Data Check in the key area\n"); 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 data " 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 " 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 count 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 key area; " in dasd_3990_handle_env_data()
734 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
735 "FORMAT 5 - Data Check in the data area; " in dasd_3990_handle_env_data()
739 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
740 "FORMAT 5 - Reserved\n"); in dasd_3990_handle_env_data()
744 case 0x60: /* Format 6 - Usage Statistics/Overrun Errors */ in dasd_3990_handle_env_data()
747 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
748 "FORMAT 6 - Overrun on channel A\n"); in dasd_3990_handle_env_data()
751 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
752 "FORMAT 6 - Overrun on channel B\n"); in dasd_3990_handle_env_data()
755 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
756 "FORMAT 6 - Overrun on channel C\n"); in dasd_3990_handle_env_data()
759 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
760 "FORMAT 6 - Overrun on channel D\n"); in dasd_3990_handle_env_data()
763 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
764 "FORMAT 6 - Overrun on channel E\n"); in dasd_3990_handle_env_data()
767 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
768 "FORMAT 6 - Overrun on channel F\n"); in dasd_3990_handle_env_data()
771 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
772 "FORMAT 6 - Overrun on channel G\n"); in dasd_3990_handle_env_data()
775 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
776 "FORMAT 6 - Overrun on channel H\n"); in dasd_3990_handle_env_data()
779 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
780 "FORMAT 6 - Reserved\n"); in dasd_3990_handle_env_data()
784 case 0x70: /* Format 7 - Device Connection Control Checks */ in dasd_3990_handle_env_data()
787 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
788 "FORMAT 7 - RCC initiated by a connection " in dasd_3990_handle_env_data()
792 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
793 "FORMAT 7 - RCC 1 sequence not " in dasd_3990_handle_env_data()
797 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
798 "FORMAT 7 - RCC 1 and RCC 2 sequences not " in dasd_3990_handle_env_data()
802 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
803 "FORMAT 7 - Invalid tag-in during " in dasd_3990_handle_env_data()
807 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
808 "FORMAT 7 - extra RCC required\n"); in dasd_3990_handle_env_data()
811 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
812 "FORMAT 7 - Invalid DCC selection " 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 - Missing end operation; device " 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 - Invalid tag-in for an " in dasd_3990_handle_env_data()
836 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
837 "FORMAT 7 - 3990 microcode time out when " in dasd_3990_handle_env_data()
841 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
842 "FORMAT 7 - No response to selection " in dasd_3990_handle_env_data()
846 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
847 "FORMAT 7 - Permanent path error (DASD " in dasd_3990_handle_env_data()
851 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
852 "FORMAT 7 - DASD controller not available" in dasd_3990_handle_env_data()
856 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
857 "FORMAT 7 - Reserved\n"); in dasd_3990_handle_env_data()
861 case 0x80: /* Format 8 - Additional Device Equipment Checks */ in dasd_3990_handle_env_data()
865 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
866 "FORMAT 8 - Error correction code " in dasd_3990_handle_env_data()
870 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
871 "FORMAT 8 - Unexpected end operation " 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 - End operation with transfer " in dasd_3990_handle_env_data()
885 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
886 "FORMAT 8 - DPS checks after a system " in dasd_3990_handle_env_data()
890 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
891 "FORMAT 8 - DPS cannot be filled\n"); in dasd_3990_handle_env_data()
894 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
895 "FORMAT 8 - Short busy time-out during " in dasd_3990_handle_env_data()
899 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
900 "FORMAT 8 - DASD controller failed to " in dasd_3990_handle_env_data()
904 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
905 "FORMAT 8 - No interruption from device " in dasd_3990_handle_env_data()
909 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
910 "FORMAT 8 - Reserved\n"); in dasd_3990_handle_env_data()
914 case 0x90: /* Format 9 - Device Read, Write, and Seek Checks */ in dasd_3990_handle_env_data()
919 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
920 "FORMAT 9 - Device check-2 error\n"); in dasd_3990_handle_env_data()
923 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
924 "FORMAT 9 - Head address did not " in dasd_3990_handle_env_data()
928 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
929 "FORMAT 9 - Track physical address did " in dasd_3990_handle_env_data()
933 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
934 "FORMAT 9 - Cylinder address did not " in dasd_3990_handle_env_data()
938 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
939 "FORMAT 9 - Reserved\n"); in dasd_3990_handle_env_data()
943 case 0xF0: /* Format F - Cache Storage Checks */ in dasd_3990_handle_env_data()
946 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
947 "FORMAT F - Operation Terminated\n"); in dasd_3990_handle_env_data()
950 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
951 "FORMAT F - Subsystem Processing Error\n"); in dasd_3990_handle_env_data()
954 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
955 "FORMAT F - Cache or nonvolatile storage " in dasd_3990_handle_env_data()
959 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
960 "FORMAT F - Caching terminated\n"); in dasd_3990_handle_env_data()
963 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
964 "FORMAT F - Cache fast write access not " in dasd_3990_handle_env_data()
968 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
969 "FORMAT F - Track format incorrect\n"); in dasd_3990_handle_env_data()
972 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
973 "FORMAT F - Caching reinitiated\n"); in dasd_3990_handle_env_data()
976 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
977 "FORMAT F - Nonvolatile storage " in dasd_3990_handle_env_data()
981 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
982 "FORMAT F - Volume is suspended duplex\n"); in dasd_3990_handle_env_data()
984 dasd_eer_write(device, erp->refers, in dasd_3990_handle_env_data()
988 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
989 "FORMAT F - Subsystem status cannot be " in dasd_3990_handle_env_data()
993 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
994 "FORMAT F - Caching status reset to " in dasd_3990_handle_env_data()
998 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
999 "FORMAT F - DASD Fast Write inhibited\n"); in dasd_3990_handle_env_data()
1002 dev_warn(&device->cdev->dev, in dasd_3990_handle_env_data()
1003 "FORMAT F - Reserved\n"); in dasd_3990_handle_env_data()
1007 default: /* unknown message format - should not happen in dasd_3990_handle_env_data()
1008 internal error 03 - unknown message format */ in dasd_3990_handle_env_data()
1010 dev_err(&device->cdev->dev, in dasd_3990_handle_env_data()
1025 * erp current erp_head
1026 * sense current sense data
1029 * erp 'new' erp_head - pointer to new ERP
1032 dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_com_rej() argument
1035 struct dasd_device *device = erp->startdev; in dasd_3990_erp_com_rej()
1037 erp->function = dasd_3990_erp_com_rej; in dasd_3990_erp_com_rej()
1039 /* env data present (ACTION 10 - retry should work) */ in dasd_3990_erp_com_rej()
1040 if (sense[2] & SNS2_ENV_DATA_PRESENT) { in dasd_3990_erp_com_rej()
1043 "Command Reject - environmental data present"); in dasd_3990_erp_com_rej()
1045 dasd_3990_handle_env_data(erp, sense); in dasd_3990_erp_com_rej()
1047 erp->retries = 5; in dasd_3990_erp_com_rej()
1049 } else if (sense[1] & SNS1_WRITE_INHIBITED) { in dasd_3990_erp_com_rej()
1050 dev_err(&device->cdev->dev, "An I/O request was rejected" in dasd_3990_erp_com_rej()
1053 } else if (sense[7] & SNS7_INVALID_ON_SEC) { in dasd_3990_erp_com_rej()
1054 dev_err(&device->cdev->dev, "An I/O request was rejected on a copy pair secondary device\n"); in dasd_3990_erp_com_rej()
1055 /* suppress dump of sense data for this error */ in dasd_3990_erp_com_rej()
1056 set_bit(DASD_CQR_SUPPRESS_CR, &erp->refers->flags); in dasd_3990_erp_com_rej()
1059 /* fatal error - set status to FAILED in dasd_3990_erp_com_rej()
1060 internal error 09 - Command Reject */ in dasd_3990_erp_com_rej()
1061 if (!test_bit(DASD_CQR_SUPPRESS_CR, &erp->flags)) in dasd_3990_erp_com_rej()
1062 dev_err(&device->cdev->dev, in dasd_3990_erp_com_rej()
1079 * erp current erp_head
1081 * erp new erp_head - pointer to new ERP
1087 struct dasd_device *device = erp->startdev; in dasd_3990_erp_bus_out()
1092 if (erp->function != dasd_3990_erp_bus_out) { in dasd_3990_erp_bus_out()
1093 erp->retries = 256; in dasd_3990_erp_bus_out()
1094 erp->function = dasd_3990_erp_bus_out; in dasd_3990_erp_bus_out()
1118 * erp current erp_head
1120 * erp new erp_head - pointer to new ERP
1123 dasd_3990_erp_equip_check(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_equip_check() argument
1126 struct dasd_device *device = erp->startdev; in dasd_3990_erp_equip_check()
1128 erp->function = dasd_3990_erp_equip_check; in dasd_3990_erp_equip_check()
1130 if (sense[1] & SNS1_WRITE_INHIBITED) { in dasd_3990_erp_equip_check()
1131 dev_info(&device->cdev->dev, in dasd_3990_erp_equip_check()
1135 internal error 04 - Path should be varied off-line.*/ in dasd_3990_erp_equip_check()
1136 dev_err(&device->cdev->dev, "An error occurred in the DASD " in dasd_3990_erp_equip_check()
1141 } else if (sense[2] & SNS2_ENV_DATA_PRESENT) { in dasd_3990_erp_equip_check()
1144 "Equipment Check - " "environmental data present"); in dasd_3990_erp_equip_check()
1146 dasd_3990_handle_env_data(erp, sense); in dasd_3990_erp_equip_check()
1148 erp = dasd_3990_erp_action_4(erp, sense); in dasd_3990_erp_equip_check()
1150 } else if (sense[1] & SNS1_PERM_ERR) { in dasd_3990_erp_equip_check()
1153 "Equipment Check - retry exhausted or " in dasd_3990_erp_equip_check()
1159 /* all other equipment checks - Action 5 */ in dasd_3990_erp_equip_check()
1177 * erp current erp_head
1179 * erp new erp_head - pointer to new ERP
1182 dasd_3990_erp_data_check(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_data_check() argument
1185 struct dasd_device *device = erp->startdev; in dasd_3990_erp_data_check()
1187 erp->function = dasd_3990_erp_data_check; in dasd_3990_erp_data_check()
1189 if (sense[2] & SNS2_CORRECTABLE) { /* correctable data check */ in dasd_3990_erp_data_check()
1192 dev_emerg(&device->cdev->dev, in dasd_3990_erp_data_check()
1200 } else if (sense[2] & SNS2_ENV_DATA_PRESENT) { in dasd_3990_erp_data_check()
1206 erp = dasd_3990_erp_action_4(erp, sense); in dasd_3990_erp_data_check()
1208 } else if (sense[1] & SNS1_PERM_ERR) { in dasd_3990_erp_data_check()
1236 * erp current erp_head
1238 * erp new erp_head - pointer to new ERP
1241 dasd_3990_erp_overrun(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_overrun() argument
1244 struct dasd_device *device = erp->startdev; in dasd_3990_erp_overrun()
1246 erp->function = dasd_3990_erp_overrun; in dasd_3990_erp_overrun()
1249 "Overrun - service overrun or overrun" in dasd_3990_erp_overrun()
1265 * erp current erp_head
1267 * erp new erp_head - pointer to new ERP
1270 dasd_3990_erp_inv_format(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_inv_format() argument
1273 struct dasd_device *device = erp->startdev; in dasd_3990_erp_inv_format()
1275 erp->function = dasd_3990_erp_inv_format; in dasd_3990_erp_inv_format()
1277 if (sense[2] & SNS2_ENV_DATA_PRESENT) { in dasd_3990_erp_inv_format()
1283 dasd_3990_handle_env_data(erp, sense); in dasd_3990_erp_inv_format()
1285 erp = dasd_3990_erp_action_4(erp, sense); in dasd_3990_erp_inv_format()
1288 /* internal error 06 - The track format is not valid*/ in dasd_3990_erp_inv_format()
1289 dev_err(&device->cdev->dev, in dasd_3990_erp_inv_format()
1304 * Handles 24 byte 'End-of-Cylinder' error.
1312 dasd_3990_erp_EOC(struct dasd_ccw_req * default_erp, char *sense) in dasd_3990_erp_EOC() argument
1315 struct dasd_device *device = default_erp->startdev; in dasd_3990_erp_EOC()
1317 dev_err(&device->cdev->dev, in dasd_3990_erp_EOC()
1320 /* implement action 7 - BUG */ in dasd_3990_erp_EOC()
1329 * Handles 24 byte 'Environmental-Data Present' error.
1332 * erp current erp_head
1334 * erp new erp_head - pointer to new ERP
1337 dasd_3990_erp_env_data(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_env_data() argument
1340 struct dasd_device *device = erp->startdev; in dasd_3990_erp_env_data()
1342 erp->function = dasd_3990_erp_env_data; in dasd_3990_erp_env_data()
1346 dasd_3990_handle_env_data(erp, sense); in dasd_3990_erp_env_data()
1349 if (sense[7] != 0x0F) { in dasd_3990_erp_env_data()
1350 erp = dasd_3990_erp_action_4(erp, sense); in dasd_3990_erp_env_data()
1352 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_env_data()
1369 * erp new erp_head - pointer to new ERP
1372 dasd_3990_erp_no_rec(struct dasd_ccw_req * default_erp, char *sense) in dasd_3990_erp_no_rec() argument
1375 struct dasd_device *device = default_erp->startdev; in dasd_3990_erp_no_rec()
1382 if (!test_bit(DASD_CQR_SUPPRESS_NRF, &default_erp->flags)) in dasd_3990_erp_no_rec()
1383 dev_err(&device->cdev->dev, in dasd_3990_erp_no_rec()
1399 * erp current erp_head
1401 * erp new erp_head - pointer to new ERP
1407 struct dasd_device *device = erp->startdev; in dasd_3990_erp_file_prot()
1414 if (!test_bit(DASD_CQR_SUPPRESS_FP, &erp->flags)) in dasd_3990_erp_file_prot()
1415 dev_err(&device->cdev->dev, in dasd_3990_erp_file_prot()
1440 struct dasd_ccw_req *cqr = erp->refers; in dasd_3990_erp_inspect_alias()
1441 char *sense; in dasd_3990_erp_inspect_alias() local
1443 if (cqr->block && in dasd_3990_erp_inspect_alias()
1444 (cqr->block->base != cqr->startdev)) { in dasd_3990_erp_inspect_alias()
1446 sense = dasd_get_sense(&erp->refers->irb); in dasd_3990_erp_inspect_alias()
1450 if (!test_bit(DASD_FLAG_OFFLINE, &cqr->startdev->flags) && sense in dasd_3990_erp_inspect_alias()
1451 && (sense[0] == 0x10) && (sense[7] == 0x0F) in dasd_3990_erp_inspect_alias()
1452 && (sense[8] == 0x67)) { in dasd_3990_erp_inspect_alias()
1458 dasd_alias_remove_device(cqr->startdev); in dasd_3990_erp_inspect_alias()
1461 dasd_reload_device(cqr->startdev); in dasd_3990_erp_inspect_alias()
1464 if (cqr->startdev->features & DASD_FEATURE_ERPLOG) { in dasd_3990_erp_inspect_alias()
1465 DBF_DEV_EVENT(DBF_ERR, cqr->startdev, in dasd_3990_erp_inspect_alias()
1468 dev_name(&cqr->block->base->cdev->dev)); in dasd_3990_erp_inspect_alias()
1471 erp->startdev = cqr->block->base; in dasd_3990_erp_inspect_alias()
1472 erp->function = dasd_3990_erp_inspect_alias; in dasd_3990_erp_inspect_alias()
1483 * Does a detailed inspection of the 24 byte sense data
1487 * sense sense data of the actual error
1494 dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_inspect_24() argument
1499 /* Check sense for .... */ in dasd_3990_erp_inspect_24()
1501 if ((erp_filled == NULL) && (sense[0] & SNS0_CMD_REJECT)) { in dasd_3990_erp_inspect_24()
1502 erp_filled = dasd_3990_erp_com_rej(erp, sense); in dasd_3990_erp_inspect_24()
1505 if ((erp_filled == NULL) && (sense[0] & SNS0_INTERVENTION_REQ)) { in dasd_3990_erp_inspect_24()
1509 if ((erp_filled == NULL) && (sense[0] & SNS0_BUS_OUT_CHECK)) { in dasd_3990_erp_inspect_24()
1513 if ((erp_filled == NULL) && (sense[0] & SNS0_EQUIPMENT_CHECK)) { in dasd_3990_erp_inspect_24()
1514 erp_filled = dasd_3990_erp_equip_check(erp, sense); in dasd_3990_erp_inspect_24()
1517 if ((erp_filled == NULL) && (sense[0] & SNS0_DATA_CHECK)) { in dasd_3990_erp_inspect_24()
1518 erp_filled = dasd_3990_erp_data_check(erp, sense); in dasd_3990_erp_inspect_24()
1521 if ((erp_filled == NULL) && (sense[0] & SNS0_OVERRUN)) { in dasd_3990_erp_inspect_24()
1522 erp_filled = dasd_3990_erp_overrun(erp, sense); in dasd_3990_erp_inspect_24()
1525 if ((erp_filled == NULL) && (sense[1] & SNS1_INV_TRACK_FORMAT)) { in dasd_3990_erp_inspect_24()
1526 erp_filled = dasd_3990_erp_inv_format(erp, sense); in dasd_3990_erp_inspect_24()
1528 /* 'End-of-Cylinder' */ in dasd_3990_erp_inspect_24()
1529 if ((erp_filled == NULL) && (sense[1] & SNS1_EOC)) { in dasd_3990_erp_inspect_24()
1530 erp_filled = dasd_3990_erp_EOC(erp, sense); in dasd_3990_erp_inspect_24()
1533 if ((erp_filled == NULL) && (sense[2] & SNS2_ENV_DATA_PRESENT)) { in dasd_3990_erp_inspect_24()
1534 erp_filled = dasd_3990_erp_env_data(erp, sense); in dasd_3990_erp_inspect_24()
1537 if ((erp_filled == NULL) && (sense[1] & SNS1_NO_REC_FOUND)) { in dasd_3990_erp_inspect_24()
1538 erp_filled = dasd_3990_erp_no_rec(erp, sense); in dasd_3990_erp_inspect_24()
1541 if ((erp_filled == NULL) && (sense[1] & SNS1_FILE_PROTECTED)) { in dasd_3990_erp_inspect_24()
1544 /* other (unknown) error - do default ERP */ in dasd_3990_erp_inspect_24()
1556 * 32 byte sense ERP functions (only)
1568 * erp current erp_head
1569 * sense current sense data
1574 dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_action_10_32() argument
1577 struct dasd_device *device = erp->startdev; in dasd_3990_erp_action_10_32()
1579 erp->retries = 256; in dasd_3990_erp_action_10_32()
1580 erp->function = dasd_3990_erp_action_10_32; in dasd_3990_erp_action_10_32()
1601 * sense current sense data
1608 dasd_3990_erp_action_1B_32(struct dasd_ccw_req * default_erp, char *sense) in dasd_3990_erp_action_1B_32() argument
1611 struct dasd_device *device = default_erp->startdev; in dasd_3990_erp_action_1B_32()
1623 default_erp->function = dasd_3990_erp_action_1B_32; in dasd_3990_erp_action_1B_32()
1628 while (cqr->refers != NULL) { in dasd_3990_erp_action_1B_32()
1629 cqr = cqr->refers; in dasd_3990_erp_action_1B_32()
1632 if (scsw_is_tm(&cqr->irb.scsw)) { in dasd_3990_erp_action_1B_32()
1634 "32 bit sense, action 1B is not defined" in dasd_3990_erp_action_1B_32()
1635 " in transport mode - just retry"); in dasd_3990_erp_action_1B_32()
1640 if (sense[1] & 0x01) { in dasd_3990_erp_action_1B_32()
1642 "Imprecise ending is set - just retry"); in dasd_3990_erp_action_1B_32()
1648 /* Imprecise ending is not set -> addr from IRB-SCSW */ in dasd_3990_erp_action_1B_32()
1649 cpa = default_erp->refers->irb.scsw.cmd.cpa; in dasd_3990_erp_action_1B_32()
1660 erp = dasd_alloc_erp_request(cqr->magic, in dasd_3990_erp_action_1B_32()
1666 /* internal error 01 - Unable to allocate ERP */ in dasd_3990_erp_action_1B_32()
1667 dev_err(&device->cdev->dev, "An error occurred in the DASD " in dasd_3990_erp_action_1B_32()
1673 DE_data = erp->data; in dasd_3990_erp_action_1B_32()
1674 oldccw = cqr->cpaddr; in dasd_3990_erp_action_1B_32()
1675 if (oldccw->cmd_code == DASD_ECKD_CCW_PFX) { in dasd_3990_erp_action_1B_32()
1676 PFX_data = cqr->data; in dasd_3990_erp_action_1B_32()
1677 memcpy(DE_data, &PFX_data->define_extent, in dasd_3990_erp_action_1B_32()
1680 memcpy(DE_data, cqr->data, sizeof(struct DE_eckd_data)); in dasd_3990_erp_action_1B_32()
1683 LO_data = erp->data + sizeof(struct DE_eckd_data); in dasd_3990_erp_action_1B_32()
1685 if ((sense[3] == 0x01) && (LO_data[1] & 0x01)) { in dasd_3990_erp_action_1B_32()
1690 if ((sense[7] & 0x3F) == 0x01) { in dasd_3990_erp_action_1B_32()
1691 /* operation code is WRITE DATA -> data area orientation */ in dasd_3990_erp_action_1B_32()
1694 } else if ((sense[7] & 0x3F) == 0x03) { in dasd_3990_erp_action_1B_32()
1695 /* operation code is FORMAT WRITE -> index orientation */ in dasd_3990_erp_action_1B_32()
1699 LO_data[0] = sense[7]; /* operation */ in dasd_3990_erp_action_1B_32()
1702 LO_data[1] = sense[8]; /* auxiliary */ in dasd_3990_erp_action_1B_32()
1703 LO_data[2] = sense[9]; in dasd_3990_erp_action_1B_32()
1704 LO_data[3] = sense[3]; /* count */ in dasd_3990_erp_action_1B_32()
1705 LO_data[4] = sense[29]; /* seek_addr.cyl */ in dasd_3990_erp_action_1B_32()
1706 LO_data[5] = sense[30]; /* seek_addr.cyl 2nd byte */ in dasd_3990_erp_action_1B_32()
1707 LO_data[7] = sense[31]; /* seek_addr.head 2nd byte */ in dasd_3990_erp_action_1B_32()
1709 memcpy(&(LO_data[8]), &(sense[11]), 8); in dasd_3990_erp_action_1B_32()
1712 ccw = erp->cpaddr; in dasd_3990_erp_action_1B_32()
1714 ccw->cmd_code = DASD_ECKD_CCW_DEFINE_EXTENT; in dasd_3990_erp_action_1B_32()
1715 ccw->flags = CCW_FLAG_CC; in dasd_3990_erp_action_1B_32()
1716 ccw->count = 16; in dasd_3990_erp_action_1B_32()
1717 ccw->cda = (__u32)(addr_t) DE_data; in dasd_3990_erp_action_1B_32()
1722 ccw->cmd_code = DASD_ECKD_CCW_LOCATE_RECORD; in dasd_3990_erp_action_1B_32()
1723 ccw->flags = CCW_FLAG_CC; in dasd_3990_erp_action_1B_32()
1724 ccw->count = 16; in dasd_3990_erp_action_1B_32()
1725 ccw->cda = (__u32)(addr_t) LO_data; in dasd_3990_erp_action_1B_32()
1729 ccw->cmd_code = CCW_CMD_TIC; in dasd_3990_erp_action_1B_32()
1730 ccw->cda = cpa; in dasd_3990_erp_action_1B_32()
1733 erp->flags = default_erp->flags; in dasd_3990_erp_action_1B_32()
1734 erp->function = dasd_3990_erp_action_1B_32; in dasd_3990_erp_action_1B_32()
1735 erp->refers = default_erp->refers; in dasd_3990_erp_action_1B_32()
1736 erp->startdev = device; in dasd_3990_erp_action_1B_32()
1737 erp->memdev = device; in dasd_3990_erp_action_1B_32()
1738 erp->magic = default_erp->magic; in dasd_3990_erp_action_1B_32()
1739 erp->expires = default_erp->expires; in dasd_3990_erp_action_1B_32()
1740 erp->retries = 256; in dasd_3990_erp_action_1B_32()
1741 erp->buildclk = get_tod_clock(); in dasd_3990_erp_action_1B_32()
1742 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_action_1B_32()
1762 * sense current sense data
1767 dasd_3990_update_1B(struct dasd_ccw_req * previous_erp, char *sense) in dasd_3990_update_1B() argument
1770 struct dasd_device *device = previous_erp->startdev; in dasd_3990_update_1B()
1779 " - follow on"); in dasd_3990_update_1B()
1784 while (cqr->refers != NULL) { in dasd_3990_update_1B()
1785 cqr = cqr->refers; in dasd_3990_update_1B()
1788 if (scsw_is_tm(&cqr->irb.scsw)) { in dasd_3990_update_1B()
1790 "32 bit sense, action 1B, update," in dasd_3990_update_1B()
1791 " in transport mode - just retry"); in dasd_3990_update_1B()
1796 if (sense[1] & 0x01) { in dasd_3990_update_1B()
1798 "Imprecise ending is set - just retry"); in dasd_3990_update_1B()
1800 previous_erp->status = DASD_CQR_FILLED; in dasd_3990_update_1B()
1806 /* Imprecise ending is not set -> addr from IRB-SCSW */ in dasd_3990_update_1B()
1807 cpa = previous_erp->irb.scsw.cmd.cpa; in dasd_3990_update_1B()
1810 /* internal error 02 - in dasd_3990_update_1B()
1812 dev_err(&device->cdev->dev, "An error occurred in the DASD " in dasd_3990_update_1B()
1815 previous_erp->status = DASD_CQR_FAILED; in dasd_3990_update_1B()
1822 /* update the LO with the new returned sense data */ in dasd_3990_update_1B()
1823 LO_data = erp->data + sizeof(struct DE_eckd_data); in dasd_3990_update_1B()
1825 if ((sense[3] == 0x01) && (LO_data[1] & 0x01)) { in dasd_3990_update_1B()
1827 previous_erp->status = DASD_CQR_FAILED; in dasd_3990_update_1B()
1832 if ((sense[7] & 0x3F) == 0x01) { in dasd_3990_update_1B()
1833 /* operation code is WRITE DATA -> data area orientation */ in dasd_3990_update_1B()
1836 } else if ((sense[7] & 0x3F) == 0x03) { in dasd_3990_update_1B()
1837 /* operation code is FORMAT WRITE -> index orientation */ in dasd_3990_update_1B()
1841 LO_data[0] = sense[7]; /* operation */ in dasd_3990_update_1B()
1844 LO_data[1] = sense[8]; /* auxiliary */ in dasd_3990_update_1B()
1845 LO_data[2] = sense[9]; in dasd_3990_update_1B()
1846 LO_data[3] = sense[3]; /* count */ in dasd_3990_update_1B()
1847 LO_data[4] = sense[29]; /* seek_addr.cyl */ in dasd_3990_update_1B()
1848 LO_data[5] = sense[30]; /* seek_addr.cyl 2nd byte */ in dasd_3990_update_1B()
1849 LO_data[7] = sense[31]; /* seek_addr.head 2nd byte */ in dasd_3990_update_1B()
1851 memcpy(&(LO_data[8]), &(sense[11]), 8); in dasd_3990_update_1B()
1854 ccw = erp->cpaddr; /* addr of DE ccw */ in dasd_3990_update_1B()
1857 ccw->cda = cpa; in dasd_3990_update_1B()
1859 erp->status = DASD_CQR_FILLED; in dasd_3990_update_1B()
1871 * by the sense data. This makes enqueueing of the request
1875 * sense sense data of the actual error
1883 dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_compound_retry() argument
1886 switch (sense[25] & 0x03) { in dasd_3990_erp_compound_retry()
1888 erp->retries = 1; in dasd_3990_erp_compound_retry()
1892 erp->retries = 2; in dasd_3990_erp_compound_retry()
1896 erp->retries = 10; in dasd_3990_erp_compound_retry()
1900 erp->retries = 256; in dasd_3990_erp_compound_retry()
1907 erp->function = dasd_3990_erp_compound_retry; in dasd_3990_erp_compound_retry()
1919 * sense sense data of the actual error
1927 dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_compound_path() argument
1929 if (sense[25] & DASD_SENSE_BIT_3) { in dasd_3990_erp_compound_path()
1932 if (erp->status == DASD_CQR_FAILED && in dasd_3990_erp_compound_path()
1933 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) { in dasd_3990_erp_compound_path()
1936 erp->lpm = dasd_path_get_opm(erp->startdev); in dasd_3990_erp_compound_path()
1937 erp->status = DASD_CQR_NEED_ERP; in dasd_3990_erp_compound_path()
1941 erp->function = dasd_3990_erp_compound_path; in dasd_3990_erp_compound_path()
1952 * sense sense data of the actual error
1960 dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_compound_code() argument
1963 if (sense[25] & DASD_SENSE_BIT_2) { in dasd_3990_erp_compound_code()
1965 switch (sense[28]) { in dasd_3990_erp_compound_code()
1974 erp->retries = 1; in dasd_3990_erp_compound_code()
1980 /* should not happen - continue */ in dasd_3990_erp_compound_code()
1985 erp->function = dasd_3990_erp_compound_code; in dasd_3990_erp_compound_code()
2000 * sense sense data of the actual error
2008 dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_compound_config() argument
2011 if ((sense[25] & DASD_SENSE_BIT_1) && (sense[26] & DASD_SENSE_BIT_2)) { in dasd_3990_erp_compound_config()
2014 internal error 05 - Set device to suspended duplex state in dasd_3990_erp_compound_config()
2016 struct dasd_device *device = erp->startdev; in dasd_3990_erp_compound_config()
2017 dev_err(&device->cdev->dev, in dasd_3990_erp_compound_config()
2023 erp->function = dasd_3990_erp_compound_config; in dasd_3990_erp_compound_config()
2035 * sense sense data of the actual error
2036 * erp pointer to the current (failed) ERP
2043 dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_compound() argument
2046 if ((erp->function == dasd_3990_erp_compound_retry) && in dasd_3990_erp_compound()
2047 (erp->status == DASD_CQR_NEED_ERP)) { in dasd_3990_erp_compound()
2049 dasd_3990_erp_compound_path(erp, sense); in dasd_3990_erp_compound()
2052 if ((erp->function == dasd_3990_erp_compound_path) && in dasd_3990_erp_compound()
2053 (erp->status == DASD_CQR_NEED_ERP)) { in dasd_3990_erp_compound()
2055 erp = dasd_3990_erp_compound_code(erp, sense); in dasd_3990_erp_compound()
2058 if ((erp->function == dasd_3990_erp_compound_code) && in dasd_3990_erp_compound()
2059 (erp->status == DASD_CQR_NEED_ERP)) { in dasd_3990_erp_compound()
2061 dasd_3990_erp_compound_config(erp, sense); in dasd_3990_erp_compound()
2065 if (erp->status == DASD_CQR_NEED_ERP) in dasd_3990_erp_compound()
2066 erp->status = DASD_CQR_FAILED; in dasd_3990_erp_compound()
2076 * inspects the SIM SENSE data and starts an appropriate action
2079 * sense sense data of the actual error
2085 dasd_3990_erp_handle_sim(struct dasd_device *device, char *sense) in dasd_3990_erp_handle_sim() argument
2088 if ((sense[24] & DASD_SIM_MSG_TO_OP) || (sense[1] & 0x10)) { in dasd_3990_erp_handle_sim()
2090 dev_err(&device->cdev->dev, "SIM - SRC: " in dasd_3990_erp_handle_sim()
2091 "%02x%02x%02x%02x\n", sense[22], in dasd_3990_erp_handle_sim()
2092 sense[23], sense[11], sense[12]); in dasd_3990_erp_handle_sim()
2093 } else if (sense[24] & DASD_SIM_LOG) { in dasd_3990_erp_handle_sim()
2095 dev_warn(&device->cdev->dev, "log SIM - SRC: " in dasd_3990_erp_handle_sim()
2096 "%02x%02x%02x%02x\n", sense[22], in dasd_3990_erp_handle_sim()
2097 sense[23], sense[11], sense[12]); in dasd_3990_erp_handle_sim()
2105 * Does a detailed inspection of the 32 byte sense data
2109 * sense sense data of the actual error
2117 dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense) in dasd_3990_erp_inspect_32() argument
2120 struct dasd_device *device = erp->startdev; in dasd_3990_erp_inspect_32()
2122 erp->function = dasd_3990_erp_inspect_32; in dasd_3990_erp_inspect_32()
2124 /* check for SIM sense data */ in dasd_3990_erp_inspect_32()
2125 if ((sense[6] & DASD_SIM_SENSE) == DASD_SIM_SENSE) in dasd_3990_erp_inspect_32()
2126 dasd_3990_erp_handle_sim(device, sense); in dasd_3990_erp_inspect_32()
2128 if (sense[25] & DASD_SENSE_BIT_0) { in dasd_3990_erp_inspect_32()
2131 dasd_3990_erp_compound_retry(erp, sense); in dasd_3990_erp_inspect_32()
2136 switch (sense[25]) { in dasd_3990_erp_inspect_32()
2138 case 0x00: /* success - use default ERP for retries */ in dasd_3990_erp_inspect_32()
2141 " - just retry"); in dasd_3990_erp_inspect_32()
2145 dev_err(&device->cdev->dev, in dasd_3990_erp_inspect_32()
2157 internal error 08 - update write command error*/ in dasd_3990_erp_inspect_32()
2158 dev_err(&device->cdev->dev, "An error occurred in the " in dasd_3990_erp_inspect_32()
2165 erp = dasd_3990_erp_action_10_32(erp, sense); in dasd_3990_erp_inspect_32()
2169 internal error 07 - The next track is not in dasd_3990_erp_inspect_32()
2171 dev_err(&device->cdev->dev, in dasd_3990_erp_inspect_32()
2180 erp = dasd_3990_erp_action_1B_32(erp, sense); in dasd_3990_erp_inspect_32()
2184 dev_emerg(&device->cdev->dev, in dasd_3990_erp_inspect_32()
2190 ("Invalid data - No way to inform application " in dasd_3990_erp_inspect_32()
2194 case 0x1D: /* state-change pending */ in dasd_3990_erp_inspect_32()
2199 erp = dasd_3990_erp_action_4(erp, sense); in dasd_3990_erp_inspect_32()
2206 erp = dasd_3990_erp_action_4(erp, sense); in dasd_3990_erp_inspect_32()
2209 default: /* all others errors - default erp */ in dasd_3990_erp_inspect_32()
2222 if (!(device->features & DASD_FEATURE_PATH_AUTODISABLE)) { in dasd_3990_erp_disable_path()
2223 dev_err(&device->cdev->dev, in dasd_3990_erp_disable_path()
2225 device->path[pos].cssid, device->path[pos].chpid, lpum); in dasd_3990_erp_disable_path()
2231 dev_err(&device->cdev->dev, in dasd_3990_erp_disable_path()
2233 device->path[pos].cssid, device->path[pos].chpid, lpum); in dasd_3990_erp_disable_path()
2237 dev_err(&device->cdev->dev, in dasd_3990_erp_disable_path()
2238 "Path %x.%02x (pathmask %02x) is disabled - IFCC threshold exceeded\n", in dasd_3990_erp_disable_path()
2239 device->path[pos].cssid, device->path[pos].chpid, lpum); in dasd_3990_erp_disable_path()
2244 device->path[pos].errorclk = 0; in dasd_3990_erp_disable_path()
2245 atomic_set(&device->path[pos].error_count, 0); in dasd_3990_erp_disable_path()
2250 struct dasd_device *device = erp->startdev; in dasd_3990_erp_account_error()
2251 __u8 lpum = erp->refers->irb.esw.esw1.lpum; in dasd_3990_erp_account_error()
2255 if (!device->path_thrhld) in dasd_3990_erp_account_error()
2263 if ((tod_to_ns(clk - device->path[pos].errorclk) / NSEC_PER_SEC) in dasd_3990_erp_account_error()
2264 >= device->path_interval) { in dasd_3990_erp_account_error()
2265 atomic_set(&device->path[pos].error_count, 0); in dasd_3990_erp_account_error()
2266 device->path[pos].errorclk = 0; in dasd_3990_erp_account_error()
2268 atomic_inc(&device->path[pos].error_count); in dasd_3990_erp_account_error()
2269 device->path[pos].errorclk = clk; in dasd_3990_erp_account_error()
2271 if (atomic_read(&device->path[pos].error_count) >= in dasd_3990_erp_account_error()
2272 device->path_thrhld) in dasd_3990_erp_account_error()
2278 * main ERP control functions (24 and 32 byte sense)
2299 struct dasd_device *device = erp->startdev; in dasd_3990_erp_control_check()
2301 if (scsw_cstat(&erp->refers->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK in dasd_3990_erp_control_check()
2315 * Does a detailed inspection for sense data by calling either
2316 * the 24-byte or the 32-byte inspection routine.
2328 char *sense; in dasd_3990_erp_inspect() local
2335 /* sense data are located in the refers record of the in dasd_3990_erp_inspect()
2339 sense = dasd_get_sense(&erp->refers->irb); in dasd_3990_erp_inspect()
2340 if (!sense) in dasd_3990_erp_inspect()
2342 /* distinguish between 24 and 32 byte sense data */ in dasd_3990_erp_inspect()
2343 else if (sense[27] & DASD_SENSE_BIT_0) { in dasd_3990_erp_inspect()
2345 /* inspect the 24 byte sense data */ in dasd_3990_erp_inspect()
2346 erp_new = dasd_3990_erp_inspect_24(erp, sense); in dasd_3990_erp_inspect()
2350 /* inspect the 32 byte sense data */ in dasd_3990_erp_inspect()
2351 erp_new = dasd_3990_erp_inspect_32(erp, sense); in dasd_3990_erp_inspect()
2353 } /* end distinguish between 24 and 32 byte sense data */ in dasd_3990_erp_inspect()
2368 * TSB so the original sense data will not be changed.
2371 * cqr head of the current ERP-chain (or single cqr if
2374 * erp pointer to new ERP-chain head
2379 struct dasd_device *device = cqr->startdev; in dasd_3990_erp_add_erp()
2386 if (cqr->cpmode == 1) { in dasd_3990_erp_add_erp()
2396 erp = dasd_alloc_erp_request(cqr->magic, in dasd_3990_erp_add_erp()
2399 if (cqr->retries <= 0) { in dasd_3990_erp_add_erp()
2402 cqr->status = DASD_CQR_FAILED; in dasd_3990_erp_add_erp()
2403 cqr->stopclk = get_tod_clock(); in dasd_3990_erp_add_erp()
2408 cqr->retries); in dasd_3990_erp_add_erp()
2409 dasd_block_set_timer(device->block, (HZ << 3)); in dasd_3990_erp_add_erp()
2414 ccw = cqr->cpaddr; in dasd_3990_erp_add_erp()
2415 if (cqr->cpmode == 1) { in dasd_3990_erp_add_erp()
2417 erp->cpmode = 1; in dasd_3990_erp_add_erp()
2418 erp->cpaddr = PTR_ALIGN(erp->data, 64); in dasd_3990_erp_add_erp()
2419 tcw = erp->cpaddr; in dasd_3990_erp_add_erp()
2421 *tcw = *((struct tcw *)cqr->cpaddr); in dasd_3990_erp_add_erp()
2422 tcw->tsb = (long)tsb; in dasd_3990_erp_add_erp()
2423 } else if (ccw->cmd_code == DASD_ECKD_CCW_PSF) { in dasd_3990_erp_add_erp()
2425 erp->cpaddr = cqr->cpaddr; in dasd_3990_erp_add_erp()
2427 /* initialize request with default TIC to current ERP/CQR */ in dasd_3990_erp_add_erp()
2428 ccw = erp->cpaddr; in dasd_3990_erp_add_erp()
2429 ccw->cmd_code = CCW_CMD_NOOP; in dasd_3990_erp_add_erp()
2430 ccw->flags = CCW_FLAG_CC; in dasd_3990_erp_add_erp()
2432 ccw->cmd_code = CCW_CMD_TIC; in dasd_3990_erp_add_erp()
2433 ccw->cda = (long)(cqr->cpaddr); in dasd_3990_erp_add_erp()
2436 erp->flags = cqr->flags; in dasd_3990_erp_add_erp()
2437 erp->function = dasd_3990_erp_add_erp; in dasd_3990_erp_add_erp()
2438 erp->refers = cqr; in dasd_3990_erp_add_erp()
2439 erp->startdev = device; in dasd_3990_erp_add_erp()
2440 erp->memdev = device; in dasd_3990_erp_add_erp()
2441 erp->block = cqr->block; in dasd_3990_erp_add_erp()
2442 erp->magic = cqr->magic; in dasd_3990_erp_add_erp()
2443 erp->expires = cqr->expires; in dasd_3990_erp_add_erp()
2444 erp->retries = 256; in dasd_3990_erp_add_erp()
2445 erp->buildclk = get_tod_clock(); in dasd_3990_erp_add_erp()
2446 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_add_erp()
2455 * An additional ERP is needed to handle the current error.
2456 * Add ERP to the head of the ERP-chain containing the ERP processing
2457 * determined based on the sense data.
2460 * cqr head of the current ERP-chain (or single cqr if
2464 * erp pointer to new ERP-chain head
2478 /* inspect sense, determine specific ERP if possible */ in dasd_3990_erp_additional_erp()
2493 * This means that the failed CCW and the relevant sense data
2495 * I don't distinguish between 24 and 32 byte sense because in case of
2496 * 24 byte sense byte 25 and 27 is set as well.
2511 if (cqr1->startdev != cqr2->startdev) in dasd_3990_erp_error_match()
2514 sense1 = dasd_get_sense(&cqr1->irb); in dasd_3990_erp_error_match()
2515 sense2 = dasd_get_sense(&cqr2->irb); in dasd_3990_erp_error_match()
2517 /* one request has sense data, the other not -> no match, return 0 */ in dasd_3990_erp_error_match()
2520 /* no sense data in both cases -> check cstat for IFCC */ in dasd_3990_erp_error_match()
2522 if ((scsw_cstat(&cqr1->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK | in dasd_3990_erp_error_match()
2524 (scsw_cstat(&cqr2->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK | in dasd_3990_erp_error_match()
2528 /* check sense data; byte 0-2,25,27 */ in dasd_3990_erp_error_match()
2534 return 0; /* sense doesn't match */ in dasd_3990_erp_error_match()
2545 * check if the current error already happened before.
2546 * quick exit if current cqr is not an ERP (cqr->refers=NULL)
2552 * erp erp-pointer to the already defined error
2564 if (cqr->refers == NULL) { /* return if not in erp */ in dasd_3990_erp_in_erp()
2568 /* check the erp/cqr chain for current error */ in dasd_3990_erp_in_erp()
2570 match = dasd_3990_erp_error_match(erp_head, cqr->refers); in dasd_3990_erp_in_erp()
2572 cqr = cqr->refers; /* check next erp/cqr in queue */ in dasd_3990_erp_in_erp()
2574 } while ((cqr->refers != NULL) && (!match)); in dasd_3990_erp_in_erp()
2585 * DASD_3990_ERP_FURTHER_ERP (24 & 32 byte sense)
2588 * No retry is left for the current ERP. Check what has to be done
2590 * - do further defined ERP action or
2591 * - wait for interrupt or
2592 * - exit with permanent error
2604 struct dasd_device *device = erp->startdev; in dasd_3990_erp_further_erp()
2605 char *sense = dasd_get_sense(&erp->irb); in dasd_3990_erp_further_erp() local
2607 /* check for 24 byte sense ERP */ in dasd_3990_erp_further_erp()
2608 if ((erp->function == dasd_3990_erp_bus_out) || in dasd_3990_erp_further_erp()
2609 (erp->function == dasd_3990_erp_action_1) || in dasd_3990_erp_further_erp()
2610 (erp->function == dasd_3990_erp_action_4)) { in dasd_3990_erp_further_erp()
2614 } else if (erp->function == dasd_3990_erp_action_1_sec) { in dasd_3990_erp_further_erp()
2616 } else if (erp->function == dasd_3990_erp_action_5) { in dasd_3990_erp_further_erp()
2622 if (sense && !(sense[2] & DASD_SENSE_BIT_0)) { in dasd_3990_erp_further_erp()
2627 switch (sense[25]) { in dasd_3990_erp_further_erp()
2647 sense[25]); in dasd_3990_erp_further_erp()
2651 /* check for 32 byte sense ERP */ in dasd_3990_erp_further_erp()
2652 } else if (sense && in dasd_3990_erp_further_erp()
2653 ((erp->function == dasd_3990_erp_compound_retry) || in dasd_3990_erp_further_erp()
2654 (erp->function == dasd_3990_erp_compound_path) || in dasd_3990_erp_further_erp()
2655 (erp->function == dasd_3990_erp_compound_code) || in dasd_3990_erp_further_erp()
2656 (erp->function == dasd_3990_erp_compound_config))) { in dasd_3990_erp_further_erp()
2658 erp = dasd_3990_erp_compound(erp, sense); in dasd_3990_erp_further_erp()
2665 dev_err(&device->cdev->dev, in dasd_3990_erp_further_erp()
2668 erp->status = DASD_CQR_FAILED; in dasd_3990_erp_further_erp()
2687 * erp_head first ERP in ERP-chain
2699 struct dasd_device *device = erp_head->startdev; in dasd_3990_erp_handle_match_erp()
2711 list_del(&erp_done->blocklist); in dasd_3990_erp_handle_match_erp()
2714 erp_done = erp_done->refers; in dasd_3990_erp_handle_match_erp()
2717 dasd_free_erp_request(erp_free, erp_free->memdev); in dasd_3990_erp_handle_match_erp()
2721 if (erp->retries > 0) { in dasd_3990_erp_handle_match_erp()
2723 char *sense = dasd_get_sense(&erp->refers->irb); in dasd_3990_erp_handle_match_erp() local
2726 if (sense && erp->function == dasd_3990_erp_action_4) { in dasd_3990_erp_handle_match_erp()
2728 erp = dasd_3990_erp_action_4(erp, sense); in dasd_3990_erp_handle_match_erp()
2730 } else if (sense && in dasd_3990_erp_handle_match_erp()
2731 erp->function == dasd_3990_erp_action_1B_32) { in dasd_3990_erp_handle_match_erp()
2733 erp = dasd_3990_update_1B(erp, sense); in dasd_3990_erp_handle_match_erp()
2735 } else if (sense && erp->function == dasd_3990_erp_int_req) { in dasd_3990_erp_handle_match_erp()
2743 erp->retries, erp); in dasd_3990_erp_handle_match_erp()
2746 erp->status = DASD_CQR_FILLED; in dasd_3990_erp_handle_match_erp()
2750 /* no retry left - check for further necessary action */ in dasd_3990_erp_handle_match_erp()
2770 * erp erp-pointer to the head of the ERP action chain.
2772 * - either a ptr to an additional ERP cqr or
2773 * - the original given cqr (which's status might
2780 struct dasd_device *device = cqr->startdev; in dasd_3990_erp_action()
2783 if (device->features & DASD_FEATURE_ERPLOG) { in dasd_3990_erp_action()
2784 /* print current erp_chain */ in dasd_3990_erp_action()
2785 dev_err(&device->cdev->dev, in dasd_3990_erp_action()
2786 "ERP chain at BEGINNING of ERP-ACTION\n"); in dasd_3990_erp_action()
2788 temp_erp != NULL; temp_erp = temp_erp->refers) { in dasd_3990_erp_action()
2790 dev_err(&device->cdev->dev, in dasd_3990_erp_action()
2792 temp_erp, temp_erp->status, in dasd_3990_erp_action()
2793 temp_erp->refers); in dasd_3990_erp_action()
2797 /* double-check if current erp/cqr was successful */ in dasd_3990_erp_action()
2798 if ((scsw_cstat(&cqr->irb.scsw) == 0x00) && in dasd_3990_erp_action()
2799 (scsw_dstat(&cqr->irb.scsw) == in dasd_3990_erp_action()
2804 " - NO ERP necessary", cqr); in dasd_3990_erp_action()
2806 cqr->status = DASD_CQR_DONE; in dasd_3990_erp_action()
2815 /* no matching erp found - set up erp */ in dasd_3990_erp_action()
2820 /* matching erp found - set all leading erp's to DONE */ in dasd_3990_erp_action()
2830 if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) { in dasd_3990_erp_action()
2831 erp->lpm = cqr->lpm; in dasd_3990_erp_action()
2834 if (device->features & DASD_FEATURE_ERPLOG) { in dasd_3990_erp_action()
2835 /* print current erp_chain */ in dasd_3990_erp_action()
2836 dev_err(&device->cdev->dev, in dasd_3990_erp_action()
2837 "ERP chain at END of ERP-ACTION\n"); in dasd_3990_erp_action()
2839 temp_erp != NULL; temp_erp = temp_erp->refers) { in dasd_3990_erp_action()
2841 dev_err(&device->cdev->dev, in dasd_3990_erp_action()
2843 temp_erp, temp_erp->status, in dasd_3990_erp_action()
2844 temp_erp->refers); in dasd_3990_erp_action()
2849 if (list_empty(&erp->blocklist)) { in dasd_3990_erp_action()
2850 cqr->status = DASD_CQR_IN_ERP; in dasd_3990_erp_action()
2852 list_add_tail(&erp->blocklist, &cqr->blocklist); in dasd_3990_erp_action()