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;
1392 return dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
1401 * If yes, it modifies the original and the erp request so that
1402 * the erp request can be started on a base device.
1405 * erp pointer to the currently created default ERP
1408 * erp pointer to the modified ERP, or NULL
1412 struct dasd_ccw_req *erp)
1414 struct dasd_ccw_req *cqr = erp->refers;
1420 sense = dasd_get_sense(&erp->refers->irb);
1445 erp->startdev = cqr->block->base;
1446 erp->function = dasd_3990_erp_inspect_alias;
1447 return erp;
1462 * erp pointer to the currently created default ERP
1465 * erp pointer to the (addtitional) ERP
1468 dasd_3990_erp_inspect_24(struct dasd_ccw_req * erp, char *sense)
1476 erp_filled = dasd_3990_erp_com_rej(erp, sense);
1480 erp_filled = dasd_3990_erp_int_req(erp);
1484 erp_filled = dasd_3990_erp_bus_out(erp);
1488 erp_filled = dasd_3990_erp_equip_check(erp, sense);
1492 erp_filled = dasd_3990_erp_data_check(erp, sense);
1496 erp_filled = dasd_3990_erp_overrun(erp, sense);
1500 erp_filled = dasd_3990_erp_inv_format(erp, sense);
1504 erp_filled = dasd_3990_erp_EOC(erp, sense);
1508 erp_filled = dasd_3990_erp_env_data(erp, sense);
1512 erp_filled = dasd_3990_erp_no_rec(erp, sense);
1516 erp_filled = dasd_3990_erp_file_prot(erp);
1521 erp_filled = erp;
1542 * erp current erp_head
1545 * erp modified erp_head
1548 dasd_3990_erp_action_10_32(struct dasd_ccw_req * erp, char *sense)
1551 struct dasd_device *device = erp->startdev;
1553 erp->retries = 256;
1554 erp->function = dasd_3990_erp_action_10_32;
1558 return erp;
1569 * The already created 'default erp' is used to get the link to
1570 * the erp chain, but it can not be used for this recovery
1574 * default_erp already added default erp.
1578 * erp new erp or
1588 struct dasd_ccw_req *erp;
1613 /* for imprecise ending just do default erp */
1634 erp = dasd_alloc_erp_request(cqr->magic,
1639 if (IS_ERR(erp)) {
1646 DE_data = erp->data;
1656 LO_data = erp->data + sizeof(struct DE_eckd_data);
1685 ccw = erp->cpaddr;
1705 /* fill erp related fields */
1706 erp->flags = default_erp->flags;
1707 erp->function = dasd_3990_erp_action_1B_32;
1708 erp->refers = default_erp->refers;
1709 erp->startdev = device;
1710 erp->memdev = device;
1711 erp->magic = default_erp->magic;
1712 erp->expires = default_erp->expires;
1713 erp->retries = 256;
1714 erp->buildclk = get_tod_clock();
1715 erp->status = DASD_CQR_FILLED;
1717 /* remove the default erp */
1720 return erp;
1734 * previous_erp already created previous erp.
1737 * erp modified erp
1746 struct dasd_ccw_req *erp;
1768 /* for imprecise ending just do default erp */
1791 erp = previous_erp;
1794 LO_data = erp->data + sizeof(struct DE_eckd_data);
1825 ccw = erp->cpaddr; /* addr of DE ccw */
1830 erp->status = DASD_CQR_FILLED;
1832 return erp;
1847 * erp pointer to the currently created ERP
1850 * erp modified ERP pointer
1854 dasd_3990_erp_compound_retry(struct dasd_ccw_req * erp, char *sense)
1859 erp->retries = 1;
1863 erp->retries = 2;
1867 erp->retries = 10;
1871 erp->retries = 256;
1878 erp->function = dasd_3990_erp_compound_retry;
1891 * erp pointer to the currently created ERP
1894 * erp modified ERP pointer
1898 dasd_3990_erp_compound_path(struct dasd_ccw_req * erp, char *sense)
1901 dasd_3990_erp_alternate_path(erp);
1903 if (erp->status == DASD_CQR_FAILED &&
1904 !test_bit(DASD_CQR_VERIFY_PATH, &erp->flags)) {
1907 erp->lpm = dasd_path_get_opm(erp->startdev);
1908 erp->status = DASD_CQR_NEED_ERP;
1912 erp->function = dasd_3990_erp_compound_path;
1924 * erp pointer to the currently created ERP
1927 * erp NEW ERP pointer
1931 dasd_3990_erp_compound_code(struct dasd_ccw_req * erp, char *sense)
1940 erp = dasd_3990_erp_DCTL(erp, 0x20);
1945 erp->retries = 1;
1947 dasd_3990_erp_block_queue (erp, 5*HZ);
1956 erp->function = dasd_3990_erp_compound_code;
1958 return erp;
1972 * erp pointer to the currently created ERP
1975 * erp modified ERP pointer
1979 dasd_3990_erp_compound_config(struct dasd_ccw_req * erp, char *sense)
1983 struct dasd_device *device = erp->startdev;
1988 erp->function = dasd_3990_erp_compound_config;
2001 * erp pointer to the current (failed) ERP
2004 * erp (additional) ERP pointer
2008 dasd_3990_erp_compound(struct dasd_ccw_req * erp, char *sense)
2011 if ((erp->function == dasd_3990_erp_compound_retry) &&
2012 (erp->status == DASD_CQR_NEED_ERP)) {
2014 dasd_3990_erp_compound_path(erp, sense);
2017 if ((erp->function == dasd_3990_erp_compound_path) &&
2018 (erp->status == DASD_CQR_NEED_ERP)) {
2020 erp = dasd_3990_erp_compound_code(erp, sense);
2023 if ((erp->function == dasd_3990_erp_compound_code) &&
2024 (erp->status == DASD_CQR_NEED_ERP)) {
2026 dasd_3990_erp_compound_config(erp, sense);
2030 if (erp->status == DASD_CQR_NEED_ERP)
2031 erp->status = DASD_CQR_FAILED;
2033 return erp;
2075 * erp pointer to the currently created default ERP
2082 dasd_3990_erp_inspect_32(struct dasd_ccw_req * erp, char *sense)
2085 struct dasd_device *device = erp->startdev;
2087 erp->function = dasd_3990_erp_inspect_32;
2096 dasd_3990_erp_compound_retry(erp, sense);
2113 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2118 erp = dasd_3990_erp_int_req(erp);
2125 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2129 erp = dasd_3990_erp_action_10_32(erp, sense);
2136 erp = dasd_3990_erp_cleanup(erp, DASD_CQR_FAILED);
2141 erp = dasd_3990_erp_action_1B_32(erp, sense);
2160 erp = dasd_3990_erp_action_4(erp, sense);
2167 erp = dasd_3990_erp_action_4(erp, sense);
2170 default: /* all others errors - default erp */
2175 return erp;
2209 static void dasd_3990_erp_account_error(struct dasd_ccw_req *erp)
2211 struct dasd_device *device = erp->startdev;
2212 __u8 lpum = erp->refers->irb.esw.esw1.lpum;
2251 * erp pointer to the currently created default ERP
2254 * erp_filled pointer to the erp
2258 dasd_3990_erp_control_check(struct dasd_ccw_req *erp)
2260 struct dasd_device *device = erp->startdev;
2262 if (scsw_cstat(&erp->refers->irb.scsw) & (SCHN_STAT_INTF_CTRL_CHK
2266 dasd_3990_erp_account_error(erp);
2267 erp = dasd_3990_erp_action_4(erp, NULL);
2269 return erp;
2280 * erp pointer to the currently created default ERP
2285 dasd_3990_erp_inspect(struct dasd_ccw_req *erp)
2292 erp_new = dasd_3990_erp_inspect_alias(erp);
2300 sense = dasd_get_sense(&erp->refers->irb);
2302 erp_new = dasd_3990_erp_control_check(erp);
2307 erp_new = dasd_3990_erp_inspect_24(erp, sense);
2312 erp_new = dasd_3990_erp_inspect_32(erp, sense);
2324 * the given cqr (or erp).
2325 * For a command mode cqr the erp is initialized as an default erp
2335 * erp pointer to new ERP-chain head
2342 struct dasd_ccw_req *erp;
2357 erp = dasd_alloc_erp_request(cqr->magic,
2359 if (IS_ERR(erp)) {
2372 return erp;
2378 erp->cpmode = 1;
2379 erp->cpaddr = PTR_ALIGN(erp->data, 64);
2380 tcw = erp->cpaddr;
2386 erp->cpaddr = cqr->cpaddr;
2389 ccw = erp->cpaddr;
2397 erp->flags = cqr->flags;
2398 erp->function = dasd_3990_erp_add_erp;
2399 erp->refers = cqr;
2400 erp->startdev = device;
2401 erp->memdev = device;
2402 erp->block = cqr->block;
2403 erp->magic = cqr->magic;
2404 erp->expires = cqr->expires;
2405 erp->retries = device->default_retries;
2406 erp->buildclk = get_tod_clock();
2407 erp->status = DASD_CQR_FILLED;
2409 return erp;
2425 * erp pointer to new ERP-chain head
2431 struct dasd_ccw_req *erp = NULL;
2433 /* add erp and initialize with default TIC */
2434 erp = dasd_3990_erp_add_erp(cqr);
2436 if (IS_ERR(erp))
2437 return erp;
2440 if (erp != cqr) {
2442 erp = dasd_3990_erp_inspect(erp);
2445 return erp;
2510 * cqr failed cqr (either original cqr or already an erp)
2513 * erp erp-pointer to the already defined error
2521 struct dasd_ccw_req *erp_head = cqr, /* save erp chain head */
2522 *erp_match = NULL; /* save erp chain head */
2525 if (cqr->refers == NULL) { /* return if not in erp */
2529 /* check the erp/cqr chain for current error */
2532 erp_match = cqr; /* save possible matching erp */
2533 cqr = cqr->refers; /* check next erp/cqr in queue */
2541 return erp_match; /* return address of matching erp */
2556 * erp ERP which is in progress with no retry left
2559 * erp modified/additional ERP
2562 dasd_3990_erp_further_erp(struct dasd_ccw_req *erp)
2565 struct dasd_device *device = erp->startdev;
2566 char *sense = dasd_get_sense(&erp->irb);
2569 if ((erp->function == dasd_3990_erp_bus_out) ||
2570 (erp->function == dasd_3990_erp_action_1) ||
2571 (erp->function == dasd_3990_erp_action_4)) {
2573 erp = dasd_3990_erp_action_1(erp);
2575 } else if (erp->function == dasd_3990_erp_action_1_sec) {
2576 erp = dasd_3990_erp_action_1_sec(erp);
2577 } else if (erp->function == dasd_3990_erp_action_5) {
2580 /* prepare erp for retry on different channel path */
2581 erp = dasd_3990_erp_action_1(erp);
2591 erp = dasd_3990_erp_DCTL(erp, 0x20);
2596 erp = dasd_3990_erp_DCTL(erp, 0x40);
2601 erp = dasd_3990_erp_DCTL(erp, 0x80);
2614 ((erp->function == dasd_3990_erp_compound_retry) ||
2615 (erp->function == dasd_3990_erp_compound_path) ||
2616 (erp->function == dasd_3990_erp_compound_code) ||
2617 (erp->function == dasd_3990_erp_compound_config))) {
2619 erp = dasd_3990_erp_compound(erp, sense);
2627 "ERP %px has run out of retries and failed\n", erp);
2629 erp->status = DASD_CQR_FAILED;
2632 return erp;
2644 * If retry counter of matching erp is already 0, it is checked if further
2649 * erp ERP that handles the actual error.
2650 * (matching erp)
2653 * erp modified/additional ERP
2657 struct dasd_ccw_req *erp)
2665 while (erp_done != erp) {
2676 /* free the finished erp request */
2681 if (erp->retries > 0) {
2683 char *sense = dasd_get_sense(&erp->refers->irb);
2686 if (sense && erp->function == dasd_3990_erp_action_4) {
2688 erp = dasd_3990_erp_action_4(erp, sense);
2691 erp->function == dasd_3990_erp_action_1B_32) {
2693 erp = dasd_3990_update_1B(erp, sense);
2695 } else if (sense && erp->function == dasd_3990_erp_int_req) {
2697 erp = dasd_3990_erp_int_req(erp);
2702 "%i retries left for erp %p",
2703 erp->retries, erp);
2706 erp->status = DASD_CQR_FILLED;
2712 erp = dasd_3990_erp_further_erp(erp);
2715 return erp;
2723 * control routine for 3990 erp actions.
2727 * cqr failed cqr (either original cqr or already an erp)
2730 * erp erp-pointer to the head of the ERP action chain.
2739 struct dasd_ccw_req *erp = NULL;
2755 /* double-check if current erp/cqr was successful */
2770 erp = dasd_3990_erp_in_erp(cqr);
2772 if (erp == NULL) {
2773 /* no matching erp found - set up erp */
2774 erp = dasd_3990_erp_additional_erp(cqr);
2775 if (IS_ERR(erp))
2776 return erp;
2778 /* matching erp found - set all leading erp's to DONE */
2779 erp = dasd_3990_erp_handle_match_erp(cqr, erp);
2788 if (test_bit(DASD_CQR_VERIFY_PATH, &erp->flags) && cqr->lpm) {
2789 erp->lpm = cqr->lpm;
2796 for (temp_erp = erp;
2805 if (list_empty(&erp->blocklist)) {
2807 /* add erp request before the cqr */
2808 list_add_tail(&erp->blocklist, &cqr->blocklist);
2813 return erp;