Lines Matching refs:device

87 	struct dasd_device *device;  in dasd_alloc_device()  local
89 device = kzalloc_obj(struct dasd_device, GFP_ATOMIC); in dasd_alloc_device()
90 if (!device) in dasd_alloc_device()
94 device->ccw_mem = (void *) __get_free_pages(GFP_ATOMIC | GFP_DMA, 1); in dasd_alloc_device()
95 if (!device->ccw_mem) { in dasd_alloc_device()
96 kfree(device); in dasd_alloc_device()
100 device->erp_mem = (void *) get_zeroed_page(GFP_ATOMIC | GFP_DMA); in dasd_alloc_device()
101 if (!device->erp_mem) { in dasd_alloc_device()
102 free_pages((unsigned long) device->ccw_mem, 1); in dasd_alloc_device()
103 kfree(device); in dasd_alloc_device()
107 device->ese_mem = (void *)__get_free_pages(GFP_ATOMIC | GFP_DMA, 1); in dasd_alloc_device()
108 if (!device->ese_mem) { in dasd_alloc_device()
109 free_page((unsigned long) device->erp_mem); in dasd_alloc_device()
110 free_pages((unsigned long) device->ccw_mem, 1); in dasd_alloc_device()
111 kfree(device); in dasd_alloc_device()
115 dasd_init_chunklist(&device->ccw_chunks, device->ccw_mem, PAGE_SIZE*2); in dasd_alloc_device()
116 dasd_init_chunklist(&device->erp_chunks, device->erp_mem, PAGE_SIZE); in dasd_alloc_device()
117 dasd_init_chunklist(&device->ese_chunks, device->ese_mem, PAGE_SIZE * 2); in dasd_alloc_device()
118 spin_lock_init(&device->mem_lock); in dasd_alloc_device()
119 atomic_set(&device->tasklet_scheduled, 0); in dasd_alloc_device()
120 tasklet_init(&device->tasklet, dasd_device_tasklet, in dasd_alloc_device()
121 (unsigned long) device); in dasd_alloc_device()
122 INIT_LIST_HEAD(&device->ccw_queue); in dasd_alloc_device()
123 timer_setup(&device->timer, dasd_device_timeout, 0); in dasd_alloc_device()
124 INIT_WORK(&device->kick_work, do_kick_device); in dasd_alloc_device()
125 INIT_WORK(&device->reload_device, do_reload_device); in dasd_alloc_device()
126 INIT_WORK(&device->requeue_requests, do_requeue_requests); in dasd_alloc_device()
127 device->state = DASD_STATE_NEW; in dasd_alloc_device()
128 device->target = DASD_STATE_NEW; in dasd_alloc_device()
129 mutex_init(&device->state_mutex); in dasd_alloc_device()
130 spin_lock_init(&device->profile.lock); in dasd_alloc_device()
131 return device; in dasd_alloc_device()
137 void dasd_free_device(struct dasd_device *device) in dasd_free_device() argument
139 kfree(device->private); in dasd_free_device()
140 free_pages((unsigned long) device->ese_mem, 1); in dasd_free_device()
141 free_page((unsigned long) device->erp_mem); in dasd_free_device()
142 free_pages((unsigned long) device->ccw_mem, 1); in dasd_free_device()
143 kfree(device); in dasd_free_device()
185 static int dasd_state_new_to_known(struct dasd_device *device) in dasd_state_new_to_known() argument
191 dasd_get_device(device); in dasd_state_new_to_known()
192 device->state = DASD_STATE_KNOWN; in dasd_state_new_to_known()
199 static int dasd_state_known_to_new(struct dasd_device *device) in dasd_state_known_to_new() argument
202 dasd_eer_disable(device); in dasd_state_known_to_new()
203 device->state = DASD_STATE_NEW; in dasd_state_known_to_new()
206 dasd_put_device(device); in dasd_state_known_to_new()
213 static int dasd_state_known_to_basic(struct dasd_device *device) in dasd_state_known_to_basic() argument
215 struct dasd_block *block = device->block; in dasd_state_known_to_basic()
228 dasd_profile_on(&device->block->profile); in dasd_state_known_to_basic()
230 device->debugfs_dentry = in dasd_state_known_to_basic()
231 debugfs_create_dir(dev_name(&device->cdev->dev), in dasd_state_known_to_basic()
233 dasd_profile_init(&device->profile, device->debugfs_dentry); in dasd_state_known_to_basic()
234 dasd_hosts_init(device->debugfs_dentry, device); in dasd_state_known_to_basic()
237 device->debug_area = debug_register(dev_name(&device->cdev->dev), 4, 1, in dasd_state_known_to_basic()
239 debug_register_view(device->debug_area, &debug_sprintf_view); in dasd_state_known_to_basic()
240 debug_set_level(device->debug_area, DBF_WARNING); in dasd_state_known_to_basic()
241 DBF_DEV_EVENT(DBF_EMERG, device, "%s", "debug area created"); in dasd_state_known_to_basic()
243 device->state = DASD_STATE_BASIC; in dasd_state_known_to_basic()
251 static int dasd_state_basic_to_known(struct dasd_device *device) in dasd_state_basic_to_known() argument
255 if (device->discipline->basic_to_known) { in dasd_state_basic_to_known()
256 rc = device->discipline->basic_to_known(device); in dasd_state_basic_to_known()
261 if (device->block) { in dasd_state_basic_to_known()
262 dasd_profile_exit(&device->block->profile); in dasd_state_basic_to_known()
263 debugfs_remove(device->block->debugfs_dentry); in dasd_state_basic_to_known()
264 dasd_gendisk_free(device->block); in dasd_state_basic_to_known()
265 dasd_block_clear_timer(device->block); in dasd_state_basic_to_known()
267 rc = dasd_flush_device_queue(device); in dasd_state_basic_to_known()
270 dasd_device_clear_timer(device); in dasd_state_basic_to_known()
271 dasd_profile_exit(&device->profile); in dasd_state_basic_to_known()
272 dasd_hosts_exit(device); in dasd_state_basic_to_known()
273 debugfs_remove(device->debugfs_dentry); in dasd_state_basic_to_known()
274 DBF_DEV_EVENT(DBF_EMERG, device, "%p debug area deleted", device); in dasd_state_basic_to_known()
275 if (device->debug_area != NULL) { in dasd_state_basic_to_known()
276 debug_unregister(device->debug_area); in dasd_state_basic_to_known()
277 device->debug_area = NULL; in dasd_state_basic_to_known()
279 device->state = DASD_STATE_KNOWN; in dasd_state_basic_to_known()
297 static int dasd_state_basic_to_ready(struct dasd_device *device) in dasd_state_basic_to_ready() argument
299 struct dasd_block *block = device->block; in dasd_state_basic_to_ready()
305 device->state = DASD_STATE_READY; in dasd_state_basic_to_ready()
314 device->state = DASD_STATE_UNFMT; in dasd_state_basic_to_ready()
315 kobject_uevent(&disk_to_dev(device->block->gdp)->kobj, in dasd_state_basic_to_ready()
321 lim.max_dev_sectors = device->discipline->max_sectors(block); in dasd_state_basic_to_ready()
330 if (device->discipline->has_discard) { in dasd_state_basic_to_ready()
347 device->state = DASD_STATE_READY; in dasd_state_basic_to_ready()
351 device->state = DASD_STATE_BASIC; in dasd_state_basic_to_ready()
356 if (device->discipline->basic_to_ready) in dasd_state_basic_to_ready()
357 rc = device->discipline->basic_to_ready(device); in dasd_state_basic_to_ready()
362 int _wait_for_empty_queues(struct dasd_device *device) in _wait_for_empty_queues() argument
364 if (device->block) in _wait_for_empty_queues()
365 return list_empty(&device->ccw_queue) && in _wait_for_empty_queues()
366 list_empty(&device->block->ccw_queue); in _wait_for_empty_queues()
368 return list_empty(&device->ccw_queue); in _wait_for_empty_queues()
376 static int dasd_state_ready_to_basic(struct dasd_device *device) in dasd_state_ready_to_basic() argument
380 device->state = DASD_STATE_BASIC; in dasd_state_ready_to_basic()
381 if (device->block) { in dasd_state_ready_to_basic()
382 struct dasd_block *block = device->block; in dasd_state_ready_to_basic()
385 device->state = DASD_STATE_READY; in dasd_state_ready_to_basic()
399 static int dasd_state_unfmt_to_basic(struct dasd_device *device) in dasd_state_unfmt_to_basic() argument
401 device->state = DASD_STATE_BASIC; in dasd_state_unfmt_to_basic()
411 dasd_state_ready_to_online(struct dasd_device * device) in dasd_state_ready_to_online() argument
413 device->state = DASD_STATE_ONLINE; in dasd_state_ready_to_online()
414 if (device->block) { in dasd_state_ready_to_online()
415 dasd_schedule_block_bh(device->block); in dasd_state_ready_to_online()
416 if ((device->features & DASD_FEATURE_USERAW)) { in dasd_state_ready_to_online()
417 kobject_uevent(&disk_to_dev(device->block->gdp)->kobj, in dasd_state_ready_to_online()
421 disk_uevent(file_bdev(device->block->bdev_file)->bd_disk, in dasd_state_ready_to_online()
430 static int dasd_state_online_to_ready(struct dasd_device *device) in dasd_state_online_to_ready() argument
434 if (device->discipline->online_to_ready) { in dasd_state_online_to_ready()
435 rc = device->discipline->online_to_ready(device); in dasd_state_online_to_ready()
440 device->state = DASD_STATE_READY; in dasd_state_online_to_ready()
441 if (device->block && !(device->features & DASD_FEATURE_USERAW)) in dasd_state_online_to_ready()
442 disk_uevent(file_bdev(device->block->bdev_file)->bd_disk, in dasd_state_online_to_ready()
450 static int dasd_increase_state(struct dasd_device *device) in dasd_increase_state() argument
455 if (device->state == DASD_STATE_NEW && in dasd_increase_state()
456 device->target >= DASD_STATE_KNOWN) in dasd_increase_state()
457 rc = dasd_state_new_to_known(device); in dasd_increase_state()
460 device->state == DASD_STATE_KNOWN && in dasd_increase_state()
461 device->target >= DASD_STATE_BASIC) in dasd_increase_state()
462 rc = dasd_state_known_to_basic(device); in dasd_increase_state()
465 device->state == DASD_STATE_BASIC && in dasd_increase_state()
466 device->target >= DASD_STATE_READY) in dasd_increase_state()
467 rc = dasd_state_basic_to_ready(device); in dasd_increase_state()
470 device->state == DASD_STATE_UNFMT && in dasd_increase_state()
471 device->target > DASD_STATE_UNFMT) in dasd_increase_state()
475 device->state == DASD_STATE_READY && in dasd_increase_state()
476 device->target >= DASD_STATE_ONLINE) in dasd_increase_state()
477 rc = dasd_state_ready_to_online(device); in dasd_increase_state()
485 static int dasd_decrease_state(struct dasd_device *device) in dasd_decrease_state() argument
490 if (device->state == DASD_STATE_ONLINE && in dasd_decrease_state()
491 device->target <= DASD_STATE_READY) in dasd_decrease_state()
492 rc = dasd_state_online_to_ready(device); in dasd_decrease_state()
495 device->state == DASD_STATE_READY && in dasd_decrease_state()
496 device->target <= DASD_STATE_BASIC) in dasd_decrease_state()
497 rc = dasd_state_ready_to_basic(device); in dasd_decrease_state()
500 device->state == DASD_STATE_UNFMT && in dasd_decrease_state()
501 device->target <= DASD_STATE_BASIC) in dasd_decrease_state()
502 rc = dasd_state_unfmt_to_basic(device); in dasd_decrease_state()
505 device->state == DASD_STATE_BASIC && in dasd_decrease_state()
506 device->target <= DASD_STATE_KNOWN) in dasd_decrease_state()
507 rc = dasd_state_basic_to_known(device); in dasd_decrease_state()
510 device->state == DASD_STATE_KNOWN && in dasd_decrease_state()
511 device->target <= DASD_STATE_NEW) in dasd_decrease_state()
512 rc = dasd_state_known_to_new(device); in dasd_decrease_state()
520 static void dasd_change_state(struct dasd_device *device) in dasd_change_state() argument
524 if (device->state == device->target) in dasd_change_state()
527 if (device->state < device->target) in dasd_change_state()
528 rc = dasd_increase_state(device); in dasd_change_state()
530 rc = dasd_decrease_state(device); in dasd_change_state()
534 device->target = device->state; in dasd_change_state()
537 kobject_uevent(&device->cdev->dev.kobj, KOBJ_CHANGE); in dasd_change_state()
539 if (device->state == device->target) in dasd_change_state()
551 struct dasd_device *device = container_of(work, struct dasd_device, kick_work); in do_kick_device() local
552 mutex_lock(&device->state_mutex); in do_kick_device()
553 dasd_change_state(device); in do_kick_device()
554 mutex_unlock(&device->state_mutex); in do_kick_device()
555 dasd_schedule_device_bh(device); in do_kick_device()
556 dasd_put_device(device); in do_kick_device()
559 void dasd_kick_device(struct dasd_device *device) in dasd_kick_device() argument
561 dasd_get_device(device); in dasd_kick_device()
563 if (!schedule_work(&device->kick_work)) in dasd_kick_device()
564 dasd_put_device(device); in dasd_kick_device()
574 struct dasd_device *device = container_of(work, struct dasd_device, in do_reload_device() local
576 device->discipline->reload(device); in do_reload_device()
577 dasd_put_device(device); in do_reload_device()
580 void dasd_reload_device(struct dasd_device *device) in dasd_reload_device() argument
582 dasd_get_device(device); in dasd_reload_device()
584 if (!schedule_work(&device->reload_device)) in dasd_reload_device()
585 dasd_put_device(device); in dasd_reload_device()
592 void dasd_set_target_state(struct dasd_device *device, int target) in dasd_set_target_state() argument
594 dasd_get_device(device); in dasd_set_target_state()
595 mutex_lock(&device->state_mutex); in dasd_set_target_state()
599 if (device->target != target) { in dasd_set_target_state()
600 if (device->state == target) in dasd_set_target_state()
602 device->target = target; in dasd_set_target_state()
604 if (device->state != device->target) in dasd_set_target_state()
605 dasd_change_state(device); in dasd_set_target_state()
606 mutex_unlock(&device->state_mutex); in dasd_set_target_state()
607 dasd_put_device(device); in dasd_set_target_state()
613 static inline int _wait_for_device(struct dasd_device *device) in _wait_for_device() argument
615 return (device->state == device->target); in _wait_for_device()
618 void dasd_enable_device(struct dasd_device *device) in dasd_enable_device() argument
620 dasd_set_target_state(device, DASD_STATE_ONLINE); in dasd_enable_device()
621 if (device->state <= DASD_STATE_KNOWN) in dasd_enable_device()
623 dasd_set_target_state(device, DASD_STATE_NEW); in dasd_enable_device()
625 wait_event(dasd_init_waitq, _wait_for_device(device)); in dasd_enable_device()
627 dasd_reload_device(device); in dasd_enable_device()
628 if (device->discipline->kick_validate) in dasd_enable_device()
629 device->discipline->kick_validate(device); in dasd_enable_device()
654 struct dasd_device *device; in dasd_profile_start() local
684 device = cqr->startdev; in dasd_profile_start()
685 if (!device->profile.data) in dasd_profile_start()
688 spin_lock(get_ccwdev_lock(device->cdev)); in dasd_profile_start()
690 list_for_each(l, &device->ccw_queue) in dasd_profile_start()
693 spin_unlock(get_ccwdev_lock(device->cdev)); in dasd_profile_start()
695 spin_lock(&device->profile.lock); in dasd_profile_start()
696 device->profile.data->dasd_io_nr_req[counter]++; in dasd_profile_start()
698 device->profile.data->dasd_read_nr_req[counter]++; in dasd_profile_start()
699 spin_unlock(&device->profile.lock); in dasd_profile_start()
766 struct dasd_device *device; in dasd_profile_end() local
771 device = cqr->startdev; in dasd_profile_end()
774 device->profile.data)) in dasd_profile_end()
833 spin_lock(&device->profile.lock); in dasd_profile_end()
834 if (device->profile.data) { in dasd_profile_end()
835 data = device->profile.data; in dasd_profile_end()
840 dasd_profile_end_add_data(device->profile.data, in dasd_profile_end()
849 spin_unlock(&device->profile.lock); in dasd_profile_end()
1108 struct dasd_device *device; in dasd_hosts_show() local
1111 device = m->private; in dasd_hosts_show()
1112 dasd_get_device(device); in dasd_hosts_show()
1114 if (device->discipline->hosts_print) in dasd_hosts_show()
1115 rc = device->discipline->hosts_print(device, m); in dasd_hosts_show()
1117 dasd_put_device(device); in dasd_hosts_show()
1123 static void dasd_hosts_exit(struct dasd_device *device) in dasd_hosts_exit() argument
1125 debugfs_remove(device->hosts_dentry); in dasd_hosts_exit()
1126 device->hosts_dentry = NULL; in dasd_hosts_exit()
1130 struct dasd_device *device) in dasd_hosts_init() argument
1132 device->hosts_dentry = debugfs_create_file("host_access_list", 0400, base_dentry, in dasd_hosts_init()
1133 device, &dasd_hosts_fops); in dasd_hosts_init()
1137 struct dasd_device *device, in dasd_smalloc_request() argument
1151 spin_lock_irqsave(&device->mem_lock, flags); in dasd_smalloc_request()
1152 data = chunk = dasd_alloc_chunk(&device->ccw_chunks, size); in dasd_smalloc_request()
1153 spin_unlock_irqrestore(&device->mem_lock, flags); in dasd_smalloc_request()
1173 dasd_get_device(device); in dasd_smalloc_request()
1180 struct dasd_device *device) in dasd_fmalloc_request() argument
1194 spin_lock_irqsave(&device->mem_lock, flags); in dasd_fmalloc_request()
1195 cqr = dasd_alloc_chunk(&device->ese_chunks, size); in dasd_fmalloc_request()
1196 spin_unlock_irqrestore(&device->mem_lock, flags); in dasd_fmalloc_request()
1215 dasd_get_device(device); in dasd_fmalloc_request()
1221 void dasd_sfree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_sfree_request() argument
1225 spin_lock_irqsave(&device->mem_lock, flags); in dasd_sfree_request()
1226 dasd_free_chunk(&device->ccw_chunks, cqr->mem_chunk); in dasd_sfree_request()
1227 spin_unlock_irqrestore(&device->mem_lock, flags); in dasd_sfree_request()
1228 dasd_put_device(device); in dasd_sfree_request()
1232 void dasd_ffree_request(struct dasd_ccw_req *cqr, struct dasd_device *device) in dasd_ffree_request() argument
1236 spin_lock_irqsave(&device->mem_lock, flags); in dasd_ffree_request()
1237 dasd_free_chunk(&device->ese_chunks, cqr); in dasd_ffree_request()
1238 spin_unlock_irqrestore(&device->mem_lock, flags); in dasd_ffree_request()
1239 dasd_put_device(device); in dasd_ffree_request()
1248 struct dasd_device *device; in dasd_check_cqr() local
1252 device = cqr->startdev; in dasd_check_cqr()
1253 if (strncmp((char *) &cqr->magic, device->discipline->ebcname, 4)) { in dasd_check_cqr()
1254 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_check_cqr()
1258 *(unsigned int *) device->discipline->name); in dasd_check_cqr()
1272 struct dasd_device *device; in dasd_term_IO() local
1280 device = (struct dasd_device *) cqr->startdev; in dasd_term_IO()
1282 rc = ccw_device_clear(device->cdev, (long) cqr); in dasd_term_IO()
1288 DBF_DEV_EVENT(DBF_DEBUG, device, in dasd_term_IO()
1293 DBF_DEV_EVENT(DBF_ERR, device, "%s", in dasd_term_IO()
1306 DBF_DEV_EVENT(DBF_ERR, device, "%s", in dasd_term_IO()
1312 dev_err(&device->cdev->dev, in dasd_term_IO()
1319 dasd_schedule_device_bh(device); in dasd_term_IO()
1330 struct dasd_device *device; in dasd_start_IO() local
1339 device = (struct dasd_device *) cqr->startdev; in dasd_start_IO()
1342 test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags)) && in dasd_start_IO()
1344 DBF_DEV_EVENT(DBF_DEBUG, device, "start_IO: return request %p " in dasd_start_IO()
1351 dev_err(&device->cdev->dev, in dasd_start_IO()
1360 cqr->lpm &= dasd_path_get_opm(device); in dasd_start_IO()
1362 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1372 rc = ccw_device_tm_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1375 rc = ccw_device_start(device->cdev, cqr->cpaddr, in dasd_start_IO()
1383 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1395 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_start_IO()
1398 } else if (cqr->lpm != dasd_path_get_opm(device)) { in dasd_start_IO()
1399 cqr->lpm = dasd_path_get_opm(device); in dasd_start_IO()
1400 DBF_DEV_EVENT(DBF_DEBUG, device, "%s", in dasd_start_IO()
1404 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1407 dasd_generic_last_path_gone(device); in dasd_start_IO()
1408 dasd_path_no_path(device); in dasd_start_IO()
1409 dasd_path_set_tbvpm(device, in dasd_start_IO()
1411 device->cdev)); in dasd_start_IO()
1415 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1418 dasd_handle_autoquiesce(device, cqr, DASD_EER_STARTIO); in dasd_start_IO()
1421 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1425 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_start_IO()
1430 dev_err(&device->cdev->dev, in dasd_start_IO()
1451 struct dasd_device *device; in dasd_device_timeout() local
1453 device = timer_container_of(device, t, timer); in dasd_device_timeout()
1454 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_device_timeout()
1456 dasd_device_remove_stop_bits(device, DASD_STOPPED_PENDING); in dasd_device_timeout()
1457 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_device_timeout()
1458 dasd_schedule_device_bh(device); in dasd_device_timeout()
1464 void dasd_device_set_timer(struct dasd_device *device, int expires) in dasd_device_set_timer() argument
1467 timer_delete(&device->timer); in dasd_device_set_timer()
1469 mod_timer(&device->timer, jiffies + expires); in dasd_device_set_timer()
1476 void dasd_device_clear_timer(struct dasd_device *device) in dasd_device_clear_timer() argument
1478 timer_delete(&device->timer); in dasd_device_clear_timer()
1486 struct dasd_device *device; in dasd_handle_killed_request() local
1498 device = dasd_device_from_cdev_locked(cdev); in dasd_handle_killed_request()
1499 if (IS_ERR(device)) { in dasd_handle_killed_request()
1506 device != cqr->startdev || in dasd_handle_killed_request()
1511 dasd_put_device(device); in dasd_handle_killed_request()
1518 dasd_device_clear_timer(device); in dasd_handle_killed_request()
1519 dasd_schedule_device_bh(device); in dasd_handle_killed_request()
1520 dasd_put_device(device); in dasd_handle_killed_request()
1523 void dasd_generic_handle_state_change(struct dasd_device *device) in dasd_generic_handle_state_change() argument
1526 dasd_eer_snss(device); in dasd_generic_handle_state_change()
1528 dasd_device_remove_stop_bits(device, DASD_STOPPED_PENDING); in dasd_generic_handle_state_change()
1529 dasd_schedule_device_bh(device); in dasd_generic_handle_state_change()
1530 if (device->block) { in dasd_generic_handle_state_change()
1531 dasd_schedule_block_bh(device->block); in dasd_generic_handle_state_change()
1532 if (device->block->gdp) in dasd_generic_handle_state_change()
1533 blk_mq_run_hw_queues(device->block->gdp->queue, true); in dasd_generic_handle_state_change()
1547 struct dasd_device *device = NULL; in dasd_ese_needs_format() local
1552 device = block->base; in dasd_ese_needs_format()
1553 if (!device || !device->discipline->is_ese) in dasd_ese_needs_format()
1555 if (!device->discipline->is_ese(device)) in dasd_ese_needs_format()
1588 struct dasd_device *device; in dasd_int_handler() local
1601 device = cqr->startdev; in dasd_int_handler()
1603 dasd_device_clear_timer(device); in dasd_int_handler()
1605 dasd_schedule_device_bh(device); in dasd_int_handler()
1629 device = dasd_device_from_cdev_locked(cdev); in dasd_int_handler()
1630 if (IS_ERR(device)) in dasd_int_handler()
1633 if (device->discipline == dasd_diag_discipline_pointer) { in dasd_int_handler()
1634 dasd_put_device(device); in dasd_int_handler()
1657 dasd_generic_space_exhaust(device, cqr); in dasd_int_handler()
1658 device->discipline->ext_pool_exhaust(device, cqr); in dasd_int_handler()
1659 dasd_put_device(device); in dasd_int_handler()
1664 device->discipline->dump_sense_dbf(device, irb, "int"); in dasd_int_handler()
1666 if (device->features & DASD_FEATURE_ERPLOG) in dasd_int_handler()
1667 device->discipline->dump_sense(device, cqr, irb); in dasd_int_handler()
1668 device->discipline->check_for_device_change(device, cqr, irb); in dasd_int_handler()
1669 dasd_put_device(device); in dasd_int_handler()
1674 device = dasd_device_from_cdev_locked(cdev); in dasd_int_handler()
1675 if (!IS_ERR(device)) { in dasd_int_handler()
1676 device->discipline->check_attention(device, in dasd_int_handler()
1678 dasd_put_device(device); in dasd_int_handler()
1685 device = (struct dasd_device *) cqr->startdev; in dasd_int_handler()
1686 if (!device || in dasd_int_handler()
1687 strncmp(device->discipline->ebcname, (char *) &cqr->magic, 4)) { in dasd_int_handler()
1700 device->discipline->ese_read(cqr, irb); in dasd_int_handler()
1703 dasd_device_clear_timer(device); in dasd_int_handler()
1704 dasd_schedule_device_bh(device); in dasd_int_handler()
1707 fcqr = device->discipline->ese_format(device, cqr, irb); in dasd_int_handler()
1718 dasd_schedule_device_bh(device); in dasd_int_handler()
1723 list_add(&fcqr->devlist, &device->ccw_queue); in dasd_int_handler()
1724 dasd_schedule_device_bh(device); in dasd_int_handler()
1733 dasd_device_clear_timer(device); in dasd_int_handler()
1735 dasd_schedule_device_bh(device); in dasd_int_handler()
1741 DBF_DEV_EVENT(DBF_DEBUG, device, "invalid status: bus_id %s, " in dasd_int_handler()
1754 if (cqr->devlist.next != &device->ccw_queue) { in dasd_int_handler()
1764 device->discipline->handle_hpf_error) in dasd_int_handler()
1765 device->discipline->handle_hpf_error(device, irb); in dasd_int_handler()
1772 if (cqr->lpm == dasd_path_get_opm(device)) in dasd_int_handler()
1773 DBF_DEV_EVENT(DBF_DEBUG, device, in dasd_int_handler()
1778 cqr->lpm = dasd_path_get_opm(device); in dasd_int_handler()
1785 (!device->stopped)) { in dasd_int_handler()
1786 if (device->discipline->start_IO(next) == 0) in dasd_int_handler()
1790 dasd_device_set_timer(device, expires); in dasd_int_handler()
1792 dasd_device_clear_timer(device); in dasd_int_handler()
1793 dasd_schedule_device_bh(device); in dasd_int_handler()
1799 struct dasd_device *device; in dasd_generic_uc_handler() local
1801 device = dasd_device_from_cdev_locked(cdev); in dasd_generic_uc_handler()
1803 if (IS_ERR(device)) in dasd_generic_uc_handler()
1805 if (test_bit(DASD_FLAG_OFFLINE, &device->flags) || in dasd_generic_uc_handler()
1806 device->state != device->target || in dasd_generic_uc_handler()
1807 !device->discipline->check_for_device_change){ in dasd_generic_uc_handler()
1808 dasd_put_device(device); in dasd_generic_uc_handler()
1811 if (device->discipline->dump_sense_dbf) in dasd_generic_uc_handler()
1812 device->discipline->dump_sense_dbf(device, irb, "uc"); in dasd_generic_uc_handler()
1813 device->discipline->check_for_device_change(device, NULL, irb); in dasd_generic_uc_handler()
1814 dasd_put_device(device); in dasd_generic_uc_handler()
1824 static void __dasd_device_recovery(struct dasd_device *device, in __dasd_device_recovery() argument
1836 list_for_each_safe(l, n, &device->ccw_queue) { in __dasd_device_recovery()
1849 static void __dasd_device_process_ccw_queue(struct dasd_device *device, in __dasd_device_process_ccw_queue() argument
1856 list_for_each_safe(l, n, &device->ccw_queue) { in __dasd_device_process_ccw_queue()
1865 __dasd_device_recovery(device, cqr); in __dasd_device_process_ccw_queue()
1872 static void __dasd_process_cqr(struct dasd_device *device, in __dasd_process_cqr() argument
1886 dev_err(&device->cdev->dev, in __dasd_process_cqr()
1898 static void __dasd_device_process_final_queue(struct dasd_device *device, in __dasd_device_process_final_queue() argument
1910 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
1913 __dasd_process_cqr(device, cqr); in __dasd_device_process_final_queue()
1922 static void __dasd_device_check_autoquiesce_timeout(struct dasd_device *device, in __dasd_device_check_autoquiesce_timeout() argument
1925 if ((device->default_retries - cqr->retries) >= device->aq_timeouts) in __dasd_device_check_autoquiesce_timeout()
1926 dasd_handle_autoquiesce(device, cqr, DASD_EER_TIMEOUTS); in __dasd_device_check_autoquiesce_timeout()
1933 static void __dasd_device_check_expire(struct dasd_device *device) in __dasd_device_check_expire() argument
1937 if (list_empty(&device->ccw_queue)) in __dasd_device_check_expire()
1939 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_check_expire()
1942 if (test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in __dasd_device_check_expire()
1949 if (device->discipline->term_IO(cqr) != 0) { in __dasd_device_check_expire()
1951 dev_err(&device->cdev->dev, in __dasd_device_check_expire()
1955 dasd_device_set_timer(device, 5*HZ); in __dasd_device_check_expire()
1957 dev_err(&device->cdev->dev, in __dasd_device_check_expire()
1961 __dasd_device_check_autoquiesce_timeout(device, cqr); in __dasd_device_check_expire()
1968 static int __dasd_device_is_unusable(struct dasd_device *device, in __dasd_device_is_unusable() argument
1973 if (test_bit(DASD_FLAG_OFFLINE, &device->flags) && in __dasd_device_is_unusable()
1974 !test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in __dasd_device_is_unusable()
1981 if (device->stopped) { in __dasd_device_is_unusable()
1982 if (device->stopped & mask) { in __dasd_device_is_unusable()
2000 static void __dasd_device_start_head(struct dasd_device *device) in __dasd_device_start_head() argument
2005 if (list_empty(&device->ccw_queue)) in __dasd_device_start_head()
2007 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in __dasd_device_start_head()
2011 if (__dasd_device_is_unusable(device, cqr)) { in __dasd_device_start_head()
2014 dasd_schedule_device_bh(device); in __dasd_device_start_head()
2018 rc = device->discipline->start_IO(cqr); in __dasd_device_start_head()
2020 dasd_device_set_timer(device, cqr->expires); in __dasd_device_start_head()
2022 dasd_schedule_device_bh(device); in __dasd_device_start_head()
2025 dasd_device_set_timer(device, 50); in __dasd_device_start_head()
2028 static void __dasd_device_check_path_events(struct dasd_device *device) in __dasd_device_check_path_events() argument
2033 tbvpm = dasd_path_get_tbvpm(device); in __dasd_device_check_path_events()
2034 fcsecpm = dasd_path_get_fcsecpm(device); in __dasd_device_check_path_events()
2039 if (device->stopped & ~(DASD_STOPPED_DC_WAIT)) in __dasd_device_check_path_events()
2042 dasd_path_clear_all_verify(device); in __dasd_device_check_path_events()
2043 dasd_path_clear_all_fcsec(device); in __dasd_device_check_path_events()
2045 rc = device->discipline->pe_handler(device, tbvpm, fcsecpm); in __dasd_device_check_path_events()
2047 dasd_path_add_tbvpm(device, tbvpm); in __dasd_device_check_path_events()
2048 dasd_path_add_fcsecpm(device, fcsecpm); in __dasd_device_check_path_events()
2049 dasd_device_set_timer(device, 50); in __dasd_device_check_path_events()
2063 int dasd_flush_device_queue(struct dasd_device *device) in dasd_flush_device_queue() argument
2070 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_flush_device_queue()
2072 list_for_each_entry_safe(cqr, n, &device->ccw_queue, devlist) { in dasd_flush_device_queue()
2076 rc = device->discipline->term_IO(cqr); in dasd_flush_device_queue()
2079 dev_err(&device->cdev->dev, in dasd_flush_device_queue()
2095 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_flush_device_queue()
2108 __dasd_device_process_final_queue(device, &flush_queue); in dasd_flush_device_queue()
2118 struct dasd_device *device = (struct dasd_device *) data; in dasd_device_tasklet() local
2121 atomic_set (&device->tasklet_scheduled, 0); in dasd_device_tasklet()
2123 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_device_tasklet()
2125 __dasd_device_check_expire(device); in dasd_device_tasklet()
2127 __dasd_device_process_ccw_queue(device, &final_queue); in dasd_device_tasklet()
2128 __dasd_device_check_path_events(device); in dasd_device_tasklet()
2129 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_device_tasklet()
2131 __dasd_device_process_final_queue(device, &final_queue); in dasd_device_tasklet()
2132 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_device_tasklet()
2134 __dasd_device_start_head(device); in dasd_device_tasklet()
2135 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_device_tasklet()
2138 dasd_put_device(device); in dasd_device_tasklet()
2144 void dasd_schedule_device_bh(struct dasd_device *device) in dasd_schedule_device_bh() argument
2147 if (atomic_cmpxchg (&device->tasklet_scheduled, 0, 1) != 0) in dasd_schedule_device_bh()
2149 dasd_get_device(device); in dasd_schedule_device_bh()
2150 tasklet_hi_schedule(&device->tasklet); in dasd_schedule_device_bh()
2154 void dasd_device_set_stop_bits(struct dasd_device *device, int bits) in dasd_device_set_stop_bits() argument
2156 device->stopped |= bits; in dasd_device_set_stop_bits()
2160 void dasd_device_remove_stop_bits(struct dasd_device *device, int bits) in dasd_device_remove_stop_bits() argument
2162 device->stopped &= ~bits; in dasd_device_remove_stop_bits()
2163 if (!device->stopped) in dasd_device_remove_stop_bits()
2174 struct dasd_device *device; in dasd_add_request_head() local
2177 device = cqr->startdev; in dasd_add_request_head()
2178 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_add_request_head()
2180 list_add(&cqr->devlist, &device->ccw_queue); in dasd_add_request_head()
2182 dasd_schedule_device_bh(device); in dasd_add_request_head()
2183 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_add_request_head()
2193 struct dasd_device *device; in dasd_add_request_tail() local
2196 device = cqr->startdev; in dasd_add_request_tail()
2197 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_add_request_tail()
2199 list_add_tail(&cqr->devlist, &device->ccw_queue); in dasd_add_request_tail()
2201 dasd_schedule_device_bh(device); in dasd_add_request_tail()
2202 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_add_request_tail()
2220 struct dasd_device *device; in _wait_for_wakeup() local
2223 device = cqr->startdev; in _wait_for_wakeup()
2224 spin_lock_irq(get_ccwdev_lock(device->cdev)); in _wait_for_wakeup()
2226 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in _wait_for_wakeup()
2235 struct dasd_device *device; in __dasd_sleep_on_erp() local
2240 device = cqr->startdev; in __dasd_sleep_on_erp()
2243 device->discipline->handle_terminated_request(cqr); in __dasd_sleep_on_erp()
2247 erp_fn = device->discipline->erp_action(cqr); in __dasd_sleep_on_erp()
2254 __dasd_process_erp(device, cqr); in __dasd_sleep_on_erp()
2274 struct dasd_device *device; in _dasd_sleep_on() local
2281 device = maincqr->startdev; in _dasd_sleep_on()
2291 if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags) && in _dasd_sleep_on()
2298 if (device->stopped & ~DASD_STOPPED_PENDING && in _dasd_sleep_on()
2300 !dasd_eer_enabled(device) && device->aq_mask == 0) { in _dasd_sleep_on()
2309 if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) { in _dasd_sleep_on()
2321 generic_waitq, !(device->stopped)); in _dasd_sleep_on()
2328 wait_event(generic_waitq, !(device->stopped)); in _dasd_sleep_on()
2378 struct dasd_device *device; in _dasd_sleep_on_queue() local
2385 device = cqr->startdev; in _dasd_sleep_on_queue()
2389 if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags) && in _dasd_sleep_on_queue()
2396 if (device->stopped & ~DASD_STOPPED_PENDING && in _dasd_sleep_on_queue()
2398 !dasd_eer_enabled(device)) { in _dasd_sleep_on_queue()
2407 generic_waitq, !device->stopped); in _dasd_sleep_on_queue()
2414 wait_event(generic_waitq, !(device->stopped)); in _dasd_sleep_on_queue()
2506 static inline int _dasd_term_running_cqr(struct dasd_device *device) in _dasd_term_running_cqr() argument
2511 if (list_empty(&device->ccw_queue)) in _dasd_term_running_cqr()
2513 cqr = list_entry(device->ccw_queue.next, struct dasd_ccw_req, devlist); in _dasd_term_running_cqr()
2514 rc = device->discipline->term_IO(cqr); in _dasd_term_running_cqr()
2527 struct dasd_device *device; in dasd_sleep_on_immediatly() local
2530 device = cqr->startdev; in dasd_sleep_on_immediatly()
2531 if (test_bit(DASD_FLAG_LOCK_STOLEN, &device->flags) && in dasd_sleep_on_immediatly()
2537 spin_lock_irq(get_ccwdev_lock(device->cdev)); in dasd_sleep_on_immediatly()
2538 rc = _dasd_term_running_cqr(device); in dasd_sleep_on_immediatly()
2540 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_sleep_on_immediatly()
2550 list_add(&cqr->devlist, device->ccw_queue.next); in dasd_sleep_on_immediatly()
2553 dasd_schedule_device_bh(device); in dasd_sleep_on_immediatly()
2555 spin_unlock_irq(get_ccwdev_lock(device->cdev)); in dasd_sleep_on_immediatly()
2567 dasd_schedule_device_bh(device); in dasd_sleep_on_immediatly()
2568 if (device->block) in dasd_sleep_on_immediatly()
2569 dasd_schedule_block_bh(device->block); in dasd_sleep_on_immediatly()
2586 struct dasd_device *device = cqr->startdev; in __dasd_cancel_req() local
2596 rc = device->discipline->term_IO(cqr); in __dasd_cancel_req()
2598 dev_err(&device->cdev->dev, in __dasd_cancel_req()
2607 dasd_schedule_device_bh(device); in __dasd_cancel_req()
2613 struct dasd_device *device = cqr->startdev; in dasd_cancel_req() local
2617 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in dasd_cancel_req()
2619 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in dasd_cancel_req()
2670 static void __dasd_process_erp(struct dasd_device *device, in __dasd_process_erp() argument
2676 DBF_DEV_EVENT(DBF_NOTICE, device, "%s", "ERP successful"); in __dasd_process_erp()
2678 dev_err(&device->cdev->dev, "ERP failed for the DASD\n"); in __dasd_process_erp()
2679 erp_fn = device->discipline->erp_postaction(cqr); in __dasd_process_erp()
3115 struct dasd_device *device; in dasd_times_out() local
3125 device = cqr->startdev ? cqr->startdev : block->base; in dasd_times_out()
3126 if (!device->blk_timeout) { in dasd_times_out()
3130 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_times_out()
3135 spin_lock(get_ccwdev_lock(device->cdev)); in dasd_times_out()
3172 spin_unlock(get_ccwdev_lock(device->cdev)); in dasd_times_out()
3339 int dasd_device_is_ro(struct dasd_device *device) in dasd_device_is_ro() argument
3347 ccw_device_get_id(device->cdev, &dev_id); in dasd_device_is_ro()
3392 void dasd_generic_free_discipline(struct dasd_device *device) in dasd_generic_free_discipline() argument
3395 if (device->discipline) { in dasd_generic_free_discipline()
3396 if (device->discipline->uncheck_device) in dasd_generic_free_discipline()
3397 device->discipline->uncheck_device(device); in dasd_generic_free_discipline()
3398 module_put(device->discipline->owner); in dasd_generic_free_discipline()
3399 device->discipline = NULL; in dasd_generic_free_discipline()
3401 if (device->base_discipline) { in dasd_generic_free_discipline()
3402 module_put(device->base_discipline->owner); in dasd_generic_free_discipline()
3403 device->base_discipline = NULL; in dasd_generic_free_discipline()
3414 struct dasd_device *device; in dasd_generic_remove() local
3417 device = dasd_device_from_cdev(cdev); in dasd_generic_remove()
3418 if (IS_ERR(device)) in dasd_generic_remove()
3421 if (test_and_set_bit(DASD_FLAG_OFFLINE, &device->flags) && in dasd_generic_remove()
3422 !test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in dasd_generic_remove()
3424 dasd_put_device(device); in dasd_generic_remove()
3432 dasd_set_target_state(device, DASD_STATE_NEW); in dasd_generic_remove()
3435 block = device->block; in dasd_generic_remove()
3436 dasd_delete_device(device); in dasd_generic_remove()
3455 struct dasd_device *device; in dasd_generic_set_online() local
3456 struct device *dev; in dasd_generic_set_online()
3463 device = dasd_create_device(cdev); in dasd_generic_set_online()
3464 if (IS_ERR(device)) in dasd_generic_set_online()
3465 return PTR_ERR(device); in dasd_generic_set_online()
3468 if (device->features & DASD_FEATURE_USEDIAG) { in dasd_generic_set_online()
3477 dasd_delete_device(device); in dasd_generic_set_online()
3485 dasd_delete_device(device); in dasd_generic_set_online()
3491 dasd_delete_device(device); in dasd_generic_set_online()
3494 device->base_discipline = base_discipline; in dasd_generic_set_online()
3496 dasd_delete_device(device); in dasd_generic_set_online()
3499 device->discipline = discipline; in dasd_generic_set_online()
3502 rc = discipline->check_device(device); in dasd_generic_set_online()
3506 dasd_delete_device(device); in dasd_generic_set_online()
3510 dasd_set_target_state(device, DASD_STATE_ONLINE); in dasd_generic_set_online()
3511 if (device->state <= DASD_STATE_KNOWN) { in dasd_generic_set_online()
3514 dasd_set_target_state(device, DASD_STATE_NEW); in dasd_generic_set_online()
3515 if (device->block) in dasd_generic_set_online()
3516 dasd_free_block(device->block); in dasd_generic_set_online()
3517 dasd_delete_device(device); in dasd_generic_set_online()
3522 wait_event(dasd_init_waitq, _wait_for_device(device)); in dasd_generic_set_online()
3524 dasd_put_device(device); in dasd_generic_set_online()
3532 struct dasd_device *device; in dasd_generic_set_offline() local
3535 struct device *dev; in dasd_generic_set_offline()
3541 device = dasd_device_from_cdev_locked(cdev); in dasd_generic_set_offline()
3542 if (IS_ERR(device)) { in dasd_generic_set_offline()
3544 return PTR_ERR(device); in dasd_generic_set_offline()
3553 if (device->block) { in dasd_generic_set_offline()
3554 max_count = device->block->bdev_file ? 0 : -1; in dasd_generic_set_offline()
3555 open_count = atomic_read(&device->block->open_count); in dasd_generic_set_offline()
3573 if (test_bit(DASD_FLAG_OFFLINE, &device->flags)) { in dasd_generic_set_offline()
3574 if (test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in dasd_generic_set_offline()
3576 &device->flags); in dasd_generic_set_offline()
3582 set_bit(DASD_FLAG_OFFLINE, &device->flags); in dasd_generic_set_offline()
3589 if (test_and_clear_bit(DASD_FLAG_SAFE_OFFLINE, &device->flags) && in dasd_generic_set_offline()
3590 !test_and_set_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in dasd_generic_set_offline()
3599 if (device->block && device->block->bdev_file) in dasd_generic_set_offline()
3600 bdev_mark_dead(file_bdev(device->block->bdev_file), false); in dasd_generic_set_offline()
3601 dasd_schedule_device_bh(device); in dasd_generic_set_offline()
3603 _wait_for_empty_queues(device)); in dasd_generic_set_offline()
3615 if (!test_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags)) { in dasd_generic_set_offline()
3619 clear_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags); in dasd_generic_set_offline()
3623 dasd_set_target_state(device, DASD_STATE_NEW); in dasd_generic_set_offline()
3625 block = device->block; in dasd_generic_set_offline()
3626 dasd_delete_device(device); in dasd_generic_set_offline()
3639 clear_bit(DASD_FLAG_SAFE_OFFLINE_RUNNING, &device->flags); in dasd_generic_set_offline()
3640 clear_bit(DASD_FLAG_OFFLINE, &device->flags); in dasd_generic_set_offline()
3642 dasd_put_device(device); in dasd_generic_set_offline()
3648 int dasd_generic_last_path_gone(struct dasd_device *device) in dasd_generic_last_path_gone() argument
3652 dev_warn(&device->cdev->dev, "No operational channel path is left " in dasd_generic_last_path_gone()
3654 DBF_DEV_EVENT(DBF_WARNING, device, "%s", "last path gone"); in dasd_generic_last_path_gone()
3656 dasd_handle_autoquiesce(device, NULL, DASD_EER_NOPATH); in dasd_generic_last_path_gone()
3658 if (device->state < DASD_STATE_BASIC) in dasd_generic_last_path_gone()
3661 list_for_each_entry(cqr, &device->ccw_queue, devlist) in dasd_generic_last_path_gone()
3667 dasd_device_set_stop_bits(device, DASD_STOPPED_DC_WAIT); in dasd_generic_last_path_gone()
3668 dasd_device_clear_timer(device); in dasd_generic_last_path_gone()
3669 dasd_schedule_device_bh(device); in dasd_generic_last_path_gone()
3674 int dasd_generic_path_operational(struct dasd_device *device) in dasd_generic_path_operational() argument
3676 dev_info(&device->cdev->dev, "A channel path to the device has become " in dasd_generic_path_operational()
3678 DBF_DEV_EVENT(DBF_WARNING, device, "%s", "path operational"); in dasd_generic_path_operational()
3679 dasd_device_remove_stop_bits(device, DASD_STOPPED_DC_WAIT); in dasd_generic_path_operational()
3680 dasd_schedule_device_bh(device); in dasd_generic_path_operational()
3681 if (device->block) { in dasd_generic_path_operational()
3682 dasd_schedule_block_bh(device->block); in dasd_generic_path_operational()
3683 if (device->block->gdp) in dasd_generic_path_operational()
3684 blk_mq_run_hw_queues(device->block->gdp->queue, true); in dasd_generic_path_operational()
3687 if (!device->stopped) in dasd_generic_path_operational()
3696 struct dasd_device *device; in dasd_generic_notify() local
3699 device = dasd_device_from_cdev_locked(cdev); in dasd_generic_notify()
3700 if (IS_ERR(device)) in dasd_generic_notify()
3707 dasd_path_no_path(device); in dasd_generic_notify()
3708 ret = dasd_generic_last_path_gone(device); in dasd_generic_notify()
3712 if (dasd_path_get_opm(device)) in dasd_generic_notify()
3713 ret = dasd_generic_path_operational(device); in dasd_generic_notify()
3716 dasd_put_device(device); in dasd_generic_notify()
3723 struct dasd_device *device; in dasd_generic_path_event() local
3726 device = dasd_device_from_cdev_locked(cdev); in dasd_generic_path_event()
3727 if (IS_ERR(device)) in dasd_generic_path_event()
3730 oldopm = dasd_path_get_opm(device); in dasd_generic_path_event()
3733 dasd_path_notoper(device, chp); in dasd_generic_path_event()
3736 dasd_path_available(device, chp); in dasd_generic_path_event()
3737 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3740 if (!dasd_path_is_operational(device, chp) && in dasd_generic_path_event()
3741 !dasd_path_need_verify(device, chp)) { in dasd_generic_path_event()
3747 dasd_path_available(device, chp); in dasd_generic_path_event()
3748 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3750 DBF_DEV_EVENT(DBF_WARNING, device, "%s", in dasd_generic_path_event()
3752 if (device->discipline->kick_validate) in dasd_generic_path_event()
3753 device->discipline->kick_validate(device); in dasd_generic_path_event()
3756 dasd_path_fcsec_update(device, chp); in dasd_generic_path_event()
3757 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3760 hpfpm = dasd_path_get_hpfpm(device); in dasd_generic_path_event()
3761 ifccpm = dasd_path_get_ifccpm(device); in dasd_generic_path_event()
3762 if (!dasd_path_get_opm(device) && hpfpm) { in dasd_generic_path_event()
3768 if (device->discipline->disable_hpf) in dasd_generic_path_event()
3769 device->discipline->disable_hpf(device); in dasd_generic_path_event()
3770 dasd_device_set_stop_bits(device, DASD_STOPPED_NOT_ACC); in dasd_generic_path_event()
3771 dasd_path_set_tbvpm(device, hpfpm); in dasd_generic_path_event()
3772 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3773 dasd_schedule_requeue(device); in dasd_generic_path_event()
3774 } else if (!dasd_path_get_opm(device) && ifccpm) { in dasd_generic_path_event()
3780 dasd_path_set_tbvpm(device, ifccpm); in dasd_generic_path_event()
3781 dasd_schedule_device_bh(device); in dasd_generic_path_event()
3783 if (oldopm && !dasd_path_get_opm(device) && !hpfpm && !ifccpm) { in dasd_generic_path_event()
3784 dev_warn(&device->cdev->dev, in dasd_generic_path_event()
3786 DBF_DEV_EVENT(DBF_WARNING, device, in dasd_generic_path_event()
3789 dasd_handle_autoquiesce(device, NULL, DASD_EER_NOPATH); in dasd_generic_path_event()
3790 dasd_device_set_stop_bits(device, in dasd_generic_path_event()
3793 dasd_put_device(device); in dasd_generic_path_event()
3797 int dasd_generic_verify_path(struct dasd_device *device, __u8 lpm) in dasd_generic_verify_path() argument
3799 if (!dasd_path_get_opm(device) && lpm) { in dasd_generic_verify_path()
3800 dasd_path_set_opm(device, lpm); in dasd_generic_verify_path()
3801 dasd_generic_path_operational(device); in dasd_generic_verify_path()
3803 dasd_path_add_opm(device, lpm); in dasd_generic_verify_path()
3808 void dasd_generic_space_exhaust(struct dasd_device *device, in dasd_generic_space_exhaust() argument
3812 dasd_handle_autoquiesce(device, NULL, DASD_EER_NOSPC); in dasd_generic_space_exhaust()
3814 if (device->state < DASD_STATE_BASIC) in dasd_generic_space_exhaust()
3822 dasd_device_set_stop_bits(device, DASD_STOPPED_NOSPC); in dasd_generic_space_exhaust()
3823 dasd_device_clear_timer(device); in dasd_generic_space_exhaust()
3824 dasd_schedule_device_bh(device); in dasd_generic_space_exhaust()
3828 void dasd_generic_space_avail(struct dasd_device *device) in dasd_generic_space_avail() argument
3830 dev_info(&device->cdev->dev, "Extent pool space is available\n"); in dasd_generic_space_avail()
3831 DBF_DEV_EVENT(DBF_WARNING, device, "%s", "space available"); in dasd_generic_space_avail()
3833 dasd_device_remove_stop_bits(device, DASD_STOPPED_NOSPC); in dasd_generic_space_avail()
3834 dasd_schedule_device_bh(device); in dasd_generic_space_avail()
3836 if (device->block) { in dasd_generic_space_avail()
3837 dasd_schedule_block_bh(device->block); in dasd_generic_space_avail()
3838 if (device->block->gdp) in dasd_generic_space_avail()
3839 blk_mq_run_hw_queues(device->block->gdp->queue, true); in dasd_generic_space_avail()
3841 if (!device->stopped) in dasd_generic_space_avail()
3849 int dasd_generic_requeue_all_requests(struct dasd_device *device) in dasd_generic_requeue_all_requests() argument
3851 struct dasd_block *block = device->block; in dasd_generic_requeue_all_requests()
3881 dasd_schedule_device_bh(device); in dasd_generic_requeue_all_requests()
3888 struct dasd_device *device = container_of(work, struct dasd_device, in do_requeue_requests() local
3890 dasd_generic_requeue_all_requests(device); in do_requeue_requests()
3891 dasd_device_remove_stop_bits(device, DASD_STOPPED_NOT_ACC); in do_requeue_requests()
3892 if (device->block) in do_requeue_requests()
3893 dasd_schedule_block_bh(device->block); in do_requeue_requests()
3894 dasd_put_device(device); in do_requeue_requests()
3897 void dasd_schedule_requeue(struct dasd_device *device) in dasd_schedule_requeue() argument
3899 dasd_get_device(device); in dasd_schedule_requeue()
3901 if (!schedule_work(&device->requeue_requests)) in dasd_schedule_requeue()
3902 dasd_put_device(device); in dasd_schedule_requeue()
3906 static int dasd_handle_autoquiesce(struct dasd_device *device, in dasd_handle_autoquiesce() argument
3911 if (dasd_eer_enabled(device)) in dasd_handle_autoquiesce()
3912 dasd_eer_write(device, cqr, reason); in dasd_handle_autoquiesce()
3914 if (!test_bit(reason, &device->aq_mask)) in dasd_handle_autoquiesce()
3918 if (dasd_eer_enabled(device)) in dasd_handle_autoquiesce()
3919 dasd_eer_write(device, NULL, DASD_EER_AUTOQUIESCE); in dasd_handle_autoquiesce()
3921 dev_info(&device->cdev->dev, in dasd_handle_autoquiesce()
3923 dasd_device_set_stop_bits(device, DASD_STOPPED_QUIESCE); in dasd_handle_autoquiesce()
3925 if (device->features & DASD_FEATURE_REQUEUEQUIESCE) in dasd_handle_autoquiesce()
3926 dasd_schedule_requeue(device); in dasd_handle_autoquiesce()
3931 static struct dasd_ccw_req *dasd_generic_build_rdc(struct dasd_device *device, in dasd_generic_build_rdc() argument
3938 cqr = dasd_smalloc_request(magic, 1 /* RDC */, rdc_buffer_size, device, in dasd_generic_build_rdc()
3942 DBF_EVENT_DEVID(DBF_WARNING, device->cdev, "%s", in dasd_generic_build_rdc()
3952 cqr->startdev = device; in dasd_generic_build_rdc()
3953 cqr->memdev = device; in dasd_generic_build_rdc()
3962 int dasd_generic_read_dev_chars(struct dasd_device *device, int magic, in dasd_generic_read_dev_chars() argument
3968 cqr = dasd_generic_build_rdc(device, rdc_buffer_size, magic); in dasd_generic_read_dev_chars()
4015 struct dasd_device *device; in dasd_generic_shutdown() local
4017 device = dasd_device_from_cdev(cdev); in dasd_generic_shutdown()
4018 if (IS_ERR(device)) in dasd_generic_shutdown()
4021 if (device->block) in dasd_generic_shutdown()
4022 dasd_schedule_block_bh(device->block); in dasd_generic_shutdown()
4024 dasd_schedule_device_bh(device); in dasd_generic_shutdown()
4026 wait_event(shutdown_waitq, _wait_for_empty_queues(device)); in dasd_generic_shutdown()