Lines Matching +full:long +full:- +full:summary

1 // SPDX-License-Identifier: GPL-2.0
9 #define KMSG_COMPONENT "dasd-eckd"
25 * - PAV and DASD alias management is specific to the eckd discipline.
26 * - A device is connected to an lcu as long as the device exists.
31 * - The dasd_alias_add_device / dasd_alias_remove_device
33 * - A summary unit check is a rare occasion, but it is mandatory to
36 * - dasd_alias_get_start_dev will find an alias device that can be used
57 if (!strncmp(pos->uid.vendor, uid->vendor, in _find_server()
58 sizeof(uid->vendor)) in _find_server()
59 && !strncmp(pos->uid.serial, uid->serial, in _find_server()
60 sizeof(uid->serial))) in _find_server()
70 list_for_each_entry(pos, &server->lculist, lcu) { in _find_lcu()
71 if (pos->uid.ssid == uid->ssid) in _find_lcu()
84 if (lcu->pav == HYPER_PAV) { in _find_group()
85 if (list_empty(&lcu->grouplist)) in _find_group()
88 return list_first_entry(&lcu->grouplist, in _find_group()
93 if (uid->type == UA_BASE_DEVICE) in _find_group()
94 search_unit_addr = uid->real_unit_addr; in _find_group()
96 search_unit_addr = uid->base_unit_addr; in _find_group()
97 list_for_each_entry(pos, &lcu->grouplist, group) { in _find_group()
98 if (pos->uid.base_unit_addr == search_unit_addr && in _find_group()
99 !strncmp(pos->uid.vduit, uid->vduit, sizeof(uid->vduit))) in _find_group()
111 return ERR_PTR(-ENOMEM); in _allocate_server()
112 memcpy(server->uid.vendor, uid->vendor, sizeof(uid->vendor)); in _allocate_server()
113 memcpy(server->uid.serial, uid->serial, sizeof(uid->serial)); in _allocate_server()
114 INIT_LIST_HEAD(&server->server); in _allocate_server()
115 INIT_LIST_HEAD(&server->lculist); in _allocate_server()
130 return ERR_PTR(-ENOMEM); in _allocate_lcu()
131 lcu->uac = kzalloc(sizeof(*(lcu->uac)), GFP_KERNEL | GFP_DMA); in _allocate_lcu()
132 if (!lcu->uac) in _allocate_lcu()
134 lcu->rsu_cqr = kzalloc(sizeof(*lcu->rsu_cqr), GFP_KERNEL | GFP_DMA); in _allocate_lcu()
135 if (!lcu->rsu_cqr) in _allocate_lcu()
137 lcu->rsu_cqr->cpaddr = kzalloc(sizeof(struct ccw1), in _allocate_lcu()
139 if (!lcu->rsu_cqr->cpaddr) in _allocate_lcu()
141 lcu->rsu_cqr->data = kzalloc(16, GFP_KERNEL | GFP_DMA); in _allocate_lcu()
142 if (!lcu->rsu_cqr->data) in _allocate_lcu()
145 memcpy(lcu->uid.vendor, uid->vendor, sizeof(uid->vendor)); in _allocate_lcu()
146 memcpy(lcu->uid.serial, uid->serial, sizeof(uid->serial)); in _allocate_lcu()
147 lcu->uid.ssid = uid->ssid; in _allocate_lcu()
148 lcu->pav = NO_PAV; in _allocate_lcu()
149 lcu->flags = NEED_UAC_UPDATE | UPDATE_PENDING; in _allocate_lcu()
150 INIT_LIST_HEAD(&lcu->lcu); in _allocate_lcu()
151 INIT_LIST_HEAD(&lcu->inactive_devices); in _allocate_lcu()
152 INIT_LIST_HEAD(&lcu->active_devices); in _allocate_lcu()
153 INIT_LIST_HEAD(&lcu->grouplist); in _allocate_lcu()
154 INIT_WORK(&lcu->suc_data.worker, summary_unit_check_handling_work); in _allocate_lcu()
155 INIT_DELAYED_WORK(&lcu->ruac_data.dwork, lcu_update_work); in _allocate_lcu()
156 spin_lock_init(&lcu->lock); in _allocate_lcu()
157 init_completion(&lcu->lcu_setup); in _allocate_lcu()
161 kfree(lcu->rsu_cqr->cpaddr); in _allocate_lcu()
163 kfree(lcu->rsu_cqr); in _allocate_lcu()
165 kfree(lcu->uac); in _allocate_lcu()
168 return ERR_PTR(-ENOMEM); in _allocate_lcu()
173 kfree(lcu->rsu_cqr->data); in _free_lcu()
174 kfree(lcu->rsu_cqr->cpaddr); in _free_lcu()
175 kfree(lcu->rsu_cqr); in _free_lcu()
176 kfree(lcu->uac); in _free_lcu()
185 * Negative return code indicates that something went wrong (e.g. -ENOMEM)
189 struct dasd_eckd_private *private = device->private; in dasd_alias_make_device_known_to_lcu()
190 unsigned long flags; in dasd_alias_make_device_known_to_lcu()
195 device->discipline->get_uid(device, &uid); in dasd_alias_make_device_known_to_lcu()
206 list_add(&newserver->server, &aliastree.serverlist); in dasd_alias_make_device_known_to_lcu()
223 list_add(&newlcu->lcu, &server->lculist); in dasd_alias_make_device_known_to_lcu()
230 spin_lock(&lcu->lock); in dasd_alias_make_device_known_to_lcu()
231 list_add(&device->alias_list, &lcu->inactive_devices); in dasd_alias_make_device_known_to_lcu()
232 private->lcu = lcu; in dasd_alias_make_device_known_to_lcu()
233 spin_unlock(&lcu->lock); in dasd_alias_make_device_known_to_lcu()
246 struct dasd_eckd_private *private = device->private; in dasd_alias_disconnect_device_from_lcu()
247 unsigned long flags; in dasd_alias_disconnect_device_from_lcu()
253 lcu = private->lcu; in dasd_alias_disconnect_device_from_lcu()
257 device->discipline->get_uid(device, &uid); in dasd_alias_disconnect_device_from_lcu()
258 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
260 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
261 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
262 cancel_work_sync(&lcu->suc_data.worker); in dasd_alias_disconnect_device_from_lcu()
263 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
264 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
266 lcu->suc_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
270 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
271 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
273 cancel_delayed_work_sync(&lcu->ruac_data.dwork); in dasd_alias_disconnect_device_from_lcu()
274 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
275 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
277 lcu->ruac_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
280 private->lcu = NULL; in dasd_alias_disconnect_device_from_lcu()
281 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
284 spin_lock(&lcu->lock); in dasd_alias_disconnect_device_from_lcu()
285 list_del_init(&device->alias_list); in dasd_alias_disconnect_device_from_lcu()
286 if (list_empty(&lcu->grouplist) && in dasd_alias_disconnect_device_from_lcu()
287 list_empty(&lcu->active_devices) && in dasd_alias_disconnect_device_from_lcu()
288 list_empty(&lcu->inactive_devices)) { in dasd_alias_disconnect_device_from_lcu()
289 list_del(&lcu->lcu); in dasd_alias_disconnect_device_from_lcu()
290 spin_unlock(&lcu->lock); in dasd_alias_disconnect_device_from_lcu()
296 spin_unlock(&lcu->lock); in dasd_alias_disconnect_device_from_lcu()
299 if (server && list_empty(&server->lculist)) { in dasd_alias_disconnect_device_from_lcu()
300 list_del(&server->server); in dasd_alias_disconnect_device_from_lcu()
317 struct dasd_eckd_private *private = device->private; in _add_device_to_lcu()
321 spin_lock(get_ccwdev_lock(device->cdev)); in _add_device_to_lcu()
322 private->uid.type = lcu->uac->unit[private->uid.real_unit_addr].ua_type; in _add_device_to_lcu()
323 private->uid.base_unit_addr = in _add_device_to_lcu()
324 lcu->uac->unit[private->uid.real_unit_addr].base_ua; in _add_device_to_lcu()
325 uid = private->uid; in _add_device_to_lcu()
326 spin_unlock(get_ccwdev_lock(device->cdev)); in _add_device_to_lcu()
328 if (lcu->pav == NO_PAV) { in _add_device_to_lcu()
329 list_move(&device->alias_list, &lcu->active_devices); in _add_device_to_lcu()
336 return -ENOMEM; in _add_device_to_lcu()
337 memcpy(group->uid.vendor, uid.vendor, sizeof(uid.vendor)); in _add_device_to_lcu()
338 memcpy(group->uid.serial, uid.serial, sizeof(uid.serial)); in _add_device_to_lcu()
339 group->uid.ssid = uid.ssid; in _add_device_to_lcu()
341 group->uid.base_unit_addr = uid.real_unit_addr; in _add_device_to_lcu()
343 group->uid.base_unit_addr = uid.base_unit_addr; in _add_device_to_lcu()
344 memcpy(group->uid.vduit, uid.vduit, sizeof(uid.vduit)); in _add_device_to_lcu()
345 INIT_LIST_HEAD(&group->group); in _add_device_to_lcu()
346 INIT_LIST_HEAD(&group->baselist); in _add_device_to_lcu()
347 INIT_LIST_HEAD(&group->aliaslist); in _add_device_to_lcu()
348 list_add(&group->group, &lcu->grouplist); in _add_device_to_lcu()
351 list_move(&device->alias_list, &group->baselist); in _add_device_to_lcu()
353 list_move(&device->alias_list, &group->aliaslist); in _add_device_to_lcu()
354 private->pavgroup = group; in _add_device_to_lcu()
361 struct dasd_eckd_private *private = device->private; in _remove_device_from_lcu()
364 list_move(&device->alias_list, &lcu->inactive_devices); in _remove_device_from_lcu()
365 group = private->pavgroup; in _remove_device_from_lcu()
368 private->pavgroup = NULL; in _remove_device_from_lcu()
369 if (list_empty(&group->baselist) && list_empty(&group->aliaslist)) { in _remove_device_from_lcu()
370 list_del(&group->group); in _remove_device_from_lcu()
374 if (group->next == device) in _remove_device_from_lcu()
375 group->next = NULL; in _remove_device_from_lcu()
391 if (cqr->intrc == -ENODEV) in suborder_not_supported()
394 if (cqr->intrc == -ENOLINK) in suborder_not_supported()
397 if (cqr->intrc == -EPERM) in suborder_not_supported()
400 sense = dasd_get_sense(&cqr->irb); in suborder_not_supported()
408 /* command reject, Format 0 MSG 4 - invalid parameter */ in suborder_not_supported()
422 unsigned long flags; in read_unit_address_configuration()
429 cqr->startdev = device; in read_unit_address_configuration()
430 cqr->memdev = device; in read_unit_address_configuration()
431 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in read_unit_address_configuration()
432 cqr->retries = 10; in read_unit_address_configuration()
433 cqr->expires = 20 * HZ; in read_unit_address_configuration()
436 prssdp = (struct dasd_psf_prssd_data *) cqr->data; in read_unit_address_configuration()
438 prssdp->order = PSF_ORDER_PRSSD; in read_unit_address_configuration()
439 prssdp->suborder = 0x0e; /* Read unit address configuration */ in read_unit_address_configuration()
442 ccw = cqr->cpaddr; in read_unit_address_configuration()
443 ccw->cmd_code = DASD_ECKD_CCW_PSF; in read_unit_address_configuration()
444 ccw->count = sizeof(struct dasd_psf_prssd_data); in read_unit_address_configuration()
445 ccw->flags |= CCW_FLAG_CC; in read_unit_address_configuration()
446 ccw->cda = (__u32)(addr_t) prssdp; in read_unit_address_configuration()
448 /* Read Subsystem Data - feature codes */ in read_unit_address_configuration()
449 memset(lcu->uac, 0, sizeof(*(lcu->uac))); in read_unit_address_configuration()
452 ccw->cmd_code = DASD_ECKD_CCW_RSSD; in read_unit_address_configuration()
453 ccw->count = sizeof(*(lcu->uac)); in read_unit_address_configuration()
454 ccw->cda = (__u32)(addr_t) lcu->uac; in read_unit_address_configuration()
456 cqr->buildclk = get_tod_clock(); in read_unit_address_configuration()
457 cqr->status = DASD_CQR_FILLED; in read_unit_address_configuration()
459 /* need to unset flag here to detect race with summary unit check */ in read_unit_address_configuration()
460 spin_lock_irqsave(&lcu->lock, flags); in read_unit_address_configuration()
461 lcu->flags &= ~NEED_UAC_UPDATE; in read_unit_address_configuration()
462 spin_unlock_irqrestore(&lcu->lock, flags); in read_unit_address_configuration()
470 rc = -EOPNOTSUPP; in read_unit_address_configuration()
473 spin_lock_irqsave(&lcu->lock, flags); in read_unit_address_configuration()
474 lcu->flags |= NEED_UAC_UPDATE; in read_unit_address_configuration()
475 spin_unlock_irqrestore(&lcu->lock, flags); in read_unit_address_configuration()
478 dasd_sfree_request(cqr, cqr->memdev); in read_unit_address_configuration()
484 unsigned long flags; in _lcu_update()
490 spin_lock_irqsave(&lcu->lock, flags); in _lcu_update()
491 list_for_each_entry_safe(pavgroup, tempgroup, &lcu->grouplist, group) { in _lcu_update()
492 list_for_each_entry_safe(device, tempdev, &pavgroup->baselist, in _lcu_update()
494 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
495 private = device->private; in _lcu_update()
496 private->pavgroup = NULL; in _lcu_update()
498 list_for_each_entry_safe(device, tempdev, &pavgroup->aliaslist, in _lcu_update()
500 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
501 private = device->private; in _lcu_update()
502 private->pavgroup = NULL; in _lcu_update()
504 list_del(&pavgroup->group); in _lcu_update()
507 spin_unlock_irqrestore(&lcu->lock, flags); in _lcu_update()
513 spin_lock_irqsave(&lcu->lock, flags); in _lcu_update()
520 if (lcu->flags & NEED_UAC_UPDATE) in _lcu_update()
522 lcu->pav = NO_PAV; in _lcu_update()
524 switch (lcu->uac->unit[i].ua_type) { in _lcu_update()
526 lcu->pav = BASE_PAV; in _lcu_update()
529 lcu->pav = HYPER_PAV; in _lcu_update()
532 if (lcu->pav != NO_PAV) in _lcu_update()
536 list_for_each_entry_safe(device, tempdev, &lcu->active_devices, in _lcu_update()
541 spin_unlock_irqrestore(&lcu->lock, flags); in _lcu_update()
550 unsigned long flags; in lcu_update_work()
555 device = ruac_data->device; in lcu_update_work()
562 spin_lock_irqsave(&lcu->lock, flags); in lcu_update_work()
563 if ((rc && (rc != -EOPNOTSUPP)) || (lcu->flags & NEED_UAC_UPDATE)) { in lcu_update_work()
566 if (!schedule_delayed_work(&lcu->ruac_data.dwork, 30*HZ)) in lcu_update_work()
570 lcu->ruac_data.device = NULL; in lcu_update_work()
571 lcu->flags &= ~UPDATE_PENDING; in lcu_update_work()
573 spin_unlock_irqrestore(&lcu->lock, flags); in lcu_update_work()
582 lcu->flags |= NEED_UAC_UPDATE; in _schedule_lcu_update()
583 if (lcu->ruac_data.device) { in _schedule_lcu_update()
587 if (device && !list_empty(&device->alias_list)) in _schedule_lcu_update()
590 if (!usedev && !list_empty(&lcu->grouplist)) { in _schedule_lcu_update()
591 group = list_first_entry(&lcu->grouplist, in _schedule_lcu_update()
593 if (!list_empty(&group->baselist)) in _schedule_lcu_update()
594 usedev = list_first_entry(&group->baselist, in _schedule_lcu_update()
597 else if (!list_empty(&group->aliaslist)) in _schedule_lcu_update()
598 usedev = list_first_entry(&group->aliaslist, in _schedule_lcu_update()
602 if (!usedev && !list_empty(&lcu->active_devices)) { in _schedule_lcu_update()
603 usedev = list_first_entry(&lcu->active_devices, in _schedule_lcu_update()
611 return -EINVAL; in _schedule_lcu_update()
613 lcu->ruac_data.device = usedev; in _schedule_lcu_update()
614 if (!schedule_delayed_work(&lcu->ruac_data.dwork, 0)) in _schedule_lcu_update()
621 struct dasd_eckd_private *private = device->private; in dasd_alias_add_device()
622 __u8 uaddr = private->uid.real_unit_addr; in dasd_alias_add_device()
623 struct alias_lcu *lcu = private->lcu; in dasd_alias_add_device()
624 unsigned long flags; in dasd_alias_add_device()
628 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_add_device()
633 if (private->uid.type != lcu->uac->unit[uaddr].ua_type) { in dasd_alias_add_device()
634 lcu->flags |= UPDATE_PENDING; in dasd_alias_add_device()
636 "uid type mismatch - trigger rescan"); in dasd_alias_add_device()
638 if (!(lcu->flags & UPDATE_PENDING)) { in dasd_alias_add_device()
641 lcu->flags |= UPDATE_PENDING; in dasd_alias_add_device()
643 if (lcu->flags & UPDATE_PENDING) { in dasd_alias_add_device()
644 list_move(&device->alias_list, &lcu->active_devices); in dasd_alias_add_device()
645 private->pavgroup = NULL; in dasd_alias_add_device()
648 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_add_device()
654 struct dasd_eckd_private *private = device->private; in dasd_alias_update_add_device()
656 private->lcu->flags |= UPDATE_PENDING; in dasd_alias_update_add_device()
662 struct dasd_eckd_private *private = device->private; in dasd_alias_remove_device()
663 struct alias_lcu *lcu = private->lcu; in dasd_alias_remove_device()
664 unsigned long flags; in dasd_alias_remove_device()
669 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_remove_device()
671 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_remove_device()
677 struct dasd_eckd_private *alias_priv, *private = base_device->private; in dasd_alias_get_start_dev()
678 struct alias_lcu *lcu = private->lcu; in dasd_alias_get_start_dev()
681 unsigned long flags; in dasd_alias_get_start_dev()
685 if (lcu->pav == NO_PAV || in dasd_alias_get_start_dev()
686 lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING)) in dasd_alias_get_start_dev()
688 if (unlikely(!(private->features.feature[8] & 0x01))) { in dasd_alias_get_start_dev()
699 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_get_start_dev()
700 group = private->pavgroup; in dasd_alias_get_start_dev()
702 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_get_start_dev()
705 alias_device = group->next; in dasd_alias_get_start_dev()
707 if (list_empty(&group->aliaslist)) { in dasd_alias_get_start_dev()
708 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_get_start_dev()
711 alias_device = list_first_entry(&group->aliaslist, in dasd_alias_get_start_dev()
716 if (list_is_last(&alias_device->alias_list, &group->aliaslist)) in dasd_alias_get_start_dev()
717 group->next = list_first_entry(&group->aliaslist, in dasd_alias_get_start_dev()
720 group->next = list_first_entry(&alias_device->alias_list, in dasd_alias_get_start_dev()
722 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_get_start_dev()
723 alias_priv = alias_device->private; in dasd_alias_get_start_dev()
724 if ((alias_priv->count < private->count) && !alias_device->stopped && in dasd_alias_get_start_dev()
725 !test_bit(DASD_FLAG_OFFLINE, &alias_device->flags)) in dasd_alias_get_start_dev()
732 * Summary unit check handling depends on the way alias devices
743 cqr = lcu->rsu_cqr; in reset_summary_unit_check()
744 memcpy((char *) &cqr->magic, "ECKD", 4); in reset_summary_unit_check()
745 ASCEBC((char *) &cqr->magic, 4); in reset_summary_unit_check()
746 ccw = cqr->cpaddr; in reset_summary_unit_check()
747 ccw->cmd_code = DASD_ECKD_CCW_RSCK; in reset_summary_unit_check()
748 ccw->flags = CCW_FLAG_SLI; in reset_summary_unit_check()
749 ccw->count = 16; in reset_summary_unit_check()
750 ccw->cda = (__u32)(addr_t) cqr->data; in reset_summary_unit_check()
751 ((char *)cqr->data)[0] = reason; in reset_summary_unit_check()
753 clear_bit(DASD_CQR_FLAGS_USE_ERP, &cqr->flags); in reset_summary_unit_check()
754 cqr->retries = 255; /* set retry counter to enable basic ERP */ in reset_summary_unit_check()
755 cqr->startdev = device; in reset_summary_unit_check()
756 cqr->memdev = device; in reset_summary_unit_check()
757 cqr->block = NULL; in reset_summary_unit_check()
758 cqr->expires = 5 * HZ; in reset_summary_unit_check()
759 cqr->buildclk = get_tod_clock(); in reset_summary_unit_check()
760 cqr->status = DASD_CQR_FILLED; in reset_summary_unit_check()
773 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _restart_all_base_devices_on_lcu()
774 private = device->private; in _restart_all_base_devices_on_lcu()
775 if (private->uid.type != UA_BASE_DEVICE) in _restart_all_base_devices_on_lcu()
777 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
780 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _restart_all_base_devices_on_lcu()
781 private = device->private; in _restart_all_base_devices_on_lcu()
782 if (private->uid.type != UA_BASE_DEVICE) in _restart_all_base_devices_on_lcu()
784 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
787 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _restart_all_base_devices_on_lcu()
788 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _restart_all_base_devices_on_lcu()
789 dasd_schedule_block_bh(device->block); in _restart_all_base_devices_on_lcu()
800 unsigned long flags; in flush_all_alias_devices_on_lcu()
814 spin_lock_irqsave(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
815 list_for_each_entry_safe(device, temp, &lcu->active_devices, in flush_all_alias_devices_on_lcu()
817 private = device->private; in flush_all_alias_devices_on_lcu()
818 if (private->uid.type == UA_BASE_DEVICE) in flush_all_alias_devices_on_lcu()
820 list_move(&device->alias_list, &active); in flush_all_alias_devices_on_lcu()
823 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in flush_all_alias_devices_on_lcu()
824 list_splice_init(&pavgroup->aliaslist, &active); in flush_all_alias_devices_on_lcu()
829 spin_unlock_irqrestore(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
831 spin_lock_irqsave(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
838 list_move(&device->alias_list, &lcu->active_devices); in flush_all_alias_devices_on_lcu()
839 private = device->private; in flush_all_alias_devices_on_lcu()
840 private->pavgroup = NULL; in flush_all_alias_devices_on_lcu()
843 spin_unlock_irqrestore(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
851 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _stop_all_devices_on_lcu()
852 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
854 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
856 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _stop_all_devices_on_lcu()
857 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
859 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
861 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _stop_all_devices_on_lcu()
862 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _stop_all_devices_on_lcu()
863 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
865 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
867 list_for_each_entry(device, &pavgroup->aliaslist, alias_list) { in _stop_all_devices_on_lcu()
868 spin_lock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
870 spin_unlock(get_ccwdev_lock(device->cdev)); in _stop_all_devices_on_lcu()
880 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _unstop_all_devices_on_lcu()
881 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
883 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
885 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _unstop_all_devices_on_lcu()
886 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
888 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
890 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _unstop_all_devices_on_lcu()
891 list_for_each_entry(device, &pavgroup->baselist, alias_list) { in _unstop_all_devices_on_lcu()
892 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
894 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
896 list_for_each_entry(device, &pavgroup->aliaslist, alias_list) { in _unstop_all_devices_on_lcu()
897 spin_lock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
899 spin_unlock(get_ccwdev_lock(device->cdev)); in _unstop_all_devices_on_lcu()
908 unsigned long flags; in summary_unit_check_handling_work()
914 device = suc_data->device; in summary_unit_check_handling_work()
919 /* 2. reset summary unit check */ in summary_unit_check_handling_work()
920 spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags); in summary_unit_check_handling_work()
923 spin_unlock_irqrestore(get_ccwdev_lock(device->cdev), flags); in summary_unit_check_handling_work()
924 reset_summary_unit_check(lcu, device, suc_data->reason); in summary_unit_check_handling_work()
926 spin_lock_irqsave(&lcu->lock, flags); in summary_unit_check_handling_work()
931 lcu->suc_data.device = NULL; in summary_unit_check_handling_work()
933 spin_unlock_irqrestore(&lcu->lock, flags); in summary_unit_check_handling_work()
940 struct dasd_eckd_private *private = device->private; in dasd_alias_handle_summary_unit_check()
942 unsigned long flags; in dasd_alias_handle_summary_unit_check()
944 lcu = private->lcu; in dasd_alias_handle_summary_unit_check()
947 "device not ready to handle summary" in dasd_alias_handle_summary_unit_check()
951 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_handle_summary_unit_check()
955 if (list_empty(&device->alias_list)) { in dasd_alias_handle_summary_unit_check()
958 " don't do summary unit check handling"); in dasd_alias_handle_summary_unit_check()
961 if (lcu->suc_data.device) { in dasd_alias_handle_summary_unit_check()
964 "previous instance of summary unit check worker" in dasd_alias_handle_summary_unit_check()
970 lcu->flags |= NEED_UAC_UPDATE | UPDATE_PENDING; in dasd_alias_handle_summary_unit_check()
971 lcu->suc_data.reason = private->suc_reason; in dasd_alias_handle_summary_unit_check()
972 lcu->suc_data.device = device; in dasd_alias_handle_summary_unit_check()
974 if (!schedule_work(&lcu->suc_data.worker)) in dasd_alias_handle_summary_unit_check()
977 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_handle_summary_unit_check()
979 clear_bit(DASD_FLAG_SUC, &device->flags); in dasd_alias_handle_summary_unit_check()