Lines Matching refs:lcu

70 	list_for_each_entry(pos, &server->lculist, lcu) {  in _find_lcu()
77 static struct alias_pav_group *_find_group(struct alias_lcu *lcu, in _find_group() argument
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()
97 list_for_each_entry(pos, &lcu->grouplist, group) { in _find_group()
126 struct alias_lcu *lcu; in _allocate_lcu() local
128 lcu = kzalloc(sizeof(*lcu), GFP_KERNEL); in _allocate_lcu()
129 if (!lcu) 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()
158 return lcu; 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()
167 kfree(lcu); in _allocate_lcu()
171 static void _free_lcu(struct alias_lcu *lcu) in _free_lcu() argument
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()
177 kfree(lcu); in _free_lcu()
192 struct alias_lcu *lcu, *newlcu; in dasd_alias_make_device_known_to_lcu() local
214 lcu = _find_lcu(server, &uid); in dasd_alias_make_device_known_to_lcu()
215 if (!lcu) { in dasd_alias_make_device_known_to_lcu()
221 lcu = _find_lcu(server, &uid); in dasd_alias_make_device_known_to_lcu()
222 if (!lcu) { in dasd_alias_make_device_known_to_lcu()
223 list_add(&newlcu->lcu, &server->lculist); in dasd_alias_make_device_known_to_lcu()
224 lcu = newlcu; 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()
248 struct alias_lcu *lcu; in dasd_alias_disconnect_device_from_lcu() local
253 lcu = private->lcu; in dasd_alias_disconnect_device_from_lcu()
255 if (!lcu) in dasd_alias_disconnect_device_from_lcu()
258 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
261 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
262 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
263 cancel_work_sync(&lcu->suc_data.worker); in dasd_alias_disconnect_device_from_lcu()
264 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
265 if (device == lcu->suc_data.device) { in dasd_alias_disconnect_device_from_lcu()
267 lcu->suc_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
271 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
272 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
274 cancel_delayed_work_sync(&lcu->ruac_data.dwork); in dasd_alias_disconnect_device_from_lcu()
275 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
276 if (device == lcu->ruac_data.device) { in dasd_alias_disconnect_device_from_lcu()
278 lcu->ruac_data.device = NULL; in dasd_alias_disconnect_device_from_lcu()
281 private->lcu = NULL; in dasd_alias_disconnect_device_from_lcu()
282 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_disconnect_device_from_lcu()
285 spin_lock(&lcu->lock); 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()
291 _free_lcu(lcu); in dasd_alias_disconnect_device_from_lcu()
292 lcu = NULL; in dasd_alias_disconnect_device_from_lcu()
295 _schedule_lcu_update(lcu, NULL); in dasd_alias_disconnect_device_from_lcu()
296 spin_unlock(&lcu->lock); in dasd_alias_disconnect_device_from_lcu()
312 static int _add_device_to_lcu(struct alias_lcu *lcu, in _add_device_to_lcu() argument
322 private->uid.type = lcu->uac->unit[private->uid.real_unit_addr].ua_type; in _add_device_to_lcu()
324 lcu->uac->unit[private->uid.real_unit_addr].base_ua; 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()
332 group = _find_group(lcu, &uid); in _add_device_to_lcu()
348 list_add(&group->group, &lcu->grouplist); in _add_device_to_lcu()
358 static void _remove_device_from_lcu(struct alias_lcu *lcu, in _remove_device_from_lcu() argument
364 list_move(&device->alias_list, &lcu->inactive_devices); in _remove_device_from_lcu()
402 struct alias_lcu *lcu) in read_unit_address_configuration() argument
435 memset(lcu->uac, 0, sizeof(*(lcu->uac))); in read_unit_address_configuration()
439 ccw->count = sizeof(*(lcu->uac)); in read_unit_address_configuration()
440 ccw->cda = (__u32)(addr_t) lcu->uac; in read_unit_address_configuration()
446 spin_lock_irqsave(&lcu->lock, flags); in read_unit_address_configuration()
447 lcu->flags &= ~NEED_UAC_UPDATE; in read_unit_address_configuration()
448 spin_unlock_irqrestore(&lcu->lock, flags); in read_unit_address_configuration()
456 spin_lock_irqsave(&lcu->lock, flags); in read_unit_address_configuration()
457 lcu->flags |= NEED_UAC_UPDATE; in read_unit_address_configuration()
458 spin_unlock_irqrestore(&lcu->lock, flags); in read_unit_address_configuration()
464 static int _lcu_update(struct dasd_device *refdev, struct alias_lcu *lcu) in _lcu_update() argument
472 spin_lock_irqsave(&lcu->lock, flags); in _lcu_update()
473 list_for_each_entry_safe(pavgroup, tempgroup, &lcu->grouplist, group) { in _lcu_update()
476 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
482 list_move(&device->alias_list, &lcu->active_devices); in _lcu_update()
489 spin_unlock_irqrestore(&lcu->lock, flags); in _lcu_update()
491 rc = read_unit_address_configuration(refdev, lcu); in _lcu_update()
495 spin_lock_irqsave(&lcu->lock, flags); in _lcu_update()
496 lcu->pav = NO_PAV; in _lcu_update()
498 switch (lcu->uac->unit[i].ua_type) { in _lcu_update()
500 lcu->pav = BASE_PAV; in _lcu_update()
503 lcu->pav = HYPER_PAV; in _lcu_update()
506 if (lcu->pav != NO_PAV) in _lcu_update()
510 list_for_each_entry_safe(device, tempdev, &lcu->active_devices, in _lcu_update()
512 _add_device_to_lcu(lcu, device, refdev); in _lcu_update()
514 spin_unlock_irqrestore(&lcu->lock, flags); in _lcu_update()
520 struct alias_lcu *lcu; in lcu_update_work() local
527 lcu = container_of(ruac_data, struct alias_lcu, ruac_data); in lcu_update_work()
529 rc = _lcu_update(device, lcu); in lcu_update_work()
535 spin_lock_irqsave(&lcu->lock, flags); in lcu_update_work()
536 if ((rc && (rc != -EOPNOTSUPP)) || (lcu->flags & NEED_UAC_UPDATE)) { in lcu_update_work()
539 if (!schedule_delayed_work(&lcu->ruac_data.dwork, 30*HZ)) in lcu_update_work()
543 lcu->ruac_data.device = NULL; in lcu_update_work()
544 lcu->flags &= ~UPDATE_PENDING; in lcu_update_work()
546 spin_unlock_irqrestore(&lcu->lock, flags); in lcu_update_work()
549 static int _schedule_lcu_update(struct alias_lcu *lcu, in _schedule_lcu_update() argument
555 lcu->flags |= NEED_UAC_UPDATE; in _schedule_lcu_update()
556 if (lcu->ruac_data.device) { in _schedule_lcu_update()
563 if (!usedev && !list_empty(&lcu->grouplist)) { in _schedule_lcu_update()
564 group = list_first_entry(&lcu->grouplist, in _schedule_lcu_update()
575 if (!usedev && !list_empty(&lcu->active_devices)) { in _schedule_lcu_update()
576 usedev = list_first_entry(&lcu->active_devices, in _schedule_lcu_update()
586 lcu->ruac_data.device = usedev; in _schedule_lcu_update()
587 if (!schedule_delayed_work(&lcu->ruac_data.dwork, 0)) in _schedule_lcu_update()
596 struct alias_lcu *lcu = private->lcu; in dasd_alias_add_device() local
601 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_add_device()
606 if (private->uid.type != lcu->uac->unit[uaddr].ua_type) { in dasd_alias_add_device()
607 lcu->flags |= UPDATE_PENDING; in dasd_alias_add_device()
611 if (!(lcu->flags & UPDATE_PENDING)) { in dasd_alias_add_device()
612 rc = _add_device_to_lcu(lcu, device, device); in dasd_alias_add_device()
614 lcu->flags |= UPDATE_PENDING; in dasd_alias_add_device()
616 if (lcu->flags & UPDATE_PENDING) { in dasd_alias_add_device()
617 list_move(&device->alias_list, &lcu->active_devices); in dasd_alias_add_device()
618 _schedule_lcu_update(lcu, device); in dasd_alias_add_device()
620 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_add_device()
628 private->lcu->flags |= UPDATE_PENDING; in dasd_alias_update_add_device()
635 struct alias_lcu *lcu = private->lcu; in dasd_alias_remove_device() local
639 if (!lcu) in dasd_alias_remove_device()
641 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_remove_device()
642 _remove_device_from_lcu(lcu, device); in dasd_alias_remove_device()
643 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_remove_device()
651 struct alias_lcu *lcu = private->lcu; in dasd_alias_get_start_dev() local
655 if (!group || !lcu) in dasd_alias_get_start_dev()
657 if (lcu->pav == NO_PAV || in dasd_alias_get_start_dev()
658 lcu->flags & (NEED_UAC_UPDATE | UPDATE_PENDING)) in dasd_alias_get_start_dev()
671 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_get_start_dev()
675 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_get_start_dev()
689 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_get_start_dev()
702 static int reset_summary_unit_check(struct alias_lcu *lcu, in reset_summary_unit_check() argument
710 cqr = lcu->rsu_cqr; in reset_summary_unit_check()
733 static void _restart_all_base_devices_on_lcu(struct alias_lcu *lcu) in _restart_all_base_devices_on_lcu() argument
740 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _restart_all_base_devices_on_lcu()
747 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _restart_all_base_devices_on_lcu()
754 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _restart_all_base_devices_on_lcu()
762 static void flush_all_alias_devices_on_lcu(struct alias_lcu *lcu) in flush_all_alias_devices_on_lcu() argument
781 spin_lock_irqsave(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
782 list_for_each_entry_safe(device, temp, &lcu->active_devices, in flush_all_alias_devices_on_lcu()
790 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in flush_all_alias_devices_on_lcu()
796 spin_unlock_irqrestore(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
798 spin_lock_irqsave(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
805 list_move(&device->alias_list, &lcu->active_devices); in flush_all_alias_devices_on_lcu()
810 spin_unlock_irqrestore(&lcu->lock, flags); in flush_all_alias_devices_on_lcu()
813 static void _stop_all_devices_on_lcu(struct alias_lcu *lcu) in _stop_all_devices_on_lcu() argument
818 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _stop_all_devices_on_lcu()
823 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _stop_all_devices_on_lcu()
828 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _stop_all_devices_on_lcu()
842 static void _unstop_all_devices_on_lcu(struct alias_lcu *lcu) in _unstop_all_devices_on_lcu() argument
847 list_for_each_entry(device, &lcu->active_devices, alias_list) { in _unstop_all_devices_on_lcu()
852 list_for_each_entry(device, &lcu->inactive_devices, alias_list) { in _unstop_all_devices_on_lcu()
857 list_for_each_entry(pavgroup, &lcu->grouplist, group) { in _unstop_all_devices_on_lcu()
873 struct alias_lcu *lcu; in summary_unit_check_handling_work() local
880 lcu = container_of(suc_data, struct alias_lcu, suc_data); in summary_unit_check_handling_work()
884 flush_all_alias_devices_on_lcu(lcu); in summary_unit_check_handling_work()
891 reset_summary_unit_check(lcu, device, suc_data->reason); in summary_unit_check_handling_work()
893 spin_lock_irqsave(&lcu->lock, flags); in summary_unit_check_handling_work()
894 _unstop_all_devices_on_lcu(lcu); in summary_unit_check_handling_work()
895 _restart_all_base_devices_on_lcu(lcu); in summary_unit_check_handling_work()
897 _schedule_lcu_update(lcu, device); in summary_unit_check_handling_work()
898 lcu->suc_data.device = NULL; in summary_unit_check_handling_work()
900 spin_unlock_irqrestore(&lcu->lock, flags); in summary_unit_check_handling_work()
908 struct alias_lcu *lcu; in dasd_alias_handle_summary_unit_check() local
911 lcu = private->lcu; in dasd_alias_handle_summary_unit_check()
912 if (!lcu) { in dasd_alias_handle_summary_unit_check()
918 spin_lock_irqsave(&lcu->lock, flags); in dasd_alias_handle_summary_unit_check()
928 if (lcu->suc_data.device) { in dasd_alias_handle_summary_unit_check()
935 _stop_all_devices_on_lcu(lcu); in dasd_alias_handle_summary_unit_check()
937 lcu->flags |= NEED_UAC_UPDATE | UPDATE_PENDING; in dasd_alias_handle_summary_unit_check()
938 lcu->suc_data.reason = private->suc_reason; in dasd_alias_handle_summary_unit_check()
939 lcu->suc_data.device = device; in dasd_alias_handle_summary_unit_check()
941 if (!schedule_work(&lcu->suc_data.worker)) in dasd_alias_handle_summary_unit_check()
944 spin_unlock_irqrestore(&lcu->lock, flags); in dasd_alias_handle_summary_unit_check()