Lines Matching refs:cqr
689 struct dasd_ccw_req *cqr, in dasd_profile_start() argument
724 device = cqr->startdev; in dasd_profile_start()
799 struct dasd_ccw_req *cqr, in dasd_profile_end() argument
808 device = cqr->startdev; in dasd_profile_end()
815 if (!cqr->buildclk || !cqr->startclk || in dasd_profile_end()
816 !cqr->stopclk || !cqr->endclk || in dasd_profile_end()
820 strtime = ((cqr->startclk - cqr->buildclk) >> 12); in dasd_profile_end()
821 irqtime = ((cqr->stopclk - cqr->startclk) >> 12); in dasd_profile_end()
822 endtime = ((cqr->endclk - cqr->stopclk) >> 12); in dasd_profile_end()
823 tottime = ((cqr->endclk - cqr->buildclk) >> 12); in dasd_profile_end()
837 cqr->startdev != block->base, in dasd_profile_end()
838 cqr->cpmode == 1, in dasd_profile_end()
850 cqr->startdev != block->base, in dasd_profile_end()
851 cqr->cpmode == 1, in dasd_profile_end()
862 cqr->startdev != block->base, in dasd_profile_end()
863 cqr->cpmode == 1, in dasd_profile_end()
1114 #define dasd_profile_start(block, cqr, req) do {} while (0) argument
1115 #define dasd_profile_end(block, cqr, req) do {} while (0) argument
1162 struct dasd_ccw_req *cqr; in dasd_kmalloc_request() local
1168 cqr = kzalloc(sizeof(struct dasd_ccw_req), GFP_ATOMIC); in dasd_kmalloc_request()
1169 if (cqr == NULL) in dasd_kmalloc_request()
1171 cqr->cpaddr = NULL; in dasd_kmalloc_request()
1173 cqr->cpaddr = kcalloc(cplength, sizeof(struct ccw1), in dasd_kmalloc_request()
1175 if (cqr->cpaddr == NULL) { in dasd_kmalloc_request()
1176 kfree(cqr); in dasd_kmalloc_request()
1180 cqr->data = NULL; in dasd_kmalloc_request()
1182 cqr->data = kzalloc(datasize, GFP_ATOMIC | GFP_DMA); in dasd_kmalloc_request()
1183 if (cqr->data == NULL) { in dasd_kmalloc_request()
1184 kfree(cqr->cpaddr); in dasd_kmalloc_request()
1185 kfree(cqr); in dasd_kmalloc_request()
1189 cqr->magic = magic; in dasd_kmalloc_request()
1190 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_kmalloc_request()
1192 return cqr; in dasd_kmalloc_request()
1201 struct dasd_ccw_req *cqr; in dasd_smalloc_request() local
1211 cqr = (struct dasd_ccw_req *) in dasd_smalloc_request()
1214 if (cqr == NULL) in dasd_smalloc_request()
1216 memset(cqr, 0, sizeof(struct dasd_ccw_req)); in dasd_smalloc_request()
1217 data = (char *) cqr + ((sizeof(struct dasd_ccw_req) + 7L) & -8L); in dasd_smalloc_request()
1218 cqr->cpaddr = NULL; in dasd_smalloc_request()
1220 cqr->cpaddr = (struct ccw1 *) data; in dasd_smalloc_request()
1222 memset(cqr->cpaddr, 0, cplength*sizeof(struct ccw1)); in dasd_smalloc_request()
1224 cqr->data = NULL; in dasd_smalloc_request()
1226 cqr->data = data; in dasd_smalloc_request()
1227 memset(cqr->data, 0, datasize); in dasd_smalloc_request()
1229 cqr->magic = magic; in dasd_smalloc_request()
1230 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_smalloc_request()
1232 return cqr; in dasd_smalloc_request()
1241 void dasd_kfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_kfree_request() argument
1246 ccw = cqr->cpaddr; in dasd_kfree_request()
1250 kfree(cqr->cpaddr); in dasd_kfree_request()
1251 kfree(cqr->data); in dasd_kfree_request()
1252 kfree(cqr); in dasd_kfree_request()
1257 void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_sfree_request() argument
1262 dasd_free_chunk(&device->ccw_chunks, cqr); in dasd_sfree_request()
1271 static inline int dasd_check_cqr(struct dasd_ccw_req *cqr) in dasd_check_cqr() argument
1275 if (cqr == NULL) in dasd_check_cqr()
1277 device = cqr->startdev; in dasd_check_cqr()
1278 if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) { in dasd_check_cqr()
1282 cqr->magic, in dasd_check_cqr()
1295 int dasd_term_IO(struct dasd_ccw_req *cqr) in dasd_term_IO() argument
1302 rc = dasd_check_cqr(cqr); in dasd_term_IO()
1306 device = (struct dasd_device *) cqr->startdev; in dasd_term_IO()
1307 while ((retries < 5) && (cqr->status == DASD_CQR_IN_IO)) { in dasd_term_IO()
1308 rc = ccw_device_clear(device->cdev, (long) cqr); in dasd_term_IO()
1311 cqr->status = DASD_CQR_CLEAR_PENDING; in dasd_term_IO()
1312 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1313 cqr->starttime = 0; in dasd_term_IO()
1316 cqr); in dasd_term_IO()
1331 cqr->status = DASD_CQR_CLEARED; in dasd_term_IO()
1332 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1333 cqr->starttime = 0; in dasd_term_IO()
1335 cqr->retries = -1; in dasd_term_IO()
1364 int dasd_start_IO(struct dasd_ccw_req *cqr) in dasd_start_IO() argument
1371 rc = dasd_check_cqr(cqr); in dasd_start_IO()
1373 cqr->intrc = rc; in dasd_start_IO()
1376 device = (struct dasd_device *) cqr->startdev; in dasd_start_IO()
1377 if (((cqr->block && in dasd_start_IO()
1378 test_bit(DASD_FLAG_LOCK_STOLEN, &cqr->block->base->flags)) || in dasd_start_IO()
1380 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_start_IO()
1382 "because of stolen lock", cqr); in dasd_start_IO()
1383 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1384 cqr->intrc = -EPERM; in dasd_start_IO()
1387 if (cqr->retries < 0) { in dasd_start_IO()
1389 sprintf(errorstring, "14 %p", cqr); in dasd_start_IO()
1392 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1395 cqr->startclk = get_tod_clock(); in dasd_start_IO()
1396 cqr->starttime = jiffies; in dasd_start_IO()
1397 cqr->retries--; in dasd_start_IO()
1398 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1399 cqr->lpm &= device->path_data.opm; in dasd_start_IO()
1400 if (!cqr->lpm) in dasd_start_IO()
1401 cqr->lpm = device->path_data.opm; in dasd_start_IO()
1403 if (cqr->cpmode == 1) { in dasd_start_IO()
1404 rc = ccw_device_tm_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1405 (long) cqr, cqr->lpm); in dasd_start_IO()
1407 rc = ccw_device_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1408 (long) cqr, cqr->lpm, 0); in dasd_start_IO()
1412 cqr->status = DASD_CQR_IN_IO; in dasd_start_IO()
1430 if (test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1433 cqr->lpm); in dasd_start_IO()
1434 } else if (cqr->lpm != device->path_data.opm) { in dasd_start_IO()
1435 cqr->lpm = device->path_data.opm; in dasd_start_IO()
1474 cqr->intrc = rc; in dasd_start_IO()
1524 struct dasd_ccw_req *cqr; in dasd_handle_killed_request() local
1529 cqr = (struct dasd_ccw_req *) intparm; in dasd_handle_killed_request()
1530 if (cqr->status != DASD_CQR_IN_IO) { in dasd_handle_killed_request()
1533 "%02x", cqr->status); in dasd_handle_killed_request()
1544 if (!cqr->startdev || in dasd_handle_killed_request()
1545 device != cqr->startdev || in dasd_handle_killed_request()
1546 strncmp(cqr->startdev->discipline->ebcname, in dasd_handle_killed_request()
1547 (char *) &cqr->magic, 4)) { in dasd_handle_killed_request()
1555 cqr->status = DASD_CQR_QUEUED; in dasd_handle_killed_request()
1580 struct dasd_ccw_req *cqr, *next; in dasd_int_handler() local
1603 cqr = (struct dasd_ccw_req *) intparm; in dasd_int_handler()
1605 if (!cqr || in dasd_int_handler()
1608 if (cqr) in dasd_int_handler()
1609 memcpy(&cqr->irb, irb, sizeof(*irb)); in dasd_int_handler()
1620 device->discipline->dump_sense(device, cqr, irb); in dasd_int_handler()
1621 device->discipline->check_for_device_change(device, cqr, irb); in dasd_int_handler()
1632 if (!cqr) in dasd_int_handler()
1635 device = (struct dasd_device *) cqr->startdev; in dasd_int_handler()
1637 strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { in dasd_int_handler()
1644 if (cqr->status == DASD_CQR_CLEAR_PENDING && in dasd_int_handler()
1646 cqr->status = DASD_CQR_CLEARED; in dasd_int_handler()
1654 if (cqr->status != DASD_CQR_IN_IO) { in dasd_int_handler()
1656 "status %02x", dev_name(&cdev->dev), cqr->status); in dasd_int_handler()
1665 cqr->status = DASD_CQR_SUCCESS; in dasd_int_handler()
1666 cqr->stopclk = now; in dasd_int_handler()
1668 if (cqr->devlist.next != &device->ccw_queue) { in dasd_int_handler()
1669 next = list_entry(cqr->devlist.next, in dasd_int_handler()
1677 if (!test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags) && in dasd_int_handler()
1678 cqr->retries > 0) { in dasd_int_handler()
1679 if (cqr->lpm == device->path_data.opm) in dasd_int_handler()
1683 cqr->retries); in dasd_int_handler()
1684 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) in dasd_int_handler()
1685 cqr->lpm = device->path_data.opm; in dasd_int_handler()
1686 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1687 next = cqr; in dasd_int_handler()
1689 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1735 struct dasd_ccw_req *cqr; in __dasd_device_recovery() local
1744 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_recovery()
1745 if (cqr->status == DASD_CQR_QUEUED && in __dasd_device_recovery()
1746 ref_cqr->block == cqr->block) { in __dasd_device_recovery()
1747 cqr->status = DASD_CQR_CLEARED; in __dasd_device_recovery()
1760 struct dasd_ccw_req *cqr; in __dasd_device_process_ccw_queue() local
1764 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_ccw_queue()
1767 if (cqr->status == DASD_CQR_QUEUED || in __dasd_device_process_ccw_queue()
1768 cqr->status == DASD_CQR_IN_IO || in __dasd_device_process_ccw_queue()
1769 cqr->status == DASD_CQR_CLEAR_PENDING) in __dasd_device_process_ccw_queue()
1771 if (cqr->status == DASD_CQR_ERROR) { in __dasd_device_process_ccw_queue()
1772 __dasd_device_recovery(device, cqr); in __dasd_device_process_ccw_queue()
1775 list_move_tail(&cqr->devlist, final_queue); in __dasd_device_process_ccw_queue()
1787 struct dasd_ccw_req *cqr; in __dasd_device_process_final_queue() local
1794 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_final_queue()
1795 list_del_init(&cqr->devlist); in __dasd_device_process_final_queue()
1796 block = cqr->block; in __dasd_device_process_final_queue()
1797 callback = cqr->callback; in __dasd_device_process_final_queue()
1798 callback_data = cqr->callback_data; in __dasd_device_process_final_queue()
1801 switch (cqr->status) { in __dasd_device_process_final_queue()
1803 cqr->status = DASD_CQR_DONE; in __dasd_device_process_final_queue()
1806 cqr->status = DASD_CQR_NEED_ERP; in __dasd_device_process_final_queue()
1809 cqr->status = DASD_CQR_TERMINATED; in __dasd_device_process_final_queue()
1813 snprintf(errorstring, ERRORLENGTH, "12 %p %x02", cqr, cqr->status); in __dasd_device_process_final_queue()
1819 if (cqr->callback != NULL) in __dasd_device_process_final_queue()
1820 (callback)(cqr, callback_data); in __dasd_device_process_final_queue()
1832 struct dasd_ccw_req *cqr; in __dasd_device_check_expire() local
1836 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_check_expire()
1837 if ((cqr->status == DASD_CQR_IN_IO && cqr->expires != 0) && in __dasd_device_check_expire()
1838 (time_after_eq(jiffies, cqr->expires + cqr->starttime))) { in __dasd_device_check_expire()
1844 cqr->retries++; in __dasd_device_check_expire()
1846 if (device->discipline->term_IO(cqr) != 0) { in __dasd_device_check_expire()
1851 cqr, (cqr->expires/HZ)); in __dasd_device_check_expire()
1852 cqr->expires += 5*HZ; in __dasd_device_check_expire()
1857 "remaining\n", cqr, (cqr->expires/HZ), in __dasd_device_check_expire()
1858 cqr->retries); in __dasd_device_check_expire()
1869 struct dasd_ccw_req *cqr; in __dasd_device_start_head() local
1874 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_start_head()
1875 if (cqr->status != DASD_CQR_QUEUED) in __dasd_device_start_head()
1883 && test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags))) { in __dasd_device_start_head()
1884 cqr->intrc = -EAGAIN; in __dasd_device_start_head()
1885 cqr->status = DASD_CQR_CLEARED; in __dasd_device_start_head()
1890 rc = device->discipline->start_IO(cqr); in __dasd_device_start_head()
1892 dasd_device_set_timer(device, cqr->expires); in __dasd_device_start_head()
1929 struct dasd_ccw_req *cqr, *n; in dasd_flush_device_queue() local
1936 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_flush_device_queue()
1938 switch (cqr->status) { in dasd_flush_device_queue()
1940 rc = device->discipline->term_IO(cqr); in dasd_flush_device_queue()
1945 "failed for request %p\n", cqr); in dasd_flush_device_queue()
1951 cqr->stopclk = get_tod_clock(); in dasd_flush_device_queue()
1952 cqr->status = DASD_CQR_CLEARED; in dasd_flush_device_queue()
1957 list_move_tail(&cqr->devlist, &flush_queue); in dasd_flush_device_queue()
1966 list_for_each_entry_safe(cqr, n, &flush_queue, devlist) in dasd_flush_device_queue()
1968 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_flush_device_queue()
2036 void dasd_add_request_head(struct dasd_ccw_req *cqr) in dasd_add_request_head() argument
2041 device = cqr->startdev; in dasd_add_request_head()
2043 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_head()
2044 list_add(&cqr->devlist, &device->ccw_queue); in dasd_add_request_head()
2055 void dasd_add_request_tail(struct dasd_ccw_req *cqr) in dasd_add_request_tail() argument
2060 device = cqr->startdev; in dasd_add_request_tail()
2062 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_tail()
2063 list_add_tail(&cqr->devlist, &device->ccw_queue); in dasd_add_request_tail()
2073 void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) in dasd_wakeup_cb() argument
2075 spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2076 cqr->callback_data = DASD_SLEEPON_END_TAG; in dasd_wakeup_cb()
2077 spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2082 static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) in _wait_for_wakeup() argument
2087 device = cqr->startdev; in _wait_for_wakeup()
2089 rc = (cqr->callback_data == DASD_SLEEPON_END_TAG); in _wait_for_wakeup()
2097 static int __dasd_sleep_on_erp(struct dasd_ccw_req *cqr) in __dasd_sleep_on_erp() argument
2102 if (cqr->status == DASD_CQR_FILLED) in __dasd_sleep_on_erp()
2104 device = cqr->startdev; in __dasd_sleep_on_erp()
2105 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_erp()
2106 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_sleep_on_erp()
2107 device->discipline->handle_terminated_request(cqr); in __dasd_sleep_on_erp()
2110 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_sleep_on_erp()
2111 erp_fn = device->discipline->erp_action(cqr); in __dasd_sleep_on_erp()
2112 erp_fn(cqr); in __dasd_sleep_on_erp()
2115 if (cqr->status == DASD_CQR_FAILED) in __dasd_sleep_on_erp()
2116 dasd_log_sense(cqr, &cqr->irb); in __dasd_sleep_on_erp()
2117 if (cqr->refers) { in __dasd_sleep_on_erp()
2118 __dasd_process_erp(device, cqr); in __dasd_sleep_on_erp()
2125 static int __dasd_sleep_on_loop_condition(struct dasd_ccw_req *cqr) in __dasd_sleep_on_loop_condition() argument
2127 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_loop_condition()
2128 if (cqr->refers) /* erp is not done yet */ in __dasd_sleep_on_loop_condition()
2130 return ((cqr->status != DASD_CQR_DONE) && in __dasd_sleep_on_loop_condition()
2131 (cqr->status != DASD_CQR_FAILED)); in __dasd_sleep_on_loop_condition()
2133 return (cqr->status == DASD_CQR_FILLED); in __dasd_sleep_on_loop_condition()
2141 struct dasd_ccw_req *cqr; in _dasd_sleep_on() local
2147 for (cqr = maincqr; __dasd_sleep_on_loop_condition(cqr); in _dasd_sleep_on()
2148 cqr = list_first_entry(&ccw_queue, in _dasd_sleep_on()
2151 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on()
2153 if (cqr->status != DASD_CQR_FILLED) /* could be failed */ in _dasd_sleep_on()
2156 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on()
2157 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2158 cqr->intrc = -EPERM; in _dasd_sleep_on()
2163 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on()
2165 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2166 cqr->intrc = -ENOLINK; in _dasd_sleep_on()
2173 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in _dasd_sleep_on()
2178 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2185 if (!cqr->callback) in _dasd_sleep_on()
2186 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on()
2188 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on()
2189 dasd_add_request_tail(cqr); in _dasd_sleep_on()
2192 generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2194 dasd_cancel_req(cqr); in _dasd_sleep_on()
2197 _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2198 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2203 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2221 struct dasd_ccw_req *cqr; in _wait_for_wakeup_queue() local
2223 list_for_each_entry(cqr, ccw_queue, blocklist) { in _wait_for_wakeup_queue()
2224 if (cqr->callback_data != DASD_SLEEPON_END_TAG) in _wait_for_wakeup_queue()
2234 struct dasd_ccw_req *cqr, *n; in _dasd_sleep_on_queue() local
2238 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2239 device = cqr->startdev; in _dasd_sleep_on_queue()
2240 if (cqr->status != DASD_CQR_FILLED) /*could be failed*/ in _dasd_sleep_on_queue()
2244 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on_queue()
2245 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2246 cqr->intrc = -EPERM; in _dasd_sleep_on_queue()
2251 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on_queue()
2253 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2254 cqr->intrc = -EAGAIN; in _dasd_sleep_on_queue()
2263 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2264 cqr->intrc = rc; in _dasd_sleep_on_queue()
2270 if (!cqr->callback) in _dasd_sleep_on_queue()
2271 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on_queue()
2272 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on_queue()
2273 dasd_add_request_tail(cqr); in _dasd_sleep_on_queue()
2279 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2285 if (cqr->startdev != cqr->basedev && !cqr->refers && in _dasd_sleep_on_queue()
2286 (cqr->status == DASD_CQR_TERMINATED || in _dasd_sleep_on_queue()
2287 cqr->status == DASD_CQR_NEED_ERP)) in _dasd_sleep_on_queue()
2291 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on_queue()
2303 int dasd_sleep_on(struct dasd_ccw_req *cqr) in dasd_sleep_on() argument
2305 return _dasd_sleep_on(cqr, 0); in dasd_sleep_on()
2322 int dasd_sleep_on_interruptible(struct dasd_ccw_req *cqr) in dasd_sleep_on_interruptible() argument
2324 return _dasd_sleep_on(cqr, 1); in dasd_sleep_on_interruptible()
2336 struct dasd_ccw_req *cqr; in _dasd_term_running_cqr() local
2341 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in _dasd_term_running_cqr()
2342 rc = device->discipline->term_IO(cqr); in _dasd_term_running_cqr()
2349 cqr->retries++; in _dasd_term_running_cqr()
2353 int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr) in dasd_sleep_on_immediatly() argument
2358 device = cqr->startdev; in dasd_sleep_on_immediatly()
2360 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_sleep_on_immediatly()
2361 cqr->status = DASD_CQR_FAILED; in dasd_sleep_on_immediatly()
2362 cqr->intrc = -EPERM; in dasd_sleep_on_immediatly()
2371 cqr->callback = dasd_wakeup_cb; in dasd_sleep_on_immediatly()
2372 cqr->callback_data = DASD_SLEEPON_START_TAG; in dasd_sleep_on_immediatly()
2373 cqr->status = DASD_CQR_QUEUED; in dasd_sleep_on_immediatly()
2378 list_add(&cqr->devlist, device->ccw_queue.next); in dasd_sleep_on_immediatly()
2385 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in dasd_sleep_on_immediatly()
2387 if (cqr->status == DASD_CQR_DONE) in dasd_sleep_on_immediatly()
2389 else if (cqr->intrc) in dasd_sleep_on_immediatly()
2390 rc = cqr->intrc; in dasd_sleep_on_immediatly()
2412 int dasd_cancel_req(struct dasd_ccw_req *cqr) in dasd_cancel_req() argument
2414 struct dasd_device *device = cqr->startdev; in dasd_cancel_req()
2420 switch (cqr->status) { in dasd_cancel_req()
2423 cqr->status = DASD_CQR_CLEARED; in dasd_cancel_req()
2424 if (cqr->callback_data == DASD_SLEEPON_START_TAG) in dasd_cancel_req()
2425 cqr->callback_data = DASD_SLEEPON_END_TAG; in dasd_cancel_req()
2429 rc = device->discipline->term_IO(cqr); in dasd_cancel_req()
2433 cqr, rc); in dasd_cancel_req()
2435 cqr->stopclk = get_tod_clock(); in dasd_cancel_req()
2494 struct dasd_ccw_req *cqr) in __dasd_process_erp() argument
2498 if (cqr->status == DASD_CQR_DONE) in __dasd_process_erp()
2502 erp_fn = device->discipline->erp_postaction(cqr); in __dasd_process_erp()
2503 erp_fn(cqr); in __dasd_process_erp()
2513 struct dasd_ccw_req *cqr; in __dasd_process_request_queue() local
2560 cqr = basedev->discipline->build_cp(basedev, block, req); in __dasd_process_request_queue()
2561 if (IS_ERR(cqr)) { in __dasd_process_request_queue()
2562 if (PTR_ERR(cqr) == -EBUSY) in __dasd_process_request_queue()
2564 if (PTR_ERR(cqr) == -ENOMEM) in __dasd_process_request_queue()
2566 if (PTR_ERR(cqr) == -EAGAIN) { in __dasd_process_request_queue()
2587 PTR_ERR(cqr), req); in __dasd_process_request_queue()
2596 cqr->callback_data = (void *) req; in __dasd_process_request_queue()
2597 cqr->status = DASD_CQR_FILLED; in __dasd_process_request_queue()
2598 req->completion_data = cqr; in __dasd_process_request_queue()
2600 list_add_tail(&cqr->blocklist, &block->ccw_queue); in __dasd_process_request_queue()
2601 INIT_LIST_HEAD(&cqr->devlist); in __dasd_process_request_queue()
2602 dasd_profile_start(block, cqr, req); in __dasd_process_request_queue()
2606 static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr) in __dasd_cleanup_cqr() argument
2612 req = (struct request *) cqr->callback_data; in __dasd_cleanup_cqr()
2613 dasd_profile_end(cqr->block, cqr, req); in __dasd_cleanup_cqr()
2614 status = cqr->block->base->discipline->free_cp(cqr, req); in __dasd_cleanup_cqr()
2618 if (cqr->intrc == -EPERM) in __dasd_cleanup_cqr()
2620 else if (cqr->intrc == -ENOLINK || in __dasd_cleanup_cqr()
2621 cqr->intrc == -ETIMEDOUT) in __dasd_cleanup_cqr()
2622 error = cqr->intrc; in __dasd_cleanup_cqr()
2636 struct dasd_ccw_req *cqr; in __dasd_process_block_ccw_queue() local
2644 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in __dasd_process_block_ccw_queue()
2645 if (cqr->status != DASD_CQR_DONE && in __dasd_process_block_ccw_queue()
2646 cqr->status != DASD_CQR_FAILED && in __dasd_process_block_ccw_queue()
2647 cqr->status != DASD_CQR_NEED_ERP && in __dasd_process_block_ccw_queue()
2648 cqr->status != DASD_CQR_TERMINATED) in __dasd_process_block_ccw_queue()
2651 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_process_block_ccw_queue()
2652 base->discipline->handle_terminated_request(cqr); in __dasd_process_block_ccw_queue()
2657 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_process_block_ccw_queue()
2658 erp_fn = base->discipline->erp_action(cqr); in __dasd_process_block_ccw_queue()
2659 if (IS_ERR(erp_fn(cqr))) in __dasd_process_block_ccw_queue()
2665 if (cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2666 dasd_log_sense(cqr, &cqr->irb); in __dasd_process_block_ccw_queue()
2671 cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2672 dasd_eer_write(base, cqr, DASD_EER_FATALERROR); in __dasd_process_block_ccw_queue()
2675 cqr->status = DASD_CQR_FILLED; in __dasd_process_block_ccw_queue()
2676 cqr->retries = 255; in __dasd_process_block_ccw_queue()
2685 if (cqr->refers) { in __dasd_process_block_ccw_queue()
2686 __dasd_process_erp(base, cqr); in __dasd_process_block_ccw_queue()
2691 cqr->endclk = get_tod_clock(); in __dasd_process_block_ccw_queue()
2692 list_move_tail(&cqr->blocklist, final_queue); in __dasd_process_block_ccw_queue()
2696 static void dasd_return_cqr_cb(struct dasd_ccw_req *cqr, void *data) in dasd_return_cqr_cb() argument
2698 dasd_schedule_block_bh(cqr->block); in dasd_return_cqr_cb()
2703 struct dasd_ccw_req *cqr; in __dasd_block_start_head() local
2711 list_for_each_entry(cqr, &block->ccw_queue, blocklist) { in __dasd_block_start_head()
2712 if (cqr->status != DASD_CQR_FILLED) in __dasd_block_start_head()
2715 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in __dasd_block_start_head()
2716 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2717 cqr->intrc = -EPERM; in __dasd_block_start_head()
2723 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in __dasd_block_start_head()
2725 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2726 cqr->intrc = -ENOLINK; in __dasd_block_start_head()
2735 if (!cqr->startdev) in __dasd_block_start_head()
2736 cqr->startdev = block->base; in __dasd_block_start_head()
2739 cqr->callback = dasd_return_cqr_cb; in __dasd_block_start_head()
2741 dasd_add_request_tail(cqr); in __dasd_block_start_head()
2754 struct dasd_ccw_req *cqr; in dasd_block_tasklet() local
2765 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in dasd_block_tasklet()
2766 list_del_init(&cqr->blocklist); in dasd_block_tasklet()
2767 __dasd_cleanup_cqr(cqr); in dasd_block_tasklet()
2781 static void _dasd_wake_block_flush_cb(struct dasd_ccw_req *cqr, void *data) in _dasd_wake_block_flush_cb() argument
2790 static int _dasd_requeue_request(struct dasd_ccw_req *cqr) in _dasd_requeue_request() argument
2792 struct dasd_block *block = cqr->block; in _dasd_requeue_request()
2799 req = (struct request *) cqr->callback_data; in _dasd_requeue_request()
2813 struct dasd_ccw_req *cqr, *n; in dasd_flush_block_queue() local
2821 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) { in dasd_flush_block_queue()
2823 if (cqr->status >= DASD_CQR_QUEUED) in dasd_flush_block_queue()
2824 rc = dasd_cancel_req(cqr); in dasd_flush_block_queue()
2832 cqr->callback = _dasd_wake_block_flush_cb; in dasd_flush_block_queue()
2833 for (i = 0; cqr != NULL; cqr = cqr->refers, i++) in dasd_flush_block_queue()
2834 list_move_tail(&cqr->blocklist, &flush_queue); in dasd_flush_block_queue()
2842 list_for_each_entry_safe(cqr, n, &flush_queue, blocklist) { in dasd_flush_block_queue()
2843 wait_event(dasd_flush_wq, (cqr->status < DASD_CQR_QUEUED)); in dasd_flush_block_queue()
2845 if (cqr->refers) { in dasd_flush_block_queue()
2847 __dasd_process_erp(block->base, cqr); in dasd_flush_block_queue()
2855 cqr->endclk = get_tod_clock(); in dasd_flush_block_queue()
2856 list_del_init(&cqr->blocklist); in dasd_flush_block_queue()
2857 __dasd_cleanup_cqr(cqr); in dasd_flush_block_queue()
2911 struct dasd_ccw_req *cqr = req->completion_data; in dasd_times_out() local
2916 if (!cqr) in dasd_times_out()
2919 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
2924 cqr, cqr->status); in dasd_times_out()
2928 cqr->retries = -1; in dasd_times_out()
2929 cqr->intrc = -ETIMEDOUT; in dasd_times_out()
2930 if (cqr->status >= DASD_CQR_QUEUED) { in dasd_times_out()
2932 rc = dasd_cancel_req(cqr); in dasd_times_out()
2933 } else if (cqr->status == DASD_CQR_FILLED || in dasd_times_out()
2934 cqr->status == DASD_CQR_NEED_ERP) { in dasd_times_out()
2935 cqr->status = DASD_CQR_TERMINATED; in dasd_times_out()
2937 } else if (cqr->status == DASD_CQR_IN_ERP) { in dasd_times_out()
2945 if (tmpcqr != cqr) in dasd_times_out()
3457 struct dasd_ccw_req *cqr; in dasd_generic_last_path_gone() local
3468 list_for_each_entry(cqr, &device->ccw_queue, devlist) in dasd_generic_last_path_gone()
3469 if ((cqr->status == DASD_CQR_IN_IO) || in dasd_generic_last_path_gone()
3470 (cqr->status == DASD_CQR_CLEAR_PENDING)) { in dasd_generic_last_path_gone()
3471 cqr->status = DASD_CQR_QUEUED; in dasd_generic_last_path_gone()
3472 cqr->retries++; in dasd_generic_last_path_gone()
3603 struct dasd_ccw_req *cqr, *n; in dasd_generic_pm_freeze() local
3623 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_generic_pm_freeze()
3625 if (cqr->status == DASD_CQR_IN_IO) { in dasd_generic_pm_freeze()
3626 rc = device->discipline->term_IO(cqr); in dasd_generic_pm_freeze()
3631 "on suspend\n", cqr); in dasd_generic_pm_freeze()
3637 list_move_tail(&cqr->devlist, &freeze_queue); in dasd_generic_pm_freeze()
3641 list_for_each_entry_safe(cqr, n, &freeze_queue, devlist) { in dasd_generic_pm_freeze()
3643 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_generic_pm_freeze()
3644 if (cqr->status == DASD_CQR_CLEARED) in dasd_generic_pm_freeze()
3645 cqr->status = DASD_CQR_QUEUED; in dasd_generic_pm_freeze()
3649 if (_dasd_requeue_request(cqr)) in dasd_generic_pm_freeze()
3653 list_del_init(&cqr->devlist); in dasd_generic_pm_freeze()
3654 while (cqr->refers != NULL) { in dasd_generic_pm_freeze()
3655 refers = cqr->refers; in dasd_generic_pm_freeze()
3657 list_del(&cqr->blocklist); in dasd_generic_pm_freeze()
3659 dasd_free_erp_request(cqr, cqr->memdev); in dasd_generic_pm_freeze()
3660 cqr = refers; in dasd_generic_pm_freeze()
3662 if (cqr->block) in dasd_generic_pm_freeze()
3663 list_del_init(&cqr->blocklist); in dasd_generic_pm_freeze()
3664 cqr->block->base->discipline->free_cp( in dasd_generic_pm_freeze()
3665 cqr, (struct request *) cqr->callback_data); in dasd_generic_pm_freeze()
3724 struct dasd_ccw_req *cqr; in dasd_generic_build_rdc() local
3728 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device); in dasd_generic_build_rdc()
3730 if (IS_ERR(cqr)) { in dasd_generic_build_rdc()
3735 return cqr; in dasd_generic_build_rdc()
3738 ccw = cqr->cpaddr; in dasd_generic_build_rdc()
3741 idaw = (unsigned long *) (cqr->data); in dasd_generic_build_rdc()
3751 cqr->startdev = device; in dasd_generic_build_rdc()
3752 cqr->memdev = device; in dasd_generic_build_rdc()
3753 cqr->expires = 10*HZ; in dasd_generic_build_rdc()
3754 cqr->retries = 256; in dasd_generic_build_rdc()
3755 cqr->buildclk = get_tod_clock(); in dasd_generic_build_rdc()
3756 cqr->status = DASD_CQR_FILLED; in dasd_generic_build_rdc()
3757 return cqr; in dasd_generic_build_rdc()
3765 struct dasd_ccw_req *cqr; in dasd_generic_read_dev_chars() local
3767 cqr = dasd_generic_build_rdc(device, rdc_buffer, rdc_buffer_size, in dasd_generic_read_dev_chars()
3769 if (IS_ERR(cqr)) in dasd_generic_read_dev_chars()
3770 return PTR_ERR(cqr); in dasd_generic_read_dev_chars()
3772 ret = dasd_sleep_on(cqr); in dasd_generic_read_dev_chars()
3773 dasd_sfree_request(cqr, cqr->memdev); in dasd_generic_read_dev_chars()