Lines Matching full:rp

97 static void __raw3270_disconnect(struct raw3270 *rp);
113 static inline int raw3270_state_ready(struct raw3270 *rp) in raw3270_state_ready() argument
115 return rp->state == RAW3270_STATE_READY; in raw3270_state_ready()
118 void raw3270_buffer_address(struct raw3270 *rp, char *cp, int x, int y) in raw3270_buffer_address() argument
123 x = max_t(int, 0, rp->view->cols + x); in raw3270_buffer_address()
125 y = max_t(int, 0, rp->view->rows + y); in raw3270_buffer_address()
126 addr = (y * rp->view->cols) + x; in raw3270_buffer_address()
127 if (test_bit(RAW3270_FLAGS_14BITADDR, &rp->flags)) { in raw3270_buffer_address()
244 static int __raw3270_start(struct raw3270 *rp, struct raw3270_view *view, in __raw3270_start() argument
249 if (list_empty(&rp->req_queue) && in __raw3270_start()
250 !test_bit(RAW3270_FLAGS_BUSY, &rp->flags)) { in __raw3270_start()
252 rq->rc = ccw_device_start(rp->cdev, &rq->ccw, in __raw3270_start()
259 list_add_tail(&rq->list, &rp->req_queue); in __raw3270_start()
265 struct raw3270 *rp = view->dev; in raw3270_view_active() local
267 return rp && rp->view == view; in raw3270_view_active()
273 struct raw3270 *rp; in raw3270_start() local
277 rp = view->dev; in raw3270_start()
278 if (!rp || rp->view != view) in raw3270_start()
280 else if (!raw3270_state_ready(rp)) in raw3270_start()
283 rc = __raw3270_start(rp, view, rq); in raw3270_start()
307 struct raw3270 *rp; in raw3270_start_locked() local
310 rp = view->dev; in raw3270_start_locked()
311 if (!rp || rp->view != view) in raw3270_start_locked()
313 else if (!raw3270_state_ready(rp)) in raw3270_start_locked()
316 rc = __raw3270_start(rp, view, rq); in raw3270_start_locked()
323 struct raw3270 *rp; in raw3270_start_irq() local
325 rp = view->dev; in raw3270_start_irq()
328 list_add_tail(&rq->list, &rp->req_queue); in raw3270_start_irq()
338 struct raw3270 *rp; in raw3270_irq() local
342 rp = dev_get_drvdata(&cdev->dev); in raw3270_irq()
343 if (!rp) in raw3270_irq()
346 view = rq ? rq->view : rp->view; in raw3270_irq()
351 clear_bit(RAW3270_FLAGS_BUSY, &rp->flags); in raw3270_irq()
355 set_bit(RAW3270_FLAGS_BUSY, &rp->flags); in raw3270_irq()
359 set_bit(RAW3270_FLAGS_BUSY, &rp->flags); in raw3270_irq()
360 if (rp->state > RAW3270_STATE_RESET) in raw3270_irq()
361 __raw3270_disconnect(rp); in raw3270_irq()
368 if (test_bit(RAW3270_FLAGS_BUSY, &rp->flags)) in raw3270_irq()
385 while (!list_empty(&rp->req_queue)) { in raw3270_irq()
386 rq = list_entry(rp->req_queue.next, struct raw3270_request, list); in raw3270_irq()
387 rq->rc = ccw_device_start(rp->cdev, &rq->ccw, in raw3270_irq()
444 static void raw3270_size_device_vm(struct raw3270 *rp) in raw3270_size_device_vm() argument
451 ccw_device_get_id(rp->cdev, &dev_id); in raw3270_size_device_vm()
454 rp->model = 2; in raw3270_size_device_vm()
455 rp->rows = diag8c_data.height; in raw3270_size_device_vm()
456 rp->cols = diag8c_data.width; in raw3270_size_device_vm()
458 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags); in raw3270_size_device_vm()
471 rp->model = model; in raw3270_size_device_vm()
472 rp->rows = 24; in raw3270_size_device_vm()
473 rp->cols = 80; in raw3270_size_device_vm()
476 rp->model = model; in raw3270_size_device_vm()
477 rp->rows = 32; in raw3270_size_device_vm()
478 rp->cols = 80; in raw3270_size_device_vm()
481 rp->model = model; in raw3270_size_device_vm()
482 rp->rows = 43; in raw3270_size_device_vm()
483 rp->cols = 80; in raw3270_size_device_vm()
486 rp->model = model; in raw3270_size_device_vm()
487 rp->rows = 27; in raw3270_size_device_vm()
488 rp->cols = 132; in raw3270_size_device_vm()
493 static void raw3270_size_device(struct raw3270 *rp, char *init_data) in raw3270_size_device() argument
502 rp->model = 2; in raw3270_size_device()
503 rp->rows = 24; in raw3270_size_device()
504 rp->cols = 80; in raw3270_size_device()
508 rp->rows = uap->uab.h; in raw3270_size_device()
509 rp->cols = uap->uab.w; in raw3270_size_device()
512 set_bit(RAW3270_FLAGS_14BITADDR, &rp->flags); in raw3270_size_device()
516 rp->rows = uap->aua.hauai; in raw3270_size_device()
517 rp->cols = uap->aua.wauai; in raw3270_size_device()
520 rp->model = 0; in raw3270_size_device()
521 if (rp->rows == 24 && rp->cols == 80) in raw3270_size_device()
522 rp->model = 2; in raw3270_size_device()
523 if (rp->rows == 32 && rp->cols == 80) in raw3270_size_device()
524 rp->model = 3; in raw3270_size_device()
525 if (rp->rows == 43 && rp->cols == 80) in raw3270_size_device()
526 rp->model = 4; in raw3270_size_device()
527 if (rp->rows == 27 && rp->cols == 132) in raw3270_size_device()
528 rp->model = 5; in raw3270_size_device()
533 struct raw3270 *rp = container_of(work, struct raw3270, resize_work); in raw3270_resize_work() local
537 list_for_each_entry(view, &rp->view_list, list) { in raw3270_resize_work()
539 view->fn->resize(view, rp->model, rp->rows, rp->cols, in raw3270_resize_work()
540 rp->old_model, rp->old_rows, rp->old_cols); in raw3270_resize_work()
542 rp->old_cols = rp->cols; in raw3270_resize_work()
543 rp->old_rows = rp->rows; in raw3270_resize_work()
544 rp->old_model = rp->model; in raw3270_resize_work()
546 list_for_each_entry(view, &rp->view_list, list) { in raw3270_resize_work()
547 rp->view = view; in raw3270_resize_work()
550 rp->view = NULL; in raw3270_resize_work()
554 static void raw3270_size_device_done(struct raw3270 *rp) in raw3270_size_device_done() argument
556 rp->view = NULL; in raw3270_size_device_done()
557 rp->state = RAW3270_STATE_READY; in raw3270_size_device_done()
558 schedule_work(&rp->resize_work); in raw3270_size_device_done()
563 struct raw3270 *rp = rq->view->dev; in raw3270_read_modified_cb() local
565 raw3270_size_device(rp, data); in raw3270_read_modified_cb()
566 raw3270_size_device_done(rp); in raw3270_read_modified_cb()
570 static void raw3270_read_modified(struct raw3270 *rp) in raw3270_read_modified() argument
572 if (rp->state != RAW3270_STATE_W4ATTN) in raw3270_read_modified()
575 memset(&rp->init_readmod, 0, sizeof(rp->init_readmod)); in raw3270_read_modified()
576 memset(&rp->init_data, 0, sizeof(rp->init_data)); in raw3270_read_modified()
577 rp->init_readmod.ccw.cmd_code = TC_READMOD; in raw3270_read_modified()
578 rp->init_readmod.ccw.flags = CCW_FLAG_SLI; in raw3270_read_modified()
579 rp->init_readmod.ccw.count = sizeof(rp->init_data); in raw3270_read_modified()
580 rp->init_readmod.ccw.cda = (__u32)__pa(rp->init_data); in raw3270_read_modified()
581 rp->init_readmod.callback = raw3270_read_modified_cb; in raw3270_read_modified()
582 rp->init_readmod.callback_data = rp->init_data; in raw3270_read_modified()
583 rp->state = RAW3270_STATE_READMOD; in raw3270_read_modified()
584 raw3270_start_irq(&rp->init_view, &rp->init_readmod); in raw3270_read_modified()
587 static void raw3270_writesf_readpart(struct raw3270 *rp) in raw3270_writesf_readpart() argument
594 memset(&rp->init_readpart, 0, sizeof(rp->init_readpart)); in raw3270_writesf_readpart()
595 memset(&rp->init_data, 0, sizeof(rp->init_data)); in raw3270_writesf_readpart()
596 memcpy(&rp->init_data, wbuf, sizeof(wbuf)); in raw3270_writesf_readpart()
597 rp->init_readpart.ccw.cmd_code = TC_WRITESF; in raw3270_writesf_readpart()
598 rp->init_readpart.ccw.flags = CCW_FLAG_SLI; in raw3270_writesf_readpart()
599 rp->init_readpart.ccw.count = sizeof(wbuf); in raw3270_writesf_readpart()
600 rp->init_readpart.ccw.cda = (__u32)__pa(&rp->init_data); in raw3270_writesf_readpart()
601 rp->state = RAW3270_STATE_W4ATTN; in raw3270_writesf_readpart()
602 raw3270_start_irq(&rp->init_view, &rp->init_readpart); in raw3270_writesf_readpart()
610 struct raw3270 *rp = rq->view->dev; in raw3270_reset_device_cb() local
612 if (rp->state != RAW3270_STATE_RESET) in raw3270_reset_device_cb()
616 rp->state = RAW3270_STATE_INIT; in raw3270_reset_device_cb()
618 raw3270_size_device_vm(rp); in raw3270_reset_device_cb()
619 raw3270_size_device_done(rp); in raw3270_reset_device_cb()
621 raw3270_writesf_readpart(rp); in raw3270_reset_device_cb()
623 memset(&rp->init_reset, 0, sizeof(rp->init_reset)); in raw3270_reset_device_cb()
626 static int __raw3270_reset_device(struct raw3270 *rp) in __raw3270_reset_device() argument
631 if (rp->init_reset.view) in __raw3270_reset_device()
634 rp->init_data[0] = TW_KR; in __raw3270_reset_device()
635 rp->init_reset.ccw.cmd_code = TC_EWRITEA; in __raw3270_reset_device()
636 rp->init_reset.ccw.flags = CCW_FLAG_SLI; in __raw3270_reset_device()
637 rp->init_reset.ccw.count = 1; in __raw3270_reset_device()
638 rp->init_reset.ccw.cda = (__u32)__pa(rp->init_data); in __raw3270_reset_device()
639 rp->init_reset.callback = raw3270_reset_device_cb; in __raw3270_reset_device()
640 rc = __raw3270_start(rp, &rp->init_view, &rp->init_reset); in __raw3270_reset_device()
641 if (rc == 0 && rp->state == RAW3270_STATE_INIT) in __raw3270_reset_device()
642 rp->state = RAW3270_STATE_RESET; in __raw3270_reset_device()
646 static int raw3270_reset_device(struct raw3270 *rp) in raw3270_reset_device() argument
651 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_reset_device()
652 rc = __raw3270_reset_device(rp); in raw3270_reset_device()
653 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_reset_device()
659 struct raw3270 *rp; in raw3270_reset() local
662 rp = view->dev; in raw3270_reset()
663 if (!rp || rp->view != view) in raw3270_reset()
665 else if (!raw3270_state_ready(rp)) in raw3270_reset()
673 static void __raw3270_disconnect(struct raw3270 *rp) in __raw3270_disconnect() argument
678 rp->state = RAW3270_STATE_INIT; in __raw3270_disconnect()
679 rp->view = &rp->init_view; in __raw3270_disconnect()
681 while (!list_empty(&rp->req_queue)) { in __raw3270_disconnect()
682 rq = list_entry(rp->req_queue.next, struct raw3270_request, list); in __raw3270_disconnect()
691 __raw3270_reset_device(rp); in __raw3270_disconnect()
697 struct raw3270 *rp; in raw3270_init_irq() local
709 rp = view->dev; in raw3270_init_irq()
710 raw3270_read_modified(rp); in raw3270_init_irq()
721 static int raw3270_setup_device(struct ccw_device *cdev, struct raw3270 *rp, in raw3270_setup_device() argument
728 memset(rp, 0, sizeof(struct raw3270)); in raw3270_setup_device()
737 rp->ascebc = ascebc; in raw3270_setup_device()
740 rp->rows = 24; in raw3270_setup_device()
741 rp->cols = 80; in raw3270_setup_device()
742 rp->old_rows = rp->rows; in raw3270_setup_device()
743 rp->old_cols = rp->cols; in raw3270_setup_device()
745 INIT_LIST_HEAD(&rp->req_queue); in raw3270_setup_device()
746 INIT_LIST_HEAD(&rp->view_list); in raw3270_setup_device()
748 rp->init_view.dev = rp; in raw3270_setup_device()
749 rp->init_view.fn = &raw3270_init_fn; in raw3270_setup_device()
750 rp->view = &rp->init_view; in raw3270_setup_device()
751 INIT_WORK(&rp->resize_work, raw3270_resize_work); in raw3270_setup_device()
761 rp->minor = -1; in raw3270_setup_device()
765 rp->minor = minor; in raw3270_setup_device()
766 __list_add(&rp->list, l->prev, l); in raw3270_setup_device()
771 if (rp->minor == -1 && minor < RAW3270_MAXDEVS + RAW3270_FIRSTMINOR) { in raw3270_setup_device()
772 rp->minor = minor; in raw3270_setup_device()
773 list_add_tail(&rp->list, &raw3270_devices); in raw3270_setup_device()
777 if (rp->minor == -1) in raw3270_setup_device()
779 rp->cdev = cdev; in raw3270_setup_device()
780 dev_set_drvdata(&cdev->dev, rp); in raw3270_setup_device()
789 static inline int raw3270_state_final(struct raw3270 *rp) in raw3270_state_final() argument
791 return rp->state == RAW3270_STATE_INIT || in raw3270_state_final()
792 rp->state == RAW3270_STATE_READY; in raw3270_state_final()
802 struct raw3270 *rp; in raw3270_setup_console() local
810 rp = kzalloc(sizeof(*rp), GFP_KERNEL | GFP_DMA); in raw3270_setup_console()
812 rc = raw3270_setup_device(cdev, rp, ascebc); in raw3270_setup_console()
815 set_bit(RAW3270_FLAGS_CONSOLE, &rp->flags); in raw3270_setup_console()
823 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_setup_console()
825 __raw3270_reset_device(rp); in raw3270_setup_console()
826 while (!raw3270_state_final(rp)) { in raw3270_setup_console()
827 ccw_device_wait_idle(rp->cdev); in raw3270_setup_console()
830 } while (rp->state != RAW3270_STATE_READY); in raw3270_setup_console()
831 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_setup_console()
832 return rp; in raw3270_setup_console()
835 void raw3270_wait_cons_dev(struct raw3270 *rp) in raw3270_wait_cons_dev() argument
839 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_wait_cons_dev()
840 ccw_device_wait_idle(rp->cdev); in raw3270_wait_cons_dev()
841 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_wait_cons_dev()
851 struct raw3270 *rp; in raw3270_create_device() local
855 rp = kzalloc(sizeof(*rp), GFP_KERNEL | GFP_DMA); in raw3270_create_device()
856 if (!rp) in raw3270_create_device()
860 kfree(rp); in raw3270_create_device()
863 rc = raw3270_setup_device(cdev, rp, ascebc); in raw3270_create_device()
865 kfree(rp->ascebc); in raw3270_create_device()
866 kfree(rp); in raw3270_create_device()
867 rp = ERR_PTR(rc); in raw3270_create_device()
871 return rp; in raw3270_create_device()
880 struct raw3270 *rp = view->dev; in raw3270_view_lock_unavailable() local
882 if (!rp) in raw3270_view_lock_unavailable()
884 if (spin_is_locked(get_ccwdev_lock(rp->cdev))) in raw3270_view_lock_unavailable()
889 static int raw3270_assign_activate_view(struct raw3270 *rp, struct raw3270_view *view) in raw3270_assign_activate_view() argument
891 rp->view = view; in raw3270_assign_activate_view()
895 static int __raw3270_activate_view(struct raw3270 *rp, struct raw3270_view *view) in __raw3270_activate_view() argument
900 if (rp->view == view) in __raw3270_activate_view()
903 if (!raw3270_state_ready(rp)) in __raw3270_activate_view()
906 if (rp->view && rp->view->fn->deactivate) { in __raw3270_activate_view()
907 oldview = rp->view; in __raw3270_activate_view()
911 rc = raw3270_assign_activate_view(rp, view); in __raw3270_activate_view()
917 rc = raw3270_assign_activate_view(rp, oldview); in __raw3270_activate_view()
923 list_for_each_entry(nv, &rp->view_list, list) { in __raw3270_activate_view()
926 rc = raw3270_assign_activate_view(rp, nv); in __raw3270_activate_view()
929 rp->view = NULL; in __raw3270_activate_view()
939 struct raw3270 *rp; in raw3270_activate_view() local
943 rp = view->dev; in raw3270_activate_view()
944 if (!rp) in raw3270_activate_view()
946 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_activate_view()
947 rc = __raw3270_activate_view(rp, view); in raw3270_activate_view()
948 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_activate_view()
959 struct raw3270 *rp; in raw3270_deactivate_view() local
961 rp = view->dev; in raw3270_deactivate_view()
962 if (!rp) in raw3270_deactivate_view()
964 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_deactivate_view()
965 if (rp->view == view) { in raw3270_deactivate_view()
967 rp->view = NULL; in raw3270_deactivate_view()
970 list_add_tail(&view->list, &rp->view_list); in raw3270_deactivate_view()
972 if (raw3270_state_ready(rp)) { in raw3270_deactivate_view()
973 list_for_each_entry(view, &rp->view_list, list) { in raw3270_deactivate_view()
974 rp->view = view; in raw3270_deactivate_view()
977 rp->view = NULL; in raw3270_deactivate_view()
981 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_deactivate_view()
992 struct raw3270 *rp; in raw3270_add_view() local
999 list_for_each_entry(rp, &raw3270_devices, list) { in raw3270_add_view()
1000 if (rp->minor != minor) in raw3270_add_view()
1002 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_add_view()
1004 view->dev = rp; in raw3270_add_view()
1006 view->model = rp->model; in raw3270_add_view()
1007 view->rows = rp->rows; in raw3270_add_view()
1008 view->cols = rp->cols; in raw3270_add_view()
1009 view->ascebc = rp->ascebc; in raw3270_add_view()
1012 list_add(&view->list, &rp->view_list); in raw3270_add_view()
1014 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_add_view()
1027 struct raw3270 *rp; in raw3270_find_view() local
1033 list_for_each_entry(rp, &raw3270_devices, list) { in raw3270_find_view()
1034 if (rp->minor != minor) in raw3270_find_view()
1036 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_find_view()
1037 list_for_each_entry(tmp, &rp->view_list, list) { in raw3270_find_view()
1044 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_find_view()
1058 struct raw3270 *rp; in raw3270_del_view() local
1061 rp = view->dev; in raw3270_del_view()
1062 spin_lock_irqsave(get_ccwdev_lock(rp->cdev), flags); in raw3270_del_view()
1063 if (rp->view == view) { in raw3270_del_view()
1065 rp->view = NULL; in raw3270_del_view()
1068 if (!rp->view && raw3270_state_ready(rp)) { in raw3270_del_view()
1070 list_for_each_entry(nv, &rp->view_list, list) { in raw3270_del_view()
1072 rp->view = nv; in raw3270_del_view()
1077 spin_unlock_irqrestore(get_ccwdev_lock(rp->cdev), flags); in raw3270_del_view()
1089 static void raw3270_delete_device(struct raw3270 *rp) in raw3270_delete_device() argument
1095 list_del_init(&rp->list); in raw3270_delete_device()
1099 cdev = rp->cdev; in raw3270_delete_device()
1100 rp->cdev = NULL; in raw3270_delete_device()
1108 kfree(rp->ascebc); in raw3270_delete_device()
1109 kfree(rp); in raw3270_delete_device()
1156 static int raw3270_create_attributes(struct raw3270 *rp) in raw3270_create_attributes() argument
1158 return sysfs_create_group(&rp->cdev->dev.kobj, &raw3270_attr_group); in raw3270_create_attributes()
1168 struct raw3270 *rp; in raw3270_register_notifier() local
1172 list_for_each_entry(rp, &raw3270_devices, list) in raw3270_register_notifier()
1173 notifier->create(rp->minor); in raw3270_register_notifier()
1181 struct raw3270 *rp; in raw3270_unregister_notifier() local
1184 list_for_each_entry(rp, &raw3270_devices, list) in raw3270_unregister_notifier()
1185 notifier->destroy(rp->minor); in raw3270_unregister_notifier()
1197 struct raw3270 *rp; in raw3270_set_online() local
1200 rp = raw3270_create_device(cdev); in raw3270_set_online()
1201 if (IS_ERR(rp)) in raw3270_set_online()
1202 return PTR_ERR(rp); in raw3270_set_online()
1203 rc = raw3270_create_attributes(rp); in raw3270_set_online()
1206 raw3270_reset_device(rp); in raw3270_set_online()
1209 np->create(rp->minor); in raw3270_set_online()
1214 raw3270_delete_device(rp); in raw3270_set_online()
1224 struct raw3270 *rp; in raw3270_remove() local
1228 rp = dev_get_drvdata(&cdev->dev); in raw3270_remove()
1231 * should set up rp. raw3270_remove gets entered for in raw3270_remove()
1233 * Thus, rp may validly be NULL here. in raw3270_remove()
1235 if (!rp) in raw3270_remove()
1242 if (rp->view) { in raw3270_remove()
1243 if (rp->view->fn->deactivate) in raw3270_remove()
1244 rp->view->fn->deactivate(rp->view); in raw3270_remove()
1245 rp->view = NULL; in raw3270_remove()
1247 while (!list_empty(&rp->view_list)) { in raw3270_remove()
1248 v = list_entry(rp->view_list.next, struct raw3270_view, list); in raw3270_remove()
1259 np->destroy(rp->minor); in raw3270_remove()
1263 raw3270_reset_device(rp); in raw3270_remove()
1265 raw3270_delete_device(rp); in raw3270_remove()
1273 struct raw3270 *rp; in raw3270_set_offline() local
1275 rp = dev_get_drvdata(&cdev->dev); in raw3270_set_offline()
1276 if (test_bit(RAW3270_FLAGS_CONSOLE, &rp->flags)) in raw3270_set_offline()
1312 struct raw3270 *rp; in raw3270_init() local
1323 list_for_each_entry(rp, &raw3270_devices, list) { in raw3270_init()
1324 get_device(&rp->cdev->dev); in raw3270_init()
1325 raw3270_create_attributes(rp); in raw3270_init()