Lines Matching refs:cqr
664 struct dasd_ccw_req *cqr, in dasd_profile_start() argument
699 device = cqr->startdev; in dasd_profile_start()
776 struct dasd_ccw_req *cqr, in dasd_profile_end() argument
786 device = cqr->startdev; in dasd_profile_end()
793 if (!cqr->buildclk || !cqr->startclk || in dasd_profile_end()
794 !cqr->stopclk || !cqr->endclk || in dasd_profile_end()
798 strtime = ((cqr->startclk - cqr->buildclk) >> 12); in dasd_profile_end()
799 irqtime = ((cqr->stopclk - cqr->startclk) >> 12); in dasd_profile_end()
800 endtime = ((cqr->endclk - cqr->stopclk) >> 12); in dasd_profile_end()
801 tottime = ((cqr->endclk - cqr->buildclk) >> 12); in dasd_profile_end()
820 cqr->startdev != block->base, in dasd_profile_end()
821 cqr->cpmode == 1, in dasd_profile_end()
838 cqr->startdev != block->base, in dasd_profile_end()
839 cqr->cpmode == 1, in dasd_profile_end()
856 cqr->startdev != block->base, in dasd_profile_end()
857 cqr->cpmode == 1, in dasd_profile_end()
1117 #define dasd_profile_start(block, cqr, req) do {} while (0) argument
1118 #define dasd_profile_end(block, cqr, req) do {} while (0) argument
1195 struct dasd_ccw_req *cqr) in dasd_smalloc_request() argument
1205 if (!cqr) in dasd_smalloc_request()
1206 size += (sizeof(*cqr) + 7L) & -8L; in dasd_smalloc_request()
1213 if (!cqr) { in dasd_smalloc_request()
1214 cqr = (void *) data; in dasd_smalloc_request()
1215 data += (sizeof(*cqr) + 7L) & -8L; in dasd_smalloc_request()
1217 memset(cqr, 0, sizeof(*cqr)); in dasd_smalloc_request()
1218 cqr->mem_chunk = chunk; in dasd_smalloc_request()
1220 cqr->cpaddr = data; in dasd_smalloc_request()
1222 memset(cqr->cpaddr, 0, cplength * sizeof(struct ccw1)); in dasd_smalloc_request()
1225 cqr->data = data; in dasd_smalloc_request()
1226 memset(cqr->data, 0, datasize); in dasd_smalloc_request()
1228 cqr->magic = magic; in dasd_smalloc_request()
1229 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_smalloc_request()
1231 return cqr; in dasd_smalloc_request()
1239 struct dasd_ccw_req *cqr; in dasd_fmalloc_request() local
1244 cqr_size = (sizeof(*cqr) + 7L) & -8L; in dasd_fmalloc_request()
1252 cqr = dasd_alloc_chunk(&device->ese_chunks, size); in dasd_fmalloc_request()
1254 if (!cqr) in dasd_fmalloc_request()
1256 memset(cqr, 0, sizeof(*cqr)); in dasd_fmalloc_request()
1257 data = (char *)cqr + cqr_size; in dasd_fmalloc_request()
1258 cqr->cpaddr = NULL; in dasd_fmalloc_request()
1260 cqr->cpaddr = data; in dasd_fmalloc_request()
1262 memset(cqr->cpaddr, 0, cplength * sizeof(struct ccw1)); in dasd_fmalloc_request()
1264 cqr->data = NULL; in dasd_fmalloc_request()
1266 cqr->data = data; in dasd_fmalloc_request()
1267 memset(cqr->data, 0, datasize); in dasd_fmalloc_request()
1270 cqr->magic = magic; in dasd_fmalloc_request()
1271 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_fmalloc_request()
1274 return cqr; in dasd_fmalloc_request()
1278 void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_sfree_request() argument
1283 dasd_free_chunk(&device->ccw_chunks, cqr->mem_chunk); in dasd_sfree_request()
1289 void dasd_ffree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_ffree_request() argument
1294 dasd_free_chunk(&device->ese_chunks, cqr); in dasd_ffree_request()
1303 static inline int dasd_check_cqr(struct dasd_ccw_req *cqr) in dasd_check_cqr() argument
1307 if (cqr == NULL) in dasd_check_cqr()
1309 device = cqr->startdev; in dasd_check_cqr()
1310 if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) { in dasd_check_cqr()
1314 cqr->magic, in dasd_check_cqr()
1327 int dasd_term_IO(struct dasd_ccw_req *cqr) in dasd_term_IO() argument
1334 rc = dasd_check_cqr(cqr); in dasd_term_IO()
1338 device = (struct dasd_device *) cqr->startdev; in dasd_term_IO()
1339 while ((retries < 5) && (cqr->status == DASD_CQR_IN_IO)) { in dasd_term_IO()
1340 rc = ccw_device_clear(device->cdev, (long) cqr); in dasd_term_IO()
1343 cqr->status = DASD_CQR_CLEAR_PENDING; in dasd_term_IO()
1344 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1345 cqr->starttime = 0; in dasd_term_IO()
1348 cqr); in dasd_term_IO()
1359 cqr->status = DASD_CQR_CLEARED; in dasd_term_IO()
1360 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1361 cqr->starttime = 0; in dasd_term_IO()
1363 cqr->retries = -1; in dasd_term_IO()
1388 int dasd_start_IO(struct dasd_ccw_req *cqr) in dasd_start_IO() argument
1395 rc = dasd_check_cqr(cqr); in dasd_start_IO()
1397 cqr->intrc = rc; in dasd_start_IO()
1400 device = (struct dasd_device *) cqr->startdev; in dasd_start_IO()
1401 if (((cqr->block && in dasd_start_IO()
1402 test_bit(DASD_FLAG_LOCK_STOLEN, &cqr->block->base->flags)) || in dasd_start_IO()
1404 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_start_IO()
1406 "because of stolen lock", cqr); in dasd_start_IO()
1407 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1408 cqr->intrc = -EPERM; in dasd_start_IO()
1411 if (cqr->retries < 0) { in dasd_start_IO()
1413 sprintf(errorstring, "14 %p", cqr); in dasd_start_IO()
1416 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1419 cqr->startclk = get_tod_clock(); in dasd_start_IO()
1420 cqr->starttime = jiffies; in dasd_start_IO()
1421 cqr->retries--; in dasd_start_IO()
1422 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1423 cqr->lpm &= dasd_path_get_opm(device); in dasd_start_IO()
1424 if (!cqr->lpm) in dasd_start_IO()
1425 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1431 if (cqr->block) in dasd_start_IO()
1432 cqr->trkcount = atomic_read(&cqr->block->trkcount); in dasd_start_IO()
1434 if (cqr->cpmode == 1) { in dasd_start_IO()
1435 rc = ccw_device_tm_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1436 (long) cqr, cqr->lpm); in dasd_start_IO()
1438 rc = ccw_device_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1439 (long) cqr, cqr->lpm, 0); in dasd_start_IO()
1443 cqr->status = DASD_CQR_IN_IO; in dasd_start_IO()
1457 if (test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1460 cqr->lpm); in dasd_start_IO()
1461 } else if (cqr->lpm != dasd_path_get_opm(device)) { in dasd_start_IO()
1462 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1499 cqr->intrc = rc; in dasd_start_IO()
1549 struct dasd_ccw_req *cqr; in dasd_handle_killed_request() local
1554 cqr = (struct dasd_ccw_req *) intparm; in dasd_handle_killed_request()
1555 if (cqr->status != DASD_CQR_IN_IO) { in dasd_handle_killed_request()
1558 "%02x", cqr->status); in dasd_handle_killed_request()
1569 if (!cqr->startdev || in dasd_handle_killed_request()
1570 device != cqr->startdev || in dasd_handle_killed_request()
1571 strncmp(cqr->startdev->discipline->ebcname, in dasd_handle_killed_request()
1572 (char *) &cqr->magic, 4)) { in dasd_handle_killed_request()
1580 cqr->status = DASD_CQR_QUEUED; in dasd_handle_killed_request()
1646 struct dasd_ccw_req *cqr, *next, *fcqr; in dasd_int_handler() local
1655 cqr = (struct dasd_ccw_req *) intparm; in dasd_int_handler()
1659 if (cqr && cqr->status == DASD_CQR_CLEAR_PENDING) { in dasd_int_handler()
1660 device = cqr->startdev; in dasd_int_handler()
1661 cqr->status = DASD_CQR_CLEARED; in dasd_int_handler()
1683 if (!cqr || in dasd_int_handler()
1686 if (cqr) in dasd_int_handler()
1687 memcpy(&cqr->irb, irb, sizeof(*irb)); in dasd_int_handler()
1706 test_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags); in dasd_int_handler()
1708 test_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); in dasd_int_handler()
1715 dasd_generic_space_exhaust(device, cqr); in dasd_int_handler()
1716 device->discipline->ext_pool_exhaust(device, cqr); in dasd_int_handler()
1725 device->discipline->dump_sense(device, cqr, irb); in dasd_int_handler()
1726 device->discipline->check_for_device_change(device, cqr, irb); in dasd_int_handler()
1740 if (!cqr) in dasd_int_handler()
1743 device = (struct dasd_device *) cqr->startdev; in dasd_int_handler()
1745 strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { in dasd_int_handler()
1751 if (dasd_ese_needs_format(cqr->block, irb)) { in dasd_int_handler()
1752 req = dasd_get_callback_data(cqr); in dasd_int_handler()
1754 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1758 device->discipline->ese_read(cqr, irb); in dasd_int_handler()
1759 cqr->status = DASD_CQR_SUCCESS; in dasd_int_handler()
1760 cqr->stopclk = now; in dasd_int_handler()
1765 fcqr = device->discipline->ese_format(device, cqr, irb); in dasd_int_handler()
1768 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1775 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1780 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1788 if (cqr->status == DASD_CQR_CLEAR_PENDING && in dasd_int_handler()
1790 cqr->status = DASD_CQR_CLEARED; in dasd_int_handler()
1798 if (cqr->status != DASD_CQR_IN_IO) { in dasd_int_handler()
1800 "status %02x", dev_name(&cdev->dev), cqr->status); in dasd_int_handler()
1809 cqr->status = DASD_CQR_SUCCESS; in dasd_int_handler()
1810 cqr->stopclk = now; in dasd_int_handler()
1812 if (cqr->devlist.next != &device->ccw_queue) { in dasd_int_handler()
1813 next = list_entry(cqr->devlist.next, in dasd_int_handler()
1821 if (cqr->cpmode && dasd_check_hpf_error(irb) && in dasd_int_handler()
1828 if (!test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags) && in dasd_int_handler()
1829 cqr->retries > 0) { in dasd_int_handler()
1830 if (cqr->lpm == dasd_path_get_opm(device)) in dasd_int_handler()
1834 cqr->retries); in dasd_int_handler()
1835 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) in dasd_int_handler()
1836 cqr->lpm = dasd_path_get_opm(device); in dasd_int_handler()
1837 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1838 next = cqr; in dasd_int_handler()
1840 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1886 struct dasd_ccw_req *cqr; in __dasd_device_recovery() local
1895 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_recovery()
1896 if (cqr->status == DASD_CQR_QUEUED && in __dasd_device_recovery()
1897 ref_cqr->block == cqr->block) { in __dasd_device_recovery()
1898 cqr->status = DASD_CQR_CLEARED; in __dasd_device_recovery()
1911 struct dasd_ccw_req *cqr; in __dasd_device_process_ccw_queue() local
1915 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_ccw_queue()
1918 if (cqr->status == DASD_CQR_QUEUED || in __dasd_device_process_ccw_queue()
1919 cqr->status == DASD_CQR_IN_IO || in __dasd_device_process_ccw_queue()
1920 cqr->status == DASD_CQR_CLEAR_PENDING) in __dasd_device_process_ccw_queue()
1922 if (cqr->status == DASD_CQR_ERROR) { in __dasd_device_process_ccw_queue()
1923 __dasd_device_recovery(device, cqr); in __dasd_device_process_ccw_queue()
1926 list_move_tail(&cqr->devlist, final_queue); in __dasd_device_process_ccw_queue()
1931 struct dasd_ccw_req *cqr) in __dasd_process_cqr() argument
1935 switch (cqr->status) { in __dasd_process_cqr()
1937 cqr->status = DASD_CQR_DONE; in __dasd_process_cqr()
1940 cqr->status = DASD_CQR_NEED_ERP; in __dasd_process_cqr()
1943 cqr->status = DASD_CQR_TERMINATED; in __dasd_process_cqr()
1947 snprintf(errorstring, ERRORLENGTH, "12 %p %x02", cqr, cqr->status); in __dasd_process_cqr()
1953 if (cqr->callback) in __dasd_process_cqr()
1954 cqr->callback(cqr, cqr->callback_data); in __dasd_process_cqr()
1965 struct dasd_ccw_req *cqr; in __dasd_device_process_final_queue() local
1969 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_final_queue()
1970 list_del_init(&cqr->devlist); in __dasd_device_process_final_queue()
1971 block = cqr->block; in __dasd_device_process_final_queue()
1973 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
1976 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
1988 struct dasd_ccw_req *cqr; in __dasd_device_check_expire() local
1992 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_check_expire()
1993 if ((cqr->status == DASD_CQR_IN_IO && cqr->expires != 0) && in __dasd_device_check_expire()
1994 (time_after_eq(jiffies, cqr->expires + cqr->starttime))) { in __dasd_device_check_expire()
2000 cqr->retries++; in __dasd_device_check_expire()
2002 if (device->discipline->term_IO(cqr) != 0) { in __dasd_device_check_expire()
2007 cqr, (cqr->expires/HZ)); in __dasd_device_check_expire()
2008 cqr->expires += 5*HZ; in __dasd_device_check_expire()
2013 "remaining\n", cqr, (cqr->expires/HZ), in __dasd_device_check_expire()
2014 cqr->retries); in __dasd_device_check_expire()
2023 struct dasd_ccw_req *cqr) in __dasd_device_is_unusable() argument
2040 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in __dasd_device_is_unusable()
2056 struct dasd_ccw_req *cqr; in __dasd_device_start_head() local
2061 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_start_head()
2062 if (cqr->status != DASD_CQR_QUEUED) in __dasd_device_start_head()
2065 if (__dasd_device_is_unusable(device, cqr)) { in __dasd_device_start_head()
2066 cqr->intrc = -EAGAIN; in __dasd_device_start_head()
2067 cqr->status = DASD_CQR_CLEARED; in __dasd_device_start_head()
2072 rc = device->discipline->start_IO(cqr); in __dasd_device_start_head()
2074 dasd_device_set_timer(device, cqr->expires); in __dasd_device_start_head()
2116 struct dasd_ccw_req *cqr, *n; in dasd_flush_device_queue() local
2123 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_flush_device_queue()
2125 switch (cqr->status) { in dasd_flush_device_queue()
2127 rc = device->discipline->term_IO(cqr); in dasd_flush_device_queue()
2132 "failed for request %p\n", cqr); in dasd_flush_device_queue()
2138 cqr->stopclk = get_tod_clock(); in dasd_flush_device_queue()
2139 cqr->status = DASD_CQR_CLEARED; in dasd_flush_device_queue()
2144 list_move_tail(&cqr->devlist, &flush_queue); in dasd_flush_device_queue()
2153 list_for_each_entry_safe(cqr, n, &flush_queue, devlist) in dasd_flush_device_queue()
2155 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_flush_device_queue()
2224 void dasd_add_request_head(struct dasd_ccw_req *cqr) in dasd_add_request_head() argument
2229 device = cqr->startdev; in dasd_add_request_head()
2231 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_head()
2232 list_add(&cqr->devlist, &device->ccw_queue); in dasd_add_request_head()
2243 void dasd_add_request_tail(struct dasd_ccw_req *cqr) in dasd_add_request_tail() argument
2248 device = cqr->startdev; in dasd_add_request_tail()
2250 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_tail()
2251 list_add_tail(&cqr->devlist, &device->ccw_queue); in dasd_add_request_tail()
2261 void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) in dasd_wakeup_cb() argument
2263 spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2264 cqr->callback_data = DASD_SLEEPON_END_TAG; in dasd_wakeup_cb()
2265 spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2270 static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) in _wait_for_wakeup() argument
2275 device = cqr->startdev; in _wait_for_wakeup()
2277 rc = (cqr->callback_data == DASD_SLEEPON_END_TAG); in _wait_for_wakeup()
2285 static int __dasd_sleep_on_erp(struct dasd_ccw_req *cqr) in __dasd_sleep_on_erp() argument
2290 if (cqr->status == DASD_CQR_FILLED) in __dasd_sleep_on_erp()
2292 device = cqr->startdev; in __dasd_sleep_on_erp()
2293 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_erp()
2294 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_sleep_on_erp()
2295 device->discipline->handle_terminated_request(cqr); in __dasd_sleep_on_erp()
2298 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_sleep_on_erp()
2299 erp_fn = device->discipline->erp_action(cqr); in __dasd_sleep_on_erp()
2300 erp_fn(cqr); in __dasd_sleep_on_erp()
2303 if (cqr->status == DASD_CQR_FAILED) in __dasd_sleep_on_erp()
2304 dasd_log_sense(cqr, &cqr->irb); in __dasd_sleep_on_erp()
2305 if (cqr->refers) { in __dasd_sleep_on_erp()
2306 __dasd_process_erp(device, cqr); in __dasd_sleep_on_erp()
2313 static int __dasd_sleep_on_loop_condition(struct dasd_ccw_req *cqr) in __dasd_sleep_on_loop_condition() argument
2315 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_loop_condition()
2316 if (cqr->refers) /* erp is not done yet */ in __dasd_sleep_on_loop_condition()
2318 return ((cqr->status != DASD_CQR_DONE) && in __dasd_sleep_on_loop_condition()
2319 (cqr->status != DASD_CQR_FAILED)); in __dasd_sleep_on_loop_condition()
2321 return (cqr->status == DASD_CQR_FILLED); in __dasd_sleep_on_loop_condition()
2329 struct dasd_ccw_req *cqr; in _dasd_sleep_on() local
2335 for (cqr = maincqr; __dasd_sleep_on_loop_condition(cqr); in _dasd_sleep_on()
2336 cqr = list_first_entry(&ccw_queue, in _dasd_sleep_on()
2339 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on()
2341 if (cqr->status != DASD_CQR_FILLED) /* could be failed */ in _dasd_sleep_on()
2344 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on()
2345 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2346 cqr->intrc = -EPERM; in _dasd_sleep_on()
2351 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on()
2353 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2354 cqr->intrc = -ENOLINK; in _dasd_sleep_on()
2362 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2363 cqr->intrc = -ENODEV; in _dasd_sleep_on()
2370 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in _dasd_sleep_on()
2375 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2382 if (!cqr->callback) in _dasd_sleep_on()
2383 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on()
2385 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on()
2386 dasd_add_request_tail(cqr); in _dasd_sleep_on()
2389 generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2391 dasd_cancel_req(cqr); in _dasd_sleep_on()
2394 _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2395 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2400 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2418 struct dasd_ccw_req *cqr; in _wait_for_wakeup_queue() local
2420 list_for_each_entry(cqr, ccw_queue, blocklist) { in _wait_for_wakeup_queue()
2421 if (cqr->callback_data != DASD_SLEEPON_END_TAG) in _wait_for_wakeup_queue()
2431 struct dasd_ccw_req *cqr, *n; in _dasd_sleep_on_queue() local
2436 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2437 device = cqr->startdev; in _dasd_sleep_on_queue()
2438 if (cqr->status != DASD_CQR_FILLED) /*could be failed*/ in _dasd_sleep_on_queue()
2442 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on_queue()
2443 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2444 cqr->intrc = -EPERM; in _dasd_sleep_on_queue()
2449 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on_queue()
2451 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2452 cqr->intrc = -EAGAIN; in _dasd_sleep_on_queue()
2461 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2462 cqr->intrc = rc; in _dasd_sleep_on_queue()
2468 if (!cqr->callback) in _dasd_sleep_on_queue()
2469 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on_queue()
2470 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on_queue()
2471 dasd_add_request_tail(cqr); in _dasd_sleep_on_queue()
2477 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2484 sense = dasd_get_sense(&cqr->irb); in _dasd_sleep_on_queue()
2486 test_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags)) in _dasd_sleep_on_queue()
2488 if (scsw_cstat(&cqr->irb.scsw) == 0x40 && in _dasd_sleep_on_queue()
2489 test_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags)) in _dasd_sleep_on_queue()
2497 if (cqr->startdev != cqr->basedev && !cqr->refers && in _dasd_sleep_on_queue()
2498 (cqr->status == DASD_CQR_TERMINATED || in _dasd_sleep_on_queue()
2499 cqr->status == DASD_CQR_NEED_ERP)) in _dasd_sleep_on_queue()
2503 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on_queue()
2515 int dasd_sleep_on(struct dasd_ccw_req *cqr) in dasd_sleep_on() argument
2517 return _dasd_sleep_on(cqr, 0); in dasd_sleep_on()
2543 int dasd_sleep_on_interruptible(struct dasd_ccw_req *cqr) in dasd_sleep_on_interruptible() argument
2545 return _dasd_sleep_on(cqr, 1); in dasd_sleep_on_interruptible()
2557 struct dasd_ccw_req *cqr; in _dasd_term_running_cqr() local
2562 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in _dasd_term_running_cqr()
2563 rc = device->discipline->term_IO(cqr); in _dasd_term_running_cqr()
2570 cqr->retries++; in _dasd_term_running_cqr()
2574 int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr) in dasd_sleep_on_immediatly() argument
2579 device = cqr->startdev; in dasd_sleep_on_immediatly()
2581 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_sleep_on_immediatly()
2582 cqr->status = DASD_CQR_FAILED; in dasd_sleep_on_immediatly()
2583 cqr->intrc = -EPERM; in dasd_sleep_on_immediatly()
2592 cqr->callback = dasd_wakeup_cb; in dasd_sleep_on_immediatly()
2593 cqr->callback_data = DASD_SLEEPON_START_TAG; in dasd_sleep_on_immediatly()
2594 cqr->status = DASD_CQR_QUEUED; in dasd_sleep_on_immediatly()
2599 list_add(&cqr->devlist, device->ccw_queue.next); in dasd_sleep_on_immediatly()
2606 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in dasd_sleep_on_immediatly()
2608 if (cqr->status == DASD_CQR_DONE) in dasd_sleep_on_immediatly()
2610 else if (cqr->intrc) in dasd_sleep_on_immediatly()
2611 rc = cqr->intrc; in dasd_sleep_on_immediatly()
2633 static int __dasd_cancel_req(struct dasd_ccw_req *cqr) in __dasd_cancel_req() argument
2635 struct dasd_device *device = cqr->startdev; in __dasd_cancel_req()
2638 switch (cqr->status) { in __dasd_cancel_req()
2641 cqr->status = DASD_CQR_CLEARED; in __dasd_cancel_req()
2645 rc = device->discipline->term_IO(cqr); in __dasd_cancel_req()
2649 cqr, rc); in __dasd_cancel_req()
2651 cqr->stopclk = get_tod_clock(); in __dasd_cancel_req()
2661 int dasd_cancel_req(struct dasd_ccw_req *cqr) in dasd_cancel_req() argument
2663 struct dasd_device *device = cqr->startdev; in dasd_cancel_req()
2668 rc = __dasd_cancel_req(cqr); in dasd_cancel_req()
2721 struct dasd_ccw_req *cqr) in __dasd_process_erp() argument
2725 if (cqr->status == DASD_CQR_DONE) in __dasd_process_erp()
2729 erp_fn = device->discipline->erp_postaction(cqr); in __dasd_process_erp()
2730 erp_fn(cqr); in __dasd_process_erp()
2733 static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr) in __dasd_cleanup_cqr() argument
2740 req = (struct request *) cqr->callback_data; in __dasd_cleanup_cqr()
2741 dasd_profile_end(cqr->block, cqr, req); in __dasd_cleanup_cqr()
2743 proc_bytes = cqr->proc_bytes; in __dasd_cleanup_cqr()
2744 status = cqr->block->base->discipline->free_cp(cqr, req); in __dasd_cleanup_cqr()
2748 switch (cqr->intrc) { in __dasd_cleanup_cqr()
2795 struct dasd_ccw_req *cqr; in __dasd_process_block_ccw_queue() local
2803 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in __dasd_process_block_ccw_queue()
2804 if (cqr->status != DASD_CQR_DONE && in __dasd_process_block_ccw_queue()
2805 cqr->status != DASD_CQR_FAILED && in __dasd_process_block_ccw_queue()
2806 cqr->status != DASD_CQR_NEED_ERP && in __dasd_process_block_ccw_queue()
2807 cqr->status != DASD_CQR_TERMINATED) in __dasd_process_block_ccw_queue()
2810 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_process_block_ccw_queue()
2811 base->discipline->handle_terminated_request(cqr); in __dasd_process_block_ccw_queue()
2816 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_process_block_ccw_queue()
2817 erp_fn = base->discipline->erp_action(cqr); in __dasd_process_block_ccw_queue()
2818 if (IS_ERR(erp_fn(cqr))) in __dasd_process_block_ccw_queue()
2824 if (cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2825 dasd_log_sense(cqr, &cqr->irb); in __dasd_process_block_ccw_queue()
2830 cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2831 dasd_eer_write(base, cqr, DASD_EER_FATALERROR); in __dasd_process_block_ccw_queue()
2834 cqr->status = DASD_CQR_FILLED; in __dasd_process_block_ccw_queue()
2835 cqr->retries = 255; in __dasd_process_block_ccw_queue()
2844 if (cqr->refers) { in __dasd_process_block_ccw_queue()
2845 __dasd_process_erp(base, cqr); in __dasd_process_block_ccw_queue()
2850 cqr->endclk = get_tod_clock(); in __dasd_process_block_ccw_queue()
2851 list_move_tail(&cqr->blocklist, final_queue); in __dasd_process_block_ccw_queue()
2855 static void dasd_return_cqr_cb(struct dasd_ccw_req *cqr, void *data) in dasd_return_cqr_cb() argument
2857 dasd_schedule_block_bh(cqr->block); in dasd_return_cqr_cb()
2862 struct dasd_ccw_req *cqr; in __dasd_block_start_head() local
2870 list_for_each_entry(cqr, &block->ccw_queue, blocklist) { in __dasd_block_start_head()
2871 if (cqr->status != DASD_CQR_FILLED) in __dasd_block_start_head()
2874 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in __dasd_block_start_head()
2875 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2876 cqr->intrc = -EPERM; in __dasd_block_start_head()
2882 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in __dasd_block_start_head()
2884 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2885 cqr->intrc = -ENOLINK; in __dasd_block_start_head()
2894 if (!cqr->startdev) in __dasd_block_start_head()
2895 cqr->startdev = block->base; in __dasd_block_start_head()
2898 cqr->callback = dasd_return_cqr_cb; in __dasd_block_start_head()
2900 dasd_add_request_tail(cqr); in __dasd_block_start_head()
2914 struct dasd_ccw_req *cqr; in dasd_block_tasklet() local
2926 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in dasd_block_tasklet()
2927 dq = cqr->dq; in dasd_block_tasklet()
2929 list_del_init(&cqr->blocklist); in dasd_block_tasklet()
2930 __dasd_cleanup_cqr(cqr); in dasd_block_tasklet()
2944 static void _dasd_wake_block_flush_cb(struct dasd_ccw_req *cqr, void *data) in _dasd_wake_block_flush_cb() argument
2953 static void _dasd_requeue_request(struct dasd_ccw_req *cqr) in _dasd_requeue_request() argument
2961 if (cqr->refers) in _dasd_requeue_request()
2963 spin_lock_irq(&cqr->dq->lock); in _dasd_requeue_request()
2964 req = (struct request *) cqr->callback_data; in _dasd_requeue_request()
2966 spin_unlock_irq(&cqr->dq->lock); in _dasd_requeue_request()
2974 struct dasd_ccw_req *cqr, *n; in _dasd_requests_to_flushqueue() local
2981 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) { in _dasd_requests_to_flushqueue()
2983 if (cqr->status >= DASD_CQR_QUEUED) in _dasd_requests_to_flushqueue()
2984 rc = dasd_cancel_req(cqr); in _dasd_requests_to_flushqueue()
2992 cqr->callback = _dasd_wake_block_flush_cb; in _dasd_requests_to_flushqueue()
2993 for (i = 0; cqr; cqr = cqr->refers, i++) in _dasd_requests_to_flushqueue()
2994 list_move_tail(&cqr->blocklist, flush_queue); in _dasd_requests_to_flushqueue()
3011 struct dasd_ccw_req *cqr, *n; in dasd_flush_block_queue() local
3021 list_for_each_entry_safe(cqr, n, &flush_queue, blocklist) { in dasd_flush_block_queue()
3022 wait_event(dasd_flush_wq, (cqr->status < DASD_CQR_QUEUED)); in dasd_flush_block_queue()
3024 if (cqr->refers) { in dasd_flush_block_queue()
3026 __dasd_process_erp(block->base, cqr); in dasd_flush_block_queue()
3033 spin_lock_irqsave(&cqr->dq->lock, flags); in dasd_flush_block_queue()
3034 cqr->endclk = get_tod_clock(); in dasd_flush_block_queue()
3035 list_del_init(&cqr->blocklist); in dasd_flush_block_queue()
3036 __dasd_cleanup_cqr(cqr); in dasd_flush_block_queue()
3037 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_flush_block_queue()
3072 struct dasd_ccw_req *cqr; in do_dasd_request() local
3114 cqr = basedev->discipline->build_cp(basedev, block, req); in do_dasd_request()
3115 if (IS_ERR(cqr)) { in do_dasd_request()
3116 if (PTR_ERR(cqr) == -EBUSY || in do_dasd_request()
3117 PTR_ERR(cqr) == -ENOMEM || in do_dasd_request()
3118 PTR_ERR(cqr) == -EAGAIN) { in do_dasd_request()
3124 PTR_ERR(cqr), req); in do_dasd_request()
3132 cqr->callback_data = req; in do_dasd_request()
3133 cqr->status = DASD_CQR_FILLED; in do_dasd_request()
3134 cqr->dq = dq; in do_dasd_request()
3138 list_add_tail(&cqr->blocklist, &block->ccw_queue); in do_dasd_request()
3139 INIT_LIST_HEAD(&cqr->devlist); in do_dasd_request()
3140 dasd_profile_start(block, cqr, req); in do_dasd_request()
3161 struct dasd_ccw_req *cqr; in dasd_times_out() local
3165 cqr = blk_mq_rq_to_pdu(req); in dasd_times_out()
3166 if (!cqr) in dasd_times_out()
3169 spin_lock_irqsave(&cqr->dq->lock, flags); in dasd_times_out()
3170 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
3172 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_times_out()
3177 cqr, cqr->status); in dasd_times_out()
3181 cqr->retries = -1; in dasd_times_out()
3182 cqr->intrc = -ETIMEDOUT; in dasd_times_out()
3183 if (cqr->status >= DASD_CQR_QUEUED) { in dasd_times_out()
3184 rc = __dasd_cancel_req(cqr); in dasd_times_out()
3185 } else if (cqr->status == DASD_CQR_FILLED || in dasd_times_out()
3186 cqr->status == DASD_CQR_NEED_ERP) { in dasd_times_out()
3187 cqr->status = DASD_CQR_TERMINATED; in dasd_times_out()
3188 } else if (cqr->status == DASD_CQR_IN_ERP) { in dasd_times_out()
3196 if (tmpcqr != cqr) in dasd_times_out()
3220 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_times_out()
3741 struct dasd_ccw_req *cqr; in dasd_generic_last_path_gone() local
3752 list_for_each_entry(cqr, &device->ccw_queue, devlist) in dasd_generic_last_path_gone()
3753 if ((cqr->status == DASD_CQR_IN_IO) || in dasd_generic_last_path_gone()
3754 (cqr->status == DASD_CQR_CLEAR_PENDING)) { in dasd_generic_last_path_gone()
3755 cqr->status = DASD_CQR_QUEUED; in dasd_generic_last_path_gone()
3756 cqr->retries++; in dasd_generic_last_path_gone()
3900 struct dasd_ccw_req *cqr) in dasd_generic_space_exhaust() argument
3907 if (cqr->status == DASD_CQR_IN_IO || in dasd_generic_space_exhaust()
3908 cqr->status == DASD_CQR_CLEAR_PENDING) { in dasd_generic_space_exhaust()
3909 cqr->status = DASD_CQR_QUEUED; in dasd_generic_space_exhaust()
3910 cqr->retries++; in dasd_generic_space_exhaust()
3943 struct dasd_ccw_req *cqr, *n; in dasd_generic_requeue_all_requests() local
3954 list_for_each_entry_safe(cqr, n, &requeue_queue, blocklist) { in dasd_generic_requeue_all_requests()
3955 wait_event(dasd_flush_wq, (cqr->status < DASD_CQR_QUEUED)); in dasd_generic_requeue_all_requests()
3957 if (cqr->refers) { in dasd_generic_requeue_all_requests()
3959 __dasd_process_erp(block->base, cqr); in dasd_generic_requeue_all_requests()
3966 _dasd_requeue_request(cqr); in dasd_generic_requeue_all_requests()
3967 list_del_init(&cqr->blocklist); in dasd_generic_requeue_all_requests()
3968 cqr->block->base->discipline->free_cp( in dasd_generic_requeue_all_requests()
3969 cqr, (struct request *) cqr->callback_data); in dasd_generic_requeue_all_requests()
3999 struct dasd_ccw_req *cqr; in dasd_generic_build_rdc() local
4002 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device, in dasd_generic_build_rdc()
4005 if (IS_ERR(cqr)) { in dasd_generic_build_rdc()
4010 return cqr; in dasd_generic_build_rdc()
4013 ccw = cqr->cpaddr; in dasd_generic_build_rdc()
4015 ccw->cda = (__u32)(addr_t) cqr->data; in dasd_generic_build_rdc()
4018 cqr->startdev = device; in dasd_generic_build_rdc()
4019 cqr->memdev = device; in dasd_generic_build_rdc()
4020 cqr->expires = 10*HZ; in dasd_generic_build_rdc()
4021 cqr->retries = 256; in dasd_generic_build_rdc()
4022 cqr->buildclk = get_tod_clock(); in dasd_generic_build_rdc()
4023 cqr->status = DASD_CQR_FILLED; in dasd_generic_build_rdc()
4024 return cqr; in dasd_generic_build_rdc()
4032 struct dasd_ccw_req *cqr; in dasd_generic_read_dev_chars() local
4034 cqr = dasd_generic_build_rdc(device, rdc_buffer_size, magic); in dasd_generic_read_dev_chars()
4035 if (IS_ERR(cqr)) in dasd_generic_read_dev_chars()
4036 return PTR_ERR(cqr); in dasd_generic_read_dev_chars()
4038 ret = dasd_sleep_on(cqr); in dasd_generic_read_dev_chars()
4040 memcpy(rdc_buffer, cqr->data, rdc_buffer_size); in dasd_generic_read_dev_chars()
4041 dasd_sfree_request(cqr, cqr->memdev); in dasd_generic_read_dev_chars()