Lines Matching refs:erp

39  *   the status of the original cqr / erp to the given (final) status
42 * erp request to be blocked
49 dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status)
51 struct dasd_ccw_req *cqr = erp->refers;
53 dasd_free_erp_request(erp, erp->memdev);
67 static void dasd_3990_erp_block_queue(struct dasd_ccw_req *erp, int expires)
70 struct dasd_device *device = erp->startdev;
79 erp->status = DASD_CQR_FILLED;
80 if (erp->block)
81 dasd_block_set_timer(erp->block, expires);
94 * erp current erp
96 * erp modified erp
99 dasd_3990_erp_int_req(struct dasd_ccw_req * erp)
102 struct dasd_device *device = erp->startdev;
107 if (erp->function != dasd_3990_erp_int_req) {
109 erp->retries = 256;
110 erp->function = dasd_3990_erp_int_req;
119 dasd_3990_erp_block_queue(erp, 60*HZ);
122 return erp;
135 * erp pointer to the current ERP
138 * erp modified pointer to the ERP
141 dasd_3990_erp_alternate_path(struct dasd_ccw_req * erp)
143 struct dasd_device *device = erp->startdev;
151 if (erp->lpm == 0)
152 erp->lpm = dasd_path_get_opm(device) &
153 ~(erp->irb.esw.esw0.sublog.lpum);
155 erp->lpm &= ~(erp->irb.esw.esw0.sublog.lpum);
157 if ((erp->lpm & opm) != 0x00) {
161 erp->lpm, erp->irb.esw.esw0.sublog.lpum, opm);
164 erp->status = DASD_CQR_FILLED;
165 erp->retries = 10;
169 "/opm=%x)\n", erp->irb.esw.esw0.sublog.lpum, opm);
172 erp->status = DASD_CQR_FAILED;
184 * erp pointer to the current (failed) ERP
192 dasd_3990_erp_DCTL(struct dasd_ccw_req * erp, char modifier)
195 struct dasd_device *device = erp->startdev;
200 dctl_cqr = dasd_alloc_erp_request(erp->magic, 1,
206 erp->status = DASD_CQR_FAILED;
207 return erp;
220 dctl_cqr->flags = erp->flags;
222 dctl_cqr->refers = erp;
225 dctl_cqr->magic = erp->magic;
252 * erp pointer to the current ERP
255 * erp pointer to the ERP
258 static struct dasd_ccw_req *dasd_3990_erp_action_1_sec(struct dasd_ccw_req *erp)
260 erp->function = dasd_3990_erp_action_1_sec;
261 dasd_3990_erp_alternate_path(erp);
262 return erp;
265 static struct dasd_ccw_req *dasd_3990_erp_action_1(struct dasd_ccw_req *erp)
267 erp->function = dasd_3990_erp_action_1;
268 dasd_3990_erp_alternate_path(erp);
269 if (erp->status == DASD_CQR_FAILED &&
270 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) {
271 erp->status = DASD_CQR_FILLED;
272 erp->retries = 10;
273 erp->lpm = dasd_path_get_opm(erp->startdev);
274 erp->function = dasd_3990_erp_action_1_sec;
276 return erp;
291 * erp pointer to the current ERP
294 * erp pointer to the ERP
298 dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense)
301 struct dasd_device *device = erp->startdev;
306 if (erp->function != dasd_3990_erp_action_4) {
311 erp->retries = 256;
312 erp->function = dasd_3990_erp_action_4;
320 erp->retries);
322 dasd_3990_erp_block_queue(erp, 30*HZ);
328 erp->retries);
329 dasd_3990_erp_block_queue(erp, HZ);
335 erp->retries);
336 erp->status = DASD_CQR_FILLED;
340 return erp;
358 * erp pointer to the current ERP
361 * erp pointer to the ERP
365 dasd_3990_erp_action_5(struct dasd_ccw_req * erp)
369 erp->retries = 10;
370 erp->function = dasd_3990_erp_action_5;
372 return erp;
391 dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense)
394 struct dasd_device *device = erp->startdev;
979 dasd_eer_write(device, erp->refers,
1017 * erp current erp_head
1021 * erp 'new' erp_head - pointer to new ERP
1024 dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense)
1027 struct dasd_device *device = erp->startdev;
1029 erp->function = dasd_3990_erp_com_rej;
1037 dasd_3990_handle_env_data(erp, sense);
1039 erp->retries = 5;
1044 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1048 set_bit(DASD_CQR_SUPPRESS_CR, &erp->refers->flags);
1049 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1051 if (!test_bit(DASD_CQR_SUPPRESS_CR, &erp->flags))
1055 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1058 return erp;
1069 * erp current erp_head
1071 * erp new erp_head - pointer to new ERP
1074 dasd_3990_erp_bus_out(struct dasd_ccw_req * erp)
1077 struct dasd_device *device = erp->startdev;
1082 if (erp->function != dasd_3990_erp_bus_out) {
1083 erp->retries = 256;
1084 erp->function = dasd_3990_erp_bus_out;
1093 dasd_3990_erp_block_queue(erp, 60*HZ);
1097 return erp;
1108 * erp current erp_head
1110 * erp new erp_head - pointer to new ERP
1113 dasd_3990_erp_equip_check(struct dasd_ccw_req * erp, char *sense)
1116 struct dasd_device *device = erp->startdev;
1118 erp->function = dasd_3990_erp_equip_check;
1123 erp = dasd_3990_erp_action_1(erp);
1130 dasd_3990_handle_env_data(erp, sense);
1132 erp = dasd_3990_erp_action_4(erp, sense);
1140 erp = dasd_3990_erp_action_1(erp);
1148 erp = dasd_3990_erp_action_5(erp);
1150 return erp;
1161 * erp current erp_head
1163 * erp new erp_head - pointer to new ERP
1166 dasd_3990_erp_data_check(struct dasd_ccw_req * erp, char *sense)
1169 struct dasd_device *device = erp->startdev;
1171 erp->function = dasd_3990_erp_data_check;
1190 erp = dasd_3990_erp_action_4(erp, sense);
1198 erp = dasd_3990_erp_action_1(erp);
1206 erp = dasd_3990_erp_action_5(erp);
1209 return erp;
1220 * erp current erp_head
1222 * erp new erp_head - pointer to new ERP
1225 dasd_3990_erp_overrun(struct dasd_ccw_req * erp, char *sense)
1228 struct dasd_device *device = erp->startdev;
1230 erp->function = dasd_3990_erp_overrun;
1236 erp = dasd_3990_erp_action_5(erp);
1238 return erp;
1249 * erp current erp_head
1251 * erp new erp_head - pointer to new ERP
1254 dasd_3990_erp_inv_format(struct dasd_ccw_req * erp, char *sense)
1257 struct dasd_device *device = erp->startdev;
1259 erp->function = dasd_3990_erp_inv_format;
1267 dasd_3990_handle_env_data(erp, sense);
1269 erp = dasd_3990_erp_action_4(erp, sense);
1273 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1276 return erp;
1287 * erp already added default erp
1289 * erp pointer to original (failed) cqr.
1312 * erp current erp_head
1314 * erp new erp_head - pointer to new ERP
1317 dasd_3990_erp_env_data(struct dasd_ccw_req * erp, char *sense)
1320 struct dasd_device *device = erp->startdev;
1322 erp->function = dasd_3990_erp_env_data;
1326 dasd_3990_handle_env_data(erp, sense);
1330 erp = dasd_3990_erp_action_4(erp, sense);
1332 erp->status = DASD_CQR_FILLED;
1335 return erp;
1346 * erp already added default ERP
1349 * erp new erp_head - pointer to new ERP
1379 * erp current erp_head
1381 * erp new erp_head - pointer to new ERP
1384 dasd_3990_erp_file_prot(struct dasd_ccw_req * erp)
1387 struct dasd_device *device = erp->startdev;
1394 if (!test_bit(DASD_CQR_SUPPRESS_FP, &erp->flags))
1398 return dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1407 * If yes, it modifies the original and the erp request so that
1408 * the erp request can be started on a base device.
1411 * erp pointer to the currently created default ERP
1414 * erp pointer to the modified ERP, or NULL
1418 struct dasd_ccw_req *erp)
1420 struct dasd_ccw_req *cqr = erp->refers;
1426 sense = dasd_get_sense(&erp->refers->irb);
1451 erp->startdev = cqr->block->base;
1452 erp->function = dasd_3990_erp_inspect_alias;
1453 return erp;
1468 * erp pointer to the currently created default ERP
1471 * erp pointer to the (addtitional) ERP
1474 dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense)
1482 erp_filled = dasd_3990_erp_com_rej(erp, sense);
1486 erp_filled = dasd_3990_erp_int_req(erp);
1490 erp_filled = dasd_3990_erp_bus_out(erp);
1494 erp_filled = dasd_3990_erp_equip_check(erp, sense);
1498 erp_filled = dasd_3990_erp_data_check(erp, sense);
1502 erp_filled = dasd_3990_erp_overrun(erp, sense);
1506 erp_filled = dasd_3990_erp_inv_format(erp, sense);
1510 erp_filled = dasd_3990_erp_EOC(erp, sense);
1514 erp_filled = dasd_3990_erp_env_data(erp, sense);
1518 erp_filled = dasd_3990_erp_no_rec(erp, sense);
1522 erp_filled = dasd_3990_erp_file_prot(erp);
1527 erp_filled = erp;
1548 * erp current erp_head
1551 * erp modified erp_head
1554 dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense)
1557 struct dasd_device *device = erp->startdev;
1559 erp->retries = 256;
1560 erp->function = dasd_3990_erp_action_10_32;
1564 return erp;
1575 * The already created 'default erp' is used to get the link to
1576 * the erp chain, but it can not be used for this recovery
1580 * default_erp already added default erp.
1584 * erp new erp or
1594 struct dasd_ccw_req *erp;
1619 /* for imprecise ending just do default erp */
1640 erp = dasd_alloc_erp_request(cqr->magic,
1645 if (IS_ERR(erp)) {
1652 DE_data = erp->data;
1662 LO_data = erp->data + sizeof(struct DE_eckd_data);
1691 ccw = erp->cpaddr;
1711 /* fill erp related fields */
1712 erp->flags = default_erp->flags;
1713 erp->function = dasd_3990_erp_action_1B_32;
1714 erp->refers = default_erp->refers;
1715 erp->startdev = device;
1716 erp->memdev = device;
1717 erp->magic = default_erp->magic;
1718 erp->expires = default_erp->expires;
1719 erp->retries = 256;
1720 erp->buildclk = get_tod_clock();
1721 erp->status = DASD_CQR_FILLED;
1723 /* remove the default erp */
1726 return erp;
1740 * previous_erp already created previous erp.
1743 * erp modified erp
1752 struct dasd_ccw_req *erp;
1774 /* for imprecise ending just do default erp */
1797 erp = previous_erp;
1800 LO_data = erp->data + sizeof(struct DE_eckd_data);
1831 ccw = erp->cpaddr; /* addr of DE ccw */
1836 erp->status = DASD_CQR_FILLED;
1838 return erp;
1853 * erp pointer to the currently created ERP
1856 * erp modified ERP pointer
1860 dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense)
1865 erp->retries = 1;
1869 erp->retries = 2;
1873 erp->retries = 10;
1877 erp->retries = 256;
1884 erp->function = dasd_3990_erp_compound_retry;
1897 * erp pointer to the currently created ERP
1900 * erp modified ERP pointer
1904 dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense)
1907 dasd_3990_erp_alternate_path(erp);
1909 if (erp->status == DASD_CQR_FAILED &&
1910 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) {
1913 erp->lpm = dasd_path_get_opm(erp->startdev);
1914 erp->status = DASD_CQR_NEED_ERP;
1918 erp->function = dasd_3990_erp_compound_path;
1930 * erp pointer to the currently created ERP
1933 * erp NEW ERP pointer
1937 dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense)
1946 erp = dasd_3990_erp_DCTL(erp, 0x20);
1951 erp->retries = 1;
1953 dasd_3990_erp_block_queue (erp, 5*HZ);
1962 erp->function = dasd_3990_erp_compound_code;
1964 return erp;
1978 * erp pointer to the currently created ERP
1981 * erp modified ERP pointer
1985 dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense)
1989 struct dasd_device *device = erp->startdev;
1994 erp->function = dasd_3990_erp_compound_config;
2007 * erp pointer to the current (failed) ERP
2010 * erp (additional) ERP pointer
2014 dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense)
2017 if ((erp->function == dasd_3990_erp_compound_retry) &&
2018 (erp->status == DASD_CQR_NEED_ERP)) {
2020 dasd_3990_erp_compound_path(erp, sense);
2023 if ((erp->function == dasd_3990_erp_compound_path) &&
2024 (erp->status == DASD_CQR_NEED_ERP)) {
2026 erp = dasd_3990_erp_compound_code(erp, sense);
2029 if ((erp->function == dasd_3990_erp_compound_code) &&
2030 (erp->status == DASD_CQR_NEED_ERP)) {
2032 dasd_3990_erp_compound_config(erp, sense);
2036 if (erp->status == DASD_CQR_NEED_ERP)
2037 erp->status = DASD_CQR_FAILED;
2039 return erp;
2081 * erp pointer to the currently created default ERP
2088 dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense)
2091 struct dasd_device *device = erp->startdev;
2093 erp->function = dasd_3990_erp_inspect_32;
2102 dasd_3990_erp_compound_retry(erp, sense);
2119 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2124 erp = dasd_3990_erp_int_req(erp);
2131 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2135 erp = dasd_3990_erp_action_10_32(erp, sense);
2142 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2147 erp = dasd_3990_erp_action_1B_32(erp, sense);
2166 erp = dasd_3990_erp_action_4(erp, sense);
2173 erp = dasd_3990_erp_action_4(erp, sense);
2176 default: /* all others errors - default erp */
2181 return erp;
2215 static void dasd_3990_erp_account_error(struct dasd_ccw_req *erp)
2217 struct dasd_device *device = erp->startdev;
2218 __u8 lpum = erp->refers->irb.esw.esw1.lpum;
2257 * erp pointer to the currently created default ERP
2260 * erp_filled pointer to the erp
2264 dasd_3990_erp_control_check(struct dasd_ccw_req *erp)
2266 struct dasd_device *device = erp->startdev;
2268 if (scsw_cstat(&erp->refers->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK
2272 dasd_3990_erp_account_error(erp);
2273 erp = dasd_3990_erp_action_4(erp, NULL);
2275 return erp;
2286 * erp pointer to the currently created default ERP
2291 dasd_3990_erp_inspect(struct dasd_ccw_req *erp)
2298 erp_new = dasd_3990_erp_inspect_alias(erp);
2306 sense = dasd_get_sense(&erp->refers->irb);
2308 erp_new = dasd_3990_erp_control_check(erp);
2313 erp_new = dasd_3990_erp_inspect_24(erp, sense);
2318 erp_new = dasd_3990_erp_inspect_32(erp, sense);
2330 * the given cqr (or erp).
2331 * For a command mode cqr the erp is initialized as an default erp
2341 * erp pointer to new ERP-chain head
2348 struct dasd_ccw_req *erp;
2363 erp = dasd_alloc_erp_request(cqr->magic,
2365 if (IS_ERR(erp)) {
2378 return erp;
2384 erp->cpmode = 1;
2385 erp->cpaddr = PTR_ALIGN(erp->data, 64);
2386 tcw = erp->cpaddr;
2392 erp->cpaddr = cqr->cpaddr;
2395 ccw = erp->cpaddr;
2403 erp->flags = cqr->flags;
2404 erp->function = dasd_3990_erp_add_erp;
2405 erp->refers = cqr;
2406 erp->startdev = device;
2407 erp->memdev = device;
2408 erp->block = cqr->block;
2409 erp->magic = cqr->magic;
2410 erp->expires = cqr->expires;
2411 erp->retries = device->default_retries;
2412 erp->buildclk = get_tod_clock();
2413 erp->status = DASD_CQR_FILLED;
2415 return erp;
2431 * erp pointer to new ERP-chain head
2437 struct dasd_ccw_req *erp = NULL;
2439 /* add erp and initialize with default TIC */
2440 erp = dasd_3990_erp_add_erp(cqr);
2442 if (IS_ERR(erp))
2443 return erp;
2446 if (erp != cqr) {
2448 erp = dasd_3990_erp_inspect(erp);
2451 return erp;
2516 * cqr failed cqr (either original cqr or already an erp)
2519 * erp erp-pointer to the already defined error
2527 struct dasd_ccw_req *erp_head = cqr, /* save erp chain head */
2528 *erp_match = NULL; /* save erp chain head */
2531 if (cqr->refers == NULL) { /* return if not in erp */
2535 /* check the erp/cqr chain for current error */
2538 erp_match = cqr; /* save possible matching erp */
2539 cqr = cqr->refers; /* check next erp/cqr in queue */
2547 return erp_match; /* return address of matching erp */
2562 * erp ERP which is in progress with no retry left
2565 * erp modified/additional ERP
2568 dasd_3990_erp_further_erp(struct dasd_ccw_req *erp)
2571 struct dasd_device *device = erp->startdev;
2572 char *sense = dasd_get_sense(&erp->irb);
2575 if ((erp->function == dasd_3990_erp_bus_out) ||
2576 (erp->function == dasd_3990_erp_action_1) ||
2577 (erp->function == dasd_3990_erp_action_4)) {
2579 erp = dasd_3990_erp_action_1(erp);
2581 } else if (erp->function == dasd_3990_erp_action_1_sec) {
2582 erp = dasd_3990_erp_action_1_sec(erp);
2583 } else if (erp->function == dasd_3990_erp_action_5) {
2586 /* prepare erp for retry on different channel path */
2587 erp = dasd_3990_erp_action_1(erp);
2597 erp = dasd_3990_erp_DCTL(erp, 0x20);
2602 erp = dasd_3990_erp_DCTL(erp, 0x40);
2607 erp = dasd_3990_erp_DCTL(erp, 0x80);
2620 ((erp->function == dasd_3990_erp_compound_retry) ||
2621 (erp->function == dasd_3990_erp_compound_path) ||
2622 (erp->function == dasd_3990_erp_compound_code) ||
2623 (erp->function == dasd_3990_erp_compound_config))) {
2625 erp = dasd_3990_erp_compound(erp, sense);
2633 "ERP %px has run out of retries and failed\n", erp);
2635 erp->status = DASD_CQR_FAILED;
2638 return erp;
2650 * If retry counter of matching erp is already 0, it is checked if further
2655 * erp ERP that handles the actual error.
2656 * (matching erp)
2659 * erp modified/additional ERP
2663 struct dasd_ccw_req *erp)
2671 while (erp_done != erp) {
2682 /* free the finished erp request */
2687 if (erp->retries > 0) {
2689 char *sense = dasd_get_sense(&erp->refers->irb);
2692 if (sense && erp->function == dasd_3990_erp_action_4) {
2694 erp = dasd_3990_erp_action_4(erp, sense);
2697 erp->function == dasd_3990_erp_action_1B_32) {
2699 erp = dasd_3990_update_1B(erp, sense);
2701 } else if (sense && erp->function == dasd_3990_erp_int_req) {
2703 erp = dasd_3990_erp_int_req(erp);
2708 "%i retries left for erp %p",
2709 erp->retries, erp);
2712 erp->status = DASD_CQR_FILLED;
2718 erp = dasd_3990_erp_further_erp(erp);
2721 return erp;
2729 * control routine for 3990 erp actions.
2733 * cqr failed cqr (either original cqr or already an erp)
2736 * erp erp-pointer to the head of the ERP action chain.
2745 struct dasd_ccw_req *erp = NULL;
2761 /* double-check if current erp/cqr was successful */
2776 erp = dasd_3990_erp_in_erp(cqr);
2778 if (erp == NULL) {
2779 /* no matching erp found - set up erp */
2780 erp = dasd_3990_erp_additional_erp(cqr);
2781 if (IS_ERR(erp))
2782 return erp;
2784 /* matching erp found - set all leading erp's to DONE */
2785 erp = dasd_3990_erp_handle_match_erp(cqr, erp);
2794 if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) {
2795 erp->lpm = cqr->lpm;
2802 for (temp_erp = erp;
2811 if (list_empty(&erp->blocklist)) {
2813 /* add erp request before the cqr */
2814 list_add_tail(&erp->blocklist, &cqr->blocklist);
2819 return erp;