Lines Matching refs:cqr
691 struct dasd_ccw_req *cqr, in dasd_profile_start() argument
726 device = cqr->startdev; in dasd_profile_start()
801 struct dasd_ccw_req *cqr, in dasd_profile_end() argument
810 device = cqr->startdev; in dasd_profile_end()
817 if (!cqr->buildclk || !cqr->startclk || in dasd_profile_end()
818 !cqr->stopclk || !cqr->endclk || in dasd_profile_end()
822 strtime = ((cqr->startclk - cqr->buildclk) >> 12); in dasd_profile_end()
823 irqtime = ((cqr->stopclk - cqr->startclk) >> 12); in dasd_profile_end()
824 endtime = ((cqr->endclk - cqr->stopclk) >> 12); in dasd_profile_end()
825 tottime = ((cqr->endclk - cqr->buildclk) >> 12); in dasd_profile_end()
839 cqr->startdev != block->base, in dasd_profile_end()
840 cqr->cpmode == 1, in dasd_profile_end()
852 cqr->startdev != block->base, in dasd_profile_end()
853 cqr->cpmode == 1, in dasd_profile_end()
864 cqr->startdev != block->base, in dasd_profile_end()
865 cqr->cpmode == 1, in dasd_profile_end()
1116 #define dasd_profile_start(block, cqr, req) do {} while (0) argument
1117 #define dasd_profile_end(block, cqr, req) do {} while (0) argument
1164 struct dasd_ccw_req *cqr; in dasd_kmalloc_request() local
1170 cqr = kzalloc(sizeof(struct dasd_ccw_req), GFP_ATOMIC); in dasd_kmalloc_request()
1171 if (cqr == NULL) in dasd_kmalloc_request()
1173 cqr->cpaddr = NULL; in dasd_kmalloc_request()
1175 cqr->cpaddr = kcalloc(cplength, sizeof(struct ccw1), in dasd_kmalloc_request()
1177 if (cqr->cpaddr == NULL) { in dasd_kmalloc_request()
1178 kfree(cqr); in dasd_kmalloc_request()
1182 cqr->data = NULL; in dasd_kmalloc_request()
1184 cqr->data = kzalloc(datasize, GFP_ATOMIC | GFP_DMA); in dasd_kmalloc_request()
1185 if (cqr->data == NULL) { in dasd_kmalloc_request()
1186 kfree(cqr->cpaddr); in dasd_kmalloc_request()
1187 kfree(cqr); in dasd_kmalloc_request()
1191 cqr->magic = magic; in dasd_kmalloc_request()
1192 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_kmalloc_request()
1194 return cqr; in dasd_kmalloc_request()
1203 struct dasd_ccw_req *cqr; in dasd_smalloc_request() local
1213 cqr = (struct dasd_ccw_req *) in dasd_smalloc_request()
1216 if (cqr == NULL) in dasd_smalloc_request()
1218 memset(cqr, 0, sizeof(struct dasd_ccw_req)); in dasd_smalloc_request()
1219 data = (char *) cqr + ((sizeof(struct dasd_ccw_req) + 7L) & -8L); in dasd_smalloc_request()
1220 cqr->cpaddr = NULL; in dasd_smalloc_request()
1222 cqr->cpaddr = (struct ccw1 *) data; in dasd_smalloc_request()
1224 memset(cqr->cpaddr, 0, cplength*sizeof(struct ccw1)); in dasd_smalloc_request()
1226 cqr->data = NULL; in dasd_smalloc_request()
1228 cqr->data = data; in dasd_smalloc_request()
1229 memset(cqr->data, 0, datasize); in dasd_smalloc_request()
1231 cqr->magic = magic; in dasd_smalloc_request()
1232 set_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in dasd_smalloc_request()
1234 return cqr; in dasd_smalloc_request()
1243 void dasd_kfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_kfree_request() argument
1248 ccw = cqr->cpaddr; in dasd_kfree_request()
1252 kfree(cqr->cpaddr); in dasd_kfree_request()
1253 kfree(cqr->data); in dasd_kfree_request()
1254 kfree(cqr); in dasd_kfree_request()
1259 void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_sfree_request() argument
1264 dasd_free_chunk(&device->ccw_chunks, cqr); in dasd_sfree_request()
1273 static inline int dasd_check_cqr(struct dasd_ccw_req *cqr) in dasd_check_cqr() argument
1277 if (cqr == NULL) in dasd_check_cqr()
1279 device = cqr->startdev; in dasd_check_cqr()
1280 if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) { in dasd_check_cqr()
1284 cqr->magic, in dasd_check_cqr()
1297 int dasd_term_IO(struct dasd_ccw_req *cqr) in dasd_term_IO() argument
1304 rc = dasd_check_cqr(cqr); in dasd_term_IO()
1308 device = (struct dasd_device *) cqr->startdev; in dasd_term_IO()
1309 while ((retries < 5) && (cqr->status == DASD_CQR_IN_IO)) { in dasd_term_IO()
1310 rc = ccw_device_clear(device->cdev, (long) cqr); in dasd_term_IO()
1313 cqr->status = DASD_CQR_CLEAR_PENDING; in dasd_term_IO()
1314 cqr->stopclk = get_tod_clock(); in dasd_term_IO()
1315 cqr->starttime = 0; in dasd_term_IO()
1318 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()
1366 int dasd_start_IO(struct dasd_ccw_req *cqr) in dasd_start_IO() argument
1373 rc = dasd_check_cqr(cqr); in dasd_start_IO()
1375 cqr->intrc = rc; in dasd_start_IO()
1378 device = (struct dasd_device *) cqr->startdev; in dasd_start_IO()
1379 if (((cqr->block && in dasd_start_IO()
1380 test_bit(DASD_FLAG_LOCK_STOLEN, &cqr->block->base->flags)) || in dasd_start_IO()
1382 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_start_IO()
1384 "because of stolen lock", cqr); in dasd_start_IO()
1385 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1386 cqr->intrc = -EPERM; in dasd_start_IO()
1389 if (cqr->retries < 0) { in dasd_start_IO()
1391 sprintf(errorstring, "14 %p", cqr); in dasd_start_IO()
1394 cqr->status = DASD_CQR_ERROR; in dasd_start_IO()
1397 cqr->startclk = get_tod_clock(); in dasd_start_IO()
1398 cqr->starttime = jiffies; in dasd_start_IO()
1399 cqr->retries--; in dasd_start_IO()
1400 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1401 cqr->lpm &= device->path_data.opm; in dasd_start_IO()
1402 if (!cqr->lpm) in dasd_start_IO()
1403 cqr->lpm = device->path_data.opm; in dasd_start_IO()
1405 if (cqr->cpmode == 1) { in dasd_start_IO()
1406 rc = ccw_device_tm_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1407 (long) cqr, cqr->lpm); in dasd_start_IO()
1409 rc = ccw_device_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1410 (long) cqr, cqr->lpm, 0); in dasd_start_IO()
1414 cqr->status = DASD_CQR_IN_IO; in dasd_start_IO()
1432 if (test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in dasd_start_IO()
1435 cqr->lpm); in dasd_start_IO()
1436 } else if (cqr->lpm != device->path_data.opm) { in dasd_start_IO()
1437 cqr->lpm = device->path_data.opm; in dasd_start_IO()
1476 cqr->intrc = rc; in dasd_start_IO()
1526 struct dasd_ccw_req *cqr; in dasd_handle_killed_request() local
1531 cqr = (struct dasd_ccw_req *) intparm; in dasd_handle_killed_request()
1532 if (cqr->status != DASD_CQR_IN_IO) { in dasd_handle_killed_request()
1535 "%02x", cqr->status); in dasd_handle_killed_request()
1546 if (!cqr->startdev || in dasd_handle_killed_request()
1547 device != cqr->startdev || in dasd_handle_killed_request()
1548 strncmp(cqr->startdev->discipline->ebcname, in dasd_handle_killed_request()
1549 (char *) &cqr->magic, 4)) { in dasd_handle_killed_request()
1557 cqr->status = DASD_CQR_QUEUED; in dasd_handle_killed_request()
1582 struct dasd_ccw_req *cqr, *next; in dasd_int_handler() local
1605 cqr = (struct dasd_ccw_req *) intparm; in dasd_int_handler()
1607 if (!cqr || in dasd_int_handler()
1610 if (cqr) in dasd_int_handler()
1611 memcpy(&cqr->irb, irb, sizeof(*irb)); in dasd_int_handler()
1622 device->discipline->dump_sense(device, cqr, irb); in dasd_int_handler()
1623 device->discipline->check_for_device_change(device, cqr, irb); in dasd_int_handler()
1634 if (!cqr) in dasd_int_handler()
1637 device = (struct dasd_device *) cqr->startdev; in dasd_int_handler()
1639 strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { in dasd_int_handler()
1646 if (cqr->status == DASD_CQR_CLEAR_PENDING && in dasd_int_handler()
1648 cqr->status = DASD_CQR_CLEARED; in dasd_int_handler()
1656 if (cqr->status != DASD_CQR_IN_IO) { in dasd_int_handler()
1658 "status %02x", dev_name(&cdev->dev), cqr->status); in dasd_int_handler()
1667 cqr->status = DASD_CQR_SUCCESS; in dasd_int_handler()
1668 cqr->stopclk = now; in dasd_int_handler()
1670 if (cqr->devlist.next != &device->ccw_queue) { in dasd_int_handler()
1671 next = list_entry(cqr->devlist.next, in dasd_int_handler()
1679 if (!test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags) && in dasd_int_handler()
1680 cqr->retries > 0) { in dasd_int_handler()
1681 if (cqr->lpm == device->path_data.opm) in dasd_int_handler()
1685 cqr->retries); in dasd_int_handler()
1686 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) in dasd_int_handler()
1687 cqr->lpm = device->path_data.opm; in dasd_int_handler()
1688 cqr->status = DASD_CQR_QUEUED; in dasd_int_handler()
1689 next = cqr; in dasd_int_handler()
1691 cqr->status = DASD_CQR_ERROR; in dasd_int_handler()
1737 struct dasd_ccw_req *cqr; in __dasd_device_recovery() local
1746 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_recovery()
1747 if (cqr->status == DASD_CQR_QUEUED && in __dasd_device_recovery()
1748 ref_cqr->block == cqr->block) { in __dasd_device_recovery()
1749 cqr->status = DASD_CQR_CLEARED; in __dasd_device_recovery()
1762 struct dasd_ccw_req *cqr; in __dasd_device_process_ccw_queue() local
1766 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_ccw_queue()
1769 if (cqr->status == DASD_CQR_QUEUED || in __dasd_device_process_ccw_queue()
1770 cqr->status == DASD_CQR_IN_IO || in __dasd_device_process_ccw_queue()
1771 cqr->status == DASD_CQR_CLEAR_PENDING) in __dasd_device_process_ccw_queue()
1773 if (cqr->status == DASD_CQR_ERROR) { in __dasd_device_process_ccw_queue()
1774 __dasd_device_recovery(device, cqr); in __dasd_device_process_ccw_queue()
1777 list_move_tail(&cqr->devlist, final_queue); in __dasd_device_process_ccw_queue()
1789 struct dasd_ccw_req *cqr; in __dasd_device_process_final_queue() local
1796 cqr = list_entry(l, struct dasd_ccw_req, devlist); in __dasd_device_process_final_queue()
1797 list_del_init(&cqr->devlist); in __dasd_device_process_final_queue()
1798 block = cqr->block; in __dasd_device_process_final_queue()
1799 callback = cqr->callback; in __dasd_device_process_final_queue()
1800 callback_data = cqr->callback_data; in __dasd_device_process_final_queue()
1803 switch (cqr->status) { in __dasd_device_process_final_queue()
1805 cqr->status = DASD_CQR_DONE; in __dasd_device_process_final_queue()
1808 cqr->status = DASD_CQR_NEED_ERP; in __dasd_device_process_final_queue()
1811 cqr->status = DASD_CQR_TERMINATED; in __dasd_device_process_final_queue()
1815 snprintf(errorstring, ERRORLENGTH, "12 %p %x02", cqr, cqr->status); in __dasd_device_process_final_queue()
1821 if (cqr->callback != NULL) in __dasd_device_process_final_queue()
1822 (callback)(cqr, callback_data); in __dasd_device_process_final_queue()
1834 struct dasd_ccw_req *cqr; in __dasd_device_check_expire() local
1838 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_check_expire()
1839 if ((cqr->status == DASD_CQR_IN_IO && cqr->expires != 0) && in __dasd_device_check_expire()
1840 (time_after_eq(jiffies, cqr->expires + cqr->starttime))) { in __dasd_device_check_expire()
1846 cqr->retries++; in __dasd_device_check_expire()
1848 if (device->discipline->term_IO(cqr) != 0) { in __dasd_device_check_expire()
1853 cqr, (cqr->expires/HZ)); in __dasd_device_check_expire()
1854 cqr->expires += 5*HZ; in __dasd_device_check_expire()
1859 "remaining\n", cqr, (cqr->expires/HZ), in __dasd_device_check_expire()
1860 cqr->retries); in __dasd_device_check_expire()
1869 struct dasd_ccw_req *cqr) in __dasd_device_is_unusable() argument
1882 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in __dasd_device_is_unusable()
1898 struct dasd_ccw_req *cqr; in __dasd_device_start_head() local
1903 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_start_head()
1904 if (cqr->status != DASD_CQR_QUEUED) in __dasd_device_start_head()
1907 if (__dasd_device_is_unusable(device, cqr)) { in __dasd_device_start_head()
1908 cqr->intrc = -EAGAIN; in __dasd_device_start_head()
1909 cqr->status = DASD_CQR_CLEARED; in __dasd_device_start_head()
1914 rc = device->discipline->start_IO(cqr); in __dasd_device_start_head()
1916 dasd_device_set_timer(device, cqr->expires); in __dasd_device_start_head()
1953 struct dasd_ccw_req *cqr, *n; in dasd_flush_device_queue() local
1960 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_flush_device_queue()
1962 switch (cqr->status) { in dasd_flush_device_queue()
1964 rc = device->discipline->term_IO(cqr); in dasd_flush_device_queue()
1969 "failed for request %p\n", cqr); in dasd_flush_device_queue()
1975 cqr->stopclk = get_tod_clock(); in dasd_flush_device_queue()
1976 cqr->status = DASD_CQR_CLEARED; in dasd_flush_device_queue()
1981 list_move_tail(&cqr->devlist, &flush_queue); in dasd_flush_device_queue()
1990 list_for_each_entry_safe(cqr, n, &flush_queue, devlist) in dasd_flush_device_queue()
1992 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_flush_device_queue()
2060 void dasd_add_request_head(struct dasd_ccw_req *cqr) in dasd_add_request_head() argument
2065 device = cqr->startdev; in dasd_add_request_head()
2067 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_head()
2068 list_add(&cqr->devlist, &device->ccw_queue); in dasd_add_request_head()
2079 void dasd_add_request_tail(struct dasd_ccw_req *cqr) in dasd_add_request_tail() argument
2084 device = cqr->startdev; in dasd_add_request_tail()
2086 cqr->status = DASD_CQR_QUEUED; in dasd_add_request_tail()
2087 list_add_tail(&cqr->devlist, &device->ccw_queue); in dasd_add_request_tail()
2097 void dasd_wakeup_cb(struct dasd_ccw_req *cqr, void *data) in dasd_wakeup_cb() argument
2099 spin_lock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2100 cqr->callback_data = DASD_SLEEPON_END_TAG; in dasd_wakeup_cb()
2101 spin_unlock_irq(get_ccwdev_lock(cqr->startdev->cdev)); in dasd_wakeup_cb()
2106 static inline int _wait_for_wakeup(struct dasd_ccw_req *cqr) in _wait_for_wakeup() argument
2111 device = cqr->startdev; in _wait_for_wakeup()
2113 rc = (cqr->callback_data == DASD_SLEEPON_END_TAG); in _wait_for_wakeup()
2121 static int __dasd_sleep_on_erp(struct dasd_ccw_req *cqr) in __dasd_sleep_on_erp() argument
2126 if (cqr->status == DASD_CQR_FILLED) in __dasd_sleep_on_erp()
2128 device = cqr->startdev; in __dasd_sleep_on_erp()
2129 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_erp()
2130 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_sleep_on_erp()
2131 device->discipline->handle_terminated_request(cqr); in __dasd_sleep_on_erp()
2134 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_sleep_on_erp()
2135 erp_fn = device->discipline->erp_action(cqr); in __dasd_sleep_on_erp()
2136 erp_fn(cqr); in __dasd_sleep_on_erp()
2139 if (cqr->status == DASD_CQR_FAILED) in __dasd_sleep_on_erp()
2140 dasd_log_sense(cqr, &cqr->irb); in __dasd_sleep_on_erp()
2141 if (cqr->refers) { in __dasd_sleep_on_erp()
2142 __dasd_process_erp(device, cqr); in __dasd_sleep_on_erp()
2149 static int __dasd_sleep_on_loop_condition(struct dasd_ccw_req *cqr) in __dasd_sleep_on_loop_condition() argument
2151 if (test_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags)) { in __dasd_sleep_on_loop_condition()
2152 if (cqr->refers) /* erp is not done yet */ in __dasd_sleep_on_loop_condition()
2154 return ((cqr->status != DASD_CQR_DONE) && in __dasd_sleep_on_loop_condition()
2155 (cqr->status != DASD_CQR_FAILED)); in __dasd_sleep_on_loop_condition()
2157 return (cqr->status == DASD_CQR_FILLED); in __dasd_sleep_on_loop_condition()
2165 struct dasd_ccw_req *cqr; in _dasd_sleep_on() local
2171 for (cqr = maincqr; __dasd_sleep_on_loop_condition(cqr); in _dasd_sleep_on()
2172 cqr = list_first_entry(&ccw_queue, in _dasd_sleep_on()
2175 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on()
2177 if (cqr->status != DASD_CQR_FILLED) /* could be failed */ in _dasd_sleep_on()
2180 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on()
2181 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2182 cqr->intrc = -EPERM; in _dasd_sleep_on()
2187 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on()
2189 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2190 cqr->intrc = -ENOLINK; in _dasd_sleep_on()
2197 if (!test_bit(DASD_CQR_VERIFY_PATH, &cqr->flags)) { in _dasd_sleep_on()
2202 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2209 if (!cqr->callback) in _dasd_sleep_on()
2210 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on()
2212 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on()
2213 dasd_add_request_tail(cqr); in _dasd_sleep_on()
2216 generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2218 dasd_cancel_req(cqr); in _dasd_sleep_on()
2221 _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2222 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on()
2227 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in _dasd_sleep_on()
2245 struct dasd_ccw_req *cqr; in _wait_for_wakeup_queue() local
2247 list_for_each_entry(cqr, ccw_queue, blocklist) { in _wait_for_wakeup_queue()
2248 if (cqr->callback_data != DASD_SLEEPON_END_TAG) in _wait_for_wakeup_queue()
2258 struct dasd_ccw_req *cqr, *n; in _dasd_sleep_on_queue() local
2262 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2263 device = cqr->startdev; in _dasd_sleep_on_queue()
2264 if (cqr->status != DASD_CQR_FILLED) /*could be failed*/ in _dasd_sleep_on_queue()
2268 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in _dasd_sleep_on_queue()
2269 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2270 cqr->intrc = -EPERM; in _dasd_sleep_on_queue()
2275 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in _dasd_sleep_on_queue()
2277 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2278 cqr->intrc = -EAGAIN; in _dasd_sleep_on_queue()
2287 cqr->status = DASD_CQR_FAILED; in _dasd_sleep_on_queue()
2288 cqr->intrc = rc; in _dasd_sleep_on_queue()
2294 if (!cqr->callback) in _dasd_sleep_on_queue()
2295 cqr->callback = dasd_wakeup_cb; in _dasd_sleep_on_queue()
2296 cqr->callback_data = DASD_SLEEPON_START_TAG; in _dasd_sleep_on_queue()
2297 dasd_add_request_tail(cqr); in _dasd_sleep_on_queue()
2303 list_for_each_entry_safe(cqr, n, ccw_queue, blocklist) { in _dasd_sleep_on_queue()
2309 if (cqr->startdev != cqr->basedev && !cqr->refers && in _dasd_sleep_on_queue()
2310 (cqr->status == DASD_CQR_TERMINATED || in _dasd_sleep_on_queue()
2311 cqr->status == DASD_CQR_NEED_ERP)) in _dasd_sleep_on_queue()
2315 if (__dasd_sleep_on_erp(cqr)) in _dasd_sleep_on_queue()
2327 int dasd_sleep_on(struct dasd_ccw_req *cqr) in dasd_sleep_on() argument
2329 return _dasd_sleep_on(cqr, 0); in dasd_sleep_on()
2346 int dasd_sleep_on_interruptible(struct dasd_ccw_req *cqr) in dasd_sleep_on_interruptible() argument
2348 return _dasd_sleep_on(cqr, 1); in dasd_sleep_on_interruptible()
2360 struct dasd_ccw_req *cqr; in _dasd_term_running_cqr() local
2365 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in _dasd_term_running_cqr()
2366 rc = device->discipline->term_IO(cqr); in _dasd_term_running_cqr()
2373 cqr->retries++; in _dasd_term_running_cqr()
2377 int dasd_sleep_on_immediatly(struct dasd_ccw_req *cqr) in dasd_sleep_on_immediatly() argument
2382 device = cqr->startdev; in dasd_sleep_on_immediatly()
2384 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in dasd_sleep_on_immediatly()
2385 cqr->status = DASD_CQR_FAILED; in dasd_sleep_on_immediatly()
2386 cqr->intrc = -EPERM; in dasd_sleep_on_immediatly()
2395 cqr->callback = dasd_wakeup_cb; in dasd_sleep_on_immediatly()
2396 cqr->callback_data = DASD_SLEEPON_START_TAG; in dasd_sleep_on_immediatly()
2397 cqr->status = DASD_CQR_QUEUED; in dasd_sleep_on_immediatly()
2402 list_add(&cqr->devlist, device->ccw_queue.next); in dasd_sleep_on_immediatly()
2409 wait_event(generic_waitq, _wait_for_wakeup(cqr)); in dasd_sleep_on_immediatly()
2411 if (cqr->status == DASD_CQR_DONE) in dasd_sleep_on_immediatly()
2413 else if (cqr->intrc) in dasd_sleep_on_immediatly()
2414 rc = cqr->intrc; in dasd_sleep_on_immediatly()
2436 int dasd_cancel_req(struct dasd_ccw_req *cqr) in dasd_cancel_req() argument
2438 struct dasd_device *device = cqr->startdev; in dasd_cancel_req()
2444 switch (cqr->status) { in dasd_cancel_req()
2447 cqr->status = DASD_CQR_CLEARED; in dasd_cancel_req()
2448 if (cqr->callback_data == DASD_SLEEPON_START_TAG) in dasd_cancel_req()
2449 cqr->callback_data = DASD_SLEEPON_END_TAG; in dasd_cancel_req()
2453 rc = device->discipline->term_IO(cqr); in dasd_cancel_req()
2457 cqr, rc); in dasd_cancel_req()
2459 cqr->stopclk = get_tod_clock(); in dasd_cancel_req()
2518 struct dasd_ccw_req *cqr) in __dasd_process_erp() argument
2522 if (cqr->status == DASD_CQR_DONE) in __dasd_process_erp()
2526 erp_fn = device->discipline->erp_postaction(cqr); in __dasd_process_erp()
2527 erp_fn(cqr); in __dasd_process_erp()
2537 struct dasd_ccw_req *cqr; in __dasd_process_request_queue() local
2584 cqr = basedev->discipline->build_cp(basedev, block, req); in __dasd_process_request_queue()
2585 if (IS_ERR(cqr)) { in __dasd_process_request_queue()
2586 if (PTR_ERR(cqr) == -EBUSY) in __dasd_process_request_queue()
2588 if (PTR_ERR(cqr) == -ENOMEM) in __dasd_process_request_queue()
2590 if (PTR_ERR(cqr) == -EAGAIN) { in __dasd_process_request_queue()
2611 PTR_ERR(cqr), req); in __dasd_process_request_queue()
2620 cqr->callback_data = (void *) req; in __dasd_process_request_queue()
2621 cqr->status = DASD_CQR_FILLED; in __dasd_process_request_queue()
2622 req->completion_data = cqr; in __dasd_process_request_queue()
2624 list_add_tail(&cqr->blocklist, &block->ccw_queue); in __dasd_process_request_queue()
2625 INIT_LIST_HEAD(&cqr->devlist); in __dasd_process_request_queue()
2626 dasd_profile_start(block, cqr, req); in __dasd_process_request_queue()
2630 static void __dasd_cleanup_cqr(struct dasd_ccw_req *cqr) in __dasd_cleanup_cqr() argument
2636 req = (struct request *) cqr->callback_data; in __dasd_cleanup_cqr()
2637 dasd_profile_end(cqr->block, cqr, req); in __dasd_cleanup_cqr()
2638 status = cqr->block->base->discipline->free_cp(cqr, req); in __dasd_cleanup_cqr()
2642 if (cqr->intrc == -EPERM) in __dasd_cleanup_cqr()
2644 else if (cqr->intrc == -ENOLINK || in __dasd_cleanup_cqr()
2645 cqr->intrc == -ETIMEDOUT) in __dasd_cleanup_cqr()
2646 error = cqr->intrc; in __dasd_cleanup_cqr()
2660 struct dasd_ccw_req *cqr; in __dasd_process_block_ccw_queue() local
2668 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in __dasd_process_block_ccw_queue()
2669 if (cqr->status != DASD_CQR_DONE && in __dasd_process_block_ccw_queue()
2670 cqr->status != DASD_CQR_FAILED && in __dasd_process_block_ccw_queue()
2671 cqr->status != DASD_CQR_NEED_ERP && in __dasd_process_block_ccw_queue()
2672 cqr->status != DASD_CQR_TERMINATED) in __dasd_process_block_ccw_queue()
2675 if (cqr->status == DASD_CQR_TERMINATED) { in __dasd_process_block_ccw_queue()
2676 base->discipline->handle_terminated_request(cqr); in __dasd_process_block_ccw_queue()
2681 if (cqr->status == DASD_CQR_NEED_ERP) { in __dasd_process_block_ccw_queue()
2682 erp_fn = base->discipline->erp_action(cqr); in __dasd_process_block_ccw_queue()
2683 if (IS_ERR(erp_fn(cqr))) in __dasd_process_block_ccw_queue()
2689 if (cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2690 dasd_log_sense(cqr, &cqr->irb); in __dasd_process_block_ccw_queue()
2695 cqr->status == DASD_CQR_FAILED) { in __dasd_process_block_ccw_queue()
2696 dasd_eer_write(base, cqr, DASD_EER_FATALERROR); in __dasd_process_block_ccw_queue()
2699 cqr->status = DASD_CQR_FILLED; in __dasd_process_block_ccw_queue()
2700 cqr->retries = 255; in __dasd_process_block_ccw_queue()
2709 if (cqr->refers) { in __dasd_process_block_ccw_queue()
2710 __dasd_process_erp(base, cqr); in __dasd_process_block_ccw_queue()
2715 cqr->endclk = get_tod_clock(); in __dasd_process_block_ccw_queue()
2716 list_move_tail(&cqr->blocklist, final_queue); in __dasd_process_block_ccw_queue()
2720 static void dasd_return_cqr_cb(struct dasd_ccw_req *cqr, void *data) in dasd_return_cqr_cb() argument
2722 dasd_schedule_block_bh(cqr->block); in dasd_return_cqr_cb()
2727 struct dasd_ccw_req *cqr; in __dasd_block_start_head() local
2735 list_for_each_entry(cqr, &block->ccw_queue, blocklist) { in __dasd_block_start_head()
2736 if (cqr->status != DASD_CQR_FILLED) in __dasd_block_start_head()
2739 !test_bit(DASD_CQR_ALLOW_SLOCK, &cqr->flags)) { in __dasd_block_start_head()
2740 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2741 cqr->intrc = -EPERM; in __dasd_block_start_head()
2747 test_bit(DASD_CQR_FLAGS_FAILFAST, &cqr->flags) && in __dasd_block_start_head()
2749 cqr->status = DASD_CQR_FAILED; in __dasd_block_start_head()
2750 cqr->intrc = -ENOLINK; in __dasd_block_start_head()
2759 if (!cqr->startdev) in __dasd_block_start_head()
2760 cqr->startdev = block->base; in __dasd_block_start_head()
2763 cqr->callback = dasd_return_cqr_cb; in __dasd_block_start_head()
2765 dasd_add_request_tail(cqr); in __dasd_block_start_head()
2778 struct dasd_ccw_req *cqr; in dasd_block_tasklet() local
2789 cqr = list_entry(l, struct dasd_ccw_req, blocklist); in dasd_block_tasklet()
2790 list_del_init(&cqr->blocklist); in dasd_block_tasklet()
2791 __dasd_cleanup_cqr(cqr); in dasd_block_tasklet()
2805 static void _dasd_wake_block_flush_cb(struct dasd_ccw_req *cqr, void *data) in _dasd_wake_block_flush_cb() argument
2814 static int _dasd_requeue_request(struct dasd_ccw_req *cqr) in _dasd_requeue_request() argument
2816 struct dasd_block *block = cqr->block; in _dasd_requeue_request()
2823 req = (struct request *) cqr->callback_data; in _dasd_requeue_request()
2837 struct dasd_ccw_req *cqr, *n; in dasd_flush_block_queue() local
2845 list_for_each_entry_safe(cqr, n, &block->ccw_queue, blocklist) { in dasd_flush_block_queue()
2847 if (cqr->status >= DASD_CQR_QUEUED) in dasd_flush_block_queue()
2848 rc = dasd_cancel_req(cqr); in dasd_flush_block_queue()
2856 cqr->callback = _dasd_wake_block_flush_cb; in dasd_flush_block_queue()
2857 for (i = 0; cqr != NULL; cqr = cqr->refers, i++) in dasd_flush_block_queue()
2858 list_move_tail(&cqr->blocklist, &flush_queue); in dasd_flush_block_queue()
2866 list_for_each_entry_safe(cqr, n, &flush_queue, blocklist) { in dasd_flush_block_queue()
2867 wait_event(dasd_flush_wq, (cqr->status < DASD_CQR_QUEUED)); in dasd_flush_block_queue()
2869 if (cqr->refers) { in dasd_flush_block_queue()
2871 __dasd_process_erp(block->base, cqr); in dasd_flush_block_queue()
2879 cqr->endclk = get_tod_clock(); in dasd_flush_block_queue()
2880 list_del_init(&cqr->blocklist); in dasd_flush_block_queue()
2881 __dasd_cleanup_cqr(cqr); in dasd_flush_block_queue()
2935 struct dasd_ccw_req *cqr = req->completion_data; in dasd_times_out() local
2940 if (!cqr) in dasd_times_out()
2943 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
2948 cqr, cqr->status); in dasd_times_out()
2952 cqr->retries = -1; in dasd_times_out()
2953 cqr->intrc = -ETIMEDOUT; in dasd_times_out()
2954 if (cqr->status >= DASD_CQR_QUEUED) { in dasd_times_out()
2956 rc = dasd_cancel_req(cqr); in dasd_times_out()
2957 } else if (cqr->status == DASD_CQR_FILLED || in dasd_times_out()
2958 cqr->status == DASD_CQR_NEED_ERP) { in dasd_times_out()
2959 cqr->status = DASD_CQR_TERMINATED; in dasd_times_out()
2961 } else if (cqr->status == DASD_CQR_IN_ERP) { in dasd_times_out()
2969 if (tmpcqr != cqr) in dasd_times_out()
3498 struct dasd_ccw_req *cqr; in dasd_generic_last_path_gone() local
3509 list_for_each_entry(cqr, &device->ccw_queue, devlist) in dasd_generic_last_path_gone()
3510 if ((cqr->status == DASD_CQR_IN_IO) || in dasd_generic_last_path_gone()
3511 (cqr->status == DASD_CQR_CLEAR_PENDING)) { in dasd_generic_last_path_gone()
3512 cqr->status = DASD_CQR_QUEUED; in dasd_generic_last_path_gone()
3513 cqr->retries++; in dasd_generic_last_path_gone()
3644 struct dasd_ccw_req *cqr, *n; in dasd_generic_pm_freeze() local
3664 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_generic_pm_freeze()
3666 if (cqr->status == DASD_CQR_IN_IO) { in dasd_generic_pm_freeze()
3667 rc = device->discipline->term_IO(cqr); in dasd_generic_pm_freeze()
3672 "on suspend\n", cqr); in dasd_generic_pm_freeze()
3678 list_move_tail(&cqr->devlist, &freeze_queue); in dasd_generic_pm_freeze()
3682 list_for_each_entry_safe(cqr, n, &freeze_queue, devlist) { in dasd_generic_pm_freeze()
3684 (cqr->status != DASD_CQR_CLEAR_PENDING)); in dasd_generic_pm_freeze()
3685 if (cqr->status == DASD_CQR_CLEARED) in dasd_generic_pm_freeze()
3686 cqr->status = DASD_CQR_QUEUED; in dasd_generic_pm_freeze()
3690 if (_dasd_requeue_request(cqr)) in dasd_generic_pm_freeze()
3694 list_del_init(&cqr->devlist); in dasd_generic_pm_freeze()
3695 while (cqr->refers != NULL) { in dasd_generic_pm_freeze()
3696 refers = cqr->refers; in dasd_generic_pm_freeze()
3698 list_del(&cqr->blocklist); in dasd_generic_pm_freeze()
3700 dasd_free_erp_request(cqr, cqr->memdev); in dasd_generic_pm_freeze()
3701 cqr = refers; in dasd_generic_pm_freeze()
3703 if (cqr->block) in dasd_generic_pm_freeze()
3704 list_del_init(&cqr->blocklist); in dasd_generic_pm_freeze()
3705 cqr->block->base->discipline->free_cp( in dasd_generic_pm_freeze()
3706 cqr, (struct request *) cqr->callback_data); in dasd_generic_pm_freeze()
3765 struct dasd_ccw_req *cqr; in dasd_generic_build_rdc() local
3769 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device); in dasd_generic_build_rdc()
3771 if (IS_ERR(cqr)) { in dasd_generic_build_rdc()
3776 return cqr; in dasd_generic_build_rdc()
3779 ccw = cqr->cpaddr; in dasd_generic_build_rdc()
3782 idaw = (unsigned long *) (cqr->data); in dasd_generic_build_rdc()
3792 cqr->startdev = device; in dasd_generic_build_rdc()
3793 cqr->memdev = device; in dasd_generic_build_rdc()
3794 cqr->expires = 10*HZ; in dasd_generic_build_rdc()
3795 cqr->retries = 256; in dasd_generic_build_rdc()
3796 cqr->buildclk = get_tod_clock(); in dasd_generic_build_rdc()
3797 cqr->status = DASD_CQR_FILLED; in dasd_generic_build_rdc()
3798 return cqr; in dasd_generic_build_rdc()
3806 struct dasd_ccw_req *cqr; in dasd_generic_read_dev_chars() local
3808 cqr = dasd_generic_build_rdc(device, rdc_buffer, rdc_buffer_size, in dasd_generic_read_dev_chars()
3810 if (IS_ERR(cqr)) in dasd_generic_read_dev_chars()
3811 return PTR_ERR(cqr); in dasd_generic_read_dev_chars()
3813 ret = dasd_sleep_on(cqr); in dasd_generic_read_dev_chars()
3814 dasd_sfree_request(cqr, cqr->memdev); in dasd_generic_read_dev_chars()