Lines Matching defs:erp
43 * the status of the original cqr / erp to the given (final) status
46 * erp request to be blocked
53 dasd_3990_erp_cleanup(struct dasd_ccw_req * erp, char final_status)
55 struct dasd_ccw_req *cqr = erp->refers;
57 dasd_free_erp_request(erp, erp->memdev);
71 static void dasd_3990_erp_block_queue(struct dasd_ccw_req *erp, int expires)
74 struct dasd_device *device = erp->startdev;
83 erp->status = DASD_CQR_FILLED;
84 if (erp->block)
85 dasd_block_set_timer(erp->block, expires);
98 * erp current erp
100 * erp modified erp
103 dasd_3990_erp_int_req(struct dasd_ccw_req * erp)
106 struct dasd_device *device = erp->startdev;
111 if (erp->function != dasd_3990_erp_int_req) {
113 erp->retries = 256;
114 erp->function = dasd_3990_erp_int_req;
123 dasd_3990_erp_block_queue(erp, 60*HZ);
126 return erp;
139 * erp pointer to the current ERP
142 * erp modified pointer to the ERP
145 dasd_3990_erp_alternate_path(struct dasd_ccw_req * erp)
147 struct dasd_device *device = erp->startdev;
155 if (erp->lpm == 0)
156 erp->lpm = dasd_path_get_opm(device) &
157 ~(erp->irb.esw.esw0.sublog.lpum);
159 erp->lpm &= ~(erp->irb.esw.esw0.sublog.lpum);
161 if ((erp->lpm & opm) != 0x00) {
165 erp->lpm, erp->irb.esw.esw0.sublog.lpum, opm);
168 erp->status = DASD_CQR_FILLED;
169 erp->retries = 10;
173 "/opm=%x)\n", erp->irb.esw.esw0.sublog.lpum, opm);
176 erp->status = DASD_CQR_FAILED;
188 * erp pointer to the current (failed) ERP
196 dasd_3990_erp_DCTL(struct dasd_ccw_req * erp, char modifier)
199 struct dasd_device *device = erp->startdev;
204 dctl_cqr = dasd_alloc_erp_request(erp->magic, 1,
210 erp->status = DASD_CQR_FAILED;
211 return erp;
224 dctl_cqr->flags = erp->flags;
226 dctl_cqr->refers = erp;
229 dctl_cqr->magic = erp->magic;
256 * erp pointer to the current ERP
259 * erp pointer to the ERP
262 static struct dasd_ccw_req *dasd_3990_erp_action_1_sec(struct dasd_ccw_req *erp)
264 erp->function = dasd_3990_erp_action_1_sec;
265 dasd_3990_erp_alternate_path(erp);
266 return erp;
269 static struct dasd_ccw_req *dasd_3990_erp_action_1(struct dasd_ccw_req *erp)
271 erp->function = dasd_3990_erp_action_1;
272 dasd_3990_erp_alternate_path(erp);
273 if (erp->status == DASD_CQR_FAILED &&
274 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) {
275 erp->status = DASD_CQR_FILLED;
276 erp->retries = 10;
277 erp->lpm = dasd_path_get_opm(erp->startdev);
278 erp->function = dasd_3990_erp_action_1_sec;
280 return erp;
295 * erp pointer to the current ERP
298 * erp pointer to the ERP
302 dasd_3990_erp_action_4(struct dasd_ccw_req * erp, char *sense)
305 struct dasd_device *device = erp->startdev;
310 if (erp->function != dasd_3990_erp_action_4) {
315 erp->retries = 256;
316 erp->function = dasd_3990_erp_action_4;
324 erp->retries);
326 dasd_3990_erp_block_queue(erp, 30*HZ);
332 erp->retries);
333 dasd_3990_erp_block_queue(erp, HZ);
339 erp->retries);
340 erp->status = DASD_CQR_FILLED;
344 return erp;
362 * erp pointer to the current ERP
365 * erp pointer to the ERP
369 dasd_3990_erp_action_5(struct dasd_ccw_req * erp)
373 erp->retries = 10;
374 erp->function = dasd_3990_erp_action_5;
376 return erp;
395 dasd_3990_handle_env_data(struct dasd_ccw_req * erp, char *sense)
398 struct dasd_device *device = erp->startdev;
984 dasd_eer_write(device, erp->refers,
1025 * erp current erp_head
1029 * erp 'new' erp_head - pointer to new ERP
1032 dasd_3990_erp_com_rej(struct dasd_ccw_req * erp, char *sense)
1035 struct dasd_device *device = erp->startdev;
1037 erp->function = dasd_3990_erp_com_rej;
1045 dasd_3990_handle_env_data(erp, sense);
1047 erp->retries = 5;
1052 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1056 set_bit(DASD_CQR_SUPPRESS_CR, &erp->refers->flags);
1057 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1061 if (!test_bit(DASD_CQR_SUPPRESS_CR, &erp->flags))
1065 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1068 return erp;
1079 * erp current erp_head
1081 * erp new erp_head - pointer to new ERP
1084 dasd_3990_erp_bus_out(struct dasd_ccw_req * erp)
1087 struct dasd_device *device = erp->startdev;
1092 if (erp->function != dasd_3990_erp_bus_out) {
1093 erp->retries = 256;
1094 erp->function = dasd_3990_erp_bus_out;
1103 dasd_3990_erp_block_queue(erp, 60*HZ);
1107 return erp;
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)
1126 struct dasd_device *device = erp->startdev;
1128 erp->function = dasd_3990_erp_equip_check;
1139 erp = dasd_3990_erp_action_1(erp);
1146 dasd_3990_handle_env_data(erp, sense);
1148 erp = dasd_3990_erp_action_4(erp, sense);
1156 erp = dasd_3990_erp_action_1(erp);
1164 erp = dasd_3990_erp_action_5(erp);
1166 return erp;
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)
1185 struct dasd_device *device = erp->startdev;
1187 erp->function = dasd_3990_erp_data_check;
1206 erp = dasd_3990_erp_action_4(erp, sense);
1214 erp = dasd_3990_erp_action_1(erp);
1222 erp = dasd_3990_erp_action_5(erp);
1225 return erp;
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)
1244 struct dasd_device *device = erp->startdev;
1246 erp->function = dasd_3990_erp_overrun;
1252 erp = dasd_3990_erp_action_5(erp);
1254 return erp;
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)
1273 struct dasd_device *device = erp->startdev;
1275 erp->function = dasd_3990_erp_inv_format;
1283 dasd_3990_handle_env_data(erp, sense);
1285 erp = dasd_3990_erp_action_4(erp, sense);
1293 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1296 return erp;
1307 * erp already added default erp
1309 * erp pointer to original (failed) cqr.
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)
1340 struct dasd_device *device = erp->startdev;
1342 erp->function = dasd_3990_erp_env_data;
1346 dasd_3990_handle_env_data(erp, sense);
1350 erp = dasd_3990_erp_action_4(erp, sense);
1352 erp->status = DASD_CQR_FILLED;
1355 return erp;
1366 * erp already added default ERP
1369 * erp new erp_head - pointer to new ERP
1399 * erp current erp_head
1401 * erp new erp_head - pointer to new ERP
1404 dasd_3990_erp_file_prot(struct dasd_ccw_req * erp)
1407 struct dasd_device *device = erp->startdev;
1414 if (!test_bit(DASD_CQR_SUPPRESS_FP, &erp->flags))
1418 return dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1427 * If yes, it modifies the original and the erp request so that
1428 * the erp request can be started on a base device.
1431 * erp pointer to the currently created default ERP
1434 * erp pointer to the modified ERP, or NULL
1438 struct dasd_ccw_req *erp)
1440 struct dasd_ccw_req *cqr = erp->refers;
1446 sense = dasd_get_sense(&erp->refers->irb);
1471 erp->startdev = cqr->block->base;
1472 erp->function = dasd_3990_erp_inspect_alias;
1473 return erp;
1488 * erp pointer to the currently created default ERP
1491 * erp pointer to the (addtitional) ERP
1494 dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense)
1502 erp_filled = dasd_3990_erp_com_rej(erp, sense);
1506 erp_filled = dasd_3990_erp_int_req(erp);
1510 erp_filled = dasd_3990_erp_bus_out(erp);
1514 erp_filled = dasd_3990_erp_equip_check(erp, sense);
1518 erp_filled = dasd_3990_erp_data_check(erp, sense);
1522 erp_filled = dasd_3990_erp_overrun(erp, sense);
1526 erp_filled = dasd_3990_erp_inv_format(erp, sense);
1530 erp_filled = dasd_3990_erp_EOC(erp, sense);
1534 erp_filled = dasd_3990_erp_env_data(erp, sense);
1538 erp_filled = dasd_3990_erp_no_rec(erp, sense);
1542 erp_filled = dasd_3990_erp_file_prot(erp);
1547 erp_filled = erp;
1568 * erp current erp_head
1571 * erp modified erp_head
1574 dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense)
1577 struct dasd_device *device = erp->startdev;
1579 erp->retries = 256;
1580 erp->function = dasd_3990_erp_action_10_32;
1584 return erp;
1595 * The already created 'default erp' is used to get the link to
1596 * the erp chain, but it can not be used for this recovery
1600 * default_erp already added default erp.
1604 * erp new erp or
1614 struct dasd_ccw_req *erp;
1639 /* for imprecise ending just do default erp */
1660 erp = dasd_alloc_erp_request(cqr->magic,
1665 if (IS_ERR(erp)) {
1673 DE_data = erp->data;
1683 LO_data = erp->data + sizeof(struct DE_eckd_data);
1712 ccw = erp->cpaddr;
1732 /* fill erp related fields */
1733 erp->flags = default_erp->flags;
1734 erp->function = dasd_3990_erp_action_1B_32;
1735 erp->refers = default_erp->refers;
1736 erp->startdev = device;
1737 erp->memdev = device;
1738 erp->magic = default_erp->magic;
1739 erp->expires = default_erp->expires;
1740 erp->retries = 256;
1741 erp->buildclk = get_tod_clock();
1742 erp->status = DASD_CQR_FILLED;
1744 /* remove the default erp */
1747 return erp;
1761 * previous_erp already created previous erp.
1764 * erp modified erp
1773 struct dasd_ccw_req *erp;
1795 /* for imprecise ending just do default erp */
1820 erp = previous_erp;
1823 LO_data = erp->data + sizeof(struct DE_eckd_data);
1854 ccw = erp->cpaddr; /* addr of DE ccw */
1859 erp->status = DASD_CQR_FILLED;
1861 return erp;
1876 * erp pointer to the currently created ERP
1879 * erp modified ERP pointer
1883 dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense)
1888 erp->retries = 1;
1892 erp->retries = 2;
1896 erp->retries = 10;
1900 erp->retries = 256;
1907 erp->function = dasd_3990_erp_compound_retry;
1920 * erp pointer to the currently created ERP
1923 * erp modified ERP pointer
1927 dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense)
1930 dasd_3990_erp_alternate_path(erp);
1932 if (erp->status == DASD_CQR_FAILED &&
1933 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) {
1936 erp->lpm = dasd_path_get_opm(erp->startdev);
1937 erp->status = DASD_CQR_NEED_ERP;
1941 erp->function = dasd_3990_erp_compound_path;
1953 * erp pointer to the currently created ERP
1956 * erp NEW ERP pointer
1960 dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense)
1969 erp = dasd_3990_erp_DCTL(erp, 0x20);
1974 erp->retries = 1;
1976 dasd_3990_erp_block_queue (erp, 5*HZ);
1985 erp->function = dasd_3990_erp_compound_code;
1987 return erp;
2001 * erp pointer to the currently created ERP
2004 * erp modified ERP pointer
2008 dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense)
2016 struct dasd_device *device = erp->startdev;
2023 erp->function = dasd_3990_erp_compound_config;
2036 * erp pointer to the current (failed) ERP
2039 * erp (additional) ERP pointer
2043 dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense)
2046 if ((erp->function == dasd_3990_erp_compound_retry) &&
2047 (erp->status == DASD_CQR_NEED_ERP)) {
2049 dasd_3990_erp_compound_path(erp, sense);
2052 if ((erp->function == dasd_3990_erp_compound_path) &&
2053 (erp->status == DASD_CQR_NEED_ERP)) {
2055 erp = dasd_3990_erp_compound_code(erp, sense);
2058 if ((erp->function == dasd_3990_erp_compound_code) &&
2059 (erp->status == DASD_CQR_NEED_ERP)) {
2061 dasd_3990_erp_compound_config(erp, sense);
2065 if (erp->status == DASD_CQR_NEED_ERP)
2066 erp->status = DASD_CQR_FAILED;
2068 return erp;
2110 * erp pointer to the currently created default ERP
2117 dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense)
2120 struct dasd_device *device = erp->startdev;
2122 erp->function = dasd_3990_erp_inspect_32;
2131 dasd_3990_erp_compound_retry(erp, sense);
2148 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2153 erp = dasd_3990_erp_int_req(erp);
2161 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2165 erp = dasd_3990_erp_action_10_32(erp, sense);
2175 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2180 erp = dasd_3990_erp_action_1B_32(erp, sense);
2199 erp = dasd_3990_erp_action_4(erp, sense);
2206 erp = dasd_3990_erp_action_4(erp, sense);
2209 default: /* all others errors - default erp */
2214 return erp;
2248 static void dasd_3990_erp_account_error(struct dasd_ccw_req *erp)
2250 struct dasd_device *device = erp->startdev;
2251 __u8 lpum = erp->refers->irb.esw.esw1.lpum;
2290 * erp pointer to the currently created default ERP
2293 * erp_filled pointer to the erp
2297 dasd_3990_erp_control_check(struct dasd_ccw_req *erp)
2299 struct dasd_device *device = erp->startdev;
2301 if (scsw_cstat(&erp->refers->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK
2305 dasd_3990_erp_account_error(erp);
2306 erp = dasd_3990_erp_action_4(erp, NULL);
2308 return erp;
2319 * erp pointer to the currently created default ERP
2324 dasd_3990_erp_inspect(struct dasd_ccw_req *erp)
2331 erp_new = dasd_3990_erp_inspect_alias(erp);
2339 sense = dasd_get_sense(&erp->refers->irb);
2341 erp_new = dasd_3990_erp_control_check(erp);
2346 erp_new = dasd_3990_erp_inspect_24(erp, sense);
2351 erp_new = dasd_3990_erp_inspect_32(erp, sense);
2363 * the given cqr (or erp).
2364 * For a command mode cqr the erp is initialized as an default erp
2374 * erp pointer to new ERP-chain head
2381 struct dasd_ccw_req *erp;
2396 erp = dasd_alloc_erp_request(cqr->magic,
2398 if (IS_ERR(erp)) {
2411 return erp;
2417 erp->cpmode = 1;
2418 erp->cpaddr = PTR_ALIGN(erp->data, 64);
2419 tcw = erp->cpaddr;
2425 erp->cpaddr = cqr->cpaddr;
2428 ccw = erp->cpaddr;
2436 erp->flags = cqr->flags;
2437 erp->function = dasd_3990_erp_add_erp;
2438 erp->refers = cqr;
2439 erp->startdev = device;
2440 erp->memdev = device;
2441 erp->block = cqr->block;
2442 erp->magic = cqr->magic;
2443 erp->expires = cqr->expires;
2444 erp->retries = device->default_retries;
2445 erp->buildclk = get_tod_clock();
2446 erp->status = DASD_CQR_FILLED;
2448 return erp;
2464 * erp pointer to new ERP-chain head
2470 struct dasd_ccw_req *erp = NULL;
2472 /* add erp and initialize with default TIC */
2473 erp = dasd_3990_erp_add_erp(cqr);
2475 if (IS_ERR(erp))
2476 return erp;
2479 if (erp != cqr) {
2481 erp = dasd_3990_erp_inspect(erp);
2484 return erp;
2549 * cqr failed cqr (either original cqr or already an erp)
2552 * erp erp-pointer to the already defined error
2560 struct dasd_ccw_req *erp_head = cqr, /* save erp chain head */
2561 *erp_match = NULL; /* save erp chain head */
2564 if (cqr->refers == NULL) { /* return if not in erp */
2568 /* check the erp/cqr chain for current error */
2571 erp_match = cqr; /* save possible matching erp */
2572 cqr = cqr->refers; /* check next erp/cqr in queue */
2580 return erp_match; /* return address of matching erp */
2595 * erp ERP which is in progress with no retry left
2598 * erp modified/additional ERP
2601 dasd_3990_erp_further_erp(struct dasd_ccw_req *erp)
2604 struct dasd_device *device = erp->startdev;
2605 char *sense = dasd_get_sense(&erp->irb);
2608 if ((erp->function == dasd_3990_erp_bus_out) ||
2609 (erp->function == dasd_3990_erp_action_1) ||
2610 (erp->function == dasd_3990_erp_action_4)) {
2612 erp = dasd_3990_erp_action_1(erp);
2614 } else if (erp->function == dasd_3990_erp_action_1_sec) {
2615 erp = dasd_3990_erp_action_1_sec(erp);
2616 } else if (erp->function == dasd_3990_erp_action_5) {
2619 /* prepare erp for retry on different channel path */
2620 erp = dasd_3990_erp_action_1(erp);
2630 erp = dasd_3990_erp_DCTL(erp, 0x20);
2635 erp = dasd_3990_erp_DCTL(erp, 0x40);
2640 erp = dasd_3990_erp_DCTL(erp, 0x80);
2653 ((erp->function == dasd_3990_erp_compound_retry) ||
2654 (erp->function == dasd_3990_erp_compound_path) ||
2655 (erp->function == dasd_3990_erp_compound_code) ||
2656 (erp->function == dasd_3990_erp_compound_config))) {
2658 erp = dasd_3990_erp_compound(erp, sense);
2666 "ERP %p has run out of retries and failed\n", erp);
2668 erp->status = DASD_CQR_FAILED;
2671 return erp;
2683 * If retry counter of matching erp is already 0, it is checked if further
2688 * erp ERP that handles the actual error.
2689 * (matching erp)
2692 * erp modified/additional ERP
2696 struct dasd_ccw_req *erp)
2704 while (erp_done != erp) {
2716 /* free the finished erp request */
2721 if (erp->retries > 0) {
2723 char *sense = dasd_get_sense(&erp->refers->irb);
2726 if (sense && erp->function == dasd_3990_erp_action_4) {
2728 erp = dasd_3990_erp_action_4(erp, sense);
2731 erp->function == dasd_3990_erp_action_1B_32) {
2733 erp = dasd_3990_update_1B(erp, sense);
2735 } else if (sense && erp->function == dasd_3990_erp_int_req) {
2737 erp = dasd_3990_erp_int_req(erp);
2742 "%i retries left for erp %p",
2743 erp->retries, erp);
2746 erp->status = DASD_CQR_FILLED;
2752 erp = dasd_3990_erp_further_erp(erp);
2755 return erp;
2763 * control routine for 3990 erp actions.
2767 * cqr failed cqr (either original cqr or already an erp)
2770 * erp erp-pointer to the head of the ERP action chain.
2779 struct dasd_ccw_req *erp = NULL;
2797 /* double-check if current erp/cqr was successful */
2812 erp = dasd_3990_erp_in_erp(cqr);
2814 if (erp == NULL) {
2815 /* no matching erp found - set up erp */
2816 erp = dasd_3990_erp_additional_erp(cqr);
2817 if (IS_ERR(erp))
2818 return erp;
2820 /* matching erp found - set all leading erp's to DONE */
2821 erp = dasd_3990_erp_handle_match_erp(cqr, erp);
2830 if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) {
2831 erp->lpm = cqr->lpm;
2838 for (temp_erp = erp;
2849 if (list_empty(&erp->blocklist)) {
2851 /* add erp request before the cqr */
2852 list_add_tail(&erp->blocklist, &cqr->blocklist);
2857 return erp;