Lines Matching refs:cqr
640 struct dasd_ccw_req *cqr, in dasd_profile_start() argument
675 device = cqr->startdev; in dasd_profile_start()
750 struct dasd_ccw_req *cqr, in dasd_profile_end() argument
760 device = cqr->startdev; in dasd_profile_end()
767 if (!cqr->buildclk || !cqr->startclk || in dasd_profile_end()
768 !cqr->stopclk || !cqr->endclk || in dasd_profile_end()
772 strtime = ((cqr->startclk - cqr->buildclk) >> 12); in dasd_profile_end()
773 irqtime = ((cqr->stopclk - cqr->startclk) >> 12); in dasd_profile_end()
774 endtime = ((cqr->endclk - cqr->stopclk) >> 12); in dasd_profile_end()
775 tottime = ((cqr->endclk - cqr->buildclk) >> 12); in dasd_profile_end()
794 cqr->startdev != block->base, in dasd_profile_end()
795 cqr->cpmode == 1, in dasd_profile_end()
812 cqr->startdev != block->base, in dasd_profile_end()
813 cqr->cpmode == 1, in dasd_profile_end()
830 cqr->startdev != block->base, in dasd_profile_end()
831 cqr->cpmode == 1, in dasd_profile_end()
1091 #define dasd_profile_start(block, cqr, req) do {} while (0) argument
1092 #define dasd_profile_end(block, cqr, req) do {} while (0) argument
1169 struct dasd_ccw_req *cqr) in dasd_smalloc_request() argument
1179 if (!cqr) in dasd_smalloc_request()
1180 size += (sizeof(*cqr) + 7L) & -8L; in dasd_smalloc_request()
1187 if (!cqr) { in dasd_smalloc_request()
1188 cqr = (void *) data; in dasd_smalloc_request()
1189 data += (sizeof(*cqr) + 7L) & -8L; in dasd_smalloc_request()
1191 memset(cqr, 0, sizeof(*cqr)); in dasd_smalloc_request()
1192 cqr->mem_chunk = chunk; in dasd_smalloc_request()
1194 cqr->cpaddr = data; in dasd_smalloc_request()
1196 memset(cqr->cpaddr, 0, cplength * sizeof(struct ccw1)); in dasd_smalloc_request()
1199 cqr->data = data; in dasd_smalloc_request()
1200 memset(cqr->data, 0, datasize); in dasd_smalloc_request()
1202 cqr->magic = magic; in dasd_smalloc_request()
1203 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_smalloc_request()
1205 return cqr; in dasd_smalloc_request()
1213 struct dasd_ccw_req *cqr; in dasd_fmalloc_request() local
1218 cqr_size = (sizeof(*cqr) + 7L) & -8L; in dasd_fmalloc_request()
1226 cqr = dasd_alloc_chunk(&device->ese_chunks, size); in dasd_fmalloc_request()
1228 if (!cqr) in dasd_fmalloc_request()
1230 memset(cqr, 0, sizeof(*cqr)); in dasd_fmalloc_request()
1231 data = (char *)cqr + cqr_size; in dasd_fmalloc_request()
1232 cqr->cpaddr = NULL; in dasd_fmalloc_request()
1234 cqr->cpaddr = data; in dasd_fmalloc_request()
1236 memset(cqr->cpaddr, 0, cplength * sizeof(struct ccw1)); in dasd_fmalloc_request()
1238 cqr->data = NULL; in dasd_fmalloc_request()
1240 cqr->data = data; in dasd_fmalloc_request()
1241 memset(cqr->data, 0, datasize); in dasd_fmalloc_request()
1244 cqr->magic = magic; in dasd_fmalloc_request()
1245 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_fmalloc_request()
1248 return cqr; in dasd_fmalloc_request()
1252 void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_sfree_request() argument
1257 dasd_free_chunk(&device->ccw_chunks, cqr->mem_chunk); in dasd_sfree_request()
1263 void dasd_ffree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_ffree_request() argument
1268 dasd_free_chunk(&device->ese_chunks, cqr); in dasd_ffree_request()
1277 static inline int dasd_check_cqr(struct dasd_ccw_req *cqr) in dasd_check_cqr() argument
1281 if (cqr == NULL) in dasd_check_cqr()
1283 device = cqr->startdev; in dasd_check_cqr()
1284 if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) { in dasd_check_cqr()
1288 cqr->magic, in dasd_check_cqr()
1301 int dasd_term_IO(struct dasd_ccw_req *cqr) in dasd_term_IO() argument
1308 rc = dasd_check_cqr(cqr); in dasd_term_IO()
1312 device = (struct dasd_device *) cqr->startdev; in dasd_term_IO()
1313 while ((retries < 5) && (cqr->status == DASD_CQR_IN_IO)) { in dasd_term_IO()
1314 rc = ccw_device_clear(device->cdev, (long) cqr); in dasd_term_IO()
1317 cqr->status = DASD_CQR_CLEAR_PENDING; in dasd_term_IO()
1318 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1319 cqr->starttime = 0; in dasd_term_IO()
1322 cqr); in dasd_term_IO()
1333 cqr->status = DASD_CQR_CLEARED; in dasd_term_IO()
1334 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1335 cqr->starttime = 0; in dasd_term_IO()
1337 cqr->retries = -1; in dasd_term_IO()
1362 int dasd_start_IO(struct dasd_ccw_req *cqr) in dasd_start_IO() argument
1369 rc = dasd_check_cqr(cqr); in dasd_start_IO()
1371 cqr->intrc = rc; in dasd_start_IO()
1374 device = (struct dasd_device *) cqr->startdev; in dasd_start_IO()
1375 if (((cqr->block && in dasd_start_IO()
1376 test_bit(DASD_FLAG_LOCK_STOLEN, &cqr->block->base->flags)) || in dasd_start_IO()
1378 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_start_IO()
1380 "because of stolen lock", cqr); in dasd_start_IO()
1381 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1382 cqr->intrc = -EPERM; in dasd_start_IO()
1385 if (cqr->retries < 0) { in dasd_start_IO()
1387 sprintf(errorstring, "14 %p", cqr); in dasd_start_IO()
1390 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1393 cqr->startclk = get_tod_clock(); in dasd_start_IO()
1394 cqr->starttime = jiffies; in dasd_start_IO()
1395 cqr->retries--; in dasd_start_IO()
1396 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1397 cqr->lpm &= dasd_path_get_opm(device); in dasd_start_IO()
1398 if (!cqr->lpm) in dasd_start_IO()
1399 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1405 if (cqr->block) in dasd_start_IO()
1406 cqr->trkcount = atomic_read(&cqr->block->trkcount); in dasd_start_IO()
1408 if (cqr->cpmode == 1) { in dasd_start_IO()
1409 rc = ccw_device_tm_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1410 (long) cqr, cqr->lpm); in dasd_start_IO()
1412 rc = ccw_device_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1413 (long) cqr, cqr->lpm, 0); in dasd_start_IO()
1417 cqr->status = DASD_CQR_IN_IO; in dasd_start_IO()
1431 if (test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1434 cqr->lpm); in dasd_start_IO()
1435 } else if (cqr->lpm != dasd_path_get_opm(device)) { in dasd_start_IO()
1436 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1473 cqr->intrc = rc; in dasd_start_IO()
1523 struct dasd_ccw_req *cqr; in dasd_handle_killed_request() local
1528 cqr = (struct dasd_ccw_req *) intparm; in dasd_handle_killed_request()
1529 if (cqr->status != DASD_CQR_IN_IO) { in dasd_handle_killed_request()
1532 "%02x", cqr->status); in dasd_handle_killed_request()
1543 if (!cqr->startdev || in dasd_handle_killed_request()
1544 device != cqr->startdev || in dasd_handle_killed_request()
1545 strncmp(cqr->startdev->discipline->ebcname, in dasd_handle_killed_request()
1546 (char *) &cqr->magic, 4)) { in dasd_handle_killed_request()
1554 cqr->status = DASD_CQR_QUEUED; in dasd_handle_killed_request()
1619 struct dasd_ccw_req *cqr, *next, *fcqr; in dasd_int_handler() local
1628 cqr = (struct dasd_ccw_req *) intparm; in dasd_int_handler()
1632 if (cqr && cqr->status == DASD_CQR_CLEAR_PENDING) { in dasd_int_handler()
1633 device = cqr->startdev; in dasd_int_handler()
1634 cqr->status = DASD_CQR_CLEARED; in dasd_int_handler()
1656 if (!cqr || in dasd_int_handler()
1659 if (cqr) in dasd_int_handler()
1660 memcpy(&cqr->irb, irb, sizeof(*irb)); in dasd_int_handler()
1679 test_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags); in dasd_int_handler()
1681 test_bit(DASD_CQR_SUPPRESS_NRF, &cqr->flags); in dasd_int_handler()
1688 dasd_generic_space_exhaust(device, cqr); in dasd_int_handler()
1689 device->discipline->ext_pool_exhaust(device, cqr); in dasd_int_handler()
1698 device->discipline->dump_sense(device, cqr, irb); in dasd_int_handler()
1699 device->discipline->check_for_device_change(device, cqr, irb); in dasd_int_handler()
1713 if (!cqr) in dasd_int_handler()
1716 device = (struct dasd_device *) cqr->startdev; in dasd_int_handler()
1718 strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { in dasd_int_handler()
1724 if (dasd_ese_needs_format(cqr->block, irb)) { in dasd_int_handler()
1725 req = dasd_get_callback_data(cqr); in dasd_int_handler()
1727 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1731 device->discipline->ese_read(cqr, irb); in dasd_int_handler()
1732 cqr->status = DASD_CQR_SUCCESS; in dasd_int_handler()
1733 cqr->stopclk = now; in dasd_int_handler()
1738 fcqr = device->discipline->ese_format(device, cqr, irb); in dasd_int_handler()
1741 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1748 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1753 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1761 if (cqr->status == DASD_CQR_CLEAR_PENDING && in dasd_int_handler()
1763 cqr->status = DASD_CQR_CLEARED; in dasd_int_handler()
1771 if (cqr->status != DASD_CQR_IN_IO) { in dasd_int_handler()
1773 "status %02x", dev_name(&cdev->dev), cqr->status); in dasd_int_handler()
1782 cqr->status = DASD_CQR_SUCCESS; in dasd_int_handler()
1783 cqr->stopclk = now; in dasd_int_handler()
1785 if (cqr->devlist.next != &device->ccw_queue) { in dasd_int_handler()
1786 next = list_entry(cqr->devlist.next, in dasd_int_handler()
1794 if (cqr->cpmode && dasd_check_hpf_error(irb) && in dasd_int_handler()
1801 if (!test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags) && in dasd_int_handler()
1802 cqr->retries > 0) { in dasd_int_handler()
1803 if (cqr->lpm == dasd_path_get_opm(device)) in dasd_int_handler()
1807 cqr->retries); in dasd_int_handler()
1808 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) in dasd_int_handler()
1809 cqr->lpm = dasd_path_get_opm(device); in dasd_int_handler()
1810 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1811 next = cqr; in dasd_int_handler()
1813 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1859 struct dasd_ccw_req *cqr; in __dasd_device_recovery() local
1868 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_recovery()
1869 if (cqr->status == DASD_CQR_QUEUED && in __dasd_device_recovery()
1870 ref_cqr->block == cqr->block) { in __dasd_device_recovery()
1871 cqr->status = DASD_CQR_CLEARED; in __dasd_device_recovery()
1884 struct dasd_ccw_req *cqr; in __dasd_device_process_ccw_queue() local
1888 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_ccw_queue()
1891 if (cqr->status == DASD_CQR_QUEUED || in __dasd_device_process_ccw_queue()
1892 cqr->status == DASD_CQR_IN_IO || in __dasd_device_process_ccw_queue()
1893 cqr->status == DASD_CQR_CLEAR_PENDING) in __dasd_device_process_ccw_queue()
1895 if (cqr->status == DASD_CQR_ERROR) { in __dasd_device_process_ccw_queue()
1896 __dasd_device_recovery(device, cqr); in __dasd_device_process_ccw_queue()
1899 list_move_tail(&cqr->devlist, final_queue); in __dasd_device_process_ccw_queue()
1904 struct dasd_ccw_req *cqr) in __dasd_process_cqr() argument
1908 switch (cqr->status) { in __dasd_process_cqr()
1910 cqr->status = DASD_CQR_DONE; in __dasd_process_cqr()
1913 cqr->status = DASD_CQR_NEED_ERP; in __dasd_process_cqr()
1916 cqr->status = DASD_CQR_TERMINATED; in __dasd_process_cqr()
1920 snprintf(errorstring, ERRORLENGTH, "12 %p %x02", cqr, cqr->status); in __dasd_process_cqr()
1926 if (cqr->callback) in __dasd_process_cqr()
1927 cqr->callback(cqr, cqr->callback_data); in __dasd_process_cqr()
1938 struct dasd_ccw_req *cqr; in __dasd_device_process_final_queue() local
1942 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_final_queue()
1943 list_del_init(&cqr->devlist); in __dasd_device_process_final_queue()
1944 block = cqr->block; in __dasd_device_process_final_queue()
1946 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
1949 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
1961 struct dasd_ccw_req *cqr; in __dasd_device_check_expire() local
1965 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_check_expire()
1966 if ((cqr->status == DASD_CQR_IN_IO && cqr->expires != 0) && in __dasd_device_check_expire()
1967 (time_after_eq(jiffies, cqr->expires + cqr->starttime))) { in __dasd_device_check_expire()
1973 cqr->retries++; in __dasd_device_check_expire()
1975 if (device->discipline->term_IO(cqr) != 0) { in __dasd_device_check_expire()
1980 cqr, (cqr->expires/HZ)); in __dasd_device_check_expire()
1981 cqr->expires += 5*HZ; in __dasd_device_check_expire()
1986 "remaining\n", cqr, (cqr->expires/HZ), in __dasd_device_check_expire()
1987 cqr->retries); in __dasd_device_check_expire()
1996 struct dasd_ccw_req *cqr) in __dasd_device_is_unusable() argument
2013 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in __dasd_device_is_unusable()
2029 struct dasd_ccw_req *cqr; in __dasd_device_start_head() local
2034 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_start_head()
2035 if (cqr->status != DASD_CQR_QUEUED) in __dasd_device_start_head()
2038 if (__dasd_device_is_unusable(device, cqr)) { in __dasd_device_start_head()
2039 cqr->intrc = -EAGAIN; in __dasd_device_start_head()
2040 cqr->status = DASD_CQR_CLEARED; in __dasd_device_start_head()
2045 rc = device->discipline->start_IO(cqr); in __dasd_device_start_head()
2047 dasd_device_set_timer(device, cqr->expires); in __dasd_device_start_head()
2092 struct dasd_ccw_req *cqr, *n; in dasd_flush_device_queue() local
2099 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_flush_device_queue()
2101 switch (cqr->status) { in dasd_flush_device_queue()
2103 rc = device->discipline->term_IO(cqr); in dasd_flush_device_queue()
2108 "failed for request %p\n", cqr); in dasd_flush_device_queue()
2114 cqr->stopclk = get_tod_clock(); in dasd_flush_device_queue()
2115 cqr->status = DASD_CQR_CLEARED; in dasd_flush_device_queue()
2120 list_move_tail(&cqr->devlist, &flush_queue); in dasd_flush_device_queue()
2129 list_for_each_entry_safe(cqr, n, &flush_queue, devlist) in dasd_flush_device_queue()
2131 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_flush_device_queue()
2200 void dasd_add_request_head(struct dasd_ccw_req *cqr) in dasd_add_request_head() argument
2205 device = cqr->startdev; in dasd_add_request_head()
2207 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_head()
2208 list_add(&cqr->devlist, &device->ccw_queue); in dasd_add_request_head()
2219 void dasd_add_request_tail(struct dasd_ccw_req *cqr) in dasd_add_request_tail() argument
2224 device = cqr->startdev; in dasd_add_request_tail()
2226 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_tail()
2227 list_add_tail(&cqr->devlist, &device->ccw_queue); in dasd_add_request_tail()
2237 void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) in dasd_wakeup_cb() argument
2239 spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2240 cqr->callback_data = DASD_SLEEPON_END_TAG; in dasd_wakeup_cb()
2241 spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2246 static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) in _wait_for_wakeup() argument
2251 device = cqr->startdev; in _wait_for_wakeup()
2253 rc = (cqr->callback_data == DASD_SLEEPON_END_TAG); in _wait_for_wakeup()
2261 static int __dasd_sleep_on_erp(struct dasd_ccw_req *cqr) in __dasd_sleep_on_erp() argument
2266 if (cqr->status == DASD_CQR_FILLED) in __dasd_sleep_on_erp()
2268 device = cqr->startdev; in __dasd_sleep_on_erp()
2269 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_erp()
2270 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_sleep_on_erp()
2271 device->discipline->handle_terminated_request(cqr); in __dasd_sleep_on_erp()
2274 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_sleep_on_erp()
2275 erp_fn = device->discipline->erp_action(cqr); in __dasd_sleep_on_erp()
2276 erp_fn(cqr); in __dasd_sleep_on_erp()
2279 if (cqr->status == DASD_CQR_FAILED) in __dasd_sleep_on_erp()
2280 dasd_log_sense(cqr, &cqr->irb); in __dasd_sleep_on_erp()
2281 if (cqr->refers) { in __dasd_sleep_on_erp()
2282 __dasd_process_erp(device, cqr); in __dasd_sleep_on_erp()
2289 static int __dasd_sleep_on_loop_condition(struct dasd_ccw_req *cqr) in __dasd_sleep_on_loop_condition() argument
2291 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_loop_condition()
2292 if (cqr->refers) /* erp is not done yet */ in __dasd_sleep_on_loop_condition()
2294 return ((cqr->status != DASD_CQR_DONE) && in __dasd_sleep_on_loop_condition()
2295 (cqr->status != DASD_CQR_FAILED)); in __dasd_sleep_on_loop_condition()
2297 return (cqr->status == DASD_CQR_FILLED); in __dasd_sleep_on_loop_condition()
2305 struct dasd_ccw_req *cqr; in _dasd_sleep_on() local
2311 for (cqr = maincqr; __dasd_sleep_on_loop_condition(cqr); in _dasd_sleep_on()
2312 cqr = list_first_entry(&ccw_queue, in _dasd_sleep_on()
2315 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on()
2317 if (cqr->status != DASD_CQR_FILLED) /* could be failed */ in _dasd_sleep_on()
2320 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on()
2321 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2322 cqr->intrc = -EPERM; in _dasd_sleep_on()
2327 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on()
2329 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2330 cqr->intrc = -ENOLINK; in _dasd_sleep_on()
2338 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2339 cqr->intrc = -ENODEV; in _dasd_sleep_on()
2346 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in _dasd_sleep_on()
2351 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2358 if (!cqr->callback) in _dasd_sleep_on()
2359 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on()
2361 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on()
2362 dasd_add_request_tail(cqr); in _dasd_sleep_on()
2365 generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2367 dasd_cancel_req(cqr); in _dasd_sleep_on()
2370 _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2371 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2376 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2394 struct dasd_ccw_req *cqr; in _wait_for_wakeup_queue() local
2396 list_for_each_entry(cqr, ccw_queue, blocklist) { in _wait_for_wakeup_queue()
2397 if (cqr->callback_data != DASD_SLEEPON_END_TAG) in _wait_for_wakeup_queue()
2407 struct dasd_ccw_req *cqr, *n; in _dasd_sleep_on_queue() local
2412 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2413 device = cqr->startdev; in _dasd_sleep_on_queue()
2414 if (cqr->status != DASD_CQR_FILLED) /*could be failed*/ in _dasd_sleep_on_queue()
2418 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on_queue()
2419 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2420 cqr->intrc = -EPERM; in _dasd_sleep_on_queue()
2425 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on_queue()
2427 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2428 cqr->intrc = -EAGAIN; in _dasd_sleep_on_queue()
2437 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2438 cqr->intrc = rc; in _dasd_sleep_on_queue()
2444 if (!cqr->callback) in _dasd_sleep_on_queue()
2445 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on_queue()
2446 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on_queue()
2447 dasd_add_request_tail(cqr); in _dasd_sleep_on_queue()
2453 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2460 sense = dasd_get_sense(&cqr->irb); in _dasd_sleep_on_queue()
2462 test_bit(DASD_CQR_SUPPRESS_FP, &cqr->flags)) in _dasd_sleep_on_queue()
2464 if (scsw_cstat(&cqr->irb.scsw) == 0x40 && in _dasd_sleep_on_queue()
2465 test_bit(DASD_CQR_SUPPRESS_IL, &cqr->flags)) in _dasd_sleep_on_queue()
2473 if (cqr->startdev != cqr->basedev && !cqr->refers && in _dasd_sleep_on_queue()
2474 (cqr->status == DASD_CQR_TERMINATED || in _dasd_sleep_on_queue()
2475 cqr->status == DASD_CQR_NEED_ERP)) in _dasd_sleep_on_queue()
2479 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on_queue()
2491 int dasd_sleep_on(struct dasd_ccw_req *cqr) in dasd_sleep_on() argument
2493 return _dasd_sleep_on(cqr, 0); in dasd_sleep_on()
2519 int dasd_sleep_on_interruptible(struct dasd_ccw_req *cqr) in dasd_sleep_on_interruptible() argument
2521 return _dasd_sleep_on(cqr, 1); in dasd_sleep_on_interruptible()
2533 struct dasd_ccw_req *cqr; in _dasd_term_running_cqr() local
2538 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in _dasd_term_running_cqr()
2539 rc = device->discipline->term_IO(cqr); in _dasd_term_running_cqr()
2546 cqr->retries++; in _dasd_term_running_cqr()
2550 int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr) in dasd_sleep_on_immediatly() argument
2555 device = cqr->startdev; in dasd_sleep_on_immediatly()
2557 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_sleep_on_immediatly()
2558 cqr->status = DASD_CQR_FAILED; in dasd_sleep_on_immediatly()
2559 cqr->intrc = -EPERM; in dasd_sleep_on_immediatly()
2568 cqr->callback = dasd_wakeup_cb; in dasd_sleep_on_immediatly()
2569 cqr->callback_data = DASD_SLEEPON_START_TAG; in dasd_sleep_on_immediatly()
2570 cqr->status = DASD_CQR_QUEUED; in dasd_sleep_on_immediatly()
2575 list_add(&cqr->devlist, device->ccw_queue.next); in dasd_sleep_on_immediatly()
2582 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in dasd_sleep_on_immediatly()
2584 if (cqr->status == DASD_CQR_DONE) in dasd_sleep_on_immediatly()
2586 else if (cqr->intrc) in dasd_sleep_on_immediatly()
2587 rc = cqr->intrc; in dasd_sleep_on_immediatly()
2609 static int __dasd_cancel_req(struct dasd_ccw_req *cqr) in __dasd_cancel_req() argument
2611 struct dasd_device *device = cqr->startdev; in __dasd_cancel_req()
2614 switch (cqr->status) { in __dasd_cancel_req()
2617 cqr->status = DASD_CQR_CLEARED; in __dasd_cancel_req()
2621 rc = device->discipline->term_IO(cqr); in __dasd_cancel_req()
2625 cqr, rc); in __dasd_cancel_req()
2627 cqr->stopclk = get_tod_clock(); in __dasd_cancel_req()
2637 int dasd_cancel_req(struct dasd_ccw_req *cqr) in dasd_cancel_req() argument
2639 struct dasd_device *device = cqr->startdev; in dasd_cancel_req()
2644 rc = __dasd_cancel_req(cqr); in dasd_cancel_req()
2697 struct dasd_ccw_req *cqr) in __dasd_process_erp() argument
2701 if (cqr->status == DASD_CQR_DONE) in __dasd_process_erp()
2705 erp_fn = device->discipline->erp_postaction(cqr); in __dasd_process_erp()
2706 erp_fn(cqr); in __dasd_process_erp()
2709 static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr) in __dasd_cleanup_cqr() argument
2716 req = (struct request *) cqr->callback_data; in __dasd_cleanup_cqr()
2717 dasd_profile_end(cqr->block, cqr, req); in __dasd_cleanup_cqr()
2719 proc_bytes = cqr->proc_bytes; in __dasd_cleanup_cqr()
2720 status = cqr->block->base->discipline->free_cp(cqr, req); in __dasd_cleanup_cqr()
2724 switch (cqr->intrc) { in __dasd_cleanup_cqr()
2771 struct dasd_ccw_req *cqr; in __dasd_process_block_ccw_queue() local
2779 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in __dasd_process_block_ccw_queue()
2780 if (cqr->status != DASD_CQR_DONE && in __dasd_process_block_ccw_queue()
2781 cqr->status != DASD_CQR_FAILED && in __dasd_process_block_ccw_queue()
2782 cqr->status != DASD_CQR_NEED_ERP && in __dasd_process_block_ccw_queue()
2783 cqr->status != DASD_CQR_TERMINATED) in __dasd_process_block_ccw_queue()
2786 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_process_block_ccw_queue()
2787 base->discipline->handle_terminated_request(cqr); in __dasd_process_block_ccw_queue()
2792 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_process_block_ccw_queue()
2793 erp_fn = base->discipline->erp_action(cqr); in __dasd_process_block_ccw_queue()
2794 if (IS_ERR(erp_fn(cqr))) in __dasd_process_block_ccw_queue()
2800 if (cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2801 dasd_log_sense(cqr, &cqr->irb); in __dasd_process_block_ccw_queue()
2806 cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2807 dasd_eer_write(base, cqr, DASD_EER_FATALERROR); in __dasd_process_block_ccw_queue()
2810 cqr->status = DASD_CQR_FILLED; in __dasd_process_block_ccw_queue()
2811 cqr->retries = 255; in __dasd_process_block_ccw_queue()
2820 if (cqr->refers) { in __dasd_process_block_ccw_queue()
2821 __dasd_process_erp(base, cqr); in __dasd_process_block_ccw_queue()
2826 cqr->endclk = get_tod_clock(); in __dasd_process_block_ccw_queue()
2827 list_move_tail(&cqr->blocklist, final_queue); in __dasd_process_block_ccw_queue()
2831 static void dasd_return_cqr_cb(struct dasd_ccw_req *cqr, void *data) in dasd_return_cqr_cb() argument
2833 dasd_schedule_block_bh(cqr->block); in dasd_return_cqr_cb()
2838 struct dasd_ccw_req *cqr; in __dasd_block_start_head() local
2846 list_for_each_entry(cqr, &block->ccw_queue, blocklist) { in __dasd_block_start_head()
2847 if (cqr->status != DASD_CQR_FILLED) in __dasd_block_start_head()
2850 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in __dasd_block_start_head()
2851 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2852 cqr->intrc = -EPERM; in __dasd_block_start_head()
2858 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in __dasd_block_start_head()
2860 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2861 cqr->intrc = -ENOLINK; in __dasd_block_start_head()
2870 if (!cqr->startdev) in __dasd_block_start_head()
2871 cqr->startdev = block->base; in __dasd_block_start_head()
2874 cqr->callback = dasd_return_cqr_cb; in __dasd_block_start_head()
2876 dasd_add_request_tail(cqr); in __dasd_block_start_head()
2890 struct dasd_ccw_req *cqr; in dasd_block_tasklet() local
2902 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in dasd_block_tasklet()
2903 dq = cqr->dq; in dasd_block_tasklet()
2905 list_del_init(&cqr->blocklist); in dasd_block_tasklet()
2906 __dasd_cleanup_cqr(cqr); in dasd_block_tasklet()
2920 static void _dasd_wake_block_flush_cb(struct dasd_ccw_req *cqr, void *data) in _dasd_wake_block_flush_cb() argument
2929 static int _dasd_requeue_request(struct dasd_ccw_req *cqr) in _dasd_requeue_request() argument
2931 struct dasd_block *block = cqr->block; in _dasd_requeue_request()
2940 if (cqr->refers) in _dasd_requeue_request()
2942 spin_lock_irq(&cqr->dq->lock); in _dasd_requeue_request()
2943 req = (struct request *) cqr->callback_data; in _dasd_requeue_request()
2945 spin_unlock_irq(&cqr->dq->lock); in _dasd_requeue_request()
2957 struct dasd_ccw_req *cqr, *n; in dasd_flush_block_queue() local
2966 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) { in dasd_flush_block_queue()
2968 if (cqr->status >= DASD_CQR_QUEUED) in dasd_flush_block_queue()
2969 rc = dasd_cancel_req(cqr); in dasd_flush_block_queue()
2977 cqr->callback = _dasd_wake_block_flush_cb; in dasd_flush_block_queue()
2978 for (i = 0; cqr != NULL; cqr = cqr->refers, i++) in dasd_flush_block_queue()
2979 list_move_tail(&cqr->blocklist, &flush_queue); in dasd_flush_block_queue()
2987 list_for_each_entry_safe(cqr, n, &flush_queue, blocklist) { in dasd_flush_block_queue()
2988 wait_event(dasd_flush_wq, (cqr->status < DASD_CQR_QUEUED)); in dasd_flush_block_queue()
2990 if (cqr->refers) { in dasd_flush_block_queue()
2992 __dasd_process_erp(block->base, cqr); in dasd_flush_block_queue()
2999 spin_lock_irqsave(&cqr->dq->lock, flags); in dasd_flush_block_queue()
3000 cqr->endclk = get_tod_clock(); in dasd_flush_block_queue()
3001 list_del_init(&cqr->blocklist); in dasd_flush_block_queue()
3002 __dasd_cleanup_cqr(cqr); in dasd_flush_block_queue()
3003 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_flush_block_queue()
3038 struct dasd_ccw_req *cqr; in do_dasd_request() local
3080 cqr = basedev->discipline->build_cp(basedev, block, req); in do_dasd_request()
3081 if (IS_ERR(cqr)) { in do_dasd_request()
3082 if (PTR_ERR(cqr) == -EBUSY || in do_dasd_request()
3083 PTR_ERR(cqr) == -ENOMEM || in do_dasd_request()
3084 PTR_ERR(cqr) == -EAGAIN) { in do_dasd_request()
3090 PTR_ERR(cqr), req); in do_dasd_request()
3098 cqr->callback_data = req; in do_dasd_request()
3099 cqr->status = DASD_CQR_FILLED; in do_dasd_request()
3100 cqr->dq = dq; in do_dasd_request()
3104 list_add_tail(&cqr->blocklist, &block->ccw_queue); in do_dasd_request()
3105 INIT_LIST_HEAD(&cqr->devlist); in do_dasd_request()
3106 dasd_profile_start(block, cqr, req); in do_dasd_request()
3127 struct dasd_ccw_req *cqr; in dasd_times_out() local
3131 cqr = blk_mq_rq_to_pdu(req); in dasd_times_out()
3132 if (!cqr) in dasd_times_out()
3135 spin_lock_irqsave(&cqr->dq->lock, flags); in dasd_times_out()
3136 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
3138 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_times_out()
3143 cqr, cqr->status); in dasd_times_out()
3147 cqr->retries = -1; in dasd_times_out()
3148 cqr->intrc = -ETIMEDOUT; in dasd_times_out()
3149 if (cqr->status >= DASD_CQR_QUEUED) { in dasd_times_out()
3150 rc = __dasd_cancel_req(cqr); in dasd_times_out()
3151 } else if (cqr->status == DASD_CQR_FILLED || in dasd_times_out()
3152 cqr->status == DASD_CQR_NEED_ERP) { in dasd_times_out()
3153 cqr->status = DASD_CQR_TERMINATED; in dasd_times_out()
3154 } else if (cqr->status == DASD_CQR_IN_ERP) { in dasd_times_out()
3162 if (tmpcqr != cqr) in dasd_times_out()
3186 spin_unlock_irqrestore(&cqr->dq->lock, flags); in dasd_times_out()
3668 struct dasd_ccw_req *cqr; in dasd_generic_last_path_gone() local
3679 list_for_each_entry(cqr, &device->ccw_queue, devlist) in dasd_generic_last_path_gone()
3680 if ((cqr->status == DASD_CQR_IN_IO) || in dasd_generic_last_path_gone()
3681 (cqr->status == DASD_CQR_CLEAR_PENDING)) { in dasd_generic_last_path_gone()
3682 cqr->status = DASD_CQR_QUEUED; in dasd_generic_last_path_gone()
3683 cqr->retries++; in dasd_generic_last_path_gone()
3826 struct dasd_ccw_req *cqr) in dasd_generic_space_exhaust() argument
3833 if (cqr->status == DASD_CQR_IN_IO || in dasd_generic_space_exhaust()
3834 cqr->status == DASD_CQR_CLEAR_PENDING) { in dasd_generic_space_exhaust()
3835 cqr->status = DASD_CQR_QUEUED; in dasd_generic_space_exhaust()
3836 cqr->retries++; in dasd_generic_space_exhaust()
3868 struct dasd_ccw_req *cqr, *n; in dasd_generic_requeue_all_requests() local
3875 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_generic_requeue_all_requests()
3877 if (cqr->status == DASD_CQR_IN_IO) { in dasd_generic_requeue_all_requests()
3878 rc = device->discipline->term_IO(cqr); in dasd_generic_requeue_all_requests()
3883 "on suspend\n", cqr); in dasd_generic_requeue_all_requests()
3889 list_move_tail(&cqr->devlist, &requeue_queue); in dasd_generic_requeue_all_requests()
3893 list_for_each_entry_safe(cqr, n, &requeue_queue, devlist) { in dasd_generic_requeue_all_requests()
3895 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_generic_requeue_all_requests()
3901 if (_dasd_requeue_request(cqr)) in dasd_generic_requeue_all_requests()
3905 list_del_init(&cqr->devlist); in dasd_generic_requeue_all_requests()
3906 while (cqr->refers != NULL) { in dasd_generic_requeue_all_requests()
3907 refers = cqr->refers; in dasd_generic_requeue_all_requests()
3909 list_del(&cqr->blocklist); in dasd_generic_requeue_all_requests()
3911 dasd_free_erp_request(cqr, cqr->memdev); in dasd_generic_requeue_all_requests()
3912 cqr = refers; in dasd_generic_requeue_all_requests()
3921 list_del_init(&cqr->blocklist); in dasd_generic_requeue_all_requests()
3922 cqr->block->base->discipline->free_cp( in dasd_generic_requeue_all_requests()
3923 cqr, (struct request *) cqr->callback_data); in dasd_generic_requeue_all_requests()
3965 struct dasd_ccw_req *cqr; in dasd_generic_build_rdc() local
3968 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device, in dasd_generic_build_rdc()
3971 if (IS_ERR(cqr)) { in dasd_generic_build_rdc()
3976 return cqr; in dasd_generic_build_rdc()
3979 ccw = cqr->cpaddr; in dasd_generic_build_rdc()
3981 ccw->cda = (__u32)(addr_t) cqr->data; in dasd_generic_build_rdc()
3984 cqr->startdev = device; in dasd_generic_build_rdc()
3985 cqr->memdev = device; in dasd_generic_build_rdc()
3986 cqr->expires = 10*HZ; in dasd_generic_build_rdc()
3987 cqr->retries = 256; in dasd_generic_build_rdc()
3988 cqr->buildclk = get_tod_clock(); in dasd_generic_build_rdc()
3989 cqr->status = DASD_CQR_FILLED; in dasd_generic_build_rdc()
3990 return cqr; in dasd_generic_build_rdc()
3998 struct dasd_ccw_req *cqr; in dasd_generic_read_dev_chars() local
4000 cqr = dasd_generic_build_rdc(device, rdc_buffer_size, magic); in dasd_generic_read_dev_chars()
4001 if (IS_ERR(cqr)) in dasd_generic_read_dev_chars()
4002 return PTR_ERR(cqr); in dasd_generic_read_dev_chars()
4004 ret = dasd_sleep_on(cqr); in dasd_generic_read_dev_chars()
4006 memcpy(rdc_buffer, cqr->data, rdc_buffer_size); in dasd_generic_read_dev_chars()
4007 dasd_sfree_request(cqr, cqr->memdev); in dasd_generic_read_dev_chars()