Lines Matching full:device

64 MODULE_DESCRIPTION("Linux on S/390 DASD device driver,"
89 * SECTION: Operations on the device structure.
97 * Allocate memory for a new device structure.
101 struct dasd_device *device; in dasd_alloc_device() local
103 device = kzalloc(sizeof(struct dasd_device), GFP_ATOMIC); in dasd_alloc_device()
104 if (!device) in dasd_alloc_device()
107 /* Get two pages for normal block device operations. */ in dasd_alloc_device()
108 device->ccw_mem = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA, 1); in dasd_alloc_device()
109 if (!device->ccw_mem) { in dasd_alloc_device()
110 kfree(device); in dasd_alloc_device()
114 device->erp_mem = (void *) get_zeroed_page(GFP_ATOMIC | GFP_DMA); in dasd_alloc_device()
115 if (!device->erp_mem) { in dasd_alloc_device()
116 free_pages((unsigned long) device->ccw_mem, 1); in dasd_alloc_device()
117 kfree(device); in dasd_alloc_device()
121 device->ese_mem = (void *)__get_free_pages(GFP_ATOMIC | GFP_DMA, 1); in dasd_alloc_device()
122 if (!device->ese_mem) { in dasd_alloc_device()
123 free_page((unsigned long) device->erp_mem); in dasd_alloc_device()
124 free_pages((unsigned long) device->ccw_mem, 1); in dasd_alloc_device()
125 kfree(device); in dasd_alloc_device()
129 dasd_init_chunklist(&device->ccw_chunks, device->ccw_mem, PAGE_SIZE*2); in dasd_alloc_device()
130 dasd_init_chunklist(&device->erp_chunks, device->erp_mem, PAGE_SIZE); in dasd_alloc_device()
131 dasd_init_chunklist(&device->ese_chunks, device->ese_mem, PAGE_SIZE * 2); in dasd_alloc_device()
132 spin_lock_init(&device->mem_lock); in dasd_alloc_device()
133 atomic_set(&device->tasklet_scheduled, 0); in dasd_alloc_device()
134 tasklet_init(&device->tasklet, dasd_device_tasklet, in dasd_alloc_device()
135 (unsigned long) device); in dasd_alloc_device()
136 INIT_LIST_HEAD(&device->ccw_queue); in dasd_alloc_device()
137 timer_setup(&device->timer, dasd_device_timeout, 0); in dasd_alloc_device()
138 INIT_WORK(&device->kick_work, do_kick_device); in dasd_alloc_device()
139 INIT_WORK(&device->reload_device, do_reload_device); in dasd_alloc_device()
140 INIT_WORK(&device->requeue_requests, do_requeue_requests); in dasd_alloc_device()
141 device->state = DASD_STATE_NEW; in dasd_alloc_device()
142 device->target = DASD_STATE_NEW; in dasd_alloc_device()
143 mutex_init(&device->state_mutex); in dasd_alloc_device()
144 spin_lock_init(&device->profile.lock); in dasd_alloc_device()
145 return device; in dasd_alloc_device()
149 * Free memory of a device structure.
151 void dasd_free_device(struct dasd_device *device) in dasd_free_device() argument
153 kfree(device->private); in dasd_free_device()
154 free_pages((unsigned long) device->ese_mem, 1); in dasd_free_device()
155 free_page((unsigned long) device->erp_mem); in dasd_free_device()
156 free_pages((unsigned long) device->ccw_mem, 1); in dasd_free_device()
157 kfree(device); in dasd_free_device()
161 * Allocate memory for a new device structure.
170 /* open_count = 0 means device online but not in use */ in dasd_alloc_block()
188 * Free memory of a device structure.
197 * Make a new device known to the system.
199 static int dasd_state_new_to_known(struct dasd_device *device) in dasd_state_new_to_known() argument
204 * As long as the device is not in state DASD_STATE_NEW we want to in dasd_state_new_to_known()
207 dasd_get_device(device); in dasd_state_new_to_known()
209 if (device->block) { in dasd_state_new_to_known()
210 rc = dasd_alloc_queue(device->block); in dasd_state_new_to_known()
212 dasd_put_device(device); in dasd_state_new_to_known()
216 device->state = DASD_STATE_KNOWN; in dasd_state_new_to_known()
221 * Let the system forget about a device.
223 static int dasd_state_known_to_new(struct dasd_device *device) in dasd_state_known_to_new() argument
225 /* Disable extended error reporting for this device. */ in dasd_state_known_to_new()
226 dasd_eer_disable(device); in dasd_state_known_to_new()
227 device->state = DASD_STATE_NEW; in dasd_state_known_to_new()
229 if (device->block) in dasd_state_known_to_new()
230 dasd_free_queue(device->block); in dasd_state_known_to_new()
233 dasd_put_device(device); in dasd_state_known_to_new()
251 * Request the irq line for the device.
253 static int dasd_state_known_to_basic(struct dasd_device *device) in dasd_state_known_to_basic() argument
255 struct dasd_block *block = device->block; in dasd_state_known_to_basic()
268 dasd_profile_on(&device->block->profile); in dasd_state_known_to_basic()
270 device->debugfs_dentry = in dasd_state_known_to_basic()
271 dasd_debugfs_setup(dev_name(&device->cdev->dev), in dasd_state_known_to_basic()
273 dasd_profile_init(&device->profile, device->debugfs_dentry); in dasd_state_known_to_basic()
274 dasd_hosts_init(device->debugfs_dentry, device); in dasd_state_known_to_basic()
276 /* register 'device' debug area, used for all DBF_DEV_XXX calls */ in dasd_state_known_to_basic()
277 device->debug_area = debug_register(dev_name(&device->cdev->dev), 4, 1, in dasd_state_known_to_basic()
279 debug_register_view(device->debug_area, &debug_sprintf_view); in dasd_state_known_to_basic()
280 debug_set_level(device->debug_area, DBF_WARNING); in dasd_state_known_to_basic()
281 DBF_DEV_EVENT(DBF_EMERG, device, "%s", "debug area created"); in dasd_state_known_to_basic()
283 device->state = DASD_STATE_BASIC; in dasd_state_known_to_basic()
289 * Release the irq line for the device. Terminate any running i/o.
291 static int dasd_state_basic_to_known(struct dasd_device *device) in dasd_state_basic_to_known() argument
295 if (device->discipline->basic_to_known) { in dasd_state_basic_to_known()
296 rc = device->discipline->basic_to_known(device); in dasd_state_basic_to_known()
301 if (device->block) { in dasd_state_basic_to_known()
302 dasd_profile_exit(&device->block->profile); in dasd_state_basic_to_known()
303 debugfs_remove(device->block->debugfs_dentry); in dasd_state_basic_to_known()
304 dasd_gendisk_free(device->block); in dasd_state_basic_to_known()
305 dasd_block_clear_timer(device->block); in dasd_state_basic_to_known()
307 rc = dasd_flush_device_queue(device); in dasd_state_basic_to_known()
310 dasd_device_clear_timer(device); in dasd_state_basic_to_known()
311 dasd_profile_exit(&device->profile); in dasd_state_basic_to_known()
312 dasd_hosts_exit(device); in dasd_state_basic_to_known()
313 debugfs_remove(device->debugfs_dentry); in dasd_state_basic_to_known()
314 DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device); in dasd_state_basic_to_known()
315 if (device->debug_area != NULL) { in dasd_state_basic_to_known()
316 debug_unregister(device->debug_area); in dasd_state_basic_to_known()
317 device->debug_area = NULL; in dasd_state_basic_to_known()
319 device->state = DASD_STATE_KNOWN; in dasd_state_basic_to_known()
325 * -EAGAIN in which case the device keeps the state DASD_STATE_BASIC
333 * device is setup.
334 * In case the analysis returns an error, the device setup is stopped
337 static int dasd_state_basic_to_ready(struct dasd_device *device) in dasd_state_basic_to_ready() argument
344 block = device->block; in dasd_state_basic_to_ready()
351 device->state = DASD_STATE_UNFMT; in dasd_state_basic_to_ready()
352 disk = device->block->gdp; in dasd_state_basic_to_ready()
359 if (device->discipline->setup_blk_queue) in dasd_state_basic_to_ready()
360 device->discipline->setup_blk_queue(block); in dasd_state_basic_to_ready()
363 device->state = DASD_STATE_READY; in dasd_state_basic_to_ready()
366 device->state = DASD_STATE_BASIC; in dasd_state_basic_to_ready()
370 device->state = DASD_STATE_READY; in dasd_state_basic_to_ready()
373 if (device->discipline->basic_to_ready) in dasd_state_basic_to_ready()
374 rc = device->discipline->basic_to_ready(device); in dasd_state_basic_to_ready()
379 int _wait_for_empty_queues(struct dasd_device *device) in _wait_for_empty_queues() argument
381 if (device->block) in _wait_for_empty_queues()
382 return list_empty(&device->ccw_queue) && in _wait_for_empty_queues()
383 list_empty(&device->block->ccw_queue); in _wait_for_empty_queues()
385 return list_empty(&device->ccw_queue); in _wait_for_empty_queues()
389 * Remove device from block device layer. Destroy dirty buffers.
393 static int dasd_state_ready_to_basic(struct dasd_device *device) in dasd_state_ready_to_basic() argument
397 device->state = DASD_STATE_BASIC; in dasd_state_ready_to_basic()
398 if (device->block) { in dasd_state_ready_to_basic()
399 struct dasd_block *block = device->block; in dasd_state_ready_to_basic()
402 device->state = DASD_STATE_READY; in dasd_state_ready_to_basic()
416 static int dasd_state_unfmt_to_basic(struct dasd_device *device) in dasd_state_unfmt_to_basic() argument
418 device->state = DASD_STATE_BASIC; in dasd_state_unfmt_to_basic()
423 * Make the device online and schedule the bottom half to start
428 dasd_state_ready_to_online(struct dasd_device * device) in dasd_state_ready_to_online() argument
430 device->state = DASD_STATE_ONLINE; in dasd_state_ready_to_online()
431 if (device->block) { in dasd_state_ready_to_online()
432 dasd_schedule_block_bh(device->block); in dasd_state_ready_to_online()
433 if ((device->features & DASD_FEATURE_USERAW)) { in dasd_state_ready_to_online()
434 kobject_uevent(&disk_to_dev(device->block->gdp)->kobj, in dasd_state_ready_to_online()
438 disk_uevent(device->block->bdev->bd_disk, KOBJ_CHANGE); in dasd_state_ready_to_online()
446 static int dasd_state_online_to_ready(struct dasd_device *device) in dasd_state_online_to_ready() argument
450 if (device->discipline->online_to_ready) { in dasd_state_online_to_ready()
451 rc = device->discipline->online_to_ready(device); in dasd_state_online_to_ready()
456 device->state = DASD_STATE_READY; in dasd_state_online_to_ready()
457 if (device->block && !(device->features & DASD_FEATURE_USERAW)) in dasd_state_online_to_ready()
458 disk_uevent(device->block->bdev->bd_disk, KOBJ_CHANGE); in dasd_state_online_to_ready()
463 * Device startup state changes.
465 static int dasd_increase_state(struct dasd_device *device) in dasd_increase_state() argument
470 if (device->state == DASD_STATE_NEW && in dasd_increase_state()
471 device->target >= DASD_STATE_KNOWN) in dasd_increase_state()
472 rc = dasd_state_new_to_known(device); in dasd_increase_state()
475 device->state == DASD_STATE_KNOWN && in dasd_increase_state()
476 device->target >= DASD_STATE_BASIC) in dasd_increase_state()
477 rc = dasd_state_known_to_basic(device); in dasd_increase_state()
480 device->state == DASD_STATE_BASIC && in dasd_increase_state()
481 device->target >= DASD_STATE_READY) in dasd_increase_state()
482 rc = dasd_state_basic_to_ready(device); in dasd_increase_state()
485 device->state == DASD_STATE_UNFMT && in dasd_increase_state()
486 device->target > DASD_STATE_UNFMT) in dasd_increase_state()
490 device->state == DASD_STATE_READY && in dasd_increase_state()
491 device->target >= DASD_STATE_ONLINE) in dasd_increase_state()
492 rc = dasd_state_ready_to_online(device); in dasd_increase_state()
498 * Device shutdown state changes.
500 static int dasd_decrease_state(struct dasd_device *device) in dasd_decrease_state() argument
505 if (device->state == DASD_STATE_ONLINE && in dasd_decrease_state()
506 device->target <= DASD_STATE_READY) in dasd_decrease_state()
507 rc = dasd_state_online_to_ready(device); in dasd_decrease_state()
510 device->state == DASD_STATE_READY && in dasd_decrease_state()
511 device->target <= DASD_STATE_BASIC) in dasd_decrease_state()
512 rc = dasd_state_ready_to_basic(device); in dasd_decrease_state()
515 device->state == DASD_STATE_UNFMT && in dasd_decrease_state()
516 device->target <= DASD_STATE_BASIC) in dasd_decrease_state()
517 rc = dasd_state_unfmt_to_basic(device); in dasd_decrease_state()
520 device->state == DASD_STATE_BASIC && in dasd_decrease_state()
521 device->target <= DASD_STATE_KNOWN) in dasd_decrease_state()
522 rc = dasd_state_basic_to_known(device); in dasd_decrease_state()
525 device->state == DASD_STATE_KNOWN && in dasd_decrease_state()
526 device->target <= DASD_STATE_NEW) in dasd_decrease_state()
527 rc = dasd_state_known_to_new(device); in dasd_decrease_state()
535 static void dasd_change_state(struct dasd_device *device) in dasd_change_state() argument
539 if (device->state == device->target) in dasd_change_state()
542 if (device->state < device->target) in dasd_change_state()
543 rc = dasd_increase_state(device); in dasd_change_state()
545 rc = dasd_decrease_state(device); in dasd_change_state()
549 device->target = device->state; in dasd_change_state()
551 /* let user-space know that the device status changed */ in dasd_change_state()
552 kobject_uevent(&device->cdev->dev.kobj, KOBJ_CHANGE); in dasd_change_state()
554 if (device->state == device->target) in dasd_change_state()
566 struct dasd_device *device = container_of(work, struct dasd_device, kick_work); in do_kick_device() local
567 mutex_lock(&device->state_mutex); in do_kick_device()
568 dasd_change_state(device); in do_kick_device()
569 mutex_unlock(&device->state_mutex); in do_kick_device()
570 dasd_schedule_device_bh(device); in do_kick_device()
571 dasd_put_device(device); in do_kick_device()
574 void dasd_kick_device(struct dasd_device *device) in dasd_kick_device() argument
576 dasd_get_device(device); in dasd_kick_device()
578 if (!schedule_work(&device->kick_work)) in dasd_kick_device()
579 dasd_put_device(device); in dasd_kick_device()
589 struct dasd_device *device = container_of(work, struct dasd_device, in do_reload_device() local
591 device->discipline->reload(device); in do_reload_device()
592 dasd_put_device(device); in do_reload_device()
595 void dasd_reload_device(struct dasd_device *device) in dasd_reload_device() argument
597 dasd_get_device(device); in dasd_reload_device()
599 if (!schedule_work(&device->reload_device)) in dasd_reload_device()
600 dasd_put_device(device); in dasd_reload_device()
605 * Set the target state for a device and starts the state change.
607 void dasd_set_target_state(struct dasd_device *device, int target) in dasd_set_target_state() argument
609 dasd_get_device(device); in dasd_set_target_state()
610 mutex_lock(&device->state_mutex); in dasd_set_target_state()
614 if (device->target != target) { in dasd_set_target_state()
615 if (device->state == target) in dasd_set_target_state()
617 device->target = target; in dasd_set_target_state()
619 if (device->state != device->target) in dasd_set_target_state()
620 dasd_change_state(device); in dasd_set_target_state()
621 mutex_unlock(&device->state_mutex); in dasd_set_target_state()
622 dasd_put_device(device); in dasd_set_target_state()
626 * Enable devices with device numbers in [from..to].
628 static inline int _wait_for_device(struct dasd_device *device) in _wait_for_device() argument
630 return (device->state == device->target); in _wait_for_device()
633 void dasd_enable_device(struct dasd_device *device) in dasd_enable_device() argument
635 dasd_set_target_state(device, DASD_STATE_ONLINE); in dasd_enable_device()
636 if (device->state <= DASD_STATE_KNOWN) in dasd_enable_device()
637 /* No discipline for device found. */ in dasd_enable_device()
638 dasd_set_target_state(device, DASD_STATE_NEW); in dasd_enable_device()
640 wait_event(dasd_init_waitq, _wait_for_device(device)); in dasd_enable_device()
642 dasd_reload_device(device); in dasd_enable_device()
643 if (device->discipline->kick_validate) in dasd_enable_device()
644 device->discipline->kick_validate(device); in dasd_enable_device()
649 * SECTION: device operation (interrupt handler, start i/o, term i/o ...)
669 struct dasd_device *device; in dasd_profile_start() local
695 * We count the request for the start device, even though it may run on in dasd_profile_start()
696 * some other device due to error recovery. This way we make sure that in dasd_profile_start()
699 device = cqr->startdev; in dasd_profile_start()
700 if (device->profile.data) { in dasd_profile_start()
701 counter = 1; /* request is not yet queued on the start device */ in dasd_profile_start()
702 list_for_each(l, &device->ccw_queue) in dasd_profile_start()
706 spin_lock(&device->profile.lock); in dasd_profile_start()
707 if (device->profile.data) { in dasd_profile_start()
708 device->profile.data->dasd_io_nr_req[counter]++; in dasd_profile_start()
710 device->profile.data->dasd_read_nr_req[counter]++; in dasd_profile_start()
712 spin_unlock(&device->profile.lock); in dasd_profile_start()
779 struct dasd_device *device; in dasd_profile_end() local
784 device = cqr->startdev; in dasd_profile_end()
787 device->profile.data)) in dasd_profile_end()
846 spin_lock(&device->profile.lock); in dasd_profile_end()
847 if (device->profile.data) { in dasd_profile_end()
848 data = device->profile.data; in dasd_profile_end()
853 dasd_profile_end_add_data(device->profile.data, in dasd_profile_end()
862 spin_unlock(&device->profile.lock); in dasd_profile_end()
1154 struct dasd_device *device; in dasd_hosts_show() local
1157 device = m->private; in dasd_hosts_show()
1158 dasd_get_device(device); in dasd_hosts_show()
1160 if (device->discipline->hosts_print) in dasd_hosts_show()
1161 rc = device->discipline->hosts_print(device, m); in dasd_hosts_show()
1163 dasd_put_device(device); in dasd_hosts_show()
1169 static void dasd_hosts_exit(struct dasd_device *device) in dasd_hosts_exit() argument
1171 debugfs_remove(device->hosts_dentry); in dasd_hosts_exit()
1172 device->hosts_dentry = NULL; in dasd_hosts_exit()
1176 struct dasd_device *device) in dasd_hosts_init() argument
1186 device, &dasd_hosts_fops); in dasd_hosts_init()
1188 device->hosts_dentry = pde; in dasd_hosts_init()
1192 struct dasd_device *device, in dasd_smalloc_request() argument
1206 spin_lock_irqsave(&device->mem_lock, flags); in dasd_smalloc_request()
1207 data = chunk = dasd_alloc_chunk(&device->ccw_chunks, size); in dasd_smalloc_request()
1208 spin_unlock_irqrestore(&device->mem_lock, flags); in dasd_smalloc_request()
1228 dasd_get_device(device); in dasd_smalloc_request()
1235 struct dasd_device *device) in dasd_fmalloc_request() argument
1249 spin_lock_irqsave(&device->mem_lock, flags); in dasd_fmalloc_request()
1250 cqr = dasd_alloc_chunk(&device->ese_chunks, size); in dasd_fmalloc_request()
1251 spin_unlock_irqrestore(&device->mem_lock, flags); in dasd_fmalloc_request()
1270 dasd_get_device(device); in dasd_fmalloc_request()
1276 void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_sfree_request() argument
1280 spin_lock_irqsave(&device->mem_lock, flags); in dasd_sfree_request()
1281 dasd_free_chunk(&device->ccw_chunks, cqr->mem_chunk); in dasd_sfree_request()
1282 spin_unlock_irqrestore(&device->mem_lock, flags); in dasd_sfree_request()
1283 dasd_put_device(device); in dasd_sfree_request()
1287 void dasd_ffree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_ffree_request() argument
1291 spin_lock_irqsave(&device->mem_lock, flags); in dasd_ffree_request()
1292 dasd_free_chunk(&device->ese_chunks, cqr); in dasd_ffree_request()
1293 spin_unlock_irqrestore(&device->mem_lock, flags); in dasd_ffree_request()
1294 dasd_put_device(device); in dasd_ffree_request()
1303 struct dasd_device *device; in dasd_check_cqr() local
1307 device = cqr->startdev; in dasd_check_cqr()
1308 if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) { in dasd_check_cqr()
1309 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_check_cqr()
1313 *(unsigned int *) device->discipline->name); in dasd_check_cqr()
1321 * Timer keeps device runnig.
1327 struct dasd_device *device; in dasd_term_IO() local
1336 device = (struct dasd_device *) cqr->startdev; in dasd_term_IO()
1338 rc = ccw_device_clear(device->cdev, (long) cqr); in dasd_term_IO()
1344 DBF_DEV_EVENT(DBF_DEBUG, device, in dasd_term_IO()
1349 DBF_DEV_EVENT(DBF_ERR, device, "%s", in dasd_term_IO()
1350 "device gone, retry"); in dasd_term_IO()
1354 * device not valid so no I/O could be running in dasd_term_IO()
1362 DBF_DEV_EVENT(DBF_ERR, device, "%s", in dasd_term_IO()
1370 dev_err(&device->cdev->dev, "An error occurred in the " in dasd_term_IO()
1371 "DASD device driver, reason=%s\n", errorstring); in dasd_term_IO()
1377 dasd_schedule_device_bh(device); in dasd_term_IO()
1388 struct dasd_device *device; in dasd_start_IO() local
1398 device = (struct dasd_device *) cqr->startdev; in dasd_start_IO()
1401 test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags)) && in dasd_start_IO()
1403 DBF_DEV_EVENT(DBF_DEBUG, device, "start_IO: return request %p " in dasd_start_IO()
1412 dev_err(&device->cdev->dev, "An error occurred in the DASD " in dasd_start_IO()
1413 "device driver, reason=%s\n", errorstring); in dasd_start_IO()
1421 cqr->lpm &= dasd_path_get_opm(device); in dasd_start_IO()
1423 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1426 rc = ccw_device_tm_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1429 rc = ccw_device_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1437 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1438 "start_IO: device busy, retry later"); in dasd_start_IO()
1449 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_start_IO()
1452 } else if (cqr->lpm != dasd_path_get_opm(device)) { in dasd_start_IO()
1453 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1454 DBF_DEV_EVENT(DBF_DEBUG, device, "%s", in dasd_start_IO()
1458 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1461 dasd_generic_last_path_gone(device); in dasd_start_IO()
1462 dasd_path_no_path(device); in dasd_start_IO()
1463 dasd_path_set_tbvpm(device, in dasd_start_IO()
1465 device->cdev)); in dasd_start_IO()
1469 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1470 "start_IO: -ENODEV device gone, retry"); in dasd_start_IO()
1473 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1474 "start_IO: -EIO device gone, retry"); in dasd_start_IO()
1477 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1478 "start_IO: -EINVAL device currently " in dasd_start_IO()
1484 dev_err(&device->cdev->dev, in dasd_start_IO()
1485 "An error occurred in the DASD device driver, " in dasd_start_IO()
1506 struct dasd_device *device; in dasd_device_timeout() local
1508 device = from_timer(device, t, timer); in dasd_device_timeout()
1509 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_device_timeout()
1511 dasd_device_remove_stop_bits(device, DASD_STOPPED_PENDING); in dasd_device_timeout()
1512 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_device_timeout()
1513 dasd_schedule_device_bh(device); in dasd_device_timeout()
1517 * Setup timeout for a device in jiffies.
1519 void dasd_device_set_timer(struct dasd_device *device, int expires) in dasd_device_set_timer() argument
1522 del_timer(&device->timer); in dasd_device_set_timer()
1524 mod_timer(&device->timer, jiffies + expires); in dasd_device_set_timer()
1529 * Clear timeout for a device.
1531 void dasd_device_clear_timer(struct dasd_device *device) in dasd_device_clear_timer() argument
1533 del_timer(&device->timer); in dasd_device_clear_timer()
1541 struct dasd_device *device; in dasd_handle_killed_request() local
1553 device = dasd_device_from_cdev_locked(cdev); in dasd_handle_killed_request()
1554 if (IS_ERR(device)) { in dasd_handle_killed_request()
1556 "unable to get device from cdev"); in dasd_handle_killed_request()
1561 device != cqr->startdev || in dasd_handle_killed_request()
1565 "invalid device in request"); in dasd_handle_killed_request()
1566 dasd_put_device(device); in dasd_handle_killed_request()
1573 dasd_device_clear_timer(device); in dasd_handle_killed_request()
1574 dasd_schedule_device_bh(device); in dasd_handle_killed_request()
1575 dasd_put_device(device); in dasd_handle_killed_request()
1578 void dasd_generic_handle_state_change(struct dasd_device *device) in dasd_generic_handle_state_change() argument
1581 dasd_eer_snss(device); in dasd_generic_handle_state_change()
1583 dasd_device_remove_stop_bits(device, DASD_STOPPED_PENDING); in dasd_generic_handle_state_change()
1584 dasd_schedule_device_bh(device); in dasd_generic_handle_state_change()
1585 if (device->block) { in dasd_generic_handle_state_change()
1586 dasd_schedule_block_bh(device->block); in dasd_generic_handle_state_change()
1587 if (device->block->request_queue) in dasd_generic_handle_state_change()
1588 blk_mq_run_hw_queues(device->block->request_queue, in dasd_generic_handle_state_change()
1603 struct dasd_device *device = NULL; in dasd_ese_needs_format() local
1608 device = block->base; in dasd_ese_needs_format()
1609 if (!device || !device->discipline->is_ese) in dasd_ese_needs_format()
1611 if (!device->discipline->is_ese(device)) in dasd_ese_needs_format()
1638 struct dasd_device *device; in dasd_int_handler() local
1650 device = cqr->startdev; in dasd_int_handler()
1652 dasd_device_clear_timer(device); in dasd_int_handler()
1654 dasd_schedule_device_bh(device); in dasd_int_handler()
1678 device = dasd_device_from_cdev_locked(cdev); in dasd_int_handler()
1679 if (IS_ERR(device)) in dasd_int_handler()
1682 if (device->discipline == dasd_diag_discipline_pointer) { in dasd_int_handler()
1683 dasd_put_device(device); in dasd_int_handler()
1702 * Stop device and check exhaust level. in dasd_int_handler()
1705 dasd_generic_space_exhaust(device, cqr); in dasd_int_handler()
1706 device->discipline->ext_pool_exhaust(device, cqr); in dasd_int_handler()
1707 dasd_put_device(device); in dasd_int_handler()
1712 device->discipline->dump_sense_dbf(device, irb, "int"); in dasd_int_handler()
1714 if (device->features & DASD_FEATURE_ERPLOG) in dasd_int_handler()
1715 device->discipline->dump_sense(device, cqr, irb); in dasd_int_handler()
1716 device->discipline->check_for_device_change(device, cqr, irb); in dasd_int_handler()
1717 dasd_put_device(device); in dasd_int_handler()
1722 device = dasd_device_from_cdev_locked(cdev); in dasd_int_handler()
1723 if (!IS_ERR(device)) { in dasd_int_handler()
1724 device->discipline->check_attention(device, in dasd_int_handler()
1726 dasd_put_device(device); in dasd_int_handler()
1733 device = (struct dasd_device *) cqr->startdev; in dasd_int_handler()
1734 if (!device || in dasd_int_handler()
1735 strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { in dasd_int_handler()
1737 "invalid device in request"); in dasd_int_handler()
1743 device->discipline->ese_read(cqr, irb); in dasd_int_handler()
1746 dasd_device_clear_timer(device); in dasd_int_handler()
1747 dasd_schedule_device_bh(device); in dasd_int_handler()
1750 fcqr = device->discipline->ese_format(device, cqr, irb); in dasd_int_handler()
1761 dasd_schedule_device_bh(device); in dasd_int_handler()
1766 list_add(&fcqr->devlist, &device->ccw_queue); in dasd_int_handler()
1767 dasd_schedule_device_bh(device); in dasd_int_handler()
1776 dasd_device_clear_timer(device); in dasd_int_handler()
1778 dasd_schedule_device_bh(device); in dasd_int_handler()
1784 DBF_DEV_EVENT(DBF_DEBUG, device, "invalid status: bus_id %s, " in dasd_int_handler()
1797 if (cqr->devlist.next != &device->ccw_queue) { in dasd_int_handler()
1807 device->discipline->handle_hpf_error) in dasd_int_handler()
1808 device->discipline->handle_hpf_error(device, irb); in dasd_int_handler()
1815 if (cqr->lpm == dasd_path_get_opm(device)) in dasd_int_handler()
1816 DBF_DEV_EVENT(DBF_DEBUG, device, in dasd_int_handler()
1821 cqr->lpm = dasd_path_get_opm(device); in dasd_int_handler()
1828 (!device->stopped)) { in dasd_int_handler()
1829 if (device->discipline->start_IO(next) == 0) in dasd_int_handler()
1833 dasd_device_set_timer(device, expires); in dasd_int_handler()
1835 dasd_device_clear_timer(device); in dasd_int_handler()
1836 dasd_schedule_device_bh(device); in dasd_int_handler()
1842 struct dasd_device *device; in dasd_generic_uc_handler() local
1844 device = dasd_device_from_cdev_locked(cdev); in dasd_generic_uc_handler()
1846 if (IS_ERR(device)) in dasd_generic_uc_handler()
1848 if (test_bit(DASD_FLAG_OFFLINE, &device->flags) || in dasd_generic_uc_handler()
1849 device->state != device->target || in dasd_generic_uc_handler()
1850 !device->discipline->check_for_device_change){ in dasd_generic_uc_handler()
1851 dasd_put_device(device); in dasd_generic_uc_handler()
1854 if (device->discipline->dump_sense_dbf) in dasd_generic_uc_handler()
1855 device->discipline->dump_sense_dbf(device, irb, "uc"); in dasd_generic_uc_handler()
1856 device->discipline->check_for_device_change(device, NULL, irb); in dasd_generic_uc_handler()
1857 dasd_put_device(device); in dasd_generic_uc_handler()
1867 static void __dasd_device_recovery(struct dasd_device *device, in __dasd_device_recovery() argument
1879 list_for_each_safe(l, n, &device->ccw_queue) { in __dasd_device_recovery()
1892 static void __dasd_device_process_ccw_queue(struct dasd_device *device, in __dasd_device_process_ccw_queue() argument
1899 list_for_each_safe(l, n, &device->ccw_queue) { in __dasd_device_process_ccw_queue()
1908 __dasd_device_recovery(device, cqr); in __dasd_device_process_ccw_queue()
1915 static void __dasd_process_cqr(struct dasd_device *device, in __dasd_process_cqr() argument
1933 dev_err(&device->cdev->dev, in __dasd_process_cqr()
1934 "An error occurred in the DASD device driver, " in __dasd_process_cqr()
1946 static void __dasd_device_process_final_queue(struct dasd_device *device, in __dasd_device_process_final_queue() argument
1958 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
1961 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
1971 static void __dasd_device_check_expire(struct dasd_device *device) in __dasd_device_check_expire() argument
1975 if (list_empty(&device->ccw_queue)) in __dasd_device_check_expire()
1977 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_check_expire()
1980 if (test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in __dasd_device_check_expire()
1987 if (device->discipline->term_IO(cqr) != 0) { in __dasd_device_check_expire()
1989 dev_err(&device->cdev->dev, in __dasd_device_check_expire()
1994 dasd_device_set_timer(device, 5*HZ); in __dasd_device_check_expire()
1996 dev_err(&device->cdev->dev, in __dasd_device_check_expire()
2005 * return 1 when device is not eligible for IO
2007 static int __dasd_device_is_unusable(struct dasd_device *device, in __dasd_device_is_unusable() argument
2012 if (test_bit(DASD_FLAG_OFFLINE, &device->flags) && in __dasd_device_is_unusable()
2013 !test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in __dasd_device_is_unusable()
2020 if (device->stopped) { in __dasd_device_is_unusable()
2021 if (device->stopped & mask) { in __dasd_device_is_unusable()
2026 /* CQR is not able to change device to in __dasd_device_is_unusable()
2030 /* CQR required to get device operational. */ in __dasd_device_is_unusable()
2039 static void __dasd_device_start_head(struct dasd_device *device) in __dasd_device_start_head() argument
2044 if (list_empty(&device->ccw_queue)) in __dasd_device_start_head()
2046 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_start_head()
2049 /* if device is not usable return request to upper layer */ in __dasd_device_start_head()
2050 if (__dasd_device_is_unusable(device, cqr)) { in __dasd_device_start_head()
2053 dasd_schedule_device_bh(device); in __dasd_device_start_head()
2057 rc = device->discipline->start_IO(cqr); in __dasd_device_start_head()
2059 dasd_device_set_timer(device, cqr->expires); in __dasd_device_start_head()
2061 dasd_schedule_device_bh(device); in __dasd_device_start_head()
2064 dasd_device_set_timer(device, 50); in __dasd_device_start_head()
2067 static void __dasd_device_check_path_events(struct dasd_device *device) in __dasd_device_check_path_events() argument
2072 tbvpm = dasd_path_get_tbvpm(device); in __dasd_device_check_path_events()
2073 fcsecpm = dasd_path_get_fcsecpm(device); in __dasd_device_check_path_events()
2078 if (device->stopped & ~(DASD_STOPPED_DC_WAIT)) in __dasd_device_check_path_events()
2080 rc = device->discipline->pe_handler(device, tbvpm, fcsecpm); in __dasd_device_check_path_events()
2082 dasd_device_set_timer(device, 50); in __dasd_device_check_path_events()
2084 dasd_path_clear_all_verify(device); in __dasd_device_check_path_events()
2085 dasd_path_clear_all_fcsec(device); in __dasd_device_check_path_events()
2095 * this function is called!. In other words, when 'device' is a base
2096 * device then all block layer requests must have been removed before
2099 int dasd_flush_device_queue(struct dasd_device *device) in dasd_flush_device_queue() argument
2106 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_flush_device_queue()
2108 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_flush_device_queue()
2112 rc = device->discipline->term_IO(cqr); in dasd_flush_device_queue()
2115 dev_err(&device->cdev->dev, in dasd_flush_device_queue()
2132 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_flush_device_queue()
2145 __dasd_device_process_final_queue(device, &flush_queue); in dasd_flush_device_queue()
2151 * Acquire the device lock and process queues for the device.
2155 struct dasd_device *device = (struct dasd_device *) data; in dasd_device_tasklet() local
2158 atomic_set (&device->tasklet_scheduled, 0); in dasd_device_tasklet()
2160 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_device_tasklet()
2162 __dasd_device_check_expire(device); in dasd_device_tasklet()
2164 __dasd_device_process_ccw_queue(device, &final_queue); in dasd_device_tasklet()
2165 __dasd_device_check_path_events(device); in dasd_device_tasklet()
2166 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_device_tasklet()
2168 __dasd_device_process_final_queue(device, &final_queue); in dasd_device_tasklet()
2169 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_device_tasklet()
2171 __dasd_device_start_head(device); in dasd_device_tasklet()
2172 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_device_tasklet()
2175 dasd_put_device(device); in dasd_device_tasklet()
2179 * Schedules a call to dasd_tasklet over the device tasklet.
2181 void dasd_schedule_device_bh(struct dasd_device *device) in dasd_schedule_device_bh() argument
2184 if (atomic_cmpxchg (&device->tasklet_scheduled, 0, 1) != 0) in dasd_schedule_device_bh()
2186 dasd_get_device(device); in dasd_schedule_device_bh()
2187 tasklet_hi_schedule(&device->tasklet); in dasd_schedule_device_bh()
2191 void dasd_device_set_stop_bits(struct dasd_device *device, int bits) in dasd_device_set_stop_bits() argument
2193 device->stopped |= bits; in dasd_device_set_stop_bits()
2197 void dasd_device_remove_stop_bits(struct dasd_device *device, int bits) in dasd_device_remove_stop_bits() argument
2199 device->stopped &= ~bits; in dasd_device_remove_stop_bits()
2200 if (!device->stopped) in dasd_device_remove_stop_bits()
2206 * Queue a request to the head of the device ccw_queue.
2211 struct dasd_device *device; in dasd_add_request_head() local
2214 device = cqr->startdev; in dasd_add_request_head()
2215 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_add_request_head()
2217 list_add(&cqr->devlist, &device->ccw_queue); in dasd_add_request_head()
2219 dasd_schedule_device_bh(device); in dasd_add_request_head()
2220 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_add_request_head()
2225 * Queue a request to the tail of the device ccw_queue.
2230 struct dasd_device *device; in dasd_add_request_tail() local
2233 device = cqr->startdev; in dasd_add_request_tail()
2234 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_add_request_tail()
2236 list_add_tail(&cqr->devlist, &device->ccw_queue); in dasd_add_request_tail()
2238 dasd_schedule_device_bh(device); in dasd_add_request_tail()
2239 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_add_request_tail()
2257 struct dasd_device *device; in _wait_for_wakeup() local
2260 device = cqr->startdev; in _wait_for_wakeup()
2261 spin_lock_irq(get_ccwdev_lock(device->cdev)); in _wait_for_wakeup()
2263 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in _wait_for_wakeup()
2272 struct dasd_device *device; in __dasd_sleep_on_erp() local
2277 device = cqr->startdev; in __dasd_sleep_on_erp()
2280 device->discipline->handle_terminated_request(cqr); in __dasd_sleep_on_erp()
2284 erp_fn = device->discipline->erp_action(cqr); in __dasd_sleep_on_erp()
2291 __dasd_process_erp(device, cqr); in __dasd_sleep_on_erp()
2311 struct dasd_device *device; in _dasd_sleep_on() local
2318 device = maincqr->startdev; in _dasd_sleep_on()
2328 if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags) && in _dasd_sleep_on()
2335 if (device->stopped & ~DASD_STOPPED_PENDING && in _dasd_sleep_on()
2337 (!dasd_eer_enabled(device))) { in _dasd_sleep_on()
2343 * Don't try to start requests if device is in in _dasd_sleep_on()
2346 if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) { in _dasd_sleep_on()
2352 * Don't try to start requests if device is stopped in _dasd_sleep_on()
2358 generic_waitq, !(device->stopped)); in _dasd_sleep_on()
2365 wait_event(generic_waitq, !(device->stopped)); in _dasd_sleep_on()
2415 struct dasd_device *device; in _dasd_sleep_on_queue() local
2422 device = cqr->startdev; in _dasd_sleep_on_queue()
2426 if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags) && in _dasd_sleep_on_queue()
2433 if (device->stopped & ~DASD_STOPPED_PENDING && in _dasd_sleep_on_queue()
2435 !dasd_eer_enabled(device)) { in _dasd_sleep_on_queue()
2441 /*Don't try to start requests if device is stopped*/ in _dasd_sleep_on_queue()
2444 generic_waitq, !device->stopped); in _dasd_sleep_on_queue()
2451 wait_event(generic_waitq, !(device->stopped)); in _dasd_sleep_on_queue()
2497 * Queue a request to the tail of the device ccw_queue and wait for
2525 * Queue a request to the tail of the device ccw_queue and wait
2540 static inline int _dasd_term_running_cqr(struct dasd_device *device) in _dasd_term_running_cqr() argument
2545 if (list_empty(&device->ccw_queue)) in _dasd_term_running_cqr()
2547 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in _dasd_term_running_cqr()
2548 rc = device->discipline->term_IO(cqr); in _dasd_term_running_cqr()
2561 struct dasd_device *device; in dasd_sleep_on_immediatly() local
2564 device = cqr->startdev; in dasd_sleep_on_immediatly()
2565 if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags) && in dasd_sleep_on_immediatly()
2571 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_sleep_on_immediatly()
2572 rc = _dasd_term_running_cqr(device); in dasd_sleep_on_immediatly()
2574 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_sleep_on_immediatly()
2584 list_add(&cqr->devlist, device->ccw_queue.next); in dasd_sleep_on_immediatly()
2587 dasd_schedule_device_bh(device); in dasd_sleep_on_immediatly()
2589 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_sleep_on_immediatly()
2601 dasd_schedule_device_bh(device); in dasd_sleep_on_immediatly()
2602 if (device->block) in dasd_sleep_on_immediatly()
2603 dasd_schedule_block_bh(device->block); in dasd_sleep_on_immediatly()
2620 struct dasd_device *device = cqr->startdev; in __dasd_cancel_req() local
2630 rc = device->discipline->term_IO(cqr); in __dasd_cancel_req()
2632 dev_err(&device->cdev->dev, in __dasd_cancel_req()
2642 dasd_schedule_device_bh(device); in __dasd_cancel_req()
2648 struct dasd_device *device = cqr->startdev; in dasd_cancel_req() local
2652 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_cancel_req()
2654 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_cancel_req()
2705 static void __dasd_process_erp(struct dasd_device *device, in __dasd_process_erp() argument
2711 DBF_DEV_EVENT(DBF_NOTICE, device, "%s", "ERP successful"); in __dasd_process_erp()
2713 dev_err(&device->cdev->dev, "ERP failed for the DASD\n"); in __dasd_process_erp()
2714 erp_fn = device->discipline->erp_postaction(cqr); in __dasd_process_erp()
2875 /* Don't try to start requests if device is stopped */ in __dasd_block_start_head()
3019 * Schedules a call to dasd_tasklet over the device tasklet.
3026 /* life cycle of block is bound to it's base device */ in dasd_schedule_block_bh()
3034 * SECTION: external block device operations
3056 "device not ready for request %p", req); in do_dasd_request()
3062 * if device is stopped do not fetch new requests in do_dasd_request()
3068 "device stopped request %p", req); in do_dasd_request()
3136 struct dasd_device *device; in dasd_times_out() local
3146 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
3147 if (!device->blk_timeout) { in dasd_times_out()
3151 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_times_out()
3156 spin_lock(get_ccwdev_lock(device->cdev)); in dasd_times_out()
3193 spin_unlock(get_ccwdev_lock(device->cdev)); in dasd_times_out()
3304 " Cannot open unrecognized device"); in dasd_open()
3371 * end of block device operations
3397 * Is the device read-only?
3399 * readonly device attribute, but how it is configured in z/VM.
3401 int dasd_device_is_ro(struct dasd_device *device) in dasd_device_is_ro() argument
3409 ccw_device_get_id(device->cdev, &dev_id); in dasd_device_is_ro()
3455 void dasd_generic_free_discipline(struct dasd_device *device) in dasd_generic_free_discipline() argument
3458 if (device->discipline) { in dasd_generic_free_discipline()
3459 if (device->discipline->uncheck_device) in dasd_generic_free_discipline()
3460 device->discipline->uncheck_device(device); in dasd_generic_free_discipline()
3461 module_put(device->discipline->owner); in dasd_generic_free_discipline()
3462 device->discipline = NULL; in dasd_generic_free_discipline()
3464 if (device->base_discipline) { in dasd_generic_free_discipline()
3465 module_put(device->base_discipline->owner); in dasd_generic_free_discipline()
3466 device->base_discipline = NULL; in dasd_generic_free_discipline()
3477 struct dasd_device *device; in dasd_generic_remove() local
3480 device = dasd_device_from_cdev(cdev); in dasd_generic_remove()
3481 if (IS_ERR(device)) in dasd_generic_remove()
3484 if (test_and_set_bit(DASD_FLAG_OFFLINE, &device->flags) && in dasd_generic_remove()
3485 !test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in dasd_generic_remove()
3487 dasd_put_device(device); in dasd_generic_remove()
3491 * This device is removed unconditionally. Set offline in dasd_generic_remove()
3495 dasd_set_target_state(device, DASD_STATE_NEW); in dasd_generic_remove()
3497 /* dasd_delete_device destroys the device reference. */ in dasd_generic_remove()
3498 block = device->block; in dasd_generic_remove()
3499 dasd_delete_device(device); in dasd_generic_remove()
3501 * life cycle of block is bound to device, so delete it after in dasd_generic_remove()
3502 * device was safely removed in dasd_generic_remove()
3510 * Activate a device. This is called from dasd_{eckd,fba}_probe() when either
3511 * the device is detected for the first time and is supposed to be used
3518 struct dasd_device *device; in dasd_generic_set_online() local
3523 device = dasd_create_device(cdev); in dasd_generic_set_online()
3524 if (IS_ERR(device)) in dasd_generic_set_online()
3525 return PTR_ERR(device); in dasd_generic_set_online()
3528 if (device->features & DASD_FEATURE_USEDIAG) { in dasd_generic_set_online()
3538 dasd_delete_device(device); in dasd_generic_set_online()
3547 dasd_delete_device(device); in dasd_generic_set_online()
3553 dasd_delete_device(device); in dasd_generic_set_online()
3558 dasd_delete_device(device); in dasd_generic_set_online()
3561 device->base_discipline = base_discipline; in dasd_generic_set_online()
3562 device->discipline = discipline; in dasd_generic_set_online()
3564 /* check_device will allocate block device if necessary */ in dasd_generic_set_online()
3565 rc = discipline->check_device(device); in dasd_generic_set_online()
3571 dasd_delete_device(device); in dasd_generic_set_online()
3575 dasd_set_target_state(device, DASD_STATE_ONLINE); in dasd_generic_set_online()
3576 if (device->state <= DASD_STATE_KNOWN) { in dasd_generic_set_online()
3580 dasd_set_target_state(device, DASD_STATE_NEW); in dasd_generic_set_online()
3581 if (device->block) in dasd_generic_set_online()
3582 dasd_free_block(device->block); in dasd_generic_set_online()
3583 dasd_delete_device(device); in dasd_generic_set_online()
3585 pr_debug("dasd_generic device %s found\n", in dasd_generic_set_online()
3588 wait_event(dasd_init_waitq, _wait_for_device(device)); in dasd_generic_set_online()
3590 dasd_put_device(device); in dasd_generic_set_online()
3597 struct dasd_device *device; in dasd_generic_set_offline() local
3604 device = dasd_device_from_cdev_locked(cdev); in dasd_generic_set_offline()
3605 if (IS_ERR(device)) { in dasd_generic_set_offline()
3607 return PTR_ERR(device); in dasd_generic_set_offline()
3611 * We must make sure that this device is currently not in use. in dasd_generic_set_offline()
3616 if (device->block) { in dasd_generic_set_offline()
3617 max_count = device->block->bdev ? 0 : -1; in dasd_generic_set_offline()
3618 open_count = atomic_read(&device->block->open_count); in dasd_generic_set_offline()
3637 if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) { in dasd_generic_set_offline()
3638 if (test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in dasd_generic_set_offline()
3640 &device->flags); in dasd_generic_set_offline()
3646 set_bit(DASD_FLAG_OFFLINE, &device->flags); in dasd_generic_set_offline()
3653 if (test_and_clear_bit(DASD_FLAG_SAFE_OFFLINE, &device->flags) && in dasd_generic_set_offline()
3654 !test_and_set_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in dasd_generic_set_offline()
3658 * If we want to set the device safe offline all IO operations in dasd_generic_set_offline()
3663 if (device->block) { in dasd_generic_set_offline()
3664 rc = fsync_bdev(device->block->bdev); in dasd_generic_set_offline()
3668 dasd_schedule_device_bh(device); in dasd_generic_set_offline()
3670 _wait_for_empty_queues(device)); in dasd_generic_set_offline()
3682 if (!test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in dasd_generic_set_offline()
3686 clear_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags); in dasd_generic_set_offline()
3690 dasd_set_target_state(device, DASD_STATE_NEW); in dasd_generic_set_offline()
3691 /* dasd_delete_device destroys the device reference. */ in dasd_generic_set_offline()
3692 block = device->block; in dasd_generic_set_offline()
3693 dasd_delete_device(device); in dasd_generic_set_offline()
3695 * life cycle of block is bound to device, so delete it after in dasd_generic_set_offline()
3696 * device was safely removed in dasd_generic_set_offline()
3706 clear_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags); in dasd_generic_set_offline()
3707 clear_bit(DASD_FLAG_OFFLINE, &device->flags); in dasd_generic_set_offline()
3709 dasd_put_device(device); in dasd_generic_set_offline()
3715 int dasd_generic_last_path_gone(struct dasd_device *device) in dasd_generic_last_path_gone() argument
3719 dev_warn(&device->cdev->dev, "No operational channel path is left " in dasd_generic_last_path_gone()
3720 "for the device\n"); in dasd_generic_last_path_gone()
3721 DBF_DEV_EVENT(DBF_WARNING, device, "%s", "last path gone"); in dasd_generic_last_path_gone()
3723 dasd_eer_write(device, NULL, DASD_EER_NOPATH); in dasd_generic_last_path_gone()
3725 if (device->state < DASD_STATE_BASIC) in dasd_generic_last_path_gone()
3727 /* Device is active. We want to keep it. */ in dasd_generic_last_path_gone()
3728 list_for_each_entry(cqr, &device->ccw_queue, devlist) in dasd_generic_last_path_gone()
3734 dasd_device_set_stop_bits(device, DASD_STOPPED_DC_WAIT); in dasd_generic_last_path_gone()
3735 dasd_device_clear_timer(device); in dasd_generic_last_path_gone()
3736 dasd_schedule_device_bh(device); in dasd_generic_last_path_gone()
3741 int dasd_generic_path_operational(struct dasd_device *device) in dasd_generic_path_operational() argument
3743 dev_info(&device->cdev->dev, "A channel path to the device has become " in dasd_generic_path_operational()
3745 DBF_DEV_EVENT(DBF_WARNING, device, "%s", "path operational"); in dasd_generic_path_operational()
3746 dasd_device_remove_stop_bits(device, DASD_STOPPED_DC_WAIT); in dasd_generic_path_operational()
3747 dasd_schedule_device_bh(device); in dasd_generic_path_operational()
3748 if (device->block) { in dasd_generic_path_operational()
3749 dasd_schedule_block_bh(device->block); in dasd_generic_path_operational()
3750 if (device->block->request_queue) in dasd_generic_path_operational()
3751 blk_mq_run_hw_queues(device->block->request_queue, in dasd_generic_path_operational()
3755 if (!device->stopped) in dasd_generic_path_operational()
3764 struct dasd_device *device; in dasd_generic_notify() local
3767 device = dasd_device_from_cdev_locked(cdev); in dasd_generic_notify()
3768 if (IS_ERR(device)) in dasd_generic_notify()
3775 dasd_path_no_path(device); in dasd_generic_notify()
3776 ret = dasd_generic_last_path_gone(device); in dasd_generic_notify()
3780 if (dasd_path_get_opm(device)) in dasd_generic_notify()
3781 ret = dasd_generic_path_operational(device); in dasd_generic_notify()
3784 dasd_put_device(device); in dasd_generic_notify()
3791 struct dasd_device *device; in dasd_generic_path_event() local
3794 device = dasd_device_from_cdev_locked(cdev); in dasd_generic_path_event()
3795 if (IS_ERR(device)) in dasd_generic_path_event()
3798 oldopm = dasd_path_get_opm(device); in dasd_generic_path_event()
3801 dasd_path_notoper(device, chp); in dasd_generic_path_event()
3804 dasd_path_available(device, chp); in dasd_generic_path_event()
3805 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3808 if (!dasd_path_is_operational(device, chp) && in dasd_generic_path_event()
3809 !dasd_path_need_verify(device, chp)) { in dasd_generic_path_event()
3815 dasd_path_available(device, chp); in dasd_generic_path_event()
3816 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3818 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_generic_path_event()
3820 if (device->discipline->kick_validate) in dasd_generic_path_event()
3821 device->discipline->kick_validate(device); in dasd_generic_path_event()
3824 dasd_path_fcsec_update(device, chp); in dasd_generic_path_event()
3825 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3828 hpfpm = dasd_path_get_hpfpm(device); in dasd_generic_path_event()
3829 ifccpm = dasd_path_get_ifccpm(device); in dasd_generic_path_event()
3830 if (!dasd_path_get_opm(device) && hpfpm) { in dasd_generic_path_event()
3832 * device has no operational paths but at least one path is in dasd_generic_path_event()
3836 if (device->discipline->disable_hpf) in dasd_generic_path_event()
3837 device->discipline->disable_hpf(device); in dasd_generic_path_event()
3838 dasd_device_set_stop_bits(device, DASD_STOPPED_NOT_ACC); in dasd_generic_path_event()
3839 dasd_path_set_tbvpm(device, hpfpm); in dasd_generic_path_event()
3840 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3841 dasd_schedule_requeue(device); in dasd_generic_path_event()
3842 } else if (!dasd_path_get_opm(device) && ifccpm) { in dasd_generic_path_event()
3844 * device has no operational paths but at least one path is in dasd_generic_path_event()
3848 dasd_path_set_tbvpm(device, ifccpm); in dasd_generic_path_event()
3849 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3851 if (oldopm && !dasd_path_get_opm(device) && !hpfpm && !ifccpm) { in dasd_generic_path_event()
3852 dev_warn(&device->cdev->dev, in dasd_generic_path_event()
3853 "No verified channel paths remain for the device\n"); in dasd_generic_path_event()
3854 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_generic_path_event()
3856 dasd_eer_write(device, NULL, DASD_EER_NOPATH); in dasd_generic_path_event()
3857 dasd_device_set_stop_bits(device, in dasd_generic_path_event()
3860 dasd_put_device(device); in dasd_generic_path_event()
3864 int dasd_generic_verify_path(struct dasd_device *device, __u8 lpm) in dasd_generic_verify_path() argument
3866 if (!dasd_path_get_opm(device) && lpm) { in dasd_generic_verify_path()
3867 dasd_path_set_opm(device, lpm); in dasd_generic_verify_path()
3868 dasd_generic_path_operational(device); in dasd_generic_verify_path()
3870 dasd_path_add_opm(device, lpm); in dasd_generic_verify_path()
3875 void dasd_generic_space_exhaust(struct dasd_device *device, in dasd_generic_space_exhaust() argument
3878 dasd_eer_write(device, NULL, DASD_EER_NOSPC); in dasd_generic_space_exhaust()
3880 if (device->state < DASD_STATE_BASIC) in dasd_generic_space_exhaust()
3888 dasd_device_set_stop_bits(device, DASD_STOPPED_NOSPC); in dasd_generic_space_exhaust()
3889 dasd_device_clear_timer(device); in dasd_generic_space_exhaust()
3890 dasd_schedule_device_bh(device); in dasd_generic_space_exhaust()
3894 void dasd_generic_space_avail(struct dasd_device *device) in dasd_generic_space_avail() argument
3896 dev_info(&device->cdev->dev, "Extent pool space is available\n"); in dasd_generic_space_avail()
3897 DBF_DEV_EVENT(DBF_WARNING, device, "%s", "space available"); in dasd_generic_space_avail()
3899 dasd_device_remove_stop_bits(device, DASD_STOPPED_NOSPC); in dasd_generic_space_avail()
3900 dasd_schedule_device_bh(device); in dasd_generic_space_avail()
3902 if (device->block) { in dasd_generic_space_avail()
3903 dasd_schedule_block_bh(device->block); in dasd_generic_space_avail()
3904 if (device->block->request_queue) in dasd_generic_space_avail()
3905 blk_mq_run_hw_queues(device->block->request_queue, true); in dasd_generic_space_avail()
3907 if (!device->stopped) in dasd_generic_space_avail()
3915 static int dasd_generic_requeue_all_requests(struct dasd_device *device) in dasd_generic_requeue_all_requests() argument
3923 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_generic_requeue_all_requests()
3925 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_generic_requeue_all_requests()
3928 rc = device->discipline->term_IO(cqr); in dasd_generic_requeue_all_requests()
3931 dev_err(&device->cdev->dev, in dasd_generic_requeue_all_requests()
3934 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_generic_requeue_all_requests()
3935 dasd_put_device(device); in dasd_generic_requeue_all_requests()
3941 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_generic_requeue_all_requests()
3949 * for block device requests in dasd_generic_requeue_all_requests()
3954 /* remove requests from device and block queue */ in dasd_generic_requeue_all_requests()
3978 * and go back to the device queue in dasd_generic_requeue_all_requests()
3982 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_generic_requeue_all_requests()
3983 list_splice_tail(&requeue_queue, &device->ccw_queue); in dasd_generic_requeue_all_requests()
3984 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_generic_requeue_all_requests()
3986 dasd_schedule_device_bh(device); in dasd_generic_requeue_all_requests()
3992 struct dasd_device *device = container_of(work, struct dasd_device, in do_requeue_requests() local
3994 dasd_generic_requeue_all_requests(device); in do_requeue_requests()
3995 dasd_device_remove_stop_bits(device, DASD_STOPPED_NOT_ACC); in do_requeue_requests()
3996 if (device->block) in do_requeue_requests()
3997 dasd_schedule_block_bh(device->block); in do_requeue_requests()
3998 dasd_put_device(device); in do_requeue_requests()
4001 void dasd_schedule_requeue(struct dasd_device *device) in dasd_schedule_requeue() argument
4003 dasd_get_device(device); in dasd_schedule_requeue()
4005 if (!schedule_work(&device->requeue_requests)) in dasd_schedule_requeue()
4006 dasd_put_device(device); in dasd_schedule_requeue()
4010 static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device, in dasd_generic_build_rdc() argument
4017 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device, in dasd_generic_build_rdc()
4022 dev_err(&device->cdev->dev, in dasd_generic_build_rdc()
4023 "An error occurred in the DASD device driver, " in dasd_generic_build_rdc()
4033 cqr->startdev = device; in dasd_generic_build_rdc()
4034 cqr->memdev = device; in dasd_generic_build_rdc()
4043 int dasd_generic_read_dev_chars(struct dasd_device *device, int magic, in dasd_generic_read_dev_chars() argument
4049 cqr = dasd_generic_build_rdc(device, rdc_buffer_size, magic); in dasd_generic_read_dev_chars()
4097 struct dasd_device *device; in dasd_generic_shutdown() local
4099 device = dasd_device_from_cdev(cdev); in dasd_generic_shutdown()
4100 if (IS_ERR(device)) in dasd_generic_shutdown()
4103 if (device->block) in dasd_generic_shutdown()
4104 dasd_schedule_block_bh(device->block); in dasd_generic_shutdown()
4106 dasd_schedule_device_bh(device); in dasd_generic_shutdown()
4108 wait_event(shutdown_waitq, _wait_for_empty_queues(device)); in dasd_generic_shutdown()
4156 pr_info("The DASD device driver could not be initialized\n"); in dasd_init()