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((char *) &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 if (!test_bit(DASD_CQR_SUPPRESS_CR, &erp->flags))
1060 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1063 return erp;
1074 * erp current erp_head
1076 * erp new erp_head - pointer to new ERP
1079 dasd_3990_erp_bus_out(struct dasd_ccw_req * erp)
1082 struct dasd_device *device = erp->startdev;
1087 if (erp->function != dasd_3990_erp_bus_out) {
1088 erp->retries = 256;
1089 erp->function = dasd_3990_erp_bus_out;
1098 dasd_3990_erp_block_queue(erp, 60*HZ);
1102 return erp;
1113 * erp current erp_head
1115 * erp new erp_head - pointer to new ERP
1118 dasd_3990_erp_equip_check(struct dasd_ccw_req * erp, char *sense)
1121 struct dasd_device *device = erp->startdev;
1123 erp->function = dasd_3990_erp_equip_check;
1134 erp = dasd_3990_erp_action_1(erp);
1141 dasd_3990_handle_env_data(erp, sense);
1143 erp = dasd_3990_erp_action_4(erp, sense);
1151 erp = dasd_3990_erp_action_1(erp);
1159 erp = dasd_3990_erp_action_5(erp);
1161 return erp;
1172 * erp current erp_head
1174 * erp new erp_head - pointer to new ERP
1177 dasd_3990_erp_data_check(struct dasd_ccw_req * erp, char *sense)
1180 struct dasd_device *device = erp->startdev;
1182 erp->function = dasd_3990_erp_data_check;
1201 erp = dasd_3990_erp_action_4(erp, sense);
1209 erp = dasd_3990_erp_action_1(erp);
1217 erp = dasd_3990_erp_action_5(erp);
1220 return erp;
1231 * erp current erp_head
1233 * erp new erp_head - pointer to new ERP
1236 dasd_3990_erp_overrun(struct dasd_ccw_req * erp, char *sense)
1239 struct dasd_device *device = erp->startdev;
1241 erp->function = dasd_3990_erp_overrun;
1247 erp = dasd_3990_erp_action_5(erp);
1249 return erp;
1260 * erp current erp_head
1262 * erp new erp_head - pointer to new ERP
1265 dasd_3990_erp_inv_format(struct dasd_ccw_req * erp, char *sense)
1268 struct dasd_device *device = erp->startdev;
1270 erp->function = dasd_3990_erp_inv_format;
1278 dasd_3990_handle_env_data(erp, sense);
1280 erp = dasd_3990_erp_action_4(erp, sense);
1288 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1291 return erp;
1302 * erp already added default erp
1304 * erp pointer to original (failed) cqr.
1327 * erp current erp_head
1329 * erp new erp_head - pointer to new ERP
1332 dasd_3990_erp_env_data(struct dasd_ccw_req * erp, char *sense)
1335 struct dasd_device *device = erp->startdev;
1337 erp->function = dasd_3990_erp_env_data;
1341 dasd_3990_handle_env_data(erp, sense);
1345 erp = dasd_3990_erp_action_4(erp, sense);
1347 erp->status = DASD_CQR_FILLED;
1350 return erp;
1361 * erp already added default ERP
1364 * erp new erp_head - pointer to new ERP
1394 * erp current erp_head
1396 * erp new erp_head - pointer to new ERP
1399 dasd_3990_erp_file_prot(struct dasd_ccw_req * erp)
1402 struct dasd_device *device = erp->startdev;
1409 if (!test_bit(DASD_CQR_SUPPRESS_FP, &erp->flags))
1413 return dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1422 * If yes, it modifies the original and the erp request so that
1423 * the erp request can be started on a base device.
1426 * erp pointer to the currently created default ERP
1429 * erp pointer to the modified ERP, or NULL
1433 struct dasd_ccw_req *erp)
1435 struct dasd_ccw_req *cqr = erp->refers;
1441 sense = dasd_get_sense(&erp->refers->irb);
1466 erp->startdev = cqr->block->base;
1467 erp->function = dasd_3990_erp_inspect_alias;
1468 return erp;
1483 * erp pointer to the currently created default ERP
1486 * erp pointer to the (addtitional) ERP
1489 dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense)
1497 erp_filled = dasd_3990_erp_com_rej(erp, sense);
1501 erp_filled = dasd_3990_erp_int_req(erp);
1505 erp_filled = dasd_3990_erp_bus_out(erp);
1509 erp_filled = dasd_3990_erp_equip_check(erp, sense);
1513 erp_filled = dasd_3990_erp_data_check(erp, sense);
1517 erp_filled = dasd_3990_erp_overrun(erp, sense);
1521 erp_filled = dasd_3990_erp_inv_format(erp, sense);
1525 erp_filled = dasd_3990_erp_EOC(erp, sense);
1529 erp_filled = dasd_3990_erp_env_data(erp, sense);
1533 erp_filled = dasd_3990_erp_no_rec(erp, sense);
1537 erp_filled = dasd_3990_erp_file_prot(erp);
1542 erp_filled = erp;
1563 * erp current erp_head
1566 * erp modified erp_head
1569 dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense)
1572 struct dasd_device *device = erp->startdev;
1574 erp->retries = 256;
1575 erp->function = dasd_3990_erp_action_10_32;
1579 return erp;
1590 * The already created 'default erp' is used to get the link to
1591 * the erp chain, but it can not be used for this recovery
1595 * default_erp already added default erp.
1599 * erp new erp or
1609 struct dasd_ccw_req *erp;
1634 /* for imprecise ending just do default erp */
1655 erp = dasd_alloc_erp_request((char *) &cqr->magic,
1660 if (IS_ERR(erp)) {
1668 DE_data = erp->data;
1678 LO_data = erp->data + sizeof(struct DE_eckd_data);
1707 ccw = erp->cpaddr;
1727 /* fill erp related fields */
1728 erp->flags = default_erp->flags;
1729 erp->function = dasd_3990_erp_action_1B_32;
1730 erp->refers = default_erp->refers;
1731 erp->startdev = device;
1732 erp->memdev = device;
1733 erp->magic = default_erp->magic;
1734 erp->expires = default_erp->expires;
1735 erp->retries = 256;
1736 erp->buildclk = get_tod_clock();
1737 erp->status = DASD_CQR_FILLED;
1739 /* remove the default erp */
1742 return erp;
1756 * previous_erp already created previous erp.
1759 * erp modified erp
1768 struct dasd_ccw_req *erp;
1790 /* for imprecise ending just do default erp */
1815 erp = previous_erp;
1818 LO_data = erp->data + sizeof(struct DE_eckd_data);
1849 ccw = erp->cpaddr; /* addr of DE ccw */
1854 erp->status = DASD_CQR_FILLED;
1856 return erp;
1871 * erp pointer to the currently created ERP
1874 * erp modified ERP pointer
1878 dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense)
1883 erp->retries = 1;
1887 erp->retries = 2;
1891 erp->retries = 10;
1895 erp->retries = 256;
1902 erp->function = dasd_3990_erp_compound_retry;
1915 * erp pointer to the currently created ERP
1918 * erp modified ERP pointer
1922 dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense)
1925 dasd_3990_erp_alternate_path(erp);
1927 if (erp->status == DASD_CQR_FAILED &&
1928 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) {
1931 erp->lpm = dasd_path_get_opm(erp->startdev);
1932 erp->status = DASD_CQR_NEED_ERP;
1936 erp->function = dasd_3990_erp_compound_path;
1948 * erp pointer to the currently created ERP
1951 * erp NEW ERP pointer
1955 dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense)
1964 erp = dasd_3990_erp_DCTL(erp, 0x20);
1969 erp->retries = 1;
1971 dasd_3990_erp_block_queue (erp, 5*HZ);
1980 erp->function = dasd_3990_erp_compound_code;
1982 return erp;
1996 * erp pointer to the currently created ERP
1999 * erp modified ERP pointer
2003 dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense)
2011 struct dasd_device *device = erp->startdev;
2018 erp->function = dasd_3990_erp_compound_config;
2031 * erp pointer to the current (failed) ERP
2034 * erp (additional) ERP pointer
2038 dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense)
2041 if ((erp->function == dasd_3990_erp_compound_retry) &&
2042 (erp->status == DASD_CQR_NEED_ERP)) {
2044 dasd_3990_erp_compound_path(erp, sense);
2047 if ((erp->function == dasd_3990_erp_compound_path) &&
2048 (erp->status == DASD_CQR_NEED_ERP)) {
2050 erp = dasd_3990_erp_compound_code(erp, sense);
2053 if ((erp->function == dasd_3990_erp_compound_code) &&
2054 (erp->status == DASD_CQR_NEED_ERP)) {
2056 dasd_3990_erp_compound_config(erp, sense);
2060 if (erp->status == DASD_CQR_NEED_ERP)
2061 erp->status = DASD_CQR_FAILED;
2063 return erp;
2105 * erp pointer to the currently created default ERP
2112 dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense)
2115 struct dasd_device *device = erp->startdev;
2117 erp->function = dasd_3990_erp_inspect_32;
2126 dasd_3990_erp_compound_retry(erp, sense);
2143 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2148 erp = dasd_3990_erp_int_req(erp);
2156 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2160 erp = dasd_3990_erp_action_10_32(erp, sense);
2170 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2175 erp = dasd_3990_erp_action_1B_32(erp, sense);
2194 erp = dasd_3990_erp_action_4(erp, sense);
2201 erp = dasd_3990_erp_action_4(erp, sense);
2204 default: /* all others errors - default erp */
2209 return erp;
2243 static void dasd_3990_erp_account_error(struct dasd_ccw_req *erp)
2245 struct dasd_device *device = erp->startdev;
2246 __u8 lpum = erp->refers->irb.esw.esw1.lpum;
2285 * erp pointer to the currently created default ERP
2288 * erp_filled pointer to the erp
2292 dasd_3990_erp_control_check(struct dasd_ccw_req *erp)
2294 struct dasd_device *device = erp->startdev;
2296 if (scsw_cstat(&erp->refers->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK
2300 dasd_3990_erp_account_error(erp);
2301 erp = dasd_3990_erp_action_4(erp, NULL);
2303 return erp;
2314 * erp pointer to the currently created default ERP
2319 dasd_3990_erp_inspect(struct dasd_ccw_req *erp)
2326 erp_new = dasd_3990_erp_inspect_alias(erp);
2334 sense = dasd_get_sense(&erp->refers->irb);
2336 erp_new = dasd_3990_erp_control_check(erp);
2341 erp_new = dasd_3990_erp_inspect_24(erp, sense);
2346 erp_new = dasd_3990_erp_inspect_32(erp, sense);
2358 * the given cqr (or erp).
2359 * For a command mode cqr the erp is initialized as an default erp
2369 * erp pointer to new ERP-chain head
2376 struct dasd_ccw_req *erp;
2391 erp = dasd_alloc_erp_request((char *) &cqr->magic,
2393 if (IS_ERR(erp)) {
2406 return erp;
2412 erp->cpmode = 1;
2413 erp->cpaddr = PTR_ALIGN(erp->data, 64);
2414 tcw = erp->cpaddr;
2420 erp->cpaddr = cqr->cpaddr;
2423 ccw = erp->cpaddr;
2431 erp->flags = cqr->flags;
2432 erp->function = dasd_3990_erp_add_erp;
2433 erp->refers = cqr;
2434 erp->startdev = device;
2435 erp->memdev = device;
2436 erp->block = cqr->block;
2437 erp->magic = cqr->magic;
2438 erp->expires = cqr->expires;
2439 erp->retries = device->default_retries;
2440 erp->buildclk = get_tod_clock();
2441 erp->status = DASD_CQR_FILLED;
2443 return erp;
2459 * erp pointer to new ERP-chain head
2465 struct dasd_ccw_req *erp = NULL;
2467 /* add erp and initialize with default TIC */
2468 erp = dasd_3990_erp_add_erp(cqr);
2470 if (IS_ERR(erp))
2471 return erp;
2474 if (erp != cqr) {
2476 erp = dasd_3990_erp_inspect(erp);
2479 return erp;
2544 * cqr failed cqr (either original cqr or already an erp)
2547 * erp erp-pointer to the already defined error
2555 struct dasd_ccw_req *erp_head = cqr, /* save erp chain head */
2556 *erp_match = NULL; /* save erp chain head */
2559 if (cqr->refers == NULL) { /* return if not in erp */
2563 /* check the erp/cqr chain for current error */
2566 erp_match = cqr; /* save possible matching erp */
2567 cqr = cqr->refers; /* check next erp/cqr in queue */
2575 return erp_match; /* return address of matching erp */
2590 * erp ERP which is in progress with no retry left
2593 * erp modified/additional ERP
2596 dasd_3990_erp_further_erp(struct dasd_ccw_req *erp)
2599 struct dasd_device *device = erp->startdev;
2600 char *sense = dasd_get_sense(&erp->irb);
2603 if ((erp->function == dasd_3990_erp_bus_out) ||
2604 (erp->function == dasd_3990_erp_action_1) ||
2605 (erp->function == dasd_3990_erp_action_4)) {
2607 erp = dasd_3990_erp_action_1(erp);
2609 } else if (erp->function == dasd_3990_erp_action_1_sec) {
2610 erp = dasd_3990_erp_action_1_sec(erp);
2611 } else if (erp->function == dasd_3990_erp_action_5) {
2614 /* prepare erp for retry on different channel path */
2615 erp = dasd_3990_erp_action_1(erp);
2625 erp = dasd_3990_erp_DCTL(erp, 0x20);
2630 erp = dasd_3990_erp_DCTL(erp, 0x40);
2635 erp = dasd_3990_erp_DCTL(erp, 0x80);
2648 ((erp->function == dasd_3990_erp_compound_retry) ||
2649 (erp->function == dasd_3990_erp_compound_path) ||
2650 (erp->function == dasd_3990_erp_compound_code) ||
2651 (erp->function == dasd_3990_erp_compound_config))) {
2653 erp = dasd_3990_erp_compound(erp, sense);
2661 "ERP %p has run out of retries and failed\n", erp);
2663 erp->status = DASD_CQR_FAILED;
2666 return erp;
2678 * If retry counter of matching erp is already 0, it is checked if further
2683 * erp ERP that handles the actual error.
2684 * (matching erp)
2687 * erp modified/additional ERP
2691 struct dasd_ccw_req *erp)
2699 while (erp_done != erp) {
2711 /* free the finished erp request */
2716 if (erp->retries > 0) {
2718 char *sense = dasd_get_sense(&erp->refers->irb);
2721 if (sense && erp->function == dasd_3990_erp_action_4) {
2723 erp = dasd_3990_erp_action_4(erp, sense);
2726 erp->function == dasd_3990_erp_action_1B_32) {
2728 erp = dasd_3990_update_1B(erp, sense);
2730 } else if (sense && erp->function == dasd_3990_erp_int_req) {
2732 erp = dasd_3990_erp_int_req(erp);
2737 "%i retries left for erp %p",
2738 erp->retries, erp);
2741 erp->status = DASD_CQR_FILLED;
2747 erp = dasd_3990_erp_further_erp(erp);
2750 return erp;
2758 * control routine for 3990 erp actions.
2762 * cqr failed cqr (either original cqr or already an erp)
2765 * erp erp-pointer to the head of the ERP action chain.
2774 struct dasd_ccw_req *erp = NULL;
2792 /* double-check if current erp/cqr was successful */
2807 erp = dasd_3990_erp_in_erp(cqr);
2809 if (erp == NULL) {
2810 /* no matching erp found - set up erp */
2811 erp = dasd_3990_erp_additional_erp(cqr);
2812 if (IS_ERR(erp))
2813 return erp;
2815 /* matching erp found - set all leading erp's to DONE */
2816 erp = dasd_3990_erp_handle_match_erp(cqr, erp);
2825 if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) {
2826 erp->lpm = cqr->lpm;
2833 for (temp_erp = erp;
2844 if (list_empty(&erp->blocklist)) {
2846 /* add erp request before the cqr */
2847 list_add_tail(&erp->blocklist, &cqr->blocklist);
2852 return erp;