Lines Matching refs:cqr
704 struct dasd_ccw_req *cqr, in dasd_profile_start() argument
739 device = cqr->startdev; in dasd_profile_start()
814 struct dasd_ccw_req *cqr, in dasd_profile_end() argument
824 device = cqr->startdev; in dasd_profile_end()
831 if (!cqr->buildclk || !cqr->startclk || in dasd_profile_end()
832 !cqr->stopclk || !cqr->endclk || in dasd_profile_end()
836 strtime = ((cqr->startclk - cqr->buildclk) >> 12); in dasd_profile_end()
837 irqtime = ((cqr->stopclk - cqr->startclk) >> 12); in dasd_profile_end()
838 endtime = ((cqr->endclk - cqr->stopclk) >> 12); in dasd_profile_end()
839 tottime = ((cqr->endclk - cqr->buildclk) >> 12); in dasd_profile_end()
858 cqr->startdev != block->base, in dasd_profile_end()
859 cqr->cpmode == 1, in dasd_profile_end()
876 cqr->startdev != block->base, in dasd_profile_end()
877 cqr->cpmode == 1, in dasd_profile_end()
894 cqr->startdev != block->base, in dasd_profile_end()
895 cqr->cpmode == 1, in dasd_profile_end()
1155 #define dasd_profile_start(block, cqr, req) do {} while (0) argument
1156 #define dasd_profile_end(block, cqr, req) do {} while (0) argument
1233 struct dasd_ccw_req *cqr) in dasd_smalloc_request() argument
1243 if (!cqr) in dasd_smalloc_request()
1244 size += (sizeof(*cqr) + 7L) & -8L; in dasd_smalloc_request()
1251 if (!cqr) { in dasd_smalloc_request()
1252 cqr = (void *) data; in dasd_smalloc_request()
1253 data += (sizeof(*cqr) + 7L) & -8L; in dasd_smalloc_request()
1255 memset(cqr, 0, sizeof(*cqr)); in dasd_smalloc_request()
1256 cqr->mem_chunk = chunk; in dasd_smalloc_request()
1258 cqr->cpaddr = data; in dasd_smalloc_request()
1260 memset(cqr->cpaddr, 0, cplength * sizeof(struct ccw1)); in dasd_smalloc_request()
1263 cqr->data = data; in dasd_smalloc_request()
1264 memset(cqr->data, 0, datasize); in dasd_smalloc_request()
1266 cqr->magic = magic; in dasd_smalloc_request()
1267 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_smalloc_request()
1269 return cqr; in dasd_smalloc_request()
1277 struct dasd_ccw_req *cqr; in dasd_fmalloc_request() local
1282 cqr_size = (sizeof(*cqr) + 7L) & -8L; in dasd_fmalloc_request()
1290 cqr = dasd_alloc_chunk(&device->ese_chunks, size); in dasd_fmalloc_request()
1292 if (!cqr) in dasd_fmalloc_request()
1294 memset(cqr, 0, sizeof(*cqr)); in dasd_fmalloc_request()
1295 data = (char *)cqr + cqr_size; in dasd_fmalloc_request()
1296 cqr->cpaddr = NULL; in dasd_fmalloc_request()
1298 cqr->cpaddr = data; in dasd_fmalloc_request()
1300 memset(cqr->cpaddr, 0, cplength * sizeof(struct ccw1)); in dasd_fmalloc_request()
1302 cqr->data = NULL; in dasd_fmalloc_request()
1304 cqr->data = data; in dasd_fmalloc_request()
1305 memset(cqr->data, 0, datasize); in dasd_fmalloc_request()
1308 cqr->magic = magic; in dasd_fmalloc_request()
1309 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_fmalloc_request()
1312 return cqr; in dasd_fmalloc_request()
1316 void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_sfree_request() argument
1321 dasd_free_chunk(&device->ccw_chunks, cqr->mem_chunk); in dasd_sfree_request()
1327 void dasd_ffree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_ffree_request() argument
1332 dasd_free_chunk(&device->ese_chunks, cqr); in dasd_ffree_request()
1341 static inline int dasd_check_cqr(struct dasd_ccw_req *cqr) in dasd_check_cqr() argument
1345 if (cqr == NULL) in dasd_check_cqr()
1347 device = cqr->startdev; in dasd_check_cqr()
1348 if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) { in dasd_check_cqr()
1352 cqr->magic, in dasd_check_cqr()
1365 int dasd_term_IO(struct dasd_ccw_req *cqr) in dasd_term_IO() argument
1372 rc = dasd_check_cqr(cqr); in dasd_term_IO()
1376 device = (struct dasd_device *) cqr->startdev; in dasd_term_IO()
1377 while ((retries < 5) && (cqr->status == DASD_CQR_IN_IO)) { in dasd_term_IO()
1378 rc = ccw_device_clear(device->cdev, (long) cqr); in dasd_term_IO()
1381 cqr->status = DASD_CQR_CLEAR_PENDING; in dasd_term_IO()
1382 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1383 cqr->starttime = 0; in dasd_term_IO()
1386 cqr); in dasd_term_IO()
1397 cqr->status = DASD_CQR_CLEARED; in dasd_term_IO()
1398 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1399 cqr->starttime = 0; in dasd_term_IO()
1401 cqr->retries = -1; in dasd_term_IO()
1426 int dasd_start_IO(struct dasd_ccw_req *cqr) in dasd_start_IO() argument
1433 rc = dasd_check_cqr(cqr); in dasd_start_IO()
1435 cqr->intrc = rc; in dasd_start_IO()
1438 device = (struct dasd_device *) cqr->startdev; in dasd_start_IO()
1439 if (((cqr->block && in dasd_start_IO()
1440 test_bit(DASD_FLAG_LOCK_STOLEN, &cqr->block->base->flags)) || in dasd_start_IO()
1442 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_start_IO()
1444 "because of stolen lock", cqr); in dasd_start_IO()
1445 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1446 cqr->intrc = -EPERM; in dasd_start_IO()
1449 if (cqr->retries < 0) { in dasd_start_IO()
1451 sprintf(errorstring, "14 %p", cqr); in dasd_start_IO()
1454 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1457 cqr->startclk = get_tod_clock(); in dasd_start_IO()
1458 cqr->starttime = jiffies; in dasd_start_IO()
1459 cqr->retries--; in dasd_start_IO()
1460 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1461 cqr->lpm &= dasd_path_get_opm(device); in dasd_start_IO()
1462 if (!cqr->lpm) in dasd_start_IO()
1463 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1469 if (cqr->block) in dasd_start_IO()
1470 cqr->trkcount = atomic_read(&cqr->block->trkcount); in dasd_start_IO()
1472 if (cqr->cpmode == 1) { in dasd_start_IO()
1473 rc = ccw_device_tm_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1474 (long) cqr, cqr->lpm); in dasd_start_IO()
1476 rc = ccw_device_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1477 (long) cqr, cqr->lpm, 0); in dasd_start_IO()
1481 cqr->status = DASD_CQR_IN_IO; in dasd_start_IO()
1495 if (test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1498 cqr->lpm); in dasd_start_IO()
1499 } else if (cqr->lpm != dasd_path_get_opm(device)) { in dasd_start_IO()
1500 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1538 cqr->intrc = rc; in dasd_start_IO()
1588 struct dasd_ccw_req *cqr; in dasd_handle_killed_request() local
1593 cqr = (struct dasd_ccw_req *) intparm; in dasd_handle_killed_request()
1594 if (cqr->status != DASD_CQR_IN_IO) { in dasd_handle_killed_request()
1597 "%02x", cqr->status); in dasd_handle_killed_request()
1608 if (!cqr->startdev || in dasd_handle_killed_request()
1609 device != cqr->startdev || in dasd_handle_killed_request()
1610 strncmp(cqr->startdev->discipline->ebcname, in dasd_handle_killed_request()
1611 (char *) &cqr->magic, 4)) { in dasd_handle_killed_request()
1619 cqr->status = DASD_CQR_QUEUED; in dasd_handle_killed_request()
1685 struct dasd_ccw_req *cqr, *next, *fcqr; in dasd_int_handler() local
1694 cqr = (struct dasd_ccw_req *) intparm; in dasd_int_handler()
1698 if (cqr && cqr->status == DASD_CQR_CLEAR_PENDING) { in dasd_int_handler()
1699 device = cqr->startdev; in dasd_int_handler()
1700 cqr->status = DASD_CQR_CLEARED; in dasd_int_handler()
1722 if (!cqr || in dasd_int_handler()
1725 if (cqr) in dasd_int_handler()
1726 memcpy(&cqr->irb, irb, sizeof(*irb)); in dasd_int_handler()
1745 test_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags); in dasd_int_handler()
1747 test_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); in dasd_int_handler()
1754 dasd_generic_space_exhaust(device, cqr); in dasd_int_handler()
1755 device->discipline->ext_pool_exhaust(device, cqr); in dasd_int_handler()
1764 device->discipline->dump_sense(device, cqr, irb); in dasd_int_handler()
1765 device->discipline->check_for_device_change(device, cqr, irb); in dasd_int_handler()
1779 if (!cqr) in dasd_int_handler()
1782 device = (struct dasd_device *) cqr->startdev; in dasd_int_handler()
1784 strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { in dasd_int_handler()
1790 if (dasd_ese_needs_format(cqr->block, irb)) { in dasd_int_handler()
1791 req = dasd_get_callback_data(cqr); in dasd_int_handler()
1793 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1797 device->discipline->ese_read(cqr, irb); in dasd_int_handler()
1798 cqr->status = DASD_CQR_SUCCESS; in dasd_int_handler()
1799 cqr->stopclk = now; in dasd_int_handler()
1804 fcqr = device->discipline->ese_format(device, cqr, irb); in dasd_int_handler()
1807 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1814 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1819 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1827 if (cqr->status == DASD_CQR_CLEAR_PENDING && in dasd_int_handler()
1829 cqr->status = DASD_CQR_CLEARED; in dasd_int_handler()
1837 if (cqr->status != DASD_CQR_IN_IO) { in dasd_int_handler()
1839 "status %02x", dev_name(&cdev->dev), cqr->status); in dasd_int_handler()
1848 cqr->status = DASD_CQR_SUCCESS; in dasd_int_handler()
1849 cqr->stopclk = now; in dasd_int_handler()
1851 if (cqr->devlist.next != &device->ccw_queue) { in dasd_int_handler()
1852 next = list_entry(cqr->devlist.next, in dasd_int_handler()
1860 if (cqr->cpmode && dasd_check_hpf_error(irb) && in dasd_int_handler()
1867 if (!test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags) && in dasd_int_handler()
1868 cqr->retries > 0) { in dasd_int_handler()
1869 if (cqr->lpm == dasd_path_get_opm(device)) in dasd_int_handler()
1873 cqr->retries); in dasd_int_handler()
1874 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) in dasd_int_handler()
1875 cqr->lpm = dasd_path_get_opm(device); in dasd_int_handler()
1876 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1877 next = cqr; in dasd_int_handler()
1879 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1925 struct dasd_ccw_req *cqr; in __dasd_device_recovery() local
1934 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_recovery()
1935 if (cqr->status == DASD_CQR_QUEUED && in __dasd_device_recovery()
1936 ref_cqr->block == cqr->block) { in __dasd_device_recovery()
1937 cqr->status = DASD_CQR_CLEARED; in __dasd_device_recovery()
1950 struct dasd_ccw_req *cqr; in __dasd_device_process_ccw_queue() local
1954 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_ccw_queue()
1957 if (cqr->status == DASD_CQR_QUEUED || in __dasd_device_process_ccw_queue()
1958 cqr->status == DASD_CQR_IN_IO || in __dasd_device_process_ccw_queue()
1959 cqr->status == DASD_CQR_CLEAR_PENDING) in __dasd_device_process_ccw_queue()
1961 if (cqr->status == DASD_CQR_ERROR) { in __dasd_device_process_ccw_queue()
1962 __dasd_device_recovery(device, cqr); in __dasd_device_process_ccw_queue()
1965 list_move_tail(&cqr->devlist, final_queue); in __dasd_device_process_ccw_queue()
1970 struct dasd_ccw_req *cqr) in __dasd_process_cqr() argument
1974 switch (cqr->status) { in __dasd_process_cqr()
1976 cqr->status = DASD_CQR_DONE; in __dasd_process_cqr()
1979 cqr->status = DASD_CQR_NEED_ERP; in __dasd_process_cqr()
1982 cqr->status = DASD_CQR_TERMINATED; in __dasd_process_cqr()
1986 snprintf(errorstring, ERRORLENGTH, "12 %p %x02", cqr, cqr->status); in __dasd_process_cqr()
1992 if (cqr->callback) in __dasd_process_cqr()
1993 cqr->callback(cqr, cqr->callback_data); in __dasd_process_cqr()
2004 struct dasd_ccw_req *cqr; in __dasd_device_process_final_queue() local
2008 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_final_queue()
2009 list_del_init(&cqr->devlist); in __dasd_device_process_final_queue()
2010 block = cqr->block; in __dasd_device_process_final_queue()
2012 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
2015 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
2027 struct dasd_ccw_req *cqr; in __dasd_device_check_expire() local
2031 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_check_expire()
2032 if ((cqr->status == DASD_CQR_IN_IO && cqr->expires != 0) && in __dasd_device_check_expire()
2033 (time_after_eq(jiffies, cqr->expires + cqr->starttime))) { in __dasd_device_check_expire()
2039 cqr->retries++; in __dasd_device_check_expire()
2041 if (device->discipline->term_IO(cqr) != 0) { in __dasd_device_check_expire()
2046 cqr, (cqr->expires/HZ)); in __dasd_device_check_expire()
2047 cqr->expires += 5*HZ; in __dasd_device_check_expire()
2052 "remaining\n", cqr, (cqr->expires/HZ), in __dasd_device_check_expire()
2053 cqr->retries); in __dasd_device_check_expire()
2062 struct dasd_ccw_req *cqr) in __dasd_device_is_unusable() argument
2079 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in __dasd_device_is_unusable()
2095 struct dasd_ccw_req *cqr; in __dasd_device_start_head() local
2100 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_start_head()
2101 if (cqr->status != DASD_CQR_QUEUED) in __dasd_device_start_head()
2104 if (__dasd_device_is_unusable(device, cqr)) { in __dasd_device_start_head()
2105 cqr->intrc = -EAGAIN; in __dasd_device_start_head()
2106 cqr->status = DASD_CQR_CLEARED; in __dasd_device_start_head()
2111 rc = device->discipline->start_IO(cqr); in __dasd_device_start_head()
2113 dasd_device_set_timer(device, cqr->expires); in __dasd_device_start_head()
2151 struct dasd_ccw_req *cqr, *n; in dasd_flush_device_queue() local
2158 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_flush_device_queue()
2160 switch (cqr->status) { in dasd_flush_device_queue()
2162 rc = device->discipline->term_IO(cqr); in dasd_flush_device_queue()
2167 "failed for request %p\n", cqr); in dasd_flush_device_queue()
2173 cqr->stopclk = get_tod_clock(); in dasd_flush_device_queue()
2174 cqr->status = DASD_CQR_CLEARED; in dasd_flush_device_queue()
2179 list_move_tail(&cqr->devlist, &flush_queue); in dasd_flush_device_queue()
2188 list_for_each_entry_safe(cqr, n, &flush_queue, devlist) in dasd_flush_device_queue()
2190 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_flush_device_queue()
2259 void dasd_add_request_head(struct dasd_ccw_req *cqr) in dasd_add_request_head() argument
2264 device = cqr->startdev; in dasd_add_request_head()
2266 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_head()
2267 list_add(&cqr->devlist, &device->ccw_queue); in dasd_add_request_head()
2278 void dasd_add_request_tail(struct dasd_ccw_req *cqr) in dasd_add_request_tail() argument
2283 device = cqr->startdev; in dasd_add_request_tail()
2285 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_tail()
2286 list_add_tail(&cqr->devlist, &device->ccw_queue); in dasd_add_request_tail()
2296 void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) in dasd_wakeup_cb() argument
2298 spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2299 cqr->callback_data = DASD_SLEEPON_END_TAG; in dasd_wakeup_cb()
2300 spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2305 static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) in _wait_for_wakeup() argument
2310 device = cqr->startdev; in _wait_for_wakeup()
2312 rc = (cqr->callback_data == DASD_SLEEPON_END_TAG); in _wait_for_wakeup()
2320 static int __dasd_sleep_on_erp(struct dasd_ccw_req *cqr) in __dasd_sleep_on_erp() argument
2325 if (cqr->status == DASD_CQR_FILLED) in __dasd_sleep_on_erp()
2327 device = cqr->startdev; in __dasd_sleep_on_erp()
2328 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_erp()
2329 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_sleep_on_erp()
2330 device->discipline->handle_terminated_request(cqr); in __dasd_sleep_on_erp()
2333 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_sleep_on_erp()
2334 erp_fn = device->discipline->erp_action(cqr); in __dasd_sleep_on_erp()
2335 erp_fn(cqr); in __dasd_sleep_on_erp()
2338 if (cqr->status == DASD_CQR_FAILED) in __dasd_sleep_on_erp()
2339 dasd_log_sense(cqr, &cqr->irb); in __dasd_sleep_on_erp()
2340 if (cqr->refers) { in __dasd_sleep_on_erp()
2341 __dasd_process_erp(device, cqr); in __dasd_sleep_on_erp()
2348 static int __dasd_sleep_on_loop_condition(struct dasd_ccw_req *cqr) in __dasd_sleep_on_loop_condition() argument
2350 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_loop_condition()
2351 if (cqr->refers) /* erp is not done yet */ in __dasd_sleep_on_loop_condition()
2353 return ((cqr->status != DASD_CQR_DONE) && in __dasd_sleep_on_loop_condition()
2354 (cqr->status != DASD_CQR_FAILED)); in __dasd_sleep_on_loop_condition()
2356 return (cqr->status == DASD_CQR_FILLED); in __dasd_sleep_on_loop_condition()
2364 struct dasd_ccw_req *cqr; in _dasd_sleep_on() local
2370 for (cqr = maincqr; __dasd_sleep_on_loop_condition(cqr); in _dasd_sleep_on()
2371 cqr = list_first_entry(&ccw_queue, in _dasd_sleep_on()
2374 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on()
2376 if (cqr->status != DASD_CQR_FILLED) /* could be failed */ in _dasd_sleep_on()
2379 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on()
2380 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2381 cqr->intrc = -EPERM; in _dasd_sleep_on()
2386 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on()
2388 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2389 cqr->intrc = -ENOLINK; in _dasd_sleep_on()
2397 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2398 cqr->intrc = -ENODEV; in _dasd_sleep_on()
2405 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in _dasd_sleep_on()
2410 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2417 if (!cqr->callback) in _dasd_sleep_on()
2418 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on()
2420 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on()
2421 dasd_add_request_tail(cqr); in _dasd_sleep_on()
2424 generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2426 dasd_cancel_req(cqr); in _dasd_sleep_on()
2429 _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2430 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2435 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2453 struct dasd_ccw_req *cqr; in _wait_for_wakeup_queue() local
2455 list_for_each_entry(cqr, ccw_queue, blocklist) { in _wait_for_wakeup_queue()
2456 if (cqr->callback_data != DASD_SLEEPON_END_TAG) in _wait_for_wakeup_queue()
2466 struct dasd_ccw_req *cqr, *n; in _dasd_sleep_on_queue() local
2471 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2472 device = cqr->startdev; in _dasd_sleep_on_queue()
2473 if (cqr->status != DASD_CQR_FILLED) /*could be failed*/ in _dasd_sleep_on_queue()
2477 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on_queue()
2478 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2479 cqr->intrc = -EPERM; in _dasd_sleep_on_queue()
2484 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on_queue()
2486 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2487 cqr->intrc = -EAGAIN; in _dasd_sleep_on_queue()
2496 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2497 cqr->intrc = rc; in _dasd_sleep_on_queue()
2503 if (!cqr->callback) in _dasd_sleep_on_queue()
2504 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on_queue()
2505 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on_queue()
2506 dasd_add_request_tail(cqr); in _dasd_sleep_on_queue()
2512 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2519 sense = dasd_get_sense(&cqr->irb); in _dasd_sleep_on_queue()
2521 test_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags)) in _dasd_sleep_on_queue()
2523 if (scsw_cstat(&cqr->irb.scsw) == 0x40 && in _dasd_sleep_on_queue()
2524 test_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags)) in _dasd_sleep_on_queue()
2532 if (cqr->startdev != cqr->basedev && !cqr->refers && in _dasd_sleep_on_queue()
2533 (cqr->status == DASD_CQR_TERMINATED || in _dasd_sleep_on_queue()
2534 cqr->status == DASD_CQR_NEED_ERP)) in _dasd_sleep_on_queue()
2538 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on_queue()
2550 int dasd_sleep_on(struct dasd_ccw_req *cqr) in dasd_sleep_on() argument
2552 return _dasd_sleep_on(cqr, 0); in dasd_sleep_on()
2578 int dasd_sleep_on_interruptible(struct dasd_ccw_req *cqr) in dasd_sleep_on_interruptible() argument
2580 return _dasd_sleep_on(cqr, 1); in dasd_sleep_on_interruptible()
2592 struct dasd_ccw_req *cqr; in _dasd_term_running_cqr() local
2597 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in _dasd_term_running_cqr()
2598 rc = device->discipline->term_IO(cqr); in _dasd_term_running_cqr()
2605 cqr->retries++; in _dasd_term_running_cqr()
2609 int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr) in dasd_sleep_on_immediatly() argument
2614 device = cqr->startdev; in dasd_sleep_on_immediatly()
2616 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_sleep_on_immediatly()
2617 cqr->status = DASD_CQR_FAILED; in dasd_sleep_on_immediatly()
2618 cqr->intrc = -EPERM; in dasd_sleep_on_immediatly()
2627 cqr->callback = dasd_wakeup_cb; in dasd_sleep_on_immediatly()
2628 cqr->callback_data = DASD_SLEEPON_START_TAG; in dasd_sleep_on_immediatly()
2629 cqr->status = DASD_CQR_QUEUED; in dasd_sleep_on_immediatly()
2634 list_add(&cqr->devlist, device->ccw_queue.next); in dasd_sleep_on_immediatly()
2641 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in dasd_sleep_on_immediatly()
2643 if (cqr->status == DASD_CQR_DONE) in dasd_sleep_on_immediatly()
2645 else if (cqr->intrc) in dasd_sleep_on_immediatly()
2646 rc = cqr->intrc; in dasd_sleep_on_immediatly()
2668 static int __dasd_cancel_req(struct dasd_ccw_req *cqr) in __dasd_cancel_req() argument
2670 struct dasd_device *device = cqr->startdev; in __dasd_cancel_req()
2673 switch (cqr->status) { in __dasd_cancel_req()
2676 cqr->status = DASD_CQR_CLEARED; in __dasd_cancel_req()
2680 rc = device->discipline->term_IO(cqr); in __dasd_cancel_req()
2684 cqr, rc); in __dasd_cancel_req()
2686 cqr->stopclk = get_tod_clock(); in __dasd_cancel_req()
2696 int dasd_cancel_req(struct dasd_ccw_req *cqr) in dasd_cancel_req() argument
2698 struct dasd_device *device = cqr->startdev; in dasd_cancel_req()
2703 rc = __dasd_cancel_req(cqr); in dasd_cancel_req()
2756 struct dasd_ccw_req *cqr) in __dasd_process_erp() argument
2760 if (cqr->status == DASD_CQR_DONE) in __dasd_process_erp()
2764 erp_fn = device->discipline->erp_postaction(cqr); in __dasd_process_erp()
2765 erp_fn(cqr); in __dasd_process_erp()
2768 static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr) in __dasd_cleanup_cqr() argument
2775 req = (struct request *) cqr->callback_data; in __dasd_cleanup_cqr()
2776 dasd_profile_end(cqr->block, cqr, req); in __dasd_cleanup_cqr()
2778 proc_bytes = cqr->proc_bytes; in __dasd_cleanup_cqr()
2779 status = cqr->block->base->discipline->free_cp(cqr, req); in __dasd_cleanup_cqr()
2783 switch (cqr->intrc) { in __dasd_cleanup_cqr()
2830 struct dasd_ccw_req *cqr; in __dasd_process_block_ccw_queue() local
2838 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in __dasd_process_block_ccw_queue()
2839 if (cqr->status != DASD_CQR_DONE && in __dasd_process_block_ccw_queue()
2840 cqr->status != DASD_CQR_FAILED && in __dasd_process_block_ccw_queue()
2841 cqr->status != DASD_CQR_NEED_ERP && in __dasd_process_block_ccw_queue()
2842 cqr->status != DASD_CQR_TERMINATED) in __dasd_process_block_ccw_queue()
2845 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_process_block_ccw_queue()
2846 base->discipline->handle_terminated_request(cqr); in __dasd_process_block_ccw_queue()
2851 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_process_block_ccw_queue()
2852 erp_fn = base->discipline->erp_action(cqr); in __dasd_process_block_ccw_queue()
2853 if (IS_ERR(erp_fn(cqr))) in __dasd_process_block_ccw_queue()
2859 if (cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2860 dasd_log_sense(cqr, &cqr->irb); in __dasd_process_block_ccw_queue()
2865 cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2866 dasd_eer_write(base, cqr, DASD_EER_FATALERROR); in __dasd_process_block_ccw_queue()
2869 cqr->status = DASD_CQR_FILLED; in __dasd_process_block_ccw_queue()
2870 cqr->retries = 255; in __dasd_process_block_ccw_queue()
2879 if (cqr->refers) { in __dasd_process_block_ccw_queue()
2880 __dasd_process_erp(base, cqr); in __dasd_process_block_ccw_queue()
2885 cqr->endclk = get_tod_clock(); in __dasd_process_block_ccw_queue()
2886 list_move_tail(&cqr->blocklist, final_queue); in __dasd_process_block_ccw_queue()
2890 static void dasd_return_cqr_cb(struct dasd_ccw_req *cqr, void *data) in dasd_return_cqr_cb() argument
2892 dasd_schedule_block_bh(cqr->block); in dasd_return_cqr_cb()
2897 struct dasd_ccw_req *cqr; in __dasd_block_start_head() local
2905 list_for_each_entry(cqr, &block->ccw_queue, blocklist) { in __dasd_block_start_head()
2906 if (cqr->status != DASD_CQR_FILLED) in __dasd_block_start_head()
2909 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in __dasd_block_start_head()
2910 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2911 cqr->intrc = -EPERM; in __dasd_block_start_head()
2917 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in __dasd_block_start_head()
2919 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2920 cqr->intrc = -ENOLINK; in __dasd_block_start_head()
2929 if (!cqr->startdev) in __dasd_block_start_head()
2930 cqr->startdev = block->base; in __dasd_block_start_head()
2933 cqr->callback = dasd_return_cqr_cb; in __dasd_block_start_head()
2935 dasd_add_request_tail(cqr); in __dasd_block_start_head()
2949 struct dasd_ccw_req *cqr; in dasd_block_tasklet() local
2961 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in dasd_block_tasklet()
2962 dq = cqr->dq; in dasd_block_tasklet()
2964 list_del_init(&cqr->blocklist); in dasd_block_tasklet()
2965 __dasd_cleanup_cqr(cqr); in dasd_block_tasklet()
2979 static void _dasd_wake_block_flush_cb(struct dasd_ccw_req *cqr, void *data) in _dasd_wake_block_flush_cb() argument
2988 static int _dasd_requeue_request(struct dasd_ccw_req *cqr) in _dasd_requeue_request() argument
2990 struct dasd_block *block = cqr->block; in _dasd_requeue_request()
2999 if (cqr->refers) in _dasd_requeue_request()
3001 spin_lock_irq(&cqr->dq->lock); in _dasd_requeue_request()
3002 req = (struct request *) cqr->callback_data; in _dasd_requeue_request()
3004 spin_unlock_irq(&cqr->dq->lock); in _dasd_requeue_request()
3016 struct dasd_ccw_req *cqr, *n; in dasd_flush_block_queue() local
3025 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) { in dasd_flush_block_queue()
3027 if (cqr->status >= DASD_CQR_QUEUED) in dasd_flush_block_queue()
3028 rc = dasd_cancel_req(cqr); in dasd_flush_block_queue()
3036 cqr->callback = _dasd_wake_block_flush_cb; in dasd_flush_block_queue()
3037 for (i = 0; cqr != NULL; cqr = cqr->refers, i++) in dasd_flush_block_queue()
3038 list_move_tail(&cqr->blocklist, &flush_queue); in dasd_flush_block_queue()
3046 list_for_each_entry_safe(cqr, n, &flush_queue, blocklist) { in dasd_flush_block_queue()
3047 wait_event(dasd_flush_wq, (cqr->status < DASD_CQR_QUEUED)); in dasd_flush_block_queue()
3049 if (cqr->refers) { in dasd_flush_block_queue()
3051 __dasd_process_erp(block->base, cqr); in dasd_flush_block_queue()
3058 spin_lock_irqsave(&cqr->dq->lock, flags); in dasd_flush_block_queue()
3059 cqr->endclk = get_tod_clock(); in dasd_flush_block_queue()
3060 list_del_init(&cqr->blocklist); in dasd_flush_block_queue()
3061 __dasd_cleanup_cqr(cqr); in dasd_flush_block_queue()
3062 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_flush_block_queue()
3097 struct dasd_ccw_req *cqr; in do_dasd_request() local
3139 cqr = basedev->discipline->build_cp(basedev, block, req); in do_dasd_request()
3140 if (IS_ERR(cqr)) { in do_dasd_request()
3141 if (PTR_ERR(cqr) == -EBUSY || in do_dasd_request()
3142 PTR_ERR(cqr) == -ENOMEM || in do_dasd_request()
3143 PTR_ERR(cqr) == -EAGAIN) { in do_dasd_request()
3149 PTR_ERR(cqr), req); in do_dasd_request()
3157 cqr->callback_data = req; in do_dasd_request()
3158 cqr->status = DASD_CQR_FILLED; in do_dasd_request()
3159 cqr->dq = dq; in do_dasd_request()
3163 list_add_tail(&cqr->blocklist, &block->ccw_queue); in do_dasd_request()
3164 INIT_LIST_HEAD(&cqr->devlist); in do_dasd_request()
3165 dasd_profile_start(block, cqr, req); in do_dasd_request()
3186 struct dasd_ccw_req *cqr; in dasd_times_out() local
3190 cqr = blk_mq_rq_to_pdu(req); in dasd_times_out()
3191 if (!cqr) in dasd_times_out()
3194 spin_lock_irqsave(&cqr->dq->lock, flags); in dasd_times_out()
3195 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
3197 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_times_out()
3202 cqr, cqr->status); in dasd_times_out()
3206 cqr->retries = -1; in dasd_times_out()
3207 cqr->intrc = -ETIMEDOUT; in dasd_times_out()
3208 if (cqr->status >= DASD_CQR_QUEUED) { in dasd_times_out()
3209 rc = __dasd_cancel_req(cqr); in dasd_times_out()
3210 } else if (cqr->status == DASD_CQR_FILLED || in dasd_times_out()
3211 cqr->status == DASD_CQR_NEED_ERP) { in dasd_times_out()
3212 cqr->status = DASD_CQR_TERMINATED; in dasd_times_out()
3213 } else if (cqr->status == DASD_CQR_IN_ERP) { in dasd_times_out()
3221 if (tmpcqr != cqr) in dasd_times_out()
3245 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_times_out()
3779 struct dasd_ccw_req *cqr; in dasd_generic_last_path_gone() local
3790 list_for_each_entry(cqr, &device->ccw_queue, devlist) in dasd_generic_last_path_gone()
3791 if ((cqr->status == DASD_CQR_IN_IO) || in dasd_generic_last_path_gone()
3792 (cqr->status == DASD_CQR_CLEAR_PENDING)) { in dasd_generic_last_path_gone()
3793 cqr->status = DASD_CQR_QUEUED; in dasd_generic_last_path_gone()
3794 cqr->retries++; in dasd_generic_last_path_gone()
3939 struct dasd_ccw_req *cqr) in dasd_generic_space_exhaust() argument
3946 if (cqr->status == DASD_CQR_IN_IO || in dasd_generic_space_exhaust()
3947 cqr->status == DASD_CQR_CLEAR_PENDING) { in dasd_generic_space_exhaust()
3948 cqr->status = DASD_CQR_QUEUED; in dasd_generic_space_exhaust()
3949 cqr->retries++; in dasd_generic_space_exhaust()
3981 struct dasd_ccw_req *cqr, *n; in dasd_generic_requeue_all_requests() local
3988 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_generic_requeue_all_requests()
3990 if (cqr->status == DASD_CQR_IN_IO) { in dasd_generic_requeue_all_requests()
3991 rc = device->discipline->term_IO(cqr); in dasd_generic_requeue_all_requests()
3996 "on suspend\n", cqr); in dasd_generic_requeue_all_requests()
4002 list_move_tail(&cqr->devlist, &requeue_queue); in dasd_generic_requeue_all_requests()
4006 list_for_each_entry_safe(cqr, n, &requeue_queue, devlist) { in dasd_generic_requeue_all_requests()
4008 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_generic_requeue_all_requests()
4014 if (_dasd_requeue_request(cqr)) in dasd_generic_requeue_all_requests()
4018 list_del_init(&cqr->devlist); in dasd_generic_requeue_all_requests()
4019 while (cqr->refers != NULL) { in dasd_generic_requeue_all_requests()
4020 refers = cqr->refers; in dasd_generic_requeue_all_requests()
4022 list_del(&cqr->blocklist); in dasd_generic_requeue_all_requests()
4024 dasd_free_erp_request(cqr, cqr->memdev); in dasd_generic_requeue_all_requests()
4025 cqr = refers; in dasd_generic_requeue_all_requests()
4034 list_del_init(&cqr->blocklist); in dasd_generic_requeue_all_requests()
4035 cqr->block->base->discipline->free_cp( in dasd_generic_requeue_all_requests()
4036 cqr, (struct request *) cqr->callback_data); in dasd_generic_requeue_all_requests()
4137 struct dasd_ccw_req *cqr; in dasd_generic_build_rdc() local
4140 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device, in dasd_generic_build_rdc()
4143 if (IS_ERR(cqr)) { in dasd_generic_build_rdc()
4148 return cqr; in dasd_generic_build_rdc()
4151 ccw = cqr->cpaddr; in dasd_generic_build_rdc()
4153 ccw->cda = (__u32)(addr_t) cqr->data; in dasd_generic_build_rdc()
4156 cqr->startdev = device; in dasd_generic_build_rdc()
4157 cqr->memdev = device; in dasd_generic_build_rdc()
4158 cqr->expires = 10*HZ; in dasd_generic_build_rdc()
4159 cqr->retries = 256; in dasd_generic_build_rdc()
4160 cqr->buildclk = get_tod_clock(); in dasd_generic_build_rdc()
4161 cqr->status = DASD_CQR_FILLED; in dasd_generic_build_rdc()
4162 return cqr; in dasd_generic_build_rdc()
4170 struct dasd_ccw_req *cqr; in dasd_generic_read_dev_chars() local
4172 cqr = dasd_generic_build_rdc(device, rdc_buffer_size, magic); in dasd_generic_read_dev_chars()
4173 if (IS_ERR(cqr)) in dasd_generic_read_dev_chars()
4174 return PTR_ERR(cqr); in dasd_generic_read_dev_chars()
4176 ret = dasd_sleep_on(cqr); in dasd_generic_read_dev_chars()
4178 memcpy(rdc_buffer, cqr->data, rdc_buffer_size); in dasd_generic_read_dev_chars()
4179 dasd_sfree_request(cqr, cqr->memdev); in dasd_generic_read_dev_chars()