Lines Matching refs:lcu

69 	list_for_each_entry(pos, &server->lculist, lcu) {  in _find_lcu()
76 static struct alias_pav_group *_find_group(struct alias_lcu *lcu, in _find_group() argument
83 if (lcu->pav == HYPER_PAV) { in _find_group()
84 if (list_empty(&lcu->grouplist)) in _find_group()
87 return list_first_entry(&lcu->grouplist, in _find_group()
96 list_for_each_entry(pos, &lcu->grouplist, group) { in _find_group()
125 struct alias_lcu *lcu; in _allocate_lcu() local
127 lcu = kzalloc(sizeof(*lcu), GFP_KERNEL); in _allocate_lcu()
128 if (!lcu) in _allocate_lcu()
130 lcu->uac = kzalloc(sizeof(*(lcu->uac)), GFP_KERNEL | GFP_DMA); in _allocate_lcu()
131 if (!lcu->uac) in _allocate_lcu()
133 lcu->rsu_cqr = kzalloc(sizeof(*lcu->rsu_cqr), GFP_KERNEL | GFP_DMA); in _allocate_lcu()
134 if (!lcu->rsu_cqr) in _allocate_lcu()
136 lcu->rsu_cqr->cpaddr = kzalloc(sizeof(struct ccw1), in _allocate_lcu()
138 if (!lcu->rsu_cqr->cpaddr) in _allocate_lcu()
140 lcu->rsu_cqr->data = kzalloc(16, GFP_KERNEL | GFP_DMA); in _allocate_lcu()
141 if (!lcu->rsu_cqr->data) in _allocate_lcu()
144 memcpy(lcu->uid.vendor, uid->vendor, sizeof(uid->vendor)); in _allocate_lcu()
145 memcpy(lcu->uid.serial, uid->serial, sizeof(uid->serial)); in _allocate_lcu()
146 lcu->uid.ssid = uid->ssid; in _allocate_lcu()
147 lcu->pav = NO_PAV; in _allocate_lcu()
148 lcu->flags = NEED_UAC_UPDATE | UPDATE_PENDING; in _allocate_lcu()
149 INIT_LIST_HEAD(&lcu->lcu); in _allocate_lcu()
150 INIT_LIST_HEAD(&lcu->inactive_devices); in _allocate_lcu()
151 INIT_LIST_HEAD(&lcu->active_devices); in _allocate_lcu()
152 INIT_LIST_HEAD(&lcu->grouplist); in _allocate_lcu()
153 INIT_WORK(&lcu->suc_data.worker, summary_unit_check_handling_work); in _allocate_lcu()
154 INIT_DELAYED_WORK(&lcu->ruac_data.dwork, lcu_update_work); in _allocate_lcu()
155 spin_lock_init(&lcu->lock); in _allocate_lcu()
156 init_completion(&lcu->lcu_setup); in _allocate_lcu()
157 return lcu; in _allocate_lcu()
160 kfree(lcu->rsu_cqr->cpaddr); in _allocate_lcu()
162 kfree(lcu->rsu_cqr); in _allocate_lcu()
164 kfree(lcu->uac); in _allocate_lcu()
166 kfree(lcu); in _allocate_lcu()
170 static void _free_lcu(struct alias_lcu *lcu) in _free_lcu() argument
172 kfree(lcu->rsu_cqr->data); in _free_lcu()
173 kfree(lcu->rsu_cqr->cpaddr); in _free_lcu()
174 kfree(lcu->rsu_cqr); in _free_lcu()
175 kfree(lcu->uac); in _free_lcu()
176 kfree(lcu); in _free_lcu()
191 struct alias_lcu *lcu, *newlcu; in dasd_alias_make_device_known_to_lcu() local
215 lcu = _find_lcu(server, &uid); in dasd_alias_make_device_known_to_lcu()
216 if (!lcu) { in dasd_alias_make_device_known_to_lcu()
222 lcu = _find_lcu(server, &uid); in dasd_alias_make_device_known_to_lcu()
223 if (!lcu) { in dasd_alias_make_device_known_to_lcu()
224 list_add(&newlcu->lcu, &server->lculist); in dasd_alias_make_device_known_to_lcu()
225 lcu = newlcu; in dasd_alias_make_device_known_to_lcu()
231 spin_lock(&lcu->lock); in dasd_alias_make_device_known_to_lcu()
232 list_add(&device->alias_list, &lcu->inactive_devices); in dasd_alias_make_device_known_to_lcu()
233 private->lcu = lcu; in dasd_alias_make_device_known_to_lcu()
234 spin_unlock(&lcu->lock); in dasd_alias_make_device_known_to_lcu()
249 struct alias_lcu *lcu; in dasd_alias_disconnect_device_from_lcu() local
255 lcu = private->lcu; in dasd_alias_disconnect_device_from_lcu()
257 if (!lcu) in dasd_alias_disconnect_device_from_lcu()
260 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
263 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
264 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
265 cancel_work_sync(&lcu->suc_data.worker); in dasd_alias_disconnect_device_from_lcu()
266 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
267 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
269 lcu->suc_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
273 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
274 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
276 cancel_delayed_work_sync(&lcu->ruac_data.dwork); in dasd_alias_disconnect_device_from_lcu()
277 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
278 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
280 lcu->ruac_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
283 private->lcu = NULL; in dasd_alias_disconnect_device_from_lcu()
284 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
287 spin_lock(&lcu->lock); in dasd_alias_disconnect_device_from_lcu()
288 if (list_empty(&lcu->grouplist) && in dasd_alias_disconnect_device_from_lcu()
289 list_empty(&lcu->active_devices) && in dasd_alias_disconnect_device_from_lcu()
290 list_empty(&lcu->inactive_devices)) { in dasd_alias_disconnect_device_from_lcu()
291 list_del(&lcu->lcu); in dasd_alias_disconnect_device_from_lcu()
292 spin_unlock(&lcu->lock); in dasd_alias_disconnect_device_from_lcu()
293 _free_lcu(lcu); in dasd_alias_disconnect_device_from_lcu()
294 lcu = NULL; in dasd_alias_disconnect_device_from_lcu()
297 _schedule_lcu_update(lcu, NULL); in dasd_alias_disconnect_device_from_lcu()
298 spin_unlock(&lcu->lock); in dasd_alias_disconnect_device_from_lcu()
314 static int _add_device_to_lcu(struct alias_lcu *lcu, in _add_device_to_lcu() argument
330 private->uid.type = lcu->uac->unit[private->uid.real_unit_addr].ua_type; in _add_device_to_lcu()
332 lcu->uac->unit[private->uid.real_unit_addr].base_ua; in _add_device_to_lcu()
339 if (lcu->pav == NO_PAV) { in _add_device_to_lcu()
340 list_move(&device->alias_list, &lcu->active_devices); in _add_device_to_lcu()
344 group = _find_group(lcu, &uid); in _add_device_to_lcu()
360 list_add(&group->group, &lcu->grouplist); in _add_device_to_lcu()
370 static void _remove_device_from_lcu(struct alias_lcu *lcu, in _remove_device_from_lcu() argument
377 list_move(&device->alias_list, &lcu->inactive_devices); in _remove_device_from_lcu()
415 struct alias_lcu *lcu) in read_unit_address_configuration() argument
448 memset(lcu->uac, 0, sizeof(*(lcu->uac))); in read_unit_address_configuration()
452 ccw->count = sizeof(*(lcu->uac)); in read_unit_address_configuration()
453 ccw->cda = (__u32)(addr_t) lcu->uac; in read_unit_address_configuration()
459 spin_lock_irqsave(&lcu->lock, flags); in read_unit_address_configuration()
460 lcu->flags &= ~NEED_UAC_UPDATE; in read_unit_address_configuration()
461 spin_unlock_irqrestore(&lcu->lock, flags); in read_unit_address_configuration()
469 spin_lock_irqsave(&lcu->lock, flags); in read_unit_address_configuration()
470 lcu->flags |= NEED_UAC_UPDATE; in read_unit_address_configuration()
471 spin_unlock_irqrestore(&lcu->lock, flags); in read_unit_address_configuration()
477 static int _lcu_update(struct dasd_device *refdev, struct alias_lcu *lcu) in _lcu_update() argument
485 spin_lock_irqsave(&lcu->lock, flags); in _lcu_update()
486 list_for_each_entry_safe(pavgroup, tempgroup, &lcu->grouplist, group) { in _lcu_update()
489 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
495 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
502 spin_unlock_irqrestore(&lcu->lock, flags); in _lcu_update()
504 rc = read_unit_address_configuration(refdev, lcu); in _lcu_update()
511 spin_lock(&lcu->lock); in _lcu_update()
512 lcu->pav = NO_PAV; in _lcu_update()
514 switch (lcu->uac->unit[i].ua_type) { in _lcu_update()
516 lcu->pav = BASE_PAV; in _lcu_update()
519 lcu->pav = HYPER_PAV; in _lcu_update()
522 if (lcu->pav != NO_PAV) in _lcu_update()
526 list_for_each_entry_safe(device, tempdev, &lcu->active_devices, in _lcu_update()
528 _add_device_to_lcu(lcu, device, refdev); in _lcu_update()
530 spin_unlock(&lcu->lock); in _lcu_update()
537 struct alias_lcu *lcu; in lcu_update_work() local
544 lcu = container_of(ruac_data, struct alias_lcu, ruac_data); in lcu_update_work()
546 rc = _lcu_update(device, lcu); in lcu_update_work()
552 spin_lock_irqsave(&lcu->lock, flags); in lcu_update_work()
553 if ((rc && (rc != -EOPNOTSUPP)) || (lcu->flags & NEED_UAC_UPDATE)) { in lcu_update_work()
556 if (!schedule_delayed_work(&lcu->ruac_data.dwork, 30*HZ)) in lcu_update_work()
560 lcu->ruac_data.device = NULL; in lcu_update_work()
561 lcu->flags &= ~UPDATE_PENDING; in lcu_update_work()
563 spin_unlock_irqrestore(&lcu->lock, flags); in lcu_update_work()
566 static int _schedule_lcu_update(struct alias_lcu *lcu, in _schedule_lcu_update() argument
572 lcu->flags |= NEED_UAC_UPDATE; in _schedule_lcu_update()
573 if (lcu->ruac_data.device) { in _schedule_lcu_update()
580 if (!usedev && !list_empty(&lcu->grouplist)) { in _schedule_lcu_update()
581 group = list_first_entry(&lcu->grouplist, in _schedule_lcu_update()
592 if (!usedev && !list_empty(&lcu->active_devices)) { in _schedule_lcu_update()
593 usedev = list_first_entry(&lcu->active_devices, in _schedule_lcu_update()
603 lcu->ruac_data.device = usedev; in _schedule_lcu_update()
604 if (!schedule_delayed_work(&lcu->ruac_data.dwork, 0)) in _schedule_lcu_update()
612 struct alias_lcu *lcu; in dasd_alias_add_device() local
617 lcu = private->lcu; in dasd_alias_add_device()
622 spin_lock(&lcu->lock); in dasd_alias_add_device()
623 if (!(lcu->flags & UPDATE_PENDING)) { in dasd_alias_add_device()
624 rc = _add_device_to_lcu(lcu, device, device); in dasd_alias_add_device()
626 lcu->flags |= UPDATE_PENDING; in dasd_alias_add_device()
628 if (lcu->flags & UPDATE_PENDING) { in dasd_alias_add_device()
629 list_move(&device->alias_list, &lcu->active_devices); in dasd_alias_add_device()
630 _schedule_lcu_update(lcu, device); in dasd_alias_add_device()
632 spin_unlock(&lcu->lock); in dasd_alias_add_device()
641 private->lcu->flags |= UPDATE_PENDING; in dasd_alias_update_add_device()
648 struct alias_lcu *lcu; in dasd_alias_remove_device() local
652 lcu = private->lcu; in dasd_alias_remove_device()
654 if (!lcu) in dasd_alias_remove_device()
656 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_remove_device()
657 _remove_device_from_lcu(lcu, device); in dasd_alias_remove_device()
658 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_remove_device()
667 struct alias_lcu *lcu; in dasd_alias_get_start_dev() local
673 lcu = private->lcu; in dasd_alias_get_start_dev()
674 if (!group || !lcu) in dasd_alias_get_start_dev()
676 if (lcu->pav == NO_PAV || in dasd_alias_get_start_dev()
677 lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING)) in dasd_alias_get_start_dev()
690 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_get_start_dev()
694 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_get_start_dev()
708 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_get_start_dev()
720 static int reset_summary_unit_check(struct alias_lcu *lcu, in reset_summary_unit_check() argument
728 cqr = lcu->rsu_cqr; in reset_summary_unit_check()
751 static void _restart_all_base_devices_on_lcu(struct alias_lcu *lcu) in _restart_all_base_devices_on_lcu() argument
759 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _restart_all_base_devices_on_lcu()
771 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _restart_all_base_devices_on_lcu()
783 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _restart_all_base_devices_on_lcu()
791 static void flush_all_alias_devices_on_lcu(struct alias_lcu *lcu) in flush_all_alias_devices_on_lcu() argument
811 spin_lock_irqsave(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
812 list_for_each_entry_safe(device, temp, &lcu->active_devices, in flush_all_alias_devices_on_lcu()
820 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in flush_all_alias_devices_on_lcu()
826 spin_unlock_irqrestore(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
828 spin_lock_irqsave(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
835 list_move(&device->alias_list, &lcu->active_devices); in flush_all_alias_devices_on_lcu()
837 spin_unlock_irqrestore(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
857 static void _stop_all_devices_on_lcu(struct alias_lcu *lcu, in _stop_all_devices_on_lcu() argument
863 list_for_each_entry(pos, &lcu->active_devices, alias_list) in _stop_all_devices_on_lcu()
865 list_for_each_entry(pos, &lcu->inactive_devices, alias_list) in _stop_all_devices_on_lcu()
867 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _stop_all_devices_on_lcu()
875 static void _unstop_all_devices_on_lcu(struct alias_lcu *lcu) in _unstop_all_devices_on_lcu() argument
881 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _unstop_all_devices_on_lcu()
887 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _unstop_all_devices_on_lcu()
893 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _unstop_all_devices_on_lcu()
911 struct alias_lcu *lcu; in summary_unit_check_handling_work() local
918 lcu = container_of(suc_data, struct alias_lcu, suc_data); in summary_unit_check_handling_work()
922 flush_all_alias_devices_on_lcu(lcu); in summary_unit_check_handling_work()
929 reset_summary_unit_check(lcu, device, suc_data->reason); in summary_unit_check_handling_work()
931 spin_lock_irqsave(&lcu->lock, flags); in summary_unit_check_handling_work()
932 _unstop_all_devices_on_lcu(lcu); in summary_unit_check_handling_work()
933 _restart_all_base_devices_on_lcu(lcu); in summary_unit_check_handling_work()
935 _schedule_lcu_update(lcu, device); in summary_unit_check_handling_work()
936 lcu->suc_data.device = NULL; in summary_unit_check_handling_work()
938 spin_unlock_irqrestore(&lcu->lock, flags); in summary_unit_check_handling_work()
947 struct alias_lcu *lcu; in dasd_alias_handle_summary_unit_check() local
966 lcu = private->lcu; in dasd_alias_handle_summary_unit_check()
967 if (!lcu) { in dasd_alias_handle_summary_unit_check()
973 spin_lock(&lcu->lock); in dasd_alias_handle_summary_unit_check()
974 _stop_all_devices_on_lcu(lcu, device); in dasd_alias_handle_summary_unit_check()
976 private->lcu->flags |= NEED_UAC_UPDATE | UPDATE_PENDING; in dasd_alias_handle_summary_unit_check()
984 spin_unlock(&lcu->lock); in dasd_alias_handle_summary_unit_check()
987 if (lcu->suc_data.device) { in dasd_alias_handle_summary_unit_check()
992 spin_unlock(&lcu->lock); in dasd_alias_handle_summary_unit_check()
995 lcu->suc_data.reason = reason; in dasd_alias_handle_summary_unit_check()
996 lcu->suc_data.device = device; in dasd_alias_handle_summary_unit_check()
998 spin_unlock(&lcu->lock); in dasd_alias_handle_summary_unit_check()
999 if (!schedule_work(&lcu->suc_data.worker)) in dasd_alias_handle_summary_unit_check()